diff --git a/.gitignore b/.gitignore index 123812cc..6f7528fc 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,8 @@ /db/*.sqlite3 /db/schema.rb /files/* +/lib/redmine/scm/adapters/mercurial/redminehelper.pyc +/lib/redmine/scm/adapters/mercurial/redminehelper.pyo /log/*.log* /log/mongrel_debug /public/dispatch.* @@ -22,3 +24,6 @@ /vendor/rails *.rbc doc/app +/.bundle +/Gemfile.lock +/.rvmrc* diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..e69de29b diff --git a/.hgignore b/.hgignore index 733faf9f..307d49af 100644 --- a/.hgignore +++ b/.hgignore @@ -12,6 +12,8 @@ db/*.db db/*.sqlite3 db/schema.rb files/* +lib/redmine/scm/adapters/mercurial/redminehelper.pyc +lib/redmine/scm/adapters/mercurial/redminehelper.pyo log/*.log* log/mongrel_debug public/dispatch.* @@ -23,3 +25,9 @@ tmp/sockets/* tmp/test/* vendor/rails *.rbc +.svn/ +.git/ +doc/app +/.bundle +/Gemfile.lock +/.rvmrc* diff --git a/Gemfile b/Gemfile new file mode 100644 index 00000000..befa9d28 --- /dev/null +++ b/Gemfile @@ -0,0 +1,71 @@ +source :rubygems + +gem "rails", "2.3.12" + +gem "coderay", "~> 0.9.7" +gem "i18n", "~> 0.4.2" +gem "rubytree", "~> 0.5.2", :require => 'tree' +gem "rdoc", ">= 2.4.2" + +group :test do + gem 'shoulda', '~> 2.10.3' + gem 'edavis10-object_daddy', :require => 'object_daddy' + gem 'mocha' +end + +group :openid do + gem "ruby-openid", '~> 2.1.4', :require => 'openid' +end + +group :rmagick do + gem "rmagick", "~> 1.15.17" +end + +# Use the commented pure ruby gems, if you have not the needed prerequisites on +# board to compile the native ones. Note, that their use is discouraged, since +# their integration is propbably not that well tested and their are slower in +# orders of magnitude compared to their native counterparts. You have been +# warned. +# +platforms :mri do + group :mysql do + gem "mysql" + # gem "ruby-mysql" + end + + group :mysql2 do + gem "mysql2", "~> 0.2.7" + end + + group :postgres do + gem "pg", "~> 0.9.0" + # gem "postgres-pr" + end + + group :sqlite do + gem "sqlite3-ruby", "< 1.3", :require => "sqlite3" + # please tell me, if you are fond of a pure ruby sqlite3 binding + end +end + +platforms :jruby do + gem "jruby-openssl" + + group :mysql do + gem "activerecord-jdbcmysql-adapter" + end + + group :postgres do + gem "activerecord-jdbcpostgresql-adapter" + end + + group :sqlite do + gem "activerecord-jdbcsqlite3-adapter" + end +end + +# Load plugins' Gemfiles +Dir.glob File.expand_path("../vendor/plugins/*/Gemfile", __FILE__) do |file| + puts "Loading #{file} ..." if $DEBUG # `ruby -d` or `bundle -v` + instance_eval File.read(file) +end diff --git a/Rakefile b/Rakefile index cffd19f0..46029270 100644 --- a/Rakefile +++ b/Rakefile @@ -1,10 +1,10 @@ # Add your own tasks in files placed in lib/tasks ending in .rake, -# for example lib/tasks/switchtower.rake, and they will automatically be available to Rake. +# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. require(File.join(File.dirname(__FILE__), 'config', 'boot')) require 'rake' require 'rake/testtask' -require 'rake/rdoctask' +require 'rdoc/task' -require 'tasks/rails' \ No newline at end of file +require 'tasks/rails' diff --git a/app/controllers/account_controller.rb b/app/controllers/account_controller.rb index 00cae2cc..fc26cacc 100644 --- a/app/controllers/account_controller.rb +++ b/app/controllers/account_controller.rb @@ -1,24 +1,19 @@ -# Redmine - project management software -# Copyright (C) 2006-2009 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ class AccountController < ApplicationController - helper :custom_fields - include CustomFieldsHelper - + include CustomFieldsHelper + # prevents login action to be filtered by check_if_login_required application scope filter skip_before_filter :check_if_login_required @@ -36,7 +31,7 @@ class AccountController < ApplicationController logout_user redirect_to home_url end - + # Enable user to choose a new password def lost_password redirect_to(home_url) && return unless Setting.lost_password? @@ -51,7 +46,7 @@ class AccountController < ApplicationController flash[:notice] = l(:notice_account_password_updated) redirect_to :action => 'login' return - end + end end render :template => "account/password_recovery" return @@ -73,7 +68,7 @@ class AccountController < ApplicationController end end end - + # User self-registration def register redirect_to(home_url) && return unless Setting.self_registration? || session[:auth_source_registration] @@ -109,7 +104,7 @@ class AccountController < ApplicationController end end end - + # Token based account activation def activate redirect_to(home_url) && return unless Setting.self_registration? && params[:token] @@ -124,9 +119,9 @@ class AccountController < ApplicationController end redirect_to :action => 'login' end - + private - + def logout_user if User.current.logged? cookies.delete Redmine::Configuration['autologin_cookie_name'] @@ -134,7 +129,7 @@ class AccountController < ApplicationController self.logged_user = nil end end - + def authenticate_user if Setting.openid? && using_open_id? open_id_authenticate(params[:openid_url]) @@ -156,7 +151,7 @@ class AccountController < ApplicationController end end - + def open_id_authenticate(openid_url) authenticate_with_open_id(openid_url, :required => [:nickname, :fullname, :email], :return_to => signin_url) do |result, identity_url, registration| if result.successful? @@ -185,7 +180,7 @@ class AccountController < ApplicationController register_manually_by_administrator(user) do onthefly_creation_failed(user) end - end + end else # Existing record if user.active? @@ -197,7 +192,7 @@ class AccountController < ApplicationController end end end - + def successful_authentication(user) # Valid user self.logged_user = user @@ -208,7 +203,7 @@ class AccountController < ApplicationController call_hook(:controller_account_success_authentication_after, {:user => user }) redirect_back_or_default :controller => 'my', :action => 'page' end - + def set_autologin_cookie(user) token = Token.create(:user => user, :action => 'autologin') cookie_options = { @@ -246,7 +241,7 @@ class AccountController < ApplicationController yield if block_given? end end - + # Automatically register a user # # Pass a block for behavior when a user fails to save @@ -262,7 +257,7 @@ class AccountController < ApplicationController yield if block_given? end end - + # Manual activation by the administrator # # Pass a block for behavior when a user fails to save diff --git a/app/controllers/activities_controller.rb b/app/controllers/activities_controller.rb index d6292ea9..d9cf6f1d 100644 --- a/app/controllers/activities_controller.rb +++ b/app/controllers/activities_controller.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class ActivitiesController < ApplicationController menu_item :activity before_filter :find_optional_project @@ -5,7 +18,7 @@ class ActivitiesController < ApplicationController def index @days = Setting.activity_days_default.to_i - + if params[:from] begin; @date_to = params[:from].to_date + 1; rescue; end end @@ -14,18 +27,18 @@ class ActivitiesController < ApplicationController @date_from = @date_to - @days @with_subprojects = params[:with_subprojects].nil? ? Setting.display_subprojects_issues? : (params[:with_subprojects] == '1') @author = (params[:user_id].blank? ? nil : User.active.find(params[:user_id])) - - @activity = Redmine::Activity::Fetcher.new(User.current, :project => @project, + + @activity = Redmine::Activity::Fetcher.new(User.current, :project => @project, :with_subprojects => @with_subprojects, :author => @author) @activity.scope_select {|t| !params["show_#{t}"].nil?} @activity.scope = (@author.nil? ? :default : :all) if @activity.scope.empty? events = @activity.events(@date_from, @date_to) - + if events.empty? || stale?(:etag => [@activity.scope, @date_to, @date_from, @with_subprojects, @author, events.first, User.current, current_language]) respond_to do |format| - format.html { + format.html { @events_by_day = events.group_by(&:event_date) render :layout => false if request.xhr? } @@ -40,7 +53,7 @@ class ActivitiesController < ApplicationController } end end - + rescue ActiveRecord::RecordNotFound render_404 end diff --git a/app/controllers/admin_controller.rb b/app/controllers/admin_controller.rb index 2dc3ab1c..df0939c2 100644 --- a/app/controllers/admin_controller.rb +++ b/app/controllers/admin_controller.rb @@ -1,51 +1,46 @@ -# redMine - project management software -# Copyright (C) 2006 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ class AdminController < ApplicationController layout 'admin' - + before_filter :require_admin - helper :sort - include SortHelper + include SortHelper def index @no_configuration_data = Redmine::DefaultData::Loader::no_data? end - + def projects @status = params[:status] ? params[:status].to_i : 1 c = ARCondition.new(@status == 0 ? "status <> 0" : ["status = ?", @status]) - + unless params[:name].blank? name = "%#{params[:name].strip.downcase}%" c << ["LOWER(identifier) LIKE ? OR LOWER(name) LIKE ?", name, name] end - + @projects = Project.find :all, :order => 'lft', :conditions => c.conditions render :action => "projects", :layout => false if request.xhr? end - + def plugins @plugins = Redmine::Plugin.all end - + # Loads the default configuration # (roles, trackers, statuses, workflow, enumerations) def default_configuration @@ -59,7 +54,7 @@ class AdminController < ApplicationController end redirect_to :action => 'index' end - + def test_email raise_delivery_errors = ActionMailer::Base.raise_delivery_errors # Force ActionMailer to raise delivery errors so we can catch it @@ -73,7 +68,7 @@ class AdminController < ApplicationController ActionMailer::Base.raise_delivery_errors = raise_delivery_errors redirect_to :controller => 'settings', :action => 'edit', :tab => 'notifications' end - + def info @db_adapter_name = ActiveRecord::Base.connection.adapter_name @checklist = [ @@ -82,5 +77,5 @@ class AdminController < ApplicationController [:text_plugin_assets_writable, File.writable?(Engines.public_directory)], [:text_rmagick_available, Object.const_defined?(:Magick)] ] - end + end end diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 58f9f805..45b1261c 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1,54 +1,51 @@ -# redMine - project management software -# Copyright (C) 2006-2007 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ require 'uri' require 'cgi' class ApplicationController < ActionController::Base + helper :all protected - + include Redmine::I18n layout 'base' exempt_from_layout 'builder', 'rsb' - + # Remove broken cookie after upgrade from 0.8.x (#4292) # See https://rails.lighthouseapp.com/projects/8994/tickets/3360 # TODO: remove it when Rails is fixed before_filter :delete_broken_cookies def delete_broken_cookies if cookies['_chiliproject_session'] && cookies['_chiliproject_session'] !~ /--/ - cookies.delete '_chiliproject_session' + cookies.delete '_chiliproject_session' redirect_to home_path return false end end - + before_filter :user_setup, :check_if_login_required, :set_localization filter_parameter_logging :password protect_from_forgery - + rescue_from ActionController::InvalidAuthenticityToken, :with => :invalid_authenticity_token - + include Redmine::Search::Controller include Redmine::MenuManager::MenuController helper Redmine::MenuManager::MenuHelper - + Redmine::Scm::Base.all.each do |scm| require_dependency "repository/#{scm.underscore}" end @@ -59,7 +56,7 @@ class ApplicationController < ActionController::Base # Find the current user User.current = find_current_user end - + # Returns the current user or nil if no user is logged in # and starts a session if needed def find_current_user @@ -97,14 +94,14 @@ class ApplicationController < ActionController::Base User.current = User.anonymous end end - + # check if login is globally required to access the application def check_if_login_required # no check needed if user is already logged in return true if User.current.logged? require_login if Setting.login_required? - end - + end + def set_localization lang = nil if User.current.logged? @@ -120,7 +117,7 @@ class ApplicationController < ActionController::Base lang ||= Setting.default_language set_language_if_valid(lang) end - + def require_login if !User.current.logged? # Extract only the basic url parameters on non-GET requests @@ -149,7 +146,7 @@ class ApplicationController < ActionController::Base end true end - + def deny_access User.current.logged? ? render_403 : require_login end @@ -200,7 +197,7 @@ class ApplicationController < ActionController::Base # Finds and sets @project based on @object.project def find_project_from_association render_404 unless @object.present? - + @project = @object.project rescue ActiveRecord::RecordNotFound render_404 @@ -229,7 +226,7 @@ class ApplicationController < ActionController::Base rescue ActiveRecord::RecordNotFound render_404 end - + # Check if project is unique before bulk operations def check_project_uniqueness unless @project @@ -238,7 +235,7 @@ class ApplicationController < ActionController::Base return false end end - + # make sure that the user is a member of the project (or admin) if project is private # used as a before_filter for actions that do not require any particular permission on the project def check_project_privacy @@ -276,26 +273,26 @@ class ApplicationController < ActionController::Base redirect_to default false end - + def render_403(options={}) @project = nil render_error({:message => :notice_not_authorized, :status => 403}.merge(options)) return false end - + def render_404(options={}) render_error({:message => :notice_file_not_found, :status => 404}.merge(options)) return false end - + # Renders an error response def render_error(arg) arg = {:message => arg} unless arg.is_a?(Hash) - + @message = arg[:message] @message = l(@message) if @message.is_a?(Symbol) @status = arg[:status] || 500 - + respond_to do |format| format.html { render :template => 'common/error', :layout => use_layout, :status => @status @@ -313,31 +310,31 @@ class ApplicationController < ActionController::Base def use_layout request.xhr? ? false : 'base' end - + def invalid_authenticity_token if api_request? logger.error "Form authenticity token is missing or is invalid. API calls must include a proper Content-type header (text/xml or text/json)." end render_error "Invalid form authenticity token." end - - def render_feed(items, options={}) + + def render_feed(items, options={}) @items = items || [] @items.sort! {|x,y| y.event_datetime <=> x.event_datetime } @items = @items.slice(0, Setting.feeds_limit.to_i) @title = options[:title] || Setting.app_title render :template => "common/feed.atom.rxml", :layout => false, :content_type => 'application/atom+xml' end - + def self.accept_key_auth(*actions) actions = actions.flatten.map(&:to_s) write_inheritable_attribute('accept_key_auth_actions', actions) end - + def accept_key_auth_actions self.class.read_inheritable_attribute('accept_key_auth_actions') || [] end - + # Returns the number of objects that should be displayed # on the paginated list def per_page_option @@ -373,10 +370,10 @@ class ApplicationController < ActionController::Base offset = 0 if offset < 0 end offset ||= 0 - + [offset, limit] end - + # qvalues http header parser # code taken from webrick def parse_qvalues(value) @@ -397,16 +394,16 @@ class ApplicationController < ActionController::Base rescue nil end - + # Returns a string that can be used as filename value in Content-Disposition header def filename_for_content_disposition(name) request.env['HTTP_USER_AGENT'] =~ %r{MSIE} ? ERB::Util.url_encode(name) : name end - + def api_request? %w(xml json).include? params[:format] end - + # Returns the API key present in the request def api_key_from_request if params[:key].present? @@ -463,7 +460,7 @@ class ApplicationController < ActionController::Base ) render options end - + # Overrides #default_template so that the api template # is used automatically if it exists def default_template(action_name = self.action_name) @@ -477,7 +474,7 @@ class ApplicationController < ActionController::Base end super end - + # Overrides #pick_layout so that #render with no arguments # doesn't use the layout for api requests def pick_layout(*args) diff --git a/app/controllers/attachments_controller.rb b/app/controllers/attachments_controller.rb index 5b2acc8a..f2992a25 100644 --- a/app/controllers/attachments_controller.rb +++ b/app/controllers/attachments_controller.rb @@ -1,27 +1,23 @@ -# Redmine - project management software -# Copyright (C) 2006-2008 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ class AttachmentsController < ApplicationController before_filter :find_project before_filter :file_readable, :read_authorize, :except => :destroy before_filter :delete_authorize, :only => :destroy - + verify :method => :post, :only => :destroy - + def show if @attachment.is_diff? @diff = File.new(@attachment.diskfile, "rb").read @@ -33,19 +29,19 @@ class AttachmentsController < ApplicationController download end end - + def download if @attachment.container.is_a?(Version) || @attachment.container.is_a?(Project) @attachment.increment_download end - + # images are sent inline send_file @attachment.diskfile, :filename => filename_for_content_disposition(@attachment.filename), - :type => detect_content_type(@attachment), + :type => detect_content_type(@attachment), :disposition => (@attachment.image? ? 'inline' : 'attachment') - + end - + def destroy # Make sure association callbacks are called @attachment.container.attachments.delete(@attachment) @@ -53,7 +49,7 @@ class AttachmentsController < ApplicationController rescue ::ActionController::RedirectBackError redirect_to :controller => 'projects', :action => 'show', :id => @project end - + private def find_project @attachment = Attachment.find(params[:id]) @@ -63,20 +59,20 @@ private rescue ActiveRecord::RecordNotFound render_404 end - + # Checks that the file exists and is readable def file_readable @attachment.readable? ? true : render_404 end - + def read_authorize @attachment.visible? ? true : deny_access end - + def delete_authorize @attachment.deletable? ? true : deny_access end - + def detect_content_type(attachment) content_type = attachment.content_type if content_type.blank? diff --git a/app/controllers/auth_sources_controller.rb b/app/controllers/auth_sources_controller.rb index 872ae185..dbe11256 100644 --- a/app/controllers/auth_sources_controller.rb +++ b/app/controllers/auth_sources_controller.rb @@ -1,23 +1,19 @@ -# redMine - project management software -# Copyright (C) 2006 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ class AuthSourcesController < ApplicationController layout 'admin' - + before_filter :require_admin # GETs should be safe (see http://www.w3.org/2001/tag/doc/whenToUseGet.html) @@ -58,7 +54,7 @@ class AuthSourcesController < ApplicationController render 'auth_sources/edit' end end - + def test_connection @auth_method = AuthSource.find(params[:id]) begin diff --git a/app/controllers/auto_completes_controller.rb b/app/controllers/auto_completes_controller.rb index 17d86f34..27ef1667 100644 --- a/app/controllers/auto_completes_controller.rb +++ b/app/controllers/auto_completes_controller.rb @@ -1,6 +1,19 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AutoCompletesController < ApplicationController before_filter :find_project - + def issues @issues = [] q = params[:q].to_s diff --git a/app/controllers/boards_controller.rb b/app/controllers/boards_controller.rb index ebad847d..9e9700e7 100644 --- a/app/controllers/boards_controller.rb +++ b/app/controllers/boards_controller.rb @@ -1,32 +1,25 @@ -# redMine - project management software -# Copyright (C) 2006-2007 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ class BoardsController < ApplicationController default_search_scope :messages before_filter :find_project, :find_board_if_available, :authorize accept_key_auth :index, :show - helper :messages include MessagesHelper - helper :sort include SortHelper - helper :watchers include WatchersHelper - + def index @boards = @project.boards render_404 if @boards.empty? @@ -44,7 +37,7 @@ class BoardsController < ApplicationController sort_update 'created_on' => "#{Message.table_name}.created_on", 'replies' => "#{Message.table_name}.replies_count", 'updated_on' => "#{Message.table_name}.updated_on" - + @topic_count = @board.topics.count @topic_pages = Paginator.new self, @topic_count, per_page_option, params['page'] @topics = @board.topics.find :all, :order => ["#{Message.table_name}.sticky DESC", sort_clause].compact.join(', '), @@ -62,7 +55,7 @@ class BoardsController < ApplicationController } end end - + verify :method => :post, :only => [ :destroy ], :redirect_to => { :action => :index } def new @@ -84,7 +77,7 @@ class BoardsController < ApplicationController @board.destroy redirect_to_settings_in_projects end - + private def redirect_to_settings_in_projects redirect_to :controller => 'projects', :action => 'settings', :id => @project, :tab => 'boards' diff --git a/app/controllers/calendars_controller.rb b/app/controllers/calendars_controller.rb index 4544b339..6161b6ed 100644 --- a/app/controllers/calendars_controller.rb +++ b/app/controllers/calendars_controller.rb @@ -1,14 +1,23 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class CalendarsController < ApplicationController menu_item :calendar before_filter :find_optional_project rescue_from Query::StatementInvalid, :with => :query_statement_invalid - helper :issues - helper :projects - helper :queries include QueriesHelper - helper :sort include SortHelper def show @@ -16,11 +25,11 @@ class CalendarsController < ApplicationController @year = params[:year].to_i if params[:month] and params[:month].to_i > 0 and params[:month].to_i < 13 @month = params[:month].to_i - end + end end @year ||= Date.today.year @month ||= Date.today.month - + @calendar = Redmine::Helpers::Calendar.new(Date.civil(@year, @month, 1), current_language, :month) retrieve_query @query.group_by = nil @@ -30,13 +39,13 @@ class CalendarsController < ApplicationController :conditions => ["((start_date BETWEEN ? AND ?) OR (due_date BETWEEN ? AND ?))", @calendar.startdt, @calendar.enddt, @calendar.startdt, @calendar.enddt] ) events += @query.versions(:conditions => ["effective_date BETWEEN ? AND ?", @calendar.startdt, @calendar.enddt]) - + @calendar.events = events end - + render :action => 'show', :layout => false if request.xhr? end - + def update show end diff --git a/app/controllers/comments_controller.rb b/app/controllers/comments_controller.rb index 7432f831..fafeea92 100644 --- a/app/controllers/comments_controller.rb +++ b/app/controllers/comments_controller.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class CommentsController < ApplicationController default_search_scope :news model_object News @@ -12,7 +25,7 @@ class CommentsController < ApplicationController if @news.comments << @comment flash[:notice] = l(:label_comment_added) end - + redirect_to :controller => 'news', :action => 'show', :id => @news end @@ -32,5 +45,5 @@ class CommentsController < ApplicationController @comment = nil @news end - + end diff --git a/app/controllers/context_menus_controller.rb b/app/controllers/context_menus_controller.rb index 373938ab..b1099b66 100644 --- a/app/controllers/context_menus_controller.rb +++ b/app/controllers/context_menus_controller.rb @@ -1,9 +1,21 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class ContextMenusController < ApplicationController - helper :watchers - + def issues @issues = Issue.visible.all(:conditions => {:id => params[:ids]}, :include => :project) - + if (@issues.size == 1) @issue = @issues.first @allowed_statuses = @issue.new_statuses_allowed_to(User.current) @@ -33,12 +45,12 @@ class ContextMenusController < ApplicationController @assignables = @projects.map(&:assignable_users).inject{|memo,a| memo & a} @trackers = @projects.map(&:trackers).inject{|memo,t| memo & t} end - + @priorities = IssuePriority.all.reverse @statuses = IssueStatus.find(:all, :order => 'position') @back = back_url - + render :layout => false end - + end diff --git a/app/controllers/custom_fields_controller.rb b/app/controllers/custom_fields_controller.rb index cfcf7db7..294328ac 100644 --- a/app/controllers/custom_fields_controller.rb +++ b/app/controllers/custom_fields_controller.rb @@ -1,30 +1,26 @@ -# Redmine - project management software -# Copyright (C) 2006-2009 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ class CustomFieldsController < ApplicationController layout 'admin' - + before_filter :require_admin def index @custom_fields_by_type = CustomField.find(:all).group_by {|f| f.class.name } @tab = params[:tab] || 'IssueCustomField' end - + def new @custom_field = begin if params[:type].to_s.match(/.+CustomField$/) @@ -33,7 +29,7 @@ class CustomFieldsController < ApplicationController rescue end (redirect_to(:action => 'index'); return) unless @custom_field.is_a?(CustomField) - + if request.post? and @custom_field.save flash[:notice] = l(:notice_successful_create) call_hook(:controller_custom_fields_new_after_save, :params => params, :custom_field => @custom_field) @@ -53,7 +49,7 @@ class CustomFieldsController < ApplicationController @trackers = Tracker.find(:all, :order => 'position') end end - + def destroy @custom_field = CustomField.find(params[:id]).destroy redirect_to :action => 'index', :tab => @custom_field.class.name diff --git a/app/controllers/documents_controller.rb b/app/controllers/documents_controller.rb index 118a7d99..be66e1f1 100644 --- a/app/controllers/documents_controller.rb +++ b/app/controllers/documents_controller.rb @@ -1,19 +1,15 @@ -# redMine - project management software -# Copyright (C) 2006-2007 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ class DocumentsController < ApplicationController default_search_scope :documents @@ -22,9 +18,8 @@ class DocumentsController < ApplicationController before_filter :find_model_object, :except => [:index, :new] before_filter :find_project_from_association, :except => [:index, :new] before_filter :authorize - - helper :attachments - + + def index @sort_by = %w(category date title author).include?(params[:sort_by]) ? params[:sort_by] : 'category' documents = @project.documents.find :all, :include => [:attachments, :category] @@ -41,34 +36,34 @@ class DocumentsController < ApplicationController @document = @project.documents.build render :layout => false if request.xhr? end - + def show @attachments = @document.attachments.find(:all, :order => "created_on DESC") end def new - @document = @project.documents.build(params[:document]) - if request.post? and @document.save + @document = @project.documents.build(params[:document]) + if request.post? and @document.save attachments = Attachment.attach_files(@document, params[:attachments]) render_attachment_warning_if_needed(@document) flash[:notice] = l(:notice_successful_create) redirect_to :action => 'index', :project_id => @project end end - + def edit @categories = DocumentCategory.all if request.post? and @document.update_attributes(params[:document]) flash[:notice] = l(:notice_successful_update) redirect_to :action => 'show', :id => @document end - end + end def destroy @document.destroy redirect_to :controller => 'documents', :action => 'index', :project_id => @project end - + def add_attachment attachments = Attachment.attach_files(@document, params[:attachments]) render_attachment_warning_if_needed(@document) diff --git a/app/controllers/enumerations_controller.rb b/app/controllers/enumerations_controller.rb index 539a221f..2cebc9c5 100644 --- a/app/controllers/enumerations_controller.rb +++ b/app/controllers/enumerations_controller.rb @@ -1,28 +1,23 @@ -# redMine - project management software -# Copyright (C) 2006 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ class EnumerationsController < ApplicationController layout 'admin' - + before_filter :require_admin - helper :custom_fields include CustomFieldsHelper - + def index list render :action => 'list' @@ -39,7 +34,7 @@ class EnumerationsController < ApplicationController begin @enumeration = params[:type].constantize.new rescue NameError - @enumeration = Enumeration.new + @enumeration = Enumeration.new end end @@ -68,7 +63,7 @@ class EnumerationsController < ApplicationController render :action => 'edit' end end - + def destroy @enumeration = Enumeration.find(params[:id]) if !@enumeration.in_use? diff --git a/app/controllers/files_controller.rb b/app/controllers/files_controller.rb index d7234985..f2c46e76 100644 --- a/app/controllers/files_controller.rb +++ b/app/controllers/files_controller.rb @@ -1,10 +1,22 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class FilesController < ApplicationController menu_item :files before_filter :find_project_by_project_id before_filter :authorize - helper :sort include SortHelper def index @@ -13,7 +25,7 @@ class FilesController < ApplicationController 'created_on' => "#{Attachment.table_name}.created_on", 'size' => "#{Attachment.table_name}.filesize", 'downloads' => "#{Attachment.table_name}.downloads" - + @containers = [ Project.find(@project.id, :include => :attachments, :order => sort_clause)] @containers += @project.versions.find(:all, :include => :attachments, :order => sort_clause).sort.reverse render :layout => !request.xhr? diff --git a/app/controllers/gantts_controller.rb b/app/controllers/gantts_controller.rb index 50fd8c13..34e428a9 100644 --- a/app/controllers/gantts_controller.rb +++ b/app/controllers/gantts_controller.rb @@ -1,27 +1,35 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class GanttsController < ApplicationController menu_item :gantt before_filter :find_optional_project rescue_from Query::StatementInvalid, :with => :query_statement_invalid - helper :gantt - helper :issues - helper :projects - helper :queries include QueriesHelper - helper :sort include SortHelper include Redmine::Export::PDF - + def show @gantt = Redmine::Helpers::Gantt.new(params) @gantt.project = @project retrieve_query @query.group_by = nil @gantt.query = @query if @query.valid? - + basename = (@project ? "#{@project.identifier}-" : '') + 'gantt' - + respond_to do |format| format.html { render :action => "show", :layout => !request.xhr? } format.png { send_data(@gantt.to_image, :disposition => 'inline', :type => 'image/png', :filename => "#{basename}.png") } if @gantt.respond_to?('to_image') diff --git a/app/controllers/groups_controller.rb b/app/controllers/groups_controller.rb index 29e4e4b0..1ba5252c 100644 --- a/app/controllers/groups_controller.rb +++ b/app/controllers/groups_controller.rb @@ -1,27 +1,22 @@ -# Redmine - project management software -# Copyright (C) 2006-2009 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ class GroupsController < ApplicationController layout 'admin' - + before_filter :require_admin - - helper :custom_fields - + + # GET /groups # GET /groups.xml def index @@ -48,7 +43,7 @@ class GroupsController < ApplicationController # GET /groups/new.xml def new @group = Group.new - + respond_to do |format| format.html # new.html.erb format.xml { render :xml => @group } @@ -105,22 +100,22 @@ class GroupsController < ApplicationController format.xml { head :ok } end end - + def add_users @group = Group.find(params[:id]) users = User.find_all_by_id(params[:user_ids]) @group.users << users if request.post? respond_to do |format| format.html { redirect_to :controller => 'groups', :action => 'edit', :id => @group, :tab => 'users' } - format.js { - render(:update) {|page| + format.js { + render(:update) {|page| page.replace_html "tab-content-users", :partial => 'groups/users' users.each {|user| page.visual_effect(:highlight, "user-#{user.id}") } } } end end - + def remove_user @group = Group.find(params[:id]) @group.users.delete(User.find(params[:user_id])) if request.post? @@ -129,13 +124,13 @@ class GroupsController < ApplicationController format.js { render(:update) {|page| page.replace_html "tab-content-users", :partial => 'groups/users'} } end end - + def autocomplete_for_user @group = Group.find(params[:id]) - @users = User.active.like(params[:q]).find(:all, :limit => 100) - @group.users + @users = User.active.not_in_group(@group).like(params[:q]).all(:limit => 100) render :layout => false end - + def edit_membership @group = Group.find(params[:id]) @membership = Member.edit_membership(params[:membership_id], params[:membership], @group) @@ -158,7 +153,7 @@ class GroupsController < ApplicationController end end end - + def destroy_membership @group = Group.find(params[:id]) Member.find(params[:membership_id]).destroy if request.post? diff --git a/app/controllers/help_controller.rb b/app/controllers/help_controller.rb index c0e92159..c0a55983 100644 --- a/app/controllers/help_controller.rb +++ b/app/controllers/help_controller.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class HelpController < ApplicationController def wiki_syntax end diff --git a/app/controllers/issue_categories_controller.rb b/app/controllers/issue_categories_controller.rb index 049ef07f..75a2aef5 100644 --- a/app/controllers/issue_categories_controller.rb +++ b/app/controllers/issue_categories_controller.rb @@ -1,19 +1,15 @@ -# redMine - project management software -# Copyright (C) 2006 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ class IssueCategoriesController < ApplicationController menu_item :settings @@ -22,7 +18,7 @@ class IssueCategoriesController < ApplicationController before_filter :find_project_from_association, :except => :new before_filter :find_project, :only => :new before_filter :authorize - + verify :method => :post, :only => :destroy def new @@ -51,7 +47,7 @@ class IssueCategoriesController < ApplicationController end end end - + def edit if request.post? and @category.update_attributes(params[:category]) flash[:notice] = l(:notice_successful_update) @@ -81,8 +77,8 @@ private def find_model_object super @category = @object - end - + end + def find_project @project = Project.find(params[:project_id]) rescue ActiveRecord::RecordNotFound diff --git a/app/controllers/issue_moves_controller.rb b/app/controllers/issue_moves_controller.rb index 34123089..98621b0b 100644 --- a/app/controllers/issue_moves_controller.rb +++ b/app/controllers/issue_moves_controller.rb @@ -1,8 +1,21 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class IssueMovesController < ApplicationController default_search_scope :issues before_filter :find_issues, :check_project_uniqueness before_filter :authorize - + def new prepare_for_issue_move render :layout => false if request.xhr? @@ -17,8 +30,7 @@ class IssueMovesController < ApplicationController moved_issues = [] @issues.each do |issue| issue.reload - issue.init_journal(User.current) - issue.current_journal.notes = @notes if @notes.present? + issue.init_journal(User.current, @notes || "") call_hook(:controller_issues_move_before_save, { :params => params, :issue => issue, :target_project => @target_project, :copy => !!@copy }) if r = issue.move_to_project(@target_project, new_tracker, {:copy => @copy, :attributes => extract_changed_attributes_for_move(params)}) moved_issues << r @@ -48,7 +60,7 @@ class IssueMovesController < ApplicationController @copy = params[:copy_options] && params[:copy_options][:copy] @allowed_projects = Issue.allowed_target_projects_on_move @target_project = @allowed_projects.detect {|p| p.id.to_s == params[:new_project_id]} if params[:new_project_id] - @target_project ||= @project + @target_project ||= @project @trackers = @target_project.trackers @available_statuses = Workflow.available_statuses(@project) @notes = params[:notes] diff --git a/app/controllers/issue_relations_controller.rb b/app/controllers/issue_relations_controller.rb index b095df37..a053dbdc 100644 --- a/app/controllers/issue_relations_controller.rb +++ b/app/controllers/issue_relations_controller.rb @@ -1,23 +1,19 @@ -# redMine - project management software -# Copyright (C) 2006-2007 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ class IssueRelationsController < ApplicationController before_filter :find_issue, :find_project_from_association, :authorize - + def new @relation = IssueRelation.new(params[:relation]) @relation.issue_from = @issue @@ -39,7 +35,7 @@ class IssueRelationsController < ApplicationController end end end - + def destroy relation = IssueRelation.find(params[:id]) if request.post? && @issue.relations.include?(relation) @@ -54,7 +50,7 @@ class IssueRelationsController < ApplicationController } end end - + private def find_issue @issue = @object = Issue.find(params[:issue_id]) diff --git a/app/controllers/issue_statuses_controller.rb b/app/controllers/issue_statuses_controller.rb index b4b754b9..3258a289 100644 --- a/app/controllers/issue_statuses_controller.rb +++ b/app/controllers/issue_statuses_controller.rb @@ -1,28 +1,24 @@ -# redMine - project management software -# Copyright (C) 2006 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ class IssueStatusesController < ApplicationController layout 'admin' - + before_filter :require_admin verify :method => :post, :only => [ :destroy, :create, :update, :move, :update_issue_done_ratio ], :redirect_to => { :action => :index } - + def index @issue_status_pages, @issue_statuses = paginate :issue_statuses, :per_page => 25, :order => "position" render :action => "index", :layout => false if request.xhr? @@ -62,8 +58,8 @@ class IssueStatusesController < ApplicationController rescue flash[:error] = l(:error_unable_delete_issue_status) redirect_to :action => 'index' - end - + end + def update_issue_done_ratio if IssueStatus.update_issue_done_ratios flash[:notice] = l(:notice_issue_done_ratios_updated) diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb index 051f8910..5a698d7a 100644 --- a/app/controllers/issues_controller.rb +++ b/app/controllers/issues_controller.rb @@ -1,24 +1,20 @@ -# Redmine - project management software -# Copyright (C) 2006-2008 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ class IssuesController < ApplicationController menu_item :new_issue, :only => [:new, :create] default_search_scope :issues - + before_filter :find_issue, :only => [:show, :edit, :update] before_filter :find_issues, :only => [:bulk_edit, :bulk_update, :move, :perform_move, :destroy] before_filter :check_project_uniqueness, :only => [:move, :perform_move] @@ -30,27 +26,17 @@ class IssuesController < ApplicationController accept_key_auth :index, :show, :create, :update, :destroy rescue_from Query::StatementInvalid, :with => :query_statement_invalid - - helper :journals - helper :projects - include ProjectsHelper - helper :custom_fields + + include JournalsHelper + include ProjectsHelper include CustomFieldsHelper - helper :issue_relations include IssueRelationsHelper - helper :watchers include WatchersHelper - helper :attachments include AttachmentsHelper - helper :queries include QueriesHelper - helper :repositories include RepositoriesHelper - helper :sort include SortHelper include IssuesHelper - helper :timelog - helper :gantt include Redmine::Export::PDF verify :method => [:post, :delete], @@ -60,12 +46,12 @@ class IssuesController < ApplicationController verify :method => :post, :only => :create, :render => {:nothing => true, :status => :method_not_allowed } verify :method => :post, :only => :bulk_update, :render => {:nothing => true, :status => :method_not_allowed } verify :method => :put, :only => :update, :render => {:nothing => true, :status => :method_not_allowed } - + def index retrieve_query sort_init(@query.sort_criteria.empty? ? [['id', 'desc']] : @query.sort_criteria) sort_update(@query.sortable_columns) - + if @query.valid? case params[:format] when 'csv', 'pdf' @@ -77,16 +63,16 @@ class IssuesController < ApplicationController else @limit = per_page_option end - + @issue_count = @query.issue_count @issue_pages = Paginator.new self, @issue_count, @limit, params['page'] @offset ||= @issue_pages.current.offset @issues = @query.issues(:include => [:assigned_to, :tracker, :priority, :category, :fixed_version], - :order => sort_clause, - :offset => @offset, + :order => sort_clause, + :offset => @offset, :limit => @limit) @issue_count_by_group = @query.issue_count_by_group - + respond_to do |format| format.html { render :template => 'issues/index.rhtml', :layout => !request.xhr? } format.api @@ -101,10 +87,9 @@ class IssuesController < ApplicationController rescue ActiveRecord::RecordNotFound render_404 end - + def show - @journals = @issue.journals.find(:all, :include => [:user, :details], :order => "#{Journal.table_name}.created_on ASC") - @journals.each_with_index {|j,i| j.indice = i+1} + @journals = @issue.journals.find(:all, :include => [:user], :order => "#{Journal.table_name}.created_at ASC") @journals.reverse! if User.current.wants_comments_in_reverse_order? @changesets = @issue.changesets.visible.all @changesets.reverse! if User.current.wants_comments_in_reverse_order? @@ -112,7 +97,7 @@ class IssuesController < ApplicationController @allowed_statuses = @issue.new_statuses_allowed_to(User.current) @edit_allowed = User.current.allowed_to?(:edit_issues, @project) @priorities = IssuePriority.all - @time_entry = TimeEntry.new + @time_entry = TimeEntry.new(:issue => @issue, :project => @issue.project) respond_to do |format| format.html { render :template => 'issues/show.rhtml' } format.api @@ -132,6 +117,7 @@ class IssuesController < ApplicationController def create call_hook(:controller_issues_new_before_save, { :params => params, :issue => @issue }) + IssueObserver.instance.send_notification = params[:send_notification] == '0' ? false : true if @issue.save attachments = Attachment.attach_files(@issue, params[:attachments]) render_attachment_warning_if_needed(@issue) @@ -152,8 +138,9 @@ class IssuesController < ApplicationController end end end - + def edit + return render_reply(@journal) if @journal update_issue_from_params @journal = @issue.current_journal @@ -166,10 +153,10 @@ class IssuesController < ApplicationController def update update_issue_from_params - + JournalObserver.instance.send_notification = params[:send_notification] == '0' ? false : true if @issue.save_issue_with_child_records(params, @time_entry) render_attachment_warning_if_needed(@issue) - flash[:notice] = l(:notice_successful_update) unless @issue.current_journal.new_record? + flash[:notice] = l(:notice_successful_update) unless @issue.current_journal == @journal respond_to do |format| format.html { redirect_back_or_default({:action => 'show', :id => @issue}) } @@ -177,7 +164,7 @@ class IssuesController < ApplicationController end else render_attachment_warning_if_needed(@issue) - flash[:notice] = l(:notice_successful_update) unless @issue.current_journal.new_record? + flash[:notice] = l(:notice_successful_update) unless @issue.current_journal == @journal @journal = @issue.current_journal respond_to do |format| @@ -206,6 +193,7 @@ class IssuesController < ApplicationController journal = issue.init_journal(User.current, params[:notes]) issue.safe_attributes = attributes call_hook(:controller_issues_bulk_edit_before_save, { :params => params, :issue => issue }) + JournalObserver.instance.send_notification = params[:send_notification] == '0' ? false : true unless issue.save # Keep unsaved issue ids to display them in flash error unsaved_issue_ids << issue.id @@ -214,7 +202,7 @@ class IssuesController < ApplicationController set_flash_from_bulk_issue_save(@issues, unsaved_issue_ids) redirect_back_or_default({:controller => 'issues', :action => 'index', :project_id => @project}) end - + def destroy @hours = TimeEntry.sum(:hours, :conditions => ['issue_id IN (?)', @issues]).to_f if @hours > 0 @@ -236,7 +224,13 @@ class IssuesController < ApplicationController return unless api_request? end end - @issues.each(&:destroy) + @issues.each do |issue| + begin + issue.reload.destroy + rescue ::ActiveRecord::RecordNotFound # raised by #reload if issue no longer exists + # nothing to do, issue was already deleted (eg. by a parent) + end + end respond_to do |format| format.html { redirect_back_or_default(:action => 'index', :project_id => @project) } format.api { head :ok } @@ -250,14 +244,14 @@ private rescue ActiveRecord::RecordNotFound render_404 end - + def find_project project_id = (params[:issue] && params[:issue][:project_id]) || params[:project_id] @project = Project.find(project_id) rescue ActiveRecord::RecordNotFound render_404 end - + # Used by #edit and #update to set some common instance variables # from the params # TODO: Refactor, not everything in here is needed by #edit @@ -265,12 +259,13 @@ private @allowed_statuses = @issue.new_statuses_allowed_to(User.current) @priorities = IssuePriority.all @edit_allowed = User.current.allowed_to?(:edit_issues, @project) - @time_entry = TimeEntry.new + @time_entry = TimeEntry.new(:issue => @issue, :project => @issue.project) @time_entry.attributes = params[:time_entry] - + @notes = params[:notes] || (params[:issue].present? ? params[:issue][:notes] : nil) @issue.init_journal(User.current, @notes) @issue.safe_attributes = params[:issue] + @journal = @issue.current_journal end # TODO: Refactor, lots of extra code in here @@ -283,7 +278,7 @@ private else @issue = @project.issues.visible.find(params[:id]) end - + @issue.project = @project # Tracker must be set before custom field values @issue.tracker ||= @project.trackers.find((params[:issue] && params[:issue][:tracker_id]) || params[:tracker_id] || :first) diff --git a/app/controllers/journals_controller.rb b/app/controllers/journals_controller.rb index 1f65dc82..9df0f949 100644 --- a/app/controllers/journals_controller.rb +++ b/app/controllers/journals_controller.rb @@ -1,49 +1,43 @@ -# redMine - project management software -# Copyright (C) 2006-2008 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ class JournalsController < ApplicationController - before_filter :find_journal, :only => [:edit] + before_filter :find_journal, :only => [:edit, :diff] before_filter :find_issue, :only => [:new] before_filter :find_optional_project, :only => [:index] - before_filter :authorize, :only => [:new, :edit] + before_filter :authorize, :only => [:new, :edit, :diff] accept_key_auth :index + menu_item :issues - helper :issues - helper :queries include QueriesHelper - helper :sort include SortHelper - helper :custom_fields def index retrieve_query sort_init 'id', 'desc' sort_update(@query.sortable_columns) - + if @query.valid? - @journals = @query.journals(:order => "#{Journal.table_name}.created_on DESC", - :limit => 25) + @journals = @query.issue_journals(:order => "#{Journal.table_name}.created_at DESC", + :limit => 25) end @title = (@project ? @project.name : Setting.app_title) + ": " + (@query.new_record? ? l(:label_changes_details) : @query.name) render :layout => false, :content_type => 'application/atom+xml' rescue ActiveRecord::RecordNotFound render_404 end - + + # Used when replying to an issue or journal def new journal = Journal.find(params[:journal_id]) if params[:journal_id] if journal @@ -57,7 +51,7 @@ class JournalsController < ApplicationController text = text.to_s.strip.gsub(%r{
((.|\s)*?)
}m, '[...]') content = "#{ll(Setting.default_language, :text_user_wrote, user)}\n> " content << text.gsub(/(\r?\n|\r\n?)/, "\n> ") + "\n\n" - + render(:update) { |page| page.<< "$('notes').value = \"#{escape_javascript content}\";" page.show 'update' @@ -66,23 +60,33 @@ class JournalsController < ApplicationController page << "$('notes').scrollTop = $('notes').scrollHeight - $('notes').clientHeight;" } end - + def edit + (render_403; return false) unless @journal.editable_by?(User.current) if request.post? - @journal.update_attributes(:notes => params[:notes]) if params[:notes] + @journal.update_attribute(:notes, params[:notes]) if params[:notes] @journal.destroy if @journal.details.empty? && @journal.notes.blank? call_hook(:controller_journals_edit_post, { :journal => @journal, :params => params}) respond_to do |format| - format.html { redirect_to :controller => 'issues', :action => 'show', :id => @journal.journalized_id } + format.html { redirect_to :controller => @journal.journaled.class.name.pluralize.downcase, + :action => 'show', :id => @journal.journaled_id } format.js { render :action => 'update' } end + else + respond_to do |format| + format.html { + # TODO: implement non-JS journal update + render :nothing => true + } + format.js + end end end - -private + + private + def find_journal @journal = Journal.find(params[:id]) - (render_403; return false) unless @journal.editable_by?(User.current) @project = @journal.journalized.project rescue ActiveRecord::RecordNotFound render_404 diff --git a/app/controllers/ldap_auth_sources_controller.rb b/app/controllers/ldap_auth_sources_controller.rb index e024fee9..56c5ee8d 100644 --- a/app/controllers/ldap_auth_sources_controller.rb +++ b/app/controllers/ldap_auth_sources_controller.rb @@ -1,24 +1,20 @@ -# redMine - project management software -# Copyright (C) 2006 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ class LdapAuthSourcesController < AuthSourcesController protected - + def auth_source_class AuthSourceLdap end diff --git a/app/controllers/mail_handler_controller.rb b/app/controllers/mail_handler_controller.rb index 16f60650..7301503a 100644 --- a/app/controllers/mail_handler_controller.rb +++ b/app/controllers/mail_handler_controller.rb @@ -1,27 +1,23 @@ -# redMine - project management software -# Copyright (C) 2006-2008 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ class MailHandlerController < ActionController::Base before_filter :check_credential - + verify :method => :post, :only => :index, :render => { :nothing => true, :status => 405 } - + # Submits an incoming email to MailHandler def index options = params.dup @@ -32,9 +28,9 @@ class MailHandlerController < ActionController::Base render :nothing => true, :status => :unprocessable_entity end end - + private - + def check_credential User.current = nil unless Setting.mail_handler_api_enabled? && params[:key].to_s == Setting.mail_handler_api_key diff --git a/app/controllers/members_controller.rb b/app/controllers/members_controller.rb index 795709a4..a3a3e36b 100644 --- a/app/controllers/members_controller.rb +++ b/app/controllers/members_controller.rb @@ -1,19 +1,15 @@ -# redMine - project management software -# Copyright (C) 2006 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ class MembersController < ApplicationController model_object Member @@ -40,8 +36,8 @@ class MembersController < ApplicationController format.html { redirect_to :controller => 'projects', :action => 'settings', :tab => 'members', :id => @project } - format.js { - render(:update) {|page| + format.js { + render(:update) {|page| page.replace_html "tab-content-members", :partial => 'projects/settings/members' page << 'hideOnLoad()' members.each {|member| page.visual_effect(:highlight, "member-#{member.id}") } @@ -58,17 +54,17 @@ class MembersController < ApplicationController page.alert(l(:notice_failed_to_save_members, :errors => errors.join(', '))) } } - + end end end - + def edit if request.post? and @member.update_attributes(params[:member]) respond_to do |format| format.html { redirect_to :controller => 'projects', :action => 'settings', :tab => 'members', :id => @project } - format.js { - render(:update) {|page| + format.js { + render(:update) {|page| page.replace_html "tab-content-members", :partial => 'projects/settings/members' page << 'hideOnLoad()' page.visual_effect(:highlight, "member-#{@member.id}") @@ -91,7 +87,7 @@ class MembersController < ApplicationController } end end - + def autocomplete_for_member @principals = Principal.active.like(params[:q]).find(:all, :limit => 100) - @project.principals render :layout => false diff --git a/app/controllers/messages_controller.rb b/app/controllers/messages_controller.rb index 5ad8ea58..af34eb89 100644 --- a/app/controllers/messages_controller.rb +++ b/app/controllers/messages_controller.rb @@ -1,19 +1,15 @@ -# redMine - project management software -# Copyright (C) 2006-2007 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ class MessagesController < ApplicationController menu_item :boards @@ -25,12 +21,10 @@ class MessagesController < ApplicationController verify :method => :post, :only => [ :reply, :destroy ], :redirect_to => { :action => :show } verify :xhr => true, :only => :quote - helper :watchers - helper :attachments - include AttachmentsHelper + include AttachmentsHelper REPLIES_PER_PAGE = 25 unless const_defined?(:REPLIES_PER_PAGE) - + # Show a topic and its replies def show page = params[:page] @@ -39,18 +33,18 @@ class MessagesController < ApplicationController offset = @topic.children.count(:conditions => ["#{Message.table_name}.id < ?", params[:r].to_i]) page = 1 + offset / REPLIES_PER_PAGE end - + @reply_count = @topic.children.count @reply_pages = Paginator.new self, @reply_count, REPLIES_PER_PAGE, page @replies = @topic.children.find(:all, :include => [:author, :attachments, {:board => :project}], :order => "#{Message.table_name}.created_on ASC", :limit => @reply_pages.items_per_page, :offset => @reply_pages.current.offset) - + @reply = Message.new(:subject => "RE: #{@message.subject}") render :action => "show", :layout => false if request.xhr? end - + # Create a new topic def new @message = Message.new(params[:message]) @@ -97,7 +91,7 @@ class MessagesController < ApplicationController redirect_to :action => 'show', :board_id => @message.board, :id => @message.root, :r => (@message.parent_id && @message.id) end end - + # Delete a messages def destroy (render_403; return false) unless @message.destroyable_by?(User.current) @@ -106,7 +100,7 @@ class MessagesController < ApplicationController { :controller => 'boards', :action => 'show', :project_id => @project, :id => @board } : { :action => 'show', :id => @message.parent, :r => @message } end - + def quote user = @message.author text = @message.content @@ -123,14 +117,14 @@ class MessagesController < ApplicationController page << "$('message_content').scrollTop = $('message_content').scrollHeight - $('message_content').clientHeight;" } end - + def preview message = @board.messages.find_by_id(params[:id]) @attachements = message.attachments if message @text = (params[:message] || params[:reply])[:content] render :partial => 'common/preview' end - + private def find_message find_board @@ -139,7 +133,7 @@ private rescue ActiveRecord::RecordNotFound render_404 end - + def find_board @board = Board.find(params[:board_id], :include => :project) @project = @board.project diff --git a/app/controllers/my_controller.rb b/app/controllers/my_controller.rb index b381fbc8..ad70cdd3 100644 --- a/app/controllers/my_controller.rb +++ b/app/controllers/my_controller.rb @@ -1,26 +1,19 @@ -# Redmine - project management software -# Copyright (C) 2006-2009 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ class MyController < ApplicationController before_filter :require_login - helper :issues - helper :users - helper :custom_fields BLOCKS = { 'issuesassignedtome' => :label_assigned_to_me_issues, 'issuesreportedbyme' => :label_reported_issues, @@ -31,8 +24,8 @@ class MyController < ApplicationController 'timelog' => :label_spent_time }.merge(Redmine::Views::MyPage::Block.additional_blocks).freeze - DEFAULT_LAYOUT = { 'left' => ['issuesassignedtome'], - 'right' => ['issuesreportedbyme'] + DEFAULT_LAYOUT = { 'left' => ['issuesassignedtome'], + 'right' => ['issuesreportedbyme'] }.freeze verify :xhr => true, @@ -88,7 +81,7 @@ class MyController < ApplicationController end end end - + # Create a new feeds key def reset_rss_key if request.post? @@ -122,7 +115,7 @@ class MyController < ApplicationController @block_options = [] BLOCKS.each {|k, v| @block_options << [l("my.blocks.#{v}", :default => [v, v.to_s.humanize]), k.dasherize]} end - + # Add a block to user's page # The block is added on top of the page # params[:block] : id of the block to add @@ -136,10 +129,10 @@ class MyController < ApplicationController # add it on top layout['top'].unshift block @user.pref[:my_page_layout] = layout - @user.pref.save + @user.pref.save render :partial => "block", :locals => {:user => @user, :block_name => block} end - + # Remove a block to user's page # params[:block] : id of the block to remove def remove_block @@ -149,7 +142,7 @@ class MyController < ApplicationController layout = @user.pref[:my_page_layout] || {} %w(top left right).each {|f| (layout[f] ||= []).delete block } @user.pref[:my_page_layout] = layout - @user.pref.save + @user.pref.save render :nothing => true end @@ -169,7 +162,7 @@ class MyController < ApplicationController } layout[group] = group_items @user.pref[:my_page_layout] = layout - @user.pref.save + @user.pref.save end end render :nothing => true diff --git a/app/controllers/news_controller.rb b/app/controllers/news_controller.rb index e7c643e9..c218251c 100644 --- a/app/controllers/news_controller.rb +++ b/app/controllers/news_controller.rb @@ -1,19 +1,15 @@ -# redMine - project management software -# Copyright (C) 2006 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ class NewsController < ApplicationController default_search_scope :news @@ -24,7 +20,8 @@ class NewsController < ApplicationController before_filter :authorize, :except => [:index] before_filter :find_optional_project, :only => :index accept_key_auth :index - + + def index case params[:format] when 'xml', 'json' @@ -32,9 +29,9 @@ class NewsController < ApplicationController else @limit = 10 end - + scope = @project ? @project.news.visible : News.visible - + @news_count = scope.count @news_pages = Paginator.new self, @news_count, @limit, params['page'] @offset ||= @news_pages.current.offset @@ -42,14 +39,14 @@ class NewsController < ApplicationController :order => "#{News.table_name}.created_on DESC", :offset => @offset, :limit => @limit) - + respond_to do |format| format.html { render :layout => false if request.xhr? } format.api format.atom { render_feed(@newss, :title => (@project ? @project.name : Setting.app_title) + ": #{l(:label_news_plural)}") } end end - + def show @comments = @news.comments @comments.reverse! if User.current.wants_comments_in_reverse_order? @@ -74,7 +71,7 @@ class NewsController < ApplicationController def edit end - + def update if request.put? and @news.update_attributes(params[:news]) flash[:notice] = l(:notice_successful_update) @@ -88,14 +85,14 @@ class NewsController < ApplicationController @news.destroy redirect_to :action => 'index', :project_id => @project end - + private def find_project @project = Project.find(params[:project_id]) rescue ActiveRecord::RecordNotFound render_404 end - + def find_optional_project return true unless params[:project_id] @project = Project.find(params[:project_id]) diff --git a/app/controllers/previews_controller.rb b/app/controllers/previews_controller.rb index 612025cb..b863b620 100644 --- a/app/controllers/previews_controller.rb +++ b/app/controllers/previews_controller.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class PreviewsController < ApplicationController before_filter :find_project @@ -22,12 +35,12 @@ class PreviewsController < ApplicationController end private - + def find_project project_id = (params[:issue] && params[:issue][:project_id]) || params[:project_id] @project = Project.find(project_id) rescue ActiveRecord::RecordNotFound render_404 end - + end diff --git a/app/controllers/project_enumerations_controller.rb b/app/controllers/project_enumerations_controller.rb index 0b15887f..027f682d 100644 --- a/app/controllers/project_enumerations_controller.rb +++ b/app/controllers/project_enumerations_controller.rb @@ -1,7 +1,20 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class ProjectEnumerationsController < ApplicationController before_filter :find_project_by_project_id before_filter :authorize - + def update if request.put? && params[:enumerations] Project.transaction do @@ -11,7 +24,7 @@ class ProjectEnumerationsController < ApplicationController end flash[:notice] = l(:notice_successful_update) end - + redirect_to :controller => 'projects', :action => 'settings', :tab => 'activities', :id => @project end diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 459b5478..133a18cb 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -1,25 +1,21 @@ -# Redmine - project management software -# Copyright (C) 2006-2009 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ class ProjectsController < ApplicationController menu_item :overview menu_item :roadmap, :only => :roadmap menu_item :settings, :only => :settings - + before_filter :find_project, :except => [ :index, :list, :new, :create, :copy ] before_filter :authorize, :except => [ :index, :list, :new, :create, :copy, :archive, :unarchive, :destroy] before_filter :authorize_global, :only => [:new, :create] @@ -32,22 +28,17 @@ class ProjectsController < ApplicationController end end - helper :sort include SortHelper - helper :custom_fields - include CustomFieldsHelper - helper :issues - helper :queries + include CustomFieldsHelper include QueriesHelper - helper :repositories include RepositoriesHelper include ProjectsHelper - + # Lists visible projects def index respond_to do |format| - format.html { - @projects = Project.visible.find(:all, :order => 'lft') + format.html { + @projects = Project.visible.find(:all, :order => 'lft') } format.api { @offset, @limit = api_offset_and_limit @@ -61,7 +52,7 @@ class ProjectsController < ApplicationController } end end - + def new @issue_custom_fields = IssueCustomField.find(:all, :order => "#{CustomField.table_name}.position") @trackers = Tracker.all @@ -84,7 +75,7 @@ class ProjectsController < ApplicationController @project.members << m end respond_to do |format| - format.html { + format.html { flash[:notice] = l(:notice_successful_create) redirect_to :controller => 'projects', :action => 'settings', :id => @project } @@ -96,9 +87,9 @@ class ProjectsController < ApplicationController format.api { render_validation_errors(@project) } end end - + end - + def copy @issue_custom_fields = IssueCustomField.find(:all, :order => "#{CustomField.table_name}.position") @trackers = Tracker.all @@ -112,7 +103,7 @@ class ProjectsController < ApplicationController @project.identifier = Project.next_identifier if Setting.sequential_project_identifiers? else redirect_to :controller => 'admin', :action => 'projects' - end + end else Mailer.with_deliveries(params[:notifications] == '1') do @project = Project.new @@ -134,35 +125,34 @@ class ProjectsController < ApplicationController rescue ActiveRecord::RecordNotFound redirect_to :controller => 'admin', :action => 'projects' end - + # Show @project def show if params[:jump] # try to redirect to the requested menu item redirect_to_project_menu_item(@project, params[:jump]) && return end - + @users_by_role = @project.users_by_role - @subprojects = @project.children.visible + @subprojects = @project.children.visible.all @news = @project.news.find(:all, :limit => 5, :include => [ :author, :project ], :order => "#{News.table_name}.created_on DESC") @trackers = @project.rolled_up_trackers - + cond = @project.project_condition(Setting.display_subprojects_issues?) - + @open_issues_by_tracker = Issue.visible.count(:group => :tracker, :include => [:project, :status, :tracker], :conditions => ["(#{cond}) AND #{IssueStatus.table_name}.is_closed=?", false]) @total_issues_by_tracker = Issue.visible.count(:group => :tracker, :include => [:project, :status, :tracker], :conditions => cond) - - TimeEntry.visible_by(User.current) do - @total_hours = TimeEntry.sum(:hours, - :include => :project, - :conditions => cond).to_f + + if User.current.allowed_to?(:view_time_entries, @project) + @total_hours = TimeEntry.visible.sum(:hours, :include => :project, :conditions => cond).to_f end + @key = User.current.rss_key - + respond_to do |format| format.html format.api @@ -177,7 +167,7 @@ class ProjectsController < ApplicationController @repository ||= @project.repository @wiki ||= @project.wiki end - + def edit end @@ -188,7 +178,7 @@ class ProjectsController < ApplicationController if validate_parent_id && @project.save @project.set_allowed_parent!(params[:project]['parent_id']) if params[:project].has_key?('parent_id') respond_to do |format| - format.html { + format.html { flash[:notice] = l(:notice_successful_update) redirect_to :action => 'settings', :id => @project } @@ -196,7 +186,7 @@ class ProjectsController < ApplicationController end else respond_to do |format| - format.html { + format.html { settings render :action => 'settings' } @@ -220,12 +210,12 @@ class ProjectsController < ApplicationController end redirect_to(url_for(:controller => 'admin', :action => 'projects', :status => params[:status])) end - + def unarchive @project.unarchive if request.post? && !@project.active? redirect_to(url_for(:controller => 'admin', :action => 'projects', :status => params[:status])) end - + # Delete @project def destroy @project_to_destroy = @project diff --git a/app/controllers/queries_controller.rb b/app/controllers/queries_controller.rb index 0b798636..7e1a1a99 100644 --- a/app/controllers/queries_controller.rb +++ b/app/controllers/queries_controller.rb @@ -1,35 +1,32 @@ -# redMine - project management software -# Copyright (C) 2006-2007 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ class QueriesController < ApplicationController menu_item :issues before_filter :find_query, :except => :new before_filter :find_optional_project, :only => :new - + def new @query = Query.new(params[:query]) @query.project = params[:query_is_for_all] ? nil : @project @query.user = User.current @query.is_public = false unless User.current.allowed_to?(:manage_public_queries, @project) || User.current.admin? - @query.column_names = nil if params[:default_columns] - - @query.add_filters(params[:fields], params[:operators], params[:values]) if params[:fields] + + @query.add_filters(params[:fields] || params[:f], params[:operators] || params[:op], params[:values] || params[:v]) if params[:fields] || params[:f] @query.group_by ||= params[:group_by] - + @query.column_names = params[:c] if params[:c] + @query.column_names = nil if params[:default_columns] + if request.post? && params[:confirm] && @query.save flash[:notice] = l(:notice_successful_create) redirect_to :controller => 'issues', :action => 'index', :project_id => @project, :query_id => @query @@ -37,16 +34,18 @@ class QueriesController < ApplicationController end render :layout => false if request.xhr? end - + def edit if request.post? @query.filters = {} - @query.add_filters(params[:fields], params[:operators], params[:values]) if params[:fields] + @query.add_filters(params[:fields] || params[:f], params[:operators] || params[:op], params[:values] || params[:v]) if params[:fields] || params[:f] @query.attributes = params[:query] @query.project = nil if params[:query_is_for_all] @query.is_public = false unless User.current.allowed_to?(:manage_public_queries, @project) || User.current.admin? + @query.group_by ||= params[:group_by] + @query.column_names = params[:c] if params[:c] @query.column_names = nil if params[:default_columns] - + if @query.save flash[:notice] = l(:notice_successful_update) redirect_to :controller => 'issues', :action => 'index', :project_id => @project, :query_id => @query @@ -58,7 +57,7 @@ class QueriesController < ApplicationController @query.destroy if request.post? redirect_to :controller => 'issues', :action => 'index', :project_id => @project, :set_filter => 1 end - + private def find_query @query = Query.find(params[:id]) @@ -67,7 +66,7 @@ private rescue ActiveRecord::RecordNotFound render_404 end - + def find_optional_project @project = Project.find(params[:project_id]) if params[:project_id] render_403 unless User.current.allowed_to?(:save_queries, @project, :global => true) diff --git a/app/controllers/reports_controller.rb b/app/controllers/reports_controller.rb index 0d471507..8f506510 100644 --- a/app/controllers/reports_controller.rb +++ b/app/controllers/reports_controller.rb @@ -1,19 +1,15 @@ -# redMine - project management software -# Copyright (C) 2006 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ class ReportsController < ApplicationController menu_item :issues @@ -37,7 +33,7 @@ class ReportsController < ApplicationController @issues_by_subproject = Issue.by_subproject(@project) || [] render :template => "reports/issue_report" - end + end def issue_report_details case params[:detail] diff --git a/app/controllers/repositories_controller.rb b/app/controllers/repositories_controller.rb index de44f1d0..14054eb9 100644 --- a/app/controllers/repositories_controller.rb +++ b/app/controllers/repositories_controller.rb @@ -1,19 +1,15 @@ -# Redmine - project management software -# Copyright (C) 2006-2009 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ require 'SVG/Graph/Bar' require 'SVG/Graph/BarHorizontal' @@ -26,14 +22,14 @@ class RepositoriesController < ApplicationController menu_item :repository menu_item :settings, :only => :edit default_search_scope :changesets - + before_filter :find_repository, :except => :edit before_filter :find_project, :only => :edit before_filter :authorize accept_key_auth :revisions - + rescue_from Redmine::Scm::Adapters::CommandFailed, :with => :show_error_command_failed - + def edit @repository = @project.repository if !@repository @@ -52,7 +48,7 @@ class RepositoriesController < ApplicationController end end end - + def committers @committers = @repository.committers @users = @project.users @@ -77,6 +73,7 @@ class RepositoriesController < ApplicationController @repository.fetch_changesets if Setting.autofetch_changesets? && @path.empty? @entries = @repository.entries(@path, @rev) + @changeset = @repository.find_changeset_by_name(@rev) if request.xhr? @entries ? render(:partial => 'dir_list_content') : render(:nothing => true) else @@ -122,17 +119,35 @@ class RepositoriesController < ApplicationController @content = @repository.cat(@path, @rev) (show_error_not_found; return) unless @content - if 'raw' == params[:format] || @content.is_binary_data? || - (@entry.size && @entry.size > Setting.file_max_size_displayed.to_i.kilobyte) + if 'raw' == params[:format] || + (@content.size && @content.size > Setting.file_max_size_displayed.to_i.kilobyte) || + ! is_entry_text_data?(@content, @path) # Force the download - send_data @content, :filename => filename_for_content_disposition(@path.split('/').last) + send_opt = { :filename => filename_for_content_disposition(@path.split('/').last) } + send_type = Redmine::MimeType.of(@path) + send_opt[:type] = send_type.to_s if send_type + send_data @content, send_opt else # Prevent empty lines when displaying a file with Windows style eol + # TODO: UTF-16 + # Is this needs? AttachmentsController reads file simply. @content.gsub!("\r\n", "\n") @changeset = @repository.find_changeset_by_name(@rev) - end + end end + def is_entry_text_data?(ent, path) + # UTF-16 contains "\x00". + # It is very strict that file contains less than 30% of ascii symbols + # in non Western Europe. + return true if Redmine::MimeType.is_type?('text', path) + # Ruby 1.8.6 has a bug of integer divisions. + # http://apidock.com/ruby/v1_8_6_287/String/is_binary_data%3F + return false if ent.is_binary_data? + true + end + private :is_entry_text_data? + def annotate @entry = @repository.entry(@path, @rev) (show_error_not_found; return) unless @entry @@ -167,14 +182,14 @@ class RepositoriesController < ApplicationController else @diff_type = params[:type] || User.current.pref[:diff_type] || 'inline' @diff_type = 'inline' unless %w(inline sbs).include?(@diff_type) - + # Save diff type as user preference if User.current.logged? && @diff_type != User.current.pref[:diff_type] User.current.pref[:diff_type] = @diff_type User.current.preference.save end - - @cache_key = "repositories/diff/#{@repository.id}/" + Digest::MD5.hexdigest("#{@path}-#{@rev}-#{@rev_to}-#{@diff_type}") + + @cache_key = "repositories/diff/#{@repository.id}/" + Digest::MD5.hexdigest("#{@path}-#{@rev}-#{@rev_to}-#{@diff_type}") unless read_fragment(@cache_key) @diff = @repository.diff(@path, @rev, @rev_to) show_error_not_found unless @diff @@ -204,7 +219,7 @@ class RepositoriesController < ApplicationController render_404 end end - + private REV_PARAM_RE = %r{\A[a-f0-9]*\Z}i @@ -217,8 +232,8 @@ class RepositoriesController < ApplicationController @path ||= '' @rev = params[:rev].blank? ? @repository.default_branch : params[:rev].strip @rev_to = params[:rev_to] - - unless @rev.to_s.match(REV_PARAM_RE) && @rev.to_s.match(REV_PARAM_RE) + + unless @rev.to_s.match(REV_PARAM_RE) && @rev_to.to_s.match(REV_PARAM_RE) if @repository.branches.blank? raise InvalidRevisionParam end @@ -232,12 +247,12 @@ class RepositoriesController < ApplicationController def show_error_not_found render_error :message => l(:error_scm_not_found), :status => 404 end - + # Handler for Redmine::Scm::Adapters::CommandFailed exception def show_error_command_failed(exception) render_error l(:error_scm_command_failed, exception.message) end - + def graph_commits_per_month(repository) @date_to = Date.today @date_from = @date_to << 11 @@ -249,10 +264,10 @@ class RepositoriesController < ApplicationController changes_by_day = repository.changes.count(:all, :group => :commit_date, :conditions => ["commit_date BETWEEN ? AND ?", @date_from, @date_to]) changes_by_month = [0] * 12 changes_by_day.each {|c| changes_by_month[c.first.to_date.months_ago] += c.last } - + fields = [] 12.times {|m| fields << month_name(((Date.today.month - 1 - m) % 12) + 1)} - + graph = SVG::Graph::Bar.new( :height => 300, :width => 800, @@ -264,7 +279,7 @@ class RepositoriesController < ApplicationController :graph_title => l(:label_commits_per_month), :show_graph_title => true ) - + graph.add_data( :data => commits_by_month[0..11].reverse, :title => l(:label_revision_plural) @@ -274,7 +289,7 @@ class RepositoriesController < ApplicationController :data => changes_by_month[0..11].reverse, :title => l(:label_change_plural) ) - + graph.burn end @@ -284,18 +299,18 @@ class RepositoriesController < ApplicationController changes_by_author = repository.changes.count(:all, :group => :committer) h = changes_by_author.inject({}) {|o, i| o[i.first] = i.last; o} - + fields = commits_by_author.collect {|r| r.first} commits_data = commits_by_author.collect {|r| r.last} changes_data = commits_by_author.collect {|r| h[r.first] || 0} - + fields = fields + [""]*(10 - fields.length) if fields.length<10 commits_data = commits_data + [0]*(10 - commits_data.length) if commits_data.length<10 changes_data = changes_data + [0]*(10 - changes_data.length) if changes_data.length<10 - + # Remove email adress in usernames fields = fields.collect {|c| c.gsub(%r{<.+@.+>}, '') } - + graph = SVG::Graph::BarHorizontal.new( :height => 400, :width => 800, @@ -307,7 +322,7 @@ class RepositoriesController < ApplicationController :graph_title => l(:label_commits_per_author), :show_graph_title => true ) - + graph.add_data( :data => commits_data, :title => l(:label_revision_plural) @@ -317,12 +332,12 @@ class RepositoriesController < ApplicationController :data => changes_data, :title => l(:label_change_plural) ) - + graph.burn end end - + class Date def months_ago(date = Date.today) (date.year - self.year)*12 + (date.month - self.month) diff --git a/app/controllers/roles_controller.rb b/app/controllers/roles_controller.rb index efb08497..0451cea5 100644 --- a/app/controllers/roles_controller.rb +++ b/app/controllers/roles_controller.rb @@ -1,23 +1,19 @@ -# redMine - project management software -# Copyright (C) 2006 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ class RolesController < ApplicationController layout 'admin' - + before_filter :require_admin verify :method => :post, :only => [ :destroy, :move ], @@ -50,7 +46,7 @@ class RolesController < ApplicationController flash[:notice] = l(:notice_successful_update) redirect_to :action => 'index' else - @permissions = @role.setable_permissions + @permissions = @role.setable_permissions end end @@ -62,8 +58,8 @@ class RolesController < ApplicationController flash[:error] = l(:error_can_not_remove_role) redirect_to :action => 'index' end - - def report + + def report @roles = Role.find(:all, :order => 'builtin, position') @permissions = Redmine::AccessControl.permissions.select { |p| !p.public? } if request.post? diff --git a/app/controllers/search_controller.rb b/app/controllers/search_controller.rb index f2e146b2..1c6f7a51 100644 --- a/app/controllers/search_controller.rb +++ b/app/controllers/search_controller.rb @@ -1,24 +1,19 @@ -# redMine - project management software -# Copyright (C) 2006 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ class SearchController < ApplicationController before_filter :find_optional_project - helper :messages include MessagesHelper def index @@ -26,7 +21,7 @@ class SearchController < ApplicationController @question.strip! @all_words = params[:all_words] || (params[:submit] ? false : true) @titles_only = !params[:titles_only].nil? - + projects_to_search = case params[:scope] when 'all' @@ -38,16 +33,16 @@ class SearchController < ApplicationController else @project end - + offset = nil begin; offset = params[:offset].to_time if params[:offset]; rescue; end - + # quick jump to an issue if @question.match(/^#?(\d+)$/) && Issue.visible.find_by_id($1.to_i) redirect_to :controller => "issues", :action => "show", :id => $1 return end - + @object_types = Redmine::Search.available_search_types.dup if projects_to_search.is_a? Project # don't search projects @@ -55,23 +50,23 @@ class SearchController < ApplicationController # only show what the user is allowed to view @object_types = @object_types.select {|o| User.current.allowed_to?("view_#{o}".to_sym, projects_to_search)} end - + @scope = @object_types.select {|t| params[t]} @scope = @object_types if @scope.empty? - + # extract tokens from the question # eg. hello "bye bye" => ["hello", "bye bye"] @tokens = @question.scan(%r{((\s|^)"[\s\w]+"(\s|$)|\S+)}).collect {|m| m.first.gsub(%r{(^\s*"\s*|\s*"\s*$)}, '')} # tokens must be at least 2 characters long @tokens = @tokens.uniq.select {|w| w.length > 1 } - + if !@tokens.empty? # no more than 5 tokens to search for - @tokens.slice! 5..-1 if @tokens.size > 5 - + @tokens.slice! 5..-1 if @tokens.size > 5 + @results = [] @results_by_type = Hash.new {|h,k| h[k] = 0} - + limit = 10 @scope.each do |s| r, c = s.singularize.camelcase.constantize.search(@tokens, projects_to_search, @@ -87,13 +82,13 @@ class SearchController < ApplicationController if params[:previous].nil? @pagination_previous_date = @results[0].event_datetime if offset && @results[0] if @results.size > limit - @pagination_next_date = @results[limit-1].event_datetime + @pagination_next_date = @results[limit-1].event_datetime @results = @results[0, limit] end else @pagination_next_date = @results[-1].event_datetime if offset && @results[-1] if @results.size > limit - @pagination_previous_date = @results[-(limit)].event_datetime + @pagination_previous_date = @results[-(limit)].event_datetime @results = @results[-(limit), limit] end end @@ -103,7 +98,7 @@ class SearchController < ApplicationController render :layout => false if request.xhr? end -private +private def find_optional_project return true unless params[:id] @project = Project.find(params[:id]) diff --git a/app/controllers/settings_controller.rb b/app/controllers/settings_controller.rb index a4dcadf2..94502279 100644 --- a/app/controllers/settings_controller.rb +++ b/app/controllers/settings_controller.rb @@ -1,23 +1,19 @@ -# redMine - project management software -# Copyright (C) 2006-2007 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# See doc/COPYRIGHT.rdoc for more details. +#++ class SettingsController < ApplicationController layout 'admin' - + before_filter :require_admin def index @@ -43,7 +39,7 @@ class SettingsController < ApplicationController @guessed_host_and_path = request.host_with_port.dup @guessed_host_and_path << ('/'+ Redmine::Utils.relative_url_root.gsub(%r{^\/}, '')) unless Redmine::Utils.relative_url_root.blank? - + Redmine::Themes.rescan end end diff --git a/app/controllers/sys_controller.rb b/app/controllers/sys_controller.rb index be88eb23..697d9147 100644 --- a/app/controllers/sys_controller.rb +++ b/app/controllers/sys_controller.rb @@ -1,28 +1,24 @@ -# Redmine - project management software -# Copyright (C) 2006-2009 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ class SysController < ActionController::Base before_filter :check_enabled - + def projects p = Project.active.has_module(:repository).find(:all, :include => :repository, :order => 'identifier') render :xml => p.to_xml(:include => :repository) end - + def create_project_repository project = Project.find(params[:id]) if project.repository @@ -37,7 +33,7 @@ class SysController < ActionController::Base end end end - + def fetch_changesets projects = [] if params[:id] diff --git a/app/controllers/time_entry_reports_controller.rb b/app/controllers/time_entry_reports_controller.rb index dd02ff8f..ab8211b9 100644 --- a/app/controllers/time_entry_reports_controller.rb +++ b/app/controllers/time_entry_reports_controller.rb @@ -1,14 +1,23 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class TimeEntryReportsController < ApplicationController menu_item :issues before_filter :find_optional_project before_filter :load_available_criterias - helper :sort include SortHelper - helper :issues - helper :timelog include TimelogHelper - helper :custom_fields include CustomFieldsHelper def report @@ -16,16 +25,16 @@ class TimeEntryReportsController < ApplicationController @criterias = @criterias.select{|criteria| @available_criterias.has_key? criteria} @criterias.uniq! @criterias = @criterias[0,3] - + @columns = (params[:columns] && %w(year month week day).include?(params[:columns])) ? params[:columns] : 'month' - + retrieve_date_range - + unless @criterias.empty? sql_select = @criterias.collect{|criteria| @available_criterias[criteria][:sql] + " AS " + criteria}.join(', ') sql_group_by = @criterias.collect{|criteria| @available_criterias[criteria][:sql]}.join(', ') sql_condition = '' - + if @project.nil? sql_condition = Project.allowed_to_condition(User.current, :view_time_entries) elsif @issue.nil? @@ -41,9 +50,9 @@ class TimeEntryReportsController < ApplicationController sql << " (%s) AND" % sql_condition sql << " (spent_on BETWEEN '%s' AND '%s')" % [ActiveRecord::Base.connection.quoted_date(@from), ActiveRecord::Base.connection.quoted_date(@to)] sql << " GROUP BY #{sql_group_by}, tyear, tmonth, tweek, spent_on" - + @hours = ActiveRecord::Base.connection.select_all(sql) - + @hours.each do |row| case @columns when 'year' @@ -56,9 +65,9 @@ class TimeEntryReportsController < ApplicationController row['day'] = "#{row['spent_on']}" end end - + @total_hours = @hours.inject(0) {|s,k| s = s + k['hours'].to_f} - + @periods = [] # Date#at_beginning_of_ not supported in Rails 1.2.x date_from = @from.to_time @@ -80,13 +89,13 @@ class TimeEntryReportsController < ApplicationController end end end - + respond_to do |format| format.html { render :layout => !request.xhr? } format.csv { send_data(report_to_csv(@criterias, @periods, @hours), :type => 'text/csv; header=present', :filename => 'timelog.csv') } end end - + private # TODO: duplicated in TimelogController @@ -141,7 +150,7 @@ class TimeEntryReportsController < ApplicationController else # default end - + @from, @to = @to, @from if @from && @to && @from > @to @from ||= (TimeEntry.earilest_date_for_project(@project) || Date.today) @to ||= (TimeEntry.latest_date_for_project(@project) || Date.today) @@ -170,7 +179,7 @@ class TimeEntryReportsController < ApplicationController :klass => Issue, :label => :label_issue} } - + # Add list and boolean custom fields as available criterias custom_fields = (@project.nil? ? IssueCustomField.for_all : @project.all_issue_custom_fields) custom_fields.select {|cf| %w(list bool).include? cf.field_format }.each do |cf| @@ -178,7 +187,7 @@ class TimeEntryReportsController < ApplicationController :format => cf.field_format, :label => cf.name} end if @project - + # Add list and boolean time entry custom fields TimeEntryCustomField.find(:all).select {|cf| %w(list bool).include? cf.field_format }.each do |cf| @available_criterias["cf_#{cf.id}"] = {:sql => "(SELECT c.value FROM #{CustomValue.table_name} c WHERE c.custom_field_id = #{cf.id} AND c.customized_type = 'TimeEntry' AND c.customized_id = #{TimeEntry.table_name}.id)", diff --git a/app/controllers/timelog_controller.rb b/app/controllers/timelog_controller.rb index f75d5833..9d174104 100644 --- a/app/controllers/timelog_controller.rb +++ b/app/controllers/timelog_controller.rb @@ -1,19 +1,15 @@ -# Redmine - project management software -# Copyright (C) 2006-2010 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ class TimelogController < ApplicationController menu_item :issues @@ -22,14 +18,11 @@ class TimelogController < ApplicationController before_filter :authorize, :except => [:index] before_filter :find_optional_project, :only => [:index] accept_key_auth :index, :show, :create, :update, :destroy - - helper :sort + include SortHelper - helper :issues include TimelogHelper - helper :custom_fields include CustomFieldsHelper - + def index sort_init 'spent_on', 'desc' sort_update 'spent_on' => 'spent_on', @@ -38,65 +31,61 @@ class TimelogController < ApplicationController 'project' => "#{Project.table_name}.name", 'issue' => 'issue_id', 'hours' => 'hours' - + cond = ARCondition.new - if @project.nil? - cond << Project.allowed_to_condition(User.current, :view_time_entries) - elsif @issue.nil? - cond << @project.project_condition(Setting.display_subprojects_issues?) - else + if @issue cond << "#{Issue.table_name}.root_id = #{@issue.root_id} AND #{Issue.table_name}.lft >= #{@issue.lft} AND #{Issue.table_name}.rgt <= #{@issue.rgt}" + elsif @project + cond << @project.project_condition(Setting.display_subprojects_issues?) end - + retrieve_date_range cond << ['spent_on BETWEEN ? AND ?', @from, @to] - TimeEntry.visible_by(User.current) do - respond_to do |format| - format.html { - # Paginate results - @entry_count = TimeEntry.count(:include => [:project, :issue], :conditions => cond.conditions) - @entry_pages = Paginator.new self, @entry_count, per_page_option, params['page'] - @entries = TimeEntry.find(:all, - :include => [:project, :activity, :user, {:issue => :tracker}], - :conditions => cond.conditions, - :order => sort_clause, - :limit => @entry_pages.items_per_page, - :offset => @entry_pages.current.offset) - @total_hours = TimeEntry.sum(:hours, :include => [:project, :issue], :conditions => cond.conditions).to_f + respond_to do |format| + format.html { + # Paginate results + @entry_count = TimeEntry.visible.count(:include => [:project, :issue], :conditions => cond.conditions) + @entry_pages = Paginator.new self, @entry_count, per_page_option, params['page'] + @entries = TimeEntry.visible.find(:all, + :include => [:project, :activity, :user, {:issue => :tracker}], + :conditions => cond.conditions, + :order => sort_clause, + :limit => @entry_pages.items_per_page, + :offset => @entry_pages.current.offset) + @total_hours = TimeEntry.visible.sum(:hours, :include => [:project, :issue], :conditions => cond.conditions).to_f - render :layout => !request.xhr? - } - format.api { - @entry_count = TimeEntry.count(:include => [:project, :issue], :conditions => cond.conditions) - @entry_pages = Paginator.new self, @entry_count, per_page_option, params['page'] - @entries = TimeEntry.find(:all, - :include => [:project, :activity, :user, {:issue => :tracker}], - :conditions => cond.conditions, - :order => sort_clause, - :limit => @entry_pages.items_per_page, - :offset => @entry_pages.current.offset) - } - format.atom { - entries = TimeEntry.find(:all, - :include => [:project, :activity, :user, {:issue => :tracker}], - :conditions => cond.conditions, - :order => "#{TimeEntry.table_name}.created_on DESC", - :limit => Setting.feeds_limit.to_i) - render_feed(entries, :title => l(:label_spent_time)) - } - format.csv { - # Export all entries - @entries = TimeEntry.find(:all, - :include => [:project, :activity, :user, {:issue => [:tracker, :assigned_to, :priority]}], - :conditions => cond.conditions, - :order => sort_clause) - send_data(entries_to_csv(@entries), :type => 'text/csv; header=present', :filename => 'timelog.csv') - } - end + render :layout => !request.xhr? + } + format.api { + @entry_count = TimeEntry.visible.count(:include => [:project, :issue], :conditions => cond.conditions) + @entry_pages = Paginator.new self, @entry_count, per_page_option, params['page'] + @entries = TimeEntry.visible.find(:all, + :include => [:project, :activity, :user, {:issue => :tracker}], + :conditions => cond.conditions, + :order => sort_clause, + :limit => @entry_pages.items_per_page, + :offset => @entry_pages.current.offset) + } + format.atom { + entries = TimeEntry.visible.find(:all, + :include => [:project, :activity, :user, {:issue => :tracker}], + :conditions => cond.conditions, + :order => "#{TimeEntry.table_name}.created_on DESC", + :limit => Setting.feeds_limit.to_i) + render_feed(entries, :title => l(:label_spent_time)) + } + format.csv { + # Export all entries + @entries = TimeEntry.visible.find(:all, + :include => [:project, :activity, :user, {:issue => [:tracker, :assigned_to, :priority]}], + :conditions => cond.conditions, + :order => sort_clause) + send_data(entries_to_csv(@entries), :type => 'text/csv; header=present', :filename => 'timelog.csv') + } end end - + def show respond_to do |format| # TODO: Implement html response @@ -108,7 +97,7 @@ class TimelogController < ApplicationController def new @time_entry ||= TimeEntry.new(:project => @project, :issue => @issue, :user => User.current, :spent_on => User.current.today) @time_entry.attributes = params[:time_entry] - + call_hook(:controller_timelog_edit_before_save, { :params => params, :time_entry => @time_entry }) render :action => 'edit' end @@ -117,9 +106,9 @@ class TimelogController < ApplicationController def create @time_entry ||= TimeEntry.new(:project => @project, :issue => @issue, :user => User.current, :spent_on => User.current.today) @time_entry.attributes = params[:time_entry] - + call_hook(:controller_timelog_edit_before_save, { :params => params, :time_entry => @time_entry }) - + if @time_entry.save respond_to do |format| format.html { @@ -133,21 +122,21 @@ class TimelogController < ApplicationController format.html { render :action => 'edit' } format.api { render_validation_errors(@time_entry) } end - end + end end - + def edit @time_entry.attributes = params[:time_entry] - + call_hook(:controller_timelog_edit_before_save, { :params => params, :time_entry => @time_entry }) end verify :method => :put, :only => :update, :render => {:nothing => true, :status => :method_not_allowed } def update @time_entry.attributes = params[:time_entry] - + call_hook(:controller_timelog_edit_before_save, { :params => params, :time_entry => @time_entry }) - + if @time_entry.save respond_to do |format| format.html { @@ -161,7 +150,7 @@ class TimelogController < ApplicationController format.html { render :action => 'edit' } format.api { render_validation_errors(@time_entry) } end - end + end end verify :method => :delete, :only => :destroy, :render => {:nothing => true, :status => :method_not_allowed } @@ -212,7 +201,7 @@ private rescue ActiveRecord::RecordNotFound render_404 end - + def find_optional_project if !params[:issue_id].blank? @issue = Issue.find(params[:issue_id]) @@ -222,7 +211,7 @@ private end deny_access unless User.current.allowed_to?(:view_time_entries, @project, :global => true) end - + # Retrieves the date range based on predefined ranges or specific from/to param dates def retrieve_date_range @free_period = false @@ -263,7 +252,7 @@ private else # default end - + @from, @to = @to, @from if @from && @to && @from > @to @from ||= (TimeEntry.earilest_date_for_project(@project) || Date.today) @to ||= (TimeEntry.latest_date_for_project(@project) || Date.today) diff --git a/app/controllers/trackers_controller.rb b/app/controllers/trackers_controller.rb index efd9de94..8f3fea10 100644 --- a/app/controllers/trackers_controller.rb +++ b/app/controllers/trackers_controller.rb @@ -1,23 +1,19 @@ -# Redmine - project management software -# Copyright (C) 2006-2009 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ class TrackersController < ApplicationController layout 'admin' - + before_filter :require_admin verify :method => :post, :only => :destroy, :redirect_to => { :action => :index } @@ -51,7 +47,7 @@ class TrackersController < ApplicationController end @projects = Project.find(:all) end - + def destroy @tracker = Tracker.find(params[:id]) unless @tracker.issues.empty? @@ -60,5 +56,5 @@ class TrackersController < ApplicationController @tracker.destroy end redirect_to :action => 'index' - end + end end diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index c7dadf04..6060e129 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -1,43 +1,40 @@ -# Redmine - project management software -# Copyright (C) 2006-2010 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ class UsersController < ApplicationController layout 'admin' - + before_filter :require_admin, :except => :show before_filter :find_user, :only => [:show, :edit, :update, :edit_membership, :destroy_membership] accept_key_auth :index, :show, :create, :update - helper :sort include SortHelper - helper :custom_fields - include CustomFieldsHelper + include CustomFieldsHelper def index sort_init 'login', 'asc' sort_update %w(login firstname lastname mail admin created_on last_login_on) - + case params[:format] when 'xml', 'json' @offset, @limit = api_offset_and_limit else @limit = per_page_option end - + + scope = User + scope = scope.in_group(params[:group_id].to_i) if params[:group_id].present? + @status = params[:status] ? params[:status].to_i : 1 c = ARCondition.new(@status == 0 ? "status <> 0" : ["status = ?", @status]) @@ -45,36 +42,39 @@ class UsersController < ApplicationController name = "%#{params[:name].strip.downcase}%" c << ["LOWER(login) LIKE ? OR LOWER(firstname) LIKE ? OR LOWER(lastname) LIKE ? OR LOWER(mail) LIKE ?", name, name, name, name] end - - @user_count = User.count(:conditions => c.conditions) + + @user_count = scope.count(:conditions => c.conditions) @user_pages = Paginator.new self, @user_count, @limit, params['page'] @offset ||= @user_pages.current.offset - @users = User.find :all, + @users = scope.find :all, :order => sort_clause, :conditions => c.conditions, :limit => @limit, :offset => @offset - respond_to do |format| - format.html { render :layout => !request.xhr? } + respond_to do |format| + format.html { + @groups = Group.all.sort + render :layout => !request.xhr? + } format.api - end + end end - + def show # show projects based on current user visibility @memberships = @user.memberships.all(:conditions => Project.visible_by(User.current)) - + events = Redmine::Activity::Fetcher.new(User.current, :author => @user).events(nil, nil, :limit => 10) @events_by_day = events.group_by(&:event_date) - + unless User.current.admin? if !@user.active? || (@user != User.current && @memberships.empty? && events.empty?) render_404 return end end - + respond_to do |format| format.html { render :layout => 'base' } format.api @@ -85,7 +85,7 @@ class UsersController < ApplicationController @user = User.new(:language => Setting.default_language, :mail_notification => Setting.default_notification_option) @auth_sources = AuthSource.find(:all) end - + verify :method => :post, :only => :create, :render => {:nothing => true, :status => :method_not_allowed } def create @user = User.new(:language => Setting.default_language, :mail_notification => Setting.default_notification_option) @@ -103,12 +103,12 @@ class UsersController < ApplicationController @user.notified_project_ids = (@user.mail_notification == 'selected' ? params[:notified_project_ids] : []) Mailer.deliver_account_information(@user, params[:user][:password]) if params[:send_information] - + respond_to do |format| format.html { flash[:notice] = l(:notice_successful_create) - redirect_to(params[:continue] ? - {:controller => 'users', :action => 'new'} : + redirect_to(params[:continue] ? + {:controller => 'users', :action => 'new'} : {:controller => 'users', :action => 'edit', :id => @user} ) } @@ -130,7 +130,7 @@ class UsersController < ApplicationController @auth_sources = AuthSource.find(:all) @membership ||= Member.new end - + verify :method => :put, :only => :update, :render => {:nothing => true, :status => :method_not_allowed } def update @user.admin = params[:user][:admin] if params[:user][:admin] @@ -154,7 +154,7 @@ class UsersController < ApplicationController elsif @user.active? && params[:send_information] && !params[:user][:password].blank? && @user.change_password_allowed? Mailer.deliver_account_information(@user, params[:user][:password]) end - + respond_to do |format| format.html { flash[:notice] = l(:notice_successful_update) @@ -198,7 +198,7 @@ class UsersController < ApplicationController end end end - + def destroy_membership @membership = Member.find(params[:membership_id]) if request.post? && @membership.deletable? @@ -209,9 +209,9 @@ class UsersController < ApplicationController format.js { render(:update) {|page| page.replace_html "tab-content-memberships", :partial => 'users/memberships'} } end end - + private - + def find_user if params[:id] == 'current' require_login || return diff --git a/app/controllers/versions_controller.rb b/app/controllers/versions_controller.rb index 03af71b9..b8c68c30 100644 --- a/app/controllers/versions_controller.rb +++ b/app/controllers/versions_controller.rb @@ -1,19 +1,15 @@ -# redMine - project management software -# Copyright (C) 2006 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ class VersionsController < ApplicationController menu_item :roadmap @@ -23,20 +19,18 @@ class VersionsController < ApplicationController before_filter :find_project, :only => [:index, :new, :create, :close_completed] before_filter :authorize - helper :custom_fields - helper :projects def index @trackers = @project.trackers.find(:all, :order => 'position') retrieve_selected_tracker_ids(@trackers, @trackers.select {|t| t.is_in_roadmap?}) @with_subprojects = params[:with_subprojects].nil? ? Setting.display_subprojects_issues? : (params[:with_subprojects] == '1') project_ids = @with_subprojects ? @project.self_and_descendants.collect(&:id) : [@project.id] - + @versions = @project.shared_versions || [] @versions += @project.rolled_up_versions.visible if @with_subprojects @versions = @versions.uniq.sort @versions.reject! {|version| version.closed? || version.completed? } unless params[:completed] - + @issues_by_version = {} unless @selected_tracker_ids.empty? @versions.each do |version| @@ -49,13 +43,13 @@ class VersionsController < ApplicationController end @versions.reject! {|version| !project_ids.include?(version.project_id) && @issues_by_version[version].blank?} end - + def show @issues = @version.fixed_issues.visible.find(:all, :include => [:status, :tracker, :priority], :order => "#{Tracker.table_name}.position, #{Issue.table_name}.id") end - + def new @version = @project.versions.build if params[:version] @@ -101,7 +95,7 @@ class VersionsController < ApplicationController def edit end - + def update if request.put? && params[:version] attributes = params[:version].dup @@ -116,7 +110,7 @@ class VersionsController < ApplicationController end end end - + def close_completed if request.put? @project.close_completed_versions @@ -133,7 +127,7 @@ class VersionsController < ApplicationController redirect_to :controller => 'projects', :action => 'settings', :tab => 'versions', :id => @project end end - + def status_by respond_to do |format| format.html { render :action => 'show' } diff --git a/app/controllers/watchers_controller.rb b/app/controllers/watchers_controller.rb index 11699c35..6266a773 100644 --- a/app/controllers/watchers_controller.rb +++ b/app/controllers/watchers_controller.rb @@ -1,29 +1,25 @@ -# redMine - project management software -# Copyright (C) 2006-2007 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ class WatchersController < ApplicationController before_filter :find_project before_filter :require_login, :check_project_privacy, :only => [:watch, :unwatch] before_filter :authorize, :only => [:new, :destroy] - + verify :method => :post, :only => [ :watch, :unwatch ], :render => { :nothing => true, :status => :method_not_allowed } - + def watch if @watched.respond_to?(:visible?) && !@watched.visible?(User.current) render_403 @@ -31,11 +27,11 @@ class WatchersController < ApplicationController set_watcher(User.current, true) end end - + def unwatch set_watcher(User.current, false) end - + def new @watcher = Watcher.new(params[:watcher]) @watcher.watchable = @watched @@ -51,7 +47,7 @@ class WatchersController < ApplicationController rescue ::ActionController::RedirectBackError render :text => 'Watcher added.', :layout => true end - + def destroy @watched.set_watcher(User.find(params[:user_id]), false) if request.post? respond_to do |format| @@ -63,7 +59,7 @@ class WatchersController < ApplicationController end end end - + private def find_project klass = Object.const_get(params[:object_type].camelcase) @@ -73,31 +69,25 @@ private rescue render_404 end - + def set_watcher(user, watching) @watched.set_watcher(user, watching) - if params[:replace].present? - if params[:replace].is_a? Array - replace_ids = params[:replace] - else - replace_ids = [params[:replace]] - end - else - replace_ids = ['watcher'] - end + respond_to do |format| format.html { redirect_to :back } format.js do - render(:update) do |page| - replace_ids.each do |replace_id| - case replace_id - when 'watchers' - page.replace_html 'watchers', :partial => 'watchers/watchers', :locals => {:watched => @watched} - else - page.replace_html replace_id, watcher_link(@watched, user, :replace => replace_ids) - end + if params[:replace].present? + if params[:replace].is_a? Array + @replace_selectors = params[:replace] + else + @replace_selectors = params[:replace].split(',').map(&:strip) end + else + @replace_selectors = ['#watcher'] end + @user = user + + render :action => 'replace_selectors' end end rescue ::ActionController::RedirectBackError diff --git a/app/controllers/welcome_controller.rb b/app/controllers/welcome_controller.rb index f2daf744..750992cc 100644 --- a/app/controllers/welcome_controller.rb +++ b/app/controllers/welcome_controller.rb @@ -1,19 +1,15 @@ -# redMine - project management software -# Copyright (C) 2006 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ class WelcomeController < ApplicationController caches_action :robots @@ -22,7 +18,7 @@ class WelcomeController < ApplicationController @news = News.latest User.current @projects = Project.latest User.current end - + def robots @projects = Project.all_public.active render :layout => false, :content_type => 'text/plain' diff --git a/app/controllers/wiki_controller.rb b/app/controllers/wiki_controller.rb index e7e38930..15717277 100644 --- a/app/controllers/wiki_controller.rb +++ b/app/controllers/wiki_controller.rb @@ -1,19 +1,15 @@ -# redMine - project management software -# Copyright (C) 2006-2007 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ require 'diff' @@ -35,16 +31,21 @@ class WikiController < ApplicationController default_search_scope :wiki_pages before_filter :find_wiki, :authorize before_filter :find_existing_page, :only => [:rename, :protect, :history, :diff, :annotate, :add_attachment, :destroy] - + verify :method => :post, :only => [:protect], :redirect_to => { :action => :show } - helper :attachments - include AttachmentsHelper - helper :watchers + include AttachmentsHelper # List of pages, sorted alphabetically and by parent (hierarchy) def index - load_pages_grouped_by_date_without_content + load_pages_for_index + @pages_by_parent_id = @pages.group_by(&:parent_id) + end + + # List of page, by last update + def date_index + load_pages_for_index + @pages_by_date = @pages.group_by {|p| p.updated_on.to_date} end # display a page (in editing mode if it doesn't exist) @@ -77,34 +78,30 @@ class WikiController < ApplicationController end end @editable = editable? - render :action => 'show' end - + # edit an existing page or a new one def edit - @page = @wiki.find_or_new_page(params[:id]) + @page = @wiki.find_or_new_page(params[:id]) return render_403 unless editable? @page.content = WikiContent.new(:page => @page) if @page.new_record? - + @content = @page.content_for_version(params[:version]) @content.text = initial_page_content(@page) if @content.text.blank? # don't keep previous comment @content.comments = nil # To prevent StaleObjectError exception when reverting to a previous version - @content.version = @page.content.version - rescue ActiveRecord::StaleObjectError - # Optimistic locking exception - flash[:error] = l(:notice_locking_conflict) + @content.lock_version = @page.content.lock_version end verify :method => :put, :only => :update, :render => {:nothing => true, :status => :method_not_allowed } # Creates a new page or updates an existing one def update - @page = @wiki.find_or_new_page(params[:id]) + @page = @wiki.find_or_new_page(params[:id]) return render_403 unless editable? @page.content = WikiContent.new(:page => @page) if @page.new_record? - + @content = @page.content_for_version(params[:version]) @content.text = initial_page_content(@page) if @content.text.blank? # don't keep previous comment @@ -117,6 +114,7 @@ class WikiController < ApplicationController redirect_to :action => 'show', :project_id => @project, :id => @page.title return end + params[:content].delete(:version) # The version count is automatically increased @content.attributes = params[:content] @content.author = User.current # if page is new @page.save will also save content, but not if page isn't a new record @@ -131,7 +129,8 @@ class WikiController < ApplicationController rescue ActiveRecord::StaleObjectError # Optimistic locking exception - flash[:error] = l(:notice_locking_conflict) + flash.now[:error] = l(:notice_locking_conflict) + render :action => 'edit' end # rename a page @@ -145,7 +144,7 @@ class WikiController < ApplicationController redirect_to :action => 'show', :project_id => @project, :id => @page.title end end - + def protect @page.update_attribute :protected, params[:protected] redirect_to :action => 'show', :project_id => @project, :id => @page.title @@ -155,21 +154,21 @@ class WikiController < ApplicationController def history @version_count = @page.content.versions.count @version_pages = Paginator.new self, @version_count, per_page_option, params['p'] - # don't load text - @versions = @page.content.versions.find :all, - :select => "id, author_id, comments, updated_on, version", + # don't load text + @versions = @page.content.versions.find :all, + :select => "id, user_id, notes, created_at, version", :order => 'version DESC', :limit => @version_pages.items_per_page + 1, :offset => @version_pages.current.offset render :layout => false if request.xhr? end - + def diff @diff = @page.diff(params[:version], params[:version_from]) render_404 unless @diff end - + def annotate @annotate = @page.annotate(params[:version]) render_404 unless @annotate @@ -180,7 +179,7 @@ class WikiController < ApplicationController # Children can be either set as root pages, removed or reassigned to another parent page def destroy return render_403 unless editable? - + @descendants_count = @page.descendants.size if @descendants_count > 0 case params[:todo] @@ -216,10 +215,6 @@ class WikiController < ApplicationController end end - def date_index - load_pages_grouped_by_date_without_content - end - def preview page = @wiki.find_page(params[:id]) # page is nil when previewing a new page @@ -240,7 +235,7 @@ class WikiController < ApplicationController end private - + def find_wiki @project = Project.find(params[:project_id]) @wiki = @project.wiki @@ -248,13 +243,13 @@ private rescue ActiveRecord::RecordNotFound render_404 end - + # Finds the requested page and returns a 404 error if it doesn't exist def find_existing_page @page = @wiki.find_page(params[:id]) render_404 if @page.nil? end - + # Returns true if the current user is allowed to edit the page, otherwise false def editable?(page = @page) page.editable_by?(User.current) @@ -267,13 +262,7 @@ private helper.instance_method(:initial_page_content).bind(self).call(page) end - # eager load information about last updates, without loading text - def load_pages_grouped_by_date_without_content - @pages = @wiki.pages.find :all, :select => "#{WikiPage.table_name}.*, #{WikiContent.table_name}.updated_on", - :joins => "LEFT JOIN #{WikiContent.table_name} ON #{WikiContent.table_name}.page_id = #{WikiPage.table_name}.id", - :order => 'title' - @pages_by_date = @pages.group_by {|p| p.updated_on.to_date} - @pages_by_parent_id = @pages.group_by(&:parent_id) + def load_pages_for_index + @pages = @wiki.pages.with_updated_on.all(:order => 'title', :include => {:wiki => :project}) end - end diff --git a/app/controllers/wikis_controller.rb b/app/controllers/wikis_controller.rb index 2238651c..632984da 100644 --- a/app/controllers/wikis_controller.rb +++ b/app/controllers/wikis_controller.rb @@ -1,24 +1,20 @@ -# redMine - project management software -# Copyright (C) 2006-2007 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ class WikisController < ApplicationController menu_item :settings before_filter :find_project, :authorize - + # Create or update a project's wiki def edit @wiki = @project.wiki || Wiki.new(:project => @project) @@ -32,6 +28,6 @@ class WikisController < ApplicationController if request.post? && params[:confirm] && @project.wiki @project.wiki.destroy redirect_to :controller => 'projects', :action => 'settings', :id => @project, :tab => 'wiki' - end + end end end diff --git a/app/controllers/workflows_controller.rb b/app/controllers/workflows_controller.rb index ed464012..0f9717ff 100644 --- a/app/controllers/workflows_controller.rb +++ b/app/controllers/workflows_controller.rb @@ -1,57 +1,64 @@ -# Redmine - project management software -# Copyright (C) 2006-2008 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ class WorkflowsController < ApplicationController layout 'admin' - + before_filter :require_admin before_filter :find_roles before_filter :find_trackers - + def index @workflow_counts = Workflow.count_by_tracker_and_role end - + def edit @role = Role.find_by_id(params[:role_id]) - @tracker = Tracker.find_by_id(params[:tracker_id]) - + @tracker = Tracker.find_by_id(params[:tracker_id]) + if request.post? Workflow.destroy_all( ["role_id=? and tracker_id=?", @role.id, @tracker.id]) - (params[:issue_status] || []).each { |old, news| - news.each { |new| - @role.workflows.build(:tracker_id => @tracker.id, :old_status_id => old, :new_status_id => new) + (params[:issue_status] || []).each { |status_id, transitions| + transitions.each { |new_status_id, options| + author = options.is_a?(Array) && options.include?('author') && !options.include?('always') + assignee = options.is_a?(Array) && options.include?('assignee') && !options.include?('always') + @role.workflows.build(:tracker_id => @tracker.id, :old_status_id => status_id, :new_status_id => new_status_id, :author => author, :assignee => assignee) } } if @role.save flash[:notice] = l(:notice_successful_update) redirect_to :action => 'edit', :role_id => @role, :tracker_id => @tracker + return end end - + @used_statuses_only = (params[:used_statuses_only] == '0' ? false : true) if @tracker && @used_statuses_only && @tracker.issue_statuses.any? @statuses = @tracker.issue_statuses end @statuses ||= IssueStatus.find(:all, :order => 'position') + + if @tracker && @role && @statuses.any? + workflows = Workflow.all(:conditions => {:role_id => @role.id, :tracker_id => @tracker.id}) + @workflows = {} + @workflows['always'] = workflows.select {|w| !w.author && !w.assignee} + @workflows['author'] = workflows.select {|w| w.author} + @workflows['assignee'] = workflows.select {|w| w.assignee} + end end - + def copy - + if params[:source_tracker_id].blank? || params[:source_tracker_id] == 'any' @source_tracker = nil else @@ -62,10 +69,10 @@ class WorkflowsController < ApplicationController else @source_role = Role.find_by_id(params[:source_role_id].to_i) end - + @target_trackers = params[:target_tracker_ids].blank? ? nil : Tracker.find_all_by_id(params[:target_tracker_ids]) @target_roles = params[:target_role_ids].blank? ? nil : Role.find_all_by_id(params[:target_role_ids]) - + if request.post? if params[:source_tracker_id].blank? || params[:source_role_id].blank? || (@source_tracker.nil? && @source_role.nil?) flash.now[:error] = l(:error_workflow_copy_source) @@ -84,7 +91,7 @@ class WorkflowsController < ApplicationController def find_roles @roles = Role.find(:all, :order => 'builtin, position') end - + def find_trackers @trackers = Tracker.find(:all, :order => 'position') end diff --git a/app/helpers/account_helper.rb b/app/helpers/account_helper.rb index ff18b76a..052322e8 100644 --- a/app/helpers/account_helper.rb +++ b/app/helpers/account_helper.rb @@ -1,19 +1,15 @@ -# redMine - project management software -# Copyright (C) 2006 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ module AccountHelper end diff --git a/app/helpers/admin_helper.rb b/app/helpers/admin_helper.rb index 8f81f66b..1761a10a 100644 --- a/app/helpers/admin_helper.rb +++ b/app/helpers/admin_helper.rb @@ -1,23 +1,19 @@ -# redMine - project management software -# Copyright (C) 2006 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ module AdminHelper def project_status_options_for_select(selected) - options_for_select([[l(:label_all), ''], + options_for_select([[l(:label_all), ''], [l(:status_active), 1]], selected) end end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index fc4ef6ef..57d450c6 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -1,19 +1,15 @@ -# Redmine - project management software -# Copyright (C) 2006-2010 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# See doc/COPYRIGHT.rdoc for more details. +#++ require 'forwardable' require 'cgi' @@ -60,7 +56,7 @@ module ApplicationHelper h(user.to_s) end end - + # Show a sorted linkified (if active) comma-joined list of users def list_users(users, options={}) users.sort.collect{|u| link_to_user(u, options)}.join(", ") @@ -68,7 +64,7 @@ module ApplicationHelper # Displays a link to +issue+ with its subject. # Examples: - # + # # link_to_issue(issue) # => Defect #6: This is the subject # link_to_issue(issue, :truncate => 6) # => Defect #6: This i... # link_to_issue(issue, :subject => false) # => Defect #6 @@ -85,7 +81,7 @@ module ApplicationHelper subject = truncate(subject, :length => options[:truncate]) end end - s = link_to "#{issue.tracker} ##{issue.id}", {:controller => "issues", :action => "show", :id => issue}, + s = link_to "#{issue.tracker} ##{issue.id}", {:controller => "issues", :action => "show", :id => issue}, :class => issue.css_classes, :title => title s << ": #{h subject}" if subject @@ -114,7 +110,7 @@ module ApplicationHelper link_to(text, {:controller => 'repositories', :action => 'revision', :id => project, :rev => rev}, :title => l(:label_revision_id, format_revision(revision))) end - + # Generates a link to a message def link_to_message(message, options={}, html_options = nil) link_to( @@ -131,7 +127,7 @@ module ApplicationHelper # Generates a link to a project if active # Examples: - # + # # link_to_project(project) # => link to the specified project overview # link_to_project(project, :action=>'settings') # => link to project settings # link_to_project(project, {:only_path => false}, :class => "project") # => 3rd arg adds html options @@ -165,15 +161,15 @@ module ApplicationHelper html_options[:onclick] = "promptToRemote('#{text}', '#{param}', '#{url_for(url)}'); return false;" link_to name, {}, html_options end - + def format_activity_title(text) h(truncate_single_line(text, :length => 100)) end - + def format_activity_day(date) date == Date.today ? l(:label_today).titleize : format_date(date) end - + def format_activity_description(text) h(truncate(text.to_s, :length => 120).gsub(%r{[\r\n]*<(pre|code)>.*$}m, '...')).gsub(/[\r\n]+/, "
") end @@ -185,29 +181,29 @@ module ApplicationHelper h("#{version.project} - #{version}") end end - + def due_date_distance_in_words(date) if date l((date < Date.today ? :label_roadmap_overdue : :label_roadmap_due_in), distance_of_date_in_words(Date.today, date)) end end - def render_page_hierarchy(pages, node=nil) + def render_page_hierarchy(pages, node=nil, options={}) content = '' if pages[node] content << "\n" end content end - + # Renders flash messages def render_flash_messages s = '' @@ -216,7 +212,7 @@ module ApplicationHelper end s end - + # Renders tabs and their content def render_tabs(tabs) if tabs.any? @@ -225,11 +221,10 @@ module ApplicationHelper content_tag 'p', l(:label_no_data), :class => "nodata" end end - + # Renders the project quick-jump box def render_project_jump_box - # Retrieve them now to avoid a COUNT query - projects = User.current.projects.all + projects = User.current.memberships.collect(&:project).compact.uniq if projects.any? s = ' - <%= select_tag 'query[column_names][]', + <%= select_tag 'c[]', options_for_select(query.columns.collect {|column| [column.caption, column.name]}), :id => 'selected_columns', :multiple => true, :size => 10, :style => "width:150px" %> diff --git a/app/views/queries/_filters.rhtml b/app/views/queries/_filters.rhtml index 29f916eb..1c67f580 100644 --- a/app/views/queries/_filters.rhtml +++ b/app/views/queries/_filters.rhtml @@ -8,23 +8,27 @@ function add_filter() { check_box.checked = true; toggle_filter(field); select.selectedIndex = 0; - + for (i=0; i id="tr_<%= field %>" class="filter"> - <%= check_box_tag 'fields[]', field, query.has_filter?(field), :onclick => "toggle_filter('#{field}');", :id => "cb_#{field}" %> + <%= check_box_tag 'f[]', field, query.has_filter?(field), :onclick => "toggle_filter('#{field}');", :id => "cb_#{field}" %> - <%= select_tag "operators[#{field}]", options_for_select(operators_for_select(options[:type]), query.operator_for(field)), :id => "operators_#{field}", :onchange => "toggle_operator('#{field}');", :class => "select-small", :style => "vertical-align: top;" %> + <%= select_tag "op[#{field}]", options_for_select(operators_for_select(options[:type]), query.operator_for(field)), :id => "operators_#{field}", :onchange => "toggle_operator('#{field}');", :class => "select-small", :style => "vertical-align: top;" %> - + @@ -114,4 +118,4 @@ Event.observe(document,"dom:loaded", apply_filters_observer); -<%= hidden_field_tag 'fields[]', '' %> +<%= hidden_field_tag 'f[]', '' %> diff --git a/app/views/queries/index.rhtml b/app/views/queries/index.rhtml index 1c608b8a..7f91399f 100644 --- a/app/views/queries/index.rhtml +++ b/app/views/queries/index.rhtml @@ -15,7 +15,7 @@ - <% if query.editable_by?(User.current) %> + <% if query.editable_by?(User.current) %> <%= link_to l(:button_edit), {:controller => 'queries', :action => 'edit', :id => query}, :class => 'icon icon-edit' %> <%= link_to l(:button_delete), {:controller => 'queries', :action => 'destroy', :id => query}, :confirm => l(:text_are_you_sure), :method => :post, :class => 'icon icon-del' %> diff --git a/app/views/reports/_details.rhtml b/app/views/reports/_details.rhtml index c9cd88bb..ac9f2b0c 100644 --- a/app/views/reports/_details.rhtml +++ b/app/views/reports/_details.rhtml @@ -15,36 +15,36 @@ <% for row in rows %> "> - <%= link_to row.name, :controller => 'issues', :action => 'index', :project_id => ((row.is_a?(Project) ? row : @project)), - :set_filter => 1, + <%= link_to row.name, :controller => 'issues', :action => 'index', :project_id => ((row.is_a?(Project) ? row : @project)), + :set_filter => 1, :subproject_id => '!*', "#{field_name}" => row.id %> <% for status in @statuses %> - <%= aggregate_link data, { field_name => row.id, "status_id" => status.id }, - :controller => 'issues', :action => 'index', :project_id => ((row.is_a?(Project) ? row : @project)), - :set_filter => 1, + <%= aggregate_link data, { field_name => row.id, "status_id" => status.id }, + :controller => 'issues', :action => 'index', :project_id => ((row.is_a?(Project) ? row : @project)), + :set_filter => 1, :subproject_id => '!*', - "status_id" => status.id, + "status_id" => status.id, "#{field_name}" => row.id %> <% end %> <%= aggregate_link data, { field_name => row.id, "closed" => 0 }, - :controller => 'issues', :action => 'index', :project_id => ((row.is_a?(Project) ? row : @project)), - :set_filter => 1, + :controller => 'issues', :action => 'index', :project_id => ((row.is_a?(Project) ? row : @project)), + :set_filter => 1, :subproject_id => '!*', "#{field_name}" => row.id, "status_id" => "o" %> <%= aggregate_link data, { field_name => row.id, "closed" => 1 }, - :controller => 'issues', :action => 'index', :project_id => ((row.is_a?(Project) ? row : @project)), - :set_filter => 1, + :controller => 'issues', :action => 'index', :project_id => ((row.is_a?(Project) ? row : @project)), + :set_filter => 1, :subproject_id => '!*', "#{field_name}" => row.id, "status_id" => "c" %> <%= aggregate_link data, { field_name => row.id }, - :controller => 'issues', :action => 'index', :project_id => ((row.is_a?(Project) ? row : @project)), - :set_filter => 1, + :controller => 'issues', :action => 'index', :project_id => ((row.is_a?(Project) ? row : @project)), + :set_filter => 1, :subproject_id => '!*', "#{field_name}" => row.id, - "status_id" => "*" %> + "status_id" => "*" %> <% end %> diff --git a/app/views/reports/_simple.rhtml b/app/views/reports/_simple.rhtml index e82f376a..0b097879 100644 --- a/app/views/reports/_simple.rhtml +++ b/app/views/reports/_simple.rhtml @@ -11,28 +11,28 @@ <% for row in rows %> "> - <%= link_to row.name, :controller => 'issues', :action => 'index', :project_id => ((row.is_a?(Project) ? row : @project)), - :set_filter => 1, + <%= link_to row.name, :controller => 'issues', :action => 'index', :project_id => ((row.is_a?(Project) ? row : @project)), + :set_filter => 1, :subproject_id => '!*', "#{field_name}" => row.id %> <%= aggregate_link data, { field_name => row.id, "closed" => 0 }, - :controller => 'issues', :action => 'index', :project_id => ((row.is_a?(Project) ? row : @project)), - :set_filter => 1, + :controller => 'issues', :action => 'index', :project_id => ((row.is_a?(Project) ? row : @project)), + :set_filter => 1, :subproject_id => '!*', "#{field_name}" => row.id, "status_id" => "o" %> <%= aggregate_link data, { field_name => row.id, "closed" => 1 }, - :controller => 'issues', :action => 'index', :project_id => ((row.is_a?(Project) ? row : @project)), - :set_filter => 1, + :controller => 'issues', :action => 'index', :project_id => ((row.is_a?(Project) ? row : @project)), + :set_filter => 1, :subproject_id => '!*', "#{field_name}" => row.id, "status_id" => "c" %> <%= aggregate_link data, { field_name => row.id }, - :controller => 'issues', :action => 'index', :project_id => ((row.is_a?(Project) ? row : @project)), - :set_filter => 1, + :controller => 'issues', :action => 'index', :project_id => ((row.is_a?(Project) ? row : @project)), + :set_filter => 1, :subproject_id => '!*', "#{field_name}" => row.id, - "status_id" => "*" %> + "status_id" => "*" %> <% end %> diff --git a/app/views/repositories/_breadcrumbs.rhtml b/app/views/repositories/_breadcrumbs.rhtml index 1dd2445c..0d548176 100644 --- a/app/views/repositories/_breadcrumbs.rhtml +++ b/app/views/repositories/_breadcrumbs.rhtml @@ -1,5 +1,5 @@ <%= link_to 'root', :action => 'show', :id => @project, :path => '', :rev => @rev %> -<% +<% dirs = path.split('/') if 'file' == kind filename = dirs.pop @@ -8,14 +8,21 @@ link_path = '' dirs.each do |dir| next if dir.blank? link_path << '/' unless link_path.empty? - link_path << "#{dir}" + link_path << "#{dir}" %> - / <%= link_to h(dir), :action => 'show', :id => @project, :path => to_path_param(link_path), :rev => @rev %> + / <%= link_to h(dir), :action => 'show', :id => @project, + :path => to_path_param(link_path), :rev => @rev %> <% end %> <% if filename %> - / <%= link_to h(filename), :action => 'changes', :id => @project, :path => to_path_param("#{link_path}/#{filename}"), :rev => @rev %> + / <%= link_to h(filename), + :action => 'changes', :id => @project, + :path => to_path_param("#{link_path}/#{filename}"), :rev => @rev %> <% end %> - -<%= "@ #{h format_revision(@changeset)}" if @changeset %> +<% + # @rev is revsion or Git and Mercurial branch or tag. + # For Mercurial *tip*, @rev and @changeset are nil. + rev_text = @changeset.nil? ? @rev : format_revision(@changeset) +%> +<%= "@ #{h rev_text}" unless rev_text.blank? %> <% html_title(with_leading_slash(path)) -%> diff --git a/app/views/repositories/_dir_list_content.rhtml b/app/views/repositories/_dir_list_content.rhtml index 66574f1c..fd9dd7af 100644 --- a/app/views/repositories/_dir_list_content.rhtml +++ b/app/views/repositories/_dir_list_content.rhtml @@ -1,25 +1,27 @@ <% @entries.each do |entry| %> <% tr_id = Digest::MD5.hexdigest(entry.path) depth = params[:depth].to_i %> +<% ent_path = replace_invalid_utf8(entry.path) %> +<% ent_name = replace_invalid_utf8(entry.name) %> <% if entry.is_dir? %> - "scmEntryClick('#{tr_id}')"%>">  <% end %> -<%= link_to h(entry.name), - {:action => (entry.is_dir? ? 'show' : 'changes'), :id => @project, :path => to_path_param(entry.path), :rev => @rev}, - :class => (entry.is_dir? ? 'icon icon-folder' : "icon icon-file #{Redmine::MimeType.css_class_of(entry.name)}")%> +<%= link_to h(ent_name), + {:action => (entry.is_dir? ? 'show' : 'changes'), :id => @project, :path => to_path_param(ent_path), :rev => @rev}, + :class => (entry.is_dir? ? 'icon icon-folder' : "icon icon-file #{Redmine::MimeType.css_class_of(ent_name)}")%> <%= (entry.size ? number_to_human_size(entry.size) : "?") unless entry.is_dir? %> -<% changeset = @project.repository.changesets.find_by_revision(entry.lastrev.identifier) if entry.lastrev && entry.lastrev.identifier %> +<% changeset = @project.repository.find_changeset_by_name(entry.lastrev.identifier) if entry.lastrev && entry.lastrev.identifier %> <%= link_to_revision(changeset, @project) if changeset %> <%= distance_of_time_in_words(entry.lastrev.time, Time.now) if entry.lastrev && entry.lastrev.time %> -<%= changeset.nil? ? h(entry.lastrev.author.to_s.split('<').first) : changeset.author if entry.lastrev %> +<%= changeset.nil? ? h(replace_invalid_utf8(entry.lastrev.author.to_s.split('<').first)) : changeset.author if entry.lastrev %> <%=h truncate(changeset.comments, :length => 50) unless changeset.nil? %> <% end %> diff --git a/app/views/repositories/_navigation.rhtml b/app/views/repositories/_navigation.rhtml index 5671e294..bb18113b 100644 --- a/app/views/repositories/_navigation.rhtml +++ b/app/views/repositories/_navigation.rhtml @@ -7,15 +7,15 @@ <% form_tag({:action => controller.action_name, :id => @project, :path => to_path_param(@path), :rev => ''}, {:method => :get, :id => 'revision_selector'}) do -%> <% if !@repository.branches.nil? && @repository.branches.length > 0 -%> - | <%= l(:label_branch) %>: + | <%= l(:label_branch) %>: <%= select_tag :branch, options_for_select([''] + @repository.branches,@rev), :id => 'branch' %> <% end -%> <% if !@repository.tags.nil? && @repository.tags.length > 0 -%> - | <%= l(:label_tag) %>: + | <%= l(:label_tag) %>: <%= select_tag :tag, options_for_select([''] + @repository.tags,@rev), :id => 'tag' %> <% end -%> - | <%= l(:label_revision) %>: + | <%= l(:label_revision) %>: <%= text_field_tag 'rev', @rev, :size => 8 %> <% end -%> diff --git a/app/views/repositories/annotate.rhtml b/app/views/repositories/annotate.rhtml index 49850714..4a2244b6 100644 --- a/app/views/repositories/annotate.rhtml +++ b/app/views/repositories/annotate.rhtml @@ -14,7 +14,7 @@ <% line_num = 1 %> - <% syntax_highlight(@path, to_utf8(@annotate.content)).each_line do |line| %> + <% syntax_highlight(@path, to_utf8_for_repositories(@annotate.content)).each_line do |line| %> <% revision = @annotate.revisions[line_num-1] %> diff --git a/app/views/repositories/changes.rhtml b/app/views/repositories/changes.rhtml index 3d4c7a96..734f8b81 100644 --- a/app/views/repositories/changes.rhtml +++ b/app/views/repositories/changes.rhtml @@ -12,7 +12,7 @@ <%= render_properties(@properties) %> -<%= render(:partial => 'revisions', +<%= render(:partial => 'revisions', :locals => {:project => @project, :path => @path, :revisions => @changesets, :entry => @entry }) unless @changesets.empty? %> <% html_title(l(:label_change_plural)) -%> diff --git a/app/views/repositories/show.rhtml b/app/views/repositories/show.rhtml index 35106fe6..fc148e8d 100644 --- a/app/views/repositories/show.rhtml +++ b/app/views/repositories/show.rhtml @@ -12,23 +12,49 @@ <%= render_properties(@properties) %> -<% if @changesets && !@changesets.empty? && authorize_for('repositories', 'revisions') %> +<% if authorize_for('repositories', 'revisions') %> +<% if @changesets && !@changesets.empty? %>

<%= l(:label_latest_revision_plural) %>

-<%= render :partial => 'revisions', :locals => {:project => @project, :path => @path, :revisions => @changesets, :entry => nil }%> +<%= render :partial => 'revisions', + :locals => {:project => @project, :path => @path, + :revisions => @changesets, :entry => nil }%> +<% end %> +

+<% + has_branches = (!@repository.branches.nil? && @repository.branches.length > 0) + sep = '' + %> +<% if @repository.supports_all_revisions? && @path.blank? %> +<%= link_to l(:label_view_all_revisions), :action => 'revisions', :id => @project %> +<% sep = '|' %> +<% end %> +<% + if @repository.supports_directory_revisions? && + ( has_branches || !@path.blank? || !@rev.blank? ) + %> +<%= sep %> +<%= + link_to l(:label_view_revisions), + :action => 'changes', + :path => to_path_param(@path), + :id => @project, + :rev => @rev + %> +<% end %> +

-<% if @path.blank? %> -

<%= link_to l(:label_view_all_revisions), :action => 'revisions', :id => @project %>

-<% else %> -

<%= link_to l(:label_view_revisions), :action => 'changes', :path => to_path_param(@path), :id => @project %>

-<% end %> +<% if true # @path.blank? %> +<% content_for :header_tags do %> + <%= auto_discovery_link_tag( + :atom, params.merge( + {:format => 'atom', :action => 'revisions', + :id => @project, :page => nil, :key => User.current.rss_key})) %> +<% end %> -<% content_for :header_tags do %> - <%= auto_discovery_link_tag(:atom, params.merge({:format => 'atom', :action => 'revisions', :id => @project, :page => nil, :key => User.current.rss_key})) %> -<% end %> - -<% other_formats_links do |f| %> - <%= f.link_to 'Atom', :url => {:action => 'revisions', :id => @project, :key => User.current.rss_key} %> -<% end %> +<% other_formats_links do |f| %> + <%= f.link_to 'Atom', :url => {:action => 'revisions', :id => @project, :key => User.current.rss_key} %> +<% end %> +<% end %> <% end %> <% content_for :header_tags do %> diff --git a/app/views/roles/_form.rhtml b/app/views/roles/_form.rhtml index a167907e..ddade433 100644 --- a/app/views/roles/_form.rhtml +++ b/app/views/roles/_form.rhtml @@ -1,4 +1,4 @@ -<%= error_messages_for 'role' %> +<%= error_messages_for 'role' %> <% unless @role.builtin? %>
diff --git a/app/views/roles/edit.rhtml b/app/views/roles/edit.rhtml index 61fcc633..64350bbf 100644 --- a/app/views/roles/edit.rhtml +++ b/app/views/roles/edit.rhtml @@ -1,4 +1,4 @@ -

<%= link_to l(:label_role_plural), :controller => 'roles', :action => 'index' %> » <%=h @role.name %>

+

<%= link_to l(:label_role_plural), :controller => 'roles', :action => 'index' %> » <%=h @role.name %>

<% labelled_tabular_form_for :role, @role, :url => { :action => 'edit' }, :html => {:id => 'role_form'} do |f| %> <%= render :partial => 'form', :locals => { :f => f } %> diff --git a/app/views/roles/index.html.erb b/app/views/roles/index.html.erb index 41878146..fb5ff5be 100644 --- a/app/views/roles/index.html.erb +++ b/app/views/roles/index.html.erb @@ -21,7 +21,7 @@
diff --git a/app/views/roles/new.rhtml b/app/views/roles/new.rhtml index fb3e96f8..eaa2402f 100644 --- a/app/views/roles/new.rhtml +++ b/app/views/roles/new.rhtml @@ -1,4 +1,4 @@ -

<%= link_to l(:label_role_plural), :controller => 'roles', :action => 'index' %> » <%=l(:label_role_new)%>

+

<%= link_to l(:label_role_plural), :controller => 'roles', :action => 'index' %> » <%=l(:label_role_new)%>

<% labelled_tabular_form_for :role, @role, :url => { :action => 'new' }, :html => {:id => 'role_form'} do |f| %> <%= render :partial => 'form', :locals => { :f => f } %> diff --git a/app/views/roles/report.rhtml b/app/views/roles/report.rhtml index e2b01994..77cf41fb 100644 --- a/app/views/roles/report.rhtml +++ b/app/views/roles/report.rhtml @@ -2,6 +2,7 @@ <% form_tag({:action => 'report'}, :id => 'permissions_form') do %> <%= hidden_field_tag 'permissions[0]', '', :id => nil %> +
<%= line_num %> <%= link_to(l(:button_delete), { :action => 'destroy', :id => role }, - :method => :post, + :method => :post, :confirm => l(:text_are_you_sure), :class => 'icon icon-del') unless role.builtin? %>
@@ -21,7 +22,7 @@ <% unless mod.blank? %> @@ -45,6 +46,7 @@ <% end %>
-   +   <%= l_or_humanize(mod, :prefix => 'project_module_') %>
+

<%= check_all_links 'permissions_form' %>

<%= submit_tag l(:button_save) %>

<% end %> diff --git a/app/views/search/index.rhtml b/app/views/search/index.rhtml index 348421d3..674cabf6 100644 --- a/app/views/search/index.rhtml +++ b/app/views/search/index.rhtml @@ -22,11 +22,14 @@
<%= render_results_by_type(@results_by_type) unless @scope.size == 1 %>
- +

<%= l(:label_result_plural) %> (<%= @results_by_type.values.sum %>)

<% @results.each do |e| %> -
<%= content_tag('span', h(e.project), :class => 'project') unless @project == e.project %> <%= link_to highlight_tokens(truncate(e.event_title, :length => 255), @tokens), e.event_url %>
+
+ <%= content_tag('span', h(e.project), :class => 'project') unless @project == e.project %> + <%= link_to highlight_tokens(truncate(e.event_title, :length => 255), @tokens), e.event_url %> +
<%= highlight_tokens(e.event_description, @tokens) %> <%= format_time(e.event_datetime) %>
<% end %> @@ -35,16 +38,12 @@

<% if @pagination_previous_date %> -<%= link_to_remote ('« ' + l(:label_previous)), - {:update => :content, - :url => params.merge(:previous => 1, :offset => @pagination_previous_date.strftime("%Y%m%d%H%M%S")) - }, :href => url_for(params.merge(:previous => 1, :offset => @pagination_previous_date.strftime("%Y%m%d%H%M%S"))) %>  +<%= link_to_content_update('« ' + l(:label_previous), + params.merge(:previous => 1, :offset => @pagination_previous_date.strftime("%Y%m%d%H%M%S"))) %>  <% end %> <% if @pagination_next_date %> -<%= link_to_remote (l(:label_next) + ' »'), - {:update => :content, - :url => params.merge(:previous => nil, :offset => @pagination_next_date.strftime("%Y%m%d%H%M%S")) - }, :href => url_for(params.merge(:previous => nil, :offset => @pagination_next_date.strftime("%Y%m%d%H%M%S"))) %> +<%= link_to_content_update(l(:label_next) + ' »', + params.merge(:previous => nil, :offset => @pagination_next_date.strftime("%Y%m%d%H%M%S"))) %> <% end %>

diff --git a/app/views/settings/_display.rhtml b/app/views/settings/_display.rhtml index c6fe8339..25f65fc5 100644 --- a/app/views/settings/_display.rhtml +++ b/app/views/settings/_display.rhtml @@ -5,7 +5,7 @@

<%= setting_select :default_language, lang_options_for_select(false) %>

-

<%= setting_select :start_of_week, [[day_name(1),'1'], [day_name(7),'7']], :blank => :label_language_based %>

+

<%= setting_select :start_of_week, [[day_name(1),'1'], [day_name(6),'6'], [day_name(7),'7']], :blank => :label_language_based %>

<%= setting_select :date_format, Setting::DATE_FORMATS.collect {|f| [Date.today.strftime(f), f]}, :blank => :label_language_based %>

@@ -15,7 +15,7 @@

<%= setting_check_box :gravatar_enabled %>

-

<%= setting_select :gravatar_default, [["Wavatars", 'wavatar'], ["Identicons", 'identicon'], ["Monster ids", 'monsterid'], ["Retro", "retro"]], :blank => :label_none %>

+

<%= setting_select :gravatar_default, [["Wavatars", 'wavatar'], ["Identicons", 'identicon'], ["Monster ids", 'monsterid'], ["Retro", 'retro'], ["Mystery man", 'mm']], :blank => :label_none %>

<%= submit_tag l(:button_save) %> diff --git a/app/views/settings/_issues.rhtml b/app/views/settings/_issues.rhtml index 273d4b58..8d0f74f4 100644 --- a/app/views/settings/_issues.rhtml +++ b/app/views/settings/_issues.rhtml @@ -13,7 +13,7 @@
<%= l(:setting_issue_list_default_columns) %> -<%= setting_multiselect(:issue_list_default_columns, +<%= setting_multiselect(:issue_list_default_columns, Query.new.available_columns.collect {|c| [c.caption, c.name.to_s]}, :label => false) %>
diff --git a/app/views/settings/_mail_handler.rhtml b/app/views/settings/_mail_handler.rhtml index f3508ace..b5ed14ea 100644 --- a/app/views/settings/_mail_handler.rhtml +++ b/app/views/settings/_mail_handler.rhtml @@ -8,7 +8,7 @@
-

<%= setting_check_box :mail_handler_api_enabled, +

<%= setting_check_box :mail_handler_api_enabled, :onclick => "if (this.checked) { Form.Element.enable('settings_mail_handler_api_key'); } else { Form.Element.disable('settings_mail_handler_api_key'); }"%>

<%= setting_text_field :mail_handler_api_key, :size => 30, diff --git a/app/views/settings/_projects.rhtml b/app/views/settings/_projects.rhtml index c1255bbe..bbe6b13a 100644 --- a/app/views/settings/_projects.rhtml +++ b/app/views/settings/_projects.rhtml @@ -3,13 +3,13 @@

<%= setting_check_box :default_projects_public %>

-

<%= setting_multiselect(:default_projects_modules, +

<%= setting_multiselect(:default_projects_modules, Redmine::AccessControl.available_project_modules.collect {|m| [l_or_humanize(m, :prefix => "project_module_"), m.to_s]}) %>

<%= setting_check_box :sequential_project_identifiers %>

<%= setting_select :new_project_user_role_id, - Role.find_all_givable.collect {|r| [r.name, r.id.to_s]}, + Role.find_all_givable.collect {|r| [r.name, r.id.to_s]}, :blank => "--- #{l(:actionview_instancetag_blank_option)} ---" %>

diff --git a/app/views/settings/_repositories.rhtml b/app/views/settings/_repositories.rhtml index 9f2b26d4..acdb40e5 100644 --- a/app/views/settings/_repositories.rhtml +++ b/app/views/settings/_repositories.rhtml @@ -3,7 +3,7 @@

<%= setting_check_box :autofetch_changesets %>

-

<%= setting_check_box :sys_api_enabled, +

<%= setting_check_box :sys_api_enabled, :onclick => "if (this.checked) { Form.Element.enable('settings_sys_api_key'); } else { Form.Element.disable('settings_sys_api_key'); }" %>

<%= setting_text_field :sys_api_key, :size => 30, @@ -18,8 +18,6 @@

<%= setting_text_field :repositories_encodings, :size => 60 %>
<%= l(:text_comma_separated) %>

-

<%= setting_select :commit_logs_encoding, Setting::ENCODINGS %>

-

<%= setting_text_field :repository_log_display_limit, :size => 6 %>

@@ -35,7 +33,7 @@

<%= setting_check_box :commit_logtime_enabled, :onclick => "if (this.checked) { Form.Element.enable('settings_commit_logtime_activity_id'); } else { Form.Element.disable('settings_commit_logtime_activity_id'); }"%>

-

<%= setting_select :commit_logtime_activity_id, +

<%= setting_select :commit_logtime_activity_id, [[l(:label_default), 0]] + TimeEntryActivity.shared.all.collect{|activity| [activity.name, activity.id.to_s]}, :disabled => !Setting.commit_logtime_enabled?%>

diff --git a/app/views/time_entry_reports/report.rhtml b/app/views/time_entry_reports/report.rhtml index 5ae9d655..de2d1093 100644 --- a/app/views/time_entry_reports/report.rhtml +++ b/app/views/time_entry_reports/report.rhtml @@ -6,13 +6,10 @@

<%= l(:label_spent_time) %>

-<% form_remote_tag(:url => {}, :html => {:method => :get, :id => 'query_form'}, :method => :get, :update => 'content') do %> +<% form_tag({:controller => 'time_entry_reports', :action => 'report', :project_id => @project, :issue_id => @issue}, :method => :get, :id => 'query_form') do %> <% @criterias.each do |criteria| %> <%= hidden_field_tag 'criterias[]', criteria, :id => nil %> <% end %> - <%# TODO: get rid of the project_id field, that should already be in the URL %> - <%= hidden_field_tag('project_id', params[:project_id]) if @project %> - <%= hidden_field_tag('issue_id', params[:issue_id]) if @issue %> <%= render :partial => 'timelog/date_range' %>

<%= l(:label_details) %>: <%= select_tag 'columns', options_for_select([[l(:label_year), 'year'], @@ -22,14 +19,11 @@ :onchange => "this.form.onsubmit();" %> <%= l(:button_add) %>: <%= select_tag('criterias[]', options_for_select([[]] + (@available_criterias.keys - @criterias).collect{|k| [l_or_humanize(@available_criterias[k][:label]), k]}), - :onchange => "this.form.onsubmit();", + :onchange => "this.form.submit();", :style => 'width: 200px', :id => nil, :disabled => (@criterias.length >= 3)) %> - <%= link_to_remote l(:button_clear), {:url => {:project_id => @project, :period_type => params[:period_type], :period => params[:period], :from => @from, :to => @to, :columns => @columns}, - :method => :get, - :update => 'content' - }, :class => 'icon icon-reload' %>

+ <%= link_to l(:button_clear), {:project_id => @project, :issue_id => @issue, :period_type => params[:period_type], :period => params[:period], :from => @from, :to => @to, :columns => @columns}, :class => 'icon icon-reload' %>

<% end %> <% unless @criterias.empty? %> diff --git a/app/views/timelog/_date_range.rhtml b/app/views/timelog/_date_range.rhtml index 727de25e..e916bc18 100644 --- a/app/views/timelog/_date_range.rhtml +++ b/app/views/timelog/_date_range.rhtml @@ -2,27 +2,24 @@ <%= l(:label_date_range) %>

-<%= radio_button_tag 'period_type', '1', !@free_period %> +<%= radio_button_tag 'period_type', '1', !@free_period, :onclick => 'Form.Element.disable("from");Form.Element.disable("to");Form.Element.enable("period");' %> <%= select_tag 'period', options_for_period_select(params[:period]), - :onchange => 'this.form.onsubmit();', - :onfocus => '$("period_type_1").checked = true;' %> + :onchange => 'this.form.submit();', + :onfocus => '$("period_type_1").checked = true;', + :disabled => @free_period %>

-<%= radio_button_tag 'period_type', '2', @free_period %> +<%= radio_button_tag 'period_type', '2', @free_period, :onclick => 'Form.Element.enable("from");Form.Element.enable("to");Form.Element.disable("period");' %> -<%= l(:label_date_from_to, :start => (text_field_tag('from', @from, :size => 10) + calendar_for('from')), - :end => (text_field_tag('to', @to, :size => 10) + calendar_for('to'))) %> +<%= l(:label_date_from_to, :start => (text_field_tag('from', @from, :size => 10, :disabled => !@free_period) + calendar_for('from')), + :end => (text_field_tag('to', @to, :size => 10, :disabled => !@free_period) + calendar_for('to'))) %>

- <%= link_to_remote l(:button_apply), - { :url => { }, - :update => "content", - :with => "Form.serialize('query_form')", - :method => :get - }, :class => 'icon icon-checked' %> + <%= link_to_function l(:button_apply), '$("query_form").submit()', :class => 'icon icon-checked' %> + <%= link_to l(:button_clear), {:controller => controller_name, :action => action_name, :project_id => @project, :issue_id => @issue}, :class => 'icon icon-reload' %>

diff --git a/app/views/timelog/index.html.erb b/app/views/timelog/index.html.erb index 737476f3..d943d430 100644 --- a/app/views/timelog/index.html.erb +++ b/app/views/timelog/index.html.erb @@ -6,11 +6,7 @@

<%= l(:label_spent_time) %>

-<% form_remote_tag( :url => {}, :html => {:method => :get, :id => 'query_form'}, :method => :get, :update => 'content' ) do %> -<%# TOOD: remove the project_id and issue_id hidden fields, that information is -already in the URI %> -<%= hidden_field_tag('project_id', params[:project_id]) if @project %> -<%= hidden_field_tag 'issue_id', params[:issue_id] if @issue %> +<% form_tag({:controller => 'timelog', :action => 'index', :project_id => @project, :issue_id => @issue}, :method => :get, :id => 'query_form') do %> <%= render :partial => 'date_range' %> <% end %> diff --git a/app/views/users/_preferences.html.erb b/app/views/users/_preferences.html.erb index 85b5990e..57f050b1 100644 --- a/app/views/users/_preferences.html.erb +++ b/app/views/users/_preferences.html.erb @@ -2,5 +2,6 @@

<%= pref_fields.check_box :hide_mail %>

<%= pref_fields.select :time_zone, ActiveSupport::TimeZone.all.collect {|z| [ z.to_s, z.name ]}, :include_blank => true %>

<%= pref_fields.select :comments_sorting, [[l(:label_chronological_order), 'asc'], [l(:label_reverse_chronological_order), 'desc']] %>

+

<%= pref_fields.check_box :warn_on_leaving_unsaved %>

<% end %> diff --git a/app/views/users/index.rhtml b/app/views/users/index.rhtml index 69ad7374..cf1f9696 100644 --- a/app/views/users/index.rhtml +++ b/app/views/users/index.rhtml @@ -8,15 +8,22 @@
<%= l(:label_filter_plural) %> <%= select_tag 'status', users_status_options_for_select(@status), :class => "small", :onchange => "this.form.submit(); return false;" %> + +<% if @groups.present? %> + +<%= select_tag 'group_id', '' + options_from_collection_for_select(@groups, :id, :name, params[:group_id].to_i), :onchange => "this.form.submit(); return false;" %> +<% end %> + <%= text_field_tag 'name', params[:name], :size => 30 %> <%= submit_tag l(:button_apply), :class => "small", :name => nil %> +<%= link_to l(:button_clear), users_path, :class => 'icon icon-reload' %>
<% end %>  
- +
<%= sort_header_tag('login', :caption => l(:field_login)) %> <%= sort_header_tag('firstname', :caption => l(:field_firstname)) %> diff --git a/app/views/users/show.api.rsb b/app/views/users/show.api.rsb index a2e31acc..26d8a998 100644 --- a/app/views/users/show.api.rsb +++ b/app/views/users/show.api.rsb @@ -6,9 +6,9 @@ api.user do api.mail @user.mail if User.current.admin? || !@user.pref.hide_mail api.created_on @user.created_on api.last_login_on @user.last_login_on - + render_api_custom_values @user.visible_custom_field_values, api - + api.array :memberships do @memberships.each do |membership| api.membership do diff --git a/app/views/users/show.rhtml b/app/views/users/show.rhtml index 52060866..ac93ed02 100644 --- a/app/views/users/show.rhtml +++ b/app/views/users/show.rhtml @@ -5,6 +5,7 @@

<%= avatar @user, :size => "50" %> <%=h @user.name %>

+<%= call_hook :view_account_left_top, :user => @user %>
    <% unless @user.pref.hide_mail %>
  • <%=l(:field_mail)%>: <%= mail_to(h(escape_javascript(@user.mail)), nil, :encode => 'javascript') %>
  • @@ -20,6 +21,8 @@ <% end %>
+<%= call_hook :view_account_left_middle, :user => @user %> + <% unless @memberships.empty? %>

<%=l(:label_project_plural)%>

    diff --git a/app/views/versions/_form.rhtml b/app/views/versions/_form.rhtml index b829cf2f..c151185b 100644 --- a/app/views/versions/_form.rhtml +++ b/app/views/versions/_form.rhtml @@ -5,6 +5,7 @@

    <%= f.text_field :description, :size => 60 %>

    <%= f.select :status, Version::VERSION_STATUSES.collect {|s| [l("version_status_#{s}"), s]} %>

    <%= f.text_field :wiki_page_title, :label => :label_wiki_page, :size => 60, :disabled => @project.wiki.nil? %>

    +

    <%= f.text_field :start_date, :size => 10 %><%= calendar_for('version_start_date') %>

    <%= f.text_field :effective_date, :size => 10 %><%= calendar_for('version_effective_date') %>

    <%= f.select :sharing, @version.allowed_sharings.collect {|v| [format_version_sharing(v), v]} %>

    diff --git a/app/views/versions/_issue_counts.rhtml b/app/views/versions/_issue_counts.rhtml index 38f3edbc..71dc5787 100644 --- a/app/views/versions/_issue_counts.rhtml +++ b/app/views/versions/_issue_counts.rhtml @@ -1,7 +1,7 @@
    -<%= l(:label_issues_by, +<%= l(:label_issues_by, select_tag('status_by', status_by_options_for_select(criteria), :id => 'status_by_select', @@ -15,15 +15,15 @@ <% counts.each do |count| %>
diff --git a/app/views/versions/_overview.rhtml b/app/views/versions/_overview.rhtml index 550cf3e7..4211d79f 100644 --- a/app/views/versions/_overview.rhtml +++ b/app/views/versions/_overview.rhtml @@ -1,7 +1,10 @@ -<% if version.completed? %> -

<%= format_date(version.effective_date) %>

-<% elsif version.effective_date %> -

<%= due_date_distance_in_words(version.effective_date) %> (<%= format_date(version.effective_date) %>)

+

+ <%= l(:field_start_date) %> <%= h(format_date(version.start_date)) %> + <%= l(:field_due_date) %> <%= h(format_date(version.due_date)) %> +

+ +<% if !version.completed? && version.due_date %> +

<%= due_date_distance_in_words(version.effective_date) %>

<% end %>

<%=h version.description %>

diff --git a/app/views/versions/index.html.erb b/app/views/versions/index.html.erb index d0c5dcac..2fded9c6 100644 --- a/app/views/versions/index.html.erb +++ b/app/views/versions/index.html.erb @@ -4,13 +4,13 @@

<%= l(:label_no_data) %>

<% else %>
-<% @versions.each do |version| %> +<% @versions.each do |version| %>

<%= tag 'a', :name => version.name %><%= link_to_version version %>

<%= render :partial => 'versions/overview', :locals => {:version => version} %> <%= render(:partial => "wiki/content", :locals => {:content => version.wiki_page.content}) if version.wiki_page %> <% if (issues = @issues_by_version[version]) && issues.size > 0 %> - <% form_tag({}) do -%> + <% form_tag({}) do -%>
- <%= link_to count[:group], {:controller => 'issues', + <%= link_to count[:group], {:controller => 'issues', :action => 'index', :project_id => version.project, :set_filter => 1, - :fixed_version_id => version, - "#{criteria}_id" => count[:group]} %> + :status_id => '*', + :fixed_version_id => version}.merge("#{criteria}_id".to_sym => count[:group]) %> - <%= progress_bar((count[:closed].to_f / count[:total])*100, + <%= progress_bar((count[:closed].to_f / count[:total])*100, :legend => "#{count[:closed]}/#{count[:total]}", :width => "#{(count[:total].to_f / max * 200).floor}px;") %>
<%- issues.each do |issue| -%> diff --git a/app/views/watchers/_watchers.rhtml b/app/views/watchers/_watchers.rhtml index 8e361ede..4da8c0dd 100644 --- a/app/views/watchers/_watchers.rhtml +++ b/app/views/watchers/_watchers.rhtml @@ -1,5 +1,5 @@
-<%= link_to_remote l(:button_add), +<%= link_to_remote l(:button_add), :url => {:controller => 'watchers', :action => 'new', :object_type => watched.class.name.underscore, @@ -9,7 +9,7 @@

<%= l(:label_issue_watchers) %> (<%= watched.watcher_users.size %>)

<% unless @watcher.nil? %> - <% remote_form_for(:watcher, @watcher, + <% remote_form_for(:watcher, @watcher, :url => {:controller => 'watchers', :action => 'new', :object_type => watched.class.name.underscore, diff --git a/app/views/watchers/replace_selectors.rjs b/app/views/watchers/replace_selectors.rjs new file mode 100644 index 00000000..ae3b7ccd --- /dev/null +++ b/app/views/watchers/replace_selectors.rjs @@ -0,0 +1,22 @@ +@replace_selectors.each do |selector| + next if selector.blank? + + case selector + when '#watchers' + page.replace_html 'watchers', :partial => 'watchers/watchers', :locals => {:watched => @watched} + else + page.select(selector).each do |node| + options = {:replace => @replace_selectors} + + last_selector = selector.split(' ').last + if last_selector.starts_with? '.' + options[:class] = last_selector[1..-1] + elsif last_selector.starts_with? '#' + options[:id] = last_selector[1..-1] + end + + node.replace watcher_link(@watched, @user, options) + end + end +end + diff --git a/app/views/welcome/index.rhtml b/app/views/welcome/index.rhtml index 2cc0bbdf..7de009cd 100644 --- a/app/views/welcome/index.rhtml +++ b/app/views/welcome/index.rhtml @@ -29,7 +29,7 @@
<% end %> <%= call_hook(:view_welcome_index_right, :projects => @projects) %> - + <% content_for :header_tags do %> <%= auto_discovery_link_tag(:atom, {:controller => 'news', :action => 'index', :key => User.current.rss_key, :format => 'atom'}, diff --git a/app/views/wiki/date_index.html.erb b/app/views/wiki/date_index.html.erb index a0327cf4..611f18b2 100644 --- a/app/views/wiki/date_index.html.erb +++ b/app/views/wiki/date_index.html.erb @@ -1,5 +1,5 @@
-<%= watcher_tag(@wiki, User.current) %> + <%= watcher_link(@wiki, User.current) %>

<%= l(:label_index_by_date) %>

diff --git a/app/views/wiki/diff.rhtml b/app/views/wiki/diff.rhtml index 264c677b..a1006dce 100644 --- a/app/views/wiki/diff.rhtml +++ b/app/views/wiki/diff.rhtml @@ -12,6 +12,6 @@ (<%= @diff.content_to.author ? @diff.content_to.author.name : "anonyme" %>, <%= format_time(@diff.content_to.updated_on) %>)

-
- -<%= html_diff(@diff) %> +
+<%= simple_format_without_paragraph @diff.to_html %> +
diff --git a/app/views/wiki/edit.rhtml b/app/views/wiki/edit.rhtml index 5f47c3f8..62933ae8 100644 --- a/app/views/wiki/edit.rhtml +++ b/app/views/wiki/edit.rhtml @@ -1,7 +1,7 @@

<%=h @page.pretty_title %>

<% form_for :content, @content, :url => {:action => 'update', :id => @page.title}, :html => {:method => :put, :multipart => true, :id => 'wiki_form'} do |f| %> -<%= f.hidden_field :version %> +<%= f.hidden_field :lock_version %> <%= error_messages_for 'content' %>

<%= f.text_area :text, :cols => 100, :rows => 25, :class => 'wiki-edit', :accesskey => accesskey(:edit) %>

@@ -9,7 +9,7 @@


<%= render :partial => 'attachments/form' %>

<%= submit_tag l(:button_save) %> - <%= link_to_remote l(:label_preview), + <%= link_to_remote l(:label_preview), { :url => { :controller => 'wiki', :action => 'preview', :project_id => @project, :id => @page.title }, :method => :post, :update => 'preview', diff --git a/app/views/wiki/history.rhtml b/app/views/wiki/history.rhtml index 392c3b9f..78598e3f 100644 --- a/app/views/wiki/history.rhtml +++ b/app/views/wiki/history.rhtml @@ -7,7 +7,7 @@

- + @@ -21,9 +21,9 @@ - - - + + + <% line_num += 1 %> diff --git a/app/views/wiki/index.html.erb b/app/views/wiki/index.html.erb index e85f83b9..e5420852 100644 --- a/app/views/wiki/index.html.erb +++ b/app/views/wiki/index.html.erb @@ -1,5 +1,5 @@
-<%= watcher_tag(@wiki, User.current) %> + <%= watcher_link(@wiki, User.current) %>

<%= l(:label_index_by_title) %>

@@ -8,7 +8,7 @@

<%= l(:label_no_data) %>

<% end %> -<%= render_page_hierarchy(@pages_by_parent_id) %> +<%= render_page_hierarchy(@pages_by_parent_id, nil, :timestamp => true) %> <% content_for :sidebar do %> <%= render :partial => 'sidebar' %> diff --git a/app/views/wiki/show.rhtml b/app/views/wiki/show.rhtml index 671bd803..6cc7fbc0 100644 --- a/app/views/wiki/show.rhtml +++ b/app/views/wiki/show.rhtml @@ -1,7 +1,7 @@
<% if @editable %> <%= link_to_if_authorized(l(:button_edit), {:action => 'edit', :id => @page.title}, :class => 'icon icon-edit', :accesskey => accesskey(:edit)) if @content.version == @page.content.version %> -<%= watcher_tag(@page, User.current) %> +<%= watcher_link(@page, User.current) %> <%= link_to_if_authorized(l(:button_lock), {:action => 'protect', :id => @page.title, :protected => 1}, :method => :post, :class => 'icon icon-lock') if !@page.protected? %> <%= link_to_if_authorized(l(:button_unlock), {:action => 'protect', :id => @page.title, :protected => 0}, :method => :post, :class => 'icon icon-unlock') if @page.protected? %> <%= link_to_if_authorized(l(:button_rename), {:action => 'rename', :id => @page.title}, :class => 'icon icon-move') if @content.version == @page.content.version %> @@ -14,10 +14,10 @@ <%= breadcrumb(@page.ancestors.reverse.collect {|parent| link_to h(parent.pretty_title), {:id => parent.title, :project_id => parent.project}}) %> <% if @content.version != @page.content.version %> -

+

<%= link_to(('« ' + l(:label_previous)), :action => 'show', :id => @page.title, :project_id => @page.project, :version => (@content.version - 1)) + " - " if @content.version > 1 %> <%= "#{l(:label_version)} #{@content.version}/#{@page.content.version}" %> - <%= '(' + link_to('diff', :controller => 'wiki', :action => 'diff', :id => @page.title, :project_id => @page.project, :version => @content.version) + ')' if @content.version > 1 %> - + <%= '(' + link_to('diff', :controller => 'wiki', :action => 'diff', :id => @page.title, :project_id => @page.project, :version => @content.version) + ')' if @content.version > 1 %> - <%= link_to((l(:label_next) + ' »'), :action => 'show', :id => @page.title, :project_id => @page.project, :version => (@content.version + 1)) + " - " if @content.version < @page.content.version %> <%= link_to(l(:label_current_version), :action => 'show', :id => @page.title, :project_id => @page.project) %>
@@ -58,7 +58,7 @@ <% end %> <% content_for :sidebar do %> - <%= render :partial => 'sidebar' %> + <%= render :partial => 'wiki/sidebar' %> <% end %> <% html_title @page.pretty_title %> diff --git a/app/views/workflows/_form.html.erb b/app/views/workflows/_form.html.erb new file mode 100644 index 00000000..e319d2dd --- /dev/null +++ b/app/views/workflows/_form.html.erb @@ -0,0 +1,40 @@ +

+ + + + + + + + <% for new_status in @statuses %> + + <% end %> + + + + <% for old_status in @statuses %> + "> + + <% for new_status in @statuses -%> + + <% end -%> + + <% end %> + +
+ <%= link_to_function(image_tag('toggle_check.png'), "toggleCheckboxesBySelector('table.transitions-#{name} input')", + :title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}") %> + <%=l(:label_current_status)%> + <%=l(:label_new_statuses_allowed)%>
+ <%= link_to_function(image_tag('toggle_check.png'), "toggleCheckboxesBySelector('table.transitions-#{name} input.new-status-#{new_status.id}')", + :title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}") %> + <%=h new_status.name %> +
+ <%= link_to_function(image_tag('toggle_check.png'), "toggleCheckboxesBySelector('table.transitions-#{name} input.old-status-#{old_status.id}')", + :title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}") %> + + <%=h old_status.name %> + + <%= check_box_tag "issue_status[#{ old_status.id }][#{new_status.id}][]", name, workflows.detect {|w| w.old_status_id == old_status.id && w.new_status_id == new_status.id}, + :class => "old-status-#{old_status.id} new-status-#{new_status.id}" %> +
\ No newline at end of file diff --git a/app/views/workflows/copy.rhtml b/app/views/workflows/copy.rhtml index 2cecc841..a7a2bad0 100644 --- a/app/views/workflows/copy.rhtml +++ b/app/views/workflows/copy.rhtml @@ -7,14 +7,14 @@

<%= l(:label_tracker) %>
- <%= select_tag('source_tracker_id', + <%= select_tag('source_tracker_id', "" + - "" + + "" + options_from_collection_for_select(@trackers, 'id', 'name', @source_tracker && @source_tracker.id)) %>
<%= l(:label_role) %>
<%= select_tag('source_role_id', "" + - "" + + "" + options_from_collection_for_select(@roles, 'id', 'name', @source_role && @source_role.id)) %>

diff --git a/app/views/workflows/edit.rhtml b/app/views/workflows/edit.rhtml index 26f2cf96..22ca1916 100644 --- a/app/views/workflows/edit.rhtml +++ b/app/views/workflows/edit.rhtml @@ -11,7 +11,7 @@ <%= select_tag 'tracker_id', options_from_collection_for_select(@trackers, "id", "name", @tracker && @tracker.id) %> - + <%= hidden_field_tag 'used_statuses_only', '0' %>

@@ -20,54 +20,31 @@

<% end %> - <% if @tracker && @role && @statuses.any? %> -<% form_tag({}, :id => 'workflow_form' ) do %> -<%= hidden_field_tag 'tracker_id', @tracker.id %> -<%= hidden_field_tag 'role_id', @role.id %> -
- - - - - - - - - <% for new_status in @statuses %> - - <% end %> - - - - <% for old_status in @statuses %> - "> - - <% new_status_ids_allowed = old_status.find_new_statuses_allowed_to([@role], @tracker).collect(&:id) -%> - <% for new_status in @statuses -%> - - <% end -%> - - <% end %> - -
<%=l(:label_current_status)%><%=l(:label_new_statuses_allowed)%>
- <%= link_to_function(image_tag('toggle_check.png'), "toggleCheckboxesBySelector('input.new-status-#{new_status.id}')", - :title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}") %> - <%= new_status.name %> -
- <%= link_to_function(image_tag('toggle_check.png'), "toggleCheckboxesBySelector('input.old-status-#{old_status.id}')", - :title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}") %> - - <%= old_status.name %> - - <%= check_box_tag "issue_status[#{ old_status.id }][]", new_status.id, new_status_ids_allowed.include?(new_status.id), - :class => "old-status-#{old_status.id} new-status-#{new_status.id}" %> -
-
-

<%= check_all_links 'workflow_form' %>

+ <% form_tag({}, :id => 'workflow_form' ) do %> + <%= hidden_field_tag 'tracker_id', @tracker.id %> + <%= hidden_field_tag 'role_id', @role.id %> +
+ <%= render :partial => 'form', :locals => {:name => 'always', :workflows => @workflows['always']} %> -<%= submit_tag l(:button_save) %> -<% end %> +
+ <%= l(:label_additional_workflow_transitions_for_author) %> +
+ <%= render :partial => 'form', :locals => {:name => 'author', :workflows => @workflows['author']} %> +
+
+ <%= javascript_tag "hideFieldset($('author_workflows'))" unless @workflows['author'].present? %> + +
+ <%= l(:label_additional_workflow_transitions_for_assignee) %> +
+ <%= render :partial => 'form', :locals => {:name => 'assignee', :workflows => @workflows['assignee']} %> +
+
+ <%= javascript_tag "hideFieldset($('assignee_workflows'))" unless @workflows['assignee'].present? %> +
+ <%= submit_tag l(:button_save) %> + <% end %> <% end %> <% html_title(l(:label_workflow)) -%> diff --git a/app/views/workflows/index.rhtml b/app/views/workflows/index.rhtml index bed6a34d..f05386c9 100644 --- a/app/views/workflows/index.rhtml +++ b/app/views/workflows/index.rhtml @@ -14,7 +14,7 @@ <%= content_tag(role.builtin? ? 'em' : 'span', h(role.name)) %> - + <% end %> @@ -24,7 +24,7 @@ <%= h tracker %> <% roles.each do |role, count| -%> - <%= link_to((count > 1 ? count : image_tag('false.png')), {:action => 'edit', :role_id => role, :tracker_id => tracker}, :title => l(:button_edit)) %> + <%= link_to((count > 0 ? count : image_tag('false.png')), {:action => 'edit', :role_id => role, :tracker_id => tracker}, :title => l(:button_edit)) %> <% end -%> diff --git a/config/boot.rb b/config/boot.rb index bb844558..3666efeb 100644 --- a/config/boot.rb +++ b/config/boot.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + # Don't change this file! # Configure your app in config/environment.rb and config/environments/*.rb @@ -36,6 +49,15 @@ module Rails class Boot def run load_initializer + + # This block was added for bundler support while following setup + # instructions from http://gembundler.com/rails23.html + Rails::Initializer.class_eval do + def load_gems + @bundler_loaded ||= Bundler.require :default, Rails.env + end + end + Rails::Initializer.run(:set_load_path) end end @@ -62,8 +84,12 @@ module Rails gem 'rails' end rescue Gem::LoadError => load_error - $stderr.puts %(Missing the Rails #{version} gem. Please `gem install -v=#{version} rails`, update your RAILS_GEM_VERSION setting in config/environment.rb for the Rails version you do have installed, or comment out RAILS_GEM_VERSION to use the latest version installed.) - exit 1 + if load_error.message =~ /Could not find RubyGem rails/ + STDERR.puts %(Missing the Rails #{version} gem. Please `gem install -v=#{version} rails`, update your RAILS_GEM_VERSION setting in config/environment.rb for the Rails version you do have installed, or comment out RAILS_GEM_VERSION to use the latest version installed.) + exit 1 + else + raise + end end class << self @@ -106,60 +132,5 @@ module Rails end end -# TODO: Workaround for #7013 to be removed for 1.2.0 -# Loads i18n 0.4.2 before Rails loads any more recent gem -# 0.5.0 is not compatible with the old interpolation syntax -# Plugins will have to migrate to the new syntax for 1.2.0 -require 'rubygems' -begin - gem 'i18n', '0.4.2' -rescue Gem::LoadError => load_error - $stderr.puts %(Missing the i18n 0.4.2 gem. Please `gem install -v=0.4.2 i18n`) - exit 1 -end - -# TODO: Workaround for rubygems > 1.5 compatibility (#133), to be removed -# for Rails > 2.3.5 -# -# Fixes the deprecation warning about removal of version_requirements for -# rubygems < 1.5 and provide a workaround for rubygems >= 1.5 where that -# method was finally removed. -module Rails - # See lib/gems/1.8/gems/rails-2.3.5/lib/rails/gem_dependency.rb - class GemDependency < Gem::Dependency - def dependencies - return [] if framework_gem? - return [] unless installed? - specification.dependencies.reject do |dependency| - dependency.type == :development - end.map do |dependency| - GemDependency.new(dependency.name, - :requirement => (dependency.respond_to?(:requirement) ? - dependency.requirement : - dependency.version_requirements)) - end - end - - if method_defined?(:requirement) - # rubygem > 1.5 - def requirement - req = super - req unless req == Gem::Requirement.default - end - # bypass passenger error - alias :version_requirements :requirement - else - # rubygem < 1.5 - def requirement - req = version_requirements - req unless req == Gem::Requirement.default - end - end - end -end - -# working around deprecation in RubyGems 1.6 -require 'thread' - # All that for this: Rails.boot! diff --git a/config/configuration.yml.example b/config/configuration.yml.example index 0858d1ca..b75a9243 100644 --- a/config/configuration.yml.example +++ b/config/configuration.yml.example @@ -136,6 +136,20 @@ default: scm_bazaar_command: scm_darcs_command: + # Key used to encrypt sensitive data in the database (SCM and LDAP passwords). + # If you don't want to enable data encryption, just leave it blank. + # WARNING: losing/changing this key will make encrypted data unreadable. + # + # If you want to encrypt existing passwords in your database: + # * set the cipher key here in your configuration file + # * encrypt data using 'rake db:encrypt RAILS_ENV=production' + # + # If you have encrypted data and want to change this key, you have to: + # * decrypt data using 'rake db:decrypt RAILS_ENV=production' first + # * change the cipher key here in your configuration file + # * encrypt data using 'rake db:encrypt RAILS_ENV=production' + database_cipher_key: + # specific configuration options for production environment # that overrides the default ones production: diff --git a/config/environment.rb b/config/environment.rb index 19966557..5f9d178b 100644 --- a/config/environment.rb +++ b/config/environment.rb @@ -1,11 +1,24 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + # Be sure to restart your web server when you modify this file. -# Uncomment below to force Rails into production mode when +# Uncomment below to force Rails into production mode when # you don't control web/app server and can't set it the proper way # ENV['RAILS_ENV'] ||= 'production' # Specifies gem version of Rails to use when vendor/rails is not present -RAILS_GEM_VERSION = '2.3.5' unless defined? RAILS_GEM_VERSION +RAILS_GEM_VERSION = '2.3.12' unless defined? RAILS_GEM_VERSION # Bootstrap the Rails environment, frameworks, and default configuration require File.join(File.dirname(__FILE__), 'boot') @@ -19,42 +32,39 @@ end Rails::Initializer.run do |config| # Settings in config/environments/* take precedence those specified here - + # Skip frameworks you're not going to use # config.frameworks -= [ :action_web_service, :action_mailer ] # Add additional load paths for sweepers - config.load_paths += %W( #{RAILS_ROOT}/app/sweepers ) + config.autoload_paths += %W( #{RAILS_ROOT}/app/sweepers ) - # Force all environments to use the same logger level + # Force all environments to use the same logger level # (by default production uses :info, the others :debug) # config.log_level = :debug # Enable page/fragment caching by setting a file-based store # (remember to create the caching directory and make it readable to the application) # config.action_controller.cache_store = :file_store, "#{RAILS_ROOT}/tmp/cache" - + # Activate observers that should always be running # config.active_record.observers = :cacher, :garbage_collector - config.active_record.observers = :message_observer, :issue_observer, :journal_observer, :news_observer, :document_observer, :wiki_content_observer + config.active_record.observers = :journal_observer, :message_observer, :issue_observer, :news_observer, :document_observer, :wiki_content_observer, :comment_observer # Make Active Record use UTC-base instead of local time # config.active_record.default_timezone = :utc - + # Use Active Record's schema dumper instead of SQL when creating the test database # (enables use of different database adapters for development and test environments) # config.active_record.schema_format = :ruby - + # Deliveries are disabled by default. Do NOT modify this section. # Define your email configuration in configuration.yml instead. # It will automatically turn deliveries on config.action_mailer.perform_deliveries = false - config.gem 'rubytree', :lib => 'tree' - config.gem 'coderay', :version => '~>0.9.7' - # Load any local configuration that is kept out of source control - # (e.g. gems, patches). + # (e.g. patches). if File.exists?(File.join(File.dirname(__FILE__), 'additional_environment.rb')) instance_eval File.read(File.join(File.dirname(__FILE__), 'additional_environment.rb')) end diff --git a/config/environments/demo.rb b/config/environments/demo.rb index c7e997e8..44f5d863 100644 --- a/config/environments/demo.rb +++ b/config/environments/demo.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + # Settings specified here will take precedence over those in config/environment.rb # The production environment is meant for finished, "live" apps. diff --git a/config/environments/development.rb b/config/environments/development.rb index c816f03e..60253304 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -1,16 +1,30 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + # Settings specified here will take precedence over those in config/environment.rb # In the development environment your application's code is reloaded on # every request. This slows down response time but is perfect for development # since you don't have to restart the webserver when you make code changes. -config.cache_classes = false +config.cache_classes = false # Log error messages when you accidentally call methods on nil. -config.whiny_nils = true +config.whiny_nils = true # Show full error reports and disable caching config.action_controller.consider_all_requests_local = true +config.action_view.debug_rjs = true config.action_controller.perform_caching = false # Don't care if the mailer can't send -config.action_mailer.raise_delivery_errors = false +config.action_mailer.raise_delivery_errors = false \ No newline at end of file diff --git a/config/environments/production.rb b/config/environments/production.rb index 91af89ce..3aea2c61 100644 --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + # Settings specified here will take precedence over those in config/environment.rb # The production environment is meant for finished, "live" apps. diff --git a/config/environments/test.rb b/config/environments/test.rb index 79ee6af9..bbf32bc5 100644 --- a/config/environments/test.rb +++ b/config/environments/test.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + # Settings specified here will take precedence over those in config/environment.rb # The test environment is used exclusively to run your application's @@ -16,14 +29,10 @@ config.action_controller.perform_caching = false config.action_mailer.perform_deliveries = true config.action_mailer.delivery_method = :test -config.action_controller.session = { +config.action_controller.session = { :key => "_test_session", :secret => "some secret phrase for the tests." } # Skip protect_from_forgery in requests http://m.onkey.org/2007/9/28/csrf-protection-for-your-existing-rails-application config.action_controller.allow_forgery_protection = false - -config.gem "shoulda", :version => "~> 2.10.3" -config.gem "edavis10-object_daddy", :lib => "object_daddy" -config.gem "mocha" diff --git a/config/environments/test_pgsql.rb b/config/environments/test_pgsql.rb index 45cb09bd..e86b0b52 100644 --- a/config/environments/test_pgsql.rb +++ b/config/environments/test_pgsql.rb @@ -1 +1,14 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + instance_eval File.read(File.join(File.dirname(__FILE__), 'test.rb')) diff --git a/config/environments/test_sqlite3.rb b/config/environments/test_sqlite3.rb index 45cb09bd..e86b0b52 100644 --- a/config/environments/test_sqlite3.rb +++ b/config/environments/test_sqlite3.rb @@ -1 +1,14 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + instance_eval File.read(File.join(File.dirname(__FILE__), 'test.rb')) diff --git a/config/initializers/10-patches.rb b/config/initializers/10-patches.rb index 7d201e85..b9257fc8 100644 --- a/config/initializers/10-patches.rb +++ b/config/initializers/10-patches.rb @@ -1,10 +1,23 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + require 'active_record' module ActiveRecord class Base include Redmine::I18n - + # Translate attribute names for validation errors display def self.human_attribute_name(attr) l("field_#{attr.to_s.gsub(/_id$/, '')}") @@ -72,23 +85,19 @@ module AsynchronousMailer define_method("perform_delivery_async_#{type}") do |mail| Thread.start do send "perform_delivery_#{type}", mail - end + end end end end ActionMailer::Base.send :include, AsynchronousMailer -# TODO: Hack to support i18n 4.x on Rails 2.3.5. Remove post 2.3.6. -# See http://www.redmine.org/issues/6428 and http://www.redmine.org/issues/5608 -module I18n - module Backend - module Base - def warn_syntax_deprecation!(*args) - return if @skip_syntax_deprecation - ActiveSupport::Deprecation.warn "The {{key}} interpolation syntax in I18n messages is deprecated and will be removed in ChiliProject 2.0. Please use %{key} instead. See the notice at https://www.chiliproject.org/boards/2/topics/243 for more information." - @skip_syntax_deprecation = true - end +# TMail::Unquoter.convert_to_with_fallback_on_iso_8859_1 introduced in TMail 1.2.7 +# triggers a test failure in test_add_issue_with_japanese_keywords(MailHandlerTest) +module TMail + class Unquoter + class << self + alias_method :convert_to, :convert_to_without_fallback_on_iso_8859_1 end end end diff --git a/config/initializers/20-mime_types.rb b/config/initializers/20-mime_types.rb index dabac346..0e2e3674 100644 --- a/config/initializers/20-mime_types.rb +++ b/config/initializers/20-mime_types.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + # Add new mime types for use in respond_to blocks: Mime::SET << Mime::CSV unless Mime::SET.include?(Mime::CSV) diff --git a/config/initializers/30-redmine.rb b/config/initializers/30-redmine.rb index 708dcd65..601b62bb 100644 --- a/config/initializers/30-redmine.rb +++ b/config/initializers/30-redmine.rb @@ -1,5 +1,19 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + I18n.default_locale = 'en' # Adds fallback to default locale for untranslated strings I18n::Backend::Simple.send(:include, I18n::Backend::Fallbacks) require 'redmine' +require 'chili_project' diff --git a/config/initializers/backtrace_silencers.rb b/config/initializers/backtrace_silencers.rb index c2169ed0..cc603c4d 100644 --- a/config/initializers/backtrace_silencers.rb +++ b/config/initializers/backtrace_silencers.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + # Be sure to restart your server when you modify this file. # You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces. diff --git a/config/initializers/bigdecimal-segfault-fix.rb b/config/initializers/bigdecimal-segfault-fix.rb deleted file mode 100644 index 8fb3bf9e..00000000 --- a/config/initializers/bigdecimal-segfault-fix.rb +++ /dev/null @@ -1,30 +0,0 @@ -# Copyright (c) 2009 Michael Koziarski -# -# Permission to use, copy, modify, and/or distribute this software for any -# purpose with or without fee is hereby granted, provided that the above -# copyright notice and this permission notice appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -require 'bigdecimal' - -alias BigDecimalUnsafe BigDecimal - - -# This fixes CVE-2009-1904 however it removes legitimate functionality that your -# application may depend on. You are *strongly* advised to upgrade your ruby -# rather than relying on this fix for an extended period of time. - -def BigDecimal(initial, digits=0) - if initial.size > 255 || initial =~ /e/i - raise "Invalid big Decimal Value" - end - BigDecimalUnsafe(initial, digits) -end - diff --git a/config/initializers/inflections.rb b/config/initializers/inflections.rb index d531b8bb..d89c2a78 100644 --- a/config/initializers/inflections.rb +++ b/config/initializers/inflections.rb @@ -1,6 +1,19 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + # Be sure to restart your server when you modify this file. -# Add new inflection rules using the following format +# Add new inflection rules using the following format # (all these examples are active by default): # ActiveSupport::Inflector.inflections do |inflect| # inflect.plural /^(ox)$/i, '\1en' diff --git a/config/initializers/new_rails_defaults.rb b/config/initializers/new_rails_defaults.rb new file mode 100644 index 00000000..325701e4 --- /dev/null +++ b/config/initializers/new_rails_defaults.rb @@ -0,0 +1,34 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + +# Be sure to restart your server when you modify this file. + +# These settings change the behavior of Rails 2 apps and will be defaults +# for Rails 3. You can remove this initializer when Rails 3 is released. + +if defined?(ActiveRecord) + # Include Active Record class name as root for JSON serialized output. + ActiveRecord::Base.include_root_in_json = true + + # Store the full class name (including module namespace) in STI type column. + ActiveRecord::Base.store_full_sti_class = true +end + +ActionController::Routing.generate_best_match = true + +# Use ISO 8601 format for JSON serialized times and dates. +ActiveSupport.use_standard_json_time_format = true + +# Don't escape HTML entities in JSON, leave that for the #json_escape helper. +# if you're including raw json in an HTML page. +ActiveSupport.escape_html_entities_in_json = false diff --git a/config/locales/bg.yml b/config/locales/bg.yml index 099d2a30..e15ca31c 100644 --- a/config/locales/bg.yml +++ b/config/locales/bg.yml @@ -9,15 +9,18 @@ bg: default: "%d-%m-%Y" short: "%b %d" long: "%B %d, %Y" - + day_names: [Неделя, Понеделник, Вторник, Сряда, Четвъртък, Петък, Събота] abbr_day_names: [Нед, Пон, Вто, Сря, Чет, Пет, Съб] - + # Don't forget the nil at the beginning; there's no such thing as a 0th month month_names: [~, Януари, Февруари, Март, Април, Май, Юни, Юли, Август, Септември, Октомври, Ноември, Декември] abbr_month_names: [~, Яну, Фев, Мар, Апр, Май, Юни, Юли, Авг, Сеп, Окт, Ное, Дек] # Used in date_select and datime_select. - order: [ :year, :month, :day ] + order: + - :year + - :month + - :day time: formats: @@ -27,7 +30,7 @@ bg: long: "%B %d, %Y %H:%M" am: "am" pm: "pm" - + datetime: distance_in_words: half_a_minute: "half a minute" @@ -75,10 +78,10 @@ bg: format: precision: 1 delimiter: "" - storage_units: + storage_units: format: "%n %u" - units: - byte: + units: + byte: one: Byte other: Bytes kb: "KB" @@ -92,7 +95,7 @@ bg: array: sentence_connector: "и" skip_last_comma: false - + activerecord: errors: template: @@ -126,7 +129,7 @@ bg: cant_link_an_issue_with_a_descendant: "Една задача не може да бъде свързвана към своя подзадача" actionview_instancetag_blank_option: Изберете - + general_text_No: 'Не' general_text_Yes: 'Да' general_text_no: 'не' @@ -137,7 +140,7 @@ bg: general_csv_encoding: UTF-8 general_pdf_encoding: UTF-8 general_first_day_of_week: '1' - + notice_account_updated: Профилът е обновен успешно. notice_account_invalid_creditentials: Невалиден потребител или парола. notice_account_password_updated: Паролата е успешно променена. @@ -168,7 +171,7 @@ bg: notice_unable_delete_time_entry: Невъзможност за изтриване на запис на time log. notice_issue_done_ratios_updated: Обновен процент на завършените задачи. notice_gantt_chart_truncated: Мрежовият график е съкратен, понеже броят на обектите, които могат да бъдат показани е твърде голям (%{max}) - + error_can_t_load_default_data: "Грешка при зареждане на примерната информация: %{value}" error_scm_not_found: Несъществуващ обект в хранилището. error_scm_command_failed: "Грешка при опит за комуникация с хранилище: %{value}" @@ -187,7 +190,7 @@ bg: error_unable_delete_issue_status: Невъзможност за изтриване на състояние на задача error_unable_to_connect: Невъзможност за свързване с (%{value}) warning_attachments_not_saved: "%{count} файла не бяха записани." - + mail_subject_lost_password: "Вашата парола (%{value})" mail_body_lost_password: 'За да смените паролата си, използвайте следния линк:' mail_subject_register: "Активация на профил (%{value})" @@ -202,10 +205,10 @@ bg: mail_body_wiki_content_added: Wiki страницата '%{id}' беше добавена от %{author}. mail_subject_wiki_content_updated: "Wiki страницата '%{id}' не беше обновена" mail_body_wiki_content_updated: Wiki страницата '%{id}' беше обновена от %{author}. - + gui_validation_error: 1 грешка gui_validation_error_plural: "%{count} грешки" - + field_name: Име field_description: Описание field_summary: Анотация @@ -252,7 +255,6 @@ bg: field_admin: Администратор field_last_login_on: Последно свързване field_language: Език - field_effective_date: Дата field_password: Парола field_new_password: Нова парола field_password_confirmation: Потвърждение @@ -262,13 +264,13 @@ bg: field_port: Порт field_account: Профил field_base_dn: Base DN - field_attr_login: Атрибут Login + field_attr_login: Атрибут Login field_attr_firstname: Атрибут Първо име (Firstname) field_attr_lastname: Атрибут Фамилия (Lastname) field_attr_mail: Атрибут Email field_onthefly: Динамично създаване на потребител field_start_date: Начална дата - field_done_ratio: % Прогрес + field_done_ratio: "% Прогрес" field_auth_source: Начин на оторизация field_hide_mail: Скрий e-mail адреса ми field_comments: Коментар @@ -303,7 +305,8 @@ bg: field_assigned_to_role: Assignee's role field_text: Текстово поле field_visible: Видим - + field_warn_on_leaving_unsaved: Предупреди ме, когато напускам страница с незаписано съдържание + setting_app_title: Заглавие setting_app_subtitle: Описание setting_welcome_text: Допълнителен текст @@ -362,7 +365,7 @@ bg: setting_commit_logtime_enabled: Разрешаване на отчитането на работното време setting_commit_logtime_activity_id: Дейност при отчитане на работното време setting_gantt_items_limit: Максимален брой обекти, които да се показват в мрежов график - + permission_add_project: Създаване на проект permission_add_subprojects: Създаване на подпроекти permission_edit_project: Редактиране на проект @@ -536,6 +539,7 @@ bg: label_news_latest: Последни новини label_news_view_all: Виж всички label_news_added: Добавена новина + label_news_comment_added: Добавен коментар към новина label_settings: Настройки label_overview: Общ изглед label_version: Версия @@ -594,6 +598,7 @@ bg: label_query: Потребителска справка label_query_plural: Потребителски справки label_query_new: Нова заявка + label_my_queries: Моите заявки label_filter_add: Добави филтър label_filter_plural: Филтри label_equals: е @@ -838,11 +843,11 @@ bg: button_quote: Цитат button_duplicate: Дублиране button_show: Показване - + status_active: активен status_registered: регистриран status_locked: заключен - + version_status_open: отворена version_status_locked: заключена version_status_closed: затворена @@ -858,6 +863,7 @@ bg: text_are_you_sure: Сигурни ли сте? text_are_you_sure_with_children: Изтриване на задачата и нейните подзадачи? text_journal_changed: "%{label} променен от %{old} на %{new}" + text_journal_changed_no_detail: "%{label} променен" text_journal_set_to: "%{label} установен на %{value}" text_journal_deleted: "%{label} изтрит (%{old})" text_journal_added: "Добавено %{label} %{value}" @@ -908,6 +914,7 @@ bg: text_own_membership_delete_confirmation: "Вие сте на път да премахнете някои или всички ваши разрешения и е възможно след това да не можете да редактирате този проект.\nСигурен ли сте, че искате да продължите?" text_zoom_in: Увеличаване text_zoom_out: Намаляване + text_warn_on_leaving_unsaved: Страницата съдържа незаписано съдържание, което може да бъде загубено, ако я напуснете. default_role_manager: Мениджър default_role_developer: Разработчик @@ -946,3 +953,13 @@ bg: label_cvs_path: CVSROOT label_git_path: Path to .git directory label_mercurial_path: Root directory + label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee + button_expand_all: Expand all + button_collapse_all: Collapse all + label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author + field_effective_date: Due date + text_default_encoding: "Default: UTF-8" + text_git_repo_example: a bare and local repository (e.g. /gitrepo, c:\gitrepo) + label_notify_member_plural: Email issue updates + label_path_encoding: Path encoding + text_mercurial_repo_example: local repository (e.g. /hgrepo, c:\hgrepo) diff --git a/config/locales/bs.yml b/config/locales/bs.yml index 40518869..8f172a58 100644 --- a/config/locales/bs.yml +++ b/config/locales/bs.yml @@ -15,8 +15,11 @@ bs: month_names: [~, Januar, Februar, Mart, April, Maj, Jun, Jul, Avgust, Septembar, Oktobar, Novembar, Decembar] abbr_month_names: [~, Jan, Feb, Mar, Apr, Maj, Jun, Jul, Avg, Sep, Okt, Nov, Dec] - order: [ :day, :month, :year ] - + order: + - :day + - :month + - :year + time: formats: default: "%A, %e. %B %Y, %H:%M" @@ -26,7 +29,7 @@ bs: am: "prijepodne" pm: "poslijepodne" - + datetime: distance_in_words: half_a_minute: "pola minute" @@ -97,13 +100,13 @@ bs: mb: "MB" gb: "GB" tb: "TB" - + # Used in array.to_sentence. support: array: sentence_connector: "i" skip_last_comma: false - + activerecord: errors: template: @@ -137,7 +140,7 @@ bs: cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks" actionview_instancetag_blank_option: Molimo odaberite - + general_text_No: 'Da' general_text_Yes: 'Ne' general_text_no: 'ne' @@ -148,7 +151,7 @@ bs: general_csv_encoding: utf8 general_pdf_encoding: utf8 general_first_day_of_week: '7' - + notice_account_activated: Vaš nalog je aktiviran. Možete se prijaviti. notice_account_invalid_creditentials: Pogrešan korisnik ili lozinka notice_account_lost_email_sent: Email sa uputstvima o izboru nove šifre je poslat na vašu adresu. @@ -179,9 +182,9 @@ bs: error_scm_annotate: "Ova stavka ne postoji ili nije označena." error_issue_not_found_in_project: 'Aktivnost nije nađena ili ne pripada ovom projektu' - + warning_attachments_not_saved: "%{count} fajl(ovi) ne mogu biti snimljen(i)." - + mail_subject_lost_password: "Vaša %{value} lozinka" mail_body_lost_password: 'Za promjenu lozinke, kliknite na sljedeći link:' mail_subject_register: "Aktivirajte %{value} vaš korisnički račun" @@ -192,10 +195,10 @@ bs: mail_body_account_activation_request: "Novi korisnik (%{value}) se registrovao. Korisnički račun čeka vaše odobrenje za aktivaciju:" mail_subject_reminder: "%{count} aktivnost(i) u kašnjenju u narednim %{days} danima" mail_body_reminder: "%{count} aktivnost(i) koje su dodjeljenje vama u narednim %{days} danima:" - + gui_validation_error: 1 greška gui_validation_error_plural: "%{count} grešaka" - + field_name: Ime field_description: Opis field_summary: Pojašnjenje @@ -241,7 +244,6 @@ bs: field_admin: Administrator field_last_login_on: Posljednja konekcija field_language: Jezik - field_effective_date: Datum field_password: Lozinka field_new_password: Nova lozinka field_password_confirmation: Potvrda @@ -257,7 +259,7 @@ bs: field_attr_mail: Atribut za email field_onthefly: 'Kreiranje korisnika "On-the-fly"' field_start_date: Početak - field_done_ratio: % Realizovano + field_done_ratio: "% Realizovano" field_auth_source: Mod za authentifikaciju field_hide_mail: Sakrij moju email adresu field_comments: Komentar @@ -284,7 +286,7 @@ bs: field_watcher: Posmatrač field_identity_url: OpenID URL field_content: Sadržaj - + setting_app_title: Naslov aplikacije setting_app_subtitle: Podnaslov aplikacije setting_welcome_text: Tekst dobrodošlice @@ -328,7 +330,7 @@ bs: setting_file_max_size_displayed: Maksimalna veličina fajla kod prikaza razlika unutar fajla (inline) setting_repository_log_display_limit: Maksimalna veličina revizija prikazanih na log fajlu setting_openid: Omogući OpenID prijavu i registraciju - + permission_edit_project: Ispravke projekta permission_select_project_modules: Odaberi module projekta permission_manage_members: Upravljanje članovima @@ -377,7 +379,7 @@ bs: permission_edit_own_messages: Ispravka sopstvenih poruka permission_delete_messages: Prisanje poruka permission_delete_own_messages: Brisanje sopstvenih poruka - + project_module_issue_tracking: Praćenje aktivnosti project_module_time_tracking: Praćenje vremena project_module_news: Novosti @@ -386,7 +388,7 @@ bs: project_module_wiki: Wiki stranice project_module_repository: Repozitorij project_module_boards: Forumi - + label_user: Korisnik label_user_plural: Korisnici label_user_new: Novi korisnik @@ -701,7 +703,7 @@ bs: label_planning: Planiranje label_incoming_emails: Dolazni email-ovi label_generate_key: Generiši ključ - label_issue_watchers: Praćeno od + label_issue_watchers: Praćeno od label_example: Primjer label_display: Prikaz @@ -741,11 +743,11 @@ bs: button_watch: Notifikacija button_configure: Konfiguracija button_quote: Citat - + status_active: aktivan status_registered: registrovan status_locked: zaključan - + text_select_mail_notifications: Odaberi događaje za koje će se slati email notifikacija. text_regexp_info: npr. ^[A-Z0-9]+$ text_min_max_length_info: 0 znači bez restrikcije @@ -791,7 +793,7 @@ bs: text_repository_usernames_mapping: "Odaberi ili ispravi redmine korisnika mapiranog za svako korisničko ima nađeno u logu repozitorija.\nKorisnici sa istim imenom u redmineu i u repozitoruju se automatski mapiraju." text_diff_truncated: '... Ovaj prikaz razlike je odsječen pošto premašuje maksimalnu veličinu za prikaz' text_custom_field_possible_values_info: 'Jedna linija za svaku vrijednost' - + default_role_manager: Menadžer default_role_developer: Programer default_role_reporter: Reporter @@ -815,7 +817,7 @@ bs: default_priority_immediate: Odmah default_activity_design: Dizajn default_activity_development: Programiranje - + enumeration_issue_priorities: Prioritet aktivnosti enumeration_doc_categories: Kategorije dokumenata enumeration_activities: Operacije (utrošak vremena) @@ -960,3 +962,18 @@ bs: label_cvs_path: CVSROOT label_git_path: Path to .git directory label_mercurial_path: Root directory + label_my_queries: My custom queries + label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee + text_journal_changed_no_detail: "%{label} updated" + button_expand_all: Expand all + button_collapse_all: Collapse all + label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author + field_effective_date: Due date + label_news_comment_added: Comment added to a news + field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text + text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page. + text_default_encoding: "Default: UTF-8" + text_git_repo_example: a bare and local repository (e.g. /gitrepo, c:\gitrepo) + label_notify_member_plural: Email issue updates + label_path_encoding: Path encoding + text_mercurial_repo_example: local repository (e.g. /hgrepo, c:\hgrepo) diff --git a/config/locales/ca.yml b/config/locales/ca.yml index e2a31df4..98e76c27 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -1,4 +1,4 @@ -# Redmine catalan translation: +# Redmine catalan translation: # by Joan Duran ca: @@ -12,15 +12,18 @@ ca: default: "%d-%m-%Y" short: "%e de %b" long: "%a, %e de %b de %Y" - + day_names: [Diumenge, Dilluns, Dimarts, Dimecres, Dijous, Divendres, Dissabte] abbr_day_names: [dg, dl, dt, dc, dj, dv, ds] - + # Don't forget the nil at the beginning; there's no such thing as a 0th month month_names: [~, Gener, Febrer, Març, Abril, Maig, Juny, Juliol, Agost, Setembre, Octubre, Novembre, Desembre] abbr_month_names: [~, Gen, Feb, Mar, Abr, Mai, Jun, Jul, Ago, Set, Oct, Nov, Des] # Used in date_select and datime_select. - order: [ :year, :month, :day ] + order: + - :year + - :month + - :day time: formats: @@ -30,7 +33,7 @@ ca: long: "%a, %e de %b de %Y, %H:%M" am: "am" pm: "pm" - + datetime: distance_in_words: half_a_minute: "mig minut" @@ -89,13 +92,13 @@ ca: gb: "GB" tb: "TB" - + # Used in array.to_sentence. support: array: sentence_connector: "i" skip_last_comma: false - + activerecord: errors: template: @@ -129,7 +132,7 @@ ca: cant_link_an_issue_with_a_descendant: "Un assumpte no es pot enllaçar a una de les seves subtasques" actionview_instancetag_blank_option: Seleccioneu - + general_text_No: 'No' general_text_Yes: 'Si' general_text_no: 'no' @@ -140,7 +143,7 @@ ca: general_csv_encoding: ISO-8859-15 general_pdf_encoding: ISO-8859-15 general_first_day_of_week: '1' - + notice_account_updated: "El compte s'ha actualitzat correctament." notice_account_invalid_creditentials: Usuari o contrasenya invàlid notice_account_password_updated: "La contrasenya s'ha modificat correctament." @@ -169,7 +172,7 @@ ca: notice_unable_delete_version: "No s'ha pogut suprimir la versió." notice_unable_delete_time_entry: "No s'ha pogut suprimir l'entrada del registre de temps." notice_issue_done_ratios_updated: "S'ha actualitzat el tant per cent dels assumptes." - + error_can_t_load_default_data: "No s'ha pogut carregar la configuració predeterminada: %{value} " error_scm_not_found: "No s'ha trobat l'entrada o la revisió en el dipòsit." error_scm_command_failed: "S'ha produït un error en intentar accedir al dipòsit: %{value}" @@ -188,7 +191,7 @@ ca: error_unable_delete_issue_status: "No s'ha pogut suprimir l'estat de l'assumpte" error_unable_to_connect: "No s'ha pogut connectar (%{value})" warning_attachments_not_saved: "No s'han pogut desar %{count} fitxers." - + mail_subject_lost_password: "Contrasenya de %{value}" mail_body_lost_password: "Per a canviar la contrasenya, feu clic en l'enllaç següent:" mail_subject_register: "Activació del compte de %{value}" @@ -203,17 +206,17 @@ ca: mail_body_wiki_content_added: "En %{author} ha afegit la pàgina wiki «%{id}»." mail_subject_wiki_content_updated: "S'ha actualitzat la pàgina wiki «%{id}»" mail_body_wiki_content_updated: "En %{author} ha actualitzat la pàgina wiki «%{id}»." - + gui_validation_error: 1 error gui_validation_error_plural: "%{count} errors" - + field_name: Nom field_description: Descripció field_summary: Resum field_is_required: Necessari field_firstname: Nom field_lastname: Cognom - field_mail: Correu electrònic + field_mail: Correu electrònic field_filename: Fitxer field_filesize: Mida field_downloads: Baixades @@ -253,7 +256,6 @@ ca: field_admin: Administrador field_last_login_on: Última connexió field_language: Idioma - field_effective_date: Data field_password: Contrasenya field_new_password: Contrasenya nova field_password_confirmation: Confirmació @@ -269,7 +271,7 @@ ca: field_attr_mail: Atribut del correu electrònic field_onthefly: "Creació de l'usuari «al vol»" field_start_date: Inici - field_done_ratio: % realitzat + field_done_ratio: "% realitzat" field_auth_source: "Mode d'autenticació" field_hide_mail: "Oculta l'adreça de correu electrònic" field_comments: Comentari @@ -300,7 +302,7 @@ ca: field_group_by: "Agrupa els resultats per" field_sharing: Compartició field_parent_issue: "Tasca pare" - + setting_app_title: "Títol de l'aplicació" setting_app_subtitle: "Subtítol de l'aplicació" setting_welcome_text: Text de benvinguda @@ -354,7 +356,7 @@ ca: setting_start_of_week: "Inicia les setmanes en" setting_rest_api_enabled: "Habilita el servei web REST" setting_cache_formatted_text: Cache formatted text - + permission_add_project: "Crea projectes" permission_add_subprojects: "Crea subprojectes" permission_edit_project: Edita el projecte @@ -410,7 +412,7 @@ ca: permission_delete_own_messages: Suprimeix els missatges propis permission_export_wiki_pages: "Exporta les pàgines wiki" permission_manage_subtasks: "Gestiona subtasques" - + project_module_issue_tracking: "Seguidor d'assumptes" project_module_time_tracking: Seguidor de temps project_module_news: Noticies @@ -421,7 +423,7 @@ ca: project_module_boards: Taulers project_module_calendar: Calendari project_module_gantt: Gantt - + label_user: Usuari label_user_plural: Usuaris label_user_new: Usuari nou @@ -606,7 +608,7 @@ ca: label_this_year: aquest any label_date_range: Abast de les dates label_less_than_ago: fa menys de - label_more_than_ago: fa més de + label_more_than_ago: fa més de label_ago: fa label_contains: conté label_not_contains: no conté @@ -779,7 +781,7 @@ ca: label_profile: Perfil label_subtask_plural: Subtasques label_project_copy_notifications: "Envia notificacions de correu electrònic durant la còpia del projecte" - + button_login: Entra button_submit: Tramet button_save: Desa @@ -823,17 +825,17 @@ ca: button_quote: Cita button_duplicate: Duplica button_show: Mostra - + status_active: actiu status_registered: informat status_locked: bloquejat - + version_status_open: oberta version_status_locked: bloquejada version_status_closed: tancada field_active: Actiu - + text_select_mail_notifications: "Seleccioneu les accions per les quals s'hauria d'enviar una notificació per correu electrònic." text_regexp_info: ex. ^[A-Z0-9]+$ text_min_max_length_info: 0 significa sense restricció @@ -891,7 +893,7 @@ ca: text_own_membership_delete_confirmation: "Esteu a punt de suprimir algun o tots els vostres permisos i potser no podreu editar més aquest projecte.\nSegur que voleu continuar?" text_zoom_in: Redueix text_zoom_out: Amplia - + default_role_manager: Gestor default_role_developer: Desenvolupador default_role_reporter: Informador @@ -915,7 +917,7 @@ ca: default_priority_immediate: Immediata default_activity_design: Disseny default_activity_development: Desenvolupament - + enumeration_issue_priorities: Prioritat dels assumptes enumeration_doc_categories: Categories del document enumeration_activities: Activitats (seguidor de temps) @@ -949,3 +951,18 @@ ca: label_cvs_path: CVSROOT label_git_path: Path to .git directory label_mercurial_path: Root directory + label_my_queries: My custom queries + label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee + text_journal_changed_no_detail: "%{label} updated" + button_expand_all: Expand all + button_collapse_all: Collapse all + label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author + field_effective_date: Due date + label_news_comment_added: Comment added to a news + field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text + text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page. + text_default_encoding: "Default: UTF-8" + text_git_repo_example: a bare and local repository (e.g. /gitrepo, c:\gitrepo) + label_notify_member_plural: Email issue updates + label_path_encoding: Path encoding + text_mercurial_repo_example: local repository (e.g. /hgrepo, c:\hgrepo) diff --git a/config/locales/cs.yml b/config/locales/cs.yml index cd6b77ec..821ae8ec 100644 --- a/config/locales/cs.yml +++ b/config/locales/cs.yml @@ -1,4 +1,9 @@ +# Update to 1.1 by Michal Gebauer +# Updated by Josef Liška +# CZ translation by Maxim Krušina | Massimo Filippi, s.r.o. | maxim@mxm.cz +# Based on original CZ translation by Jan Kadleček cs: + # Text direction: Left-to-Right (ltr) or Right-to-Left (rtl) direction: ltr date: formats: @@ -8,15 +13,18 @@ cs: default: "%Y-%m-%d" short: "%b %d" long: "%B %d, %Y" - + day_names: [Neděle, Pondělí, Úterý, Středa, Čtvrtek, Pátek, Sobota] abbr_day_names: [Ne, Po, Út, St, Čt, Pá, So] - + # Don't forget the nil at the beginning; there's no such thing as a 0th month month_names: [~, Leden, Únor, Březen, Duben, Květen, Červen, Červenec, Srpen, Září, Říjen, Listopad, Prosinec] abbr_month_names: [~, Led, Úno, Bře, Dub, Kvě, Čer, Čec, Srp, Zář, Říj, Lis, Pro] # Used in date_select and datime_select. - order: [ :year, :month, :day ] + order: + - :year + - :month + - :day time: formats: @@ -26,7 +34,7 @@ cs: long: "%B %d, %Y %H:%M" am: "dop." pm: "odp." - + datetime: distance_in_words: half_a_minute: "půl minuty" @@ -65,37 +73,39 @@ cs: other: "téměř %{count} roky" number: + # Výchozí formát pro čísla format: separator: "." delimiter: "" precision: 3 - human: - format: - precision: 1 + human: + format: delimiter: "" - storage_units: + precision: 1 + storage_units: format: "%n %u" - units: - kb: KB - tb: TB - gb: GB - byte: - one: Byte - other: Bytes - mb: MB - + units: + byte: + one: "Bajt" + other: "Bajtů" + kb: "kB" + mb: "MB" + gb: "GB" + tb: "TB" + + # Used in array.to_sentence. support: array: sentence_connector: "a" skip_last_comma: false - + activerecord: errors: template: header: - one: "1 error prohibited this %{model} from being saved" - other: "%{count} errors prohibited this %{model} from being saved" + one: "1 chyba zabránila uložení %{model}" + other: "%{count} chyb zabránilo uložení %{model}" messages: inclusion: "není zahrnuto v seznamu" exclusion: "je rezervováno" @@ -122,12 +132,8 @@ cs: circular_dependency: "Tento vztah by vytvořil cyklickou závislost" cant_link_an_issue_with_a_descendant: "Úkol nemůže být spojen s jedním z jeho dílčích úkolů" - # Updated by Josef Liška - # CZ translation by Maxim Krušina | Massimo Filippi, s.r.o. | maxim@mxm.cz - # Based on original CZ translation by Jan Kadleček - actionview_instancetag_blank_option: Prosím vyberte - + general_text_No: 'Ne' general_text_Yes: 'Ano' general_text_no: 'ne' @@ -138,7 +144,7 @@ cs: general_csv_encoding: UTF-8 general_pdf_encoding: UTF-8 general_first_day_of_week: '1' - + notice_account_updated: Účet byl úspěšně změněn. notice_account_invalid_creditentials: Chybné jméno nebo heslo notice_account_password_updated: Heslo bylo úspěšně změněno. @@ -154,21 +160,41 @@ cs: notice_successful_connection: Úspěšné připojení. notice_file_not_found: Stránka na kterou se snažíte zobrazit neexistuje nebo byla smazána. notice_locking_conflict: Údaje byly změněny jiným uživatelem. - notice_scm_error: Záznam a/nebo revize neexistuje v repozitáři. notice_not_authorized: Nemáte dostatečná práva pro zobrazení této stránky. + notice_not_authorized_archived_project: Projekt ke kterému se snažíte přistupovat byl archivován. notice_email_sent: "Na adresu %{value} byl odeslán email" notice_email_error: "Při odesílání emailu nastala chyba (%{value})" notice_feeds_access_key_reseted: Váš klíč pro přístup k RSS byl resetován. + notice_api_access_key_reseted: Váš API přístupový klíč byl resetován. notice_failed_to_save_issues: "Chyba při uložení %{count} úkolu(ů) z %{total} vybraných: %{ids}." + notice_failed_to_save_members: "Nepodařilo se uložit člena(y): %{errors}." notice_no_issue_selected: "Nebyl zvolen žádný úkol. Prosím, zvolte úkoly, které chcete editovat" notice_account_pending: "Váš účet byl vytvořen, nyní čeká na schválení administrátorem." notice_default_data_loaded: Výchozí konfigurace úspěšně nahrána. - + notice_unable_delete_version: Nemohu odstanit verzi + notice_unable_delete_time_entry: Nelze smazat čas ze záznamu. + notice_issue_done_ratios_updated: Koeficienty dokončení úkolu byly aktualizovány. + notice_gantt_chart_truncated: Graf byl oříznut, počet položek přesáhl limit pro zobrazení (%{max}) + error_can_t_load_default_data: "Výchozí konfigurace nebyla nahrána: %{value}" error_scm_not_found: "Položka a/nebo revize neexistují v repozitáři." error_scm_command_failed: "Při pokusu o přístup k repozitáři došlo k chybě: %{value}" + error_scm_annotate: "Položka neexistuje nebo nemůže být komentována." error_issue_not_found_in_project: 'Úkol nebyl nalezen nebo nepatří k tomuto projektu' - + error_no_tracker_in_project: Žádná fronta nebyla přiřazena tomuto projektu. Prosím zkontroluje nastavení projektu. + error_no_default_issue_status: Není nastaven výchozí stav úkolu. Prosím zkontrolujte nastavení ("Administrace -> Stavy úkolů"). + error_can_not_delete_custom_field: Nelze smazat volitelné pole + error_can_not_delete_tracker: Tato fronta obsahuje úkoly a nemůže být smazán. + error_can_not_remove_role: Tato role je právě používaná a nelze ji smazat. + error_can_not_reopen_issue_on_closed_version: Úkol přiřazený k uzavřené verzi nemůže být znovu otevřen + error_can_not_archive_project: Tento projekt nemůže být archivován + error_issue_done_ratios_not_updated: Koeficient dokončení úkolu nebyl aktualizován. + error_workflow_copy_source: Prosím vyberte zdrojovou frontu nebo roly + error_workflow_copy_target: Prosím vyberte cílovou frontu(y) a roly(e) + error_unable_delete_issue_status: Nelze smazat stavy úkolů + error_unable_to_connect: Nelze se připojit (%{value}) + warning_attachments_not_saved: "%{count} soubor(ů) nebylo možné uložit." + mail_subject_lost_password: "Vaše heslo (%{value})" mail_body_lost_password: 'Pro změnu vašeho hesla klikněte na následující odkaz:' mail_subject_register: "Aktivace účtu (%{value})" @@ -177,10 +203,16 @@ cs: mail_body_account_information: Informace o vašem účtu mail_subject_account_activation_request: "Aktivace %{value} účtu" mail_body_account_activation_request: "Byl zaregistrován nový uživatel %{value}. Aktivace jeho účtu závisí na vašem potvrzení." - + mail_subject_reminder: "%{count} úkol(ů) má termín během několik dní (%{days})" + mail_body_reminder: "%{count} úkol(ů), které máte přiřazeny má termín během několik dní (%{days}):" + mail_subject_wiki_content_added: "'%{id}' Wiki stránka byla přidána" + mail_body_wiki_content_added: "'%{id}' Wiki stránka byla přidána od %{author}." + mail_subject_wiki_content_updated: "'%{id}' Wiki stránka byla aktualizována" + mail_body_wiki_content_updated: "'%{id}' Wiki stránka byla aktualizována od %{author}." + gui_validation_error: 1 chyba gui_validation_error_plural: "%{count} chyb(y)" - + field_name: Název field_description: Popis field_summary: Přehled @@ -216,6 +248,7 @@ cs: field_priority: Priorita field_fixed_version: Cílová verze field_user: Uživatel + field_principal: Hlavní field_role: Role field_homepage: Domovská stránka field_is_public: Veřejný @@ -226,7 +259,6 @@ cs: field_admin: Administrátor field_last_login_on: Poslední přihlášení field_language: Jazyk - field_effective_date: Datum field_password: Heslo field_new_password: Nové heslo field_password_confirmation: Potvrzení @@ -242,7 +274,7 @@ cs: field_attr_mail: Email (atribut) field_onthefly: Automatické vytváření uživatelů field_start_date: Začátek - field_done_ratio: % Hotovo + field_done_ratio: "% Hotovo" field_auth_source: Autentifikační mód field_hide_mail: Nezobrazovat můj email field_comments: Komentář @@ -260,11 +292,24 @@ cs: field_redirect_existing_links: Přesměrovat stvávající odkazy field_estimated_hours: Odhadovaná doba field_column_names: Sloupce + field_time_entries: Zaznamenaný čas field_time_zone: Časové pásmo field_searchable: Umožnit vyhledávání field_default_value: Výchozí hodnota field_comments_sorting: Zobrazit komentáře - + field_parent_title: Rodičovská stránka + field_editable: Editovatelný + field_watcher: Sleduje + field_identity_url: OpenID URL + field_content: Obsah + field_group_by: Seskupovat výsledky podle + field_sharing: Sdílení + field_parent_issue: Rodičovský úkol + field_member_of_group: Skupina přiřaditele + field_assigned_to_role: Role přiřaditele + field_text: Textové pole + field_visible: Viditelný + setting_app_title: Název aplikace setting_app_subtitle: Podtitulek aplikace setting_welcome_text: Uvítací text @@ -275,6 +320,7 @@ cs: setting_issues_export_limit: Limit pro export úkolů setting_mail_from: Odesílat emaily z adresy setting_bcc_recipients: Příjemci skryté kopie (bcc) + setting_plain_text_mail: pouze prostý text (ne HTML) setting_host_name: Jméno serveru setting_text_formatting: Formátování textu setting_wiki_compression: Komprese historie Wiki @@ -289,14 +335,96 @@ cs: setting_time_format: Formát času setting_cross_project_issue_relations: Povolit vazby úkolů napříč projekty setting_issue_list_default_columns: Výchozí sloupce zobrazené v seznamu úkolů - setting_repositories_encodings: Kódování + setting_repositories_encodings: Kódování + setting_commit_logs_encoding: Kódování zpráv při commitu + setting_emails_header: Hlavička emailů setting_emails_footer: Patička emailů setting_protocol: Protokol setting_per_page_options: Povolené počty řádků na stránce setting_user_format: Formát zobrazení uživatele setting_activity_days_default: Dny zobrazené v činnosti projektu setting_display_subprojects_issues: Automaticky zobrazit úkoly podprojektu v hlavním projektu - + setting_enabled_scm: Povolené SCM + setting_mail_handler_body_delimiters: Zkrátit e-maily po jednom z těchto řádků + setting_mail_handler_api_enabled: Povolit WS pro příchozí e-maily + setting_mail_handler_api_key: API klíč + setting_sequential_project_identifiers: Generovat sekvenční identifikátory projektů + setting_gravatar_enabled: Použít uživatelské ikony Gravatar + setting_gravatar_default: Výchozí Gravatar + setting_diff_max_lines_displayed: Maximální počet zobrazenách řádků rozdílů + setting_file_max_size_displayed: Maximální velikost textových souborů zobrazených přímo na stránce + setting_repository_log_display_limit: Maximální počet revizí zobrazených v logu souboru + setting_openid: Umožnit přihlašování a registrace s OpenID + setting_password_min_length: Minimální délka hesla + setting_new_project_user_role_id: Role přiřazená uživateli bez práv administrátora, který projekt vytvořil + setting_default_projects_modules: Výchozí zapnutné moduly pro nový projekt + setting_issue_done_ratio: Spočítat koeficient dokončení úkolu s + setting_issue_done_ratio_issue_field: Použít pole úkolu + setting_issue_done_ratio_issue_status: Použít stav úkolu + setting_start_of_week: Začínat kalendáře + setting_rest_api_enabled: Zapnout službu REST + setting_cache_formatted_text: Ukládat formátovaný text do vyrovnávací paměti + setting_default_notification_option: Výchozí nastavení oznámení + setting_commit_logtime_enabled: Povolit zapisování času + setting_commit_logtime_activity_id: Aktivita pro zapsaný čas + setting_gantt_items_limit: Maximální počet položek zobrazený na ganttově grafu + + permission_add_project: Vytvořit projekt + permission_add_subprojects: Vytvořit podprojekty + permission_edit_project: Úprava projektů + permission_select_project_modules: Výběr modulů projektu + permission_manage_members: Spravování členství + permission_manage_project_activities: Spravovat aktivity projektu + permission_manage_versions: Spravování verzí + permission_manage_categories: Spravování kategorií úkolů + permission_view_issues: Zobrazit úkoly + permission_add_issues: Přidávání úkolů + permission_edit_issues: Upravování úkolů + permission_manage_issue_relations: Spravování vztahů mezi úkoly + permission_add_issue_notes: Přidávání poznámek + permission_edit_issue_notes: Upravování poznámek + permission_edit_own_issue_notes: Upravování vlastních poznámek + permission_move_issues: Přesouvání úkolů + permission_delete_issues: Mazání úkolů + permission_manage_public_queries: Správa veřejných dotazů + permission_save_queries: Ukládání dotazů + permission_view_gantt: Zobrazené Ganttova diagramu + permission_view_calendar: Prohlížení kalendáře + permission_view_issue_watchers: Zobrazení seznamu sledujícíh uživatelů + permission_add_issue_watchers: Přidání sledujících uživatelů + permission_delete_issue_watchers: Smazat přihlížející + permission_log_time: Zaznamenávání stráveného času + permission_view_time_entries: Zobrazení stráveného času + permission_edit_time_entries: Upravování záznamů o stráveném času + permission_edit_own_time_entries: Upravování vlastních zázamů o stráveném čase + permission_manage_news: Spravování novinek + permission_comment_news: Komentování novinek + permission_manage_documents: Správa dokumentů + permission_view_documents: Prohlížení dokumentů + permission_manage_files: Spravování souborů + permission_view_files: Prohlížení souborů + permission_manage_wiki: Spravování Wiki + permission_rename_wiki_pages: Přejmenovávání Wiki stránek + permission_delete_wiki_pages: Mazání stránek na Wiki + permission_view_wiki_pages: Prohlížení Wiki + permission_view_wiki_edits: Prohlížení historie Wiki + permission_edit_wiki_pages: Upravování stránek Wiki + permission_delete_wiki_pages_attachments: Mazání příloh + permission_protect_wiki_pages: Zabezpečení Wiki stránek + permission_manage_repository: Spravování repozitáře + permission_browse_repository: Procházení repozitáře + permission_view_changesets: Zobrazování sady změn + permission_commit_access: Commit přístup + permission_manage_boards: Správa diskusních fór + permission_view_messages: Prohlížení zpráv + permission_add_messages: Posílání zpráv + permission_edit_messages: Upravování zpráv + permission_edit_own_messages: Upravit vlastní zprávy + permission_delete_messages: Mazání zpráv + permission_delete_own_messages: Smazat vlastní zprávy + permission_export_wiki_pages: Exportovat Wiki stránky + permission_manage_subtasks: Spravovat podúkoly + project_module_issue_tracking: Sledování úkolů project_module_time_tracking: Sledování času project_module_news: Novinky @@ -305,10 +433,13 @@ cs: project_module_wiki: Wiki project_module_repository: Repozitář project_module_boards: Diskuse - + project_module_calendar: Kalendář + project_module_gantt: Gantt + label_user: Uživatel label_user_plural: Uživatelé label_user_new: Nový uživatel + label_user_anonymous: Anonymní label_project: Projekt label_project_new: Nový projekt label_project_plural: Projekty @@ -355,11 +486,13 @@ cs: label_information_plural: Informace label_please_login: Prosím přihlašte se label_register: Registrovat + label_login_with_open_id_option: nebo se přihlašte s OpenID label_password_lost: Zapomenuté heslo label_home: Úvodní label_my_page: Moje stránka label_my_account: Můj účet label_my_projects: Moje projekty + label_my_page_block: Bloky na mé stránce label_administration: Administrace label_login: Přihlášení label_logout: Odhlášení @@ -370,6 +503,7 @@ cs: label_registered_on: Registrován label_activity: Aktivita label_overall_activity: Celková aktivita + label_user_activity: "Aktivita uživatele: %{value}" label_new: Nový label_logged_as: Přihlášen jako label_environment: Prostředí @@ -378,6 +512,8 @@ cs: label_auth_source_new: Nový mód autentifikace label_auth_source_plural: Módy autentifikace label_subproject_plural: Podprojekty + label_subproject_new: Nový podprojekt + label_and_its_subprojects: "%{value} a jeho podprojekty" label_min_max_length: Min - Max délka label_list: Seznam label_date: Datum @@ -411,6 +547,7 @@ cs: label_version: Verze label_version_new: Nová verze label_version_plural: Verze + label_close_versions: Zavřít dokončené verze label_confirmation: Potvrzení label_export_to: 'Také k dispozici:' label_read: Načítá se... @@ -469,6 +606,8 @@ cs: label_not_equals: není label_in_less_than: je měší než label_in_more_than: je větší než + label_greater_or_equal: '>=' + label_less_or_equal: '<=' label_in: v label_today: dnes label_all_time: vše @@ -491,15 +630,21 @@ cs: label_browse: Procházet label_modification: "%{count} změna" label_modification_plural: "%{count} změn" + label_branch: Větev + label_tag: Tag label_revision: Revize label_revision_plural: Revizí + label_revision_id: "Revize %{value}" label_associated_revisions: Související verze label_added: přidáno label_modified: změněno + label_copied: zkopírováno + label_renamed: přejmenováno label_deleted: odstraněno label_latest_revision: Poslední revize label_latest_revision_plural: Poslední revize label_view_revisions: Zobrazit revize + label_view_all_revisions: Zobrazit všechny revize label_max_size: Maximální velikost label_sort_highest: Přesunout na začátek label_sort_higher: Přesunout nahoru @@ -525,6 +670,7 @@ cs: label_changes_details: Detail všech změn label_issue_tracking: Sledování úkolů label_spent_time: Strávený čas + label_overall_spent_time: Celkem strávený čas label_f_hour: "%{value} hodina" label_f_hour_plural: "%{value} hodin" label_time_tracking: Sledování času @@ -545,7 +691,8 @@ cs: label_relation_new: Nová souvislost label_relation_delete: Odstranit souvislost label_relates_to: související s - label_duplicates: duplicity + label_duplicates: duplikuje + label_duplicated_by: zduplikován label_blocks: blokuje label_blocked_by: zablokován label_precedes: předchází @@ -561,6 +708,8 @@ cs: label_board: Fórum label_board_new: Nové fórum label_board_plural: Fóra + label_board_locked: Uzamčeno + label_board_sticky: Nálepka label_topic_plural: Témata label_message_plural: Zprávy label_message_last: Poslední zpráva @@ -576,9 +725,12 @@ cs: label_language_based: Podle výchozího jazyku label_sort_by: "Seřadit podle %{value}" label_send_test_email: Poslat testovací email + label_feeds_access_key: Přístupový klíč pro RSS + label_missing_feeds_access_key: Postrádá přístupový klíč pro RSS label_feeds_access_key_created_on: "Přístupový klíč pro RSS byl vytvořen před %{value}" label_module_plural: Moduly label_added_time_by: "Přidáno uživatelem %{author} před %{age}" + label_updated_time_by: "Aktualizováno uživatelem %{author} před %{age}" label_updated_time: "Aktualizováno před %{value}" label_jump_to_a_project: Vyberte projekt... label_file_plural: Soubory @@ -591,6 +743,10 @@ cs: label_search_titles_only: Vyhledávat pouze v názvech label_user_mail_option_all: "Pro všechny události všech mých projektů" label_user_mail_option_selected: "Pro všechny události vybraných projektů..." + label_user_mail_option_none: "Žádné události" + label_user_mail_option_only_my_events: "Jen pro věci co sleduji nebo jsem v nich zapojen" + label_user_mail_option_only_assigned: "Jen pro všeci kterým sem přiřazen" + label_user_mail_option_only_owner: "Jen pro věci které vlastním" label_user_mail_no_self_notified: "Nezasílat informace o mnou vytvořených změnách" label_registration_activation_by_email: aktivace účtu emailem label_registration_manual_activation: manuální aktivace účtu @@ -609,7 +765,41 @@ cs: label_preferences: Nastavení label_chronological_order: V chronologickém pořadí label_reverse_chronological_order: V obrácaném chronologickém pořadí - + label_planning: Plánování + label_incoming_emails: Příchozí e-maily + label_generate_key: Generovat klíč + label_issue_watchers: Sledování + label_example: Příklad + label_display: Zobrazit + label_sort: Řazení + label_ascending: Vzestupně + label_descending: Sestupně + label_date_from_to: Od %{start} do %{end} + label_wiki_content_added: Wiki stránka přidána + label_wiki_content_updated: Wiki stránka aktualizována + label_group: Skupina + label_group_plural: Skupiny + label_group_new: Nová skupina + label_time_entry_plural: Strávený čas + label_version_sharing_none: Nesdíleno + label_version_sharing_descendants: S podprojekty + label_version_sharing_hierarchy: S hierarchií projektu + label_version_sharing_tree: Se stromem projektu + label_version_sharing_system: Se všemi projekty + label_update_issue_done_ratios: Aktualizovat koeficienty dokončení úkolů + label_copy_source: Zdroj + label_copy_target: Cíl + label_copy_same_as_target: Stejný jako cíl + label_display_used_statuses_only: Zobrazit pouze stavy které jsou použité touto frontou + label_api_access_key: API přístupový klíč + label_missing_api_access_key: Chybějící přístupový klíč API + label_api_access_key_created_on: API přístupový klíč vytvořen %{value} + label_profile: Profil + label_subtask_plural: Podúkol + label_project_copy_notifications: Odeslat email oznámení v průběhu kopie projektu + label_principal_search: "Hledat uživatele nebo skupinu:" + label_user_search: "Hledat uživatele:" + button_login: Přihlásit button_submit: Potvrdit button_save: Uložit @@ -617,8 +807,10 @@ cs: button_uncheck_all: Odšrtnout vše button_delete: Odstranit button_create: Vytvořit - button_test: Test + button_create_and_continue: Vytvořit a pokračovat + button_test: Testovat button_edit: Upravit + button_edit_associated_wikipage: "Upravit přiřazenou Wiki stránku: %{page_title}" button_add: Přidat button_change: Změnit button_apply: Použít @@ -629,6 +821,7 @@ cs: button_list: Vypsat button_view: Zobrazit button_move: Přesunout + button_move_and_follow: Přesunout a následovat button_back: Zpět button_cancel: Storno button_activate: Aktivovat @@ -640,24 +833,40 @@ cs: button_reply: Odpovědět button_archive: Archivovat button_unarchive: Odarchivovat - button_reset: Reset + button_reset: Resetovat button_rename: Přejmenovat button_change_password: Změnit heslo button_copy: Kopírovat + button_copy_and_follow: Kopírovat a následovat button_annotate: Komentovat button_update: Aktualizovat button_configure: Konfigurovat - + button_quote: Citovat + button_duplicate: Duplikát + button_show: Zobrazit + status_active: aktivní status_registered: registrovaný status_locked: uzamčený - + + version_status_open: otevřený + version_status_locked: uzamčený + version_status_closed: zavřený + + field_active: Aktivní + text_select_mail_notifications: Vyberte akci při které bude zasláno upozornění emailem. text_regexp_info: např. ^[A-Z0-9]+$ text_min_max_length_info: 0 znamená bez limitu text_project_destroy_confirmation: Jste si jisti, že chcete odstranit tento projekt a všechna související data ? + text_subprojects_destroy_warning: "Jeho podprojek(y): %{value} budou také smazány." text_workflow_edit: Vyberte roli a frontu k editaci průběhu práce text_are_you_sure: Jste si jisti? + text_are_you_sure_with_children: Smazat úkol včetně všech podúkolů? + text_journal_changed: "%{label} změněn z %{old} na %{new}" + text_journal_set_to: "%{label} nastaven na %{value}" + text_journal_deleted: "%{label} smazán (%{old})" + text_journal_added: "%{label} %{value} přidán" text_tip_issue_begin_day: úkol začíná v tento den text_tip_issue_end_day: úkol končí v tento den text_tip_issue_begin_end_day: úkol začíná a končí v tento den @@ -668,6 +877,7 @@ cs: text_tracker_no_workflow: Pro tuto frontu není definován žádný průběh práce text_unallowed_characters: Nepovolené znaky text_comma_separated: Povoleno více hodnot (oddělěné čárkou). + text_line_separated: Více hodnot povoleno (jeden řádek pro každou hodnotu). text_issues_ref_in_commit_messages: Odkazování a opravování úkolů ve zprávách commitů text_issue_added: "Úkol %{id} byl vytvořen uživatelem %{author}." text_issue_updated: "Úkol %{id} byl aktualizován uživatelem %{author}." @@ -679,16 +889,32 @@ cs: text_no_configuration_data: "Role, fronty, stavy úkolů ani průběh práce nebyly zatím nakonfigurovány.\nVelice doporučujeme nahrát výchozí konfiguraci. Po té si můžete vše upravit" text_load_default_configuration: Nahrát výchozí konfiguraci text_status_changed_by_changeset: "Použito v changesetu %{value}." + text_time_logged_by_changeset: Aplikováno v changesetu %{value}. text_issues_destroy_confirmation: 'Opravdu si přejete odstranit všechny zvolené úkoly?' text_select_project_modules: 'Aktivní moduly v tomto projektu:' text_default_administrator_account_changed: Výchozí nastavení administrátorského účtu změněno text_file_repository_writable: Povolen zápis do adresáře ukládání souborů + text_plugin_assets_writable: Možnost zápisu do adresáře plugin assets text_rmagick_available: RMagick k dispozici (volitelné) text_destroy_time_entries_question: "U úkolů, které chcete odstranit je evidováno %{hours} práce. Co chete udělat?" text_destroy_time_entries: Odstranit evidované hodiny. text_assign_time_entries_to_project: Přiřadit evidované hodiny projektu text_reassign_time_entries: 'Přeřadit evidované hodiny k tomuto úkolu:' - + text_user_wrote: "%{value} napsal:" + text_enumeration_destroy_question: "Několik (%{count}) objektů je přiřazeno k této hodnotě." + text_enumeration_category_reassign_to: 'Přeřadit je do této:' + text_email_delivery_not_configured: "Doručování e-mailů není nastaveno a odesílání notifikací je zakázáno.\nNastavte Váš SMTP server v souboru config/email.yml a restartujte aplikaci." + text_repository_usernames_mapping: "Vybrat nebo upravit mapování mezi Redmine uživateli a uživatelskými jmény nalezenými v logu repozitáře.\nUživatelé se shodným Redmine uživatelským jménem a uživatelským jménem v repozitáři jsou mapovaní automaticky." + text_diff_truncated: '... Rozdílový soubor je zkrácen, protože jeho délka přesahuje max. limit.' + text_custom_field_possible_values_info: 'Každá hodnota na novém řádku' + text_wiki_page_destroy_question: Tato stránka má %{descendants} podstránek a potomků. Co chcete udělat? + text_wiki_page_nullify_children: Ponechat podstránky jako kořenové stránky + text_wiki_page_destroy_children: Smazat podstránky a všechny jejich potomky + text_wiki_page_reassign_children: Přiřadit podstránky k tomuto rodiči + text_own_membership_delete_confirmation: "Chystáte se odebrat si některá nebo všechny svá oprávnění a potom již nemusíte být schopni upravit tento projekt.\nOpravdu chcete pokračovat?" + text_zoom_in: Přiblížit + text_zoom_out: Oddálit + default_role_manager: Manažer default_role_developer: Vývojář default_role_reporter: Reportér @@ -712,7 +938,7 @@ cs: default_priority_immediate: Okamžitá default_activity_design: Návhr default_activity_development: Vývoj - + enumeration_issue_priorities: Priority úkolů enumeration_doc_categories: Kategorie dokumentů enumeration_activities: Aktivity (sledování času) @@ -878,7 +1104,7 @@ cs: label_display_used_statuses_only: Zobrazit pouze stavy které jsou použité touto frontou label_revision_id: Revize %{value} label_api_access_key: API přístupový klíč - label_api_access_key_created_on: API přístupový klíč vytvořen %{value} + label_api_access_key_created_on: API přístupový klíč vytvořen %{value} label_feeds_access_key: RSS přístupový klíč notice_api_access_key_reseted: Váš API přístupový klíč byl resetován. setting_rest_api_enabled: Zapnout službu REST @@ -946,3 +1172,18 @@ cs: label_cvs_path: CVSROOT label_git_path: Path to .git directory label_mercurial_path: Root directory + label_my_queries: My custom queries + label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee + text_journal_changed_no_detail: "%{label} updated" + button_expand_all: Expand all + button_collapse_all: Collapse all + label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author + field_effective_date: Due date + label_news_comment_added: Comment added to a news + field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text + text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page. + text_default_encoding: "Default: UTF-8" + text_git_repo_example: a bare and local repository (e.g. /gitrepo, c:\gitrepo) + label_notify_member_plural: Email issue updates + label_path_encoding: Path encoding + text_mercurial_repo_example: local repository (e.g. /hgrepo, c:\hgrepo) diff --git a/config/locales/da.yml b/config/locales/da.yml index 758ff93c..990036c7 100644 --- a/config/locales/da.yml +++ b/config/locales/da.yml @@ -14,7 +14,10 @@ da: abbr_day_names: [sø, ma, ti, 'on', to, fr, lø] month_names: [~, januar, februar, marts, april, maj, juni, juli, august, september, oktober, november, december] abbr_month_names: [~, jan, feb, mar, apr, maj, jun, jul, aug, sep, okt, nov, dec] - order: [ :day, :month, :year ] + order: + - :day + - :month + - :year time: formats: @@ -86,7 +89,7 @@ da: # precision: human: format: - # separator: + # separator: delimiter: "" precision: 1 storage_units: @@ -141,9 +144,9 @@ da: one: "En fejl forhindrede %{model} i at blive gemt" other: "%{count} fejl forhindrede denne %{model} i at blive gemt" body: "Der var problemer med følgende felter:" - + actionview_instancetag_blank_option: Vælg venligst - + general_text_No: 'Nej' general_text_Yes: 'Ja' general_text_no: 'nej' @@ -153,7 +156,7 @@ da: general_csv_encoding: ISO-8859-1 general_pdf_encoding: ISO-8859-1 general_first_day_of_week: '1' - + notice_account_updated: Kontoen er opdateret. notice_account_invalid_creditentials: Ugyldig bruger og/eller kodeord notice_account_password_updated: Kodeordet er opdateret. @@ -177,11 +180,11 @@ da: notice_no_issue_selected: "Ingen sag er valgt! Vælg venligst hvilke emner du vil rette." notice_account_pending: "Din konto er oprettet, og afventer administrators godkendelse." notice_default_data_loaded: Standardopsætningen er indlæst. - + error_can_t_load_default_data: "Standardopsætning kunne ikke indlæses: %{value}" error_scm_not_found: "Adgang nægtet og/eller revision blev ikke fundet i det valgte repository." error_scm_command_failed: "En fejl opstod under forbindelsen til det valgte repository: %{value}" - + mail_subject_lost_password: "Dit %{value} kodeord" mail_body_lost_password: 'For at ændre dit kodeord, klik på dette link:' mail_subject_register: "%{value} kontoaktivering" @@ -190,10 +193,10 @@ da: mail_body_account_information: Din kontoinformation mail_subject_account_activation_request: "%{value} kontoaktivering" mail_body_account_activation_request: "En ny bruger (%{value}) er registreret. Godkend venligst kontoen:" - + gui_validation_error: 1 fejl gui_validation_error_plural: "%{count} fejl" - + field_name: Navn field_description: Beskrivelse field_summary: Sammenfatning @@ -239,7 +242,6 @@ da: field_admin: Administrator field_last_login_on: Sidste forbindelse field_language: Sprog - field_effective_date: Dato field_password: Kodeord field_new_password: Nyt kodeord field_password_confirmation: Bekræft @@ -255,7 +257,7 @@ da: field_attr_mail: Email attribut field_onthefly: løbende brugeroprettelse field_start_date: Start date - field_done_ratio: % Færdig + field_done_ratio: "% Færdig" field_auth_source: Sikkerhedsmetode field_hide_mail: Skjul min email field_comments: Kommentar @@ -276,7 +278,7 @@ da: field_time_zone: Tidszone field_searchable: Søgbar field_default_value: Standardværdi - + setting_app_title: Applikationstitel setting_app_subtitle: Applikationsundertekst setting_welcome_text: Velkomsttekst @@ -304,7 +306,7 @@ da: setting_emails_footer: Email-fodnote setting_protocol: Protokol setting_user_format: Brugervisningsformat - + project_module_issue_tracking: Sagssøgning project_module_time_tracking: Tidsstyring project_module_news: Nyheder @@ -313,7 +315,7 @@ da: project_module_wiki: Wiki project_module_repository: Repository project_module_boards: Fora - + label_user: Bruger label_user_plural: Brugere label_user_new: Ny bruger @@ -611,7 +613,7 @@ da: label_plugins: Plugins label_ldap_authentication: LDAP-godkendelse label_downloads_abbr: D/L - + button_login: Login button_submit: Send button_save: Gem @@ -649,11 +651,11 @@ da: button_annotate: Annotér button_update: Opdatér button_configure: Konfigurér - + status_active: aktiv status_registered: registreret status_locked: låst - + text_select_mail_notifications: Vælg handlinger der skal sendes email besked for. text_regexp_info: f.eks. ^[A-ZÆØÅ0-9]+$ text_min_max_length_info: 0 betyder ingen begrænsninger @@ -686,7 +688,7 @@ da: text_default_administrator_account_changed: Standard administratorkonto ændret text_file_repository_writable: Filarkiv er skrivbar text_rmagick_available: RMagick tilgængelig (valgfri) - + default_role_manager: Leder default_role_developer: Udvikler default_role_reporter: Rapportør @@ -710,11 +712,11 @@ da: default_priority_immediate: Omgående default_activity_design: Design default_activity_development: Udvikling - + enumeration_issue_priorities: Sagsprioriteter enumeration_doc_categories: Dokumentkategorier enumeration_activities: Aktiviteter (tidsstyring) - + label_add_another_file: Tilføj endnu en fil label_chronological_order: I kronologisk rækkefølge setting_activity_days_default: Antal dage der vises under projektaktivitet @@ -783,7 +785,7 @@ da: permission_add_messages: Opret beskeder permission_edit_issue_notes: Redigér noter permission_manage_news: Administrér nyheder - text_plugin_assets_writable: Der er skriverettigheder til plugin assets folderen + text_plugin_assets_writable: Der er skriverettigheder til plugin assets folderen label_display: Vis label_and_its_subprojects: "%{value} og dets underprojekter" permission_view_calendar: Se kalender @@ -962,3 +964,18 @@ da: label_cvs_path: CVSROOT label_git_path: Path to .git directory label_mercurial_path: Root directory + label_my_queries: My custom queries + label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee + text_journal_changed_no_detail: "%{label} updated" + button_expand_all: Expand all + button_collapse_all: Collapse all + label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author + field_effective_date: Due date + label_news_comment_added: Comment added to a news + field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text + text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page. + text_default_encoding: "Default: UTF-8" + text_git_repo_example: a bare and local repository (e.g. /gitrepo, c:\gitrepo) + label_notify_member_plural: Email issue updates + label_path_encoding: Path encoding + text_mercurial_repo_example: local repository (e.g. /hgrepo, c:\hgrepo) diff --git a/config/locales/de.yml b/config/locales/de.yml index 6be4d0a7..f252aef7 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -19,7 +19,10 @@ de: month_names: [~, Januar, Februar, März, April, Mai, Juni, Juli, August, September, Oktober, November, Dezember] abbr_month_names: [~, Jan, Feb, Mär, Apr, Mai, Jun, Jul, Aug, Sep, Okt, Nov, Dez] # Used in date_select and datime_select. - order: [:day, :month, :year] + order: + - :day + - :month + - :year time: formats: @@ -101,13 +104,13 @@ de: gb: "GB" tb: "TB" - + # Used in array.to_sentence. support: array: sentence_connector: "und" skip_last_comma: true - + activerecord: errors: template: @@ -143,7 +146,7 @@ de: cant_link_an_issue_with_a_descendant: "Ein Ticket kann nicht mit einer ihrer Unteraufgaben verlinkt werden" actionview_instancetag_blank_option: Bitte auswählen - + general_text_No: 'Nein' general_text_Yes: 'Ja' general_text_no: 'nein' @@ -202,7 +205,7 @@ de: error_unable_delete_issue_status: "Der Ticket-Status konnte nicht gelöscht werden." error_unable_to_connect: Fehler beim Verbinden (%{value}) warning_attachments_not_saved: "%{count} Datei(en) konnten nicht gespeichert werden." - + mail_subject_lost_password: "Ihr %{value} Kennwort" mail_body_lost_password: 'Benutzen Sie den folgenden Link, um Ihr Kennwort zu ändern:' mail_subject_register: "%{value} Kontoaktivierung" @@ -267,7 +270,6 @@ de: field_admin: Administrator field_last_login_on: Letzte Anmeldung field_language: Sprache - field_effective_date: Datum field_password: Kennwort field_new_password: Neues Kennwort field_password_confirmation: Bestätigung @@ -283,7 +285,7 @@ de: field_attr_mail: E-Mail-Attribut field_onthefly: On-the-fly-Benutzererstellung field_start_date: Beginn - field_done_ratio: % erledigt + field_done_ratio: "% erledigt" field_auth_source: Authentifizierungs-Modus field_hide_mail: E-Mail-Adresse nicht anzeigen field_comments: Kommentar @@ -435,7 +437,7 @@ de: project_module_boards: Foren project_module_calendar: Kalender project_module_gantt: Gantt - + label_user: Benutzer label_user_plural: Benutzer label_user_new: Neuer Benutzer @@ -795,7 +797,7 @@ de: label_project_copy_notifications: Sende Mailbenachrichtigungen beim Kopieren des Projekts. label_principal_search: "Nach Benutzer oder Gruppe suchen:" label_user_search: "Nach Benutzer suchen:" - + button_login: Anmelden button_submit: OK button_save: Speichern @@ -840,17 +842,17 @@ de: button_quote: Zitieren button_duplicate: Duplizieren button_show: Anzeigen - + status_active: aktiv status_registered: angemeldet status_locked: gesperrt - + version_status_open: offen version_status_locked: gesperrt version_status_closed: abgeschlossen field_active: Aktiv - + text_select_mail_notifications: Bitte wählen Sie die Aktionen aus, für die eine Mailbenachrichtigung gesendet werden soll. text_regexp_info: z. B. ^[A-Z0-9]+$ text_min_max_length_info: 0 heißt keine Beschränkung @@ -909,7 +911,7 @@ de: text_own_membership_delete_confirmation: "Sie sind dabei, einige oder alle Ihre Berechtigungen zu entfernen. Es ist möglich, dass Sie danach das Projekt nicht mehr ansehen oder bearbeiten dürfen.\nSind Sie sicher, dass Sie dies tun möchten?" text_zoom_in: Zoom in text_zoom_out: Zoom out - + default_role_manager: Manager default_role_developer: Entwickler default_role_reporter: Reporter @@ -933,7 +935,7 @@ de: default_priority_immediate: Sofort default_activity_design: Design default_activity_development: Entwicklung - + enumeration_issue_priorities: Ticket-Prioritäten enumeration_doc_categories: Dokumentenkategorien enumeration_activities: Aktivitäten (Zeiterfassung) @@ -963,3 +965,18 @@ de: label_cvs_path: CVSROOT label_git_path: Path to .git directory label_mercurial_path: Root directory + label_my_queries: My custom queries + label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee + text_journal_changed_no_detail: "%{label} updated" + button_expand_all: Expand all + button_collapse_all: Collapse all + label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author + field_effective_date: Due date + label_news_comment_added: Comment added to a news + field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text + text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page. + text_default_encoding: "Default: UTF-8" + text_git_repo_example: a bare and local repository (e.g. /gitrepo, c:\gitrepo) + label_notify_member_plural: Email issue updates + label_path_encoding: Path encoding + text_mercurial_repo_example: local repository (e.g. /hgrepo, c:\hgrepo) diff --git a/config/locales/el.yml b/config/locales/el.yml index d9fe2b6a..d0ab0d10 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -11,15 +11,18 @@ el: default: "%m/%d/%Y" short: "%b %d" long: "%B %d, %Y" - + day_names: [Κυριακή, Δευτέρα, Τρίτη, Τετάρτη, Πέμπτη, Παρασκευή, Σάββατο] abbr_day_names: [Κυρ, Δευ, Τρι, Τετ, Πεμ, Παρ, Σαβ] - + # Don't forget the nil at the beginning; there's no such thing as a 0th month month_names: [~, Ιανουάριος, Φεβρουάριος, Μάρτιος, Απρίλιος, Μάϊος, Ιούνιος, Ιούλιος, Αύγουστος, Σεπτέμβριος, Οκτώβριος, Νοέμβριος, Δεκέμβριος] abbr_month_names: [~, Ιαν, Φεβ, Μαρ, Απρ, Μαϊ, Ιον, Ιολ, Αυγ, Σεπ, Οκτ, Νοε, Δεκ] # Used in date_select and datime_select. - order: [ :year, :month, :day ] + order: + - :year + - :month + - :day time: formats: @@ -29,7 +32,7 @@ el: long: "%B %d, %Y %H:%M" am: "πμ" pm: "μμ" - + datetime: distance_in_words: half_a_minute: "μισό λεπτό" @@ -66,23 +69,23 @@ el: almost_x_years: one: "almost 1 year" other: "almost %{count} years" - + number: format: separator: "." delimiter: "" precision: 3 - human: - format: + human: + format: precision: 1 delimiter: "" - storage_units: + storage_units: format: "%n %u" - units: + units: kb: KB tb: TB gb: GB - byte: + byte: one: Byte other: Bytes mb: MB @@ -92,7 +95,7 @@ el: array: sentence_connector: "and" skip_last_comma: false - + activerecord: errors: template: @@ -126,7 +129,7 @@ el: cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks" actionview_instancetag_blank_option: Παρακαλώ επιλέξτε - + general_text_No: 'Όχι' general_text_Yes: 'Ναι' general_text_no: 'όχι' @@ -137,7 +140,7 @@ el: general_csv_encoding: UTF-8 general_pdf_encoding: UTF-8 general_first_day_of_week: '7' - + notice_account_updated: Ο λογαριασμός ενημερώθηκε επιτυχώς. notice_account_invalid_creditentials: Άκυρο όνομα χρήστη ή κωδικού πρόσβασης notice_account_password_updated: Ο κωδικός πρόσβασης ενημερώθηκε επιτυχώς. @@ -151,7 +154,7 @@ el: notice_successful_update: Επιτυχής ενημέρωση. notice_successful_delete: Επιτυχής διαγραφή. notice_successful_connection: Επιτυχής σύνδεση. - notice_file_not_found: Η σελίδα που ζητήσατε δεν υπάρχει ή έχει αφαιρεθεί. + notice_file_not_found: Η σελίδα που ζητήσατε δεν υπάρχει ή έχει αφαιρεθεί. notice_locking_conflict: Τα δεδομένα έχουν ενημερωθεί από άλλο χρήστη. notice_not_authorized: Δεν έχετε δικαίωμα πρόσβασης σε αυτή τη σελίδα. notice_email_sent: "Ένα μήνυμα ηλεκτρονικού ταχυδρομείου εστάλη στο %{value}" @@ -162,7 +165,7 @@ el: notice_account_pending: "Ο λογαριασμός σας έχει δημιουργηθεί και είναι σε στάδιο έγκρισης από τον διαχειριστή." notice_default_data_loaded: Οι προεπιλεγμένες ρυθμίσεις φορτώθηκαν επιτυχώς. notice_unable_delete_version: Αδύνατον να διαγραφεί η έκδοση. - + error_can_t_load_default_data: "Οι προεπιλεγμένες ρυθμίσεις δεν μπόρεσαν να φορτωθούν:: %{value}" error_scm_not_found: "Η εγγραφή ή η αναθεώρηση δεν βρέθηκε στο αποθετήριο." error_scm_command_failed: "Παρουσιάστηκε σφάλμα κατά την προσπάθεια πρόσβασης στο αποθετήριο: %{value}" @@ -170,9 +173,9 @@ el: error_issue_not_found_in_project: 'Το θέμα δεν βρέθηκε ή δεν ανήκει σε αυτό το έργο' error_no_tracker_in_project: 'Δεν υπάρχει ανιχνευτής για αυτό το έργο. Παρακαλώ ελέγξτε τις ρυθμίσεις του έργου.' error_no_default_issue_status: 'Δεν έχει οριστεί η προεπιλογή κατάστασης θεμάτων. Παρακαλώ ελέγξτε τις ρυθμίσεις σας (Μεταβείτε στην "Διαχείριση -> Κατάσταση θεμάτων").' - + warning_attachments_not_saved: "%{count} αρχείο(α) δε μπορούν να αποθηκευτούν." - + mail_subject_lost_password: "Ο κωδικός σας %{value}" mail_body_lost_password: 'Για να αλλάξετε τον κωδικό πρόσβασης, πατήστε τον ακόλουθο σύνδεσμο:' mail_subject_register: "Ενεργοποίηση του λογαριασμού χρήστη %{value} " @@ -187,10 +190,10 @@ el: mail_body_wiki_content_added: "Η σελίδα wiki '%{id}' προστέθηκε από τον %{author}." mail_subject_wiki_content_updated: "'ενημερώθηκε η σελίδα wiki %{id}' " mail_body_wiki_content_updated: "Η σελίδα wiki '%{id}' ενημερώθηκε από τον %{author}." - + gui_validation_error: 1 σφάλμα gui_validation_error_plural: "%{count} σφάλματα" - + field_name: Όνομα field_description: Περιγραφή field_summary: Συνοπτικά @@ -236,7 +239,6 @@ el: field_admin: Διαχειριστής field_last_login_on: Τελευταία σύνδεση field_language: Γλώσσα - field_effective_date: Ημερομηνία field_password: Κωδικός πρόσβασης field_new_password: Νέος κωδικός πρόσβασης field_password_confirmation: Επιβεβαίωση @@ -252,7 +254,7 @@ el: field_attr_mail: Ιδιότητα email field_onthefly: Άμεση δημιουργία χρήστη field_start_date: Εκκίνηση - field_done_ratio: % επιτεύχθη + field_done_ratio: "% επιτεύχθη" field_auth_source: Τρόπος πιστοποίησης field_hide_mail: Απόκρυψη διεύθυνσης email field_comments: Σχόλιο @@ -279,8 +281,8 @@ el: field_watcher: Παρατηρητής field_identity_url: OpenID URL field_content: Περιεχόμενο - field_group_by: Ομαδικά αποτελέσματα από - + field_group_by: Ομαδικά αποτελέσματα από + setting_app_title: Τίτλος εφαρμογής setting_app_subtitle: Υπότιτλος εφαρμογής setting_welcome_text: Κείμενο υποδοχής @@ -296,7 +298,7 @@ el: setting_text_formatting: Μορφοποίηση κειμένου setting_wiki_compression: Συμπίεση ιστορικού wiki setting_feeds_limit: Feed περιορισμού περιεχομένου - setting_default_projects_public: Τα νέα έργα έχουν προεπιλεγεί ως δημόσια + setting_default_projects_public: Τα νέα έργα έχουν προεπιλεγεί ως δημόσια setting_autofetch_changesets: Αυτόματη λήψη commits setting_sys_api_enabled: Ενεργοποίηση WS για διαχείριση αποθετηρίου setting_commit_ref_keywords: Αναφορά σε λέξεις-κλειδιά @@ -313,7 +315,7 @@ el: setting_per_page_options: Αντικείμενα ανά σελίδα επιλογών setting_user_format: Μορφή εμφάνισης χρηστών setting_activity_days_default: Ημέρες που εμφανίζεται στη δραστηριότητα έργου - setting_display_subprojects_issues: Εμφάνιση από προεπιλογή θεμάτων επιμέρους έργων στα κύρια έργα + setting_display_subprojects_issues: Εμφάνιση από προεπιλογή θεμάτων επιμέρους έργων στα κύρια έργα setting_enabled_scm: Ενεργοποίηση SCM setting_mail_handler_api_enabled: Ενεργοποίηση WS για εισερχόμενα email setting_mail_handler_api_key: κλειδί API @@ -325,7 +327,7 @@ el: setting_openid: Επιτρέψτε συνδέσεις OpenID και εγγραφή setting_password_min_length: Ελάχιστο μήκος κωδικού πρόσβασης setting_new_project_user_role_id: Απόδοση ρόλου σε χρήστη μη-διαχειριστή όταν δημιουργεί ένα έργο - + permission_add_project: Δημιουργία έργου permission_edit_project: Επεξεργασία έργου permission_select_project_modules: Επιλογή μονάδων έργου @@ -348,7 +350,7 @@ el: permission_add_issue_watchers: Προσθήκη παρατηρητών permission_log_time: Ιστορικό χρόνου που δαπανήθηκε permission_view_time_entries: Προβολή χρόνου που δαπανήθηκε - permission_edit_time_entries: Επεξεργασία ιστορικού χρόνου + permission_edit_time_entries: Επεξεργασία ιστορικού χρόνου permission_edit_own_time_entries: Επεξεργασία δικού μου ιστορικού χρόνου permission_manage_news: Διαχείριση νέων permission_comment_news: Σχολιασμός νέων @@ -375,7 +377,7 @@ el: permission_edit_own_messages: Επεξεργασία δικών μου μηνυμάτων permission_delete_messages: Διαγραφή μηνυμάτων permission_delete_own_messages: Διαγραφή δικών μου μηνυμάτων - + project_module_issue_tracking: Ανίχνευση θεμάτων project_module_time_tracking: Ανίχνευση χρόνου project_module_news: Νέα @@ -384,7 +386,7 @@ el: project_module_wiki: Wiki project_module_repository: Αποθετήριο project_module_boards: Πίνακες συζητήσεων - + label_user: Χρήστης label_user_plural: Χρήστες label_user_new: Νέος Χρήστης @@ -447,7 +449,7 @@ el: label_reported_issues: Εισηγμένα θέματα label_assigned_to_me_issues: Θέματα που έχουν ανατεθεί σε μένα label_last_login: Τελευταία σύνδεση - label_registered_on: Εγγράφηκε την + label_registered_on: Εγγράφηκε την label_activity: Δραστηριότητα label_overall_activity: Συνολική δραστηριότητα label_user_activity: "δραστηριότητα του %{value}" @@ -576,7 +578,7 @@ el: label_modification: "%{count} τροποποίηση" label_modification_plural: "%{count} τροποποιήσεις" label_branch: Branch - label_tag: Tag + label_tag: Tag label_revision: Αναθεώρηση label_revision_plural: Αναθεωρήσεις label_associated_revisions: Συνεταιρικές αναθεωρήσεις @@ -712,7 +714,7 @@ el: label_date_from_to: Από %{start} έως %{end} label_wiki_content_added: Η σελίδα Wiki προστέθηκε label_wiki_content_updated: Η σελίδα Wiki ενημερώθηκε - + button_login: Σύνδεση button_submit: Αποστολή button_save: Αποθήκευση @@ -752,11 +754,11 @@ el: button_update: Ενημέρωση button_configure: Ρύθμιση button_quote: Παράθεση - + status_active: ενεργό(ς)/ή status_registered: εγεγγραμμένο(ς)/η status_locked: κλειδωμένο(ς)/η - + text_select_mail_notifications: Επιλογή ενεργειών για τις οποίες θα πρέπει να αποσταλεί ειδοποίηση με email. text_regexp_info: eg. ^[A-Z0-9]+$ text_min_max_length_info: 0 σημαίνει ότι δεν υπάρχουν περιορισμοί @@ -806,7 +808,7 @@ el: text_wiki_page_nullify_children: "Διατηρήστε τις σελίδες τέκνων ως σελίδες root" text_wiki_page_destroy_children: "Διαγράψτε όλες τις σελίδες τέκνων και των απογόνων τους" text_wiki_page_reassign_children: "Επανεκχώριση των σελίδων τέκνων στη γονική σελίδα" - + default_role_manager: Manager default_role_developer: Developer default_role_reporter: Reporter @@ -830,7 +832,7 @@ el: default_priority_immediate: Άμεση default_activity_design: Σχεδιασμός default_activity_development: Ανάπτυξη - + enumeration_issue_priorities: Προτεραιότητα θέματος enumeration_doc_categories: Κατηγορία εγγράφων enumeration_activities: Δραστηριότητες (κατακερματισμός χρόνου) @@ -946,3 +948,18 @@ el: label_cvs_path: CVSROOT label_git_path: Path to .git directory label_mercurial_path: Root directory + label_my_queries: My custom queries + label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee + text_journal_changed_no_detail: "%{label} updated" + button_expand_all: Expand all + button_collapse_all: Collapse all + label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author + field_effective_date: Due date + label_news_comment_added: Comment added to a news + field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text + text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page. + text_default_encoding: "Default: UTF-8" + text_git_repo_example: a bare and local repository (e.g. /gitrepo, c:\gitrepo) + label_notify_member_plural: Email issue updates + label_path_encoding: Path encoding + text_mercurial_repo_example: local repository (e.g. /hgrepo, c:\hgrepo) diff --git a/config/locales/en-GB.yml b/config/locales/en-GB.yml index ef00034a..2da33ba2 100644 --- a/config/locales/en-GB.yml +++ b/config/locales/en-GB.yml @@ -1,948 +1,958 @@ -en-GB: - direction: ltr - date: - formats: - # Use the strftime parameters for formats. - # When no format has been given, it uses default. - # You can provide other formats here if you like! - default: "%d/%m/%Y" - short: "%d %b" - long: "%d %B, %Y" - - day_names: [Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday] - abbr_day_names: [Sun, Mon, Tue, Wed, Thu, Fri, Sat] - - # Don't forget the nil at the beginning; there's no such thing as a 0th month - month_names: [~, January, February, March, April, May, June, July, August, September, October, November, December] - abbr_month_names: [~, Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec] - # Used in date_select and datime_select. - order: [ :year, :month, :day ] - - time: - formats: - default: "%d/%m/%Y %I:%M %p" - time: "%I:%M %p" - short: "%d %b %H:%M" - long: "%d %B, %Y %H:%M" - am: "am" - pm: "pm" - - datetime: - distance_in_words: - half_a_minute: "half a minute" - less_than_x_seconds: - one: "less than 1 second" - other: "less than %{count} seconds" - x_seconds: - one: "1 second" - other: "%{count} seconds" - less_than_x_minutes: - one: "less than a minute" - other: "less than %{count} minutes" - x_minutes: - one: "1 minute" - other: "%{count} minutes" - about_x_hours: - one: "about 1 hour" - other: "about %{count} hours" - x_days: - one: "1 day" - other: "%{count} days" - about_x_months: - one: "about 1 month" - other: "about %{count} months" - x_months: - one: "1 month" - other: "%{count} months" - about_x_years: - one: "about 1 year" - other: "about %{count} years" - over_x_years: - one: "over 1 year" - other: "over %{count} years" - almost_x_years: - one: "almost 1 year" - other: "almost %{count} years" - - number: - format: - separator: "." - delimiter: " " - precision: 3 - - currency: - format: - format: "%u%n" - unit: "£" - human: - format: - delimiter: "" - precision: 1 - storage_units: - format: "%n %u" - units: - byte: - one: "Byte" - other: "Bytes" - kb: "kB" - mb: "MB" - gb: "GB" - tb: "TB" - - -# Used in array.to_sentence. - support: - array: - sentence_connector: "and" - skip_last_comma: false - - activerecord: - errors: - template: - header: - one: "1 error prohibited this %{model} from being saved" - other: "%{count} errors prohibited this %{model} from being saved" - messages: - inclusion: "is not included in the list" - exclusion: "is reserved" - invalid: "is invalid" - confirmation: "doesn't match confirmation" - accepted: "must be accepted" - empty: "can't be empty" - blank: "can't be blank" - too_long: "is too long (maximum is %{count} characters)" - too_short: "is too short (minimum is %{count} characters)" - wrong_length: "is the wrong length (should be %{count} characters)" - taken: "has already been taken" - not_a_number: "is not a number" - not_a_date: "is not a valid date" - greater_than: "must be greater than %{count}" - greater_than_or_equal_to: "must be greater than or equal to %{count}" - equal_to: "must be equal to %{count}" - less_than: "must be less than %{count}" - less_than_or_equal_to: "must be less than or equal to %{count}" - odd: "must be odd" - even: "must be even" - greater_than_start_date: "must be greater than start date" - not_same_project: "doesn't belong to the same project" - circular_dependency: "This relation would create a circular dependency" - cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks" - - actionview_instancetag_blank_option: Please select - - general_text_No: 'No' - general_text_Yes: 'Yes' - general_text_no: 'no' - general_text_yes: 'yes' - general_lang_name: 'English (British)' - general_csv_separator: ',' - general_csv_decimal_separator: '.' - general_csv_encoding: ISO-8859-1 - general_pdf_encoding: ISO-8859-1 - general_first_day_of_week: '1' - - notice_account_updated: Account was successfully updated. - notice_account_invalid_creditentials: Invalid user or password - notice_account_password_updated: Password was successfully updated. - notice_account_wrong_password: Wrong password - notice_account_register_done: Account was successfully created. To activate your account, click on the link that was emailed to you. - notice_account_unknown_email: Unknown user. - notice_can_t_change_password: This account uses an external authentication source. Impossible to change the password. - notice_account_lost_email_sent: An email with instructions to choose a new password has been sent to you. - notice_account_activated: Your account has been activated. You can now log in. - notice_successful_create: Successful creation. - notice_successful_update: Successful update. - notice_successful_delete: Successful deletion. - notice_successful_connection: Successful connection. - notice_file_not_found: The page you were trying to access doesn't exist or has been removed. - notice_locking_conflict: Data has been updated by another user. - notice_not_authorized: You are not authorised to access this page. - notice_email_sent: "An email was sent to %{value}" - notice_email_error: "An error occurred while sending mail (%{value})" - notice_feeds_access_key_reseted: Your RSS access key was reset. - notice_api_access_key_reseted: Your API access key was reset. - notice_failed_to_save_issues: "Failed to save %{count} issue(s) on %{total} selected: %{ids}." - notice_no_issue_selected: "No issue is selected! Please, check the issues you want to edit." - notice_account_pending: "Your account was created and is now pending administrator approval." - notice_default_data_loaded: Default configuration successfully loaded. - notice_unable_delete_version: Unable to delete version. - notice_issue_done_ratios_updated: Issue done ratios updated. - - error_can_t_load_default_data: "Default configuration could not be loaded: %{value}" - error_scm_not_found: "The entry or revision was not found in the repository." - error_scm_command_failed: "An error occurred when trying to access the repository: %{value}" - error_scm_annotate: "The entry does not exist or can not be annotated." - error_issue_not_found_in_project: 'The issue was not found or does not belong to this project' - error_no_tracker_in_project: 'No tracker is associated to this project. Please check the Project settings.' - error_no_default_issue_status: 'No default issue status is defined. Please check your configuration (Go to "Administration -> Issue statuses").' - error_can_not_reopen_issue_on_closed_version: 'An issue assigned to a closed version can not be reopened' - error_can_not_archive_project: This project can not be archived - error_issue_done_ratios_not_updated: "Issue done ratios not updated." - error_workflow_copy_source: 'Please select a source tracker or role' - error_workflow_copy_target: 'Please select target tracker(s) and role(s)' - - warning_attachments_not_saved: "%{count} file(s) could not be saved." - - mail_subject_lost_password: "Your %{value} password" - mail_body_lost_password: 'To change your password, click on the following link:' - mail_subject_register: "Your %{value} account activation" - mail_body_register: 'To activate your account, click on the following link:' - mail_body_account_information_external: "You can use your %{value} account to log in." - mail_body_account_information: Your account information - mail_subject_account_activation_request: "%{value} account activation request" - mail_body_account_activation_request: "A new user (%{value}) has registered. The account is pending your approval:" - mail_subject_reminder: "%{count} issue(s) due in the next %{days} days" - mail_body_reminder: "%{count} issue(s) that are assigned to you are due in the next %{days} days:" - mail_subject_wiki_content_added: "'%{id}' wiki page has been added" - mail_body_wiki_content_added: "The '%{id}' wiki page has been added by %{author}." - mail_subject_wiki_content_updated: "'%{id}' wiki page has been updated" - mail_body_wiki_content_updated: "The '%{id}' wiki page has been updated by %{author}." - - gui_validation_error: 1 error - gui_validation_error_plural: "%{count} errors" - - field_name: Name - field_description: Description - field_summary: Summary - field_is_required: Required - field_firstname: Firstname - field_lastname: Lastname - field_mail: Email - field_filename: File - field_filesize: Size - field_downloads: Downloads - field_author: Author - field_created_on: Created - field_updated_on: Updated - field_field_format: Format - field_is_for_all: For all projects - field_possible_values: Possible values - field_regexp: Regular expression - field_min_length: Minimum length - field_max_length: Maximum length - field_value: Value - field_category: Category - field_title: Title - field_project: Project - field_issue: Issue - field_status: Status - field_notes: Notes - field_is_closed: Issue closed - field_is_default: Default value - field_tracker: Tracker - field_subject: Subject - field_due_date: Due date - field_assigned_to: Assignee - field_priority: Priority - field_fixed_version: Target version - field_user: User - field_role: Role - field_homepage: Homepage - field_is_public: Public - field_parent: Subproject of - field_is_in_roadmap: Issues displayed in roadmap - field_login: Login - field_mail_notification: Email notifications - field_admin: Administrator - field_last_login_on: Last connection - field_language: Language - field_effective_date: Date - field_password: Password - field_new_password: New password - field_password_confirmation: Confirmation - field_version: Version - field_type: Type - field_host: Host - field_port: Port - field_account: Account - field_base_dn: Base DN - field_attr_login: Login attribute - field_attr_firstname: Firstname attribute - field_attr_lastname: Lastname attribute - field_attr_mail: Email attribute - field_onthefly: On-the-fly user creation - field_start_date: Start date - field_done_ratio: % Done - field_auth_source: Authentication mode - field_hide_mail: Hide my email address - field_comments: Comment - field_url: URL - field_start_page: Start page - field_subproject: Subproject - field_hours: Hours - field_activity: Activity - field_spent_on: Date - field_identifier: Identifier - field_is_filter: Used as a filter - field_issue_to: Related issue - field_delay: Delay - field_assignable: Issues can be assigned to this role - field_redirect_existing_links: Redirect existing links - field_estimated_hours: Estimated time - field_column_names: Columns - field_time_zone: Time zone - field_searchable: Searchable - field_default_value: Default value - field_comments_sorting: Display comments - field_parent_title: Parent page - field_editable: Editable - field_watcher: Watcher - field_identity_url: OpenID URL - field_content: Content - field_group_by: Group results by - field_sharing: Sharing - - setting_app_title: Application title - setting_app_subtitle: Application subtitle - setting_welcome_text: Welcome text - setting_default_language: Default language - setting_login_required: Authentication required - setting_self_registration: Self-registration - setting_attachment_max_size: Attachment max. size - setting_issues_export_limit: Issues export limit - setting_mail_from: Emission email address - setting_bcc_recipients: Blind carbon copy recipients (bcc) - setting_plain_text_mail: Plain text mail (no HTML) - setting_host_name: Host name and path - setting_text_formatting: Text formatting - setting_wiki_compression: Wiki history compression - setting_feeds_limit: Feed content limit - setting_default_projects_public: New projects are public by default - setting_autofetch_changesets: Autofetch commits - setting_sys_api_enabled: Enable WS for repository management - setting_commit_ref_keywords: Referencing keywords - setting_commit_fix_keywords: Fixing keywords - setting_autologin: Autologin - setting_date_format: Date format - setting_time_format: Time format - setting_cross_project_issue_relations: Allow cross-project issue relations - setting_issue_list_default_columns: Default columns displayed on the issue list - setting_repositories_encodings: Repositories encodings - setting_commit_logs_encoding: Commit messages encoding - setting_emails_footer: Emails footer - setting_protocol: Protocol - setting_per_page_options: Objects per page options - setting_user_format: Users display format - setting_activity_days_default: Days displayed on project activity - setting_display_subprojects_issues: Display subprojects issues on main projects by default - setting_enabled_scm: Enabled SCM - setting_mail_handler_body_delimiters: "Truncate emails after one of these lines" - setting_mail_handler_api_enabled: Enable WS for incoming emails - setting_mail_handler_api_key: API key - setting_sequential_project_identifiers: Generate sequential project identifiers - setting_gravatar_enabled: Use Gravatar user icons - setting_gravatar_default: Default Gravatar image - setting_diff_max_lines_displayed: Max number of diff lines displayed - setting_file_max_size_displayed: Max size of text files displayed inline - setting_repository_log_display_limit: Maximum number of revisions displayed on file log - setting_openid: Allow OpenID login and registration - setting_password_min_length: Minimum password length - setting_new_project_user_role_id: Role given to a non-admin user who creates a project - setting_default_projects_modules: Default enabled modules for new projects - setting_issue_done_ratio: Calculate the issue done ratio with - setting_issue_done_ratio_issue_field: Use the issue field - setting_issue_done_ratio_issue_status: Use the issue status - setting_start_of_week: Start calendars on - setting_rest_api_enabled: Enable REST web service - setting_cache_formatted_text: Cache formatted text - - permission_add_project: Create project - permission_add_subprojects: Create subprojects - permission_edit_project: Edit project - permission_select_project_modules: Select project modules - permission_manage_members: Manage members - permission_manage_project_activities: Manage project activities - permission_manage_versions: Manage versions - permission_manage_categories: Manage issue categories - permission_view_issues: View Issues - permission_add_issues: Add issues - permission_edit_issues: Edit issues - permission_manage_issue_relations: Manage issue relations - permission_add_issue_notes: Add notes - permission_edit_issue_notes: Edit notes - permission_edit_own_issue_notes: Edit own notes - permission_move_issues: Move issues - permission_delete_issues: Delete issues - permission_manage_public_queries: Manage public queries - permission_save_queries: Save queries - permission_view_gantt: View gantt chart - permission_view_calendar: View calendar - permission_view_issue_watchers: View watchers list - permission_add_issue_watchers: Add watchers - permission_delete_issue_watchers: Delete watchers - permission_log_time: Log spent time - permission_view_time_entries: View spent time - permission_edit_time_entries: Edit time logs - permission_edit_own_time_entries: Edit own time logs - permission_manage_news: Manage news - permission_comment_news: Comment news - permission_manage_documents: Manage documents - permission_view_documents: View documents - permission_manage_files: Manage files - permission_view_files: View files - permission_manage_wiki: Manage wiki - permission_rename_wiki_pages: Rename wiki pages - permission_delete_wiki_pages: Delete wiki pages - permission_view_wiki_pages: View wiki - permission_view_wiki_edits: View wiki history - permission_edit_wiki_pages: Edit wiki pages - permission_delete_wiki_pages_attachments: Delete attachments - permission_protect_wiki_pages: Protect wiki pages - permission_manage_repository: Manage repository - permission_browse_repository: Browse repository - permission_view_changesets: View changesets - permission_commit_access: Commit access - permission_manage_boards: Manage boards - permission_view_messages: View messages - permission_add_messages: Post messages - permission_edit_messages: Edit messages - permission_edit_own_messages: Edit own messages - permission_delete_messages: Delete messages - permission_delete_own_messages: Delete own messages - permission_export_wiki_pages: Export wiki pages - - project_module_issue_tracking: Issue tracking - project_module_time_tracking: Time tracking - project_module_news: News - project_module_documents: Documents - project_module_files: Files - project_module_wiki: Wiki - project_module_repository: Repository - project_module_boards: Boards - - label_user: User - label_user_plural: Users - label_user_new: New user - label_user_anonymous: Anonymous - label_project: Project - label_project_new: New project - label_project_plural: Projects - label_x_projects: - zero: no projects - one: 1 project - other: "%{count} projects" - label_project_all: All Projects - label_project_latest: Latest projects - label_issue: Issue - label_issue_new: New issue - label_issue_plural: Issues - label_issue_view_all: View all issues - label_issues_by: "Issues by %{value}" - label_issue_added: Issue added - label_issue_updated: Issue updated - label_document: Document - label_document_new: New document - label_document_plural: Documents - label_document_added: Document added - label_role: Role - label_role_plural: Roles - label_role_new: New role - label_role_and_permissions: Roles and permissions - label_member: Member - label_member_new: New member - label_member_plural: Members - label_tracker: Tracker - label_tracker_plural: Trackers - label_tracker_new: New tracker - label_workflow: Workflow - label_issue_status: Issue status - label_issue_status_plural: Issue statuses - label_issue_status_new: New status - label_issue_category: Issue category - label_issue_category_plural: Issue categories - label_issue_category_new: New category - label_custom_field: Custom field - label_custom_field_plural: Custom fields - label_custom_field_new: New custom field - label_enumerations: Enumerations - label_enumeration_new: New value - label_information: Information - label_information_plural: Information - label_please_login: Please log in - label_register: Register - label_login_with_open_id_option: or login with OpenID - label_password_lost: Lost password - label_home: Home - label_my_page: My page - label_my_account: My account - label_my_projects: My projects - label_administration: Administration - label_login: Sign in - label_logout: Sign out - label_help: Help - label_reported_issues: Reported issues - label_assigned_to_me_issues: Issues assigned to me - label_last_login: Last connection - label_registered_on: Registered on - label_activity: Activity - label_overall_activity: Overall activity - label_user_activity: "%{value}'s activity" - label_new: New - label_logged_as: Logged in as - label_environment: Environment - label_authentication: Authentication - label_auth_source: Authentication mode - label_auth_source_new: New authentication mode - label_auth_source_plural: Authentication modes - label_subproject_plural: Subprojects - label_subproject_new: New subproject - label_and_its_subprojects: "%{value} and its subprojects" - label_min_max_length: Min - Max length - label_list: List - label_date: Date - label_integer: Integer - label_float: Float - label_boolean: Boolean - label_string: Text - label_text: Long text - label_attribute: Attribute - label_attribute_plural: Attributes - label_download: "%{count} Download" - label_download_plural: "%{count} Downloads" - label_no_data: No data to display - label_change_status: Change status - label_history: History - label_attachment: File - label_attachment_new: New file - label_attachment_delete: Delete file - label_attachment_plural: Files - label_file_added: File added - label_report: Report - label_report_plural: Reports - label_news: News - label_news_new: Add news - label_news_plural: News - label_news_latest: Latest news - label_news_view_all: View all news - label_news_added: News added - label_settings: Settings - label_overview: Overview - label_version: Version - label_version_new: New version - label_version_plural: Versions - label_close_versions: Close completed versions - label_confirmation: Confirmation - label_export_to: 'Also available in:' - label_read: Read... - label_public_projects: Public projects - label_open_issues: open - label_open_issues_plural: open - label_closed_issues: closed - label_closed_issues_plural: closed - label_x_open_issues_abbr_on_total: - zero: 0 open / %{total} - one: 1 open / %{total} - other: "%{count} open / %{total}" - label_x_open_issues_abbr: - zero: 0 open - one: 1 open - other: "%{count} open" - label_x_closed_issues_abbr: - zero: 0 closed - one: 1 closed - other: "%{count} closed" - label_total: Total - label_permissions: Permissions - label_current_status: Current status - label_new_statuses_allowed: New statuses allowed - label_all: all - label_none: none - label_nobody: nobody - label_next: Next - label_previous: Previous - label_used_by: Used by - label_details: Details - label_add_note: Add a note - label_per_page: Per page - label_calendar: Calendar - label_months_from: months from - label_gantt: Gantt - label_internal: Internal - label_last_changes: "last %{count} changes" - label_change_view_all: View all changes - label_personalize_page: Personalise this page - label_comment: Comment - label_comment_plural: Comments - label_x_comments: - zero: no comments - one: 1 comment - other: "%{count} comments" - label_comment_add: Add a comment - label_comment_added: Comment added - label_comment_delete: Delete comments - label_query: Custom query - label_query_plural: Custom queries - label_query_new: New query - label_filter_add: Add filter - label_filter_plural: Filters - label_equals: is - label_not_equals: is not - label_in_less_than: in less than - label_in_more_than: in more than - label_greater_or_equal: '>=' - label_less_or_equal: '<=' - label_in: in - label_today: today - label_all_time: all time - label_yesterday: yesterday - label_this_week: this week - label_last_week: last week - label_last_n_days: "last %{count} days" - label_this_month: this month - label_last_month: last month - label_this_year: this year - label_date_range: Date range - label_less_than_ago: less than days ago - label_more_than_ago: more than days ago - label_ago: days ago - label_contains: contains - label_not_contains: doesn't contain - label_day_plural: days - label_repository: Repository - label_repository_plural: Repositories - label_browse: Browse - label_modification: "%{count} change" - label_modification_plural: "%{count} changes" - label_branch: Branch - label_tag: Tag - label_revision: Revision - label_revision_plural: Revisions - label_revision_id: "Revision %{value}" - label_associated_revisions: Associated revisions - label_added: added - label_modified: modified - label_copied: copied - label_renamed: renamed - label_deleted: deleted - label_latest_revision: Latest revision - label_latest_revision_plural: Latest revisions - label_view_revisions: View revisions - label_view_all_revisions: View all revisions - label_max_size: Maximum size - label_sort_highest: Move to top - label_sort_higher: Move up - label_sort_lower: Move down - label_sort_lowest: Move to bottom - label_roadmap: Roadmap - label_roadmap_due_in: "Due in %{value}" - label_roadmap_overdue: "%{value} late" - label_roadmap_no_issues: No issues for this version - label_search: Search - label_result_plural: Results - label_all_words: All words - label_wiki: Wiki - label_wiki_edit: Wiki edit - label_wiki_edit_plural: Wiki edits - label_wiki_page: Wiki page - label_wiki_page_plural: Wiki pages - label_index_by_title: Index by title - label_index_by_date: Index by date - label_current_version: Current version - label_preview: Preview - label_feed_plural: Feeds - label_changes_details: Details of all changes - label_issue_tracking: Issue tracking - label_spent_time: Spent time - label_f_hour: "%{value} hour" - label_f_hour_plural: "%{value} hours" - label_time_tracking: Time tracking - label_change_plural: Changes - label_statistics: Statistics - label_commits_per_month: Commits per month - label_commits_per_author: Commits per author - label_view_diff: View differences - label_diff_inline: inline - label_diff_side_by_side: side by side - label_options: Options - label_copy_workflow_from: Copy workflow from - label_permissions_report: Permissions report - label_watched_issues: Watched issues - label_related_issues: Related issues - label_applied_status: Applied status - label_loading: Loading... - label_relation_new: New relation - label_relation_delete: Delete relation - label_relates_to: related to - label_duplicates: duplicates - label_duplicated_by: duplicated by - label_blocks: blocks - label_blocked_by: blocked by - label_precedes: precedes - label_follows: follows - label_end_to_start: end to start - label_end_to_end: end to end - label_start_to_start: start to start - label_start_to_end: start to end - label_stay_logged_in: Stay logged in - label_disabled: disabled - label_show_completed_versions: Show completed versions - label_me: me - label_board: Forum - label_board_new: New forum - label_board_plural: Forums - label_board_locked: Locked - label_board_sticky: Sticky - label_topic_plural: Topics - label_message_plural: Messages - label_message_last: Last message - label_message_new: New message - label_message_posted: Message added - label_reply_plural: Replies - label_send_information: Send account information to the user - label_year: Year - label_month: Month - label_week: Week - label_date_from: From - label_date_to: To - label_language_based: Based on user's language - label_sort_by: "Sort by %{value}" - label_send_test_email: Send a test email - label_feeds_access_key: RSS access key - label_missing_feeds_access_key: Missing a RSS access key - label_feeds_access_key_created_on: "RSS access key created %{value} ago" - label_module_plural: Modules - label_added_time_by: "Added by %{author} %{age} ago" - label_updated_time_by: "Updated by %{author} %{age} ago" - label_updated_time: "Updated %{value} ago" - label_jump_to_a_project: Jump to a project... - label_file_plural: Files - label_changeset_plural: Changesets - label_default_columns: Default columns - label_no_change_option: (No change) - label_bulk_edit_selected_issues: Bulk edit selected issues - label_theme: Theme - label_default: Default - label_search_titles_only: Search titles only - label_user_mail_option_all: "For any event on all my projects" - label_user_mail_option_selected: "For any event on the selected projects only..." - label_user_mail_option_none: "No events" - label_user_mail_no_self_notified: "I don't want to be notified of changes that I make myself" - label_registration_activation_by_email: account activation by email - label_registration_manual_activation: manual account activation - label_registration_automatic_activation: automatic account activation - label_display_per_page: "Per page: %{value}" - label_age: Age - label_change_properties: Change properties - label_general: General - label_more: More - label_scm: SCM - label_plugins: Plugins - label_ldap_authentication: LDAP authentication - label_downloads_abbr: D/L - label_optional_description: Optional description - label_add_another_file: Add another file - label_preferences: Preferences - label_chronological_order: In chronological order - label_reverse_chronological_order: In reverse chronological order - label_planning: Planning - label_incoming_emails: Incoming emails - label_generate_key: Generate a key - label_issue_watchers: Watchers - label_example: Example - label_display: Display - label_sort: Sort - label_ascending: Ascending - label_descending: Descending - label_date_from_to: From %{start} to %{end} - label_wiki_content_added: Wiki page added - label_wiki_content_updated: Wiki page updated - label_group: Group - label_group_plural: Groups - label_group_new: New group - label_time_entry_plural: Spent time - label_version_sharing_none: Not shared - label_version_sharing_descendants: With subprojects - label_version_sharing_hierarchy: With project hierarchy - label_version_sharing_tree: With project tree - label_version_sharing_system: With all projects - label_update_issue_done_ratios: Update issue done ratios - label_copy_source: Source - label_copy_target: Target - label_copy_same_as_target: Same as target - label_display_used_statuses_only: Only display statuses that are used by this tracker - label_api_access_key: API access key - label_missing_api_access_key: Missing an API access key - label_api_access_key_created_on: "API access key created %{value} ago" - - button_login: Login - button_submit: Submit - button_save: Save - button_check_all: Check all - button_uncheck_all: Uncheck all - button_delete: Delete - button_create: Create - button_create_and_continue: Create and continue - button_test: Test - button_edit: Edit - button_add: Add - button_change: Change - button_apply: Apply - button_clear: Clear - button_lock: Lock - button_unlock: Unlock - button_download: Download - button_list: List - button_view: View - button_move: Move - button_move_and_follow: Move and follow - button_back: Back - button_cancel: Cancel - button_activate: Activate - button_sort: Sort - button_log_time: Log time - button_rollback: Rollback to this version - button_watch: Watch - button_unwatch: Unwatch - button_reply: Reply - button_archive: Archive - button_unarchive: Unarchive - button_reset: Reset - button_rename: Rename - button_change_password: Change password - button_copy: Copy - button_copy_and_follow: Copy and follow - button_annotate: Annotate - button_update: Update - button_configure: Configure - button_quote: Quote - button_duplicate: Duplicate - button_show: Show - - status_active: active - status_registered: registered - status_locked: locked - - version_status_open: open - version_status_locked: locked - version_status_closed: closed - - field_active: Active - - text_select_mail_notifications: Select actions for which email notifications should be sent. - text_regexp_info: eg. ^[A-Z0-9]+$ - text_min_max_length_info: 0 means no restriction - text_project_destroy_confirmation: Are you sure you want to delete this project and related data? - text_subprojects_destroy_warning: "Its subproject(s): %{value} will be also deleted." - text_workflow_edit: Select a role and a tracker to edit the workflow - text_are_you_sure: Are you sure? - text_journal_changed: "%{label} changed from %{old} to %{new}" - text_journal_set_to: "%{label} set to %{value}" - text_journal_deleted: "%{label} deleted (%{old})" - text_journal_added: "%{label} %{value} added" - text_tip_issue_begin_day: task beginning this day - text_tip_issue_end_day: task ending this day - text_tip_issue_begin_end_day: task beginning and ending this day - text_project_identifier_info: 'Only lower case letters (a-z), numbers, dashes and underscores are allowed.
Once saved, the identifier can not be changed.' - text_caracters_maximum: "%{count} characters maximum." - text_caracters_minimum: "Must be at least %{count} characters long." - text_length_between: "Length between %{min} and %{max} characters." - text_tracker_no_workflow: No workflow defined for this tracker - text_unallowed_characters: Unallowed characters - text_comma_separated: Multiple values allowed (comma separated). - text_line_separated: Multiple values allowed (one line for each value). - text_issues_ref_in_commit_messages: Referencing and fixing issues in commit messages - text_issue_added: "Issue %{id} has been reported by %{author}." - text_issue_updated: "Issue %{id} has been updated by %{author}." - text_wiki_destroy_confirmation: Are you sure you want to delete this wiki and all its content? - text_issue_category_destroy_question: "Some issues (%{count}) are assigned to this category. What do you want to do?" - text_issue_category_destroy_assignments: Remove category assignments - text_issue_category_reassign_to: Reassign issues to this category - text_user_mail_option: "For unselected projects, you will only receive notifications about things you watch or you're involved in (eg. issues you're the author or assignee)." - text_no_configuration_data: "Roles, trackers, issue statuses and workflow have not been configured yet.\nIt is highly recommended to load the default configuration. You will be able to modify it once loaded." - text_load_default_configuration: Load the default configuration - text_status_changed_by_changeset: "Applied in changeset %{value}." - text_issues_destroy_confirmation: 'Are you sure you want to delete the selected issue(s)?' - text_select_project_modules: 'Select modules to enable for this project:' - text_default_administrator_account_changed: Default administrator account changed - text_file_repository_writable: Attachments directory writable - text_plugin_assets_writable: Plugin assets directory writable - text_rmagick_available: RMagick available (optional) - text_destroy_time_entries_question: "%{hours} hours were reported on the issues you are about to delete. What do you want to do?" - text_destroy_time_entries: Delete reported hours - text_assign_time_entries_to_project: Assign reported hours to the project - text_reassign_time_entries: 'Reassign reported hours to this issue:' - text_user_wrote: "%{value} wrote:" - text_enumeration_destroy_question: "%{count} objects are assigned to this value." - text_enumeration_category_reassign_to: 'Reassign them to this value:' - text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server in config/configuration.yml and restart the application to enable them." - text_repository_usernames_mapping: "Select or update the Redmine user mapped to each username found in the repository log.\nUsers with the same Redmine and repository username or email are automatically mapped." - text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.' - text_custom_field_possible_values_info: 'One line for each value' - text_wiki_page_destroy_question: "This page has %{descendants} child page(s) and descendant(s). What do you want to do?" - text_wiki_page_nullify_children: "Keep child pages as root pages" - text_wiki_page_destroy_children: "Delete child pages and all their descendants" - text_wiki_page_reassign_children: "Reassign child pages to this parent page" - text_own_membership_delete_confirmation: "You are about to remove some or all of your permissions and may no longer be able to edit this project after that.\nAre you sure you want to continue?" - - default_role_manager: Manager - default_role_developer: Developer - default_role_reporter: Reporter - default_role_non_member: Non member - default_role_anonymous: Anonymous - default_tracker_bug: Bug - default_tracker_feature: Feature - default_tracker_support: Support - default_issue_status_new: New - default_issue_status_in_progress: In Progress - default_issue_status_resolved: Resolved - default_issue_status_feedback: Feedback - default_issue_status_closed: Closed - default_issue_status_rejected: Rejected - default_doc_category_user: User documentation - default_doc_category_tech: Technical documentation - default_priority_low: Low - default_priority_normal: Normal - default_priority_high: High - default_priority_urgent: Urgent - default_priority_immediate: Immediate - default_activity_design: Design - default_activity_development: Development - - enumeration_issue_priorities: Issue priorities - enumeration_doc_categories: Document categories - enumeration_activities: Activities (time tracking) - enumeration_system_activity: System Activity - - notice_unable_delete_time_entry: Unable to delete time log entry. - error_can_not_delete_custom_field: Unable to delete custom field - permission_manage_subtasks: Manage subtasks - label_profile: Profile - error_unable_to_connect: Unable to connect (%{value}) - label_overall_spent_time: Overall spent time - error_can_not_remove_role: This role is in use and can not be deleted. - field_principal: Principal - field_parent_issue: Parent task - label_my_page_block: My page block - text_zoom_out: Zoom out - text_zoom_in: Zoom in - error_unable_delete_issue_status: Unable to delete issue status - label_subtask_plural: Subtasks - error_can_not_delete_tracker: This tracker contains issues and can't be deleted. - notice_failed_to_save_members: "Failed to save member(s): %{errors}." - label_project_copy_notifications: Send email notifications during the project copy - field_time_entries: Log time - project_module_gantt: Gantt - project_module_calendar: Calendar - field_member_of_group: Member of Group - field_assigned_to_role: Member of Role - button_edit_associated_wikipage: "Edit associated Wiki page: %{page_title}" - text_are_you_sure_with_children: Delete issue and all child issues? - field_text: Text field - label_user_mail_option_only_owner: Only for things I am the owner of - setting_default_notification_option: Default notification option - label_user_mail_option_only_my_events: Only for things I watch or I'm involved in - label_user_mail_option_only_assigned: Only for things I am assigned to - notice_not_authorized_archived_project: The project you're trying to access has been archived. - label_principal_search: "Search for user or group:" - label_user_search: "Search for user:" - field_visible: Visible - setting_emails_header: Emails header - setting_commit_logtime_activity_id: Activity for logged time - text_time_logged_by_changeset: Applied in changeset %{value}. - setting_commit_logtime_enabled: Enable time logging - notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max}) - setting_gantt_items_limit: Maximum number of items displayed on the gantt chart - text_powered_by: "Powered by %{link}" +en-GB: + direction: ltr + date: + formats: + # Use the strftime parameters for formats. + # When no format has been given, it uses default. + # You can provide other formats here if you like! + default: "%d/%m/%Y" + short: "%d %b" + long: "%d %B, %Y" + + day_names: [Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday] + abbr_day_names: [Sun, Mon, Tue, Wed, Thu, Fri, Sat] + + # Don't forget the nil at the beginning; there's no such thing as a 0th month + month_names: [~, January, February, March, April, May, June, July, August, September, October, November, December] + abbr_month_names: [~, Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec] + # Used in date_select and datime_select. + order: + - :year + - :month + - :day + + time: + formats: + default: "%d/%m/%Y %I:%M %p" + time: "%I:%M %p" + short: "%d %b %H:%M" + long: "%d %B, %Y %H:%M" + am: "am" + pm: "pm" + + datetime: + distance_in_words: + half_a_minute: "half a minute" + less_than_x_seconds: + one: "less than 1 second" + other: "less than %{count} seconds" + x_seconds: + one: "1 second" + other: "%{count} seconds" + less_than_x_minutes: + one: "less than a minute" + other: "less than %{count} minutes" + x_minutes: + one: "1 minute" + other: "%{count} minutes" + about_x_hours: + one: "about 1 hour" + other: "about %{count} hours" + x_days: + one: "1 day" + other: "%{count} days" + about_x_months: + one: "about 1 month" + other: "about %{count} months" + x_months: + one: "1 month" + other: "%{count} months" + about_x_years: + one: "about 1 year" + other: "about %{count} years" + over_x_years: + one: "over 1 year" + other: "over %{count} years" + almost_x_years: + one: "almost 1 year" + other: "almost %{count} years" + + number: + format: + separator: "." + delimiter: " " + precision: 3 + + currency: + format: + format: "%u%n" + unit: "£" + + human: + format: + delimiter: "" + precision: 1 + storage_units: + format: "%n %u" + units: + byte: + one: "Byte" + other: "Bytes" + kb: "kB" + mb: "MB" + gb: "GB" + tb: "TB" + + +# Used in array.to_sentence. + support: + array: + sentence_connector: "and" + skip_last_comma: false + + activerecord: + errors: + template: + header: + one: "1 error prohibited this %{model} from being saved" + other: "%{count} errors prohibited this %{model} from being saved" + messages: + inclusion: "is not included in the list" + exclusion: "is reserved" + invalid: "is invalid" + confirmation: "doesn't match confirmation" + accepted: "must be accepted" + empty: "can't be empty" + blank: "can't be blank" + too_long: "is too long (maximum is %{count} characters)" + too_short: "is too short (minimum is %{count} characters)" + wrong_length: "is the wrong length (should be %{count} characters)" + taken: "has already been taken" + not_a_number: "is not a number" + not_a_date: "is not a valid date" + greater_than: "must be greater than %{count}" + greater_than_or_equal_to: "must be greater than or equal to %{count}" + equal_to: "must be equal to %{count}" + less_than: "must be less than %{count}" + less_than_or_equal_to: "must be less than or equal to %{count}" + odd: "must be odd" + even: "must be even" + greater_than_start_date: "must be greater than start date" + not_same_project: "doesn't belong to the same project" + circular_dependency: "This relation would create a circular dependency" + cant_link_an_issue_with_a_descendant: "An issue cannot be linked to one of its subtasks" + + actionview_instancetag_blank_option: Please select + + general_text_No: 'No' + general_text_Yes: 'Yes' + general_text_no: 'no' + general_text_yes: 'yes' + general_lang_name: 'English (British)' + general_csv_separator: ',' + general_csv_decimal_separator: '.' + general_csv_encoding: ISO-8859-1 + general_pdf_encoding: ISO-8859-1 + general_first_day_of_week: '1' + + notice_account_updated: Account was successfully updated. + notice_account_invalid_creditentials: Invalid user or password + notice_account_password_updated: Password was successfully updated. + notice_account_wrong_password: Wrong password + notice_account_register_done: Account was successfully created. To activate your account, click on the link that was emailed to you. + notice_account_unknown_email: Unknown user. + notice_can_t_change_password: This account uses an external authentication source. Impossible to change the password. + notice_account_lost_email_sent: An email with instructions to choose a new password has been sent to you. + notice_account_activated: Your account has been activated. You can now log in. + notice_successful_create: Successful creation. + notice_successful_update: Successful update. + notice_successful_delete: Successful deletion. + notice_successful_connection: Successful connection. + notice_file_not_found: The page you were trying to access doesn't exist or has been removed. + notice_locking_conflict: Data has been updated by another user. + notice_not_authorized: You are not authorised to access this page. + notice_not_authorized_archived_project: The project you're trying to access has been archived. + notice_email_sent: "An email was sent to %{value}" + notice_email_error: "An error occurred while sending mail (%{value})" + notice_feeds_access_key_reseted: Your RSS access key was reset. + notice_api_access_key_reseted: Your API access key was reset. + notice_failed_to_save_issues: "Failed to save %{count} issue(s) on %{total} selected: %{ids}." + notice_failed_to_save_members: "Failed to save member(s): %{errors}." + notice_no_issue_selected: "No issue is selected! Please, check the issues you want to edit." + notice_account_pending: "Your account was created and is now pending administrator approval." + notice_default_data_loaded: Default configuration successfully loaded. + notice_unable_delete_version: Unable to delete version. + notice_unable_delete_time_entry: Unable to delete time log entry. + notice_issue_done_ratios_updated: Issue done ratios updated. + notice_gantt_chart_truncated: "The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})" + + error_can_t_load_default_data: "Default configuration could not be loaded: %{value}" + error_scm_not_found: "The entry or revision was not found in the repository." + error_scm_command_failed: "An error occurred when trying to access the repository: %{value}" + error_scm_annotate: "The entry does not exist or cannot be annotated." + error_issue_not_found_in_project: 'The issue was not found or does not belong to this project' + error_no_tracker_in_project: 'No tracker is associated to this project. Please check the Project settings.' + error_no_default_issue_status: 'No default issue status is defined. Please check your configuration (Go to "Administration -> Issue statuses").' + error_can_not_delete_custom_field: Unable to delete custom field + error_can_not_delete_tracker: "This tracker contains issues and cannot be deleted." + error_can_not_remove_role: "This role is in use and cannot be deleted." + error_can_not_reopen_issue_on_closed_version: 'An issue assigned to a closed version cannot be reopened' + error_can_not_archive_project: This project cannot be archived + error_issue_done_ratios_not_updated: "Issue done ratios not updated." + error_workflow_copy_source: 'Please select a source tracker or role' + error_workflow_copy_target: 'Please select target tracker(s) and role(s)' + error_unable_delete_issue_status: 'Unable to delete issue status' + error_unable_to_connect: "Unable to connect (%{value})" + warning_attachments_not_saved: "%{count} file(s) could not be saved." + + mail_subject_lost_password: "Your %{value} password" + mail_body_lost_password: 'To change your password, click on the following link:' + mail_subject_register: "Your %{value} account activation" + mail_body_register: 'To activate your account, click on the following link:' + mail_body_account_information_external: "You can use your %{value} account to log in." + mail_body_account_information: Your account information + mail_subject_account_activation_request: "%{value} account activation request" + mail_body_account_activation_request: "A new user (%{value}) has registered. The account is pending your approval:" + mail_subject_reminder: "%{count} issue(s) due in the next %{days} days" + mail_body_reminder: "%{count} issue(s) that are assigned to you are due in the next %{days} days:" + mail_subject_wiki_content_added: "'%{id}' wiki page has been added" + mail_body_wiki_content_added: "The '%{id}' wiki page has been added by %{author}." + mail_subject_wiki_content_updated: "'%{id}' wiki page has been updated" + mail_body_wiki_content_updated: "The '%{id}' wiki page has been updated by %{author}." + + gui_validation_error: 1 error + gui_validation_error_plural: "%{count} errors" + + field_name: Name + field_description: Description + field_summary: Summary + field_is_required: Required + field_firstname: First name + field_lastname: Last name + field_mail: Email + field_filename: File + field_filesize: Size + field_downloads: Downloads + field_author: Author + field_created_on: Created + field_updated_on: Updated + field_field_format: Format + field_is_for_all: For all projects + field_possible_values: Possible values + field_regexp: Regular expression + field_min_length: Minimum length + field_max_length: Maximum length + field_value: Value + field_category: Category + field_title: Title + field_project: Project + field_issue: Issue + field_status: Status + field_notes: Notes + field_is_closed: Issue closed + field_is_default: Default value + field_tracker: Tracker + field_subject: Subject + field_due_date: Due date + field_assigned_to: Assignee + field_priority: Priority + field_fixed_version: Target version + field_user: User + field_principal: Principal + field_role: Role + field_homepage: Homepage + field_is_public: Public + field_parent: Subproject of + field_is_in_roadmap: Issues displayed in roadmap + field_login: Login + field_mail_notification: Email notifications + field_admin: Administrator + field_last_login_on: Last connection + field_language: Language + field_effective_date: Due date + field_password: Password + field_new_password: New password + field_password_confirmation: Confirmation + field_version: Version + field_type: Type + field_host: Host + field_port: Port + field_account: Account + field_base_dn: Base DN + field_attr_login: Login attribute + field_attr_firstname: Firstname attribute + field_attr_lastname: Lastname attribute + field_attr_mail: Email attribute + field_onthefly: On-the-fly user creation + field_start_date: Start date + field_done_ratio: "% Done" + field_auth_source: Authentication mode + field_hide_mail: Hide my email address + field_comments: Comment + field_url: URL + field_start_page: Start page + field_subproject: Subproject + field_hours: Hours + field_activity: Activity + field_spent_on: Date + field_identifier: Identifier + field_is_filter: Used as a filter + field_issue_to: Related issue + field_delay: Delay + field_assignable: Issues can be assigned to this role + field_redirect_existing_links: Redirect existing links + field_estimated_hours: Estimated time + field_column_names: Columns + field_time_entries: Log time + field_time_zone: Time zone + field_searchable: Searchable + field_default_value: Default value + field_comments_sorting: Display comments + field_parent_title: Parent page + field_editable: Editable + field_watcher: Watcher + field_identity_url: OpenID URL + field_content: Content + field_group_by: Group results by + field_sharing: Sharing + field_parent_issue: Parent task + field_member_of_group: "Assignee's group" + field_assigned_to_role: "Assignee's role" + field_text: Text field + field_visible: Visible + field_warn_on_leaving_unsaved: "Warn me when leaving a page with unsaved text" + + setting_app_title: Application title + setting_app_subtitle: Application subtitle + setting_welcome_text: Welcome text + setting_default_language: Default language + setting_login_required: Authentication required + setting_self_registration: Self-registration + setting_attachment_max_size: Attachment max. size + setting_issues_export_limit: Issues export limit + setting_mail_from: Emission email address + setting_bcc_recipients: Blind carbon copy recipients (bcc) + setting_plain_text_mail: Plain text mail (no HTML) + setting_host_name: Host name and path + setting_text_formatting: Text formatting + setting_wiki_compression: Wiki history compression + setting_feeds_limit: Feed content limit + setting_default_projects_public: New projects are public by default + setting_autofetch_changesets: Autofetch commits + setting_sys_api_enabled: Enable WS for repository management + setting_commit_ref_keywords: Referencing keywords + setting_commit_fix_keywords: Fixing keywords + setting_autologin: Autologin + setting_date_format: Date format + setting_time_format: Time format + setting_cross_project_issue_relations: Allow cross-project issue relations + setting_issue_list_default_columns: Default columns displayed on the issue list + setting_repositories_encodings: Repositories encodings + setting_commit_logs_encoding: Commit messages encoding + setting_emails_header: Emails header + setting_emails_footer: Emails footer + setting_protocol: Protocol + setting_per_page_options: Objects per page options + setting_user_format: Users display format + setting_activity_days_default: Days displayed on project activity + setting_display_subprojects_issues: Display subprojects issues on main projects by default + setting_enabled_scm: Enabled SCM + setting_mail_handler_body_delimiters: "Truncate emails after one of these lines" + setting_mail_handler_api_enabled: Enable WS for incoming emails + setting_mail_handler_api_key: API key + setting_sequential_project_identifiers: Generate sequential project identifiers + setting_gravatar_enabled: Use Gravatar user icons + setting_gravatar_default: Default Gravatar image + setting_diff_max_lines_displayed: Max number of diff lines displayed + setting_file_max_size_displayed: Max size of text files displayed inline + setting_repository_log_display_limit: Maximum number of revisions displayed on file log + setting_openid: Allow OpenID login and registration + setting_password_min_length: Minimum password length + setting_new_project_user_role_id: Role given to a non-admin user who creates a project + setting_default_projects_modules: Default enabled modules for new projects + setting_issue_done_ratio: Calculate the issue done ratio with + setting_issue_done_ratio_issue_field: Use the issue field + setting_issue_done_ratio_issue_status: Use the issue status + setting_start_of_week: Start calendars on + setting_rest_api_enabled: Enable REST web service + setting_cache_formatted_text: Cache formatted text + setting_default_notification_option: Default notification option + setting_commit_logtime_enabled: Enable time logging + setting_commit_logtime_activity_id: Activity for logged time + setting_gantt_items_limit: Maximum number of items displayed on the gantt chart + + permission_add_project: Create project + permission_add_subprojects: Create subprojects + permission_edit_project: Edit project + permission_select_project_modules: Select project modules + permission_manage_members: Manage members + permission_manage_project_activities: Manage project activities + permission_manage_versions: Manage versions + permission_manage_categories: Manage issue categories + permission_view_issues: View Issues + permission_add_issues: Add issues + permission_edit_issues: Edit issues + permission_manage_issue_relations: Manage issue relations + permission_add_issue_notes: Add notes + permission_edit_issue_notes: Edit notes + permission_edit_own_issue_notes: Edit own notes + permission_move_issues: Move issues + permission_delete_issues: Delete issues + permission_manage_public_queries: Manage public queries + permission_save_queries: Save queries + permission_view_gantt: View gantt chart + permission_view_calendar: View calendar + permission_view_issue_watchers: View watchers list + permission_add_issue_watchers: Add watchers + permission_delete_issue_watchers: Delete watchers + permission_log_time: Log spent time + permission_view_time_entries: View spent time + permission_edit_time_entries: Edit time logs + permission_edit_own_time_entries: Edit own time logs + permission_manage_news: Manage news + permission_comment_news: Comment news + permission_manage_documents: Manage documents + permission_view_documents: View documents + permission_manage_files: Manage files + permission_view_files: View files + permission_manage_wiki: Manage wiki + permission_rename_wiki_pages: Rename wiki pages + permission_delete_wiki_pages: Delete wiki pages + permission_view_wiki_pages: View wiki + permission_view_wiki_edits: View wiki history + permission_edit_wiki_pages: Edit wiki pages + permission_delete_wiki_pages_attachments: Delete attachments + permission_protect_wiki_pages: Protect wiki pages + permission_manage_repository: Manage repository + permission_browse_repository: Browse repository + permission_view_changesets: View changesets + permission_commit_access: Commit access + permission_manage_boards: Manage forums + permission_view_messages: View messages + permission_add_messages: Post messages + permission_edit_messages: Edit messages + permission_edit_own_messages: Edit own messages + permission_delete_messages: Delete messages + permission_delete_own_messages: Delete own messages + permission_export_wiki_pages: Export wiki pages + permission_manage_subtasks: Manage subtasks + + project_module_issue_tracking: Issue tracking + project_module_time_tracking: Time tracking + project_module_news: News + project_module_documents: Documents + project_module_files: Files + project_module_wiki: Wiki + project_module_repository: Repository + project_module_boards: Forums + project_module_calendar: Calendar + project_module_gantt: Gantt + + label_user: User + label_user_plural: Users + label_user_new: New user + label_user_anonymous: Anonymous + label_project: Project + label_project_new: New project + label_project_plural: Projects + label_x_projects: + zero: no projects + one: 1 project + other: "%{count} projects" + label_project_all: All Projects + label_project_latest: Latest projects + label_issue: Issue + label_issue_new: New issue + label_issue_plural: Issues + label_issue_view_all: View all issues + label_issues_by: "Issues by %{value}" + label_issue_added: Issue added + label_issue_updated: Issue updated + label_document: Document + label_document_new: New document + label_document_plural: Documents + label_document_added: Document added + label_role: Role + label_role_plural: Roles + label_role_new: New role + label_role_and_permissions: Roles and permissions + label_member: Member + label_member_new: New member + label_member_plural: Members + label_tracker: Tracker + label_tracker_plural: Trackers + label_tracker_new: New tracker + label_workflow: Workflow + label_issue_status: Issue status + label_issue_status_plural: Issue statuses + label_issue_status_new: New status + label_issue_category: Issue category + label_issue_category_plural: Issue categories + label_issue_category_new: New category + label_custom_field: Custom field + label_custom_field_plural: Custom fields + label_custom_field_new: New custom field + label_enumerations: Enumerations + label_enumeration_new: New value + label_information: Information + label_information_plural: Information + label_please_login: Please log in + label_register: Register + label_login_with_open_id_option: or login with OpenID + label_password_lost: Lost password + label_home: Home + label_my_page: My page + label_my_account: My account + label_my_projects: My projects + label_my_page_block: My page block + label_administration: Administration + label_login: Sign in + label_logout: Sign out + label_help: Help + label_reported_issues: Reported issues + label_assigned_to_me_issues: Issues assigned to me + label_last_login: Last connection + label_registered_on: Registered on + label_activity: Activity + label_overall_activity: Overall activity + label_user_activity: "%{value}'s activity" + label_new: New + label_logged_as: Logged in as + label_environment: Environment + label_authentication: Authentication + label_auth_source: Authentication mode + label_auth_source_new: New authentication mode + label_auth_source_plural: Authentication modes + label_subproject_plural: Subprojects + label_subproject_new: New subproject + label_and_its_subprojects: "%{value} and its subprojects" + label_min_max_length: Min - Max length + label_list: List + label_date: Date + label_integer: Integer + label_float: Float + label_boolean: Boolean + label_string: Text + label_text: Long text + label_attribute: Attribute + label_attribute_plural: Attributes + label_download: "%{count} Download" + label_download_plural: "%{count} Downloads" + label_no_data: No data to display + label_change_status: Change status + label_history: History + label_attachment: File + label_attachment_new: New file + label_attachment_delete: Delete file + label_attachment_plural: Files + label_file_added: File added + label_report: Report + label_report_plural: Reports + label_news: News + label_news_new: Add news + label_news_plural: News + label_news_latest: Latest news + label_news_view_all: View all news + label_news_added: News added + label_news_comment_added: Comment added to a news + label_settings: Settings + label_overview: Overview + label_version: Version + label_version_new: New version + label_version_plural: Versions + label_close_versions: Close completed versions + label_confirmation: Confirmation + label_export_to: 'Also available in:' + label_read: Read... + label_public_projects: Public projects + label_open_issues: open + label_open_issues_plural: open + label_closed_issues: closed + label_closed_issues_plural: closed + label_x_open_issues_abbr_on_total: + zero: 0 open / %{total} + one: 1 open / %{total} + other: "%{count} open / %{total}" + label_x_open_issues_abbr: + zero: 0 open + one: 1 open + other: "%{count} open" + label_x_closed_issues_abbr: + zero: 0 closed + one: 1 closed + other: "%{count} closed" + label_total: Total + label_permissions: Permissions + label_current_status: Current status + label_new_statuses_allowed: New statuses allowed + label_all: all + label_none: none + label_nobody: nobody + label_next: Next + label_previous: Previous + label_used_by: Used by + label_details: Details + label_add_note: Add a note + label_per_page: Per page + label_calendar: Calendar + label_months_from: months from + label_gantt: Gantt + label_internal: Internal + label_last_changes: "last %{count} changes" + label_change_view_all: View all changes + label_personalize_page: Personalise this page + label_comment: Comment + label_comment_plural: Comments + label_x_comments: + zero: no comments + one: 1 comment + other: "%{count} comments" + label_comment_add: Add a comment + label_comment_added: Comment added + label_comment_delete: Delete comments + label_query: Custom query + label_query_plural: Custom queries + label_query_new: New query + label_my_queries: My custom queries + label_filter_add: Add filter + label_filter_plural: Filters + label_equals: is + label_not_equals: is not + label_in_less_than: in less than + label_in_more_than: in more than + label_greater_or_equal: '>=' + label_less_or_equal: '<=' + label_in: in + label_today: today + label_all_time: all time + label_yesterday: yesterday + label_this_week: this week + label_last_week: last week + label_last_n_days: "last %{count} days" + label_this_month: this month + label_last_month: last month + label_this_year: this year + label_date_range: Date range + label_less_than_ago: less than days ago + label_more_than_ago: more than days ago + label_ago: days ago + label_contains: contains + label_not_contains: doesn't contain + label_day_plural: days + label_repository: Repository + label_repository_plural: Repositories + label_browse: Browse + label_modification: "%{count} change" + label_modification_plural: "%{count} changes" + label_branch: Branch + label_tag: Tag + label_revision: Revision + label_revision_plural: Revisions + label_revision_id: "Revision %{value}" + label_associated_revisions: Associated revisions + label_added: added + label_modified: modified + label_copied: copied + label_renamed: renamed + label_deleted: deleted + label_latest_revision: Latest revision + label_latest_revision_plural: Latest revisions + label_view_revisions: View revisions + label_view_all_revisions: View all revisions + label_max_size: Maximum size + label_sort_highest: Move to top + label_sort_higher: Move up + label_sort_lower: Move down + label_sort_lowest: Move to bottom + label_roadmap: Roadmap + label_roadmap_due_in: "Due in %{value}" + label_roadmap_overdue: "%{value} late" + label_roadmap_no_issues: No issues for this version + label_search: Search + label_result_plural: Results + label_all_words: All words + label_wiki: Wiki + label_wiki_edit: Wiki edit + label_wiki_edit_plural: Wiki edits + label_wiki_page: Wiki page + label_wiki_page_plural: Wiki pages + label_index_by_title: Index by title + label_index_by_date: Index by date + label_current_version: Current version + label_preview: Preview + label_feed_plural: Feeds + label_changes_details: Details of all changes + label_issue_tracking: Issue tracking + label_spent_time: Spent time + label_overall_spent_time: Overall spent time + label_f_hour: "%{value} hour" + label_f_hour_plural: "%{value} hours" + label_time_tracking: Time tracking + label_change_plural: Changes + label_statistics: Statistics + label_commits_per_month: Commits per month + label_commits_per_author: Commits per author + label_view_diff: View differences + label_diff_inline: inline + label_diff_side_by_side: side by side + label_options: Options + label_copy_workflow_from: Copy workflow from + label_permissions_report: Permissions report + label_watched_issues: Watched issues + label_related_issues: Related issues + label_applied_status: Applied status + label_loading: Loading... + label_relation_new: New relation + label_relation_delete: Delete relation + label_relates_to: related to + label_duplicates: duplicates + label_duplicated_by: duplicated by + label_blocks: blocks + label_blocked_by: blocked by + label_precedes: precedes + label_follows: follows + label_end_to_start: end to start + label_end_to_end: end to end + label_start_to_start: start to start + label_start_to_end: start to end + label_stay_logged_in: Stay logged in + label_disabled: disabled + label_show_completed_versions: Show completed versions + label_me: me + label_board: Forum + label_board_new: New forum + label_board_plural: Forums + label_board_locked: Locked + label_board_sticky: Sticky + label_topic_plural: Topics + label_message_plural: Messages + label_message_last: Last message + label_message_new: New message + label_message_posted: Message added + label_reply_plural: Replies + label_send_information: Send account information to the user + label_year: Year + label_month: Month + label_week: Week + label_date_from: From + label_date_to: To + label_language_based: Based on user's language + label_sort_by: "Sort by %{value}" + label_send_test_email: Send a test email + label_feeds_access_key: RSS access key + label_missing_feeds_access_key: Missing a RSS access key + label_feeds_access_key_created_on: "RSS access key created %{value} ago" + label_module_plural: Modules + label_added_time_by: "Added by %{author} %{age} ago" + label_updated_time_by: "Updated by %{author} %{age} ago" + label_updated_time: "Updated %{value} ago" + label_jump_to_a_project: Jump to a project... + label_file_plural: Files + label_changeset_plural: Changesets + label_default_columns: Default columns + label_no_change_option: (No change) + label_bulk_edit_selected_issues: Bulk edit selected issues + label_theme: Theme + label_default: Default + label_search_titles_only: Search titles only + label_user_mail_option_all: "For any event on all my projects" + label_user_mail_option_selected: "For any event on the selected projects only..." + label_user_mail_option_none: "No events" + label_user_mail_option_only_my_events: "Only for things I watch or I'm involved in" + label_user_mail_option_only_assigned: "Only for things I am assigned to" + label_user_mail_option_only_owner: "Only for things I am the owner of" + label_user_mail_no_self_notified: "I don't want to be notified of changes that I make myself" + label_registration_activation_by_email: account activation by email + label_registration_manual_activation: manual account activation + label_registration_automatic_activation: automatic account activation + label_display_per_page: "Per page: %{value}" + label_age: Age + label_change_properties: Change properties + label_general: General + label_more: More + label_scm: SCM + label_plugins: Plugins + label_ldap_authentication: LDAP authentication + label_downloads_abbr: D/L + label_optional_description: Optional description + label_add_another_file: Add another file + label_preferences: Preferences + label_chronological_order: In chronological order + label_reverse_chronological_order: In reverse chronological order + label_planning: Planning + label_incoming_emails: Incoming emails + label_generate_key: Generate a key + label_issue_watchers: Watchers + label_example: Example + label_display: Display + label_sort: Sort + label_ascending: Ascending + label_descending: Descending + label_date_from_to: From %{start} to %{end} + label_wiki_content_added: Wiki page added + label_wiki_content_updated: Wiki page updated + label_group: Group + label_group_plural: Groups + label_group_new: New group + label_time_entry_plural: Spent time + label_version_sharing_none: Not shared + label_version_sharing_descendants: With subprojects + label_version_sharing_hierarchy: With project hierarchy + label_version_sharing_tree: With project tree + label_version_sharing_system: With all projects + label_update_issue_done_ratios: Update issue done ratios + label_copy_source: Source + label_copy_target: Target + label_copy_same_as_target: Same as target + label_display_used_statuses_only: Only display statuses that are used by this tracker + label_api_access_key: API access key + label_missing_api_access_key: Missing an API access key + label_api_access_key_created_on: "API access key created %{value} ago" + label_profile: Profile + label_subtask_plural: Subtasks + label_project_copy_notifications: Send email notifications during the project copy + label_principal_search: "Search for user or group:" + label_user_search: "Search for user:" + + button_login: Login + button_submit: Submit + button_save: Save + button_check_all: Check all + button_uncheck_all: Uncheck all + button_collapse_all: Collapse all + button_expand_all: Expand all + button_delete: Delete + button_create: Create + button_create_and_continue: Create and continue + button_test: Test + button_edit: Edit + button_edit_associated_wikipage: "Edit associated Wiki page: %{page_title}" + button_add: Add + button_change: Change + button_apply: Apply + button_clear: Clear + button_lock: Lock + button_unlock: Unlock + button_download: Download + button_list: List + button_view: View + button_move: Move + button_move_and_follow: Move and follow + button_back: Back + button_cancel: Cancel + button_activate: Activate + button_sort: Sort + button_log_time: Log time + button_rollback: Rollback to this version + button_watch: Watch + button_unwatch: Unwatch + button_reply: Reply + button_archive: Archive + button_unarchive: Unarchive + button_reset: Reset + button_rename: Rename + button_change_password: Change password + button_copy: Copy + button_copy_and_follow: Copy and follow + button_annotate: Annotate + button_update: Update + button_configure: Configure + button_quote: Quote + button_duplicate: Duplicate + button_show: Show + + status_active: active + status_registered: registered + status_locked: locked + + version_status_open: open + version_status_locked: locked + version_status_closed: closed + + field_active: Active + + text_select_mail_notifications: Select actions for which email notifications should be sent. + text_regexp_info: eg. ^[A-Z0-9]+$ + text_min_max_length_info: 0 means no restriction + text_project_destroy_confirmation: Are you sure you want to delete this project and related data? + text_subprojects_destroy_warning: "Its subproject(s): %{value} will be also deleted." + text_workflow_edit: Select a role and a tracker to edit the workflow + text_are_you_sure: Are you sure? + text_are_you_sure_with_children: Delete issue and all child issues? + text_journal_changed: "%{label} changed from %{old} to %{new}" + text_journal_changed_no_detail: "%{label} updated" + text_journal_set_to: "%{label} set to %{value}" + text_journal_deleted: "%{label} deleted (%{old})" + text_journal_added: "%{label} %{value} added" + text_tip_issue_begin_day: task beginning this day + text_tip_issue_end_day: task ending this day + text_tip_issue_begin_end_day: task beginning and ending this day + text_project_identifier_info: 'Only lower case letters (a-z), numbers, dashes and underscores are allowed.
Once saved, the identifier cannot be changed.' + text_caracters_maximum: "%{count} characters maximum." + text_caracters_minimum: "Must be at least %{count} characters long." + text_length_between: "Length between %{min} and %{max} characters." + text_tracker_no_workflow: No workflow defined for this tracker + text_unallowed_characters: Unallowed characters + text_comma_separated: Multiple values allowed (comma separated). + text_line_separated: Multiple values allowed (one line for each value). + text_issues_ref_in_commit_messages: Referencing and fixing issues in commit messages + text_issue_added: "Issue %{id} has been reported by %{author}." + text_issue_updated: "Issue %{id} has been updated by %{author}." + text_wiki_destroy_confirmation: Are you sure you want to delete this wiki and all its content? + text_issue_category_destroy_question: "Some issues (%{count}) are assigned to this category. What do you want to do?" + text_issue_category_destroy_assignments: Remove category assignments + text_issue_category_reassign_to: Reassign issues to this category + text_user_mail_option: "For unselected projects, you will only receive notifications about things you watch or you're involved in (eg. issues you're the author or assignee)." + text_no_configuration_data: "Roles, trackers, issue statuses and workflow have not been configured yet.\nIt is highly recommended to load the default configuration. You will be able to modify it once loaded." + text_load_default_configuration: Load the default configuration + text_status_changed_by_changeset: "Applied in changeset %{value}." + text_time_logged_by_changeset: "Applied in changeset %{value}." + text_issues_destroy_confirmation: 'Are you sure you want to delete the selected issue(s)?' + text_select_project_modules: 'Select modules to enable for this project:' + text_default_administrator_account_changed: Default administrator account changed + text_file_repository_writable: Attachments directory writable + text_plugin_assets_writable: Plugin assets directory writable + text_rmagick_available: RMagick available (optional) + text_destroy_time_entries_question: "%{hours} hours were reported on the issues you are about to delete. What do you want to do?" + text_destroy_time_entries: Delete reported hours + text_assign_time_entries_to_project: Assign reported hours to the project + text_reassign_time_entries: 'Reassign reported hours to this issue:' + text_user_wrote: "%{value} wrote:" + text_enumeration_destroy_question: "%{count} objects are assigned to this value." + text_enumeration_category_reassign_to: 'Reassign them to this value:' + text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server in config/configuration.yml and restart the application to enable them." + text_repository_usernames_mapping: "Select or update the Redmine user mapped to each username found in the repository log.\nUsers with the same Redmine and repository username or email are automatically mapped." + text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.' + text_custom_field_possible_values_info: 'One line for each value' + text_wiki_page_destroy_question: "This page has %{descendants} child page(s) and descendant(s). What do you want to do?" + text_wiki_page_nullify_children: "Keep child pages as root pages" + text_wiki_page_destroy_children: "Delete child pages and all their descendants" + text_wiki_page_reassign_children: "Reassign child pages to this parent page" + text_own_membership_delete_confirmation: "You are about to remove some or all of your permissions and may no longer be able to edit this project after that.\nAre you sure you want to continue?" + text_zoom_in: Zoom in + text_zoom_out: Zoom out + text_warn_on_leaving_unsaved: "The current page contains unsaved text that will be lost if you leave this page." + + default_role_manager: Manager + default_role_developer: Developer + default_role_reporter: Reporter + default_role_non_member: Non member + default_role_anonymous: Anonymous + default_tracker_bug: Bug + default_tracker_feature: Feature + default_tracker_support: Support + default_issue_status_new: New + default_issue_status_in_progress: In Progress + default_issue_status_resolved: Resolved + default_issue_status_feedback: Feedback + default_issue_status_closed: Closed + default_issue_status_rejected: Rejected + default_doc_category_user: User documentation + default_doc_category_tech: Technical documentation + default_priority_low: Low + default_priority_normal: Normal + default_priority_high: High + default_priority_urgent: Urgent + default_priority_immediate: Immediate + default_activity_design: Design + default_activity_development: Development + + enumeration_issue_priorities: Issue priorities + enumeration_doc_categories: Document categories + enumeration_activities: Activities (time tracking) + enumeration_system_activity: System Activity + + text_powered_by: "Powered by %{link}" label_cvs_module: Module label_filesystem_path: Root directory label_darcs_path: Root directory @@ -950,3 +960,10 @@ en-GB: label_cvs_path: CVSROOT label_git_path: Path to .git directory label_mercurial_path: Root directory + label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee + label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author + text_default_encoding: "Default: UTF-8" + text_git_repo_example: a bare and local repository (e.g. /gitrepo, c:\gitrepo) + label_notify_member_plural: Email issue updates + label_path_encoding: Path encoding + text_mercurial_repo_example: local repository (e.g. /hgrepo, c:\hgrepo) diff --git a/config/locales/en.yml b/config/locales/en.yml index 382273f5..e08c0731 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -9,15 +9,18 @@ en: default: "%m/%d/%Y" short: "%b %d" long: "%B %d, %Y" - + day_names: [Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday] abbr_day_names: [Sun, Mon, Tue, Wed, Thu, Fri, Sat] - + # Don't forget the nil at the beginning; there's no such thing as a 0th month month_names: [~, January, February, March, April, May, June, July, August, September, October, November, December] abbr_month_names: [~, Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec] # Used in date_select and datime_select. - order: [ :year, :month, :day ] + order: + - :year + - :month + - :day time: formats: @@ -27,7 +30,7 @@ en: long: "%B %d, %Y %H:%M" am: "am" pm: "pm" - + datetime: distance_in_words: half_a_minute: "half a minute" @@ -66,11 +69,11 @@ en: other: "almost %{count} years" number: - # Default format for numbers format: - separator: "." + separator: "." delimiter: "" precision: 3 + human: format: delimiter: "" @@ -86,13 +89,13 @@ en: gb: "GB" tb: "TB" - + # Used in array.to_sentence. support: array: sentence_connector: "and" skip_last_comma: false - + activerecord: errors: template: @@ -123,10 +126,10 @@ en: greater_than_start_date: "must be greater than start date" not_same_project: "doesn't belong to the same project" circular_dependency: "This relation would create a circular dependency" - cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks" + cant_link_an_issue_with_a_descendant: "An issue cannot be linked to one of its subtasks" actionview_instancetag_blank_option: Please select - + general_text_No: 'No' general_text_Yes: 'Yes' general_text_no: 'no' @@ -137,7 +140,7 @@ en: general_csv_encoding: ISO-8859-1 general_pdf_encoding: ISO-8859-1 general_first_day_of_week: '7' - + notice_account_updated: Account was successfully updated. notice_account_invalid_creditentials: Invalid user or password notice_account_password_updated: Password was successfully updated. @@ -168,26 +171,26 @@ en: notice_unable_delete_time_entry: Unable to delete time log entry. notice_issue_done_ratios_updated: Issue done ratios updated. notice_gantt_chart_truncated: "The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})" - + error_can_t_load_default_data: "Default configuration could not be loaded: %{value}" error_scm_not_found: "The entry or revision was not found in the repository." error_scm_command_failed: "An error occurred when trying to access the repository: %{value}" - error_scm_annotate: "The entry does not exist or can not be annotated." + error_scm_annotate: "The entry does not exist or cannot be annotated." error_issue_not_found_in_project: 'The issue was not found or does not belong to this project' error_no_tracker_in_project: 'No tracker is associated to this project. Please check the Project settings.' error_no_default_issue_status: 'No default issue status is defined. Please check your configuration (Go to "Administration -> Issue statuses").' error_can_not_delete_custom_field: Unable to delete custom field - error_can_not_delete_tracker: "This tracker contains issues and can't be deleted." - error_can_not_remove_role: "This role is in use and can not be deleted." - error_can_not_reopen_issue_on_closed_version: 'An issue assigned to a closed version can not be reopened' - error_can_not_archive_project: This project can not be archived + error_can_not_delete_tracker: "This tracker contains issues and cannot be deleted." + error_can_not_remove_role: "This role is in use and cannot be deleted." + error_can_not_reopen_issue_on_closed_version: 'An issue assigned to a closed version cannot be reopened' + error_can_not_archive_project: This project cannot be archived error_issue_done_ratios_not_updated: "Issue done ratios not updated." error_workflow_copy_source: 'Please select a source tracker or role' error_workflow_copy_target: 'Please select target tracker(s) and role(s)' error_unable_delete_issue_status: 'Unable to delete issue status' error_unable_to_connect: "Unable to connect (%{value})" warning_attachments_not_saved: "%{count} file(s) could not be saved." - + mail_subject_lost_password: "Your %{value} password" mail_body_lost_password: 'To change your password, click on the following link:' mail_subject_register: "Your %{value} account activation" @@ -202,16 +205,16 @@ en: mail_body_wiki_content_added: "The '%{id}' wiki page has been added by %{author}." mail_subject_wiki_content_updated: "'%{id}' wiki page has been updated" mail_body_wiki_content_updated: "The '%{id}' wiki page has been updated by %{author}." - + gui_validation_error: 1 error gui_validation_error_plural: "%{count} errors" - + field_name: Name field_description: Description field_summary: Summary field_is_required: Required - field_firstname: Firstname - field_lastname: Lastname + field_firstname: First name + field_lastname: Last name field_mail: Email field_filename: File field_filesize: Size @@ -252,7 +255,7 @@ en: field_admin: Administrator field_last_login_on: Last connection field_language: Language - field_effective_date: Date + field_effective_date: Due date field_password: Password field_new_password: New password field_password_confirmation: Confirmation @@ -268,7 +271,7 @@ en: field_attr_mail: Email attribute field_onthefly: On-the-fly user creation field_start_date: Start date - field_done_ratio: % Done + field_done_ratio: "% Done" field_auth_source: Authentication mode field_hide_mail: Hide my email address field_comments: Comment @@ -303,7 +306,8 @@ en: field_assigned_to_role: "Assignee's role" field_text: Text field field_visible: Visible - + field_warn_on_leaving_unsaved: "Warn me when leaving a page with unsaved text" + setting_app_title: Application title setting_app_subtitle: Application subtitle setting_welcome_text: Welcome text @@ -362,7 +366,7 @@ en: setting_commit_logtime_enabled: Enable time logging setting_commit_logtime_activity_id: Activity for logged time setting_gantt_items_limit: Maximum number of items displayed on the gantt chart - + permission_add_project: Create project permission_add_subprojects: Create subprojects permission_edit_project: Edit project @@ -409,7 +413,7 @@ en: permission_browse_repository: Browse repository permission_view_changesets: View changesets permission_commit_access: Commit access - permission_manage_boards: Manage boards + permission_manage_boards: Manage forums permission_view_messages: View messages permission_add_messages: Post messages permission_edit_messages: Edit messages @@ -418,7 +422,7 @@ en: permission_delete_own_messages: Delete own messages permission_export_wiki_pages: Export wiki pages permission_manage_subtasks: Manage subtasks - + project_module_issue_tracking: Issue tracking project_module_time_tracking: Time tracking project_module_news: News @@ -426,10 +430,10 @@ en: project_module_files: Files project_module_wiki: Wiki project_module_repository: Repository - project_module_boards: Boards + project_module_boards: Forums project_module_calendar: Calendar project_module_gantt: Gantt - + label_user: User label_user_plural: Users label_user_new: New user @@ -536,6 +540,7 @@ en: label_news_latest: Latest news label_news_view_all: View all news label_news_added: News added + label_news_comment_added: Comment added to a news label_settings: Settings label_overview: Overview label_version: Version @@ -594,6 +599,7 @@ en: label_query: Custom query label_query_plural: Custom queries label_query_new: New query + label_my_queries: My custom queries label_filter_add: Add filter label_filter_plural: Filters label_equals: is @@ -625,7 +631,7 @@ en: label_modification: "%{count} change" label_modification_plural: "%{count} changes" label_branch: Branch - label_tag: Tag + label_tag: Tag label_revision: Revision label_revision_plural: Revisions label_revision_id: "Revision %{value}" @@ -800,12 +806,18 @@ en: label_cvs_module: Module label_bazaar_path: Root directory label_filesystem_path: Root directory + label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee + label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author + label_notify_member_plural: Email issue updates + label_path_encoding: Path encoding button_login: Login button_submit: Submit button_save: Save button_check_all: Check all button_uncheck_all: Uncheck all + button_collapse_all: Collapse all + button_expand_all: Expand all button_delete: Delete button_create: Create button_create_and_continue: Create and continue @@ -845,33 +857,34 @@ en: button_quote: Quote button_duplicate: Duplicate button_show: Show - + status_active: active status_registered: registered status_locked: locked - + version_status_open: open version_status_locked: locked version_status_closed: closed field_active: Active - + text_select_mail_notifications: Select actions for which email notifications should be sent. text_regexp_info: eg. ^[A-Z0-9]+$ text_min_max_length_info: 0 means no restriction - text_project_destroy_confirmation: Are you sure you want to delete this project and related data ? + text_project_destroy_confirmation: Are you sure you want to delete this project and related data? text_subprojects_destroy_warning: "Its subproject(s): %{value} will be also deleted." text_workflow_edit: Select a role and a tracker to edit the workflow - text_are_you_sure: Are you sure ? + text_are_you_sure: Are you sure? text_are_you_sure_with_children: "Delete issue and all child issues?" text_journal_changed: "%{label} changed from %{old} to %{new}" + text_journal_changed_no_detail: "%{label} updated" text_journal_set_to: "%{label} set to %{value}" text_journal_deleted: "%{label} deleted (%{old})" text_journal_added: "%{label} %{value} added" text_tip_issue_begin_day: issue beginning this day text_tip_issue_end_day: issue ending this day text_tip_issue_begin_end_day: issue beginning and ending this day - text_project_identifier_info: 'Only lower case letters (a-z), numbers, dashes and underscores are allowed.
Once saved, the identifier can not be changed.' + text_project_identifier_info: 'Only lower case letters (a-z), numbers, dashes and underscores are allowed.
Once saved, the identifier cannot be changed.' text_caracters_maximum: "%{count} characters maximum." text_caracters_minimum: "Must be at least %{count} characters long." text_length_between: "Length between %{min} and %{max} characters." @@ -882,8 +895,8 @@ en: text_issues_ref_in_commit_messages: Referencing and fixing issues in commit messages text_issue_added: "Issue %{id} has been reported by %{author}." text_issue_updated: "Issue %{id} has been updated by %{author}." - text_wiki_destroy_confirmation: Are you sure you want to delete this wiki and all its content ? - text_issue_category_destroy_question: "Some issues (%{count}) are assigned to this category. What do you want to do ?" + text_wiki_destroy_confirmation: Are you sure you want to delete this wiki and all its content? + text_issue_category_destroy_question: "Some issues (%{count}) are assigned to this category. What do you want to do?" text_issue_category_destroy_assignments: Remove category assignments text_issue_category_reassign_to: Reassign issues to this category text_user_mail_option: "For unselected projects, you will only receive notifications about things you watch or you're involved in (eg. issues you're the author or assignee)." @@ -891,13 +904,13 @@ en: text_load_default_configuration: Load the default configuration text_status_changed_by_changeset: "Applied in changeset %{value}." text_time_logged_by_changeset: "Applied in changeset %{value}." - text_issues_destroy_confirmation: 'Are you sure you want to delete the selected issue(s) ?' + text_issues_destroy_confirmation: 'Are you sure you want to delete the selected issue(s)?' text_select_project_modules: 'Select modules to enable for this project:' text_default_administrator_account_changed: Default administrator account changed text_file_repository_writable: Attachments directory writable text_plugin_assets_writable: Plugin assets directory writable text_rmagick_available: RMagick available (optional) - text_destroy_time_entries_question: "%{hours} hours were reported on the issues you are about to delete. What do you want to do ?" + text_destroy_time_entries_question: "%{hours} hours were reported on the issues you are about to delete. What do you want to do?" text_destroy_time_entries: Delete reported hours text_assign_time_entries_to_project: Assign reported hours to the project text_reassign_time_entries: 'Reassign reported hours to this issue:' @@ -916,7 +929,11 @@ en: text_zoom_in: Zoom in text_zoom_out: Zoom out text_powered_by: "Powered by %{link}" - + text_warn_on_leaving_unsaved: "The current page contains unsaved text that will be lost if you leave this page." + text_default_encoding: "Default: UTF-8" + text_mercurial_repo_example: "local repository (e.g. /hgrepo, c:\\hgrepo)" + text_git_repo_example: "a bare and local repository (e.g. /gitrepo, c:\\gitrepo)" + default_role_manager: Manager default_role_developer: Developer default_role_reporter: Reporter @@ -940,9 +957,8 @@ en: default_priority_immediate: Immediate default_activity_design: Design default_activity_development: Development - + enumeration_issue_priorities: Issue priorities enumeration_doc_categories: Document categories enumeration_activities: Activities (time tracking) enumeration_system_activity: System Activity - diff --git a/config/locales/es.yml b/config/locales/es.yml index f7b868a7..ce602f72 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -1,6 +1,6 @@ # Spanish translations for Rails # by Francisco Fernando García Nieto (ffgarcianieto@gmail.com) -# Redmine spanish translation: +# Redmine spanish translation: # by J. Cayetano Delgado (Cayetano _dot_ Delgado _at_ ioko _dot_ com) es: @@ -9,9 +9,9 @@ es: # These are also the defaults for 'currency', 'percentage', 'precision', and 'human' format: # Sets the separator between the units, for more precision (e.g. 1.0 / 2.0 == 0.5) - separator: "," + separator: "," # Delimets thousands (e.g. 1,000,000 is a million) (always in groups of three) - delimiter: "." + delimiter: "." # Number of decimals, behind the separator (1 with a precision of 2 gives: 1.00) precision: 3 @@ -19,35 +19,35 @@ es: currency: format: # Where is the currency sign? %u is the currency unit, %n the number (default: $5.00) - format: "%n %u" - unit: "€" + format: "%n %u" + unit: "€" # These three are to override number.format and are optional - separator: "," - delimiter: "." + separator: "," + delimiter: "." precision: 2 # Used in number_to_percentage() percentage: format: # These three are to override number.format and are optional - # separator: - delimiter: "" - # precision: + # separator: + delimiter: "" + # precision: # Used in number_to_precision() precision: format: # These three are to override number.format and are optional # separator: - delimiter: "" + delimiter: "" # precision: # Used in number_to_human_size() human: format: # These three are to override number.format and are optional - # separator: - delimiter: "" + # separator: + delimiter: "" precision: 1 storage_units: format: "%n %u" @@ -63,37 +63,37 @@ es: # Used in distance_of_time_in_words(), distance_of_time_in_words_to_now(), time_ago_in_words() datetime: distance_in_words: - half_a_minute: "medio minuto" + half_a_minute: "medio minuto" less_than_x_seconds: - one: "menos de 1 segundo" + one: "menos de 1 segundo" other: "menos de %{count} segundos" x_seconds: - one: "1 segundo" - other: "%{count} segundos" + one: "1 segundo" + other: "%{count} segundos" less_than_x_minutes: - one: "menos de 1 minuto" - other: "menos de %{count} minutos" + one: "menos de 1 minuto" + other: "menos de %{count} minutos" x_minutes: - one: "1 minuto" - other: "%{count} minutos" + one: "1 minuto" + other: "%{count} minutos" about_x_hours: - one: "alrededor de 1 hora" - other: "alrededor de %{count} horas" + one: "alrededor de 1 hora" + other: "alrededor de %{count} horas" x_days: - one: "1 día" - other: "%{count} días" + one: "1 día" + other: "%{count} días" about_x_months: - one: "alrededor de 1 mes" - other: "alrededor de %{count} meses" + one: "alrededor de 1 mes" + other: "alrededor de %{count} meses" x_months: - one: "1 mes" - other: "%{count} meses" + one: "1 mes" + other: "%{count} meses" about_x_years: - one: "alrededor de 1 año" - other: "alrededor de %{count} años" + one: "alrededor de 1 año" + other: "alrededor de %{count} años" over_x_years: - one: "más de 1 año" - other: "más de %{count} años" + one: "más de 1 año" + other: "más de %{count} años" almost_x_years: one: "casi 1 año" other: "casi %{count} años" @@ -102,17 +102,17 @@ es: errors: template: header: - one: "no se pudo guardar este %{model} porque se encontró 1 error" - other: "no se pudo guardar este %{model} porque se encontraron %{count} errores" + one: "no se pudo guardar este %{model} porque se encontró 1 error" + other: "no se pudo guardar este %{model} porque se encontraron %{count} errores" # The variable :count is also available - body: "Se encontraron problemas con los siguientes campos:" + body: "Se encontraron problemas con los siguientes campos:" # The values :model, :attribute and :value are always available for interpolation # The value :count is available when applicable. Can be used for pluralization. messages: - inclusion: "no está incluido en la lista" - exclusion: "está reservado" - invalid: "no es válido" + inclusion: "no está incluido en la lista" + exclusion: "está reservado" + invalid: "no es válido" confirmation: "no coincide con la confirmación" accepted: "debe ser aceptado" empty: "no puede estar vacío" @@ -148,9 +148,9 @@ es: # Use the strftime parameters for formats. # When no format has been given, it uses default. # You can provide other formats here if you like! - default: "%Y-%m-%d" - short: "%d de %b" - long: "%d de %B de %Y" + default: "%Y-%m-%d" + short: "%d de %b" + long: "%d de %B de %Y" day_names: [Domingo, Lunes, Martes, Miércoles, Jueves, Viernes, Sábado] abbr_day_names: [Dom, Lun, Mar, Mie, Jue, Vie, Sab] @@ -159,16 +159,19 @@ es: month_names: [~, Enero, Febrero, Marzo, Abril, Mayo, Junio, Julio, Agosto, Setiembre, Octubre, Noviembre, Diciembre] abbr_month_names: [~, Ene, Feb, Mar, Abr, May, Jun, Jul, Ago, Set, Oct, Nov, Dic] # Used in date_select and datime_select. - order: [ :year, :month, :day ] + order: + - :year + - :month + - :day time: formats: default: "%A, %d de %B de %Y %H:%M:%S %z" time: "%H:%M" - short: "%d de %b %H:%M" - long: "%d de %B de %Y %H:%M" - am: "am" - pm: "pm" + short: "%d de %b %H:%M" + long: "%d de %B de %Y %H:%M" + am: "am" + pm: "pm" # Used in array.to_sentence. support: @@ -176,7 +179,7 @@ es: sentence_connector: "y" actionview_instancetag_blank_option: Por favor seleccione - + button_activate: Activar button_add: Añadir button_annotate: Anotar @@ -266,10 +269,9 @@ es: field_default_value: Estado por defecto field_delay: Retraso field_description: Descripción - field_done_ratio: % Realizado + field_done_ratio: "% Realizado" field_downloads: Descargas field_due_date: Fecha fin - field_effective_date: Fecha field_estimated_hours: Tiempo estimado field_field_format: Formato field_filename: Fichero @@ -884,7 +886,7 @@ es: version_status_locked: bloqueado version_status_open: abierto error_can_not_reopen_issue_on_closed_version: No se puede reabrir una petición asignada a una versión cerrada - + label_user_anonymous: Anónimo button_move_and_follow: Mover y seguir setting_default_projects_modules: Módulos activados por defecto en proyectos nuevos @@ -983,3 +985,18 @@ es: label_cvs_path: CVSROOT label_git_path: Path to .git directory label_mercurial_path: Root directory + label_my_queries: My custom queries + label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee + text_journal_changed_no_detail: "%{label} updated" + button_expand_all: Expand all + button_collapse_all: Collapse all + label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author + field_effective_date: Due date + label_news_comment_added: Comment added to a news + field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text + text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page. + text_default_encoding: "Default: UTF-8" + text_git_repo_example: a bare and local repository (e.g. /gitrepo, c:\gitrepo) + label_notify_member_plural: Email issue updates + label_path_encoding: Path encoding + text_mercurial_repo_example: local repository (e.g. /hgrepo, c:\hgrepo) diff --git a/config/locales/eu.yml b/config/locales/eu.yml index 67983023..7d71c3cc 100644 --- a/config/locales/eu.yml +++ b/config/locales/eu.yml @@ -1,948 +1,929 @@ -# Redmine EU language -# Author: Ales Zabala Alava (Shagi), -# 2010-01-25 -# Distributed under the same terms as the Redmine itself. -eu: - direction: ltr - date: - formats: - # Use the strftime parameters for formats. - # When no format has been given, it uses default. - # You can provide other formats here if you like! - default: "%Y/%m/%d" - short: "%b %d" - long: "%Y %B %d" - - day_names: [Igandea, Astelehena, Asteartea, Asteazkena, Osteguna, Ostirala, Larunbata] - abbr_day_names: [Ig., Al., Ar., Az., Og., Or., La.] - - # Don't forget the nil at the beginning; there's no such thing as a 0th month - month_names: [~, Urtarrila, Otsaila, Martxoa, Apirila, Maiatza, Ekaina, Uztaila, Abuztua, Iraila, Urria, Azaroa, Abendua] - abbr_month_names: [~, Urt, Ots, Mar, Api, Mai, Eka, Uzt, Abu, Ira, Urr, Aza, Abe] - # Used in date_select and datime_select. - order: [ :year, :month, :day ] - - time: - formats: - default: "%Y/%m/%d %H:%M" - time: "%H:%M" - short: "%b %d %H:%M" - long: "%Y %B %d %H:%M" - am: "am" - pm: "pm" - - datetime: - distance_in_words: - half_a_minute: "minutu erdi" - less_than_x_seconds: - one: "segundu bat baino gutxiago" - other: "%{count} segundu baino gutxiago" - x_seconds: - one: "segundu 1" - other: "%{count} segundu" - less_than_x_minutes: - one: "minutu bat baino gutxiago" - other: "%{count} minutu baino gutxiago" - x_minutes: - one: "minutu 1" - other: "%{count} minutu" - about_x_hours: - one: "ordu 1 inguru" - other: "%{count} ordu inguru" - x_days: - one: "egun 1" - other: "%{count} egun" - about_x_months: - one: "hilabete 1 inguru" - other: "%{count} hilabete inguru" - x_months: - one: "hilabete 1" - other: "%{count} hilabete" - about_x_years: - one: "urte 1 inguru" - other: "%{count} urte inguru" - over_x_years: - one: "urte 1 baino gehiago" - other: "%{count} urte baino gehiago" - almost_x_years: - one: "ia urte 1" - other: "ia %{count} urte" - - number: - format: - separator: "." - delimiter: "" - precision: 3 - human: - format: - delimiter: "" - precision: 1 - storage_units: - format: "%n %u" - units: - byte: - one: "Byte" - other: "Byte" - kb: "KB" - mb: "MB" - gb: "GB" - tb: "TB" - - -# Used in array.to_sentence. - support: - array: - sentence_connector: "eta" - skip_last_comma: false - - activerecord: - errors: - template: - header: - one: "1 error prohibited this %{model} from being saved" - other: "%{count} errors prohibited this %{model} from being saved" - messages: - inclusion: "ez dago zerrendan" - exclusion: "erreserbatuta dago" - invalid: "baliogabea da" - confirmation: "ez du berrespenarekin bat egiten" - accepted: "onartu behar da" - empty: "ezin da hutsik egon" - blank: "ezin da hutsik egon" - too_long: "luzeegia da (maximoa %{count} karaktere dira)" - too_short: "laburregia da (minimoa %{count} karaktere dira)" - wrong_length: "luzera ezegokia da (%{count} karakter izan beharko litzake)" - taken: "dagoeneko hartuta dago" - not_a_number: "ez da zenbaki bat" - not_a_date: "ez da baliozko data" - greater_than: "%{count} baino handiagoa izan behar du" - greater_than_or_equal_to: "%{count} edo handiagoa izan behar du" - equal_to: "%{count} izan behar du" - less_than: "%{count} baino gutxiago izan behar du" - less_than_or_equal_to: "%{count} edo gutxiago izan behar du" - odd: "bakoitia izan behar du" - even: "bikoitia izan behar du" - greater_than_start_date: "hasiera data baino handiagoa izan behar du" - not_same_project: "ez dago proiektu berdinean" - circular_dependency: "Erlazio honek mendekotasun zirkular bat sortuko luke" - cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks" - - actionview_instancetag_blank_option: Hautatu mesedez - - general_text_No: 'Ez' - general_text_Yes: 'Bai' - general_text_no: 'ez' - general_text_yes: 'bai' - general_lang_name: 'Euskara' - general_csv_separator: ',' - general_csv_decimal_separator: '.' - general_csv_encoding: UTF-8 - general_pdf_encoding: UTF-8 - general_first_day_of_week: '1' - - notice_account_updated: Kontua ongi eguneratu da. - notice_account_invalid_creditentials: Erabiltzaile edo pasahitz ezegokia - notice_account_password_updated: Pasahitza ongi eguneratu da. - notice_account_wrong_password: Pasahitz ezegokia. - notice_account_register_done: Kontua ongi sortu da. Kontua gaitzeko klikatu epostan adierazi zaizun estekan. - notice_account_unknown_email: Erabiltzaile ezezaguna. - notice_can_t_change_password: Kontu honek kanpoko autentikazio bat erabiltzen du. Ezinezkoa da pasahitza aldatzea. - notice_account_lost_email_sent: Pasahitz berria aukeratzeko jarraibideak dituen eposta bat bidali zaizu. - notice_account_activated: Zure kontua gaituta dago. Orain saioa has dezakezu - notice_successful_create: Sortze arrakastatsua. - notice_successful_update: Eguneratze arrakastatsua. - notice_successful_delete: Ezabaketa arrakastatsua. - notice_successful_connection: Konexio arrakastatsua. - notice_file_not_found: Atzitu nahi duzun orria ez da exisitzen edo ezabatua izan da. - notice_locking_conflict: Beste erabiltzaile batek datuak eguneratu ditu. - notice_not_authorized: Ez duzu orri hau atzitzeko baimenik. - notice_email_sent: "%{value} helbidera eposta bat bidali da" - notice_email_error: "Errorea eposta bidaltzean (%{value})" - notice_feeds_access_key_reseted: Zure RSS atzipen giltza berrezarri da. - notice_api_access_key_reseted: Zure API atzipen giltza berrezarri da. - notice_failed_to_save_issues: "Hautatutako %{total} zereginetatik %{count} ezin izan dira konpondu: %{ids}." - notice_no_issue_selected: "Ez da zereginik hautatu! Mesedez, editatu nahi dituzun arazoak markatu." - notice_account_pending: "Zure kontua sortu da, orain kudeatzailearen onarpenaren zain dago." - notice_default_data_loaded: Lehenetsitako konfigurazioa ongi kargatu da. - notice_unable_delete_version: Ezin da bertsioa ezabatu. - notice_issue_done_ratios_updated: Burututako zereginen erlazioa eguneratu da. - - error_can_t_load_default_data: "Ezin izan da lehenetsitako konfigurazioa kargatu: %{value}" - error_scm_not_found: "Sarrera edo berrikuspena ez da biltegian topatu." - error_scm_command_failed: "Errorea gertatu da biltegia atzitzean: %{value}" - error_scm_annotate: "Sarrera ez da existitzen edo ezin da anotatu." - error_issue_not_found_in_project: 'Zeregina ez da topatu edo ez da proiektu honetakoa' - error_no_tracker_in_project: 'Proiektu honek ez du aztarnaririk esleituta. Mesedez egiaztatu Proiektuaren ezarpenak.' - error_no_default_issue_status: 'Zereginek ez dute lehenetsitako egoerarik. Mesedez egiaztatu zure konfigurazioa ("Kudeaketa -> Arazoen egoerak" atalera joan).' - error_can_not_reopen_issue_on_closed_version: 'Itxitako bertsio batera esleitutako zereginak ezin dira berrireki' - error_can_not_archive_project: Proiektu hau ezin da artxibatu - error_issue_done_ratios_not_updated: "Burututako zereginen erlazioa ez da eguneratu." - error_workflow_copy_source: 'Mesedez hautatu iturburuko aztarnari edo rola' - error_workflow_copy_target: 'Mesedez hautatu helburuko aztarnari(ak) edo rola(k)' - - warning_attachments_not_saved: "%{count} fitxategi ezin izan d(ir)a gorde." - - mail_subject_lost_password: "Zure %{value} pasahitza" - mail_body_lost_password: 'Zure pasahitza aldatzeko hurrengo estekan klikatu:' - mail_subject_register: "Zure %{value} kontuaren gaitzea" - mail_body_register: 'Zure kontua gaitzeko hurrengo estekan klikatu:' - mail_body_account_information_external: "Zure %{value} kontua erabil dezakezu saioa hasteko." - mail_body_account_information: Zure kontuaren informazioa - mail_subject_account_activation_request: "%{value} kontu gaitzeko eskaera" - mail_body_account_activation_request: "Erabiltzaile berri bat (%{value}) erregistratu da. Kontua zure onarpenaren zain dago:" - mail_subject_reminder: "%{count} arazo hurrengo %{days} egunetan amaitzen d(ir)a" - mail_body_reminder: "Zuri esleituta dauden %{count} arazo hurrengo %{days} egunetan amaitzen d(ir)a:" - mail_subject_wiki_content_added: "'%{id}' wiki orria gehitu da" - mail_body_wiki_content_added: "%{author}-(e)k '%{id}' wiki orria gehitu du." - mail_subject_wiki_content_updated: "'%{id}' wiki orria eguneratu da" - mail_body_wiki_content_updated: "%{author}-(e)k '%{id}' wiki orria eguneratu du." - - gui_validation_error: akats 1 - gui_validation_error_plural: "%{count} akats" - - field_name: Izena - field_description: Deskribapena - field_summary: Laburpena - field_is_required: Beharrezkoa - field_firstname: Izena - field_lastname: Abizenak - field_mail: Eposta - field_filename: Fitxategia - field_filesize: Tamaina - field_downloads: Deskargak - field_author: Egilea - field_created_on: Sortuta - field_updated_on: Eguneratuta - field_field_format: Formatua - field_is_for_all: Proiektu guztietarako - field_possible_values: Balio posibleak - field_regexp: Expresio erregularra - field_min_length: Luzera minimoa - field_max_length: Luzera maxioma - field_value: Balioa - field_category: Kategoria - field_title: Izenburua - field_project: Proiektua - field_issue: Zeregina - field_status: Egoera - field_notes: Oharrak - field_is_closed: Itxitako arazoa - field_is_default: Lehenetsitako balioa - field_tracker: Aztarnaria - field_subject: Gaia - field_due_date: Amaiera data - field_assigned_to: Esleituta - field_priority: Lehentasuna - field_fixed_version: Helburuko bertsioa - field_user: Erabiltzilea - field_role: Rola - field_homepage: Orri nagusia - field_is_public: Publikoa - field_parent: "Honen azpiproiektua:" - field_is_in_chlog: Zereginak aldaketa egunkarian ikusten dira - field_is_in_roadmap: Arazoak ibilbide-mapan erakutsi - field_login: Erabiltzaile izena - field_mail_notification: Eposta jakinarazpenak - field_admin: Kudeatzailea - field_last_login_on: Azken konexioa - field_language: Hizkuntza - field_effective_date: Data - field_password: Pasahitza - field_new_password: Pasahitz berria - field_password_confirmation: Berrespena - field_version: Bertsioa - field_type: Mota - field_host: Ostalaria - field_port: Portua - field_account: Kontua - field_base_dn: Base DN - field_attr_login: Erabiltzaile atributua - field_attr_firstname: Izena atributua - field_attr_lastname: Abizenak atributua - field_attr_mail: Eposta atributua - field_onthefly: Zuzeneko erabiltzaile sorrera - field_start_date: Hasiera - field_done_ratio: Egindako % - field_auth_source: Autentikazio modua - field_hide_mail: Nire eposta helbidea ezkutatu - field_comments: Iruzkina - field_url: URL - field_start_page: Hasierako orria - field_subproject: Azpiproiektua - field_hours: Ordu - field_activity: Jarduera - field_spent_on: Data - field_identifier: Identifikatzailea - field_is_filter: Iragazki moduan erabilita - field_issue_to: Erlazionatutako zereginak - field_delay: Atzerapena - field_assignable: Arazoak rol honetara esleitu daitezke - field_redirect_existing_links: Existitzen diren estelak berbideratu - field_estimated_hours: Estimatutako denbora - field_column_names: Zutabeak - field_time_zone: Ordu zonaldea - field_searchable: Bilagarria - field_default_value: Lehenetsitako balioa - field_comments_sorting: Iruzkinak erakutsi - field_parent_title: Orri gurasoa - field_editable: Editagarria - field_watcher: Behatzailea - field_identity_url: OpenID URLa - field_content: Edukia - field_group_by: Emaitzak honegatik taldekatu - field_sharing: Partekatzea - - setting_app_title: Aplikazioaren izenburua - setting_app_subtitle: Aplikazioaren azpizenburua - setting_welcome_text: Ongietorriko testua - setting_default_language: Lehenetsitako hizkuntza - setting_login_required: Autentikazioa derrigorrezkoa - setting_self_registration: Norberak erregistratu - setting_attachment_max_size: Eranskinen tamaina max. - setting_issues_export_limit: Zereginen esportatze limitea - setting_mail_from: Igorlearen eposta helbidea - setting_bcc_recipients: Hartzaileak ezkutuko kopian (bcc) - setting_plain_text_mail: Testu soileko epostak (HTML-rik ez) - setting_host_name: Ostalari izena eta bidea - setting_text_formatting: Testu formatua - setting_wiki_compression: Wikiaren historia konprimitu - setting_feeds_limit: Jarioaren edukiera limitea - setting_default_projects_public: Proiektu berriak defektuz publikoak dira - setting_autofetch_changesets: Commit-ak automatikoki hartu - setting_sys_api_enabled: Biltegien kudeaketarako WS gaitu - setting_commit_ref_keywords: Erreferentzien gako-hitzak - setting_commit_fix_keywords: Konpontze gako-hitzak - setting_autologin: Saioa automatikoki hasi - setting_date_format: Data formatua - setting_time_format: Ordu formatua - setting_cross_project_issue_relations: Zereginak proiektuen artean erlazionatzea baimendu - setting_issue_list_default_columns: Zereginen zerrendan defektuz ikusten diren zutabeak - setting_repositories_encodings: Biltegien kodeketak - setting_commit_logs_encoding: Commit-en mezuen kodetzea - setting_emails_footer: Eposten oina - setting_protocol: Protokoloa - setting_per_page_options: Orriko objektuen aukerak - setting_user_format: Erabiltzaileak erakusteko formatua - setting_activity_days_default: Proiektuen jardueran erakusteko egunak - setting_display_subprojects_issues: Azpiproiektuen zereginak proiektu nagusian erakutsi defektuz - setting_enabled_scm: Gaitutako IKKak - setting_mail_handler_body_delimiters: "Lerro hauteko baten ondoren epostak moztu" - setting_mail_handler_api_enabled: Sarrerako epostentzako WS gaitu - setting_mail_handler_api_key: API giltza - setting_sequential_project_identifiers: Proiektuen identifikadore sekuentzialak sortu - setting_gravatar_enabled: Erabili Gravatar erabiltzaile ikonoak - setting_gravatar_default: Lehenetsitako Gravatar irudia - setting_diff_max_lines_displayed: Erakutsiko diren diff lerro kopuru maximoa - setting_file_max_size_displayed: Barnean erakuzten diren testu fitxategien tamaina maximoa - setting_repository_log_display_limit: Egunkari fitxategian erakutsiko diren berrikuspen kopuru maximoa. - setting_openid: Baimendu OpenID saio hasiera eta erregistatzea - setting_password_min_length: Pasahitzen luzera minimoa - setting_new_project_user_role_id: Proiektu berriak sortzerakoan kudeatzaile ez diren erabiltzaileei esleitutako rola - setting_default_projects_modules: Proiektu berrientzako defektuz gaitutako moduluak - setting_issue_done_ratio: "Zereginen burututako tasa kalkulatzean erabili:" - setting_issue_done_ratio_issue_field: Zeregin eremua erabili - setting_issue_done_ratio_issue_status: Zeregin egoera erabili - setting_start_of_week: "Egutegiak noiz hasi:" - setting_rest_api_enabled: Gaitu REST web zerbitzua - - permission_add_project: Proiektua sortu - permission_add_subprojects: Azpiproiektuak sortu - permission_edit_project: Proiektua editatu - permission_select_project_modules: Proiektuaren moduluak hautatu - permission_manage_members: Kideak kudeatu - permission_manage_versions: Bertsioak kudeatu - permission_manage_categories: Arazoen kategoriak kudeatu - permission_view_issues: Zereginak ikusi - permission_add_issues: Zereginak gehitu - permission_edit_issues: Zereginak aldatu - permission_manage_issue_relations: Zereginen erlazioak kudeatu - permission_add_issue_notes: Oharrak gehitu - permission_edit_issue_notes: Oharrak aldatu - permission_edit_own_issue_notes: Nork bere oharrak aldatu - permission_move_issues: Zereginak mugitu - permission_delete_issues: Zereginak ezabatu - permission_manage_public_queries: Galdera publikoak kudeatu - permission_save_queries: Galderak gorde - permission_view_gantt: Gantt diagrama ikusi - permission_view_calendar: Egutegia ikusi - permission_view_issue_watchers: Behatzaileen zerrenda ikusi - permission_add_issue_watchers: Behatzaileak gehitu - permission_delete_issue_watchers: Behatzaileak ezabatu - permission_log_time: Igarotako denbora erregistratu - permission_view_time_entries: Igarotako denbora ikusi - permission_edit_time_entries: Denbora egunkariak editatu - permission_edit_own_time_entries: Nork bere denbora egunkariak editatu - permission_manage_news: Berriak kudeatu - permission_comment_news: Berrien iruzkinak egin - permission_manage_documents: Dokumentuak kudeatu - permission_view_documents: Dokumentuak ikusi - permission_manage_files: Fitxategiak kudeatu - permission_view_files: Fitxategiak ikusi - permission_manage_wiki: Wikia kudeatu - permission_rename_wiki_pages: Wiki orriak berrizendatu - permission_delete_wiki_pages: Wiki orriak ezabatu - permission_view_wiki_pages: Wikia ikusi - permission_view_wiki_edits: Wikiaren historia ikusi - permission_edit_wiki_pages: Wiki orriak editatu - permission_delete_wiki_pages_attachments: Eranskinak ezabatu - permission_protect_wiki_pages: Wiki orriak babestu - permission_manage_repository: Biltegiak kudeatu - permission_browse_repository: Biltegia arakatu - permission_view_changesets: Aldaketak ikusi - permission_commit_access: Commit atzipena - permission_manage_boards: Foroak kudeatu - permission_view_messages: Mezuak ikusi - permission_add_messages: Mezuak bidali - permission_edit_messages: Mezuak aldatu - permission_edit_own_messages: Nork bere mezuak aldatu - permission_delete_messages: Mezuak ezabatu - permission_delete_own_messages: Nork bere mezuak ezabatu - - project_module_issue_tracking: Zereginen jarraipena - project_module_time_tracking: Denbora jarraipena - project_module_news: Berriak - project_module_documents: Dokumentuak - project_module_files: Fitxategiak - project_module_wiki: Wiki - project_module_repository: Biltegia - project_module_boards: Foroak - - label_user: Erabiltzailea - label_user_plural: Erabiltzaileak - label_user_new: Erabiltzaile berria - label_user_anonymous: Ezezaguna - label_project: Proiektua - label_project_new: Proiektu berria - label_project_plural: Proiektuak - label_x_projects: - zero: proiekturik ez - one: proiektu bat - other: "%{count} proiektu" - label_project_all: Proiektu guztiak - label_project_latest: Azken proiektuak - label_issue: Zeregina - label_issue_new: Zeregin berria - label_issue_plural: Zereginak - label_issue_view_all: Zeregin guztiak ikusi - label_issues_by: "Zereginak honengatik: %{value}" - label_issue_added: Zeregina gehituta - label_issue_updated: Zeregina eguneratuta - label_document: Dokumentua - label_document_new: Dokumentu berria - label_document_plural: Dokumentuak - label_document_added: Dokumentua gehituta - label_role: Rola - label_role_plural: Rolak - label_role_new: Rol berria - label_role_and_permissions: Rolak eta baimenak - label_member: Kidea - label_member_new: Kide berria - label_member_plural: Kideak - label_tracker: Aztarnaria - label_tracker_plural: Aztarnariak - label_tracker_new: Aztarnari berria - label_workflow: Workflow - label_issue_status: Zeregin egoera - label_issue_status_plural: Zeregin egoerak - label_issue_status_new: Egoera berria - label_issue_category: Zeregin kategoria - label_issue_category_plural: Zeregin kategoriak - label_issue_category_new: Kategoria berria - label_custom_field: Eremu pertsonalizatua - label_custom_field_plural: Eremu pertsonalizatuak - label_custom_field_new: Eremu pertsonalizatu berria - label_enumerations: Enumerazioak - label_enumeration_new: Balio berria - label_information: Informazioa - label_information_plural: Informazioa - label_please_login: Saioa hasi mesedez - label_register: Erregistratu - label_login_with_open_id_option: edo OpenID-rekin saioa hasi - label_password_lost: Pasahitza galduta - label_home: Hasiera - label_my_page: Nire orria - label_my_account: Nire kontua - label_my_projects: Nire proiektuak - label_administration: Kudeaketa - label_login: Saioa hasi - label_logout: Saioa bukatu - label_help: Laguntza - label_reported_issues: Berri emandako zereginak - label_assigned_to_me_issues: Niri esleitutako arazoak - label_last_login: Azken konexioa - label_registered_on: Noiz erregistratuta - label_activity: Jarduerak - label_overall_activity: Jarduera guztiak - label_user_activity: "%{value}-(r)en jarduerak" - label_new: Berria - label_logged_as: "Sartutako erabiltzailea:" - label_environment: Ingurune - label_authentication: Autentikazioa - label_auth_source: Autentikazio modua - label_auth_source_new: Autentikazio modu berria - label_auth_source_plural: Autentikazio moduak - label_subproject_plural: Azpiproiektuak - label_subproject_new: Azpiproiektu berria - label_and_its_subprojects: "%{value} eta bere azpiproiektuak" - label_min_max_length: Luzera min - max - label_list: Zerrenda - label_date: Data - label_integer: Osokoa - label_float: Koma higikorrekoa - label_boolean: Boolearra - label_string: Testua - label_text: Testu luzea - label_attribute: Atributua - label_attribute_plural: Atributuak - label_download: "Deskarga %{count}" - label_download_plural: "%{count} Deskarga" - label_no_data: Ez dago erakusteko daturik - label_change_status: Egoera aldatu - label_history: Historikoa - label_attachment: Fitxategia - label_attachment_new: Fitxategi berria - label_attachment_delete: Fitxategia ezabatu - label_attachment_plural: Fitxategiak - label_file_added: Fitxategia gehituta - label_report: Berri ematea - label_report_plural: Berri emateak - label_news: Beria - label_news_new: Berria gehitu - label_news_plural: Berriak - label_news_latest: Azken berriak - label_news_view_all: Berri guztiak ikusi - label_news_added: Berria gehituta - label_change_log: Aldaketa egunkaria - label_settings: Ezarpenak - label_overview: Gainbegirada - label_version: Bertsioa - label_version_new: Bertsio berria - label_version_plural: Bertsioak - label_close_versions: Burututako bertsioak itxi - label_confirmation: Baieztapena - label_export_to: 'Eskuragarri baita:' - label_read: Irakurri... - label_public_projects: Proiektu publikoak - label_open_issues: irekita - label_open_issues_plural: irekiak - label_closed_issues: itxita - label_closed_issues_plural: itxiak - label_x_open_issues_abbr_on_total: - zero: 0 irekita / %{total} - one: 1 irekita / %{total} - other: "%{count} irekiak / %{total}" - label_x_open_issues_abbr: - zero: 0 irekita - one: 1 irekita - other: "%{count} irekiak" - label_x_closed_issues_abbr: - zero: 0 itxita - one: 1 itxita - other: "%{count} itxiak" - label_total: Guztira - label_permissions: Baimenak - label_current_status: Uneko egoera - label_new_statuses_allowed: Baimendutako egoera berriak - label_all: guztiak - label_none: ezer - label_nobody: inor - label_next: Hurrengoa - label_previous: Aurrekoak - label_used_by: Erabilita - label_details: Xehetasunak - label_add_note: Oharra gehitu - label_per_page: Orriko - label_calendar: Egutegia - label_months_from: months from - label_gantt: Gantt - label_internal: Barnekoa - label_last_changes: "azken %{count} aldaketak" - label_change_view_all: Aldaketa guztiak ikusi - label_personalize_page: Orri hau pertsonalizatu - label_comment: Iruzkin - label_comment_plural: Iruzkinak - label_x_comments: - zero: iruzkinik ez - one: iruzkin 1 - other: "%{count} iruzkin" - label_comment_add: Iruzkina gehitu - label_comment_added: Iruzkina gehituta - label_comment_delete: Iruzkinak ezabatu - label_query: Galdera pertsonalizatua - label_query_plural: Pertsonalizatutako galderak - label_query_new: Galdera berria - label_filter_add: Iragazkia gehitu - label_filter_plural: Iragazkiak - label_equals: da - label_not_equals: ez da - label_in_less_than: baino gutxiagotan - label_in_more_than: baino gehiagotan - label_greater_or_equal: '>=' - label_less_or_equal: '<=' - label_in: hauetan - label_today: gaur - label_all_time: denbora guztia - label_yesterday: atzo - label_this_week: aste honetan - label_last_week: pasadan astean - label_last_n_days: "azken %{count} egunetan" - label_this_month: hilabete hau - label_last_month: pasadan hilabetea - label_this_year: urte hau - label_date_range: Data tartea - label_less_than_ago: egun hauek baino gutxiago - label_more_than_ago: egun hauek baino gehiago - label_ago: orain dela - label_contains: dauka - label_not_contains: ez dauka - label_day_plural: egun - label_repository: Biltegia - label_repository_plural: Biltegiak - label_browse: Arakatu - label_modification: "aldaketa %{count}" - label_modification_plural: "%{count} aldaketa" - label_branch: Adarra - label_tag: Etiketa - label_revision: Berrikuspena - label_revision_plural: Berrikuspenak - label_revision_id: "%{value} berrikuspen" - label_associated_revisions: Elkartutako berrikuspenak - label_added: gehituta - label_modified: aldatuta - label_copied: kopiatuta - label_renamed: berrizendatuta - label_deleted: ezabatuta - label_latest_revision: Azken berrikuspena - label_latest_revision_plural: Azken berrikuspenak - label_view_revisions: Berrikuspenak ikusi - label_view_all_revisions: Berrikuspen guztiak ikusi - label_max_size: Tamaina maximoa - label_sort_highest: Goraino mugitu - label_sort_higher: Gora mugitu - label_sort_lower: Behera mugitu - label_sort_lowest: Beheraino mugitu - label_roadmap: Ibilbide-mapa - label_roadmap_due_in: "Epea: %{value}" - label_roadmap_overdue: "%{value} berandu" - label_roadmap_no_issues: Ez dago zereginik bertsio honetan - label_search: Bilatu - label_result_plural: Emaitzak - label_all_words: hitz guztiak - label_wiki: Wikia - label_wiki_edit: Wiki edizioa - label_wiki_edit_plural: Wiki edizioak - label_wiki_page: Wiki orria - label_wiki_page_plural: Wiki orriak - label_index_by_title: Izenburuaren araberako indizea - label_index_by_date: Dataren araberako indizea - label_current_version: Uneko bertsioa - label_preview: Aurreikusi - label_feed_plural: Jarioak - label_changes_details: Aldaketa guztien xehetasunak - label_issue_tracking: Zeregin jarraipena - label_spent_time: Igarotako denbora - label_f_hour: "ordu %{value}" - label_f_hour_plural: "%{value} ordu" - label_time_tracking: Denbora jarraipena - label_change_plural: Aldaketak - label_statistics: Estatistikak - label_commits_per_month: Commit-ak hilabeteka - label_commits_per_author: Commit-ak egileka - label_view_diff: Ezberdintasunak ikusi - label_diff_inline: barnean - label_diff_side_by_side: aldez alde - label_options: Aukerak - label_copy_workflow_from: Kopiatu workflow-a hemendik - label_permissions_report: Baimenen txostena - label_watched_issues: Behatutako zereginak - label_related_issues: Erlazionatutako zereginak - label_applied_status: Aplikatutako egoera - label_loading: Kargatzen... - label_relation_new: Erlazio berria - label_relation_delete: Erlazioa ezabatu - label_relates_to: erlazionatuta dago - label_duplicates: bikoizten du - label_duplicated_by: honek bikoiztuta - label_blocks: blokeatzen du - label_blocked_by: honek blokeatuta - label_precedes: aurretik doa - label_follows: jarraitzen du - label_end_to_start: bukaeratik hasierara - label_end_to_end: bukaeratik bukaerara - label_start_to_start: hasieratik hasierhasieratik bukaerara - label_start_to_end: hasieratik bukaerara - label_stay_logged_in: Saioa mantendu - label_disabled: ezgaituta - label_show_completed_versions: Bukatutako bertsioak ikusi - label_me: ni - label_board: Foroa - label_board_new: Foro berria - label_board_plural: Foroak - label_topic_plural: Gaiak - label_message_plural: Mezuak - label_message_last: Azken mezua - label_message_new: Mezu berria - label_message_posted: Mesua gehituta - label_reply_plural: Erantzunak - label_send_information: Erabiltzaileai kontuaren informazioa bidali - label_year: Urtea - label_month: Hilabetea - label_week: Astea - label_date_from: Nork - label_date_to: Nori - label_language_based: Erabiltzailearen hizkuntzaren arabera - label_sort_by: "Ordenazioa: %{value}" - label_send_test_email: Frogako mezua bidali - label_feeds_access_key: RSS atzipen giltza - label_missing_feeds_access_key: RSS atzipen giltza falta da - label_feeds_access_key_created_on: "RSS atzipen giltza orain dela %{value} sortuta" - label_module_plural: Moduluak - label_added_time_by: "%{author}, orain dela %{age} gehituta" - label_updated_time_by: "%{author}, orain dela %{age} eguneratuta" - label_updated_time: "Orain dela %{value} eguneratuta" - label_jump_to_a_project: Joan proiektura... - label_file_plural: Fitxategiak - label_changeset_plural: Aldaketak - label_default_columns: Lehenetsitako zutabeak - label_no_change_option: (Aldaketarik ez) - label_bulk_edit_selected_issues: Hautatutako zereginak batera editatu - label_theme: Itxura - label_default: Lehenetsia - label_search_titles_only: Izenburuetan bakarrik bilatu - label_user_mail_option_all: "Nire proiektu guztietako gertakari guztientzat" - label_user_mail_option_selected: "Hautatutako proiektuetako edozein gertakarientzat..." - label_user_mail_no_self_notified: "Ez dut nik egiten ditudan aldeketen jakinarazpenik jaso nahi" - label_registration_activation_by_email: kontuak epostaz gaitu - label_registration_manual_activation: kontuak eskuz gaitu - label_registration_automatic_activation: kontuak automatikoki gaitu - label_display_per_page: "Orriko: %{value}" - label_age: Adina - label_change_properties: Propietateak aldatu - label_general: Orokorra - label_more: Gehiago - label_scm: IKK - label_plugins: Pluginak - label_ldap_authentication: LDAP autentikazioa - label_downloads_abbr: Desk. - label_optional_description: Aukerako deskribapena - label_add_another_file: Beste fitxategia gehitu - label_preferences: Hobespenak - label_chronological_order: Orden kronologikoan - label_reverse_chronological_order: Alderantzizko orden kronologikoan - label_planning: Planifikazioa - label_incoming_emails: Sarrerako epostak - label_generate_key: Giltza sortu - label_issue_watchers: Behatzaileak - label_example: Adibidea - label_display: Bistaratzea - label_sort: Ordenatu - label_ascending: Gorantz - label_descending: Beherantz - label_date_from_to: "%{start}-tik %{end}-ra" - label_wiki_content_added: Wiki orria gehituta - label_wiki_content_updated: Wiki orria eguneratuta - label_group: Taldea - label_group_plural: Taldeak - label_group_new: Talde berria - label_time_entry_plural: Igarotako denbora - label_version_sharing_none: Ez partekatuta - label_version_sharing_descendants: Azpiproiektuekin - label_version_sharing_hierarchy: Proiektu Hierarkiarekin - label_version_sharing_tree: Proiektu zuhaitzarekin - label_version_sharing_system: Proiektu guztiekin - label_update_issue_done_ratios: Zereginen burututako erlazioa eguneratu - label_copy_source: Iturburua - label_copy_target: Helburua - label_copy_same_as_target: Helburuaren berdina - label_display_used_statuses_only: Aztarnari honetan erabiltzen diren egoerak bakarrik erakutsi - label_api_access_key: API atzipen giltza - label_missing_api_access_key: API atzipen giltza falta da - label_api_access_key_created_on: "API atzipen giltza sortuta orain dela %{value}" - - button_login: Saioa hasi - button_submit: Bidali - button_save: Gorde - button_check_all: Guztiak markatu - button_uncheck_all: Guztiak desmarkatu - button_delete: Ezabatu - button_create: Sortu - button_create_and_continue: Sortu eta jarraitu - button_test: Frogatu - button_edit: Editatu - button_add: Gehitu - button_change: Aldatu - button_apply: Aplikatu - button_clear: Garbitu - button_lock: Blokeatu - button_unlock: Desblokeatu - button_download: Deskargatu - button_list: Zerrenda - button_view: Ikusi - button_move: Mugitu - button_move_and_follow: Mugitu eta jarraitu - button_back: Atzera - button_cancel: Ezeztatu - button_activate: Gahitu - button_sort: Ordenatu - button_log_time: Denbora apuntatu - button_rollback: Itzuli bertsio honetara - button_watch: Behatu - button_unwatch: Behatzen utzi - button_reply: Erantzun - button_archive: Artxibatu - button_unarchive: Desartxibatu - button_reset: Berrezarri - button_rename: Berrizendatu - button_change_password: Pasahitza aldatu - button_copy: Kopiatu - button_copy_and_follow: Kopiatu eta jarraitu - button_annotate: Anotatu - button_update: Eguneratu - button_configure: Konfiguratu - button_quote: Aipatu - button_duplicate: Bikoiztu - button_show: Ikusi - - status_active: gaituta - status_registered: izena emanda - status_locked: blokeatuta - - version_status_open: irekita - version_status_locked: blokeatuta - version_status_closed: itxita - - field_active: Gaituta - - text_select_mail_notifications: Jakinarazpenak zein ekintzetarako bidaliko diren hautatu. - text_regexp_info: adib. ^[A-Z0-9]+$ - text_min_max_length_info: 0k mugarik gabe esan nahi du - text_project_destroy_confirmation: Ziur zaude proiektu hau eta erlazionatutako datu guztiak ezabatu nahi dituzula? - text_subprojects_destroy_warning: "%{value} azpiproiektuak ere ezabatuko dira." - text_workflow_edit: Hautatu rola eta aztarnaria workflow-a editatzeko - text_are_you_sure: Ziur zaude? - text_journal_changed: "%{label} %{old}-(e)tik %{new}-(e)ra aldatuta" - text_journal_set_to: "%{label}-k %{value} balioa hartu du" - text_journal_deleted: "%{label} ezabatuta (%{old})" - text_journal_added: "%{label} %{value} gehituta" - text_tip_issue_begin_day: gaur hasten diren atazak - text_tip_issue_end_day: gaur bukatzen diren atazak - text_tip_issue_begin_end_day: gaur hasi eta bukatzen diren atazak - text_project_identifier_info: 'Only lower case letters (a-z), numbers, dashes and underscores are allowed.
Once saved, the identifier can not be changed.' - text_caracters_maximum: "%{count} karaktere gehienez." - text_caracters_minimum: "Gutxienez %{count} karaktereetako luzerakoa izan behar du." - text_length_between: "Luzera %{min} eta %{max} karaktereen artekoa." - text_tracker_no_workflow: Ez da workflow-rik definitu aztarnari honentzako - text_unallowed_characters: Debekatutako karaktereak - text_comma_separated: Balio anitz izan daitezke (komaz banatuta). - text_line_separated: Balio anitz izan daitezke (balio bakoitza lerro batean). - text_issues_ref_in_commit_messages: Commit-en mezuetan zereginak erlazionatu eta konpontzen - text_issue_added: "%{id} zeregina %{author}-(e)k jakinarazi du." - text_issue_updated: "%{id} zeregina %{author}-(e)k eguneratu du." - text_wiki_destroy_confirmation: Ziur zaude wiki hau eta bere eduki guztiak ezabatu nahi dituzula? - text_issue_category_destroy_question: "Zeregin batzuk (%{count}) kategoria honetara esleituta daude. Zer egin nahi duzu?" - text_issue_category_destroy_assignments: Kategoria esleipenak kendu - text_issue_category_reassign_to: Zereginak kategoria honetara esleitu - text_user_mail_option: "Hautatu gabeko proiektuetan, behatzen edo parte hartzen duzun gauzei buruzko jakinarazpenak jasoko dituzu (adib. zu egile zaren edo esleituta dituzun zereginak)." - text_no_configuration_data: "Rolak, aztarnariak, zeregin egoerak eta workflow-ak ez dira oraindik konfiguratu.\nOso gomendagarria de lehenetsitako kkonfigurazioa kargatzea. Kargatu eta gero aldatu ahalko duzu." - text_load_default_configuration: Lehenetsitako konfigurazioa kargatu - text_status_changed_by_changeset: "%{value} aldaketan aplikatuta." - text_issues_destroy_confirmation: 'Ziur zaude hautatutako zeregina(k) ezabatu nahi dituzula?' - text_select_project_modules: 'Hautatu proiektu honetan gaitu behar diren moduluak:' - text_default_administrator_account_changed: Lehenetsitako kudeatzaile kontua aldatuta - text_file_repository_writable: Eranskinen direktorioan idatz daiteke - text_plugin_assets_writable: Pluginen baliabideen direktorioan idatz daiteke - text_rmagick_available: RMagick eskuragarri (aukerazkoa) - text_destroy_time_entries_question: "%{hours} orduei buruz berri eman zen zuk ezabatzera zoazen zereginean. Zer egin nahi duzu?" - text_destroy_time_entries: Ezabatu berri emandako orduak - text_assign_time_entries_to_project: Berri emandako orduak proiektura esleitu - text_reassign_time_entries: 'Berri emandako orduak zeregin honetara esleitu:' - text_user_wrote: "%{value}-(e)k idatzi zuen:" - text_enumeration_destroy_question: "%{count} objetu balio honetara esleituta daude." - text_enumeration_category_reassign_to: 'Beste balio honetara esleitu:' - text_email_delivery_not_configured: "Eposta bidalketa ez dago konfiguratuta eta jakinarazpenak ezgaituta daude.\nKonfiguratu zure SMTP zerbitzaria config/configuration.yml-n eta aplikazioa berrabiarazi hauek gaitzeko." - text_repository_usernames_mapping: "Hautatu edo eguneratu Redmineko erabiltzailea biltegiko egunkarietan topatzen diren erabiltzaile izenekin erlazionatzeko.\nRedmine-n eta biltegian erabiltzaile izen edo eposta berdina duten erabiltzaileak automatikoki erlazionatzen dira." - text_diff_truncated: '... Diff hau moztua izan da erakus daitekeen tamaina maximoa gainditu duelako.' - text_custom_field_possible_values_info: 'Lerro bat balio bakoitzeko' - text_wiki_page_destroy_question: "Orri honek %{descendants} orri seme eta ondorengo ditu. Zer egin nahi duzu?" - text_wiki_page_nullify_children: "Orri semeak erro orri moduan mantendu" - text_wiki_page_destroy_children: "Orri semeak eta beraien ondorengo guztiak ezabatu" - text_wiki_page_reassign_children: "Orri semeak orri guraso honetara esleitu" - text_own_membership_delete_confirmation: "Zure baimen batzuk (edo guztiak) kentzera zoaz eta baliteke horren ondoren proiektu hau ezin editatzea.\n Ziur zaude jarraitu nahi duzula?" - - default_role_manager: Kudeatzailea - default_role_developer: Garatzailea - default_role_reporter: Berriemailea - default_role_non_member: Non member - default_role_anonymous: Anonymous - default_tracker_bug: Errorea - default_tracker_feature: Eginbidea - default_tracker_support: Laguntza - default_issue_status_new: Berria - default_issue_status_in_progress: Lanean - default_issue_status_resolved: Ebatzita - default_issue_status_feedback: Berrelikadura - default_issue_status_closed: Itxita - default_issue_status_rejected: Baztertua - default_doc_category_user: Erabiltzaile dokumentazioa - default_doc_category_tech: Dokumentazio teknikoa - default_priority_low: Baxua - default_priority_normal: Normala - default_priority_high: Altua - default_priority_urgent: Larria - default_priority_immediate: Berehalakoa - default_activity_design: Diseinua - default_activity_development: Garapena - - enumeration_issue_priorities: Zeregin lehentasunak - enumeration_doc_categories: Dokumentu kategoriak - enumeration_activities: Jarduerak (denbora kontrola)) - enumeration_system_activity: Sistemako Jarduera - label_board_sticky: Itxaskorra - label_board_locked: Blokeatuta - permission_export_wiki_pages: Wiki orriak esportatu - setting_cache_formatted_text: Formatudun testua katxeatu - permission_manage_project_activities: Proiektuaren jarduerak kudeatu - error_unable_delete_issue_status: Ezine da zereginaren egoera ezabatu - label_profile: Profila - permission_manage_subtasks: Azpiatazak kudeatu - field_parent_issue: Guraso ataza - label_subtask_plural: Azpiatazak - label_project_copy_notifications: Proiektua kopiatzen den bitartean eposta jakinarazpenak bidali - error_can_not_delete_custom_field: Ezin da eremu pertsonallizatua ezabatu - error_unable_to_connect: Ezin da konektatu (%{value}) - error_can_not_remove_role: Rol hau erabiltzen hari da eta ezin da ezabatu. - error_can_not_delete_tracker: Aztarnari honek zereginak ditu eta ezin da ezabatu. - field_principal: Principal - label_my_page_block: My page block - notice_failed_to_save_members: "Failed to save member(s): %{errors}." - text_zoom_out: Zoom out - text_zoom_in: Zoom in - notice_unable_delete_time_entry: Unable to delete time log entry. - label_overall_spent_time: Overall spent time - field_time_entries: Log time - project_module_gantt: Gantt - project_module_calendar: Calendar - button_edit_associated_wikipage: "Edit associated Wiki page: %{page_title}" - text_are_you_sure_with_children: Delete issue and all child issues? - field_text: Text field - label_user_mail_option_only_owner: Only for things I am the owner of - setting_default_notification_option: Default notification option - label_user_mail_option_only_my_events: Only for things I watch or I'm involved in - label_user_mail_option_only_assigned: Only for things I am assigned to - label_user_mail_option_none: No events - field_member_of_group: Assignee's group - field_assigned_to_role: Assignee's role - notice_not_authorized_archived_project: The project you're trying to access has been archived. - label_principal_search: "Search for user or group:" - label_user_search: "Search for user:" - field_visible: Visible - setting_emails_header: Emails header - setting_commit_logtime_activity_id: Activity for logged time - text_time_logged_by_changeset: Applied in changeset %{value}. - setting_commit_logtime_enabled: Enable time logging - notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max}) - setting_gantt_items_limit: Maximum number of items displayed on the gantt chart - text_powered_by: Powered by %{link} +# Redmine EU language +# Author: Ales Zabala Alava (Shagi), +# 2010-01-25 +# Distributed under the same terms as the Redmine itself. +eu: + direction: ltr + date: + formats: + # Use the strftime parameters for formats. + # When no format has been given, it uses default. + # You can provide other formats here if you like! + default: "%Y/%m/%d" + short: "%b %d" + long: "%Y %B %d" + + day_names: [Igandea, Astelehena, Asteartea, Asteazkena, Osteguna, Ostirala, Larunbata] + abbr_day_names: [Ig., Al., Ar., Az., Og., Or., La.] + + # Don't forget the nil at the beginning; there's no such thing as a 0th month + month_names: [~, Urtarrila, Otsaila, Martxoa, Apirila, Maiatza, Ekaina, Uztaila, Abuztua, Iraila, Urria, Azaroa, Abendua] + abbr_month_names: [~, Urt, Ots, Mar, Api, Mai, Eka, Uzt, Abu, Ira, Urr, Aza, Abe] + # Used in date_select and datime_select. + order: + - :year + - :month + - :day + + time: + formats: + default: "%Y/%m/%d %H:%M" + time: "%H:%M" + short: "%b %d %H:%M" + long: "%Y %B %d %H:%M" + am: "am" + pm: "pm" + + datetime: + distance_in_words: + half_a_minute: "minutu erdi" + less_than_x_seconds: + one: "segundu bat baino gutxiago" + other: "%{count} segundu baino gutxiago" + x_seconds: + one: "segundu 1" + other: "%{count} segundu" + less_than_x_minutes: + one: "minutu bat baino gutxiago" + other: "%{count} minutu baino gutxiago" + x_minutes: + one: "minutu 1" + other: "%{count} minutu" + about_x_hours: + one: "ordu 1 inguru" + other: "%{count} ordu inguru" + x_days: + one: "egun 1" + other: "%{count} egun" + about_x_months: + one: "hilabete 1 inguru" + other: "%{count} hilabete inguru" + x_months: + one: "hilabete 1" + other: "%{count} hilabete" + about_x_years: + one: "urte 1 inguru" + other: "%{count} urte inguru" + over_x_years: + one: "urte 1 baino gehiago" + other: "%{count} urte baino gehiago" + almost_x_years: + one: "ia urte 1" + other: "ia %{count} urte" + + number: + format: + separator: "." + delimiter: "" + precision: 3 + human: + format: + delimiter: "" + precision: 1 + storage_units: + format: "%n %u" + units: + byte: + one: "Byte" + other: "Byte" + kb: "KB" + mb: "MB" + gb: "GB" + tb: "TB" + + +# Used in array.to_sentence. + support: + array: + sentence_connector: "eta" + skip_last_comma: false + + activerecord: + errors: + template: + header: + one: "Errore batek %{model} hau godetzea galarazi du." + other: "%{count} errorek %{model} hau gordetzea galarazi dute." + messages: + inclusion: "ez dago zerrendan" + exclusion: "erreserbatuta dago" + invalid: "baliogabea da" + confirmation: "ez du berrespenarekin bat egiten" + accepted: "onartu behar da" + empty: "ezin da hutsik egon" + blank: "ezin da hutsik egon" + too_long: "luzeegia da (maximoa %{count} karaktere dira)" + too_short: "laburregia da (minimoa %{count} karaktere dira)" + wrong_length: "luzera ezegokia da (%{count} karakter izan beharko litzake)" + taken: "dagoeneko hartuta dago" + not_a_number: "ez da zenbaki bat" + not_a_date: "ez da baliozko data" + greater_than: "%{count} baino handiagoa izan behar du" + greater_than_or_equal_to: "%{count} edo handiagoa izan behar du" + equal_to: "%{count} izan behar du" + less_than: "%{count} baino gutxiago izan behar du" + less_than_or_equal_to: "%{count} edo gutxiago izan behar du" + odd: "bakoitia izan behar du" + even: "bikoitia izan behar du" + greater_than_start_date: "hasiera data baino handiagoa izan behar du" + not_same_project: "ez dago proiektu berdinean" + circular_dependency: "Erlazio honek mendekotasun zirkular bat sortuko luke" + cant_link_an_issue_with_a_descendant: "Zeregin bat ezin da bere azpiataza batekin estekatu." + + actionview_instancetag_blank_option: Hautatu mesedez + + general_text_No: 'Ez' + general_text_Yes: 'Bai' + general_text_no: 'ez' + general_text_yes: 'bai' + general_lang_name: 'Euskara' + general_csv_separator: ',' + general_csv_decimal_separator: '.' + general_csv_encoding: UTF-8 + general_pdf_encoding: UTF-8 + general_first_day_of_week: '1' + + notice_account_updated: Kontua ongi eguneratu da. + notice_account_invalid_creditentials: Erabiltzaile edo pasahitz ezegokia + notice_account_password_updated: Pasahitza ongi eguneratu da. + notice_account_wrong_password: Pasahitz ezegokia. + notice_account_register_done: Kontua ongi sortu da. Kontua gaitzeko klikatu epostan adierazi zaizun estekan. + notice_account_unknown_email: Erabiltzaile ezezaguna. + notice_can_t_change_password: Kontu honek kanpoko autentikazio bat erabiltzen du. Ezinezkoa da pasahitza aldatzea. + notice_account_lost_email_sent: Pasahitz berria aukeratzeko jarraibideak dituen eposta bat bidali zaizu. + notice_account_activated: Zure kontua gaituta dago. Orain saioa has dezakezu + notice_successful_create: Sortze arrakastatsua. + notice_successful_update: Eguneratze arrakastatsua. + notice_successful_delete: Ezabaketa arrakastatsua. + notice_successful_connection: Konexio arrakastatsua. + notice_file_not_found: Atzitu nahi duzun orria ez da exisitzen edo ezabatua izan da. + notice_locking_conflict: Beste erabiltzaile batek datuak eguneratu ditu. + notice_not_authorized: Ez duzu orri hau atzitzeko baimenik. + notice_email_sent: "%{value} helbidera eposta bat bidali da" + notice_email_error: "Errorea eposta bidaltzean (%{value})" + notice_feeds_access_key_reseted: Zure RSS atzipen giltza berrezarri da. + notice_api_access_key_reseted: Zure API atzipen giltza berrezarri da. + notice_failed_to_save_issues: "Hautatutako %{total} zereginetatik %{count} ezin izan dira konpondu: %{ids}." + notice_no_issue_selected: "Ez da zereginik hautatu! Mesedez, editatu nahi dituzun arazoak markatu." + notice_account_pending: "Zure kontua sortu da, orain kudeatzailearen onarpenaren zain dago." + notice_default_data_loaded: Lehenetsitako konfigurazioa ongi kargatu da. + notice_unable_delete_version: Ezin da bertsioa ezabatu. + notice_issue_done_ratios_updated: Burututako zereginen erlazioa eguneratu da. + + error_can_t_load_default_data: "Ezin izan da lehenetsitako konfigurazioa kargatu: %{value}" + error_scm_not_found: "Sarrera edo berrikuspena ez da biltegian topatu." + error_scm_command_failed: "Errorea gertatu da biltegia atzitzean: %{value}" + error_scm_annotate: "Sarrera ez da existitzen edo ezin da anotatu." + error_issue_not_found_in_project: 'Zeregina ez da topatu edo ez da proiektu honetakoa' + error_no_tracker_in_project: 'Proiektu honek ez du aztarnaririk esleituta. Mesedez egiaztatu Proiektuaren ezarpenak.' + error_no_default_issue_status: 'Zereginek ez dute lehenetsitako egoerarik. Mesedez egiaztatu zure konfigurazioa ("Kudeaketa -> Arazoen egoerak" atalera joan).' + error_can_not_reopen_issue_on_closed_version: 'Itxitako bertsio batera esleitutako zereginak ezin dira berrireki' + error_can_not_archive_project: Proiektu hau ezin da artxibatu + error_issue_done_ratios_not_updated: "Burututako zereginen erlazioa ez da eguneratu." + error_workflow_copy_source: 'Mesedez hautatu iturburuko aztarnari edo rola' + error_workflow_copy_target: 'Mesedez hautatu helburuko aztarnari(ak) edo rola(k)' + + warning_attachments_not_saved: "%{count} fitxategi ezin izan d(ir)a gorde." + + mail_subject_lost_password: "Zure %{value} pasahitza" + mail_body_lost_password: 'Zure pasahitza aldatzeko hurrengo estekan klikatu:' + mail_subject_register: "Zure %{value} kontuaren gaitzea" + mail_body_register: 'Zure kontua gaitzeko hurrengo estekan klikatu:' + mail_body_account_information_external: "Zure %{value} kontua erabil dezakezu saioa hasteko." + mail_body_account_information: Zure kontuaren informazioa + mail_subject_account_activation_request: "%{value} kontu gaitzeko eskaera" + mail_body_account_activation_request: "Erabiltzaile berri bat (%{value}) erregistratu da. Kontua zure onarpenaren zain dago:" + mail_subject_reminder: "%{count} arazo hurrengo %{days} egunetan amaitzen d(ir)a" + mail_body_reminder: "Zuri esleituta dauden %{count} arazo hurrengo %{days} egunetan amaitzen d(ir)a:" + mail_subject_wiki_content_added: "'%{id}' wiki orria gehitu da" + mail_body_wiki_content_added: "%{author}-(e)k '%{id}' wiki orria gehitu du." + mail_subject_wiki_content_updated: "'%{id}' wiki orria eguneratu da" + mail_body_wiki_content_updated: "%{author}-(e)k '%{id}' wiki orria eguneratu du." + + gui_validation_error: akats 1 + gui_validation_error_plural: "%{count} akats" + + field_name: Izena + field_description: Deskribapena + field_summary: Laburpena + field_is_required: Beharrezkoa + field_firstname: Izena + field_lastname: Abizenak + field_mail: Eposta + field_filename: Fitxategia + field_filesize: Tamaina + field_downloads: Deskargak + field_author: Egilea + field_created_on: Sortuta + field_updated_on: Eguneratuta + field_field_format: Formatua + field_is_for_all: Proiektu guztietarako + field_possible_values: Balio posibleak + field_regexp: Expresio erregularra + field_min_length: Luzera minimoa + field_max_length: Luzera maxioma + field_value: Balioa + field_category: Kategoria + field_title: Izenburua + field_project: Proiektua + field_issue: Zeregina + field_status: Egoera + field_notes: Oharrak + field_is_closed: Itxitako arazoa + field_is_default: Lehenetsitako balioa + field_tracker: Aztarnaria + field_subject: Gaia + field_due_date: Amaiera data + field_assigned_to: Esleituta + field_priority: Lehentasuna + field_fixed_version: Helburuko bertsioa + field_user: Erabiltzilea + field_role: Rola + field_homepage: Orri nagusia + field_is_public: Publikoa + field_parent: "Honen azpiproiektua:" + field_is_in_chlog: Zereginak aldaketa egunkarian ikusten dira + field_is_in_roadmap: Arazoak ibilbide-mapan erakutsi + field_login: Erabiltzaile izena + field_mail_notification: Eposta jakinarazpenak + field_admin: Kudeatzailea + field_last_login_on: Azken konexioa + field_language: Hizkuntza + field_password: Pasahitza + field_new_password: Pasahitz berria + field_password_confirmation: Berrespena + field_version: Bertsioa + field_type: Mota + field_host: Ostalaria + field_port: Portua + field_account: Kontua + field_base_dn: Base DN + field_attr_login: Erabiltzaile atributua + field_attr_firstname: Izena atributua + field_attr_lastname: Abizenak atributua + field_attr_mail: Eposta atributua + field_onthefly: Zuzeneko erabiltzaile sorrera + field_start_date: Hasiera + field_done_ratio: Egindako % + field_auth_source: Autentikazio modua + field_hide_mail: Nire eposta helbidea ezkutatu + field_comments: Iruzkina + field_url: URL + field_start_page: Hasierako orria + field_subproject: Azpiproiektua + field_hours: Ordu + field_activity: Jarduera + field_spent_on: Data + field_identifier: Identifikatzailea + field_is_filter: Iragazki moduan erabilita + field_issue_to: Erlazionatutako zereginak + field_delay: Atzerapena + field_assignable: Arazoak rol honetara esleitu daitezke + field_redirect_existing_links: Existitzen diren estekak berbideratu + field_estimated_hours: Estimatutako denbora + field_column_names: Zutabeak + field_time_zone: Ordu zonaldea + field_searchable: Bilagarria + field_default_value: Lehenetsitako balioa + field_comments_sorting: Iruzkinak erakutsi + field_parent_title: Orri gurasoa + field_editable: Editagarria + field_watcher: Behatzailea + field_identity_url: OpenID URLa + field_content: Edukia + field_group_by: Emaitzak honegatik taldekatu + field_sharing: Partekatzea + + setting_app_title: Aplikazioaren izenburua + setting_app_subtitle: Aplikazioaren azpizenburua + setting_welcome_text: Ongietorriko testua + setting_default_language: Lehenetsitako hizkuntza + setting_login_required: Autentikazioa derrigorrezkoa + setting_self_registration: Norberak erregistratu + setting_attachment_max_size: Eranskinen tamaina max. + setting_issues_export_limit: Zereginen esportatze limitea + setting_mail_from: Igorlearen eposta helbidea + setting_bcc_recipients: Hartzaileak ezkutuko kopian (bcc) + setting_plain_text_mail: Testu soileko epostak (HTML-rik ez) + setting_host_name: Ostalari izena eta bidea + setting_text_formatting: Testu formatua + setting_wiki_compression: Wikiaren historia konprimitu + setting_feeds_limit: Jarioaren edukiera limitea + setting_default_projects_public: Proiektu berriak defektuz publikoak dira + setting_autofetch_changesets: Commit-ak automatikoki hartu + setting_sys_api_enabled: Biltegien kudeaketarako WS gaitu + setting_commit_ref_keywords: Erreferentzien gako-hitzak + setting_commit_fix_keywords: Konpontze gako-hitzak + setting_autologin: Saioa automatikoki hasi + setting_date_format: Data formatua + setting_time_format: Ordu formatua + setting_cross_project_issue_relations: Zereginak proiektuen artean erlazionatzea baimendu + setting_issue_list_default_columns: Zereginen zerrendan defektuz ikusten diren zutabeak + setting_repositories_encodings: Biltegien kodeketak + setting_commit_logs_encoding: Commit-en egunkarien kodetzea + setting_emails_footer: Eposten oina + setting_protocol: Protokoloa + setting_per_page_options: Orriko objektuen aukerak + setting_user_format: Erabiltzaileak erakusteko formatua + setting_activity_days_default: Proiektuen jardueran erakusteko egunak + setting_display_subprojects_issues: Azpiproiektuen zereginak proiektu nagusian erakutsi defektuz + setting_enabled_scm: Gaitutako IKKak + setting_mail_handler_body_delimiters: "Lerro hauteko baten ondoren epostak moztu" + setting_mail_handler_api_enabled: Sarrerako epostentzako WS gaitu + setting_mail_handler_api_key: API giltza + setting_sequential_project_identifiers: Proiektuen identifikadore sekuentzialak sortu + setting_gravatar_enabled: Erabili Gravatar erabiltzaile ikonoak + setting_gravatar_default: Lehenetsitako Gravatar irudia + setting_diff_max_lines_displayed: Erakutsiko diren diff lerro kopuru maximoa + setting_file_max_size_displayed: Barnean erakuzten diren testu fitxategien tamaina maximoa + setting_repository_log_display_limit: Egunkari fitxategian erakutsiko diren berrikuspen kopuru maximoa. + setting_openid: Baimendu OpenID saio hasiera eta erregistatzea + setting_password_min_length: Pasahitzen luzera minimoa + setting_new_project_user_role_id: Proiektu berriak sortzerakoan kudeatzaile ez diren erabiltzaileei esleitutako rola + setting_default_projects_modules: Proiektu berrientzako defektuz gaitutako moduluak + setting_issue_done_ratio: "Zereginen burututako tasa kalkulatzean erabili:" + setting_issue_done_ratio_issue_field: Zeregin eremua erabili + setting_issue_done_ratio_issue_status: Zeregin egoera erabili + setting_start_of_week: "Egutegiak noiz hasi:" + setting_rest_api_enabled: Gaitu REST web zerbitzua + + permission_add_project: Proiektua sortu + permission_add_subprojects: Azpiproiektuak sortu + permission_edit_project: Proiektua editatu + permission_select_project_modules: Proiektuaren moduluak hautatu + permission_manage_members: Kideak kudeatu + permission_manage_versions: Bertsioak kudeatu + permission_manage_categories: Arazoen kategoriak kudeatu + permission_view_issues: Zereginak ikusi + permission_add_issues: Zereginak gehitu + permission_edit_issues: Zereginak aldatu + permission_manage_issue_relations: Zereginen erlazioak kudeatu + permission_add_issue_notes: Oharrak gehitu + permission_edit_issue_notes: Oharrak aldatu + permission_edit_own_issue_notes: Nork bere oharrak aldatu + permission_move_issues: Zereginak mugitu + permission_delete_issues: Zereginak ezabatu + permission_manage_public_queries: Galdera publikoak kudeatu + permission_save_queries: Galderak gorde + permission_view_gantt: Gantt grafikoa ikusi + permission_view_calendar: Egutegia ikusi + permission_view_issue_watchers: Behatzaileen zerrenda ikusi + permission_add_issue_watchers: Behatzaileak gehitu + permission_delete_issue_watchers: Behatzaileak ezabatu + permission_log_time: Igarotako denbora erregistratu + permission_view_time_entries: Igarotako denbora ikusi + permission_edit_time_entries: Denbora egunkariak editatu + permission_edit_own_time_entries: Nork bere denbora egunkariak editatu + permission_manage_news: Berriak kudeatu + permission_comment_news: Berrien iruzkinak egin + permission_manage_documents: Dokumentuak kudeatu + permission_view_documents: Dokumentuak ikusi + permission_manage_files: Fitxategiak kudeatu + permission_view_files: Fitxategiak ikusi + permission_manage_wiki: Wikia kudeatu + permission_rename_wiki_pages: Wiki orriak berrizendatu + permission_delete_wiki_pages: Wiki orriak ezabatu + permission_view_wiki_pages: Wikia ikusi + permission_view_wiki_edits: Wikiaren historia ikusi + permission_edit_wiki_pages: Wiki orriak editatu + permission_delete_wiki_pages_attachments: Eranskinak ezabatu + permission_protect_wiki_pages: Wiki orriak babestu + permission_manage_repository: Biltegiak kudeatu + permission_browse_repository: Biltegia arakatu + permission_view_changesets: Aldaketak ikusi + permission_commit_access: Commit atzipena + permission_manage_boards: Foroak kudeatu + permission_view_messages: Mezuak ikusi + permission_add_messages: Mezuak bidali + permission_edit_messages: Mezuak aldatu + permission_edit_own_messages: Nork bere mezuak aldatu + permission_delete_messages: Mezuak ezabatu + permission_delete_own_messages: Nork bere mezuak ezabatu + + project_module_issue_tracking: Zereginen jarraipena + project_module_time_tracking: Denbora jarraipena + project_module_news: Berriak + project_module_documents: Dokumentuak + project_module_files: Fitxategiak + project_module_wiki: Wiki + project_module_repository: Biltegia + project_module_boards: Foroak + + label_user: Erabiltzailea + label_user_plural: Erabiltzaileak + label_user_new: Erabiltzaile berria + label_user_anonymous: Ezezaguna + label_project: Proiektua + label_project_new: Proiektu berria + label_project_plural: Proiektuak + label_x_projects: + zero: proiekturik ez + one: proiektu bat + other: "%{count} proiektu" + label_project_all: Proiektu guztiak + label_project_latest: Azken proiektuak + label_issue: Zeregina + label_issue_new: Zeregin berria + label_issue_plural: Zereginak + label_issue_view_all: Zeregin guztiak ikusi + label_issues_by: "Zereginak honengatik: %{value}" + label_issue_added: Zeregina gehituta + label_issue_updated: Zeregina eguneratuta + label_document: Dokumentua + label_document_new: Dokumentu berria + label_document_plural: Dokumentuak + label_document_added: Dokumentua gehituta + label_role: Rola + label_role_plural: Rolak + label_role_new: Rol berria + label_role_and_permissions: Rolak eta baimenak + label_member: Kidea + label_member_new: Kide berria + label_member_plural: Kideak + label_tracker: Aztarnaria + label_tracker_plural: Aztarnariak + label_tracker_new: Aztarnari berria + label_workflow: Lan-fluxua + label_issue_status: Zeregin egoera + label_issue_status_plural: Zeregin egoerak + label_issue_status_new: Egoera berria + label_issue_category: Zeregin kategoria + label_issue_category_plural: Zeregin kategoriak + label_issue_category_new: Kategoria berria + label_custom_field: Eremu pertsonalizatua + label_custom_field_plural: Eremu pertsonalizatuak + label_custom_field_new: Eremu pertsonalizatu berria + label_enumerations: Enumerazioak + label_enumeration_new: Balio berria + label_information: Informazioa + label_information_plural: Informazioa + label_please_login: Saioa hasi mesedez + label_register: Erregistratu + label_login_with_open_id_option: edo OpenID-rekin saioa hasi + label_password_lost: Pasahitza galduta + label_home: Hasiera + label_my_page: Nire orria + label_my_account: Nire kontua + label_my_projects: Nire proiektuak + label_administration: Kudeaketa + label_login: Saioa hasi + label_logout: Saioa bukatu + label_help: Laguntza + label_reported_issues: Berri emandako zereginak + label_assigned_to_me_issues: Niri esleitutako arazoak + label_last_login: Azken konexioa + label_registered_on: Noiz erregistratuta + label_activity: Jarduerak + label_overall_activity: Jarduera guztiak + label_user_activity: "%{value}-(r)en jarduerak" + label_new: Berria + label_logged_as: "Sartutako erabiltzailea:" + label_environment: Ingurune + label_authentication: Autentikazioa + label_auth_source: Autentikazio modua + label_auth_source_new: Autentikazio modu berria + label_auth_source_plural: Autentikazio moduak + label_subproject_plural: Azpiproiektuak + label_subproject_new: Azpiproiektu berria + label_and_its_subprojects: "%{value} eta bere azpiproiektuak" + label_min_max_length: Luzera min - max + label_list: Zerrenda + label_date: Data + label_integer: Osokoa + label_float: Koma higikorrekoa + label_boolean: Boolearra + label_string: Testua + label_text: Testu luzea + label_attribute: Atributua + label_attribute_plural: Atributuak + label_download: "Deskarga %{count}" + label_download_plural: "%{count} Deskarga" + label_no_data: Ez dago erakusteko daturik + label_change_status: Egoera aldatu + label_history: Historikoa + label_attachment: Fitxategia + label_attachment_new: Fitxategi berria + label_attachment_delete: Fitxategia ezabatu + label_attachment_plural: Fitxategiak + label_file_added: Fitxategia gehituta + label_report: Berri ematea + label_report_plural: Berri emateak + label_news: Berria + label_news_new: Berria gehitu + label_news_plural: Berriak + label_news_latest: Azken berriak + label_news_view_all: Berri guztiak ikusi + label_news_added: Berria gehituta + label_change_log: Aldaketa egunkaria + label_settings: Ezarpenak + label_overview: Gainbegirada + label_version: Bertsioa + label_version_new: Bertsio berria + label_version_plural: Bertsioak + label_close_versions: Burututako bertsioak itxi + label_confirmation: Baieztapena + label_export_to: 'Eskuragarri baita:' + label_read: Irakurri... + label_public_projects: Proiektu publikoak + label_open_issues: irekita + label_open_issues_plural: irekiak + label_closed_issues: itxita + label_closed_issues_plural: itxiak + label_x_open_issues_abbr_on_total: + zero: 0 irekita / %{total} + one: 1 irekita / %{total} + other: "%{count} irekiak / %{total}" + label_x_open_issues_abbr: + zero: 0 irekita + one: 1 irekita + other: "%{count} irekiak" + label_x_closed_issues_abbr: + zero: 0 itxita + one: 1 itxita + other: "%{count} itxiak" + label_total: Guztira + label_permissions: Baimenak + label_current_status: Uneko egoera + label_new_statuses_allowed: Baimendutako egoera berriak + label_all: guztiak + label_none: ezer + label_nobody: inor + label_next: Hurrengoa + label_previous: Aurrekoak + label_used_by: Erabilita + label_details: Xehetasunak + label_add_note: Oharra gehitu + label_per_page: Orriko + label_calendar: Egutegia + label_months_from: hilabete noiztik + label_gantt: Gantt + label_internal: Barnekoa + label_last_changes: "azken %{count} aldaketak" + label_change_view_all: Aldaketa guztiak ikusi + label_personalize_page: Orri hau pertsonalizatu + label_comment: Iruzkin + label_comment_plural: Iruzkinak + label_x_comments: + zero: iruzkinik ez + one: iruzkin 1 + other: "%{count} iruzkin" + label_comment_add: Iruzkina gehitu + label_comment_added: Iruzkina gehituta + label_comment_delete: Iruzkinak ezabatu + label_query: Galdera pertsonalizatua + label_query_plural: Pertsonalizatutako galderak + label_query_new: Galdera berria + label_filter_add: Iragazkia gehitu + label_filter_plural: Iragazkiak + label_equals: da + label_not_equals: ez da + label_in_less_than: baino gutxiagotan + label_in_more_than: baino gehiagotan + label_greater_or_equal: '>=' + label_less_or_equal: '<=' + label_in: hauetan + label_today: gaur + label_all_time: denbora guztia + label_yesterday: atzo + label_this_week: aste honetan + label_last_week: pasadan astean + label_last_n_days: "azken %{count} egunetan" + label_this_month: hilabete hau + label_last_month: pasadan hilabetea + label_this_year: urte hau + label_date_range: Data tartea + label_less_than_ago: egun hauek baino gutxiago + label_more_than_ago: egun hauek baino gehiago + label_ago: orain dela + label_contains: dauka + label_not_contains: ez dauka + label_day_plural: egun + label_repository: Biltegia + label_repository_plural: Biltegiak + label_browse: Arakatu + label_modification: "aldaketa %{count}" + label_modification_plural: "%{count} aldaketa" + label_branch: Adarra + label_tag: Etiketa + label_revision: Berrikuspena + label_revision_plural: Berrikuspenak + label_revision_id: "%{value} berrikuspen" + label_associated_revisions: Elkartutako berrikuspenak + label_added: gehituta + label_modified: aldatuta + label_copied: kopiatuta + label_renamed: berrizendatuta + label_deleted: ezabatuta + label_latest_revision: Azken berrikuspena + label_latest_revision_plural: Azken berrikuspenak + label_view_revisions: Berrikuspenak ikusi + label_view_all_revisions: Berrikuspen guztiak ikusi + label_max_size: Tamaina maximoa + label_sort_highest: Goraino mugitu + label_sort_higher: Gora mugitu + label_sort_lower: Behera mugitu + label_sort_lowest: Beheraino mugitu + label_roadmap: Ibilbide-mapa + label_roadmap_due_in: "Epea: %{value}" + label_roadmap_overdue: "%{value} berandu" + label_roadmap_no_issues: Ez dago zereginik bertsio honetan + label_search: Bilatu + label_result_plural: Emaitzak + label_all_words: hitz guztiak + label_wiki: Wikia + label_wiki_edit: Wiki edizioa + label_wiki_edit_plural: Wiki edizioak + label_wiki_page: Wiki orria + label_wiki_page_plural: Wiki orriak + label_index_by_title: Izenburuaren araberako indizea + label_index_by_date: Dataren araberako indizea + label_current_version: Uneko bertsioa + label_preview: Aurreikusi + label_feed_plural: Jarioak + label_changes_details: Aldaketa guztien xehetasunak + label_issue_tracking: Zeregin jarraipena + label_spent_time: Igarotako denbora + label_f_hour: "ordu %{value}" + label_f_hour_plural: "%{value} ordu" + label_time_tracking: Denbora jarraipena + label_change_plural: Aldaketak + label_statistics: Estatistikak + label_commits_per_month: Commit-ak hilabeteka + label_commits_per_author: Commit-ak egileka + label_view_diff: Ezberdintasunak ikusi + label_diff_inline: barnean + label_diff_side_by_side: aldez alde + label_options: Aukerak + label_copy_workflow_from: Kopiatu workflow-a hemendik + label_permissions_report: Baimenen txostena + label_watched_issues: Behatutako zereginak + label_related_issues: Erlazionatutako zereginak + label_applied_status: Aplikatutako egoera + label_loading: Kargatzen... + label_relation_new: Erlazio berria + label_relation_delete: Erlazioa ezabatu + label_relates_to: erlazionatuta dago + label_duplicates: bikoizten du + label_duplicated_by: honek bikoiztuta + label_blocks: blokeatzen du + label_blocked_by: honek blokeatuta + label_precedes: aurretik doa + label_follows: jarraitzen du + label_end_to_start: bukaeratik hasierara + label_end_to_end: bukaeratik bukaerara + label_start_to_start: hasieratik hasierhasieratik bukaerara + label_start_to_end: hasieratik bukaerara + label_stay_logged_in: Saioa mantendu + label_disabled: ezgaituta + label_show_completed_versions: Bukatutako bertsioak ikusi + label_me: ni + label_board: Foroa + label_board_new: Foro berria + label_board_plural: Foroak + label_topic_plural: Gaiak + label_message_plural: Mezuak + label_message_last: Azken mezua + label_message_new: Mezu berria + label_message_posted: Mesua gehituta + label_reply_plural: Erantzunak + label_send_information: Erabiltzaileai kontuaren informazioa bidali + label_year: Urtea + label_month: Hilabetea + label_week: Astea + label_date_from: Nork + label_date_to: Nori + label_language_based: Erabiltzailearen hizkuntzaren arabera + label_sort_by: "Ordenazioa: %{value}" + label_send_test_email: Frogako mezua bidali + label_feeds_access_key: RSS atzipen giltza + label_missing_feeds_access_key: RSS atzipen giltza falta da + label_feeds_access_key_created_on: "RSS atzipen giltza orain dela %{value} sortuta" + label_module_plural: Moduluak + label_added_time_by: "%{author}, orain dela %{age} gehituta" + label_updated_time_by: "%{author}, orain dela %{age} eguneratuta" + label_updated_time: "Orain dela %{value} eguneratuta" + label_jump_to_a_project: Joan proiektura... + label_file_plural: Fitxategiak + label_changeset_plural: Aldaketak + label_default_columns: Lehenetsitako zutabeak + label_no_change_option: (Aldaketarik ez) + label_bulk_edit_selected_issues: Hautatutako zereginak batera editatu + label_theme: Itxura + label_default: Lehenetsia + label_search_titles_only: Izenburuetan bakarrik bilatu + label_user_mail_option_all: "Nire proiektu guztietako gertakari guztientzat" + label_user_mail_option_selected: "Hautatutako proiektuetako edozein gertakarientzat..." + label_user_mail_no_self_notified: "Ez dut nik egiten ditudan aldeketen jakinarazpenik jaso nahi" + label_registration_activation_by_email: kontuak epostaz gaitu + label_registration_manual_activation: kontuak eskuz gaitu + label_registration_automatic_activation: kontuak automatikoki gaitu + label_display_per_page: "Orriko: %{value}" + label_age: Adina + label_change_properties: Propietateak aldatu + label_general: Orokorra + label_more: Gehiago + label_scm: IKK + label_plugins: Pluginak + label_ldap_authentication: LDAP autentikazioa + label_downloads_abbr: Desk. + label_optional_description: Aukerako deskribapena + label_add_another_file: Beste fitxategia gehitu + label_preferences: Hobespenak + label_chronological_order: Orden kronologikoan + label_reverse_chronological_order: Alderantzizko orden kronologikoan + label_planning: Planifikazioa + label_incoming_emails: Sarrerako epostak + label_generate_key: Giltza sortu + label_issue_watchers: Behatzaileak + label_example: Adibidea + label_display: Bistaratzea + label_sort: Ordenatu + label_ascending: Gorantz + label_descending: Beherantz + label_date_from_to: "%{start}-tik %{end}-ra" + label_wiki_content_added: Wiki orria gehituta + label_wiki_content_updated: Wiki orria eguneratuta + label_group: Taldea + label_group_plural: Taldeak + label_group_new: Talde berria + label_time_entry_plural: Igarotako denbora + label_version_sharing_none: Ez partekatuta + label_version_sharing_descendants: Azpiproiektuekin + label_version_sharing_hierarchy: Proiektu Hierarkiarekin + label_version_sharing_tree: Proiektu zuhaitzarekin + label_version_sharing_system: Proiektu guztiekin + label_update_issue_done_ratios: Zereginen burututako erlazioa eguneratu + label_copy_source: Iturburua + label_copy_target: Helburua + label_copy_same_as_target: Helburuaren berdina + label_display_used_statuses_only: Aztarnari honetan erabiltzen diren egoerak bakarrik erakutsi + label_api_access_key: API atzipen giltza + label_missing_api_access_key: API atzipen giltza falta da + label_api_access_key_created_on: "API atzipen giltza sortuta orain dela %{value}" + + button_login: Saioa hasi + button_submit: Bidali + button_save: Gorde + button_check_all: Guztiak markatu + button_uncheck_all: Guztiak desmarkatu + button_delete: Ezabatu + button_create: Sortu + button_create_and_continue: Sortu eta jarraitu + button_test: Frogatu + button_edit: Editatu + button_add: Gehitu + button_change: Aldatu + button_apply: Aplikatu + button_clear: Garbitu + button_lock: Blokeatu + button_unlock: Desblokeatu + button_download: Deskargatu + button_list: Zerrenda + button_view: Ikusi + button_move: Mugitu + button_move_and_follow: Mugitu eta jarraitu + button_back: Atzera + button_cancel: Ezeztatu + button_activate: Gahitu + button_sort: Ordenatu + button_log_time: Denbora erregistratu + button_rollback: Itzuli bertsio honetara + button_watch: Behatu + button_unwatch: Behatzen utzi + button_reply: Erantzun + button_archive: Artxibatu + button_unarchive: Desartxibatu + button_reset: Berrezarri + button_rename: Berrizendatu + button_change_password: Pasahitza aldatu + button_copy: Kopiatu + button_copy_and_follow: Kopiatu eta jarraitu + button_annotate: Anotatu + button_update: Eguneratu + button_configure: Konfiguratu + button_quote: Aipatu + button_duplicate: Bikoiztu + button_show: Ikusi + + status_active: gaituta + status_registered: izena emanda + status_locked: blokeatuta + + version_status_open: irekita + version_status_locked: blokeatuta + version_status_closed: itxita + + field_active: Gaituta + + text_select_mail_notifications: Jakinarazpenak zein ekintzetarako bidaliko diren hautatu. + text_regexp_info: adib. ^[A-Z0-9]+$ + text_min_max_length_info: 0k mugarik gabe esan nahi du + text_project_destroy_confirmation: Ziur zaude proiektu hau eta erlazionatutako datu guztiak ezabatu nahi dituzula? + text_subprojects_destroy_warning: "%{value} azpiproiektuak ere ezabatuko dira." + text_workflow_edit: Hautatu rola eta aztarnaria workflow-a editatzeko + text_are_you_sure: Ziur zaude? + text_journal_changed: "%{label} %{old}-(e)tik %{new}-(e)ra aldatuta" + text_journal_set_to: "%{label}-k %{value} balioa hartu du" + text_journal_deleted: "%{label} ezabatuta (%{old})" + text_journal_added: "%{label} %{value} gehituta" + text_tip_issue_begin_day: gaur hasten diren zereginak + text_tip_issue_end_day: gaur bukatzen diren zereginak + text_tip_issue_begin_end_day: gaur hasi eta bukatzen diren zereginak + text_project_identifier_info: 'Only lower case letters (a-z), numbers, dashes and underscores are allowed.
Once saved, the identifier can not be changed.' + text_caracters_maximum: "%{count} karaktere gehienez." + text_caracters_minimum: "Gutxienez %{count} karaktereetako luzerakoa izan behar du." + text_length_between: "Luzera %{min} eta %{max} karaktereen artekoa." + text_tracker_no_workflow: Ez da workflow-rik definitu aztarnari honentzako + text_unallowed_characters: Debekatutako karaktereak + text_comma_separated: Balio anitz izan daitezke (komaz banatuta). + text_line_separated: Balio anitz izan daitezke (balio bakoitza lerro batean). + text_issues_ref_in_commit_messages: Commit-en mezuetan zereginak erlazionatu eta konpontzen + text_issue_added: "%{id} zeregina %{author}-(e)k jakinarazi du." + text_issue_updated: "%{id} zeregina %{author}-(e)k eguneratu du." + text_wiki_destroy_confirmation: Ziur zaude wiki hau eta bere eduki guztiak ezabatu nahi dituzula? + text_issue_category_destroy_question: "Zeregin batzuk (%{count}) kategoria honetara esleituta daude. Zer egin nahi duzu?" + text_issue_category_destroy_assignments: Kategoria esleipenak kendu + text_issue_category_reassign_to: Zereginak kategoria honetara esleitu + text_user_mail_option: "Hautatu gabeko proiektuetan, behatzen edo parte hartzen duzun gauzei buruzko jakinarazpenak jasoko dituzu (adib. zu egile zaren edo esleituta dituzun zereginak)." + text_no_configuration_data: "Rolak, aztarnariak, zeregin egoerak eta workflow-ak ez dira oraindik konfiguratu.\nOso gomendagarria de lehenetsitako kkonfigurazioa kargatzea. Kargatu eta gero aldatu ahalko duzu." + text_load_default_configuration: Lehenetsitako konfigurazioa kargatu + text_status_changed_by_changeset: "%{value} aldaketan aplikatuta." + text_issues_destroy_confirmation: 'Ziur zaude hautatutako zeregina(k) ezabatu nahi dituzula?' + text_select_project_modules: 'Hautatu proiektu honetan gaitu behar diren moduluak:' + text_default_administrator_account_changed: Lehenetsitako kudeatzaile kontua aldatuta + text_file_repository_writable: Eranskinen direktorioan idatz daiteke + text_plugin_assets_writable: Pluginen baliabideen direktorioan idatz daiteke + text_rmagick_available: RMagick eskuragarri (aukerazkoa) + text_destroy_time_entries_question: "%{hours} orduei buruz berri eman zen zuk ezabatzera zoazen zereginean. Zer egin nahi duzu?" + text_destroy_time_entries: Ezabatu berri emandako orduak + text_assign_time_entries_to_project: Berri emandako orduak proiektura esleitu + text_reassign_time_entries: 'Berri emandako orduak zeregin honetara esleitu:' + text_user_wrote: "%{value}-(e)k idatzi zuen:" + text_enumeration_destroy_question: "%{count} objetu balio honetara esleituta daude." + text_enumeration_category_reassign_to: 'Beste balio honetara esleitu:' + text_email_delivery_not_configured: "Eposta bidalketa ez dago konfiguratuta eta jakinarazpenak ezgaituta daude.\nKonfiguratu zure SMTP zerbitzaria config/configuration.yml-n eta aplikazioa berrabiarazi hauek gaitzeko." + text_repository_usernames_mapping: "Hautatu edo eguneratu Redmineko erabiltzailea biltegiko egunkarietan topatzen diren erabiltzaile izenekin erlazionatzeko.\nRedmine-n eta biltegian erabiltzaile izen edo eposta berdina duten erabiltzaileak automatikoki erlazionatzen dira." + text_diff_truncated: '... Diff hau moztua izan da erakus daitekeen tamaina maximoa gainditu duelako.' + text_custom_field_possible_values_info: 'Lerro bat balio bakoitzeko' + text_wiki_page_destroy_question: "Orri honek %{descendants} orri seme eta ondorengo ditu. Zer egin nahi duzu?" + text_wiki_page_nullify_children: "Orri semeak erro orri moduan mantendu" + text_wiki_page_destroy_children: "Orri semeak eta beraien ondorengo guztiak ezabatu" + text_wiki_page_reassign_children: "Orri semeak orri guraso honetara esleitu" + text_own_membership_delete_confirmation: "Zure baimen batzuk (edo guztiak) kentzera zoaz eta baliteke horren ondoren proiektu hau ezin editatzea.\n Ziur zaude jarraitu nahi duzula?" + + default_role_manager: Kudeatzailea + default_role_developer: Garatzailea + default_role_reporter: Berriemailea + default_role_non_member: Non member + default_role_anonymous: Anonymous + default_tracker_bug: Errorea + default_tracker_feature: Eginbidea + default_tracker_support: Laguntza + default_issue_status_new: Berria + default_issue_status_in_progress: Lanean + default_issue_status_resolved: Ebatzita + default_issue_status_feedback: Berrelikadura + default_issue_status_closed: Itxita + default_issue_status_rejected: Baztertua + default_doc_category_user: Erabiltzaile dokumentazioa + default_doc_category_tech: Dokumentazio teknikoa + default_priority_low: Baxua + default_priority_normal: Normala + default_priority_high: Altua + default_priority_urgent: Larria + default_priority_immediate: Berehalakoa + default_activity_design: Diseinua + default_activity_development: Garapena + + enumeration_issue_priorities: Zeregin lehentasunak + enumeration_doc_categories: Dokumentu kategoriak + enumeration_activities: Jarduerak (denbora kontrola)) + enumeration_system_activity: Sistemako Jarduera + label_board_sticky: Itsaskorra + label_board_locked: Blokeatuta + permission_export_wiki_pages: Wiki orriak esportatu + setting_cache_formatted_text: Formatudun testua katxeatu + permission_manage_project_activities: Proiektuaren jarduerak kudeatu + error_unable_delete_issue_status: Ezine da zereginaren egoera ezabatu + label_profile: Profila + permission_manage_subtasks: Azpiatazak kudeatu + field_parent_issue: Zeregin gurasoa + label_subtask_plural: Azpiatazak + label_project_copy_notifications: Proiektua kopiatzen den bitartean eposta jakinarazpenak bidali + error_can_not_delete_custom_field: Ezin da eremu pertsonalizatua ezabatu + error_unable_to_connect: Ezin da konektatu (%{value}) + error_can_not_remove_role: Rol hau erabiltzen hari da eta ezin da ezabatu. + error_can_not_delete_tracker: Aztarnari honek zereginak ditu eta ezin da ezabatu. + field_principal: Ekintzaile + label_my_page_block: "Nire orriko blokea" + notice_failed_to_save_members: "Kidea(k) gordetzean errorea: %{errors}." + text_zoom_out: Zooma txikiagotu + text_zoom_in: Zooma handiagotu + notice_unable_delete_time_entry: "Ezin da hautatutako denbora erregistroa ezabatu." + label_overall_spent_time: Igarotako denbora guztira + field_time_entries: "Denbora erregistratu" + project_module_gantt: Gantt + text_powered_by: Powered by %{link} label_cvs_module: Module label_filesystem_path: Root directory label_darcs_path: Root directory @@ -950,3 +931,39 @@ eu: label_cvs_path: CVSROOT label_git_path: Path to .git directory label_mercurial_path: Root directory + project_module_calendar: Egutegia + button_edit_associated_wikipage: "Esleitutako wiki orria editatu: %{page_title}" + text_are_you_sure_with_children: "Zeregina eta azpi zeregin guztiak ezabatu?" + field_text: Testu eremua + label_user_mail_option_only_owner: "Jabea naizen gauzetarako barrarik" + setting_default_notification_option: "Lehenetsitako ohartarazpen aukera" + label_user_mail_option_only_my_events: "Behatzen ditudan edo partaide naizen gauzetarako bakarrik" + label_user_mail_option_only_assigned: "Niri esleitutako gauzentzat bakarrik" + label_user_mail_option_none: "Gertakaririk ez" + field_member_of_group: "Esleituta duenaren taldea" + field_assigned_to_role: "Esleituta duenaren rola" + notice_not_authorized_archived_project: "Atzitu nahi duzun proiektua artxibatua izan da." + label_principal_search: "Bilatu erabiltzaile edo taldea:" + label_user_search: "Erabiltzailea bilatu:" + field_visible: Ikusgai + setting_emails_header: "Eposten goiburua" + setting_commit_logtime_activity_id: "Erregistratutako denboraren jarduera" + text_time_logged_by_changeset: "%{value} aldaketan egindakoa." + setting_commit_logtime_enabled: "Erregistrutako denbora gaitu" + notice_gantt_chart_truncated: Grafikoa moztu da bistara daitekeen elementuen kopuru maximoa gainditu delako (%{max}) + setting_gantt_items_limit: "Gantt grafikoan bistara daitekeen elementu kopuru maximoa" + label_my_queries: My custom queries + label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee + text_journal_changed_no_detail: "%{label} updated" + button_expand_all: Expand all + button_collapse_all: Collapse all + label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author + field_effective_date: Due date + label_news_comment_added: Comment added to a news + field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text + text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page. + text_default_encoding: "Default: UTF-8" + text_git_repo_example: a bare and local repository (e.g. /gitrepo, c:\gitrepo) + label_notify_member_plural: Email issue updates + label_path_encoding: Path encoding + text_mercurial_repo_example: local repository (e.g. /hgrepo, c:\hgrepo) diff --git a/config/locales/fa.yml b/config/locales/fa.yml new file mode 100644 index 00000000..55ad8971 --- /dev/null +++ b/config/locales/fa.yml @@ -0,0 +1,968 @@ +fa: + # Text direction: Left-to-Right (ltr) or Right-to-Left (rtl) + direction: rtl + date: + formats: + # Use the strftime parameters for formats. + # When no format has been given, it uses default. + # You can provide other formats here if you like! + default: "%Y/%m/%d" + short: "%b %d" + long: "%B %d, %Y" + + day_names: [یک‌شنبه, دوشنبه, سه‌شنبه, چهارشنبه, پنج‌شنبه, آدینه, شنبه] + abbr_day_names: [یک, دو, سه, چهار, پنج, آدینه, شنبه] + + # Don't forget the nil at the beginning; there's no such thing as a 0th month + month_names: [~, ژانویه, فوریه, مارس, آوریل, مه, ژوئن, ژوئیه, اوت, سپتامبر, اکتبر, نوامبر, دسامبر] + abbr_month_names: [~, ژان, فور, مار, آور, مه, ژوئن, ژوئیه, اوت, سپت, اکت, نوا, دسا] + # Used in date_select and datime_select. + order: + - :year + - :month + - :day + + time: + formats: + default: "%Y/%m/%d %p %I:%M" + time: "%p %I:%M" + short: "%d %b %H:%M" + long: "%B %d, %Y %H:%M" + am: "ق.ظ" + pm: "ب.ظ" + + datetime: + distance_in_words: + half_a_minute: "نیم دقیقه" + less_than_x_seconds: + one: "کمتر از 1 ثانیه" + other: "کمتر از %{count} ثانیه" + x_seconds: + one: "1 ثانیه" + other: "%{count} ثانیه" + less_than_x_minutes: + one: "کمتر از 1 دقیقه" + other: "کمتر از %{count} دقیقه" + x_minutes: + one: "1 دقیقه" + other: "%{count} دقیقه" + about_x_hours: + one: "نزدیک 1 ساعت" + other: "نزدیک %{count} ساعت" + x_days: + one: "1 روز" + other: "%{count} روز" + about_x_months: + one: "نزدیک 1 ماه" + other: "نزدیک %{count} ماه" + x_months: + one: "1 ماه" + other: "%{count} ماه" + about_x_years: + one: "نزدیک 1 سال" + other: "نزدیک %{count} سال" + over_x_years: + one: "بیش از 1 سال" + other: "بیش از %{count} سال" + almost_x_years: + one: "نزدیک 1 سال" + other: "نزدیک %{count} سال" + + number: + # Default format for numbers + format: + separator: "٫" + delimiter: "" + precision: 3 + human: + format: + delimiter: "" + precision: 1 + storage_units: + format: "%n %u" + units: + byte: + one: "بایت" + other: "بایت" + kb: "کیلوبایت" + mb: "مگابایت" + gb: "گیگابایت" + tb: "ترابایت" + + +# Used in array.to_sentence. + support: + array: + sentence_connector: "و" + skip_last_comma: false + + activerecord: + errors: + template: + header: + one: "1 ایراد از ذخیره سازی این %{model} جلوگیری کرد" + other: "%{count} ایراد از ذخیره سازی این %{model} جلوگیری کرد" + messages: + inclusion: "در فهرست نیامده است" + exclusion: "رزرو شده است" + invalid: "نادرست است" + confirmation: "با بررسی سازگاری ندارد" + accepted: "باید پذیرفته شود" + empty: "نمی‌تواند تهی باشد" + blank: "نمی‌تواند تهی باشد" + too_long: "خیلی بلند است (بیشترین اندازه %{count} نویسه است)" + too_short: "خیلی کوتاه است (کمترین اندازه %{count} نویسه است)" + wrong_length: "اندازه نادرست است (باید %{count} نویسه باشد)" + taken: "پیش از این گرفته شده است" + not_a_number: "شماره درستی نیست" + not_a_date: "تاریخ درستی نیست" + greater_than: "باید بزرگتر از %{count} باشد" + greater_than_or_equal_to: "باید بزرگتر از یا برابر با %{count} باشد" + equal_to: "باید برابر با %{count} باشد" + less_than: "باید کمتر از %{count} باشد" + less_than_or_equal_to: "باید کمتر از یا برابر با %{count} باشد" + odd: "باید فرد باشد" + even: "باید زوج باشد" + greater_than_start_date: "باید از تاریخ آغاز بزرگتر باشد" + not_same_project: "به همان پروژه وابسته نیست" + circular_dependency: "این وابستگی یک وابستگی دایره وار خواهد ساخت" + cant_link_an_issue_with_a_descendant: "یک پیامد نمی‌تواند به یکی از زیر کارهایش پیوند بخورد" + + actionview_instancetag_blank_option: گزینش کنید + + general_text_No: 'خیر' + general_text_Yes: 'آری' + general_text_no: 'خیر' + general_text_yes: 'آری' + general_lang_name: 'Persian (پارسی)' + general_csv_separator: ',' + general_csv_decimal_separator: '.' + general_csv_encoding: UTF-8 + general_pdf_encoding: UTF-8 + general_first_day_of_week: '6' + + notice_account_updated: حساب شما بروز شد. + notice_account_invalid_creditentials: نام کاربری یا گذرواژه نادرست است + notice_account_password_updated: گذرواژه بروز شد + notice_account_wrong_password: گذرواژه نادرست است + notice_account_register_done: حساب ساخته شد. برای فعال نمودن آن، روی پیوندی که به شما ایمیل شده کلیک کنید. + notice_account_unknown_email: کاربر شناخته نشد. + notice_can_t_change_password: این حساب یک روش شناسایی بیرونی را به کار گرفته است. گذرواژه را نمی‌توان جایگزین کرد. + notice_account_lost_email_sent: یک ایمیل با راهنمایی درباره گزینش گذرواژه تازه برای شما فرستاده شد. + notice_account_activated: حساب شما فعال شده است. اکنون می‌توانید وارد شوید. + notice_successful_create: با موفقیت ساخته شد. + notice_successful_update: با موفقیت بروز شد. + notice_successful_delete: با موفقیت برداشته شد. + notice_successful_connection: با موفقیت متصل شد. + notice_file_not_found: برگه درخواستی شما در دسترس نیست یا پاک شده است. + notice_locking_conflict: داده‌ها را کاربر دیگری بروز کرده است. + notice_not_authorized: شما به این برگه دسترسی ندارید. + notice_not_authorized_archived_project: پروژه درخواستی شما بایگانی شده است. + notice_email_sent: "یک ایمیل به %{value} فرستاده شد." + notice_email_error: "یک ایراد در فرستادن ایمیل پیش آمد (%{value})." + notice_feeds_access_key_reseted: کلید دسترسی RSS شما بازنشانی شد. + notice_api_access_key_reseted: کلید دسترسی API شما بازنشانی شد. + notice_failed_to_save_issues: "ذخیره سازی %{count} پیامد از %{total} پیامد گزینش شده شکست خورد: %{ids}." + notice_failed_to_save_members: "ذخیره سازی اعضا شکست خورد: %{errors}." + notice_no_issue_selected: "هیچ پیامدی برگزیده نشده است! پیامدهایی که می‌خواهید ویرایش کنید را برگزینید." + notice_account_pending: "حساب شما ساخته شد و اکنون چشم به راه روادید سرپرست است." + notice_default_data_loaded: پیکربندی پیش‌گزیده با موفقیت بار شد. + notice_unable_delete_version: نگارش را نمی‌توان پاک کرد. + notice_unable_delete_time_entry: زمان گزارش شده را نمی‌توان پاک کرد. + notice_issue_done_ratios_updated: اندازه انجام شده پیامد بروز شد. + notice_gantt_chart_truncated: "نمودار بریده شد چون از بیشترین شماری که می‌توان نشان داد بزگتر است (%{max})." + + error_can_t_load_default_data: "پیکربندی پیش‌گزیده نمی‌تواند بار شود: %{value}" + error_scm_not_found: "بخش یا نگارش در انباره پیدا نشد." + error_scm_command_failed: "ایرادی در دسترسی به انباره پیش آمد: %{value}" + error_scm_annotate: "بخش پیدا نشد یا نمی‌توان برای آن یادداشت نوشت." + error_issue_not_found_in_project: 'پیامد پیدا نشد یا به این پروژه وابسته نیست.' + error_no_tracker_in_project: 'هیچ پیگردی به این پروژه پیوسته نشده است. پیکربندی پروژه را بررسی کنید.' + error_no_default_issue_status: 'هیچ وضعیت پیامد پیش‌گزیده‌ای مشخص نشده است. پیکربندی را بررسی کنید (به «پیکربندی -> وضعیت‌های پیامد» بروید).' + error_can_not_delete_custom_field: فیلد سفارشی را نمی‌توان پاک کرد. + error_can_not_delete_tracker: "این پیگرد دارای پیامد است و نمی‌توان آن را پاک کرد." + error_can_not_remove_role: "این نقش به کار گرفته شده است و نمی‌توان آن را پاک کرد." + error_can_not_reopen_issue_on_closed_version: 'یک پیامد که به یک نگارش بسته شده وابسته است را نمی‌توان باز کرد.' + error_can_not_archive_project: این پروژه را نمی‌توان بایگانی کرد. + error_issue_done_ratios_not_updated: "اندازه انجام شده پیامد بروز نشد." + error_workflow_copy_source: 'یک پیگرد یا نقش منبع را برگزینید.' + error_workflow_copy_target: 'پیگردها یا نقش‌های مقصد را برگزینید.' + error_unable_delete_issue_status: 'وضعیت پیامد را نمی‌توان پاک کرد.' + error_unable_to_connect: "نمی‌توان متصل شد (%{value})" + warning_attachments_not_saved: "%{count} پرونده ذخیره نشد." + + mail_subject_lost_password: "گذرواژه حساب %{value} شما" + mail_body_lost_password: 'برای جایگزینی گذرواژه خود، بر روی پیوند زیر کلیک کنید:' + mail_subject_register: "فعالسازی حساب %{value} شما" + mail_body_register: 'برای فعالسازی حساب خود، بر روی پیوند زیر کلیک کنید:' + mail_body_account_information_external: "شما می‌توانید حساب %{value} خود را برای ورود به کار برید." + mail_body_account_information: داده‌های حساب شما + mail_subject_account_activation_request: "درخواست فعالسازی حساب %{value}" + mail_body_account_activation_request: "یک کاربر تازه (%{value}) نامنویسی کرده است. این حساب چشم به راه روادید شماست:" + mail_subject_reminder: "زمان رسیدگی به %{count} پیامد در %{days} روز آینده سر می‌رسد" + mail_body_reminder: "زمان رسیدگی به %{count} پیامد که به شما واگذار شده است، در %{days} روز آینده سر می‌رسد:" + mail_subject_wiki_content_added: "برگه ویکی «%{id}» افزوده شد" + mail_body_wiki_content_added: "برگه ویکی «%{id}» به دست %{author} افزوده شد." + mail_subject_wiki_content_updated: "برگه ویکی «%{id}» بروز شد" + mail_body_wiki_content_updated: "برگه ویکی «%{id}» به دست %{author} بروز شد." + + gui_validation_error: 1 ایراد + gui_validation_error_plural: "%{count} ایراد" + + field_name: نام + field_description: توضیح + field_summary: خلاصه + field_is_required: الزامی + field_firstname: نام کوچک + field_lastname: نام خانوادگی + field_mail: ایمیل + field_filename: پرونده + field_filesize: اندازه + field_downloads: دریافت‌ها + field_author: نویسنده + field_created_on: ساخته شده در + field_updated_on: بروز شده در + field_field_format: قالب + field_is_for_all: برای همه پروژه‌ها + field_possible_values: مقادیر ممکن + field_regexp: عبارت منظم + field_min_length: کمترین اندازه + field_max_length: بیشترین اندازه + field_value: مقدار + field_category: دسته + field_title: عنوان + field_project: پروژه + field_issue: پیامد + field_status: وضعیت + field_notes: یادداشت‌ها + field_is_closed: پیامد بسته شده + field_is_default: مقدار پیش‌گزیده + field_tracker: پیگرد + field_subject: موضوع + field_due_date: زمان سررسید + field_assigned_to: واگذار شده به + field_priority: برتری + field_fixed_version: نگارش هدف + field_user: کاربر + field_principal: دستور دهنده + field_role: نقش + field_homepage: برگه خانه + field_is_public: همگانی + field_parent: پروژه پدر + field_is_in_roadmap: این پیامدها در نقشه راه نشان داده شوند + field_login: ورود + field_mail_notification: آگاه سازی‌های ایمیلی + field_admin: سرپرست + field_last_login_on: آخرین ورود + field_language: زبان + field_effective_date: تاریخ + field_password: گذرواژه + field_new_password: گذرواژه تازه + field_password_confirmation: بررسی گذرواژه + field_version: نگارش + field_type: گونه + field_host: میزبان + field_port: درگاه + field_account: حساب + field_base_dn: DN پایه + field_attr_login: نشانه ورود + field_attr_firstname: نشانه نام کوچک + field_attr_lastname: نشانه نام خانوادگی + field_attr_mail: نشانه ایمیل + field_onthefly: ساخت کاربر بیدرنگ + field_start_date: تاریخ آغاز + field_done_ratio: ٪ انجام شده + field_auth_source: روش شناسایی + field_hide_mail: ایمیل من پنهان شود + field_comments: دیدگاه + field_url: نشانی + field_start_page: برگه آغاز + field_subproject: زیر پروژه + field_hours: ساعت‌ + field_activity: فعالیت + field_spent_on: در تاریخ + field_identifier: شناسه + field_is_filter: پالایش پذیر + field_issue_to: پیامد وابسته + field_delay: دیرکرد + field_assignable: پیامدها می‌توانند به این نقش واگذار شوند + field_redirect_existing_links: پیوندهای پیشین به پیوند تازه راهنمایی شوند + field_estimated_hours: زمان برآورد شده + field_column_names: ستون‌ها + field_time_entries: زمان نوشتن + field_time_zone: پهنه زمانی + field_searchable: جستجو پذیر + field_default_value: مقدار پیش‌گزیده + field_comments_sorting: نمایش دیدگاه‌ها + field_parent_title: برگه پدر + field_editable: ویرایش پذیر + field_watcher: دیده‌بان + field_identity_url: نشانی OpenID + field_content: محتوا + field_group_by: دسته بندی با + field_sharing: اشتراک گذاری + field_parent_issue: کار پدر + field_member_of_group: "دسته واگذار شونده" + field_assigned_to_role: "نقش واگذار شونده" + field_text: فیلد متنی + field_visible: آشکار + + setting_app_title: نام برنامه + setting_app_subtitle: زیرنام برنامه + setting_welcome_text: نوشتار خوش‌آمد گویی + setting_default_language: زبان پیش‌گزیده + setting_login_required: الزامی بودن ورود + setting_self_registration: خود نام نویسی + setting_attachment_max_size: بیشترین اندازه پیوست + setting_issues_export_limit: کرانه صدور پییامدها + setting_mail_from: نشانی فرستنده ایمیل + setting_bcc_recipients: گیرندگان ایمیل دیده نشوند (bcc) + setting_plain_text_mail: ایمیل نوشته ساده (بدون HTML) + setting_host_name: نام میزبان و نشانی + setting_text_formatting: قالب بندی نوشته + setting_wiki_compression: فشرده‌سازی پیشینه ویکی + setting_feeds_limit: کرانه محتوای خوراک + setting_default_projects_public: حالت پیش‌گزیده پروژه‌های تازه، همگانی است + setting_autofetch_changesets: دریافت خودکار تغییرات + setting_sys_api_enabled: فعال سازی وب سرویس برای سرپرستی انباره + setting_commit_ref_keywords: کلیدواژه‌های نشانه + setting_commit_fix_keywords: کلیدواژه‌های انجام + setting_autologin: ورود خودکار + setting_date_format: قالب تاریخ + setting_time_format: قالب زمان + setting_cross_project_issue_relations: توانایی وابستگی میان پروژه‌ای پیامدها + setting_issue_list_default_columns: ستون‌های پیش‌گزیده نمایش داده شده در فهرست پیامدها + setting_repositories_encodings: کدگذاری انباره‌ها + setting_commit_logs_encoding: کدگذاری پیام‌های انباره + setting_emails_header: سرنویس ایمیل‌ها + setting_emails_footer: پانویس ایمیل‌ها + setting_protocol: پیوندنامه + setting_per_page_options: گزینه‌های اندازه داده‌های هر برگ + setting_user_format: قالب نمایشی کاربران + setting_activity_days_default: روزهای نمایش داده شده در فعالیت پروژه + setting_display_subprojects_issues: پیش‌گزیده نمایش پیامدهای زیرپروژه در پروژه پدر + setting_enabled_scm: فعالسازی SCM + setting_mail_handler_body_delimiters: "بریدن ایمیل‌ها پس از یکی از این ردیف‌ها" + setting_mail_handler_api_enabled: فعالسازی وب سرویس برای ایمیل‌های آمده + setting_mail_handler_api_key: کلید API + setting_sequential_project_identifiers: ساخت پشت سر هم شناسه پروژه + setting_gravatar_enabled: کاربرد Gravatar برای عکس کاربر + setting_gravatar_default: عکس Gravatar پیش‌گزیده + setting_diff_max_lines_displayed: بیشترین اندازه ردیف‌های تفاوت نشان داده شده + setting_file_max_size_displayed: بیشترین اندازه پرونده‌های نمایش داده شده درون خطی + setting_repository_log_display_limit: بیشترین شمار نگارش‌های نمایش داده شده در گزارش پرونده + setting_openid: پذیرش ورود و نام نویسی با OpenID + setting_password_min_length: کمترین اندازه گذرواژه + setting_new_project_user_role_id: نقش داده شده به کاربری که سرپرست نیست و پروژه می‌سازد + setting_default_projects_modules: پیمانه‌های پیش‌گزیده فعال برای پروژه‌های تازه + setting_issue_done_ratio: برآورد اندازه انجام شده پیامد با + setting_issue_done_ratio_issue_field: کاربرد فیلد پیامد + setting_issue_done_ratio_issue_status: کاربرد وضعیت پیامد + setting_start_of_week: آغاز گاهشمار از + setting_rest_api_enabled: فعالسازی وب سرویس‌های REST + setting_cache_formatted_text: نهان سازی نوشته‌های قالب بندی شده + setting_default_notification_option: آگاه سازی پیش‌گزیده + setting_commit_logtime_enabled: فعالسازی زمان گذاشته شده + setting_commit_logtime_activity_id: فعالیت زمان گذاشته شده + setting_gantt_items_limit: بیشترین شمار بخش‌های نمایش داده شده در نمودار گانت + + permission_add_project: ساخت پروژه + permission_add_subprojects: ساخت زیرپروژه + permission_edit_project: ویرایش پروژه + permission_select_project_modules: گزینش پیمانه‌های پروژه + permission_manage_members: سرپرستی اعضا + permission_manage_project_activities: سرپرستی فعالیت‌های پروژه + permission_manage_versions: سرپرستی نگارش‌ها + permission_manage_categories: سرپرستی دسته‌های پیامد + permission_view_issues: دیدن پیامدها + permission_add_issues: افزودن پیامدها + permission_edit_issues: ویرایش پیامدها + permission_manage_issue_relations: سرپرستی وابستگی پیامدها + permission_add_issue_notes: افزودن یادداشت‌ها + permission_edit_issue_notes: ویرایش یادداشت‌ها + permission_edit_own_issue_notes: ویرایش یادداشت خود + permission_move_issues: جابجایی پیامدها + permission_delete_issues: پاک کردن پیامدها + permission_manage_public_queries: سرپرستی پرس‌وجوهای همگانی + permission_save_queries: ذخیره سازی پرس‌وجوها + permission_view_gantt: دیدن نمودار گانت + permission_view_calendar: دیدن گاهشمار + permission_view_issue_watchers: دیدن فهرست دیده‌بان‌ها + permission_add_issue_watchers: افزودن دیده‌بان‌ها + permission_delete_issue_watchers: پاک کردن دیده‌بان‌ها + permission_log_time: نوشتن زمان گذاشته شده + permission_view_time_entries: دیدن زمان گذاشته شده + permission_edit_time_entries: ویرایش زمان گذاشته شده + permission_edit_own_time_entries: ویرایش زمان گذاشته شده خود + permission_manage_news: سرپرستی رویدادها + permission_comment_news: گذاشتن دیدگاه روی رویدادها + permission_manage_documents: سرپرستی نوشتارها + permission_view_documents: دیدن نوشتارها + permission_manage_files: سرپرستی پرونده‌ها + permission_view_files: دیدن پرونده‌ها + permission_manage_wiki: سرپرستی ویکی + permission_rename_wiki_pages: نامگذاری برگه ویکی + permission_delete_wiki_pages: پاک کردن برگه ویکی + permission_view_wiki_pages: دیدن ویکی + permission_view_wiki_edits: دیدن پیشینه ویکی + permission_edit_wiki_pages: ویرایش برگه‌های ویکی + permission_delete_wiki_pages_attachments: پاک کردن پیوست‌های برگه ویکی + permission_protect_wiki_pages: نگه‌داری برگه‌های ویکی + permission_manage_repository: سرپرستی انباره + permission_browse_repository: چریدن در انباره + permission_view_changesets: دیدن تغییرات + permission_commit_access: دسترسی تغییر انباره + permission_manage_boards: سرپرستی انجمن‌ها + permission_view_messages: دیدن پیام‌ها + permission_add_messages: فرستادن پیام‌ها + permission_edit_messages: ویرایش پیام‌ها + permission_edit_own_messages: ویرایش پیام خود + permission_delete_messages: پاک کردن پیام‌ها + permission_delete_own_messages: پاک کردن پیام خود + permission_export_wiki_pages: صدور برگه‌های ویکی + permission_manage_subtasks: سرپرستی زیرکارها + + project_module_issue_tracking: پیگیری پیامدها + project_module_time_tracking: پیگیری زمان + project_module_news: رویدادها + project_module_documents: نوشتارها + project_module_files: پرونده‌ها + project_module_wiki: ویکی + project_module_repository: انباره + project_module_boards: انجمن‌ها + project_module_calendar: گاهشمار + project_module_gantt: گانت + + label_user: کاربر + label_user_plural: کاربر + label_user_new: کاربر تازه + label_user_anonymous: ناشناس + label_project: پروژه + label_project_new: پروژه تازه + label_project_plural: پروژه + label_x_projects: + zero: بدون پروژه + one: "1 پروژه" + other: "%{count} پروژه" + label_project_all: همه پروژه‌ها + label_project_latest: آخرین پروژه‌ها + label_issue: پیامد + label_issue_new: پیامد تازه + label_issue_plural: پیامد + label_issue_view_all: دیدن همه پیامدها + label_issues_by: "پیامدهای دست%{value}" + label_issue_added: پیامد افزوده شد + label_issue_updated: پیامد بروز شد + label_document: نوشتار + label_document_new: نوشتار تازه + label_document_plural: نوشتار + label_document_added: نوشتار افزوده شد + label_role: نقش + label_role_plural: نقش + label_role_new: نقش تازه + label_role_and_permissions: نقش‌ها و پروانه‌ها + label_member: عضو + label_member_new: عضو تازه + label_member_plural: عضو + label_tracker: پیگرد + label_tracker_plural: پیگرد + label_tracker_new: پیگرد تازه + label_workflow: گردش کار + label_issue_status: وضعیت پیامد + label_issue_status_plural: وضعیت پیامد + label_issue_status_new: وضعیت تازه + label_issue_category: دسته پیامد + label_issue_category_plural: دسته پیامد + label_issue_category_new: دسته تازه + label_custom_field: فیلد سفارشی + label_custom_field_plural: فیلد سفارشی + label_custom_field_new: فیلد سفارشی تازه + label_enumerations: برشمردنی‌ها + label_enumeration_new: مقدار تازه + label_information: داده + label_information_plural: داده + label_please_login: وارد شوید + label_register: نام نویسی کنید + label_login_with_open_id_option: یا با OpenID وارد شوید + label_password_lost: بازیافت گذرواژه + label_home: سرآغاز + label_my_page: برگه من + label_my_account: حساب من + label_my_projects: پروژه‌های من + label_my_page_block: بخش برگه من + label_administration: سرپرستی + label_login: ورود + label_logout: خروج + label_help: راهنما + label_reported_issues: پیامدهای گزارش شده + label_assigned_to_me_issues: پیامدهای واگذار شده به من + label_last_login: آخرین ورود + label_registered_on: نام نویسی شده در + label_activity: فعالیت + label_overall_activity: فعالیت روی هم رفته + label_user_activity: "فعالیت %{value}" + label_new: تازه + label_logged_as: "نام کاربری:" + label_environment: محیط + label_authentication: شناسایی + label_auth_source: روش شناسایی + label_auth_source_new: روش شناسایی تازه + label_auth_source_plural: روش شناسایی + label_subproject_plural: زیرپروژه + label_subproject_new: زیرپروژه تازه + label_and_its_subprojects: "%{value} و زیرپروژه‌هایش" + label_min_max_length: کمترین و بیشترین اندازه + label_list: فهرست + label_date: تاریخ + label_integer: شماره درست + label_float: شماره شناور + label_boolean: درست/نادرست + label_string: نوشته + label_text: نوشته بلند + label_attribute: نشانه + label_attribute_plural: نشانه + label_download: "%{count} بار دریافت شده" + label_download_plural: "%{count} بار دریافت شده" + label_no_data: هیچ داده‌ای برای نمایش نیست + label_change_status: جایگزینی وضعیت + label_history: پیشینه + label_attachment: پرونده + label_attachment_new: پرونده تازه + label_attachment_delete: پاک کردن پرونده + label_attachment_plural: پرونده + label_file_added: پرونده افزوده شد + label_report: گزارش + label_report_plural: گزارش + label_news: رویداد + label_news_new: افزودن رویداد + label_news_plural: رویداد + label_news_latest: آخرین رویدادها + label_news_view_all: دیدن همه رویدادها + label_news_added: رویداد افزوده شد + label_settings: پیکربندی + label_overview: دورنما + label_version: نگارش + label_version_new: نگارش تازه + label_version_plural: نگارش + label_close_versions: بستن نگارش‌های انجام شده + label_confirmation: بررسی + label_export_to: 'قالب‌های دیگر:' + label_read: خواندن... + label_public_projects: پروژه‌های همگانی + label_open_issues: باز + label_open_issues_plural: باز + label_closed_issues: بسته + label_closed_issues_plural: بسته + label_x_open_issues_abbr_on_total: + zero: 0 باز از %{total} + one: 1 باز از %{total} + other: "%{count} باز از %{total}" + label_x_open_issues_abbr: + zero: 0 باز + one: 1 باز + other: "%{count} باز" + label_x_closed_issues_abbr: + zero: 0 بسته + one: 1 بسته + other: "%{count} بسته" + label_total: جمله + label_permissions: پروانه‌ها + label_current_status: وضعیت کنونی + label_new_statuses_allowed: وضعیت‌های پذیرفتنی تازه + label_all: همه + label_none: هیچ + label_nobody: هیچکس + label_next: پسین + label_previous: پیشین + label_used_by: به کار رفته در + label_details: ریزه‌کاری + label_add_note: افزودن یادداشت + label_per_page: ردیف‌ها در هر برگه + label_calendar: گاهشمار + label_months_from: از ماه + label_gantt: گانت + label_internal: درونی + label_last_changes: "%{count} تغییر آخر" + label_change_view_all: دیدن همه تغییرات + label_personalize_page: سفارشی نمودن این برگه + label_comment: دیدگاه + label_comment_plural: دیدگاه + label_x_comments: + zero: بدون دیدگاه + one: 1 دیدگاه + other: "%{count} دیدگاه" + label_comment_add: افزودن دیدگاه + label_comment_added: دیدگاه افزوده شد + label_comment_delete: پاک کردن دیدگاه‌ها + label_query: پرس‌وجوی سفارشی + label_query_plural: پرس‌وجوی سفارشی + label_query_new: پرس‌وجوی تازه + label_filter_add: افزودن پالایه + label_filter_plural: پالایه + label_equals: برابر است با + label_not_equals: برابر نیست با + label_in_less_than: کمتر است از + label_in_more_than: بیشتر است از + label_greater_or_equal: بیشتر یا برابر است با + label_less_or_equal: کمتر یا برابر است با + label_in: در + label_today: امروز + label_all_time: همیشه + label_yesterday: دیروز + label_this_week: این هفته + label_last_week: هفته پیشین + label_last_n_days: "%{count} روز گذشته" + label_this_month: این ماه + label_last_month: ماه پیشین + label_this_year: امسال + label_date_range: بازه تاریخ + label_less_than_ago: کمتر از چند روز پیشین + label_more_than_ago: بیشتر از چند روز پیشین + label_ago: روز پیشین + label_contains: دارد + label_not_contains: ندارد + label_day_plural: روز + label_repository: انباره + label_repository_plural: انباره + label_browse: چریدن + label_modification: "%{count} جایگذاری" + label_modification_plural: "%{count} جایگذاری" + label_branch: شاخه + label_tag: برچسب + label_revision: بازبینی + label_revision_plural: بازبینی + label_revision_id: "بازبینی %{value}" + label_associated_revisions: بازبینی‌های وابسته + label_added: افزوده شده + label_modified: پیراسته شده + label_copied: رونویسی شده + label_renamed: نامگذاری شده + label_deleted: پاکسازی شده + label_latest_revision: آخرین بازبینی + label_latest_revision_plural: آخرین بازبینی + label_view_revisions: دیدن بازبینی‌ها + label_view_all_revisions: دیدن همه بازبینی‌ها + label_max_size: بیشترین اندازه + label_sort_highest: بردن به آغاز + label_sort_higher: بردن به بالا + label_sort_lower: بردن به پایین + label_sort_lowest: بردن به پایان + label_roadmap: نقشه راه + label_roadmap_due_in: "سررسید در %{value}" + label_roadmap_overdue: "%{value} دیرکرد" + label_roadmap_no_issues: هیچ پیامدی برای این نگارش نیست + label_search: جستجو + label_result_plural: دست‌آورد + label_all_words: همه واژه‌ها + label_wiki: ویکی + label_wiki_edit: ویرایش ویکی + label_wiki_edit_plural: ویرایش ویکی + label_wiki_page: برگه ویکی + label_wiki_page_plural: برگه ویکی + label_index_by_title: شاخص بر اساس نام + label_index_by_date: شاخص بر اساس تاریخ + label_current_version: نگارش کنونی + label_preview: پیش‌نمایش + label_feed_plural: خوراک + label_changes_details: ریز همه جایگذاری‌ها + label_issue_tracking: پیگیری پیامد + label_spent_time: زمان گذاشته شده + label_overall_spent_time: زمان گذاشته شده روی هم + label_f_hour: "%{value} ساعت" + label_f_hour_plural: "%{value} ساعت" + label_time_tracking: پیگیری زمان + label_change_plural: جایگذاری + label_statistics: سرشماری + label_commits_per_month: تغییر در هر ماه + label_commits_per_author: تغییر هر نویسنده + label_view_diff: دیدن تفاوت‌ها + label_diff_inline: همراستا + label_diff_side_by_side: کنار به کنار + label_options: گزینه‌ها + label_copy_workflow_from: رونویسی گردش کار از روی + label_permissions_report: گزارش پروانه‌ها + label_watched_issues: پیامدهای دیده‌بانی شده + label_related_issues: پیامدهای وابسته + label_applied_status: وضعیت به کار رفته + label_loading: بار گذاری... + label_relation_new: وابستگی تازه + label_relation_delete: پاک کردن وابستگی + label_relates_to: وابسته به + label_duplicates: نگارش دیگری از + label_duplicated_by: نگارشی دیگر در + label_blocks: بازداشت‌ها + label_blocked_by: بازداشت به دست + label_precedes: جلوتر است از + label_follows: پستر است از + label_end_to_start: پایان به آغاز + label_end_to_end: پایان به پایان + label_start_to_start: آغاز به آغاز + label_start_to_end: آغاز به پایان + label_stay_logged_in: وارد شده بمانید + label_disabled: غیرفعال + label_show_completed_versions: نمایش نگارش‌های انجام شده + label_me: من + label_board: انجمن + label_board_new: انجمن تازه + label_board_plural: انجمن + label_board_locked: قفل شده + label_board_sticky: چسبناک + label_topic_plural: سرفصل + label_message_plural: پیام + label_message_last: آخرین پیام + label_message_new: پیام تازه + label_message_posted: پیام افزوده شد + label_reply_plural: پاسخ + label_send_information: فرستادن داده‌های حساب به کاربر + label_year: سال + label_month: ماه + label_week: هفته + label_date_from: از + label_date_to: تا + label_language_based: بر اساس زبان کاربر + label_sort_by: "جور کرد با %{value}" + label_send_test_email: فرستادن ایمیل آزمایشی + label_feeds_access_key: کلید دسترسی RSS + label_missing_feeds_access_key: کلید دسترسی RSS در دسترس نیست + label_feeds_access_key_created_on: "کلید دسترسی RSS %{value} پیش ساخته شده است" + label_module_plural: پیمانه + label_added_time_by: "افزوده شده به دست %{author} در %{age} پیش" + label_updated_time_by: "بروز شده به دست %{author} در %{age} پیش" + label_updated_time: "بروز شده در %{value} پیش" + label_jump_to_a_project: پرش به یک پروژه... + label_file_plural: پرونده + label_changeset_plural: تغییر + label_default_columns: ستون‌های پیش‌گزیده + label_no_change_option: (بدون تغییر) + label_bulk_edit_selected_issues: ویرایش دسته‌ای پیامدهای گزینش شده + label_theme: پوسته + label_default: پیش‌گزیده + label_search_titles_only: تنها نام‌ها جستجو شود + label_user_mail_option_all: "برای هر رویداد در همه پروژه‌ها" + label_user_mail_option_selected: "برای هر رویداد تنها در پروژه‌های گزینش شده..." + label_user_mail_option_none: "هیچ رویدادی" + label_user_mail_option_only_my_events: "تنها برای چیزهایی که دیده‌بان هستم یا در آن‌ها درگیر هستم" + label_user_mail_option_only_assigned: "تنها برای چیزهایی که به من واگذار شده" + label_user_mail_option_only_owner: "تنها برای چیزهایی که من دارنده آن‌ها هستم" + label_user_mail_no_self_notified: "نمی‌خواهم از تغییراتی که خودم می‌دهم آگاه شوم" + label_registration_activation_by_email: فعالسازی حساب با ایمیل + label_registration_manual_activation: فعالسازی حساب دستی + label_registration_automatic_activation: فعالسازی حساب خودکار + label_display_per_page: "ردیف‌ها در هر برگه: %{value}" + label_age: سن + label_change_properties: ویرایش ویژگی‌ها + label_general: همگانی + label_more: بیشتر + label_scm: SCM + label_plugins: افزونه‌ها + label_ldap_authentication: شناساییLDAP + label_downloads_abbr: دریافت + label_optional_description: توضیح اختیاری + label_add_another_file: افزودن پرونده دیگر + label_preferences: پسندها + label_chronological_order: به ترتیب تاریخ + label_reverse_chronological_order: برعکس ترتیب تاریخ + label_planning: برنامه ریزی + label_incoming_emails: ایمیل‌های آمده + label_generate_key: ساخت کلید + label_issue_watchers: دیده‌بان‌ها + label_example: نمونه + label_display: نمایش + label_sort: جور کرد + label_ascending: افزایشی + label_descending: کاهشی + label_date_from_to: از %{start} تا %{end} + label_wiki_content_added: برگه ویکی افزوده شد + label_wiki_content_updated: برگه ویکی بروز شد + label_group: دسته + label_group_plural: دسته + label_group_new: دسته تازه + label_time_entry_plural: زمان گذاشته شده + label_version_sharing_none: بدون اشتراک + label_version_sharing_descendants: با زیر پروژه‌ها + label_version_sharing_hierarchy: با رشته پروژه‌ها + label_version_sharing_tree: با درخت پروژه + label_version_sharing_system: با همه پروژه‌ها + label_update_issue_done_ratios: بروز رسانی اندازه انجام شده پیامد + label_copy_source: منبع + label_copy_target: مقصد + label_copy_same_as_target: مانند مقصد + label_display_used_statuses_only: تنها وضعیت‌هایی نشان داده شوند که در این پیگرد به کار رفته‌اند + label_api_access_key: کلید دسترسی API + label_missing_api_access_key: کلید دسترسی API در دسترس نیست + label_api_access_key_created_on: "کلید دسترسی API %{value} پیش ساخته شده است" + label_profile: نمایه + label_subtask_plural: زیرکار + label_project_copy_notifications: در هنگام رونویسی پروژه ایمیل‌های آگاه‌سازی را بفرست + label_principal_search: "جستجو برای کاربر یا دسته:" + label_user_search: "جستجو برای کاربر:" + + button_login: ورود + button_submit: واگذاری + button_save: نگهداری + button_check_all: گزینش همه + button_uncheck_all: گزینش هیچ + button_delete: پاک + button_create: ساخت + button_create_and_continue: ساخت و ادامه + button_test: آزمایش + button_edit: ویرایش + button_edit_associated_wikipage: "ویرایش برگه ویکی وابسته: %{page_title}" + button_add: افزودن + button_change: ویرایش + button_apply: انجام + button_clear: پاک + button_lock: گذاشتن قفل + button_unlock: برداشتن قفل + button_download: دریافت + button_list: فهرست + button_view: دیدن + button_move: جابجایی + button_move_and_follow: جابجایی و ادامه + button_back: برگشت + button_cancel: بازگشت + button_activate: فعالسازی + button_sort: جور کرد + button_log_time: زمان‌نویسی + button_rollback: برگرد به این نگارش + button_watch: دیده‌بانی + button_unwatch: نا‌دیده‌بانی + button_reply: پاسخ + button_archive: بایگانی + button_unarchive: برگشت از بایگانی + button_reset: بازنشانی + button_rename: نامگذاری + button_change_password: جایگزینی گذرواژه + button_copy: رونوشت + button_copy_and_follow: رونوشت و ادامه + button_annotate: یادداشت + button_update: بروز رسانی + button_configure: پیکربندی + button_quote: نقل قول + button_duplicate: نگارش دیگر + button_show: نمایش + + status_active: فعال + status_registered: نام‌نویسی شده + status_locked: قفل + + version_status_open: باز + version_status_locked: قفل + version_status_closed: بسته + + field_active: فعال + + text_select_mail_notifications: فرمان‌هایی که برای آن‌ها باید ایمیل فرستاده شود را برگزینید. + text_regexp_info: برای نمونه ^[A-Z0-9]+$ + text_min_max_length_info: 0 یعنی بدون کران + text_project_destroy_confirmation: آیا براستی می‌خواهید این پروژه و همه داده‌های آن را پاک کنید؟ + text_subprojects_destroy_warning: "زیرپروژه‌های آن: %{value} هم پاک خواهند شد." + text_workflow_edit: یک نقش و یک پیگرد را برای ویرایش گردش کار برگزینید + text_are_you_sure: آیا این کار انجام شود؟ + text_are_you_sure_with_children: "آیا پیامد و همه زیرپیامدهای آن پاک شوند؟" + text_journal_changed: "«%{label}» از «%{old}» به «%{new}» جایگزین شد" + text_journal_set_to: "«%{label}» به «%{value}» نشانده شد" + text_journal_deleted: "«%{label}» پاک شد (%{old})" + text_journal_added: "«%{label}»، «%{value}» را افزود" + text_tip_task_begin_day: روز آغاز پیامد + text_tip_task_end_day: روز پایان پیامد + text_tip_task_begin_end_day: روز آغاز و پایان پیامد + text_project_identifier_info: 'تنها نویسه‌های کوچک (a-z)، شماره‌ها و خط تیره پذیرفتنی است.
پس از ذخیره سازی، شناسه نمی‌تواند جایگزین شود.' + text_caracters_maximum: "بیشترین اندازه %{count} است." + text_caracters_minimum: "کمترین اندازه %{count} است." + text_length_between: "باید میان %{min} و %{max} نویسه باشد." + text_tracker_no_workflow: هیچ گردش کاری برای این پیگرد مشخص نشده است + text_unallowed_characters: نویسه‌های ناپسند + text_comma_separated: چند مقدار پذیرفتنی است (با «,» از هم جدا شوند). + text_line_separated: چند مقدار پذیرفتنی است (هر مقدار در یک خط). + text_issues_ref_in_commit_messages: نشانه روی و بستن پیامدها در پیام‌های انباره + text_issue_added: "پیامد %{id} به دست %{author} گزارش شد." + text_issue_updated: "پیامد %{id} به دست %{author} بروز شد." + text_wiki_destroy_confirmation: آیا براستی می‌خواهید این ویکی و همه محتوای آن را پاک کنید؟ + text_issue_category_destroy_question: "برخی پیامدها (%{count}) به این دسته واگذار شده‌اند. می‌خواهید چه کنید؟" + text_issue_category_destroy_assignments: پاک کردن واگذاری به دسته + text_issue_category_reassign_to: واگذاری دوباره پیامدها به این دسته + text_user_mail_option: "برای پروژه‌های گزینش نشده، تنها ایمیل‌هایی درباره چیزهایی که دیده‌بان یا درگیر آن‌ها هستید دریافت خواهید کرد (مانند پیامدهایی که نویسنده آن‌ها هستید یا به شما واگذار شده‌اند)." + text_no_configuration_data: "نقش‌ها، پیگردها، وضعیت‌های پیامد و گردش کار هنوز پیکربندی نشده‌اند. \nبه سختی پیشنهاد می‌شود که پیکربندی پیش‌گزیده را بار کنید. سپس می‌توانید آن را ویرایش کنید." + text_load_default_configuration: بارگذاری پیکربندی پیش‌گزیده + text_status_changed_by_changeset: "در تغییر %{value} بروز شده است." + text_time_logged_by_changeset: "در تغییر %{value} نوشته شده است." + text_issues_destroy_confirmation: 'آیا براستی می‌خواهید پیامدهای گزینش شده را پاک کنید؟' + text_select_project_modules: 'پیمانه‌هایی که باید برای این پروژه فعال شوند را برگزینید:' + text_default_administrator_account_changed: حساب سرپرستی پیش‌گزیده جایگزین شد + text_file_repository_writable: پوشه پیوست‌ها نوشتنی است + text_plugin_assets_writable: پوشه دارایی‌های افزونه‌ها نوشتنی است + text_rmagick_available: RMagick در دسترس است (اختیاری) + text_destroy_time_entries_question: "%{hours} ساعت روی پیامدهایی که می‌خواهید پاک کنید کار گزارش شده است. می‌خواهید چه کنید؟" + text_destroy_time_entries: ساعت‌های گزارش شده پاک شوند + text_assign_time_entries_to_project: ساعت‌های گزارش شده به پروژه واگذار شوند + text_reassign_time_entries: 'ساعت‌های گزارش شده به این پیامد واگذار شوند:' + text_user_wrote: "%{value} نوشت:" + text_enumeration_destroy_question: "%{count} داده به این برشمردنی وابسته شده‌اند." + text_enumeration_category_reassign_to: 'به این برشمردنی وابسته شوند:' + text_email_delivery_not_configured: "دریافت ایمیل پیکربندی نشده است و آگاه‌سازی‌ها غیر فعال هستند.\nکارگزار SMTP خود را در config/email.yml پیکربندی کنید و برنامه را بازنشانی کنید تا فعال شوند." + text_repository_usernames_mapping: "کاربر Redmine که به هر نام کاربری پیام‌های انباره نگاشت می‌شود را برگزینید.\nکاربرانی که نام کاربری یا ایمیل همسان دارند، خود به خود نگاشت می‌شوند." + text_diff_truncated: '... این تفاوت بریده شده چون بیشتر از بیشترین اندازه نمایش دادنی است.' + text_custom_field_possible_values_info: 'یک خط برای هر مقدار' + text_wiki_page_destroy_question: "این برگه %{descendants} زیربرگه دارد.می‌خواهید چه کنید؟" + text_wiki_page_nullify_children: "زیربرگه‌ها برگه ریشه شوند" + text_wiki_page_destroy_children: "زیربرگه‌ها و زیربرگه‌های آن‌ها پاک شوند" + text_wiki_page_reassign_children: "زیربرگه‌ها به زیر این برگه پدر بروند" + text_own_membership_delete_confirmation: "شما دارید برخی یا همه پروانه‌های خود را برمی‌دارید و شاید پس از این دیگر نتوانید این پروژه را ویرایش کنید.\nآیا می‌خواهید این کار را بکنید؟" + text_zoom_in: درشتنمایی + text_zoom_out: ریزنمایی + + default_role_manager: سرپرست + default_role_developer: برنامه‌نویس + default_role_reporter: گزارش‌دهنده + default_tracker_bug: ایراد + default_tracker_feature: ویژگی + default_tracker_support: پشتیبانی + default_issue_status_new: تازه + default_issue_status_in_progress: در گردش + default_issue_status_resolved: درست شده + default_issue_status_feedback: بازخورد + default_issue_status_closed: بسته + default_issue_status_rejected: برگشت خورده + default_doc_category_user: نوشتار کاربر + default_doc_category_tech: نوشتار فنی + default_priority_low: پایین + default_priority_normal: میانه + default_priority_high: بالا + default_priority_urgent: زود + default_priority_immediate: بیدرنگ + default_activity_design: طراحی + default_activity_development: ساخت + + enumeration_issue_priorities: برتری‌های پیامد + enumeration_doc_categories: دسته‌های نوشتار + enumeration_activities: فعالیت‌ها (پیگیری زمان) + enumeration_system_activity: فعالیت سامانه + + text_tip_issue_begin_day: issue beginning this day + field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text + text_tip_issue_begin_end_day: issue beginning and ending this day + text_tip_issue_end_day: issue ending this day + text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page. + label_my_queries: My custom queries + label_cvs_module: Module + label_filesystem_path: Root directory + label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee + label_darcs_path: Root directory + text_journal_changed_no_detail: "%{label} updated" + button_expand_all: Expand all + button_collapse_all: Collapse all + label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author + label_news_comment_added: Comment added to a news + label_bazaar_path: Root directory + label_cvs_path: CVSROOT + label_git_path: Path to .git directory + default_role_anonymous: Anonymous + text_powered_by: Powered by %{link} + default_role_non_member: Non member + label_mercurial_path: Root directory + text_default_encoding: "Default: UTF-8" + text_git_repo_example: a bare and local repository (e.g. /gitrepo, c:\gitrepo) + label_notify_member_plural: Email issue updates + label_path_encoding: Path encoding + text_mercurial_repo_example: local repository (e.g. /hgrepo, c:\hgrepo) diff --git a/config/locales/fi.yml b/config/locales/fi.yml index 628416f2..23794779 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -1,4 +1,4 @@ -# Finnish translations for Ruby on Rails +# Finnish translations for Ruby on Rails # by Marko Seppä (marko.seppa@gmail.com) fi: @@ -8,12 +8,15 @@ fi: default: "%e. %Bta %Y" long: "%A%e. %Bta %Y" short: "%e.%m.%Y" - + day_names: [Sunnuntai, Maanantai, Tiistai, Keskiviikko, Torstai, Perjantai, Lauantai] abbr_day_names: [Su, Ma, Ti, Ke, To, Pe, La] month_names: [~, Tammikuu, Helmikuu, Maaliskuu, Huhtikuu, Toukokuu, Kesäkuu, Heinäkuu, Elokuu, Syyskuu, Lokakuu, Marraskuu, Joulukuu] abbr_month_names: [~, Tammi, Helmi, Maalis, Huhti, Touko, Kesä, Heinä, Elo, Syys, Loka, Marras, Joulu] - order: [:day, :month, :year] + order: + - :day + - :month + - :year time: formats: @@ -37,7 +40,7 @@ fi: separator: "," delimiter: "." precision: 3 - + currency: format: format: "%n %u" @@ -45,19 +48,19 @@ fi: separator: "," delimiter: "." precision: 2 - + percentage: format: # separator: delimiter: "" - # precision: + # precision: precision: format: # separator: delimiter: "" # precision: - + human: format: delimiter: "" @@ -72,7 +75,7 @@ fi: mb: "MB" gb: "GB" tb: "TB" - + datetime: distance_in_words: half_a_minute: "puoli minuuttia" @@ -116,7 +119,7 @@ fi: hour: "Tunti" minute: "Minuutti" second: "Sekuntia" - + activerecord: errors: template: @@ -148,9 +151,9 @@ fi: not_same_project: "ei kuulu samaan projektiin" circular_dependency: "Tämä suhde loisi kehän." cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks" - + actionview_instancetag_blank_option: Valitse, ole hyvä - + general_text_No: 'Ei' general_text_Yes: 'Kyllä' general_text_no: 'ei' @@ -161,7 +164,7 @@ fi: general_csv_encoding: ISO-8859-15 general_pdf_encoding: ISO-8859-15 general_first_day_of_week: '1' - + notice_account_updated: Tilin päivitys onnistui. notice_account_invalid_creditentials: Virheellinen käyttäjätunnus tai salasana notice_account_password_updated: Salasanan päivitys onnistui. @@ -185,11 +188,11 @@ fi: notice_no_issue_selected: "Tapahtumia ei ole valittu! Valitse tapahtumat joita haluat muokata." notice_account_pending: "Tilisi on luotu ja odottaa ylläpitäjän hyväksyntää." notice_default_data_loaded: Vakioasetusten palautus onnistui. - + error_can_t_load_default_data: "Vakioasetuksia ei voitu ladata: %{value}" error_scm_not_found: "Syötettä ja/tai versiota ei löydy tietovarastosta." error_scm_command_failed: "Tietovarastoon pääsyssä tapahtui virhe: %{value}" - + mail_subject_lost_password: "Sinun %{value} salasanasi" mail_body_lost_password: 'Vaihtaaksesi salasanasi, napsauta seuraavaa linkkiä:' mail_subject_register: "%{value} tilin aktivointi" @@ -198,10 +201,10 @@ fi: mail_body_account_information: Sinun tilin tiedot mail_subject_account_activation_request: "%{value} tilin aktivointi pyyntö" mail_body_account_activation_request: "Uusi käyttäjä (%{value}) on rekisteröitynyt. Hänen tili odottaa hyväksyntääsi:" - + gui_validation_error: 1 virhe gui_validation_error_plural: "%{count} virhettä" - + field_name: Nimi field_description: Kuvaus field_summary: Yhteenveto @@ -247,7 +250,6 @@ fi: field_admin: Ylläpitäjä field_last_login_on: Viimeinen yhteys field_language: Kieli - field_effective_date: Päivä field_password: Salasana field_new_password: Uusi salasana field_password_confirmation: Vahvistus @@ -263,7 +265,7 @@ fi: field_attr_mail: Sähköpostinmääre field_onthefly: Automaattinen käyttäjien luonti field_start_date: Alku - field_done_ratio: % Tehty + field_done_ratio: "% Tehty" field_auth_source: Varmennusmuoto field_hide_mail: Piiloita sähköpostiosoitteeni field_comments: Kommentti @@ -284,7 +286,7 @@ fi: field_time_zone: Aikavyöhyke field_searchable: Haettava field_default_value: Vakioarvo - + setting_app_title: Ohjelman otsikko setting_app_subtitle: Ohjelman alaotsikko setting_welcome_text: Tervehdysteksti @@ -312,7 +314,7 @@ fi: setting_emails_footer: Sähköpostin alatunniste setting_protocol: Protokolla setting_per_page_options: Sivun objektien määrän asetukset - + label_user: Käyttäjä label_user_plural: Käyttäjät label_user_new: Uusi käyttäjä @@ -587,7 +589,7 @@ fi: label_age: Ikä label_change_properties: Vaihda asetuksia label_general: Yleinen - + button_login: Kirjaudu button_submit: Lähetä button_save: Tallenna @@ -624,11 +626,11 @@ fi: button_copy: Kopioi button_annotate: Lisää selitys button_update: Päivitä - + status_active: aktiivinen status_registered: rekisteröity status_locked: lukittu - + text_select_mail_notifications: Valitse tapahtumat joista tulisi lähettää sähköpostimuistutus. text_regexp_info: esim. ^[A-Z0-9]+$ text_min_max_length_info: 0 tarkoittaa, ei rajoitusta @@ -655,7 +657,7 @@ fi: text_user_mail_option: "Valitsemattomille projekteille, saat vain muistutuksen asioista joita seuraat tai olet mukana (esim. tapahtumat joissa olet tekijä tai nimettynä)." text_no_configuration_data: "Rooleja, tapahtumien tiloja ja työnkulkua ei vielä olla määritelty.\nOn erittäin suotavaa ladata vakioasetukset. Voit muuttaa sitä latauksen jälkeen." text_load_default_configuration: Lataa vakioasetukset - + default_role_manager: Päälikkö default_role_developer: Kehittäjä default_role_reporter: Tarkastelija @@ -679,7 +681,7 @@ fi: default_priority_immediate: Valitön default_activity_design: Suunnittelu default_activity_development: Kehitys - + enumeration_issue_priorities: Tapahtuman tärkeysjärjestys enumeration_doc_categories: Dokumentin luokat enumeration_activities: Historia (ajan seuranta) @@ -967,3 +969,18 @@ fi: label_cvs_path: CVSROOT label_git_path: Path to .git directory label_mercurial_path: Root directory + label_my_queries: My custom queries + label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee + text_journal_changed_no_detail: "%{label} updated" + button_expand_all: Expand all + button_collapse_all: Collapse all + label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author + field_effective_date: Due date + label_news_comment_added: Comment added to a news + field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text + text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page. + text_default_encoding: "Default: UTF-8" + text_git_repo_example: a bare and local repository (e.g. /gitrepo, c:\gitrepo) + label_notify_member_plural: Email issue updates + label_path_encoding: Path encoding + text_mercurial_repo_example: local repository (e.g. /hgrepo, c:\hgrepo) diff --git a/config/locales/fr.yml b/config/locales/fr.yml index b9fd3982..92e3a48b 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -1,4 +1,4 @@ -# French translations for Ruby on Rails +# French translations for Ruby on Rails # by Christian Lescuyer (christian@flyingcoders.com) # contributor: Sebastien Grosjean - ZenCocoon.com # contributor: Thibaut Cuvelier - Developpez.com @@ -17,8 +17,11 @@ fr: abbr_day_names: [dim, lun, mar, mer, jeu, ven, sam] month_names: [~, janvier, février, mars, avril, mai, juin, juillet, août, septembre, octobre, novembre, décembre] abbr_month_names: [~, jan., fév., mar., avr., mai, juin, juil., août, sept., oct., nov., déc.] - order: [ :day, :month, :year ] - + order: + - :day + - :month + - :year + time: formats: default: "%d/%m/%Y %H:%M" @@ -75,7 +78,7 @@ fr: hour: "Heure" minute: "Minute" second: "Seconde" - + number: format: precision: 3 @@ -99,7 +102,7 @@ fr: mb: "Mo" gb: "Go" tb: "To" - + support: array: sentence_connector: 'et' @@ -107,11 +110,11 @@ fr: word_connector: ", " two_words_connector: " et " last_word_connector: " et " - + activerecord: errors: template: - header: + header: one: "Impossible d'enregistrer %{model} : une erreur" other: "Impossible d'enregistrer %{model} : %{count} erreurs." body: "Veuillez vérifier les champs suivants :" @@ -142,7 +145,7 @@ fr: cant_link_an_issue_with_a_descendant: "Une demande ne peut pas être liée à l'une de ses sous-tâches" actionview_instancetag_blank_option: Choisir - + general_text_No: 'Non' general_text_Yes: 'Oui' general_text_no: 'non' @@ -153,7 +156,7 @@ fr: general_csv_encoding: ISO-8859-1 general_pdf_encoding: ISO-8859-1 general_first_day_of_week: '1' - + notice_account_updated: Le compte a été mis à jour avec succès. notice_account_invalid_creditentials: Identifiant ou mot de passe invalide. notice_account_password_updated: Mot de passe mis à jour avec succès. @@ -182,7 +185,7 @@ fr: notice_issue_done_ratios_updated: L'avancement des demandes a été mis à jour. notice_api_access_key_reseted: Votre clé d'accès API a été réinitialisée. notice_gantt_chart_truncated: "Le diagramme a été tronqué car il excède le nombre maximal d'éléments pouvant être affichés (%{max})" - + error_can_t_load_default_data: "Une erreur s'est produite lors du chargement du paramétrage : %{value}" error_scm_not_found: "L'entrée et/ou la révision demandée n'existe pas dans le dépôt." error_scm_command_failed: "Une erreur s'est produite lors de l'accès au dépôt : %{value}" @@ -193,9 +196,9 @@ fr: error_workflow_copy_source: 'Veuillez sélectionner un tracker et/ou un rôle source' error_workflow_copy_target: 'Veuillez sélectionner les trackers et rôles cibles' error_issue_done_ratios_not_updated: L'avancement des demandes n'a pas pu être mis à jour. - + warning_attachments_not_saved: "%{count} fichier(s) n'ont pas pu être sauvegardés." - + mail_subject_lost_password: "Votre mot de passe %{value}" mail_body_lost_password: 'Pour changer votre mot de passe, cliquez sur le lien suivant :' mail_subject_register: "Activation de votre compte %{value}" @@ -210,10 +213,10 @@ fr: mail_body_wiki_content_added: "La page wiki '%{id}' a été ajoutée par %{author}." mail_subject_wiki_content_updated: "Page wiki '%{id}' mise à jour" mail_body_wiki_content_updated: "La page wiki '%{id}' a été mise à jour par %{author}." - + gui_validation_error: 1 erreur gui_validation_error_plural: "%{count} erreurs" - + field_name: Nom field_description: Description field_summary: Résumé @@ -259,7 +262,6 @@ fr: field_admin: Administrateur field_last_login_on: "Dernière connexion " field_language: Langue - field_effective_date: Date field_password: Mot de passe field_new_password: Nouveau mot de passe field_password_confirmation: Confirmation @@ -275,7 +277,7 @@ fr: field_attr_mail: Attribut Email field_onthefly: Création des utilisateurs à la volée field_start_date: Début - field_done_ratio: % réalisé + field_done_ratio: "% réalisé" field_auth_source: Mode d'authentification field_hide_mail: Cacher mon adresse mail field_comments: Commentaire @@ -307,7 +309,8 @@ fr: field_active: Actif field_parent_issue: Tâche parente field_visible: Visible - + field_warn_on_leaving_unsaved: "M'avertir lorsque je quitte une page contenant du texte non sauvegardé" + setting_app_title: Titre de l'application setting_app_subtitle: Sous-titre de l'application setting_welcome_text: Texte d'accueil @@ -364,7 +367,7 @@ fr: setting_commit_logtime_enabled: Permettre la saisie de temps setting_commit_logtime_activity_id: Activité pour le temps saisi setting_gantt_items_limit: Nombre maximum d'éléments affichés sur le gantt - + permission_add_project: Créer un projet permission_add_subprojects: Créer des sous-projets permission_edit_project: Modifier le projet @@ -420,7 +423,7 @@ fr: permission_export_wiki_pages: Exporter les pages permission_manage_project_activities: Gérer les activités permission_manage_subtasks: Gérer les sous-tâches - + project_module_issue_tracking: Suivi des demandes project_module_time_tracking: Suivi du temps passé project_module_news: Publication d'annonces @@ -429,7 +432,7 @@ fr: project_module_wiki: Wiki project_module_repository: Dépôt de sources project_module_boards: Forums de discussion - + label_user: Utilisateur label_user_plural: Utilisateurs label_user_new: Nouvel utilisateur @@ -539,6 +542,7 @@ fr: label_news_latest: Dernières annonces label_news_view_all: Voir toutes les annonces label_news_added: Annonce ajoutée + label_news_comment_added: Commentaire ajouté à une annonce label_settings: Configuration label_overview: Aperçu label_version: Version @@ -596,6 +600,7 @@ fr: label_query: Rapport personnalisé label_query_plural: Rapports personnalisés label_query_new: Nouveau rapport + label_my_queries: Mes rapports personnalisés label_filter_add: "Ajouter le filtre " label_filter_plural: Filtres label_equals: égal @@ -784,12 +789,16 @@ fr: label_project_copy_notifications: Envoyer les notifications durant la copie du projet label_principal_search: "Rechercher un utilisateur ou un groupe :" label_user_search: "Rechercher un utilisateur :" - + label_additional_workflow_transitions_for_author: Autorisations supplémentaires lorsque l'utilisateur a créé la demande + label_additional_workflow_transitions_for_assignee: Autorisations supplémentaires lorsque la demande est assignée à l'utilisateur + button_login: Connexion button_submit: Soumettre button_save: Sauvegarder button_check_all: Tout cocher button_uncheck_all: Tout décocher + button_collapse_all: Plier tout + button_expand_all: Déplier tout button_delete: Supprimer button_create: Créer button_create_and_continue: Créer et continuer @@ -828,15 +837,15 @@ fr: button_quote: Citer button_duplicate: Dupliquer button_show: Afficher - + status_active: actif status_registered: enregistré status_locked: verrouillé - + version_status_open: ouvert version_status_locked: verrouillé version_status_closed: fermé - + text_select_mail_notifications: Actions pour lesquelles une notification par e-mail est envoyée text_regexp_info: ex. ^[A-Z0-9]+$ text_min_max_length_info: 0 pour aucune restriction @@ -889,7 +898,8 @@ fr: text_wiki_page_destroy_children: "Supprimer les sous-pages et toutes leurs descedantes" text_wiki_page_reassign_children: "Réaffecter les sous-pages à cette page" text_own_membership_delete_confirmation: "Vous allez supprimer tout ou partie de vos permissions sur ce projet et ne serez peut-être plus autorisé à modifier ce projet.\nEtes-vous sûr de vouloir continuer ?" - + text_warn_on_leaving_unsaved: "Cette page contient du texte non sauvegardé qui sera perdu si vous quittez la page." + default_role_manager: "Manager " default_role_developer: "Développeur " default_role_reporter: "Rapporteur " @@ -913,7 +923,7 @@ fr: default_priority_immediate: Immédiat default_activity_design: Conception default_activity_development: Développement - + enumeration_issue_priorities: Priorités des demandes enumeration_doc_categories: Catégories des documents enumeration_activities: Activités (suivi du temps) @@ -925,6 +935,7 @@ fr: error_no_tracker_in_project: "Aucun tracker n'est associé à ce projet. Vérifier la configuration du projet." error_no_default_issue_status: "Aucun statut de demande n'est défini par défaut. Vérifier votre configuration (Administration -> Statuts de demandes)." text_journal_changed: "%{label} changé de %{old} à %{new}" + text_journal_changed_no_detail: "%{label} mis à jour" text_journal_set_to: "%{label} mis à %{value}" text_journal_deleted: "%{label} %{old} supprimé" text_journal_added: "%{label} %{value} ajouté" @@ -955,7 +966,7 @@ fr: label_user_mail_option_none: Aucune notification field_member_of_group: Groupe de l'assigné field_assigned_to_role: Rôle de l'assigné - setting_emails_header: Emails header + setting_emails_header: En-tête des emails text_powered_by: Powered by %{link} label_cvs_module: Module label_filesystem_path: Root directory @@ -964,3 +975,9 @@ fr: label_cvs_path: CVSROOT label_git_path: Path to .git directory label_mercurial_path: Root directory + field_effective_date: Due date + text_default_encoding: "Default: UTF-8" + text_git_repo_example: a bare and local repository (e.g. /gitrepo, c:\gitrepo) + label_notify_member_plural: Email issue updates + label_path_encoding: Path encoding + text_mercurial_repo_example: local repository (e.g. /hgrepo, c:\hgrepo) diff --git a/config/locales/gl.yml b/config/locales/gl.yml index 827d32af..0fd38bb9 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -4,34 +4,34 @@ gl: number: format: - separator: "," - delimiter: "." + separator: "," + delimiter: "." precision: 3 currency: format: - format: "%n %u" - unit: "€" - separator: "," - delimiter: "." + format: "%n %u" + unit: "€" + separator: "," + delimiter: "." precision: 2 percentage: format: - # separator: - delimiter: "" - # precision: + # separator: + delimiter: "" + # precision: precision: format: # separator: - delimiter: "" + delimiter: "" # precision: human: format: - # separator: - delimiter: "" + # separator: + delimiter: "" precision: 1 storage_units: format: "%n %u" @@ -43,8 +43,8 @@ gl: mb: "MB" gb: "GB" tb: "TB" - - + + direction: ltr date: formats: @@ -55,7 +55,10 @@ gl: abbr_day_names: [Dom, Lun, Mar, Mer, Xov, Ven, Sab] month_names: [~, Xaneiro, Febreiro, Marzo, Abril, Maio, Xunio, Xullo, Agosto, Setembro, Outubro, Novembro, Decembro] abbr_month_names: [~, Xan, Feb, Maz, Abr, Mai, Xun, Xul, Ago, Set, Out, Nov, Dec] - order: [:day, :month, :year] + order: + - :day + - :month + - :year time: formats: @@ -63,10 +66,10 @@ gl: time: "%H:%M hs" short: "%e/%m, %H:%M hs" long: "%A %e de %B de %Y ás %H:%M horas" - + am: '' pm: '' - + datetime: distance_in_words: half_a_minute: 'medio minuto' @@ -113,7 +116,7 @@ gl: today: 'hoxe' tomorrow: 'mañá' in: 'dentro de' - + support: array: sentence_connector: e @@ -153,7 +156,7 @@ gl: cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks" actionview_instancetag_blank_option: Por favor seleccione - + button_activate: Activar button_add: Engadir button_annotate: Anotar @@ -243,10 +246,9 @@ gl: field_default_value: Estado por defecto field_delay: Retraso field_description: Descrición - field_done_ratio: % Realizado + field_done_ratio: "% Realizado" field_downloads: Descargas field_due_date: Data fin - field_effective_date: Data field_estimated_hours: Tempo estimado field_field_format: Formato field_filename: Arquivo @@ -958,3 +960,18 @@ gl: label_cvs_path: CVSROOT label_git_path: Path to .git directory label_mercurial_path: Root directory + label_my_queries: My custom queries + label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee + text_journal_changed_no_detail: "%{label} updated" + button_expand_all: Expand all + button_collapse_all: Collapse all + label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author + field_effective_date: Due date + label_news_comment_added: Comment added to a news + field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text + text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page. + text_default_encoding: "Default: UTF-8" + text_git_repo_example: a bare and local repository (e.g. /gitrepo, c:\gitrepo) + label_notify_member_plural: Email issue updates + label_path_encoding: Path encoding + text_mercurial_repo_example: local repository (e.g. /hgrepo, c:\hgrepo) diff --git a/config/locales/he.yml b/config/locales/he.yml index 6b259570..17ef662a 100644 --- a/config/locales/he.yml +++ b/config/locales/he.yml @@ -15,7 +15,10 @@ he: abbr_day_names: ["א'", "ב'", "ג'", "ד'", "ה'", "ו'", "ש'"] month_names: [~, ינואר, פברואר, מרץ, אפריל, מאי, יוני, יולי, אוגוסט, ספטמבר, אוקטובר, נובמבר, דצמבר] abbr_month_names: [~, יאנ, פבר, מרץ, אפר, מאי, יונ, יול, אוג, ספט, אוק, נוב, דצמ] - order: [ :day, :month, :year ] + order: + - :day + - :month + - :year time: formats: @@ -163,7 +166,7 @@ he: notice_email_error: "ארעה שגיאה בעת שליחת הדואל (%{value})" notice_feeds_access_key_reseted: מפתח ה־RSS שלך אופס. notice_api_access_key_reseted: מפתח הגישה שלך ל־API אופס. - notice_failed_to_save_issues: "נכשרת בשמירת %{count} נושא\ים ב %{total} נבחרו: %{ids}." + notice_failed_to_save_issues: "נכשרת בשמירת %{count} נושאים ב %{total} נבחרו: %{ids}." notice_failed_to_save_members: "כשלון בשמירת חבר(ים): %{errors}." notice_no_issue_selected: "לא נבחר אף נושא! בחר בבקשה את הנושאים שברצונך לערוך." notice_account_pending: "החשבון שלך נוצר ועתה מחכה לאישור מנהל המערכת." @@ -255,7 +258,6 @@ he: field_admin: ניהול field_last_login_on: התחברות אחרונה field_language: שפה - field_effective_date: תאריך field_password: סיסמה field_new_password: סיסמה חדשה field_password_confirmation: אישור @@ -271,7 +273,7 @@ he: field_attr_mail: תכונת דוא"ל field_onthefly: יצירת משתמשים זריזה field_start_date: תאריך התחלה - field_done_ratio: % גמור + field_done_ratio: "% גמור" field_auth_source: מקור הזדהות field_hide_mail: החבא את כתובת הדוא"ל שלי field_comments: הערות @@ -846,7 +848,7 @@ he: text_regexp_info: כגון. ^[A-Z0-9]+$ text_min_max_length_info: 0 משמעו ללא הגבלות text_project_destroy_confirmation: האם אתה בטוח שברצונך למחוק את הפרויקט ואת כל המידע הקשור אליו? - text_subprojects_destroy_warning: "תת־הפרויקט\ים: %{value} ימחקו גם כן." + text_subprojects_destroy_warning: "תת־הפרויקטים: %{value} ימחקו גם כן." text_workflow_edit: בחר תפקיד וסיווג כדי לערוך את זרימת העבודה text_are_you_sure: האם אתה בטוח? text_are_you_sure_with_children: האם למחוק את הנושא ואת כל בניו? @@ -876,7 +878,7 @@ he: text_no_configuration_data: "לא הוגדרה תצורה עבור תפקידים, סיווגים, מצבי נושא וזרימת עבודה.\nמומלץ מאד לטעון את תצורת ברירת המחדל. תוכל לשנותה מאוחר יותר." text_load_default_configuration: טען את אפשרויות ברירת המחדל text_status_changed_by_changeset: "הוחל בסדרת השינויים %{value}." - text_issues_destroy_confirmation: 'האם אתה בטוח שברצונך למחוק את הנושא\ים?' + text_issues_destroy_confirmation: 'האם אתה בטוח שברצונך למחוק את הנושאים?' text_select_project_modules: 'בחר מודולים להחיל על פרויקט זה:' text_default_administrator_account_changed: מנהל המערכת ברירת המחדל שונה text_file_repository_writable: מאגר הקבצים ניתן לכתיבה @@ -951,3 +953,18 @@ he: label_cvs_path: CVSROOT label_git_path: Path to .git directory label_mercurial_path: Root directory + label_my_queries: My custom queries + label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee + text_journal_changed_no_detail: "%{label} updated" + button_expand_all: Expand all + button_collapse_all: Collapse all + label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author + field_effective_date: Due date + label_news_comment_added: Comment added to a news + field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text + text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page. + text_default_encoding: "Default: UTF-8" + text_git_repo_example: a bare and local repository (e.g. /gitrepo, c:\gitrepo) + label_notify_member_plural: Email issue updates + label_path_encoding: Path encoding + text_mercurial_repo_example: local repository (e.g. /hgrepo, c:\hgrepo) diff --git a/config/locales/hr.yml b/config/locales/hr.yml index cfae5edd..8c55fdf7 100644 --- a/config/locales/hr.yml +++ b/config/locales/hr.yml @@ -1,4 +1,4 @@ -# Croatian translations for Ruby on Rails +# Croatian translations for Ruby on Rails # by Helix d.o.o. (info@helix.hr) hr: @@ -11,15 +11,18 @@ hr: default: "%m/%d/%Y" short: "%b %d" long: "%B %d, %Y" - + day_names: [Ponedjeljak, Utorak, Srijeda, Četvrtak, Petak, Subota, Nedjelja] abbr_day_names: [Ned, Pon, Uto, Sri, Čet, Pet, Sub] - + # Don't forget the nil at the beginning; there's no such thing as a 0th month month_names: [~, Sijecanj, Veljaca, Ožujak, Travanj, Svibanj, Lipanj, Srpanj, Kolovoz, Rujan, Listopad, Studeni, Prosinac] abbr_month_names: [~, Sij, Velj, Ožu, Tra, Svi, Lip, Srp, Kol, Ruj, List, Stu, Pro] # Used in date_select and datime_select. - order: [ :year, :month, :day ] + order: + - :year + - :month + - :day time: formats: @@ -29,7 +32,7 @@ hr: long: "%B %d, %Y %H:%M" am: "am" pm: "pm" - + datetime: distance_in_words: half_a_minute: "pola minute" @@ -83,14 +86,14 @@ hr: mb: "MB" gb: "GB" tb: "TB" - - + + # Used in array.to_sentence. support: array: sentence_connector: "i" skip_last_comma: false - + activerecord: errors: template: @@ -124,7 +127,7 @@ hr: cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks" actionview_instancetag_blank_option: Molimo odaberite - + general_text_No: 'Ne' general_text_Yes: 'Da' general_text_no: 'ne' @@ -135,7 +138,7 @@ hr: general_csv_encoding: utf8 general_pdf_encoding: utf8 general_first_day_of_week: '7' - + notice_account_updated: Vaš profil je uspješno promijenjen. notice_account_invalid_creditentials: Neispravno korisničko ime ili zaporka. notice_account_password_updated: Zaporka je uspješno promijenjena. @@ -151,7 +154,7 @@ hr: notice_successful_connection: Uspješna veza. notice_file_not_found: Stranica kojoj ste pokušali pristupiti ne postoji ili je uklonjena. notice_locking_conflict: Podataci su ažurirani od strane drugog korisnika. - notice_not_authorized: Niste ovlašteni za pristup ovoj stranici. + notice_not_authorized: Niste ovlašteni za pristup ovoj stranici. notice_email_sent: E-mail je poslan %{value}" notice_email_error: Dogodila se pogreška tijekom slanja E-maila (%{value})" notice_feeds_access_key_reseted: Vaš RSS pristup je resetovan. @@ -162,7 +165,7 @@ hr: notice_default_data_loaded: Konfiguracija je uspješno učitana. notice_unable_delete_version: Nije moguće izbrisati verziju. notice_issue_done_ratios_updated: Issue done ratios updated. - + error_can_t_load_default_data: "Zadanu konfiguracija nije učitana: %{value}" error_scm_not_found: "Unos i/ili revizija nije pronađen." error_scm_command_failed: "Dogodila se pogreška prilikom pokušaja pristupa: %{value}" @@ -175,9 +178,9 @@ hr: error_issue_done_ratios_not_updated: "Issue done ratios not updated." error_workflow_copy_source: 'Please select a source tracker or role' error_workflow_copy_target: 'Please select target tracker(s) and role(s)' - + warning_attachments_not_saved: "%{count} Datoteka/e nije mogla biti spremljena." - + mail_subject_lost_password: "Vaša %{value} zaporka" mail_body_lost_password: 'Kako biste promijenili Vašu zaporku slijedite poveznicu:' mail_subject_register: "Aktivacija korisničog računa %{value}" @@ -192,10 +195,10 @@ hr: mail_body_wiki_content_added: "The '%{id}' wiki page has been added by %{author}." mail_subject_wiki_content_updated: "'%{id}' wiki page has been updated" mail_body_wiki_content_updated: "The '%{id}' wiki page has been updated by %{author}." - + gui_validation_error: 1 pogreška gui_validation_error_plural: "%{count} pogrešaka" - + field_name: Ime field_description: Opis field_summary: Sažetak @@ -242,7 +245,6 @@ hr: field_admin: Administrator field_last_login_on: Zadnja prijava field_language: Primarni jezik - field_effective_date: Datum field_password: Zaporka field_new_password: Nova zaporka field_password_confirmation: Potvrda zaporke @@ -258,7 +260,7 @@ hr: field_attr_mail: Atribut e-pošte field_onthefly: "Izrada korisnika \"u hodu\"" field_start_date: Pocetak - field_done_ratio: % Učinjeno + field_done_ratio: "% Učinjeno" field_auth_source: Vrsta prijavljivanja field_hide_mail: Sakrij moju adresu e-pošte field_comments: Komentar @@ -286,7 +288,7 @@ hr: field_identity_url: OpenID URL field_content: Content field_group_by: Group results by - + setting_app_title: Naziv aplikacije setting_app_subtitle: Podnaslov aplikacije setting_welcome_text: Tekst dobrodošlice @@ -333,37 +335,37 @@ hr: setting_openid: Allow OpenID login and registration setting_password_min_length: Minimum password length setting_new_project_user_role_id: Role given to a non-admin user who creates a project - setting_default_projects_modules: Default enabled modules for new projects + setting_default_projects_modules: Default enabled modules for new projects setting_issue_done_ratio: Calculate the issue done ratio with setting_issue_done_ratio_issue_field: Use the issue field setting_issue_done_ratio_issue_status: Use the issue status setting_start_of_week: Start calendars on setting_rest_api_enabled: Enable REST web service - + permission_add_project: Dodaj projekt - permission_add_subprojects: Dodaj potprojekt + permission_add_subprojects: Dodaj potprojekt permission_edit_project: Uredi projekt permission_select_project_modules: Odaberi projektne module permission_manage_members: Upravljaj članovima permission_manage_versions: Upravljaj verzijama permission_manage_categories: Upravljaj kategorijama predmeta permission_view_issues: Pregledaj zahtjeve - permission_add_issues: Dodaj predmete + permission_add_issues: Dodaj predmete permission_edit_issues: Uredi predmete permission_manage_issue_relations: Upravljaj relacijama predmeta - permission_add_issue_notes: Dodaj bilješke - permission_edit_issue_notes: Uredi bilješke + permission_add_issue_notes: Dodaj bilješke + permission_edit_issue_notes: Uredi bilješke permission_edit_own_issue_notes: Uredi vlastite bilješke - permission_move_issues: Premjesti predmete + permission_move_issues: Premjesti predmete permission_delete_issues: Brisanje predmeta permission_manage_public_queries: Upravljaj javnim upitima - permission_save_queries: Spremi upite + permission_save_queries: Spremi upite permission_view_gantt: Pregledaj gantt grafikon permission_view_calendar: Pregledaj kalendar permission_view_issue_watchers: Pregledaj listu promatraca permission_add_issue_watchers: Dodaj promatrača permission_delete_issue_watchers: Delete watchers - permission_log_time: Dnevnik utrošenog vremena + permission_log_time: Dnevnik utrošenog vremena permission_view_time_entries: Pregledaj utrošeno vrijeme permission_edit_time_entries: Uredi vremenske dnevnike permission_edit_own_time_entries: Edit own time logs @@ -389,10 +391,10 @@ hr: permission_view_messages: Pregledaj poruke permission_add_messages: Objavi poruke permission_edit_messages: Uredi poruke - permission_edit_own_messages: Uredi vlastite poruke + permission_edit_own_messages: Uredi vlastite poruke permission_delete_messages: Obriši poruke permission_delete_own_messages: Obriši vlastite poruke - + project_module_issue_tracking: Praćenje predmeta project_module_time_tracking: Praćenje vremena project_module_news: Novosti @@ -401,7 +403,7 @@ hr: project_module_wiki: Wiki project_module_repository: Skladište project_module_boards: Boards - + label_user: Korisnik label_user_plural: Korisnici label_user_new: Novi korisnik @@ -542,7 +544,7 @@ hr: label_nobody: nitko label_next: Naredni label_previous: Prethodni - label_used_by: Korišten od + label_used_by: Korišten od label_details: Detalji label_add_note: Dodaj napomenu label_per_page: Po stranici @@ -596,10 +598,10 @@ hr: label_modification: "%{count} promjena" label_modification_plural: "%{count} promjena" label_branch: Branch - label_tag: Tag + label_tag: Tag label_revision: Revizija label_revision_plural: Revizije - label_revision_id: "Revision %{value}" + label_revision_id: "Revision %{value}" label_associated_revisions: Dodijeljene revizije label_added: dodano label_modified: promijenjen @@ -678,7 +680,7 @@ hr: label_message_new: Nova poruka label_message_posted: Poruka dodana label_reply_plural: Odgovori - label_send_information: Pošalji korisniku informaciju o profilu + label_send_information: Pošalji korisniku informaciju o profilu label_year: Godina label_month: Mjesec label_week: Tjedan @@ -689,7 +691,7 @@ hr: label_send_test_email: Pošalji testno E-pismo label_feeds_access_key: RSS access key label_missing_feeds_access_key: Missing a RSS access key - label_feeds_access_key_created_on: "RSS kljuc za pristup je napravljen prije %{value}" + label_feeds_access_key_created_on: "RSS kljuc za pristup je napravljen prije %{value}" label_module_plural: Moduli label_added_time_by: "Promijenio %{author} prije %{age}" label_updated_time_by: "Dodao/la %{author} prije %{age}" @@ -752,7 +754,7 @@ hr: label_api_access_key: API access key label_missing_api_access_key: Missing an API access key label_api_access_key_created_on: "API access key created %{value} ago" - + button_login: Prijavi button_submit: Pošalji button_save: Spremi @@ -795,18 +797,18 @@ hr: button_configure: Konfiguracija button_quote: Navod button_duplicate: Duplicate - button_show: Show - + button_show: Show + status_active: aktivan status_registered: Registriran status_locked: zaključan - + version_status_open: open version_status_locked: locked version_status_closed: closed field_active: Active - + text_select_mail_notifications: Izbor akcija za koje će biti poslana obavijest e-poštom. text_regexp_info: eg. ^[A-Z0-9]+$ text_min_max_length_info: 0 znači bez ograničenja @@ -817,7 +819,7 @@ hr: text_journal_changed: "%{label} promijenjen iz %{old} u %{new}" text_journal_set_to: "%{label} postavi na %{value}" text_journal_deleted: "%{label} izbrisano (%{old})" - text_journal_added: "%{label} %{value} added" + text_journal_added: "%{label} %{value} added" text_tip_issue_begin_day: Zadaci koji počinju ovog dana text_tip_issue_end_day: zadaci koji se završavaju ovog dana text_tip_issue_begin_end_day: Zadaci koji počinju i završavaju se ovog dana @@ -838,7 +840,7 @@ hr: text_issue_category_destroy_assignments: Ukloni dodjeljivanje kategorija text_issue_category_reassign_to: Ponovo dodijeli predmete ovoj kategoriji text_user_mail_option: "Za neizabrane projekte, primit ćete obavjesti samo o stvarima koje pratite ili u kojima sudjelujete (npr. predmete koje ste vi napravili ili koje su vama dodjeljeni)." - text_no_configuration_data: "Roles, trackers, issue statuses and workflow have not been configured yet.\nIt is highly recommended to load the default configuration. You will be able to modify it once loaded." + text_no_configuration_data: "Roles, trackers, issue statuses and workflow have not been configured yet.\nIt is highly recommended to load the default configuration. You will be able to modify it once loaded." text_load_default_configuration: Učitaj početnu konfiguraciju text_status_changed_by_changeset: "Applied in changeset %{value}." text_issues_destroy_confirmation: 'Jeste li sigurni da želite obrisati izabrani/e predmet(e)?' @@ -887,7 +889,7 @@ hr: default_activity_development: Razvoj enumeration_issue_priorities: Prioriteti predmeta enumeration_doc_categories: Kategorija dokumenata - enumeration_activities: Aktivnosti (po vremenu) + enumeration_activities: Aktivnosti (po vremenu) enumeration_system_activity: System Activity field_sharing: Sharing text_line_separated: Multiple values allowed (one line for each value). @@ -953,3 +955,18 @@ hr: label_cvs_path: CVSROOT label_git_path: Path to .git directory label_mercurial_path: Root directory + label_my_queries: My custom queries + label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee + text_journal_changed_no_detail: "%{label} updated" + button_expand_all: Expand all + button_collapse_all: Collapse all + label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author + field_effective_date: Due date + label_news_comment_added: Comment added to a news + field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text + text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page. + text_default_encoding: "Default: UTF-8" + text_git_repo_example: a bare and local repository (e.g. /gitrepo, c:\gitrepo) + label_notify_member_plural: Email issue updates + label_path_encoding: Path encoding + text_mercurial_repo_example: local repository (e.g. /hgrepo, c:\hgrepo) diff --git a/config/locales/hu.yml b/config/locales/hu.yml index e0616a08..88421f95 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -1,4 +1,4 @@ -# Hungarian translations for Ruby on Rails +# Hungarian translations for Ruby on Rails # by Richard Abonyi (richard.abonyi@gmail.com) # thanks to KKata, replaced and #hup.hu # Cleaned up by László Bácsi (http://lackac.hu) @@ -16,7 +16,10 @@ abbr_day_names: [v., h., k., sze., cs., p., szo.] month_names: [~, január, február, március, április, május, június, július, augusztus, szeptember, október, november, december] abbr_month_names: [~, jan., febr., márc., ápr., máj., jún., júl., aug., szept., okt., nov., dec.] - order: [ :year, :month, :day ] + order: + - :year + - :month + - :day time: formats: @@ -146,7 +149,7 @@ cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks" actionview_instancetag_blank_option: Kérem válasszon - + general_text_No: 'Nem' general_text_Yes: 'Igen' general_text_no: 'nem' @@ -157,7 +160,7 @@ general_csv_encoding: ISO-8859-2 general_pdf_encoding: ISO-8859-2 general_first_day_of_week: '1' - + notice_account_updated: A fiók adatai sikeresen frissítve. notice_account_invalid_creditentials: Hibás felhasználói név, vagy jelszó notice_account_password_updated: A jelszó módosítása megtörtént. @@ -181,13 +184,13 @@ notice_no_issue_selected: "Nincs feladat kiválasztva! Kérem jelölje meg melyik feladatot szeretné szerkeszteni!" notice_account_pending: "A fiókja létrejött, és adminisztrátori jóváhagyásra vár." notice_default_data_loaded: Az alapértelmezett konfiguráció betöltése sikeresen megtörtént. - + error_can_t_load_default_data: "Az alapértelmezett konfiguráció betöltése nem lehetséges: %{value}" error_scm_not_found: "A bejegyzés, vagy revízió nem található a tárolóban." error_scm_command_failed: "A tároló elérése közben hiba lépett fel: %{value}" error_scm_annotate: "A bejegyzés nem létezik, vagy nics jegyzetekkel ellátva." error_issue_not_found_in_project: 'A feladat nem található, vagy nem ehhez a projekthez tartozik' - + mail_subject_lost_password: Az Ön Redmine jelszava mail_body_lost_password: 'A Redmine jelszó megváltoztatásához, kattintson a következő linkre:' mail_subject_register: Redmine azonosító aktiválása @@ -196,10 +199,10 @@ mail_body_account_information: Az Ön Redmine azonosítójának információi mail_subject_account_activation_request: Redmine azonosító aktiválási kérelem mail_body_account_activation_request: "Egy új felhasználó (%{value}) regisztrált, azonosítója jóváhasgyásra várakozik:" - + gui_validation_error: 1 hiba gui_validation_error_plural: "%{count} hiba" - + field_name: Név field_description: Leírás field_summary: Összegzés @@ -245,7 +248,6 @@ field_admin: Adminisztrátor field_last_login_on: Utolsó bejelentkezés field_language: Nyelv - field_effective_date: Dátum field_password: Jelszó field_new_password: Új jelszó field_password_confirmation: Megerősítés @@ -283,7 +285,7 @@ field_searchable: Kereshető field_default_value: Alapértelmezett érték field_comments_sorting: Feljegyzések megjelenítése - + setting_app_title: Alkalmazás címe setting_app_subtitle: Alkalmazás alcíme setting_welcome_text: Üdvözlő üzenet @@ -316,7 +318,7 @@ setting_activity_days_default: Napok megjelenítése a project aktivitásnál setting_display_subprojects_issues: Alapértelmezettként mutassa az alprojektek feladatait is a projekteken setting_start_of_week: A hét első napja - + project_module_issue_tracking: Feladat követés project_module_time_tracking: Idő rögzítés project_module_news: Hírek @@ -325,7 +327,7 @@ project_module_wiki: Wiki project_module_repository: Tároló project_module_boards: Fórumok - + label_user: Felhasználó label_user_plural: Felhasználók label_user_new: Új felhasználó @@ -631,7 +633,7 @@ label_chronological_order: Időrendben label_reverse_chronological_order: Fordított időrendben label_planning: Tervezés - + button_login: Bejelentkezés button_submit: Elfogad button_save: Mentés @@ -669,11 +671,11 @@ button_annotate: Jegyzetel button_update: Módosít button_configure: Konfigurál - + status_active: aktív status_registered: regisztrált status_locked: zárolt - + text_select_mail_notifications: Válasszon eseményeket, amelyekről e-mail értesítést kell küldeni. text_regexp_info: pl. ^[A-Z0-9]+$ text_min_max_length_info: 0 = nincs korlátozás @@ -711,7 +713,7 @@ text_destroy_time_entries: A rögzített órák törlése text_assign_time_entries_to_project: A rögzített órák hozzárendelése a projekthez text_reassign_time_entries: 'A rögzített órák újra hozzárendelése másik feladathoz:' - + default_role_manager: Vezető default_role_developer: Fejlesztő default_role_reporter: Bejelentő @@ -735,7 +737,7 @@ default_priority_immediate: Azonnal default_activity_design: Tervezés default_activity_development: Fejlesztés - + enumeration_issue_priorities: Feladat prioritások enumeration_doc_categories: Dokumentum kategóriák enumeration_activities: Tevékenységek (idő rögzítés) @@ -965,3 +967,18 @@ label_cvs_path: CVSROOT label_git_path: Path to .git directory label_mercurial_path: Root directory + label_my_queries: My custom queries + label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee + text_journal_changed_no_detail: "%{label} updated" + button_expand_all: Expand all + button_collapse_all: Collapse all + label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author + field_effective_date: Due date + label_news_comment_added: Comment added to a news + field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text + text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page. + text_default_encoding: "Default: UTF-8" + text_git_repo_example: a bare and local repository (e.g. /gitrepo, c:\gitrepo) + label_notify_member_plural: Email issue updates + label_path_encoding: Path encoding + text_mercurial_repo_example: local repository (e.g. /hgrepo, c:\hgrepo) diff --git a/config/locales/id.yml b/config/locales/id.yml index 8a33b393..907370a2 100644 --- a/config/locales/id.yml +++ b/config/locales/id.yml @@ -1,4 +1,4 @@ -# Indonesian translations +# Indonesian translations # by Raden Prabowo (cakbowo@gmail.com) id: @@ -8,13 +8,16 @@ id: default: "%d-%m-%Y" short: "%d %b" long: "%d %B %Y" - + day_names: [Minggu, Senin, Selasa, Rabu, Kamis, Jumat, Sabtu] abbr_day_names: [Ming, Sen, Sel, Rab, Kam, Jum, Sab] - + month_names: [~, Januari, Februari, Maret, April, Mei, Juni, Juli, Agustus, September, Oktober, November, Desember] abbr_month_names: [~, Jan, Feb, Mar, Apr, Mei, Jun, Jul, Agu, Sep, Okt, Nov, Des] - order: [ :day, :month, :year ] + order: + - :day + - :month + - :year time: formats: @@ -24,7 +27,7 @@ id: long: "%d %B %Y %H:%M" am: "am" pm: "pm" - + datetime: distance_in_words: half_a_minute: "setengah menit" @@ -87,12 +90,12 @@ id: gb: "GB" tb: "TB" - + support: array: sentence_connector: "dan" skip_last_comma: false - + activerecord: errors: template: @@ -126,7 +129,7 @@ id: cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks" actionview_instancetag_blank_option: Silakan pilih - + general_text_No: 'Tidak' general_text_Yes: 'Ya' general_text_no: 'tidak' @@ -137,7 +140,7 @@ id: general_csv_encoding: ISO-8859-1 general_pdf_encoding: ISO-8859-1 general_first_day_of_week: '7' - + notice_account_updated: Akun sudah berhasil diperbarui. notice_account_invalid_creditentials: Pengguna atau kata sandi salah notice_account_password_updated: Kata sandi sudah berhasil diperbarui. @@ -162,7 +165,7 @@ id: notice_account_pending: "Akun anda sudah dibuat dan sekarang sedang menunggu persetujuan administrator." notice_default_data_loaded: Konfigurasi default sudah berhasil dimuat. notice_unable_delete_version: Tidak bisa menghapus versi. - + error_can_t_load_default_data: "Konfigurasi default tidak bisa dimuat: %{value}" error_scm_not_found: "Entri atau revisi tidak terdapat pada repositori." error_scm_command_failed: "Terjadi kesalahan pada saat mengakses repositori: %{value}" @@ -172,9 +175,9 @@ id: error_no_default_issue_status: 'Nilai default untuk Status masalah belum didefinisikan. Periksa kembali konfigurasi anda (Pilih "Administrasi --> Status masalah").' error_can_not_reopen_issue_on_closed_version: 'Masalah yang ditujukan pada versi tertutup tidak bisa dibuka kembali' error_can_not_archive_project: Proyek ini tidak bisa diarsipkan - + warning_attachments_not_saved: "%{count} berkas tidak bisa disimpan." - + mail_subject_lost_password: "Kata sandi %{value} anda" mail_body_lost_password: 'Untuk mengubah kata sandi anda, klik tautan berikut::' mail_subject_register: "Aktivasi akun %{value} anda" @@ -189,11 +192,11 @@ id: mail_body_wiki_content_added: "The '%{id}' halaman wiki sudah ditambahkan oleh %{author}." mail_subject_wiki_content_updated: "'%{id}' halaman wiki sudah diperbarui" mail_body_wiki_content_updated: "The '%{id}' halaman wiki sudah diperbarui oleh %{author}." - + gui_validation_error: 1 kesalahan gui_validation_error_plural: "%{count} kesalahan" - + field_name: Nama field_description: Deskripsi field_summary: Ringkasan @@ -211,7 +214,7 @@ id: field_is_for_all: Untuk semua proyek field_possible_values: Nilai yang mungkin field_regexp: Regular expression - field_min_length: Panjang minimum + field_min_length: Panjang minimum field_max_length: Panjang maksimum field_value: Nilai field_category: Kategori @@ -240,7 +243,6 @@ id: field_admin: Administrator field_last_login_on: Terakhir login field_language: Bahasa - field_effective_date: Tanggal field_password: Kata sandi field_new_password: Kata sandi baru field_password_confirmation: Konfirmasi @@ -256,7 +258,7 @@ id: field_attr_mail: Atribut email field_onthefly: Pembuatan pengguna seketika field_start_date: Mulai - field_done_ratio: % Selesai + field_done_ratio: "% Selesai" field_auth_source: Mode otentikasi field_hide_mail: Sembunyikan email saya field_comments: Komentar @@ -283,9 +285,9 @@ id: field_watcher: Pemantau field_identity_url: OpenID URL field_content: Isi - field_group_by: Dikelompokkan berdasar + field_group_by: Dikelompokkan berdasar field_sharing: Berbagi - + setting_app_title: Judul aplikasi setting_app_subtitle: Subjudul aplikasi setting_welcome_text: Teks sambutan @@ -323,8 +325,8 @@ id: setting_mail_handler_api_enabled: Enable WS for incoming emails setting_mail_handler_api_key: API key setting_sequential_project_identifiers: Buat pengenal proyek terurut - setting_gravatar_enabled: Gunakan icon pengguna dari Gravatar - setting_gravatar_default: Gambar default untuk Gravatar + setting_gravatar_enabled: Gunakan icon pengguna dari Gravatar + setting_gravatar_default: Gambar default untuk Gravatar setting_diff_max_lines_displayed: Maksimum perbedaan baris tertampil setting_file_max_size_displayed: Maksimum berkas tertampil secara inline setting_repository_log_display_limit: Nilai maksimum dari revisi ditampilkan di log berkas @@ -332,7 +334,7 @@ id: setting_password_min_length: Panjang minimum untuk kata sandi setting_new_project_user_role_id: Peran diberikan pada pengguna non-admin yang membuat proyek setting_default_projects_modules: Modul yang diaktifkan pada proyek baru - + permission_add_project: Tambahkan proyek permission_edit_project: Sunting proyek permission_select_project_modules: Pilih modul proyek @@ -383,7 +385,7 @@ id: permission_edit_own_messages: Sunting pesan saya permission_delete_messages: Hapus pesan permission_delete_own_messages: Hapus pesan saya - + project_module_issue_tracking: Pelacak masalah project_module_time_tracking: Pelacak waktu project_module_news: Berita @@ -392,19 +394,19 @@ id: project_module_wiki: Wiki project_module_repository: Repositori project_module_boards: Forum - + label_user: Pengguna label_user_plural: Pengguna label_user_new: Pengguna baru label_user_anonymous: Anonymous label_project: Proyek label_project_new: Proyek baru - label_project_plural: Proyek + label_project_plural: Proyek label_x_projects: - zero: tidak ada proyek - one: 1 proyek + zero: tidak ada proyek + one: 1 proyek other: "%{count} proyek" - label_project_all: Semua Proyek + label_project_all: Semua Proyek label_project_latest: Proyek terakhir label_issue: Masalah label_issue_new: Masalah baru @@ -586,7 +588,7 @@ id: label_modification: "%{count} perubahan" label_modification_plural: "%{count} perubahan" label_branch: Cabang - label_tag: Tag + label_tag: Tag label_revision: Revisi label_revision_plural: Revisi label_associated_revisions: Revisi terkait @@ -612,9 +614,9 @@ id: label_result_plural: Hasil label_all_words: Semua kata label_wiki: Wiki - label_wiki_edit: Sunting wiki - label_wiki_edit_plural: Sunting wiki - label_wiki_page: Halaman wiki + label_wiki_edit: Sunting wiki + label_wiki_edit_plural: Sunting wiki + label_wiki_page: Halaman wiki label_wiki_page_plural: Halaman wiki label_index_by_title: Indeks menurut judul label_index_by_date: Indeks menurut tanggal @@ -684,7 +686,7 @@ id: label_jump_to_a_project: Pilih proyek... label_file_plural: Berkas label_changeset_plural: Set perubahan - label_default_columns: Kolom default + label_default_columns: Kolom default label_no_change_option: (Tak ada perubahan) label_bulk_edit_selected_issues: Ubah masalah terpilih secara masal label_theme: Tema @@ -694,7 +696,7 @@ id: label_user_mail_option_selected: "Hanya untuk semua kejadian pada proyek yang saya pilih ..." label_user_mail_no_self_notified: "Saya tak ingin diberitahu untuk perubahan yang saya buat sendiri" label_user_mail_assigned_only_mail_notification: "Kirim email hanya bila saya ditugaskan untuk masalah terkait" - label_user_mail_block_mail_notification: "Saya tidak ingin menerima email. Terima kasih." + label_user_mail_block_mail_notification: "Saya tidak ingin menerima email. Terima kasih." label_registration_activation_by_email: aktivasi akun melalui email label_registration_manual_activation: aktivasi akun secara manual label_registration_automatic_activation: aktivasi akun secara otomatis @@ -777,17 +779,17 @@ id: button_configure: Konfigur button_quote: Kutip button_duplicate: Duplikat - + status_active: aktif status_registered: terdaftar status_locked: terkunci - + version_status_open: terbuka version_status_locked: terkunci version_status_closed: tertutup field_active: Aktif - + text_select_mail_notifications: Pilih aksi dimana email notifikasi akan dikirimkan. text_regexp_info: mis. ^[A-Z0-9]+$ text_min_max_length_info: 0 berarti tidak ada pembatasan @@ -841,7 +843,7 @@ id: text_wiki_page_nullify_children: "Biarkan halaman anak sebagai halaman teratas (root)" text_wiki_page_destroy_children: "Hapus halaman anak dan semua turunannya" text_wiki_page_reassign_children: "Tujukan halaman anak ke halaman induk yang ini" - + default_role_manager: Manager default_role_developer: Pengembang default_role_reporter: Pelapor @@ -865,7 +867,7 @@ id: default_priority_immediate: Segera default_activity_design: Rancangan default_activity_development: Pengembangan - + enumeration_issue_priorities: Prioritas masalah enumeration_doc_categories: Kategori dokumen enumeration_activities: Kegiatan @@ -954,3 +956,18 @@ id: label_cvs_path: CVSROOT label_git_path: Path to .git directory label_mercurial_path: Root directory + label_my_queries: My custom queries + label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee + text_journal_changed_no_detail: "%{label} updated" + button_expand_all: Expand all + button_collapse_all: Collapse all + label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author + field_effective_date: Due date + label_news_comment_added: Comment added to a news + field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text + text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page. + text_default_encoding: "Default: UTF-8" + text_git_repo_example: a bare and local repository (e.g. /gitrepo, c:\gitrepo) + label_notify_member_plural: Email issue updates + label_path_encoding: Path encoding + text_mercurial_repo_example: local repository (e.g. /hgrepo, c:\hgrepo) diff --git a/config/locales/it.yml b/config/locales/it.yml index 33c8e75c..63efe94d 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -1,4 +1,4 @@ -# Italian translations for Ruby on Rails +# Italian translations for Ruby on Rails # by Claudio Poli (masterkain@gmail.com) # by Diego Pierotto (ita.translations@tiscali.it) # by Emidio Stani (emidiostani@gmail.com) @@ -16,8 +16,11 @@ it: abbr_day_names: [Dom, Lun, Mar, Mer, Gio, Ven, Sab] month_names: [~, Gennaio, Febbraio, Marzo, Aprile, Maggio, Giugno, Luglio, Agosto, Settembre, Ottobre, Novembre, Dicembre] abbr_month_names: [~, Gen, Feb, Mar, Apr, Mag, Giu, Lug, Ago, Set, Ott, Nov, Dic] - order: [ :day, :month, :year ] - + order: + - :day + - :month + - :year + time: formats: default: "%a %d %b %Y, %H:%M:%S %z" @@ -25,14 +28,14 @@ it: short: "%d %b %H:%M" long: "%d %B %Y %H:%M" only_second: "%S" - + datetime: formats: default: "%d-%m-%YT%H:%M:%S%Z" - + am: 'am' pm: 'pm' - + datetime: distance_in_words: half_a_minute: "mezzo minuto" @@ -69,7 +72,7 @@ it: almost_x_years: one: "quasi 1 anno" other: "quasi %{count} anni" - + number: format: precision: 3 @@ -91,16 +94,16 @@ it: mb: "MB" gb: "GB" tb: "TB" - + support: array: sentence_connector: "e" skip_last_comma: false - + activerecord: errors: template: - header: + header: one: "Non posso salvare questo %{model}: 1 errore" other: "Non posso salvare questo %{model}: %{count} errori." body: "Per favore ricontrolla i seguenti campi:" @@ -130,7 +133,7 @@ it: cant_link_an_issue_with_a_descendant: "Una segnalazione non può essere collegata a una delle sue discendenti" actionview_instancetag_blank_option: Scegli - + general_text_No: 'No' general_text_Yes: 'Sì' general_text_no: 'no' @@ -141,7 +144,7 @@ it: general_csv_encoding: ISO-8859-1 general_pdf_encoding: ISO-8859-1 general_first_day_of_week: '1' - + notice_account_updated: L'utente è stato aggiornato. notice_account_invalid_creditentials: Nome utente o password non validi. notice_account_password_updated: La password è stata aggiornata. @@ -161,18 +164,18 @@ it: notice_email_sent: "Una email è stata spedita a %{value}" notice_email_error: "Si è verificato un errore durante l'invio di una email (%{value})" notice_feeds_access_key_reseted: La tua chiave di accesso RSS è stata reimpostata. - + error_scm_not_found: "La risorsa e/o la versione non esistono nel repository." error_scm_command_failed: "Si è verificato un errore durante l'accesso al repository: %{value}" - + mail_subject_lost_password: "Password %{value}" mail_body_lost_password: 'Per cambiare la password, usa il seguente collegamento:' mail_subject_register: "Attivazione utente %{value}" mail_body_register: "Per attivare l'utente, usa il seguente collegamento:" - + gui_validation_error: 1 errore gui_validation_error_plural: "%{count} errori" - + field_name: Nome field_description: Descrizione field_summary: Sommario @@ -218,7 +221,6 @@ it: field_admin: Amministratore field_last_login_on: Ultima connessione field_language: Lingua - field_effective_date: Data field_password: Password field_new_password: Nuova password field_password_confirmation: Conferma @@ -234,7 +236,7 @@ it: field_attr_mail: Attributo email field_onthefly: Creazione utente "al volo" field_start_date: Inizio - field_done_ratio: % completato + field_done_ratio: "% completato" field_auth_source: Modalità di autenticazione field_hide_mail: Nascondi il mio indirizzo email field_comments: Commento @@ -252,7 +254,7 @@ it: field_redirect_existing_links: Redirige i collegamenti esistenti field_estimated_hours: Tempo stimato field_default_value: Stato predefinito - + setting_app_title: Titolo applicazione setting_app_subtitle: Sottotitolo applicazione setting_welcome_text: Testo di benvenuto @@ -273,7 +275,7 @@ it: setting_autologin: Connessione automatica setting_date_format: Formato data setting_cross_project_issue_relations: Consenti la creazione di relazioni tra segnalazioni in progetti differenti - + label_user: Utente label_user_plural: Utenti label_user_new: Nuovo utente @@ -529,7 +531,7 @@ it: label_added_time_by: "Aggiunto da %{author} %{age} fa" label_updated_time: "Aggiornato %{value} fa" label_jump_to_a_project: Vai al progetto... - + button_login: Entra button_submit: Invia button_save: Salva @@ -562,11 +564,11 @@ it: button_unarchive: Ripristina button_reset: Reimposta button_rename: Rinomina - + status_active: attivo status_registered: registrato status_locked: bloccato - + text_select_mail_notifications: Seleziona le azioni per cui deve essere inviata una notifica. text_regexp_info: es. ^[A-Z0-9]+$ text_min_max_length_info: 0 significa nessuna restrizione @@ -589,7 +591,7 @@ it: text_issue_category_destroy_question: "Alcune segnalazioni (%{count}) risultano assegnate a questa categoria. Cosa vuoi fare ?" text_issue_category_destroy_assignments: Rimuovi le assegnazioni a questa categoria text_issue_category_reassign_to: Riassegna segnalazioni a questa categoria - + default_role_manager: Gestore default_role_developer: Sviluppatore default_role_reporter: Segnalatore @@ -613,7 +615,7 @@ it: default_priority_immediate: Immediata default_activity_design: Progettazione default_activity_development: Sviluppo - + enumeration_issue_priorities: Priorità segnalazioni enumeration_doc_categories: Categorie di documenti enumeration_activities: Attività (time tracking) @@ -947,3 +949,18 @@ it: label_cvs_path: CVSROOT label_git_path: Path to .git directory label_mercurial_path: Root directory + label_my_queries: My custom queries + label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee + text_journal_changed_no_detail: "%{label} updated" + button_expand_all: Expand all + button_collapse_all: Collapse all + label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author + field_effective_date: Due date + label_news_comment_added: Comment added to a news + field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text + text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page. + text_default_encoding: "Default: UTF-8" + text_git_repo_example: a bare and local repository (e.g. /gitrepo, c:\gitrepo) + label_notify_member_plural: Email issue updates + label_path_encoding: Path encoding + text_mercurial_repo_example: local repository (e.g. /hgrepo, c:\hgrepo) diff --git a/config/locales/ja.yml b/config/locales/ja.yml index 02025268..a769c2d2 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -1,4 +1,4 @@ -# Japanese translations for Ruby on Rails +# Japanese translations for Ruby on Rails # by Akira Matsuda (ronnie@dio.jp) # AR error messages are basically taken from Ruby-GetText-Package. Thanks to Masao Mutoh. @@ -12,15 +12,18 @@ ja: default: "%Y/%m/%d" short: "%m/%d" long: "%Y年%m月%d日(%a)" - + day_names: [日曜日, 月曜日, 火曜日, 水曜日, 木曜日, 金曜日, 土曜日] abbr_day_names: [日, 月, 火, 水, 木, 金, 土] - + # Don't forget the nil at the beginning; there's no such thing as a 0th month month_names: [~, 1月, 2月, 3月, 4月, 5月, 6月, 7月, 8月, 9月, 10月, 11月, 12月] abbr_month_names: [~, 1月, 2月, 3月, 4月, 5月, 6月, 7月, 8月, 9月, 10月, 11月, 12月] # Used in date_select and datime_select. - order: [ :year, :month, :day ] + order: + - :year + - :month + - :day time: formats: @@ -30,7 +33,7 @@ ja: long: "%Y年%m月%d日(%a) %H時%M分%S秒 %Z" am: "午前" pm: "午後" - + datetime: distance_in_words: half_a_minute: "30秒前後" @@ -105,13 +108,13 @@ ja: gb: "GB" tb: "TB" - + # Used in array.to_sentence. support: array: sentence_connector: "及び" skip_last_comma: true - + activerecord: errors: template: @@ -147,7 +150,7 @@ ja: cant_link_an_issue_with_a_descendant: "指定したチケットとは親子関係になっているため関連づけられません" actionview_instancetag_blank_option: 選んでください - + general_text_No: 'いいえ' general_text_Yes: 'はい' general_text_no: 'いいえ' @@ -158,7 +161,7 @@ ja: general_csv_encoding: CP932 general_pdf_encoding: CP932 general_first_day_of_week: '7' - + notice_account_updated: アカウントが更新されました。 notice_account_invalid_creditentials: ユーザ名もしくはパスワードが無効 notice_account_password_updated: パスワードが更新されました。 @@ -189,7 +192,7 @@ ja: notice_unable_delete_time_entry: 作業時間を削除できません notice_issue_done_ratios_updated: チケットの進捗が更新されました。 notice_gantt_chart_truncated: ガントチャートは、最大表示項目数(%{max})を超えたたため切り捨てられました。 - + error_can_t_load_default_data: "デフォルト設定がロードできませんでした: %{value}" error_scm_not_found: リポジトリに、エントリ/リビジョンが存在しません。 error_scm_command_failed: "リポジトリへアクセスしようとしてエラーになりました: %{value}" @@ -207,9 +210,9 @@ ja: error_workflow_copy_source: 'コピー元となるトラッカーまたはロールを選択してください' error_workflow_copy_target: 'コピー先となるトラッカーとロールを選択してください' error_can_not_delete_tracker: 'このトラッカーは使用されています。削除できません。' - + warning_attachments_not_saved: "%{count}個の添付ファイルが保存できませんでした。" - + mail_subject_lost_password: "%{value} パスワード再発行" mail_body_lost_password: 'パスワードを変更するには、以下のリンクをクリックしてください:' mail_subject_register: "%{value} アカウント登録の確認" @@ -224,10 +227,10 @@ ja: mail_body_wiki_content_added: "%{author} によってWikiページ %{id} が追加されました。" mail_subject_wiki_content_updated: "Wikiページ %{id} が更新されました" mail_body_wiki_content_updated: "%{author} によってWikiページ %{id} が更新されました。" - + gui_validation_error: 1件のエラー gui_validation_error_plural: "%{count}件のエラー" - + field_name: 名称 field_description: 説明 field_summary: サマリー @@ -274,7 +277,6 @@ ja: field_admin: 管理者 field_last_login_on: 最終接続日 field_language: 言語 - field_effective_date: 期日 field_password: パスワード field_new_password: 新しいパスワード field_password_confirmation: パスワードの確認 @@ -325,7 +327,8 @@ ja: field_assigned_to_role: 担当者のロール field_text: テキスト field_visible: 表示 - + field_warn_on_leaving_unsaved: セーブされていないページから移動するときに警告する + setting_app_title: アプリケーションのタイトル setting_app_subtitle: アプリケーションのサブタイトル setting_welcome_text: ウェルカムメッセージ @@ -384,7 +387,7 @@ ja: setting_commit_logtime_enabled: コミット時に作業時間を記録する setting_commit_logtime_activity_id: 作業時間の作業分類 setting_gantt_items_limit: ガントチャート最大表示項目数 - + permission_add_project: プロジェクトの追加 permission_add_subprojects: サブプロジェクトの追加 permission_edit_project: プロジェクトの編集 @@ -440,7 +443,7 @@ ja: permission_delete_messages: メッセージの削除 permission_delete_own_messages: 自身が記入したメッセージの削除 permission_manage_subtasks: 子チケットの管理 - + project_module_issue_tracking: チケットトラッキング project_module_time_tracking: 時間トラッキング project_module_news: ニュース @@ -451,7 +454,7 @@ ja: project_module_boards: フォーラム project_module_gantt: ガントチャート project_module_calendar: カレンダー - + label_user: ユーザ label_user_plural: ユーザ label_user_new: 新しいユーザ @@ -559,6 +562,7 @@ ja: label_news_latest: 最新ニュース label_news_view_all: 全てのニュースを見る label_news_added: ニュースが追加されました + label_news_comment_added: ニュースにコメントが追加されました label_settings: 設定 label_overview: 概要 label_version: バージョン @@ -617,6 +621,7 @@ ja: label_query: カスタムクエリ label_query_plural: カスタムクエリ label_query_new: 新しいクエリ + label_my_queries: マイカスタムクエリ label_filter_add: フィルタ追加 label_filter_plural: フィルタ label_equals: 等しい @@ -815,12 +820,14 @@ ja: label_project_copy_notifications: コピーしたチケットのメール通知を送信する label_principal_search: "ユーザまたはグループの検索:" label_user_search: "ユーザの検索:" - + button_login: ログイン button_submit: 変更 button_save: 保存 button_check_all: 全てにチェックをつける button_uncheck_all: 全てのチェックを外す + button_expand_all: 展開 + button_collapse_all: 折りたたみ button_delete: 削除 button_create: 作成 button_create_and_continue: 連続作成 @@ -860,17 +867,17 @@ ja: button_quote: 引用 button_duplicate: 複製 button_show: 表示 - + status_active: 有効 status_registered: 登録 status_locked: ロック - + version_status_open: 進行中 version_status_locked: ロック中 version_status_closed: 終了 field_active: 有効 - + text_select_mail_notifications: どのメール通知を送信するか、アクションを選択してください。 text_regexp_info: 例) ^[A-Z0-9]+$ text_min_max_length_info: 0だと無制限になります @@ -880,6 +887,7 @@ ja: text_are_you_sure: よろしいですか? text_are_you_sure_with_children: チケットとその子チケット全てを削除しますか? text_journal_changed: "%{label} を %{old} から %{new} に変更" + text_journal_changed_no_detail: "%{label} を更新" text_journal_set_to: "%{label} を %{value} にセット" text_journal_deleted: "%{label} を削除 (%{old})" text_journal_added: "%{label} %{value} を追加" @@ -930,7 +938,8 @@ ja: text_own_membership_delete_confirmation: "いくつかまたはすべての権限をあなた自身から剥奪しようとしているため、このプロジェクトを編集できなくなるかもしれません。\n本当に続けてもよろしいですか?" text_zoom_in: 拡大 text_zoom_out: 縮小 - + text_warn_on_leaving_unsaved: このページから移動すると、セーブされていないデータが失われます。 + default_role_manager: 管理者 default_role_developer: 開発者 default_role_reporter: 報告者 @@ -954,7 +963,7 @@ ja: default_priority_immediate: 今すぐ default_activity_design: 設計作業 default_activity_development: 開発作業 - + enumeration_issue_priorities: チケットの優先度 enumeration_doc_categories: 文書カテゴリ enumeration_activities: 作業分類 (時間トラッキング) @@ -967,3 +976,12 @@ ja: label_cvs_path: CVSROOT label_git_path: Path to .git directory label_mercurial_path: Root directory + label_my_queries: My custom queries + label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee + label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author + field_effective_date: Due date + text_default_encoding: "Default: UTF-8" + text_git_repo_example: a bare and local repository (e.g. /gitrepo, c:\gitrepo) + label_notify_member_plural: Email issue updates + label_path_encoding: Path encoding + text_mercurial_repo_example: local repository (e.g. /hgrepo, c:\hgrepo) diff --git a/config/locales/ko.yml b/config/locales/ko.yml index 7772ac7a..e344b875 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -1,4 +1,4 @@ -# Korean translations for Ruby on Rails +# Korean translations for Ruby on Rails # by Kihyun Yoon(ddumbugie@gmail.com),http://plenum.textcube.com/ # by John Hwang (jhwang@tavon.org),http://github.com/tavon # by Yonghwan SO(please insert your email), last update at 2009-09-11 @@ -13,15 +13,18 @@ ko: default: "%Y/%m/%d" short: "%m/%d" long: "%Y년 %m월 %d일 (%a)" - + day_names: [일요일, 월요일, 화요일, 수요일, 목요일, 금요일, 토요일] abbr_day_names: [일, 월, 화, 수, 목, 금, 토] - + # Don't forget the nil at the beginning; there's no such thing as a 0th month month_names: [~, 1월, 2월, 3월, 4월, 5월, 6월, 7월, 8월, 9월, 10월, 11월, 12월] abbr_month_names: [~, 1월, 2월, 3월, 4월, 5월, 6월, 7월, 8월, 9월, 10월, 11월, 12월] # Used in date_select and datime_select. - order: [ :year, :month, :day ] + order: + - :year + - :month + - :day time: formats: @@ -31,7 +34,7 @@ ko: long: "%Y년 %B월 %d일, %H시 %M분 %S초 %Z" am: "오전" pm: "오후" - + datetime: distance_in_words: half_a_minute: "30초" @@ -75,7 +78,7 @@ ko: hour: "시" minute: "분" second: "초" - + number: # Used in number_with_delimiter() # These are also the defaults for 'currency', 'percentage', 'precision', and 'human' @@ -86,7 +89,7 @@ ko: delimiter: "," # Number of decimals, behind the separator (the number 1 with a precision of 2 gives: 1.00) precision: 3 - + # Used in number_to_currency() currency: format: @@ -97,15 +100,15 @@ ko: separator: "." delimiter: "," precision: 0 - + # Used in number_to_percentage() percentage: format: # These three are to override number.format and are optional - # separator: + # separator: delimiter: "" - # precision: - + # precision: + # Used in number_to_precision() precision: format: @@ -113,12 +116,12 @@ ko: # separator: delimiter: "" # precision: - + # Used in number_to_human_size() human: format: # These three are to override number.format and are optional - # separator: + # separator: delimiter: "" precision: 1 storage_units: @@ -140,7 +143,7 @@ ko: last_word_connector: ", " sentence_connector: "그리고" skip_last_comma: false - + activerecord: errors: template: @@ -176,7 +179,7 @@ ko: cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks" actionview_instancetag_blank_option: 선택하세요 - + general_text_No: '아니오' general_text_Yes: '예' general_text_no: '아니오' @@ -187,7 +190,7 @@ ko: general_csv_encoding: CP949 general_pdf_encoding: CP949 general_first_day_of_week: '7' - + notice_account_updated: 계정이 성공적으로 변경되었습니다. notice_account_invalid_creditentials: 잘못된 계정 또는 비밀번호 notice_account_password_updated: 비밀번호가 잘 변경되었습니다. @@ -212,7 +215,7 @@ ko: notice_account_pending: "계정이 만들어졌으며 관리자 승인 대기중입니다." notice_default_data_loaded: 기본값을 성공적으로 읽어들였습니다. notice_unable_delete_version: 삭제할 수 없는 버전입니다. - + error_can_t_load_default_data: "기본값을 읽어들일 수 없습니다.: %{value}" error_scm_not_found: 항목이나 리비젼이 저장소에 존재하지 않습니다. error_scm_command_failed: "저장소에 접근하는 도중에 오류가 발생하였습니다.: %{value}" @@ -220,7 +223,7 @@ ko: error_issue_not_found_in_project: '일감이 없거나 이 프로젝트의 것이 아닙니다.' warning_attachments_not_saved: "%{count}개 파일을 저장할 수 없습니다." - + mail_subject_lost_password: "%{value} 비밀번호" mail_body_lost_password: '비밀번호를 변경하려면 다음 링크를 클릭하세요.' mail_subject_register: "%{value} 계정 활성화" @@ -235,10 +238,10 @@ ko: mail_subject_wiki_content_updated: "'위키페이지 %{id}'이(가) 수정되었습니다." mail_body_wiki_content_added: "%{author}이(가) 위키페이지 '%{id}'을(를) 추가하였습니다." mail_body_wiki_content_updated: "%{author}이(가) 위키페이지 '%{id}'을(를) 수정하였습니다." - + gui_validation_error: 에러 gui_validation_error_plural: "%{count}개 에러" - + field_name: 이름 field_description: 설명 field_summary: 요약 @@ -284,7 +287,6 @@ ko: field_admin: 관리자 field_last_login_on: 마지막 로그인 field_language: 언어 - field_effective_date: 일자 field_password: 비밀번호 field_new_password: 새 비밀번호 field_password_confirmation: 비밀번호 확인 @@ -328,7 +330,7 @@ ko: field_identity_url: OpenID URL field_content: 내용 field_group_by: 결과를 묶어 보여줄 기준 - + setting_app_title: 레드마인 제목 setting_app_subtitle: 레드마인 부제목 setting_welcome_text: 환영 메시지 @@ -348,12 +350,12 @@ ko: setting_autofetch_changesets: 제출(commit)된 변경묶음을 자동으로 가져오기 setting_sys_api_enabled: 저장소 관리에 WS를 사용 setting_commit_ref_keywords: 일감 참조에 사용할 키워드들 - setting_commit_fix_keywords: 일감 해결에 사용할 키워드들 + setting_commit_fix_keywords: 일감 해결에 사용할 키워드들 setting_autologin: 자동 로그인 setting_date_format: 날짜 형식 setting_time_format: 시간 형식 setting_cross_project_issue_relations: 다른 프로젝트의 일감과 연결하는 것을 허용 - setting_issue_list_default_columns: 일감 목록에 표시할 항목 + setting_issue_list_default_columns: 일감 목록에 표시할 항목 setting_repositories_encodings: 저장소 인코딩 setting_commit_logs_encoding: 제출(commit) 기록 인코딩 setting_emails_footer: 메일 꼬리 @@ -432,7 +434,7 @@ ko: project_module_wiki: 위키 project_module_repository: 저장소 project_module_boards: 게시판 - + label_user: 사용자 label_user_plural: 사용자 label_user_new: 새 사용자 @@ -575,7 +577,7 @@ ko: label_add_note: 일감덧글 추가 label_per_page: 페이지별 label_calendar: 달력 - label_months_from: 개월 동안 | 다음부터 + label_months_from: 개월 동안 | 다음부터 label_gantt: Gantt 챠트 label_internal: 내부 label_last_changes: "최근 %{count}개의 변경사항" @@ -741,10 +743,10 @@ ko: label_ldap_authentication: LDAP 인증 label_downloads_abbr: D/L label_optional_description: 부가적인 설명 - label_add_another_file: 다른 파일 추가 + label_add_another_file: 다른 파일 추가 label_preferences: 설정 label_chronological_order: 시간 순으로 정렬 - label_reverse_chronological_order: 시간 역순으로 정렬 + label_reverse_chronological_order: 시간 역순으로 정렬 label_planning: 프로젝트계획 label_incoming_emails: 수신 메일 label_generate_key: 키 생성 @@ -797,11 +799,11 @@ ko: button_update: 수정 button_configure: 설정 button_quote: 댓글달기 - + status_active: 사용중 status_registered: 등록대기 status_locked: 잠김 - + text_select_mail_notifications: 알림메일이 필요한 작업을 선택하세요. text_regexp_info: 예) ^[A-Z0-9]+$ text_min_max_length_info: 0 는 제한이 없음을 의미함 @@ -851,7 +853,7 @@ ko: text_wiki_page_nullify_children: 하위 페이지를 최상위 페이지 아래로 지정 text_wiki_page_destroy_children: 모든 하위 페이지와 관련 내용을 삭제 text_wiki_page_reassign_children: 하위 페이지를 이 페이지 아래로 지정 - + default_role_manager: 관리자 default_role_developer: 개발자 default_role_reporter: 보고자 @@ -998,3 +1000,18 @@ ko: label_cvs_path: CVSROOT label_git_path: Path to .git directory label_mercurial_path: Root directory + label_my_queries: My custom queries + label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee + text_journal_changed_no_detail: "%{label} updated" + button_expand_all: Expand all + button_collapse_all: Collapse all + label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author + field_effective_date: Due date + label_news_comment_added: Comment added to a news + field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text + text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page. + text_default_encoding: "Default: UTF-8" + text_git_repo_example: a bare and local repository (e.g. /gitrepo, c:\gitrepo) + label_notify_member_plural: Email issue updates + label_path_encoding: Path encoding + text_mercurial_repo_example: local repository (e.g. /hgrepo, c:\hgrepo) diff --git a/config/locales/lt.yml b/config/locales/lt.yml index a943f610..75566334 100644 --- a/config/locales/lt.yml +++ b/config/locales/lt.yml @@ -22,7 +22,10 @@ lt: month_names: [~, sausio, vasario, kovo, balandžio, gegužės, birželio, liepos, rugpjūčio, rugsėjo, spalio, lapkričio, gruodžio] abbr_month_names: [~, Sau, Vas, Kov, Bal, Geg, Bir, Lie, Rgp, Rgs, Spa, Lap, Grd] # Used in date_select and datime_select. - order: [ :year, :month, :day ] + order: + - :year + - :month + - :day time: formats: @@ -86,7 +89,7 @@ lt: separator: "," delimiter: " " precision: 3 - + currency: format: format: "%n %u" @@ -94,15 +97,15 @@ lt: separator: "," delimiter: " " precision: 2 - + percentage: format: delimiter: "" - + precision: format: delimiter: "" - + human: format: delimiter: "" @@ -180,9 +183,9 @@ lt: not_same_project: "nepriklauso tam pačiam projektui" circular_dependency: "Šis ryšys sukurtų ciklinę priklausomybę" cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks" - + actionview_instancetag_blank_option: prašom parinkti - + general_text_No: 'Ne' general_text_Yes: 'Taip' general_text_no: 'ne' @@ -193,7 +196,7 @@ lt: general_csv_encoding: UTF-8 general_pdf_encoding: UTF-8 general_first_day_of_week: '1' - + notice_account_updated: Paskyra buvo sėkmingai atnaujinta. notice_account_invalid_creditentials: Negaliojantis vartotojo vardas ar slaptažodis notice_account_password_updated: Slaptažodis buvo sėkmingai atnaujintas. @@ -218,7 +221,7 @@ lt: notice_account_pending: "Jūsų paskyra buvo sukurta ir dabar laukiama administratoriaus patvirtinimo." notice_default_data_loaded: Numatytoji konfiguracija sėkmingai užkrauta. notice_unable_delete_version: Neįmanoma panaikinti versiją - + error_can_t_load_default_data: "Numatytoji konfiguracija negali būti užkrauta: %{value}" error_scm_not_found: "Duomenys ir/ar pakeitimai saugykloje(repozitorojoje) neegzistuoja." error_scm_command_failed: "Įvyko klaida jungiantis prie saugyklos: %{value}" @@ -248,7 +251,7 @@ lt: gui_validation_error: 1 klaida gui_validation_error_plural: "%{count} klaidų(os)" - + field_name: Pavadinimas field_description: Aprašas field_summary: Santrauka @@ -295,7 +298,6 @@ lt: field_admin: Administratorius field_last_login_on: Paskutinis ryšys field_language: Kalba - field_effective_date: Data field_password: Slaptažodis field_new_password: Naujas slaptažodis field_password_confirmation: Patvirtinimas @@ -311,7 +313,7 @@ lt: field_attr_mail: Elektroninio pašto požymis field_onthefly: Automatinis vartotojų registravimas field_start_date: Pradėti - field_done_ratio: % atlikta + field_done_ratio: "% atlikta" field_auth_source: Autentiškumo nustatymo būdas field_hide_mail: Paslėpkite mano elektroninio pašto adresą field_comments: Komentaras @@ -449,7 +451,7 @@ lt: project_module_wiki: Wiki project_module_repository: Saugykla project_module_boards: Forumai - + label_user: Vartotojas label_user_plural: Vartotojai label_user_new: Naujas vartotojas @@ -917,7 +919,7 @@ lt: default_priority_immediate: Neatidėliotinas default_activity_design: Projektavimas default_activity_development: Vystymas - + enumeration_issue_priorities: Darbo prioritetai enumeration_doc_categories: Dokumento kategorijos enumeration_activities: Veiklos (laiko sekimas) @@ -1006,3 +1008,18 @@ lt: label_cvs_path: CVSROOT label_git_path: Path to .git directory label_mercurial_path: Root directory + label_my_queries: My custom queries + label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee + text_journal_changed_no_detail: "%{label} updated" + button_expand_all: Expand all + button_collapse_all: Collapse all + label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author + field_effective_date: Due date + label_news_comment_added: Comment added to a news + field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text + text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page. + text_default_encoding: "Default: UTF-8" + text_git_repo_example: a bare and local repository (e.g. /gitrepo, c:\gitrepo) + label_notify_member_plural: Email issue updates + label_path_encoding: Path encoding + text_mercurial_repo_example: local repository (e.g. /hgrepo, c:\hgrepo) diff --git a/config/locales/lv.yml b/config/locales/lv.yml index 8d47c896..cd291b76 100644 --- a/config/locales/lv.yml +++ b/config/locales/lv.yml @@ -1,939 +1,941 @@ -# translated by Dzintars Bergs (dzintars.bergs@gmail.com) - -lv: - direction: ltr - date: - formats: - default: "%d.%m.%Y" - short: "%d %b" - long: "%d %B %Y" - - day_names: [Svētdiena, Pirmdiena, Otrdiena, Trešdiena, Ceturtdiena, Piektdiena, Sestdiena] - abbr_day_names: [Sv, Pr, Ot, Tr, Ct, Pk, St] - - month_names: [~, Janvāris, Februāris, Marts, Aprīlis , Maijs, Jūnijs, Jūlijs, Augusts, Septembris, Oktobris, Novembris, Decembris] - abbr_month_names: [~, Jan, Feb, Mar, Apr, Mai, Jūn, Jūl, Aug, Sep, Okt, Nov, Dec] - order: [ :day, :month, :year ] - - time: - formats: - default: "%a, %d %b %Y, %H:%M:%S %z" - time: "%H:%M" - short: "%d %b, %H:%M" - long: "%B %d, %Y %H:%M" - am: "rītā" - pm: "vakarā" - - datetime: - distance_in_words: - half_a_minute: "pus minūte" - less_than_x_seconds: - one: "mazāk kā 1 sekunde" - other: "mazāk kā %{count} sekundes" - x_seconds: - one: "1 sekunde" - other: "%{count} sekundes" - less_than_x_minutes: - one: "mazāk kā minūte" - other: "mazāk kā %{count} minūtes" - x_minutes: - one: "1 minūte" - other: "%{count} minūtes" - about_x_hours: - one: "aptuveni 1 stunda" - other: "aptuveni %{count} stundas" - x_days: - one: "1 diena" - other: "%{count} dienas" - about_x_months: - one: "aptuveni 1 mēnesis" - other: "aptuveni %{count} mēneši" - x_months: - one: "1 mēnesis" - other: "%{count} mēneši" - about_x_years: - one: "aptuveni 1 gads" - other: "aptuveni %{count} gadi" - over_x_years: - one: "ilgāk par 1 gadu" - other: "ilgāk par %{count} gadiem" - almost_x_years: - one: "gandrīz 1 gadu" - other: "gandrīz %{count} gadus" - - number: - format: - separator: "." - delimiter: "" - precision: 3 - human: - format: - delimiter: " " - precision: 1 - storage_units: - format: "%n %u" - units: - byte: - one: "Baits" - other: "Baiti" - kb: "KB" - mb: "MB" - gb: "GB" - tb: "TB" - - - support: - array: - sentence_connector: "un" - skip_last_comma: false - - activerecord: - errors: - template: - header: - one: "1 error prohibited this %{model} from being saved" - other: "%{count} errors prohibited this %{model} from being saved" - messages: - inclusion: "nav iekļauts sarakstā" - exclusion: "ir rezervēts" - invalid: "nederīgs" - confirmation: "apstiprinājums nesakrīt" - accepted: "jābūt akceptētam" - empty: "nevar būt tukšs" - blank: "nevar būt neaizpildīts" - too_long: "ir pārāk gara(š) (maksimālais garums ir %{count} simboli)" - too_short: "ir pārāk īsa(s) (minimālais garums ir %{count} simboli)" - wrong_length: "ir nepareiza garuma (vajadzētu būt %{count} simboli)" - taken: "eksistē" - not_a_number: "nav skaitlis" - not_a_date: "nav derīgs datums" - greater_than: "jābūt lielākam par %{count}" - greater_than_or_equal_to: "jābūt lielākam vai vienādam ar %{count}" - equal_to: "jābūt vienādam ar %{count}" - less_than: "jābūt mazākam kā %{count}" - less_than_or_equal_to: "jābūt mazākam vai vienādam ar %{count}" - odd: "jāatšķirās" - even: "jāsakrīt" - greater_than_start_date: "jābūt vēlākam par sākuma datumu" - not_same_project: "nepieder pie tā paša projekta" - circular_dependency: "Šī relācija radītu ciklisku atkarību" - cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks" - - actionview_instancetag_blank_option: Izvēlieties - - general_text_No: 'Nē' - general_text_Yes: 'Jā' - general_text_no: 'nē' - general_text_yes: 'jā' - general_lang_name: 'Latvian (Latviešu)' - general_csv_separator: ',' - general_csv_decimal_separator: '.' - general_csv_encoding: UTF-8 - general_pdf_encoding: UTF-8 - general_first_day_of_week: '1' - - notice_account_updated: Konts tika atjaunots veiksmīgi. - notice_account_invalid_creditentials: Nepareizs lietotāja vārds vai parole. - notice_account_password_updated: Parole tika veiksmīgi atjaunota. - notice_account_wrong_password: Nepareiza parole - notice_account_register_done: Konts veiksmīgi izveidots. Lai aktivizētu kontu, spiediet uz saites, kas Jums tika nosūtīta. - notice_account_unknown_email: Nezināms lietotājs - notice_can_t_change_password: Šis konts izmanto ārēju pilnvarošanas avotu. Nav iespējams nomainīt paroli. - notice_account_lost_email_sent: Jums tika nosūtīts e-pasts ar instrukcijām, kā izveidot jaunu paroli. - notice_account_activated: Jūsu konts ir aktivizēts. Varat pieslēgties sistēmai. - notice_successful_create: Veiksmīga izveide. - notice_successful_update: Veiksmīga atjaunošana. - notice_successful_delete: Veiksmīga dzēšana. - notice_successful_connection: Veiksmīgs savienojums. - notice_file_not_found: Lapa, ko Jūs mēģināt atvērt, neeksistē vai ir pārvietota. - notice_locking_conflict: Datus ir atjaunojis cits lietotājs. - notice_not_authorized: Jums nav tiesību piekļūt šai lapai. - notice_email_sent: "E-pasts tika nosūtīts uz %{value}" - notice_email_error: "Kļūda sūtot e-pastu (%{value})" - notice_feeds_access_key_reseted: Jūsu RSS pieejas atslēga tika iestatīta sākuma stāvoklī. - notice_api_access_key_reseted: Jūsu API pieejas atslēga tika iestatīta sākuma stāvoklī. - notice_failed_to_save_issues: "Neizdevās saglabāt %{count} uzdevumu(us) no %{total} izvēlēti: %{ids}." - notice_no_issue_selected: "Nav izvēlēts uzdevums! Lūdzu, atzīmējiet uzdevumus, kurus vēlaties rediģēt!" - notice_account_pending: "Jūsu konts tika izveidots un šobrīd gaida administratora apstiprinājumu." - notice_default_data_loaded: Noklusētā konfigurācija tika veiksmīgi ielādēta. - notice_unable_delete_version: Neizdevās dzēst versiju. - notice_issue_done_ratios_updated: Uzdevuma izpildes koeficients atjaunots. - - error_can_t_load_default_data: "Nevar ielādēt noklusētos konfigurācijas datus: %{value}" - error_scm_not_found: "Ieraksts vai versija nebija repozitorijā." - error_scm_command_failed: "Mēģinot piekļūt repozitorijam, notika kļūda: %{value}" - error_scm_annotate: "Ieraksts neeksistē vai tam nevar tikt pievienots paskaidrojums." - error_issue_not_found_in_project: 'Uzdevums netika atrasts vai nepieder šim projektam.' - error_no_tracker_in_project: 'Neviens trakeris nav saistīts ar šo projektu. Pārbaudiet projekta iestatījumus.' - error_no_default_issue_status: 'Nav definēts uzdevuma noklusētais statuss. Pārbaudiet konfigurāciju (Ejat uz: "Administrācija -> Uzdevumu statusi")!' - error_can_not_reopen_issue_on_closed_version: 'Nevar pievienot atsauksmi uzdevumam, kas saistīts ar slēgtu versiju.' - error_can_not_archive_project: Šis projekts nevar tikt arhivēts - error_issue_done_ratios_not_updated: "Uzdevuma izpildes koeficients nav atjaunots." - error_workflow_copy_source: 'Lūdzu izvēlieties avota trakeri vai lomu' - error_workflow_copy_target: 'Lūdzu izvēlēties mērķa trakeri(us) un lomu(as)' - - warning_attachments_not_saved: "%{count} datnes netika saglabātas." - - mail_subject_lost_password: "Jūsu %{value} parole" - mail_body_lost_password: 'Lai mainītu paroli, spiediet uz šīs saites:' - mail_subject_register: "Jūsu %{value} konta aktivizācija" - mail_body_register: 'Lai izveidotu kontu, spiediet uz šīs saites:' - mail_body_account_information_external: "Varat izmantot Jūsu %{value} kontu, lai pieslēgtos." - mail_body_account_information: Jūsu konta informācija - mail_subject_account_activation_request: "%{value} konta aktivizācijas pieprasījums" - mail_body_account_activation_request: "Jauns lietotājs (%{value}) ir reģistrēts. Lietotāja konts gaida Jūsu apstiprinājumu:" - mail_subject_reminder: "%{count} uzdevums(i) sagaidāms(i) tuvākajās %{days} dienās" - mail_body_reminder: "%{count} uzdevums(i), kurš(i) ir nozīmēts(i) Jums, sagaidāms(i) tuvākajās %{days} dienās:" - mail_subject_wiki_content_added: "'%{id}' Wiki lapa pievienota" - mail_body_wiki_content_added: "The '%{id}' Wiki lapu pievienojis %{author}." - mail_subject_wiki_content_updated: "'%{id}' Wiki lapa atjaunota" - mail_body_wiki_content_updated: "The '%{id}' Wiki lapu atjaunojis %{author}." - - gui_validation_error: 1 kļūda - gui_validation_error_plural: "%{count} kļūdas" - - field_name: Nosaukums - field_description: Apraksts - field_summary: Kopsavilkums - field_is_required: Nepieciešams - field_firstname: Vārds - field_lastname: Uzvārds - field_mail: "E-pasts" - field_filename: Datne - field_filesize: Izmērs - field_downloads: Lejupielādes - field_author: Autors - field_created_on: Izveidots - field_updated_on: Atjaunots - field_field_format: Formāts - field_is_for_all: Visiem projektiem - field_possible_values: Iespējamās vērtības - field_regexp: Regulārā izteiksme - field_min_length: Minimālais garums - field_max_length: Maksimālais garums - field_value: Vērtība - field_category: Kategorija - field_title: Nosaukums - field_project: Projekts - field_issue: Uzdevums - field_status: Statuss - field_notes: Piezīmes - field_is_closed: Uzdevums slēgts - field_is_default: Noklusētā vērtība - field_tracker: Trakeris - field_subject: Temats - field_due_date: Sagaidāmais datums - field_assigned_to: Piešķirts - field_priority: Prioritāte - field_fixed_version: Mērķa versija - field_user: Lietotājs - field_role: Loma - field_homepage: Vietne - field_is_public: Publisks - field_parent: Apakšprojekts projektam - field_is_in_roadmap: Ceļvedī parādītie uzdevumi - field_login: Pieslēgties - field_mail_notification: "E-pasta paziņojumi" - field_admin: Administrators - field_last_login_on: Pēdējo reizi pieslēdzies - field_language: Valoda - field_effective_date: Datums - field_password: Parole - field_new_password: Janā parole - field_password_confirmation: Paroles apstiprinājums - field_version: Versija - field_type: Tips - field_host: Hosts - field_port: Ports - field_account: Konts - field_base_dn: Base DN - field_attr_login: Pieslēgšanās atribūts - field_attr_firstname: Vārda atribūts - field_attr_lastname: Uzvārda atribūts - field_attr_mail: "E-pasta atribūts" - field_onthefly: "Lietotāja izveidošana on-the-fly" - field_start_date: Sākuma datums - field_done_ratio: % padarīti - field_auth_source: Pilnvarošanas režīms - field_hide_mail: "Paslēpt manu e-pasta adresi" - field_comments: Komentārs - field_url: URL - field_start_page: Sākuma lapa - field_subproject: Apakšprojekts - field_hours: Stundas - field_activity: Aktivitāte - field_spent_on: Datums - field_identifier: Identifikators - field_is_filter: Izmantots kā filtrs - field_issue_to: Saistīts uzdevums - field_delay: Kavējums - field_assignable: Uzdevums var tikt piesaistīts šai lomai - field_redirect_existing_links: Pāradresēt eksistējošās saites - field_estimated_hours: Paredzētais laiks - field_column_names: Kolonnas - field_time_zone: Laika zona - field_searchable: Meklējams - field_default_value: Noklusētā vērtība - field_comments_sorting: Rādīt komentārus - field_parent_title: Vecāka lapa - field_editable: Rediģējams - field_watcher: Vērotājs - field_identity_url: OpenID URL - field_content: Saturs - field_group_by: Grupēt rezultātus pēc - field_sharing: Koplietošana - - setting_app_title: Programmas nosaukums - setting_app_subtitle: Programmas apakš-nosaukums - setting_welcome_text: Sveiciena teksts - setting_default_language: Noklusētā valoda - setting_login_required: Nepieciešama pilnvarošana - setting_self_registration: Pašreģistrēšanās - setting_attachment_max_size: Pielikuma maksimālais izmērs - setting_issues_export_limit: Uzdevumu eksporta ierobežojums - setting_mail_from: "E-pasta adrese informācijas nosūtīšanai" - setting_bcc_recipients: "Saņēmēju adreses neparādīsies citu saņēmēju vēstulēs (bcc)" - setting_plain_text_mail: "Vēstule brīvā tekstā (bez HTML)" - setting_host_name: Hosta nosaukums un piekļuves ceļš - setting_text_formatting: Teksta formatēšana - setting_wiki_compression: Wiki vēstures saspiešana - setting_feeds_limit: Barotnes satura ierobežojums - setting_default_projects_public: Jaunie projekti noklusēti ir publiski pieejami - setting_autofetch_changesets: "Automātiski lietot jaunāko versiju, pieslēdzoties repozitorijam (Autofetch)" - setting_sys_api_enabled: Ieslēgt WS repozitoriju menedžmentam - setting_commit_ref_keywords: Norādes atslēgvārdi - setting_commit_fix_keywords: Fiksējošie atslēgvārdi - setting_autologin: Automātiskā pieslēgšanās - setting_date_format: Datuma formāts - setting_time_format: Laika formāts - setting_cross_project_issue_relations: "Atļaut starp-projektu uzdevumu relācijas" - setting_issue_list_default_columns: Noklusēti rādītās kolonnas uzdevumu sarakstā - setting_repositories_encodings: Repozitoriju kodējumi - setting_commit_logs_encoding: Kodēt ziņojumus - setting_emails_footer: "E-pastu kājene" - setting_protocol: Protokols - setting_per_page_options: Objekti vienā lapā - setting_user_format: Lietotāju rādīšanas formāts - setting_activity_days_default: Dienus skaits aktivitāšu rādīšanai aktivitāšu sadaļā - setting_display_subprojects_issues: Rādīt apakšprojekta uzdevumus galvenajā projektā pēc noklusējuma - setting_enabled_scm: Lietot SCM - setting_mail_handler_body_delimiters: "Saīsināt pēc vienas no šim rindām" - setting_mail_handler_api_enabled: "Lietot WS ienākošajiem e-pastiem" - setting_mail_handler_api_key: API atslēga - setting_sequential_project_identifiers: Ģenerēt secīgus projektu identifikatorus - setting_gravatar_enabled: Izmantot Gravatar lietotāju ikonas - setting_gravatar_default: Noklusētais Gravatar attēls - setting_diff_max_lines_displayed: Maksimālais rādīto diff rindu skaits - setting_file_max_size_displayed: Maksimālais izmērs iekļautajiem teksta failiem - setting_repository_log_display_limit: Maksimālais žurnāla datnē rādīto revīziju skaits - setting_openid: Atļaut OpenID pieslēgšanos un reģistrēšanos - setting_password_min_length: Minimālais paroles garums - setting_new_project_user_role_id: Loma, kura tiek piešķirta ne-administratora lietotājam, kurš izveido projektu - setting_default_projects_modules: Noklusētie lietotie moduļi jaunam projektam - setting_issue_done_ratio: Aprēķināt uzdevuma izpildes koeficientu ar - setting_issue_done_ratio_issue_field: uzdevuma lauku - setting_issue_done_ratio_issue_status: uzdevuma statusu - setting_start_of_week: Sākt kalendāru ar - setting_rest_api_enabled: Lietot REST web-servisu - setting_cache_formatted_text: Kešot formatētu tekstu - - permission_add_project: Izveidot projektu - permission_add_subprojects: Izveidot apakšprojektu - permission_edit_project: Rediģēt projektu - permission_select_project_modules: Izvēlēties projekta moduļus - permission_manage_members: Pārvaldīt dalībniekus - permission_manage_project_activities: Pārvaldīt projekta aktivitātes - permission_manage_versions: Pārvaldīt versijas - permission_manage_categories: Pārvaldīt uzdevumu kategorijas - permission_view_issues: Apskatīt uzdevumus - permission_add_issues: Pievienot uzdevumus - permission_edit_issues: Rediģēt uzdevumus - permission_manage_issue_relations: Pārvaldīt uzdevumu relācijas - permission_add_issue_notes: Pievienot piezīmes - permission_edit_issue_notes: Rediģēt piezīmes - permission_edit_own_issue_notes: Rediģēt paša piezīmes - permission_move_issues: Pārvietot uzdevumus - permission_delete_issues: Dzēst uzdevumus - permission_manage_public_queries: Pārvaldīt publiskos pieprasījumus - permission_save_queries: Saglabāt pieprasījumus - permission_view_gantt: Skatīt Ganta diagrammu - permission_view_calendar: Skatīt kalendāru - permission_view_issue_watchers: Skatīt vērotāju sarakstu - permission_add_issue_watchers: Pievienot vērotājus - permission_delete_issue_watchers: Dzēst vērotājus - permission_log_time: Piereģistrēt pavadīto laiku - permission_view_time_entries: Skatīt pavadīto laiku - permission_edit_time_entries: Rdiģēt laika reģistrus - permission_edit_own_time_entries: Rediģēt savus laika reģistrus - permission_manage_news: Pārvaldīt jaunumus - permission_comment_news: Komentēt jaunumus - permission_manage_documents: Pārvaldīt dokumentus - permission_view_documents: Skatīt dokumentus - permission_manage_files: Pārvaldīt failus - permission_view_files: Skatīt failus - permission_manage_wiki: Pārvaldīt wiki - permission_rename_wiki_pages: Pārsaukt wiki lapas - permission_delete_wiki_pages: Dzēst wiki lapas - permission_view_wiki_pages: Skatīt wiki - permission_view_wiki_edits: Skatīt wiki vēsturi - permission_edit_wiki_pages: Rdiģēt wiki lapas - permission_delete_wiki_pages_attachments: Dzēst pielikumus - permission_protect_wiki_pages: Projekta wiki lapas - permission_manage_repository: Pārvaldīt repozitoriju - permission_browse_repository: Pārlūkot repozitoriju - permission_view_changesets: Skatīt izmaiņu kopumus - permission_commit_access: Atļaut piekļuvi - permission_manage_boards: Pārvaldīt ziņojumu dēļus - permission_view_messages: Skatīt ziņas - permission_add_messages: Publicēt ziņas - permission_edit_messages: Rediģēt ziņas - permission_edit_own_messages: Rediģēt savas ziņas - permission_delete_messages: Dzēst ziņas - permission_delete_own_messages: Dzēst savas ziņas - permission_export_wiki_pages: Eksportēt Wiki lapas - - project_module_issue_tracking: Uzdevumu uzskaite - project_module_time_tracking: Laika uzskaite - project_module_news: Jaunumi - project_module_documents: Dokumenti - project_module_files: Datnes - project_module_wiki: Wiki - project_module_repository: Repozitorijs - project_module_boards: Ziņojumu dēļi - - label_user: Lietotājs - label_user_plural: Lietotāji - label_user_new: Jauns lietotājs - label_user_anonymous: Anonīms - label_project: Projekts - label_project_new: Jauns projekts - label_project_plural: Projekti - label_x_projects: - zero: nav projektu - one: 1 projekts - other: "%{count} projekti" - label_project_all: Visi projekti - label_project_latest: Jaunākie projekti - label_issue: Uzdevums - label_issue_new: Jauns uzdevums - label_issue_plural: Uzdevumi - label_issue_view_all: Skatīt visus uzdevumus - label_issues_by: "Kārtot pēc %{value}" - label_issue_added: Uzdevums pievienots - label_issue_updated: Uzdevums atjaunots - label_document: Dokuments - label_document_new: Jauns dokuments - label_document_plural: Dokumenti - label_document_added: Dokuments pievienots - label_role: Loma - label_role_plural: Lomas - label_role_new: Jauna loma - label_role_and_permissions: Lomas un atļaujas - label_member: Dalībnieks - label_member_new: Jauns dalībnieks - label_member_plural: Dalībnieki - label_tracker: Trakeris - label_tracker_plural: Trakeri - label_tracker_new: Jauns trakeris - label_workflow: Darba gaita - label_issue_status: Uzdevuma statuss - label_issue_status_plural: Uzdevumu statusi - label_issue_status_new: Jauns statuss - label_issue_category: Uzdevuma kategorija - label_issue_category_plural: Uzdevumu kategorijas - label_issue_category_new: Jauna kategorija - label_custom_field: Pielāgojams lauks - label_custom_field_plural: Pielāgojami lauki - label_custom_field_new: Jauns pielāgojams lauks - label_enumerations: Uzskaitījumi - label_enumeration_new: Jauna vērtība - label_information: Informācija - label_information_plural: Informācija - label_please_login: Lūdzu pieslēdzieties - label_register: Reģistrēties - label_login_with_open_id_option: vai pieslēgties ar OpenID - label_password_lost: Nozaudēta parole - label_home: Sākums - label_my_page: Mana lapa - label_my_account: Mans konts - label_my_projects: Mani projekti - label_administration: Administrācija - label_login: Pieslēgties - label_logout: Atslēgties - label_help: Palīdzība - label_reported_issues: Ziņotie uzdevumi - label_assigned_to_me_issues: Man piesaistītie uzdevumi - label_last_login: Pēdējā pieslēgšanās - label_registered_on: Reģistrējies - label_activity: Aktivitāte - label_overall_activity: Kopējās aktivitātes - label_user_activity: "Lietotāja %{value} aktivitātes" - label_new: Jauns - label_logged_as: Pieslēdzies kā - label_environment: Vide - label_authentication: Pilnvarošana - label_auth_source: Pilnvarošanas režīms - label_auth_source_new: Jauns pilnvarošanas režīms - label_auth_source_plural: Pilnvarošanas režīmi - label_subproject_plural: Apakšprojekti - label_subproject_new: Jauns apakšprojekts - label_and_its_subprojects: "%{value} un tā apakšprojekti" - label_min_max_length: Minimālais - Maksimālais garums - label_list: Saraksts - label_date: Datums - label_integer: Vesels skaitlis - label_float: Decimālskaitlis - label_boolean: Patiesuma vērtība - label_string: Teksts - label_text: Garš teksts - label_attribute: Atribūts - label_attribute_plural: Atribūti - label_download: "%{count} Lejupielāde" - label_download_plural: "%{count} Lejupielādes" - label_no_data: Nav datu, ko parādīt - label_change_status: Mainīt statusu - label_history: Vēsture - label_attachment: Pielikums - label_attachment_new: Jauns pielikums - label_attachment_delete: Dzēst pielikumu - label_attachment_plural: Pielikumi - label_file_added: Lauks pievienots - label_report: Atskaite - label_report_plural: Atskaites - label_news: Ziņa - label_news_new: Pievienot ziņu - label_news_plural: Ziņas - label_news_latest: Jaunākās ziņas - label_news_view_all: Skatīt visas ziņas - label_news_added: Ziņas pievienotas - label_settings: Iestatījumi - label_overview: Pārskats - label_version: Versija - label_version_new: Jauna versija - label_version_plural: Versijas - label_close_versions: Aizvērt pabeigtās versijas - label_confirmation: Apstiprinājums - label_export_to: 'Pieejams arī:' - label_read: Lasīt... - label_public_projects: Publiskie projekti - label_open_issues: atvērts - label_open_issues_plural: atvērti - label_closed_issues: slēgts - label_closed_issues_plural: slēgti - label_x_open_issues_abbr_on_total: - zero: 0 atvērti / %{total} - one: 1 atvērts / %{total} - other: "%{count} atvērti / %{total}" - label_x_open_issues_abbr: - zero: 0 atvērti - one: 1 atvērts - other: "%{count} atvērti" - label_x_closed_issues_abbr: - zero: 0 slēgti - one: 1 slēgts - other: "%{count} slēgti" - label_total: Kopā - label_permissions: Atļaujas - label_current_status: Pašreizējais statuss - label_new_statuses_allowed: Jauni statusi atļauti - label_all: visi - label_none: neviens - label_nobody: nekas - label_next: Nākošais - label_previous: Iepriekšējais - label_used_by: Izmanto - label_details: Detaļas - label_add_note: Pievienot piezīmi - label_per_page: katrā lapā - label_calendar: Kalendārs - label_months_from: mēneši no - label_gantt: Ganta diagramma - label_internal: Iekšējais - label_last_changes: "pēdējās %{count} izmaiņas" - label_change_view_all: Skatīt visas izmaiņas - label_personalize_page: Pielāgot šo lapu - label_comment: Komentārs - label_comment_plural: Komentāri - label_x_comments: - zero: nav komentāru - one: 1 komentārs - other: "%{count} komentāri" - label_comment_add: Pievienot komentāru - label_comment_added: Komentārs pievienots - label_comment_delete: Dzēst komentārus - label_query: Pielāgots pieprasījums - label_query_plural: Pielāgoti pieprasījumi - label_query_new: Jauns pieprasījums - label_filter_add: Pievienot filtru - label_filter_plural: Filtri - label_equals: ir - label_not_equals: nav - label_in_less_than: ir mazāk kā - label_in_more_than: ir vairāk kā - label_greater_or_equal: '>=' - label_less_or_equal: '<=' - label_in: iekš - label_today: šodien - label_all_time: visu laiku - label_yesterday: vakar - label_this_week: šonedēļ - label_last_week: pagājušo šonedēļ - label_last_n_days: "pēdējās %{count} dienas" - label_this_month: šomēnes - label_last_month: pagājušo mēnes - label_this_year: šogad - label_date_range: Datumu apgabals - label_less_than_ago: mazāk kā dienas iepriekš - label_more_than_ago: vairāk kā dienas iepriekš - label_ago: dienas iepriekš - label_contains: satur - label_not_contains: nesatur - label_day_plural: dienas - label_repository: Repozitorijs - label_repository_plural: Repozitoriji - label_browse: Pārlūkot - label_modification: "%{count} izmaiņa" - label_modification_plural: "%{count} izmaiņas" - label_branch: Zars - label_tag: Birka - label_revision: Revīzija - label_revision_plural: Revīzijas - label_revision_id: "Revīzija %{value}" - label_associated_revisions: Saistītās revīzijas - label_added: pievienots - label_modified: modificēts - label_copied: nokopēts - label_renamed: pārsaukts - label_deleted: dzēsts - label_latest_revision: Pēdējā revīzija - label_latest_revision_plural: Pēdējās revīzijas - label_view_revisions: Skatīt revīzijas - label_view_all_revisions: Skatīt visas revīzijas - label_max_size: Maksimālais izmērs - label_sort_highest: Pārvietot uz augšu - label_sort_higher: Pārvietot soli augšup - label_sort_lower: Pārvietot uz leju - label_sort_lowest: Pārvietot vienu soli uz leju - label_roadmap: Ceļvedis - label_roadmap_due_in: "Sagaidāms pēc %{value}" - label_roadmap_overdue: "nokavēts %{value}" - label_roadmap_no_issues: Šai versijai nav uzdevumu - label_search: Meklēt - label_result_plural: Rezultāti - label_all_words: Visi vārdi - label_wiki: Wiki - label_wiki_edit: Wiki labojums - label_wiki_edit_plural: Wiki labojumi - label_wiki_page: Wiki lapa - label_wiki_page_plural: Wiki lapas - label_index_by_title: Indeksēt pēc nosaukuma - label_index_by_date: Indeksēt pēc datuma - label_current_version: Tekošā versija - label_preview: Priekšskatījums - label_feed_plural: Barotnes - label_changes_details: Visu izmaiņu detaļas - label_issue_tracking: Uzdevumu uzskaite - label_spent_time: Pavadītais laiks - label_f_hour: "%{value} stunda" - label_f_hour_plural: "%{value} stundas" - label_time_tracking: Laika uzskaite - label_change_plural: Izmaiņas - label_statistics: Statistika - label_commits_per_month: Nodevumi mēnesī - label_commits_per_author: Nodevumi no autora - label_view_diff: Skatīt atšķirības - label_diff_inline: iekļauts - label_diff_side_by_side: blakus - label_options: Opcijas - label_copy_workflow_from: Kopēt darba plūsmu no - label_permissions_report: Atļauju atskaite - label_watched_issues: Vērotie uzdevumi - label_related_issues: Saistītie uzdevumi - label_applied_status: Piešķirtais statuss - label_loading: Lādējas... - label_relation_new: Jauna relācija - label_relation_delete: Dzēst relāciju - label_relates_to: saistīts ar - label_duplicates: dublikāti - label_duplicated_by: dublējas ar - label_blocks: bloķē - label_blocked_by: nobloķējis - label_precedes: pirms - label_follows: seko - label_end_to_start: no beigām uz sākumu - label_end_to_end: no beigām uz beigām - label_start_to_start: no sākuma uz sākumu - label_start_to_end: no sākuma uz beigām - label_stay_logged_in: Atcerēties mani - label_disabled: izslēgts - label_show_completed_versions: Rādīt pabeigtās versijas - label_me: es - label_board: Forums - label_board_new: Jauns forums - label_board_plural: Forumi - label_board_locked: Slēgts - label_board_sticky: Svarīgs - label_topic_plural: Tēmas - label_message_plural: Ziņas - label_message_last: Pēdējā ziņa - label_message_new: Jauna ziņa - label_message_posted: Ziņa pievienota - label_reply_plural: Atbildes - label_send_information: Sūtīt konta informāciju lietotājam - label_year: Gads - label_month: Mēnesis - label_week: Nedēļa - label_date_from: No - label_date_to: Kam - label_language_based: Izmantot lietotāja valodu - label_sort_by: "Kārtot pēc %{value}" - label_send_test_email: "Sūtīt testa e-pastu" - label_feeds_access_key: RSS piekļuves atslēga - label_missing_feeds_access_key: Trūkst RSS piekļuves atslēgas - label_feeds_access_key_created_on: "RSS piekļuves atslēga izveidota pirms %{value}" - label_module_plural: Moduļi - label_added_time_by: "Pievienojis %{author} pirms %{age}" - label_updated_time_by: "Atjaunojis %{author} pirms %{age}" - label_updated_time: "Atjaunots pirms %{value}" - label_jump_to_a_project: Pāriet uz projektu... - label_file_plural: Datnes - label_changeset_plural: Izmaiņu kopumi - label_default_columns: Noklusētās kolonnas - label_no_change_option: (Nav izmaiņu) - label_bulk_edit_selected_issues: Labot visus izvēlētos uzdevumus - label_theme: Tēma - label_default: Noklusēts - label_search_titles_only: Meklēt tikai nosaukumos - label_user_mail_option_all: "Par visiem notikumiem visos manos projektos" - label_user_mail_option_selected: "Par visiem notikumiem tikai izvēlētajos projektos..." - label_user_mail_no_self_notified: "Neziņot man par izmaiņām, kuras veicu es pats" - label_registration_activation_by_email: "konta aktivizācija caur e-pastu" - label_registration_manual_activation: manuālā konta aktivizācija - label_registration_automatic_activation: automātiskā konta aktivizācija - label_display_per_page: "Rādīt vienā lapā: %{value}" - label_age: Vecums - label_change_properties: Mainīt atribūtus - label_general: Galvenais - label_more: Vēl - label_scm: SCM - label_plugins: Spraudņi - label_ldap_authentication: LDAP pilnvarošana - label_downloads_abbr: L-lād. - label_optional_description: "Apraksts (neobligāts)" - label_add_another_file: Pievienot citu failu - label_preferences: Priekšrocības - label_chronological_order: Hronoloģiskā kārtībā - label_reverse_chronological_order: Apgriezti hronoloģiskā kārtībā - label_planning: Plānošana - label_incoming_emails: "Ienākošie e-pasti" - label_generate_key: Ģenerēt atslēgu - label_issue_watchers: Vērotāji - label_example: Piemērs - label_display: Rādīt - label_sort: Kārtot - label_ascending: Augoši - label_descending: Dilstoši - label_date_from_to: "No %{start} līdz %{end}" - label_wiki_content_added: Wiki lapa pievienota - label_wiki_content_updated: Wiki lapa atjaunota - label_group: Grupa - label_group_plural: Grupas - label_group_new: Jauna grupa - label_time_entry_plural: Pavadītais laiks - label_version_sharing_none: Nav koplietošanai - label_version_sharing_descendants: Ar apakšprojektiem - label_version_sharing_hierarchy: Ar projektu hierarhiju - label_version_sharing_tree: Ar projekta koku - label_version_sharing_system: Ar visiem projektiem - label_update_issue_done_ratios: Atjaunot uzdevuma veikuma attiecību - label_copy_source: Avots - label_copy_target: Mērķis - label_copy_same_as_target: Tāds pats kā mērķis - label_display_used_statuses_only: "Rādīt tikai statusus, ko lieto šis trakeris" - label_api_access_key: API pieejas atslēga - label_missing_api_access_key: Trūkst API pieejas atslēga - label_api_access_key_created_on: "API pieejas atslēga izveidota pirms %{value}" - - button_login: Pieslēgties - button_submit: Nosūtīt - button_save: Saglabāt - button_check_all: Atzīmēt visu - button_uncheck_all: Noņemt visus atzīmējumus - button_delete: Dzēst - button_create: Izveidot - button_create_and_continue: Izveidot un turpināt - button_test: Testēt - button_edit: Labot - button_add: Pievienot - button_change: Mainīt - button_apply: Apstiprināt - button_clear: Notīrīt - button_lock: Slēgt - button_unlock: Atslēgt - button_download: Lejuplādēt - button_list: Saraksts - button_view: Skats - button_move: Pārvietot - button_move_and_follow: Pārvietot un sekot - button_back: Atpakaļ - button_cancel: Atcelt - button_activate: Aktivizēt - button_sort: Kārtot - button_log_time: Ilgs laiks - button_rollback: Atjaunot uz šo versiju - button_watch: Vērot - button_unwatch: Nevērot - button_reply: Atbildēt - button_archive: Arhivēt - button_unarchive: Atarhivēt - button_reset: Atiestatīt - button_rename: Pārsaukt - button_change_password: Mainīt paroli - button_copy: Kopēt - button_copy_and_follow: Kopēt un sekot - button_annotate: Pierakstīt paskaidrojumu - button_update: Atjaunot - button_configure: Konfigurēt - button_quote: Citāts - button_duplicate: Dublēt - button_show: Rādīt - - status_active: aktīvs - status_registered: reģistrēts - status_locked: slēgts - - version_status_open: atvērta - version_status_locked: slēgta - version_status_closed: aizvērta - - field_active: Aktīvs - - text_select_mail_notifications: "Izvēlieties darbības, par kurām vēlaties saņemt ziņojumus e-pastā" - text_regexp_info: "piem. ^[A-Z0-9]+$" - text_min_max_length_info: "0 nozīmē, ka nav ierobežojumu" - text_project_destroy_confirmation: "Vai tiešām vēlaties dzēst šo projektu un ar to saistītos datus?" - text_subprojects_destroy_warning: "Tā apakšprojekts(i): %{value} arī tiks dzēsts(i)." - text_workflow_edit: Lai labotu darba plūsmu, izvēlieties lomu un trakeri - text_are_you_sure: "Vai esat pārliecināts?" - text_journal_changed: "%{label} mainīts no %{old} uz %{new}" - text_journal_set_to: "%{label} iestatīts uz %{value}" - text_journal_deleted: "%{label} dzēsts (%{old})" - text_journal_added: "%{label} %{value} pievienots" - text_tip_issue_begin_day: uzdevums sākas šodien - text_tip_issue_end_day: uzdevums beidzas šodien - text_tip_issue_begin_end_day: uzdevums sākas un beidzas šodien - text_project_identifier_info: 'Only lower case letters (a-z), numbers, dashes and underscores are allowed.
Once saved, the identifier can not be changed.' - text_caracters_maximum: "%{count} simboli maksimāli." - text_caracters_minimum: "Jābūt vismaz %{count} simbolu garumā." - text_length_between: "Garums starp %{min} un %{max} simboliem." - text_tracker_no_workflow: Šim trakerim nav definēta darba plūsma - text_unallowed_characters: Neatļauti simboli - text_comma_separated: "Atļautas vairākas vērtības (atdalīt ar komatu)." - text_line_separated: "Atļautas vairākas vērtības (rakstīt katru savā rindā)." - text_issues_ref_in_commit_messages: "Izmaiņu salīdzināšana izejot no ziņojumiem" - text_issue_added: "Uzdevumu %{id} pievienojis %{author}." - text_issue_updated: "Uzdevumu %{id} atjaunojis %{author}." - text_wiki_destroy_confirmation: "Vai esat drošs, ka vēlaties dzēst šo wiki un visu tās saturu?" - text_issue_category_destroy_question: "Daži uzdevumi (%{count}) ir nozīmēti šai kategorijai. Ko Jūs vēlaties darīt?" - text_issue_category_destroy_assignments: Dzēst kategoriju nozīmējumus - text_issue_category_reassign_to: Nozīmēt uzdevumus šai kategorijai - text_user_mail_option: "No neizvēlētajiem projektiem Jūs saņemsiet ziņojumus e-pastā tikai par notikumiem, kuriem Jūs sekojat vai kuros esat iesaistīts." - text_no_configuration_data: "Lomas, trakeri, uzdevumu statusi un darba plūsmas vēl nav konfigurētas.\nĻoti ieteicams ielādēt noklusēto konfigurāciju. Pēc ielādēšanas to būs iespējams modificēt." - text_load_default_configuration: Ielādēt noklusēto konfigurāciju - text_status_changed_by_changeset: "Apstiprināts izmaiņu kopumā %{value}." - text_issues_destroy_confirmation: 'Vai tiešām vēlaties dzēst izvēlēto uzdevumu(us)?' - text_select_project_modules: 'Izvēlieties moduļus šim projektam:' - text_default_administrator_account_changed: Noklusētais administratora konts mainīts - text_file_repository_writable: Pielikumu direktorijā atļauts rakstīt - text_plugin_assets_writable: Spraudņu kataloga direktorijā atļauts rakstīt - text_rmagick_available: "RMagick pieejams (neobligāts)" - text_destroy_time_entries_question: "%{hours} stundas tika ziņotas par uzdevumu, ko vēlaties dzēst. Ko darīt?" - text_destroy_time_entries: Dzēst ziņotās stundas - text_assign_time_entries_to_project: Piešķirt ziņotās stundas projektam - text_reassign_time_entries: 'Piešķirt ziņotās stundas uzdevumam:' - text_user_wrote: "%{value} rakstīja:" - text_enumeration_destroy_question: "%{count} objekti ir piešķirti šai vērtībai." - text_enumeration_category_reassign_to: 'Piešķirt tos šai vērtībai:' - text_email_delivery_not_configured: "E-pastu nosūtīšana nav konfigurēta, un ziņojumi ir izslēgti.\nKonfigurējiet savu SMTP serveri datnē config/configuration.yml un pārstartējiet lietotni." - text_repository_usernames_mapping: "Izvēlieties vai atjaunojiet Redmine lietotāju, saistītu ar katru lietotājvārdu, kas atrodams repozitorija žurnālā.\nLietotāji ar to pašu Redmine un repozitorija lietotājvārdu būs saistīti automātiski." - text_diff_truncated: '... Šis diff tika nošķelts, jo tas pārsniedz maksimālo izmēru, ko var parādīt.' - text_custom_field_possible_values_info: 'Katra vērtības savā rindā' - text_wiki_page_destroy_question: "Šij lapai ir %{descendants} apakšlapa(as) un pēcnācēji. Ko darīt?" - text_wiki_page_nullify_children: "Paturēt apakšlapas kā pamatlapas" - text_wiki_page_destroy_children: "Dzēst apakšlapas un visus pēcnācējus" - text_wiki_page_reassign_children: "Piešķirt apakšlapas šai lapai" - text_own_membership_delete_confirmation: "Jūs tūlīt dzēsīsiet dažas vai visas atļaujas, un Jums pēc tam var nebūt atļauja labot šo projektu.\nVai turpināt?" - - default_role_manager: Menedžeris - default_role_developer: Izstrādātājs - default_role_reporter: Ziņotājs - default_role_non_member: Non member - default_role_anonymous: Anonymous - default_tracker_bug: Kļūda - default_tracker_feature: Iezīme - default_tracker_support: Atbalsts - default_issue_status_new: Jauns - default_issue_status_in_progress: Attīstībā - default_issue_status_resolved: Atrisināts - default_issue_status_feedback: Atsauksmes - default_issue_status_closed: Slēgts - default_issue_status_rejected: Noraidīts - default_doc_category_user: Lietotāja dokumentācija - default_doc_category_tech: Tehniskā dokumentācija - default_priority_low: Zema - default_priority_normal: Normāla - default_priority_high: Augsta - default_priority_urgent: Steidzama - default_priority_immediate: Tūlītēja - default_activity_design: Dizains - default_activity_development: Izstrādāšana - - enumeration_issue_priorities: Uzdevumu prioritātes - enumeration_doc_categories: Dokumentu kategorijas - enumeration_activities: Aktivitātes (laika uzskaite) - enumeration_system_activity: Sistēmas aktivitātes - - error_can_not_delete_custom_field: Unable to delete custom field - permission_manage_subtasks: Manage subtasks - label_profile: Profile - error_unable_to_connect: Unable to connect (%{value}) - error_can_not_remove_role: This role is in use and can not be deleted. - field_parent_issue: Parent task - error_unable_delete_issue_status: Unable to delete issue status - label_subtask_plural: Subtasks - error_can_not_delete_tracker: This tracker contains issues and can't be deleted. - label_project_copy_notifications: Send email notifications during the project copy - field_principal: Principal - label_my_page_block: My page block - notice_failed_to_save_members: "Failed to save member(s): %{errors}." - text_zoom_out: Zoom out - text_zoom_in: Zoom in - notice_unable_delete_time_entry: Unable to delete time log entry. - label_overall_spent_time: Overall spent time - field_time_entries: Log time - project_module_gantt: Gantt - project_module_calendar: Calendar - button_edit_associated_wikipage: "Edit associated Wiki page: %{page_title}" - text_are_you_sure_with_children: Delete issue and all child issues? - field_text: Text field - label_user_mail_option_only_owner: Only for things I am the owner of - setting_default_notification_option: Default notification option - label_user_mail_option_only_my_events: Only for things I watch or I'm involved in - label_user_mail_option_only_assigned: Only for things I am assigned to - label_user_mail_option_none: No events - field_member_of_group: Assignee's group - field_assigned_to_role: Assignee's role - notice_not_authorized_archived_project: The project you're trying to access has been archived. - label_principal_search: "Search for user or group:" - label_user_search: "Search for user:" - field_visible: Visible - setting_emails_header: Emails header - setting_commit_logtime_activity_id: Activity for logged time - text_time_logged_by_changeset: Applied in changeset %{value}. - setting_commit_logtime_enabled: Enable time logging - notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max}) - setting_gantt_items_limit: Maximum number of items displayed on the gantt chart - text_powered_by: Powered by %{link} +# translated by Dzintars Bergs (dzintars.bergs@gmail.com) + +lv: + direction: ltr + date: + formats: + default: "%d.%m.%Y" + short: "%d %b" + long: "%d %B %Y" + + day_names: [Svētdiena, Pirmdiena, Otrdiena, Trešdiena, Ceturtdiena, Piektdiena, Sestdiena] + abbr_day_names: [Sv, Pr, Ot, Tr, Ct, Pk, St] + + month_names: [~, Janvāris, Februāris, Marts, Aprīlis , Maijs, Jūnijs, Jūlijs, Augusts, Septembris, Oktobris, Novembris, Decembris] + abbr_month_names: [~, Jan, Feb, Mar, Apr, Mai, Jūn, Jūl, Aug, Sep, Okt, Nov, Dec] + order: + - :day + - :month + - :year + + time: + formats: + default: "%a, %d %b %Y, %H:%M:%S %z" + time: "%H:%M" + short: "%d %b, %H:%M" + long: "%B %d, %Y %H:%M" + am: "rītā" + pm: "vakarā" + + datetime: + distance_in_words: + half_a_minute: "pus minūte" + less_than_x_seconds: + one: "mazāk kā 1 sekunde" + other: "mazāk kā %{count} sekundes" + x_seconds: + one: "1 sekunde" + other: "%{count} sekundes" + less_than_x_minutes: + one: "mazāk kā minūte" + other: "mazāk kā %{count} minūtes" + x_minutes: + one: "1 minūte" + other: "%{count} minūtes" + about_x_hours: + one: "aptuveni 1 stunda" + other: "aptuveni %{count} stundas" + x_days: + one: "1 diena" + other: "%{count} dienas" + about_x_months: + one: "aptuveni 1 mēnesis" + other: "aptuveni %{count} mēneši" + x_months: + one: "1 mēnesis" + other: "%{count} mēneši" + about_x_years: + one: "aptuveni 1 gads" + other: "aptuveni %{count} gadi" + over_x_years: + one: "ilgāk par 1 gadu" + other: "ilgāk par %{count} gadiem" + almost_x_years: + one: "gandrīz 1 gadu" + other: "gandrīz %{count} gadus" + + number: + format: + separator: "." + delimiter: "" + precision: 3 + human: + format: + delimiter: " " + precision: 1 + storage_units: + format: "%n %u" + units: + byte: + one: "Baits" + other: "Baiti" + kb: "KB" + mb: "MB" + gb: "GB" + tb: "TB" + + + support: + array: + sentence_connector: "un" + skip_last_comma: false + + activerecord: + errors: + template: + header: + one: "1 error prohibited this %{model} from being saved" + other: "%{count} errors prohibited this %{model} from being saved" + messages: + inclusion: "nav iekļauts sarakstā" + exclusion: "ir rezervēts" + invalid: "nederīgs" + confirmation: "apstiprinājums nesakrīt" + accepted: "jābūt akceptētam" + empty: "nevar būt tukšs" + blank: "nevar būt neaizpildīts" + too_long: "ir pārāk gara(š) (maksimālais garums ir %{count} simboli)" + too_short: "ir pārāk īsa(s) (minimālais garums ir %{count} simboli)" + wrong_length: "ir nepareiza garuma (vajadzētu būt %{count} simboli)" + taken: "eksistē" + not_a_number: "nav skaitlis" + not_a_date: "nav derīgs datums" + greater_than: "jābūt lielākam par %{count}" + greater_than_or_equal_to: "jābūt lielākam vai vienādam ar %{count}" + equal_to: "jābūt vienādam ar %{count}" + less_than: "jābūt mazākam kā %{count}" + less_than_or_equal_to: "jābūt mazākam vai vienādam ar %{count}" + odd: "jāatšķirās" + even: "jāsakrīt" + greater_than_start_date: "jābūt vēlākam par sākuma datumu" + not_same_project: "nepieder pie tā paša projekta" + circular_dependency: "Šī relācija radītu ciklisku atkarību" + cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks" + + actionview_instancetag_blank_option: Izvēlieties + + general_text_No: 'Nē' + general_text_Yes: 'Jā' + general_text_no: 'nē' + general_text_yes: 'jā' + general_lang_name: 'Latvian (Latviešu)' + general_csv_separator: ',' + general_csv_decimal_separator: '.' + general_csv_encoding: UTF-8 + general_pdf_encoding: UTF-8 + general_first_day_of_week: '1' + + notice_account_updated: Konts tika atjaunots veiksmīgi. + notice_account_invalid_creditentials: Nepareizs lietotāja vārds vai parole. + notice_account_password_updated: Parole tika veiksmīgi atjaunota. + notice_account_wrong_password: Nepareiza parole + notice_account_register_done: Konts veiksmīgi izveidots. Lai aktivizētu kontu, spiediet uz saites, kas Jums tika nosūtīta. + notice_account_unknown_email: Nezināms lietotājs + notice_can_t_change_password: Šis konts izmanto ārēju pilnvarošanas avotu. Nav iespējams nomainīt paroli. + notice_account_lost_email_sent: Jums tika nosūtīts e-pasts ar instrukcijām, kā izveidot jaunu paroli. + notice_account_activated: Jūsu konts ir aktivizēts. Varat pieslēgties sistēmai. + notice_successful_create: Veiksmīga izveide. + notice_successful_update: Veiksmīga atjaunošana. + notice_successful_delete: Veiksmīga dzēšana. + notice_successful_connection: Veiksmīgs savienojums. + notice_file_not_found: Lapa, ko Jūs mēģināt atvērt, neeksistē vai ir pārvietota. + notice_locking_conflict: Datus ir atjaunojis cits lietotājs. + notice_not_authorized: Jums nav tiesību piekļūt šai lapai. + notice_email_sent: "E-pasts tika nosūtīts uz %{value}" + notice_email_error: "Kļūda sūtot e-pastu (%{value})" + notice_feeds_access_key_reseted: Jūsu RSS pieejas atslēga tika iestatīta sākuma stāvoklī. + notice_api_access_key_reseted: Jūsu API pieejas atslēga tika iestatīta sākuma stāvoklī. + notice_failed_to_save_issues: "Neizdevās saglabāt %{count} uzdevumu(us) no %{total} izvēlēti: %{ids}." + notice_no_issue_selected: "Nav izvēlēts uzdevums! Lūdzu, atzīmējiet uzdevumus, kurus vēlaties rediģēt!" + notice_account_pending: "Jūsu konts tika izveidots un šobrīd gaida administratora apstiprinājumu." + notice_default_data_loaded: Noklusētā konfigurācija tika veiksmīgi ielādēta. + notice_unable_delete_version: Neizdevās dzēst versiju. + notice_issue_done_ratios_updated: Uzdevuma izpildes koeficients atjaunots. + + error_can_t_load_default_data: "Nevar ielādēt noklusētos konfigurācijas datus: %{value}" + error_scm_not_found: "Ieraksts vai versija nebija repozitorijā." + error_scm_command_failed: "Mēģinot piekļūt repozitorijam, notika kļūda: %{value}" + error_scm_annotate: "Ieraksts neeksistē vai tam nevar tikt pievienots paskaidrojums." + error_issue_not_found_in_project: 'Uzdevums netika atrasts vai nepieder šim projektam.' + error_no_tracker_in_project: 'Neviens trakeris nav saistīts ar šo projektu. Pārbaudiet projekta iestatījumus.' + error_no_default_issue_status: 'Nav definēts uzdevuma noklusētais statuss. Pārbaudiet konfigurāciju (Ejat uz: "Administrācija -> Uzdevumu statusi")!' + error_can_not_reopen_issue_on_closed_version: 'Nevar pievienot atsauksmi uzdevumam, kas saistīts ar slēgtu versiju.' + error_can_not_archive_project: Šis projekts nevar tikt arhivēts + error_issue_done_ratios_not_updated: "Uzdevuma izpildes koeficients nav atjaunots." + error_workflow_copy_source: 'Lūdzu izvēlieties avota trakeri vai lomu' + error_workflow_copy_target: 'Lūdzu izvēlēties mērķa trakeri(us) un lomu(as)' + + warning_attachments_not_saved: "%{count} datnes netika saglabātas." + + mail_subject_lost_password: "Jūsu %{value} parole" + mail_body_lost_password: 'Lai mainītu paroli, spiediet uz šīs saites:' + mail_subject_register: "Jūsu %{value} konta aktivizācija" + mail_body_register: 'Lai izveidotu kontu, spiediet uz šīs saites:' + mail_body_account_information_external: "Varat izmantot Jūsu %{value} kontu, lai pieslēgtos." + mail_body_account_information: Jūsu konta informācija + mail_subject_account_activation_request: "%{value} konta aktivizācijas pieprasījums" + mail_body_account_activation_request: "Jauns lietotājs (%{value}) ir reģistrēts. Lietotāja konts gaida Jūsu apstiprinājumu:" + mail_subject_reminder: "%{count} uzdevums(i) sagaidāms(i) tuvākajās %{days} dienās" + mail_body_reminder: "%{count} uzdevums(i), kurš(i) ir nozīmēts(i) Jums, sagaidāms(i) tuvākajās %{days} dienās:" + mail_subject_wiki_content_added: "'%{id}' Wiki lapa pievienota" + mail_body_wiki_content_added: "The '%{id}' Wiki lapu pievienojis %{author}." + mail_subject_wiki_content_updated: "'%{id}' Wiki lapa atjaunota" + mail_body_wiki_content_updated: "The '%{id}' Wiki lapu atjaunojis %{author}." + + gui_validation_error: 1 kļūda + gui_validation_error_plural: "%{count} kļūdas" + + field_name: Nosaukums + field_description: Apraksts + field_summary: Kopsavilkums + field_is_required: Nepieciešams + field_firstname: Vārds + field_lastname: Uzvārds + field_mail: "E-pasts" + field_filename: Datne + field_filesize: Izmērs + field_downloads: Lejupielādes + field_author: Autors + field_created_on: Izveidots + field_updated_on: Atjaunots + field_field_format: Formāts + field_is_for_all: Visiem projektiem + field_possible_values: Iespējamās vērtības + field_regexp: Regulārā izteiksme + field_min_length: Minimālais garums + field_max_length: Maksimālais garums + field_value: Vērtība + field_category: Kategorija + field_title: Nosaukums + field_project: Projekts + field_issue: Uzdevums + field_status: Statuss + field_notes: Piezīmes + field_is_closed: Uzdevums slēgts + field_is_default: Noklusētā vērtība + field_tracker: Trakeris + field_subject: Temats + field_due_date: Sagaidāmais datums + field_assigned_to: Piešķirts + field_priority: Prioritāte + field_fixed_version: Mērķa versija + field_user: Lietotājs + field_role: Loma + field_homepage: Vietne + field_is_public: Publisks + field_parent: Apakšprojekts projektam + field_is_in_roadmap: Ceļvedī parādītie uzdevumi + field_login: Pieslēgties + field_mail_notification: "E-pasta paziņojumi" + field_admin: Administrators + field_last_login_on: Pēdējo reizi pieslēdzies + field_language: Valoda + field_password: Parole + field_new_password: Janā parole + field_password_confirmation: Paroles apstiprinājums + field_version: Versija + field_type: Tips + field_host: Hosts + field_port: Ports + field_account: Konts + field_base_dn: Base DN + field_attr_login: Pieslēgšanās atribūts + field_attr_firstname: Vārda atribūts + field_attr_lastname: Uzvārda atribūts + field_attr_mail: "E-pasta atribūts" + field_onthefly: "Lietotāja izveidošana on-the-fly" + field_start_date: Sākuma datums + field_done_ratio: "% padarīti" + field_auth_source: Pilnvarošanas režīms + field_hide_mail: "Paslēpt manu e-pasta adresi" + field_comments: Komentārs + field_url: URL + field_start_page: Sākuma lapa + field_subproject: Apakšprojekts + field_hours: Stundas + field_activity: Aktivitāte + field_spent_on: Datums + field_identifier: Identifikators + field_is_filter: Izmantots kā filtrs + field_issue_to: Saistīts uzdevums + field_delay: Kavējums + field_assignable: Uzdevums var tikt piesaistīts šai lomai + field_redirect_existing_links: Pāradresēt eksistējošās saites + field_estimated_hours: Paredzētais laiks + field_column_names: Kolonnas + field_time_zone: Laika zona + field_searchable: Meklējams + field_default_value: Noklusētā vērtība + field_comments_sorting: Rādīt komentārus + field_parent_title: Vecāka lapa + field_editable: Rediģējams + field_watcher: Vērotājs + field_identity_url: OpenID URL + field_content: Saturs + field_group_by: Grupēt rezultātus pēc + field_sharing: Koplietošana + + setting_app_title: Programmas nosaukums + setting_app_subtitle: Programmas apakš-nosaukums + setting_welcome_text: Sveiciena teksts + setting_default_language: Noklusētā valoda + setting_login_required: Nepieciešama pilnvarošana + setting_self_registration: Pašreģistrēšanās + setting_attachment_max_size: Pielikuma maksimālais izmērs + setting_issues_export_limit: Uzdevumu eksporta ierobežojums + setting_mail_from: "E-pasta adrese informācijas nosūtīšanai" + setting_bcc_recipients: "Saņēmēju adreses neparādīsies citu saņēmēju vēstulēs (bcc)" + setting_plain_text_mail: "Vēstule brīvā tekstā (bez HTML)" + setting_host_name: Hosta nosaukums un piekļuves ceļš + setting_text_formatting: Teksta formatēšana + setting_wiki_compression: Wiki vēstures saspiešana + setting_feeds_limit: Barotnes satura ierobežojums + setting_default_projects_public: Jaunie projekti noklusēti ir publiski pieejami + setting_autofetch_changesets: "Automātiski lietot jaunāko versiju, pieslēdzoties repozitorijam (Autofetch)" + setting_sys_api_enabled: Ieslēgt WS repozitoriju menedžmentam + setting_commit_ref_keywords: Norādes atslēgvārdi + setting_commit_fix_keywords: Fiksējošie atslēgvārdi + setting_autologin: Automātiskā pieslēgšanās + setting_date_format: Datuma formāts + setting_time_format: Laika formāts + setting_cross_project_issue_relations: "Atļaut starp-projektu uzdevumu relācijas" + setting_issue_list_default_columns: Noklusēti rādītās kolonnas uzdevumu sarakstā + setting_repositories_encodings: Repozitoriju kodējumi + setting_commit_logs_encoding: Kodēt ziņojumus + setting_emails_footer: "E-pastu kājene" + setting_protocol: Protokols + setting_per_page_options: Objekti vienā lapā + setting_user_format: Lietotāju rādīšanas formāts + setting_activity_days_default: Dienus skaits aktivitāšu rādīšanai aktivitāšu sadaļā + setting_display_subprojects_issues: Rādīt apakšprojekta uzdevumus galvenajā projektā pēc noklusējuma + setting_enabled_scm: Lietot SCM + setting_mail_handler_body_delimiters: "Saīsināt pēc vienas no šim rindām" + setting_mail_handler_api_enabled: "Lietot WS ienākošajiem e-pastiem" + setting_mail_handler_api_key: API atslēga + setting_sequential_project_identifiers: Ģenerēt secīgus projektu identifikatorus + setting_gravatar_enabled: Izmantot Gravatar lietotāju ikonas + setting_gravatar_default: Noklusētais Gravatar attēls + setting_diff_max_lines_displayed: Maksimālais rādīto diff rindu skaits + setting_file_max_size_displayed: Maksimālais izmērs iekļautajiem teksta failiem + setting_repository_log_display_limit: Maksimālais žurnāla datnē rādīto revīziju skaits + setting_openid: Atļaut OpenID pieslēgšanos un reģistrēšanos + setting_password_min_length: Minimālais paroles garums + setting_new_project_user_role_id: Loma, kura tiek piešķirta ne-administratora lietotājam, kurš izveido projektu + setting_default_projects_modules: Noklusētie lietotie moduļi jaunam projektam + setting_issue_done_ratio: Aprēķināt uzdevuma izpildes koeficientu ar + setting_issue_done_ratio_issue_field: uzdevuma lauku + setting_issue_done_ratio_issue_status: uzdevuma statusu + setting_start_of_week: Sākt kalendāru ar + setting_rest_api_enabled: Lietot REST web-servisu + setting_cache_formatted_text: Kešot formatētu tekstu + + permission_add_project: Izveidot projektu + permission_add_subprojects: Izveidot apakšprojektu + permission_edit_project: Rediģēt projektu + permission_select_project_modules: Izvēlēties projekta moduļus + permission_manage_members: Pārvaldīt dalībniekus + permission_manage_project_activities: Pārvaldīt projekta aktivitātes + permission_manage_versions: Pārvaldīt versijas + permission_manage_categories: Pārvaldīt uzdevumu kategorijas + permission_view_issues: Apskatīt uzdevumus + permission_add_issues: Pievienot uzdevumus + permission_edit_issues: Rediģēt uzdevumus + permission_manage_issue_relations: Pārvaldīt uzdevumu relācijas + permission_add_issue_notes: Pievienot piezīmes + permission_edit_issue_notes: Rediģēt piezīmes + permission_edit_own_issue_notes: Rediģēt paša piezīmes + permission_move_issues: Pārvietot uzdevumus + permission_delete_issues: Dzēst uzdevumus + permission_manage_public_queries: Pārvaldīt publiskos pieprasījumus + permission_save_queries: Saglabāt pieprasījumus + permission_view_gantt: Skatīt Ganta diagrammu + permission_view_calendar: Skatīt kalendāru + permission_view_issue_watchers: Skatīt vērotāju sarakstu + permission_add_issue_watchers: Pievienot vērotājus + permission_delete_issue_watchers: Dzēst vērotājus + permission_log_time: Piereģistrēt pavadīto laiku + permission_view_time_entries: Skatīt pavadīto laiku + permission_edit_time_entries: Rdiģēt laika reģistrus + permission_edit_own_time_entries: Rediģēt savus laika reģistrus + permission_manage_news: Pārvaldīt jaunumus + permission_comment_news: Komentēt jaunumus + permission_manage_documents: Pārvaldīt dokumentus + permission_view_documents: Skatīt dokumentus + permission_manage_files: Pārvaldīt failus + permission_view_files: Skatīt failus + permission_manage_wiki: Pārvaldīt wiki + permission_rename_wiki_pages: Pārsaukt wiki lapas + permission_delete_wiki_pages: Dzēst wiki lapas + permission_view_wiki_pages: Skatīt wiki + permission_view_wiki_edits: Skatīt wiki vēsturi + permission_edit_wiki_pages: Rdiģēt wiki lapas + permission_delete_wiki_pages_attachments: Dzēst pielikumus + permission_protect_wiki_pages: Projekta wiki lapas + permission_manage_repository: Pārvaldīt repozitoriju + permission_browse_repository: Pārlūkot repozitoriju + permission_view_changesets: Skatīt izmaiņu kopumus + permission_commit_access: Atļaut piekļuvi + permission_manage_boards: Pārvaldīt ziņojumu dēļus + permission_view_messages: Skatīt ziņas + permission_add_messages: Publicēt ziņas + permission_edit_messages: Rediģēt ziņas + permission_edit_own_messages: Rediģēt savas ziņas + permission_delete_messages: Dzēst ziņas + permission_delete_own_messages: Dzēst savas ziņas + permission_export_wiki_pages: Eksportēt Wiki lapas + + project_module_issue_tracking: Uzdevumu uzskaite + project_module_time_tracking: Laika uzskaite + project_module_news: Jaunumi + project_module_documents: Dokumenti + project_module_files: Datnes + project_module_wiki: Wiki + project_module_repository: Repozitorijs + project_module_boards: Ziņojumu dēļi + + label_user: Lietotājs + label_user_plural: Lietotāji + label_user_new: Jauns lietotājs + label_user_anonymous: Anonīms + label_project: Projekts + label_project_new: Jauns projekts + label_project_plural: Projekti + label_x_projects: + zero: nav projektu + one: 1 projekts + other: "%{count} projekti" + label_project_all: Visi projekti + label_project_latest: Jaunākie projekti + label_issue: Uzdevums + label_issue_new: Jauns uzdevums + label_issue_plural: Uzdevumi + label_issue_view_all: Skatīt visus uzdevumus + label_issues_by: "Kārtot pēc %{value}" + label_issue_added: Uzdevums pievienots + label_issue_updated: Uzdevums atjaunots + label_document: Dokuments + label_document_new: Jauns dokuments + label_document_plural: Dokumenti + label_document_added: Dokuments pievienots + label_role: Loma + label_role_plural: Lomas + label_role_new: Jauna loma + label_role_and_permissions: Lomas un atļaujas + label_member: Dalībnieks + label_member_new: Jauns dalībnieks + label_member_plural: Dalībnieki + label_tracker: Trakeris + label_tracker_plural: Trakeri + label_tracker_new: Jauns trakeris + label_workflow: Darba gaita + label_issue_status: Uzdevuma statuss + label_issue_status_plural: Uzdevumu statusi + label_issue_status_new: Jauns statuss + label_issue_category: Uzdevuma kategorija + label_issue_category_plural: Uzdevumu kategorijas + label_issue_category_new: Jauna kategorija + label_custom_field: Pielāgojams lauks + label_custom_field_plural: Pielāgojami lauki + label_custom_field_new: Jauns pielāgojams lauks + label_enumerations: Uzskaitījumi + label_enumeration_new: Jauna vērtība + label_information: Informācija + label_information_plural: Informācija + label_please_login: Lūdzu pieslēdzieties + label_register: Reģistrēties + label_login_with_open_id_option: vai pieslēgties ar OpenID + label_password_lost: Nozaudēta parole + label_home: Sākums + label_my_page: Mana lapa + label_my_account: Mans konts + label_my_projects: Mani projekti + label_administration: Administrācija + label_login: Pieslēgties + label_logout: Atslēgties + label_help: Palīdzība + label_reported_issues: Ziņotie uzdevumi + label_assigned_to_me_issues: Man piesaistītie uzdevumi + label_last_login: Pēdējā pieslēgšanās + label_registered_on: Reģistrējies + label_activity: Aktivitāte + label_overall_activity: Kopējās aktivitātes + label_user_activity: "Lietotāja %{value} aktivitātes" + label_new: Jauns + label_logged_as: Pieslēdzies kā + label_environment: Vide + label_authentication: Pilnvarošana + label_auth_source: Pilnvarošanas režīms + label_auth_source_new: Jauns pilnvarošanas režīms + label_auth_source_plural: Pilnvarošanas režīmi + label_subproject_plural: Apakšprojekti + label_subproject_new: Jauns apakšprojekts + label_and_its_subprojects: "%{value} un tā apakšprojekti" + label_min_max_length: Minimālais - Maksimālais garums + label_list: Saraksts + label_date: Datums + label_integer: Vesels skaitlis + label_float: Decimālskaitlis + label_boolean: Patiesuma vērtība + label_string: Teksts + label_text: Garš teksts + label_attribute: Atribūts + label_attribute_plural: Atribūti + label_download: "%{count} Lejupielāde" + label_download_plural: "%{count} Lejupielādes" + label_no_data: Nav datu, ko parādīt + label_change_status: Mainīt statusu + label_history: Vēsture + label_attachment: Pielikums + label_attachment_new: Jauns pielikums + label_attachment_delete: Dzēst pielikumu + label_attachment_plural: Pielikumi + label_file_added: Lauks pievienots + label_report: Atskaite + label_report_plural: Atskaites + label_news: Ziņa + label_news_new: Pievienot ziņu + label_news_plural: Ziņas + label_news_latest: Jaunākās ziņas + label_news_view_all: Skatīt visas ziņas + label_news_added: Ziņas pievienotas + label_settings: Iestatījumi + label_overview: Pārskats + label_version: Versija + label_version_new: Jauna versija + label_version_plural: Versijas + label_close_versions: Aizvērt pabeigtās versijas + label_confirmation: Apstiprinājums + label_export_to: 'Pieejams arī:' + label_read: Lasīt... + label_public_projects: Publiskie projekti + label_open_issues: atvērts + label_open_issues_plural: atvērti + label_closed_issues: slēgts + label_closed_issues_plural: slēgti + label_x_open_issues_abbr_on_total: + zero: 0 atvērti / %{total} + one: 1 atvērts / %{total} + other: "%{count} atvērti / %{total}" + label_x_open_issues_abbr: + zero: 0 atvērti + one: 1 atvērts + other: "%{count} atvērti" + label_x_closed_issues_abbr: + zero: 0 slēgti + one: 1 slēgts + other: "%{count} slēgti" + label_total: Kopā + label_permissions: Atļaujas + label_current_status: Pašreizējais statuss + label_new_statuses_allowed: Jauni statusi atļauti + label_all: visi + label_none: neviens + label_nobody: nekas + label_next: Nākošais + label_previous: Iepriekšējais + label_used_by: Izmanto + label_details: Detaļas + label_add_note: Pievienot piezīmi + label_per_page: katrā lapā + label_calendar: Kalendārs + label_months_from: mēneši no + label_gantt: Ganta diagramma + label_internal: Iekšējais + label_last_changes: "pēdējās %{count} izmaiņas" + label_change_view_all: Skatīt visas izmaiņas + label_personalize_page: Pielāgot šo lapu + label_comment: Komentārs + label_comment_plural: Komentāri + label_x_comments: + zero: nav komentāru + one: 1 komentārs + other: "%{count} komentāri" + label_comment_add: Pievienot komentāru + label_comment_added: Komentārs pievienots + label_comment_delete: Dzēst komentārus + label_query: Pielāgots pieprasījums + label_query_plural: Pielāgoti pieprasījumi + label_query_new: Jauns pieprasījums + label_filter_add: Pievienot filtru + label_filter_plural: Filtri + label_equals: ir + label_not_equals: nav + label_in_less_than: ir mazāk kā + label_in_more_than: ir vairāk kā + label_greater_or_equal: '>=' + label_less_or_equal: '<=' + label_in: iekš + label_today: šodien + label_all_time: visu laiku + label_yesterday: vakar + label_this_week: šonedēļ + label_last_week: pagājušo šonedēļ + label_last_n_days: "pēdējās %{count} dienas" + label_this_month: šomēnes + label_last_month: pagājušo mēnes + label_this_year: šogad + label_date_range: Datumu apgabals + label_less_than_ago: mazāk kā dienas iepriekš + label_more_than_ago: vairāk kā dienas iepriekš + label_ago: dienas iepriekš + label_contains: satur + label_not_contains: nesatur + label_day_plural: dienas + label_repository: Repozitorijs + label_repository_plural: Repozitoriji + label_browse: Pārlūkot + label_modification: "%{count} izmaiņa" + label_modification_plural: "%{count} izmaiņas" + label_branch: Zars + label_tag: Birka + label_revision: Revīzija + label_revision_plural: Revīzijas + label_revision_id: "Revīzija %{value}" + label_associated_revisions: Saistītās revīzijas + label_added: pievienots + label_modified: modificēts + label_copied: nokopēts + label_renamed: pārsaukts + label_deleted: dzēsts + label_latest_revision: Pēdējā revīzija + label_latest_revision_plural: Pēdējās revīzijas + label_view_revisions: Skatīt revīzijas + label_view_all_revisions: Skatīt visas revīzijas + label_max_size: Maksimālais izmērs + label_sort_highest: Pārvietot uz augšu + label_sort_higher: Pārvietot soli augšup + label_sort_lower: Pārvietot uz leju + label_sort_lowest: Pārvietot vienu soli uz leju + label_roadmap: Ceļvedis + label_roadmap_due_in: "Sagaidāms pēc %{value}" + label_roadmap_overdue: "nokavēts %{value}" + label_roadmap_no_issues: Šai versijai nav uzdevumu + label_search: Meklēt + label_result_plural: Rezultāti + label_all_words: Visi vārdi + label_wiki: Wiki + label_wiki_edit: Wiki labojums + label_wiki_edit_plural: Wiki labojumi + label_wiki_page: Wiki lapa + label_wiki_page_plural: Wiki lapas + label_index_by_title: Indeksēt pēc nosaukuma + label_index_by_date: Indeksēt pēc datuma + label_current_version: Tekošā versija + label_preview: Priekšskatījums + label_feed_plural: Barotnes + label_changes_details: Visu izmaiņu detaļas + label_issue_tracking: Uzdevumu uzskaite + label_spent_time: Pavadītais laiks + label_f_hour: "%{value} stunda" + label_f_hour_plural: "%{value} stundas" + label_time_tracking: Laika uzskaite + label_change_plural: Izmaiņas + label_statistics: Statistika + label_commits_per_month: Nodevumi mēnesī + label_commits_per_author: Nodevumi no autora + label_view_diff: Skatīt atšķirības + label_diff_inline: iekļauts + label_diff_side_by_side: blakus + label_options: Opcijas + label_copy_workflow_from: Kopēt darba plūsmu no + label_permissions_report: Atļauju atskaite + label_watched_issues: Vērotie uzdevumi + label_related_issues: Saistītie uzdevumi + label_applied_status: Piešķirtais statuss + label_loading: Lādējas... + label_relation_new: Jauna relācija + label_relation_delete: Dzēst relāciju + label_relates_to: saistīts ar + label_duplicates: dublikāti + label_duplicated_by: dublējas ar + label_blocks: bloķē + label_blocked_by: nobloķējis + label_precedes: pirms + label_follows: seko + label_end_to_start: no beigām uz sākumu + label_end_to_end: no beigām uz beigām + label_start_to_start: no sākuma uz sākumu + label_start_to_end: no sākuma uz beigām + label_stay_logged_in: Atcerēties mani + label_disabled: izslēgts + label_show_completed_versions: Rādīt pabeigtās versijas + label_me: es + label_board: Forums + label_board_new: Jauns forums + label_board_plural: Forumi + label_board_locked: Slēgts + label_board_sticky: Svarīgs + label_topic_plural: Tēmas + label_message_plural: Ziņas + label_message_last: Pēdējā ziņa + label_message_new: Jauna ziņa + label_message_posted: Ziņa pievienota + label_reply_plural: Atbildes + label_send_information: Sūtīt konta informāciju lietotājam + label_year: Gads + label_month: Mēnesis + label_week: Nedēļa + label_date_from: No + label_date_to: Kam + label_language_based: Izmantot lietotāja valodu + label_sort_by: "Kārtot pēc %{value}" + label_send_test_email: "Sūtīt testa e-pastu" + label_feeds_access_key: RSS piekļuves atslēga + label_missing_feeds_access_key: Trūkst RSS piekļuves atslēgas + label_feeds_access_key_created_on: "RSS piekļuves atslēga izveidota pirms %{value}" + label_module_plural: Moduļi + label_added_time_by: "Pievienojis %{author} pirms %{age}" + label_updated_time_by: "Atjaunojis %{author} pirms %{age}" + label_updated_time: "Atjaunots pirms %{value}" + label_jump_to_a_project: Pāriet uz projektu... + label_file_plural: Datnes + label_changeset_plural: Izmaiņu kopumi + label_default_columns: Noklusētās kolonnas + label_no_change_option: (Nav izmaiņu) + label_bulk_edit_selected_issues: Labot visus izvēlētos uzdevumus + label_theme: Tēma + label_default: Noklusēts + label_search_titles_only: Meklēt tikai nosaukumos + label_user_mail_option_all: "Par visiem notikumiem visos manos projektos" + label_user_mail_option_selected: "Par visiem notikumiem tikai izvēlētajos projektos..." + label_user_mail_no_self_notified: "Neziņot man par izmaiņām, kuras veicu es pats" + label_registration_activation_by_email: "konta aktivizācija caur e-pastu" + label_registration_manual_activation: manuālā konta aktivizācija + label_registration_automatic_activation: automātiskā konta aktivizācija + label_display_per_page: "Rādīt vienā lapā: %{value}" + label_age: Vecums + label_change_properties: Mainīt atribūtus + label_general: Galvenais + label_more: Vēl + label_scm: SCM + label_plugins: Spraudņi + label_ldap_authentication: LDAP pilnvarošana + label_downloads_abbr: L-lād. + label_optional_description: "Apraksts (neobligāts)" + label_add_another_file: Pievienot citu failu + label_preferences: Priekšrocības + label_chronological_order: Hronoloģiskā kārtībā + label_reverse_chronological_order: Apgriezti hronoloģiskā kārtībā + label_planning: Plānošana + label_incoming_emails: "Ienākošie e-pasti" + label_generate_key: Ģenerēt atslēgu + label_issue_watchers: Vērotāji + label_example: Piemērs + label_display: Rādīt + label_sort: Kārtot + label_ascending: Augoši + label_descending: Dilstoši + label_date_from_to: "No %{start} līdz %{end}" + label_wiki_content_added: Wiki lapa pievienota + label_wiki_content_updated: Wiki lapa atjaunota + label_group: Grupa + label_group_plural: Grupas + label_group_new: Jauna grupa + label_time_entry_plural: Pavadītais laiks + label_version_sharing_none: Nav koplietošanai + label_version_sharing_descendants: Ar apakšprojektiem + label_version_sharing_hierarchy: Ar projektu hierarhiju + label_version_sharing_tree: Ar projekta koku + label_version_sharing_system: Ar visiem projektiem + label_update_issue_done_ratios: Atjaunot uzdevuma veikuma attiecību + label_copy_source: Avots + label_copy_target: Mērķis + label_copy_same_as_target: Tāds pats kā mērķis + label_display_used_statuses_only: "Rādīt tikai statusus, ko lieto šis trakeris" + label_api_access_key: API pieejas atslēga + label_missing_api_access_key: Trūkst API pieejas atslēga + label_api_access_key_created_on: "API pieejas atslēga izveidota pirms %{value}" + + button_login: Pieslēgties + button_submit: Nosūtīt + button_save: Saglabāt + button_check_all: Atzīmēt visu + button_uncheck_all: Noņemt visus atzīmējumus + button_delete: Dzēst + button_create: Izveidot + button_create_and_continue: Izveidot un turpināt + button_test: Testēt + button_edit: Labot + button_add: Pievienot + button_change: Mainīt + button_apply: Apstiprināt + button_clear: Notīrīt + button_lock: Slēgt + button_unlock: Atslēgt + button_download: Lejuplādēt + button_list: Saraksts + button_view: Skats + button_move: Pārvietot + button_move_and_follow: Pārvietot un sekot + button_back: Atpakaļ + button_cancel: Atcelt + button_activate: Aktivizēt + button_sort: Kārtot + button_log_time: Ilgs laiks + button_rollback: Atjaunot uz šo versiju + button_watch: Vērot + button_unwatch: Nevērot + button_reply: Atbildēt + button_archive: Arhivēt + button_unarchive: Atarhivēt + button_reset: Atiestatīt + button_rename: Pārsaukt + button_change_password: Mainīt paroli + button_copy: Kopēt + button_copy_and_follow: Kopēt un sekot + button_annotate: Pierakstīt paskaidrojumu + button_update: Atjaunot + button_configure: Konfigurēt + button_quote: Citāts + button_duplicate: Dublēt + button_show: Rādīt + + status_active: aktīvs + status_registered: reģistrēts + status_locked: slēgts + + version_status_open: atvērta + version_status_locked: slēgta + version_status_closed: aizvērta + + field_active: Aktīvs + + text_select_mail_notifications: "Izvēlieties darbības, par kurām vēlaties saņemt ziņojumus e-pastā" + text_regexp_info: "piem. ^[A-Z0-9]+$" + text_min_max_length_info: "0 nozīmē, ka nav ierobežojumu" + text_project_destroy_confirmation: "Vai tiešām vēlaties dzēst šo projektu un ar to saistītos datus?" + text_subprojects_destroy_warning: "Tā apakšprojekts(i): %{value} arī tiks dzēsts(i)." + text_workflow_edit: Lai labotu darba plūsmu, izvēlieties lomu un trakeri + text_are_you_sure: "Vai esat pārliecināts?" + text_journal_changed: "%{label} mainīts no %{old} uz %{new}" + text_journal_set_to: "%{label} iestatīts uz %{value}" + text_journal_deleted: "%{label} dzēsts (%{old})" + text_journal_added: "%{label} %{value} pievienots" + text_tip_issue_begin_day: uzdevums sākas šodien + text_tip_issue_end_day: uzdevums beidzas šodien + text_tip_issue_begin_end_day: uzdevums sākas un beidzas šodien + text_project_identifier_info: 'Only lower case letters (a-z), numbers, dashes and underscores are allowed.
Once saved, the identifier can not be changed.' + text_caracters_maximum: "%{count} simboli maksimāli." + text_caracters_minimum: "Jābūt vismaz %{count} simbolu garumā." + text_length_between: "Garums starp %{min} un %{max} simboliem." + text_tracker_no_workflow: Šim trakerim nav definēta darba plūsma + text_unallowed_characters: Neatļauti simboli + text_comma_separated: "Atļautas vairākas vērtības (atdalīt ar komatu)." + text_line_separated: "Atļautas vairākas vērtības (rakstīt katru savā rindā)." + text_issues_ref_in_commit_messages: "Izmaiņu salīdzināšana izejot no ziņojumiem" + text_issue_added: "Uzdevumu %{id} pievienojis %{author}." + text_issue_updated: "Uzdevumu %{id} atjaunojis %{author}." + text_wiki_destroy_confirmation: "Vai esat drošs, ka vēlaties dzēst šo wiki un visu tās saturu?" + text_issue_category_destroy_question: "Daži uzdevumi (%{count}) ir nozīmēti šai kategorijai. Ko Jūs vēlaties darīt?" + text_issue_category_destroy_assignments: Dzēst kategoriju nozīmējumus + text_issue_category_reassign_to: Nozīmēt uzdevumus šai kategorijai + text_user_mail_option: "No neizvēlētajiem projektiem Jūs saņemsiet ziņojumus e-pastā tikai par notikumiem, kuriem Jūs sekojat vai kuros esat iesaistīts." + text_no_configuration_data: "Lomas, trakeri, uzdevumu statusi un darba plūsmas vēl nav konfigurētas.\nĻoti ieteicams ielādēt noklusēto konfigurāciju. Pēc ielādēšanas to būs iespējams modificēt." + text_load_default_configuration: Ielādēt noklusēto konfigurāciju + text_status_changed_by_changeset: "Apstiprināts izmaiņu kopumā %{value}." + text_issues_destroy_confirmation: 'Vai tiešām vēlaties dzēst izvēlēto uzdevumu(us)?' + text_select_project_modules: 'Izvēlieties moduļus šim projektam:' + text_default_administrator_account_changed: Noklusētais administratora konts mainīts + text_file_repository_writable: Pielikumu direktorijā atļauts rakstīt + text_plugin_assets_writable: Spraudņu kataloga direktorijā atļauts rakstīt + text_rmagick_available: "RMagick pieejams (neobligāts)" + text_destroy_time_entries_question: "%{hours} stundas tika ziņotas par uzdevumu, ko vēlaties dzēst. Ko darīt?" + text_destroy_time_entries: Dzēst ziņotās stundas + text_assign_time_entries_to_project: Piešķirt ziņotās stundas projektam + text_reassign_time_entries: 'Piešķirt ziņotās stundas uzdevumam:' + text_user_wrote: "%{value} rakstīja:" + text_enumeration_destroy_question: "%{count} objekti ir piešķirti šai vērtībai." + text_enumeration_category_reassign_to: 'Piešķirt tos šai vērtībai:' + text_email_delivery_not_configured: "E-pastu nosūtīšana nav konfigurēta, un ziņojumi ir izslēgti.\nKonfigurējiet savu SMTP serveri datnē config/configuration.yml un pārstartējiet lietotni." + text_repository_usernames_mapping: "Izvēlieties vai atjaunojiet Redmine lietotāju, saistītu ar katru lietotājvārdu, kas atrodams repozitorija žurnālā.\nLietotāji ar to pašu Redmine un repozitorija lietotājvārdu būs saistīti automātiski." + text_diff_truncated: '... Šis diff tika nošķelts, jo tas pārsniedz maksimālo izmēru, ko var parādīt.' + text_custom_field_possible_values_info: 'Katra vērtības savā rindā' + text_wiki_page_destroy_question: "Šij lapai ir %{descendants} apakšlapa(as) un pēcnācēji. Ko darīt?" + text_wiki_page_nullify_children: "Paturēt apakšlapas kā pamatlapas" + text_wiki_page_destroy_children: "Dzēst apakšlapas un visus pēcnācējus" + text_wiki_page_reassign_children: "Piešķirt apakšlapas šai lapai" + text_own_membership_delete_confirmation: "Jūs tūlīt dzēsīsiet dažas vai visas atļaujas, un Jums pēc tam var nebūt atļauja labot šo projektu.\nVai turpināt?" + + default_role_manager: Menedžeris + default_role_developer: Izstrādātājs + default_role_reporter: Ziņotājs + default_role_non_member: Non member + default_role_anonymous: Anonymous + default_tracker_bug: Kļūda + default_tracker_feature: Iezīme + default_tracker_support: Atbalsts + default_issue_status_new: Jauns + default_issue_status_in_progress: Attīstībā + default_issue_status_resolved: Atrisināts + default_issue_status_feedback: Atsauksmes + default_issue_status_closed: Slēgts + default_issue_status_rejected: Noraidīts + default_doc_category_user: Lietotāja dokumentācija + default_doc_category_tech: Tehniskā dokumentācija + default_priority_low: Zema + default_priority_normal: Normāla + default_priority_high: Augsta + default_priority_urgent: Steidzama + default_priority_immediate: Tūlītēja + default_activity_design: Dizains + default_activity_development: Izstrādāšana + + enumeration_issue_priorities: Uzdevumu prioritātes + enumeration_doc_categories: Dokumentu kategorijas + enumeration_activities: Aktivitātes (laika uzskaite) + enumeration_system_activity: Sistēmas aktivitātes + + error_can_not_delete_custom_field: Unable to delete custom field + permission_manage_subtasks: Manage subtasks + label_profile: Profile + error_unable_to_connect: Unable to connect (%{value}) + error_can_not_remove_role: This role is in use and can not be deleted. + field_parent_issue: Parent task + error_unable_delete_issue_status: Unable to delete issue status + label_subtask_plural: Subtasks + error_can_not_delete_tracker: This tracker contains issues and can't be deleted. + label_project_copy_notifications: Send email notifications during the project copy + field_principal: Principal + label_my_page_block: My page block + notice_failed_to_save_members: "Failed to save member(s): %{errors}." + text_zoom_out: Zoom out + text_zoom_in: Zoom in + notice_unable_delete_time_entry: Unable to delete time log entry. + label_overall_spent_time: Overall spent time + field_time_entries: Log time + project_module_gantt: Gantt + project_module_calendar: Calendar + button_edit_associated_wikipage: "Edit associated Wiki page: %{page_title}" + text_are_you_sure_with_children: Delete issue and all child issues? + field_text: Text field + label_user_mail_option_only_owner: Only for things I am the owner of + setting_default_notification_option: Default notification option + label_user_mail_option_only_my_events: Only for things I watch or I'm involved in + label_user_mail_option_only_assigned: Only for things I am assigned to + label_user_mail_option_none: No events + field_member_of_group: Assignee's group + field_assigned_to_role: Assignee's role + notice_not_authorized_archived_project: The project you're trying to access has been archived. + label_principal_search: "Search for user or group:" + label_user_search: "Search for user:" + field_visible: Visible + setting_emails_header: Emails header + setting_commit_logtime_activity_id: Activity for logged time + text_time_logged_by_changeset: Applied in changeset %{value}. + setting_commit_logtime_enabled: Enable time logging + notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max}) + setting_gantt_items_limit: Maximum number of items displayed on the gantt chart + text_powered_by: Powered by %{link} label_cvs_module: Module label_filesystem_path: Root directory label_darcs_path: Root directory @@ -941,3 +943,18 @@ lv: label_cvs_path: CVSROOT label_git_path: Path to .git directory label_mercurial_path: Root directory + label_my_queries: My custom queries + label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee + text_journal_changed_no_detail: "%{label} updated" + button_expand_all: Expand all + button_collapse_all: Collapse all + label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author + field_effective_date: Due date + label_news_comment_added: Comment added to a news + field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text + text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page. + text_default_encoding: "Default: UTF-8" + text_git_repo_example: a bare and local repository (e.g. /gitrepo, c:\gitrepo) + label_notify_member_plural: Email issue updates + label_path_encoding: Path encoding + text_mercurial_repo_example: local repository (e.g. /hgrepo, c:\hgrepo) diff --git a/config/locales/mk.yml b/config/locales/mk.yml index 2b39ba38..1513c0f3 100644 --- a/config/locales/mk.yml +++ b/config/locales/mk.yml @@ -1,944 +1,946 @@ -mk: - # Text direction: Left-to-Right (ltr) or Right-to-Left (rtl) - direction: ltr - date: - formats: - # Use the strftime parameters for formats. - # When no format has been given, it uses default. - # You can provide other formats here if you like! - default: "%d/%m/%Y" - short: "%d %b" - long: "%d %B, %Y" - - day_names: [недела, понеделник, вторник, среда, четврток, петок, сабота] - abbr_day_names: [нед, пон, вто, сре, чет, пет, саб] - - # Don't forget the nil at the beginning; there's no such thing as a 0th month - month_names: [~, јануари, февруари, март, април, мај, јуни, јули, август, септември, октомври, ноември, декември] - abbr_month_names: [~, јан, фев, мар, апр, мај, јун, јул, авг, сеп, окт, ное, дек] - # Used in date_select and datime_select. - order: [ :day, :month, :year ] - - time: - formats: - default: "%d/%m/%Y %H:%M" - time: "%H:%M" - short: "%d %b %H:%M" - long: "%d %B, %Y %H:%M" - am: "предпладне" - pm: "попладне" - - datetime: - distance_in_words: - half_a_minute: "пола минута" - less_than_x_seconds: - one: "помалку од 1 секунда" - other: "помалку од %{count} секунди" - x_seconds: - one: "1 секунда" - other: "%{count} секунди" - less_than_x_minutes: - one: "помалку од 1 минута" - other: "помалку од %{count} минути" - x_minutes: - one: "1 минута" - other: "%{count} минути" - about_x_hours: - one: "околу 1 час" - other: "околу %{count} часа" - x_days: - one: "1 ден" - other: "%{count} дена" - about_x_months: - one: "околу 1 месец" - other: "околу %{count} месеци" - x_months: - one: "1 месец" - other: "%{count} месеци" - about_x_years: - one: "околу 1 година" - other: "околу %{count} години" - over_x_years: - one: "преку 1 година" - other: "преку %{count} години" - almost_x_years: - one: "скоро 1 година" - other: "скоро %{count} години" - - number: - # Default format for numbers - format: - separator: "." - delimiter: "" - precision: 3 - human: - format: - delimiter: "" - precision: 1 - storage_units: - format: "%n %u" - units: - byte: - one: "Byte" - other: "Bytes" - kb: "KB" - mb: "MB" - gb: "GB" - tb: "TB" - - -# Used in array.to_sentence. - support: - array: - sentence_connector: "и" - skip_last_comma: false - - activerecord: - errors: - template: - header: - one: "1 error prohibited this %{model} from being saved" - other: "%{count} errors prohibited this %{model} from being saved" - messages: - inclusion: "не е вклучено во листата" - exclusion: "е резервирано" - invalid: "е невалидно" - confirmation: "не се совпаѓа со потврдата" - accepted: "мора да е прифатено" - empty: "неможе да е празно" - blank: "неможе да е празно" - too_long: "е предолго (макс. %{count} знаци)" - too_short: "е прекратко (мин. %{count} знаци)" - wrong_length: "е погрешна должина (треба да е %{count} знаци)" - taken: "е веќе зафатено" - not_a_number: "не е број" - not_a_date: "не е валидна дата" - greater_than: "мора да е поголемо од %{count}" - greater_than_or_equal_to: "мора да е поголемо или еднакво на %{count}" - equal_to: "мора да е еднакво на %{count}" - less_than: "мора да е помало од %{count}" - less_than_or_equal_to: "мора да е помало или еднакво на %{count}" - odd: "мора да е непарно" - even: "мора да е парно" - greater_than_start_date: "мора да е поголема од почетната дата" - not_same_project: "не припаѓа на истиот проект" - circular_dependency: "Оваа врска ќе креира кружна зависност" - cant_link_an_issue_with_a_descendant: "Задача неможе да се поврзе со една од нејзините подзадачи" - - actionview_instancetag_blank_option: Изберете - - general_text_No: 'Не' - general_text_Yes: 'Да' - general_text_no: 'не' - general_text_yes: 'да' - general_lang_name: 'Macedonian (Македонски)' - general_csv_separator: ',' - general_csv_decimal_separator: '.' - general_csv_encoding: UTF-8 - general_pdf_encoding: UTF-8 - general_first_day_of_week: '1' - - notice_account_updated: Профилот е успешно ажуриран. - notice_account_invalid_creditentials: Неточен корисник или лозинка - notice_account_password_updated: Лозинката е успешно ажурирана. - notice_account_wrong_password: Погрешна лозинка - notice_account_register_done: Профилот е успешно креиран. За активација, клкнете на врската што ви е пратена по е-пошта. - notice_account_unknown_email: Непознат корисник. - notice_can_t_change_password: This account uses an external authentication source. Impossible to change the password. - notice_account_lost_email_sent: An email with instructions to choose a new password has been sent to you. - notice_account_activated: Your account has been activated. You can now log in. - notice_successful_create: Успешно креирање. - notice_successful_update: Успешно ажурирање. - notice_successful_delete: Успешно бришење. - notice_successful_connection: Успешна конекција. - notice_file_not_found: The page you were trying to access doesn't exist or has been removed. - notice_locking_conflict: Data has been updated by another user. - notice_not_authorized: You are not authorized to access this page. - notice_email_sent: "Е-порака е пратена на %{value}" - notice_email_error: "Се случи грешка при праќање на е-пораката (%{value})" - notice_feeds_access_key_reseted: Вашиот RSS клуч за пристап е reset. - notice_api_access_key_reseted: Вашиот API клуч за пристап е reset. - notice_failed_to_save_issues: "Failed to save %{count} issue(s) on %{total} selected: %{ids}." - notice_failed_to_save_members: "Failed to save member(s): %{errors}." - notice_no_issue_selected: "No issue is selected! Please, check the issues you want to edit." - notice_account_pending: "Your account was created and is now pending administrator approval." - notice_default_data_loaded: Default configuration successfully loaded. - notice_unable_delete_version: Unable to delete version. - notice_unable_delete_time_entry: Unable to delete time log entry. - notice_issue_done_ratios_updated: Issue done ratios updated. - - error_can_t_load_default_data: "Default configuration could not be loaded: %{value}" - error_scm_not_found: "The entry or revision was not found in the repository." - error_scm_command_failed: "An error occurred when trying to access the repository: %{value}" - error_scm_annotate: "The entry does not exist or can not be annotated." - error_issue_not_found_in_project: 'The issue was not found or does not belong to this project' - error_no_tracker_in_project: 'No tracker is associated to this project. Please check the Project settings.' - error_no_default_issue_status: 'No default issue status is defined. Please check your configuration (Go to "Administration -> Issue statuses").' - error_can_not_delete_custom_field: Unable to delete custom field - error_can_not_delete_tracker: "This tracker contains issues and can't be deleted." - error_can_not_remove_role: "This role is in use and can not be deleted." - error_can_not_reopen_issue_on_closed_version: 'An issue assigned to a closed version can not be reopened' - error_can_not_archive_project: This project can not be archived - error_issue_done_ratios_not_updated: "Issue done ratios not updated." - error_workflow_copy_source: 'Please select a source tracker or role' - error_workflow_copy_target: 'Please select target tracker(s) and role(s)' - error_unable_delete_issue_status: 'Unable to delete issue status' - error_unable_to_connect: "Unable to connect (%{value})" - warning_attachments_not_saved: "%{count} file(s) could not be saved." - - mail_subject_lost_password: "Вашата %{value} лозинка" - mail_body_lost_password: 'To change your password, click on the following link:' - mail_subject_register: "Your %{value} account activation" - mail_body_register: 'To activate your account, click on the following link:' - mail_body_account_information_external: "You can use your %{value} account to log in." - mail_body_account_information: Your account information - mail_subject_account_activation_request: "%{value} account activation request" - mail_body_account_activation_request: "Нов корисник (%{value}) е регистриран. The account is pending your approval:" - mail_subject_reminder: "%{count} issue(s) due in the next %{days} days" - mail_body_reminder: "%{count} issue(s) that are assigned to you are due in the next %{days} days:" - mail_subject_wiki_content_added: "'%{id}' wiki page has been added" - mail_body_wiki_content_added: "The '%{id}' wiki page has been added by %{author}." - mail_subject_wiki_content_updated: "'%{id}' wiki page has been updated" - mail_body_wiki_content_updated: "The '%{id}' wiki page has been updated by %{author}." - - gui_validation_error: 1 грешка - gui_validation_error_plural: "%{count} грешки" - - field_name: Име - field_description: Опис - field_summary: Краток опис - field_is_required: Задолжително - field_firstname: Име - field_lastname: Презиме - field_mail: Е-пошта - field_filename: Датотека - field_filesize: Големина - field_downloads: Превземања - field_author: Автор - field_created_on: Креиран - field_updated_on: Ажурирано - field_field_format: Формат - field_is_for_all: За сите проекти - field_possible_values: Можни вредности - field_regexp: Regular expression - field_min_length: Минимална должина - field_max_length: Максимална должина - field_value: Вредност - field_category: Категорија - field_title: Наслов - field_project: Проект - field_issue: Задача - field_status: Статус - field_notes: Белешки - field_is_closed: Задачата е затворена - field_is_default: Default value - field_tracker: Tracker - field_subject: Наслов - field_due_date: Краен рок - field_assigned_to: Доделена на - field_priority: Приоритет - field_fixed_version: Target version - field_user: Корисник - field_principal: Principal - field_role: Улога - field_homepage: Веб страна - field_is_public: Јавен - field_parent: Подпроект на - field_is_in_roadmap: Issues displayed in roadmap - field_login: Корисник - field_mail_notification: Известувања по e-пошта - field_admin: Администратор - field_last_login_on: Последна најава - field_language: Јазик - field_effective_date: Дата - field_password: Лозинка - field_new_password: Нова лозинка - field_password_confirmation: Потврда - field_version: Верзија - field_type: Тип - field_host: Хост - field_port: Порт - field_account: Account - field_base_dn: Base DN - field_attr_login: Login attribute - field_attr_firstname: Firstname attribute - field_attr_lastname: Lastname attribute - field_attr_mail: Email attribute - field_onthefly: Моментално (On-the-fly) креирање на корисници - field_start_date: Почеток - field_done_ratio: % Завршено - field_auth_source: Режим на автентикација - field_hide_mail: Криј ја мојата адреса на е-пошта - field_comments: Коментар - field_url: URL - field_start_page: Почетна страна - field_subproject: Подпроект - field_hours: Часови - field_activity: Активност - field_spent_on: Дата - field_identifier: Идентификатор - field_is_filter: Користи како филтер - field_issue_to: Поврзана задача - field_delay: Доцнење - field_assignable: На оваа улога може да се доделуваат задачи - field_redirect_existing_links: Пренасочи ги постоечките врски - field_estimated_hours: Проценето време - field_column_names: Колони - field_time_entries: Бележи време - field_time_zone: Временска зона - field_searchable: Може да се пребарува - field_default_value: Default value - field_comments_sorting: Прикажувај коментари - field_parent_title: Parent page - field_editable: Може да се уредува - field_watcher: Watcher - field_identity_url: OpenID URL - field_content: Содржина - field_group_by: Групирај ги резултатите според - field_sharing: Споделување - field_parent_issue: Parent task - - setting_app_title: Наслов на апликацијата - setting_app_subtitle: Поднаслов на апликацијата - setting_welcome_text: Текст за добредојде - setting_default_language: Default јазик - setting_login_required: Задолжителна автентикација - setting_self_registration: Само-регистрација - setting_attachment_max_size: Макс. големина на прилог - setting_issues_export_limit: Issues export limit - setting_mail_from: Emission email address - setting_bcc_recipients: Blind carbon copy recipients (bcc) - setting_plain_text_mail: Текстуални е-пораки (без HTML) - setting_host_name: Име на хост и патека - setting_text_formatting: Форматирање на текст - setting_wiki_compression: Компресија на историјата на вики - setting_feeds_limit: Feed content limit - setting_default_projects_public: Новите проекти се иницијално јавни - setting_autofetch_changesets: Autofetch commits - setting_sys_api_enabled: Enable WS for repository management - setting_commit_ref_keywords: Referencing keywords - setting_commit_fix_keywords: Fixing keywords - setting_autologin: Автоматска најава - setting_date_format: Формат на дата - setting_time_format: Формат на време - setting_cross_project_issue_relations: Дозволи релации на задачи меѓу проекти - setting_issue_list_default_columns: Default columns displayed on the issue list - setting_repositories_encodings: Repositories encodings - setting_commit_logs_encoding: Commit messages encoding - setting_emails_footer: Emails footer - setting_protocol: Протокол - setting_per_page_options: Objects per page options - setting_user_format: Приказ на корисниците - setting_activity_days_default: Денови прикажана во активноста на проектот - setting_display_subprojects_issues: Прикажи ги задачите на подпроектите во главните проекти - setting_enabled_scm: Овозможи SCM - setting_mail_handler_body_delimiters: "Truncate emails after one of these lines" - setting_mail_handler_api_enabled: Enable WS for incoming emails - setting_mail_handler_api_key: API клуч - setting_sequential_project_identifiers: Генерирај последователни идентификатори на проекти - setting_gravatar_enabled: Користи Gravatar кориснички икони - setting_gravatar_default: Default Gravatar image - setting_diff_max_lines_displayed: Max number of diff lines displayed - setting_file_max_size_displayed: Max size of text files displayed inline - setting_repository_log_display_limit: Maximum number of revisions displayed on file log - setting_openid: Дозволи OpenID најава и регистрација - setting_password_min_length: Мин. должина на лозинка - setting_new_project_user_role_id: Улога доделена на неадминистраторски корисник кој креира проект - setting_default_projects_modules: Default enabled modules for new projects - setting_issue_done_ratio: Calculate the issue done ratio with - setting_issue_done_ratio_issue_field: Use the issue field - setting_issue_done_ratio_issue_status: Use the issue status - setting_start_of_week: Start calendars on - setting_rest_api_enabled: Enable REST web service - setting_cache_formatted_text: Cache formatted text - - permission_add_project: Креирај проекти - permission_add_subprojects: Креирај подпроекти - permission_edit_project: Уреди проект - permission_select_project_modules: Изберете модули за проект - permission_manage_members: Manage members - permission_manage_project_activities: Manage project activities - permission_manage_versions: Manage versions - permission_manage_categories: Manage issue categories - permission_view_issues: Прегледај задачи - permission_add_issues: Додавај задачи - permission_edit_issues: Уредувај задачи - permission_manage_issue_relations: Manage issue relations - permission_add_issue_notes: Додавај белешки - permission_edit_issue_notes: Уредувај белешки - permission_edit_own_issue_notes: Уредувај сопствени белешки - permission_move_issues: Преместувај задачи - permission_delete_issues: Бриши задачи - permission_manage_public_queries: Manage public queries - permission_save_queries: Save queries - permission_view_gantt: View gantt chart - permission_view_calendar: View calendar - permission_view_issue_watchers: View watchers list - permission_add_issue_watchers: Add watchers - permission_delete_issue_watchers: Delete watchers - permission_log_time: Бележи потрошено време - permission_view_time_entries: Прегледај потрошено време - permission_edit_time_entries: Уредувај белешки за потрошено време - permission_edit_own_time_entries: Уредувај сопствени белешки за потрошено време - permission_manage_news: Manage news - permission_comment_news: Коментирај на вести - permission_manage_documents: Manage documents - permission_view_documents: Прегледувај документи - permission_manage_files: Manage files - permission_view_files: Прегледувај датотеки - permission_manage_wiki: Manage wiki - permission_rename_wiki_pages: Преименувај вики страници - permission_delete_wiki_pages: Бриши вики страници - permission_view_wiki_pages: Прегледувај вики - permission_view_wiki_edits: Прегледувај вики историја - permission_edit_wiki_pages: Уредувај вики страници - permission_delete_wiki_pages_attachments: Бриши прилози - permission_protect_wiki_pages: Заштитувај вики страници - permission_manage_repository: Manage repository - permission_browse_repository: Browse repository - permission_view_changesets: View changesets - permission_commit_access: Commit access - permission_manage_boards: Manage boards - permission_view_messages: View messages - permission_add_messages: Post messages - permission_edit_messages: Уредувај пораки - permission_edit_own_messages: Уредувај сопствени пораки - permission_delete_messages: Бриши пораки - permission_delete_own_messages: Бриши сопствени пораки - permission_export_wiki_pages: Export wiki pages - permission_manage_subtasks: Manage subtasks - - project_module_issue_tracking: Следење на задачи - project_module_time_tracking: Следење на време - project_module_news: Вести - project_module_documents: Документи - project_module_files: Датотеки - project_module_wiki: Вики - project_module_repository: Repository - project_module_boards: Форуми - project_module_calendar: Календар - project_module_gantt: Gantt - - label_user: Корисник - label_user_plural: Корисници - label_user_new: Нов корисник - label_user_anonymous: Анонимен - label_project: Проект - label_project_new: Нов проект - label_project_plural: Проекти - label_x_projects: - zero: нема проекти - one: 1 проект - other: "%{count} проекти" - label_project_all: Сите проекти - label_project_latest: Последните проекти - label_issue: Задача - label_issue_new: Нова задача - label_issue_plural: Задачи - label_issue_view_all: Прегледај ги сите задачи - label_issues_by: "Задачи по %{value}" - label_issue_added: Задачата е додадена - label_issue_updated: Задачата е ажурирана - label_document: Документ - label_document_new: Нов документ - label_document_plural: Документи - label_document_added: Документот е додаден - label_role: Улога - label_role_plural: Улоги - label_role_new: Нова улога - label_role_and_permissions: Улоги и овластувања - label_member: Член - label_member_new: Нов член - label_member_plural: Членови - label_tracker: Tracker - label_tracker_plural: Trackers - label_tracker_new: New tracker - label_workflow: Workflow - label_issue_status: Статус на задача - label_issue_status_plural: Статуси на задачи - label_issue_status_new: Нов статус - label_issue_category: Категорија на задача - label_issue_category_plural: Категории на задачи - label_issue_category_new: Нова категорија - label_custom_field: Прилагодено поле - label_custom_field_plural: Прилагодени полиња - label_custom_field_new: Ново прилагодено поле - label_enumerations: Enumerations - label_enumeration_new: Нова вредност - label_information: Информација - label_information_plural: Информации - label_please_login: Најави се - label_register: Регистрирај се - label_login_with_open_id_option: или најави се со OpenID - label_password_lost: Изгубена лозинка - label_home: Почетна - label_my_page: Мојата страна - label_my_account: Мојот профил - label_my_projects: Мои проекти - label_my_page_block: Блок елемент - label_administration: Администрација - label_login: Најави се - label_logout: Одјави се - label_help: Помош - label_reported_issues: Пријавени задачи - label_assigned_to_me_issues: Задачи доделени на мене - label_last_login: Последна најава - label_registered_on: Регистриран на - label_activity: Активност - label_overall_activity: Севкупна активност - label_user_activity: "Активност на %{value}" - label_new: Нова - label_logged_as: Најавени сте како - label_environment: Опкружување - label_authentication: Автентикација - label_auth_source: Режим на автентикација - label_auth_source_new: Нов режим на автентикација - label_auth_source_plural: Режими на автентикација - label_subproject_plural: Подпроекти - label_subproject_new: Нов подпроект - label_and_its_subprojects: "%{value} и неговите подпроекти" - label_min_max_length: Мин. - Макс. должина - label_list: Листа - label_date: Дата - label_integer: Integer - label_float: Float - label_boolean: Boolean - label_string: Текст - label_text: Долг текст - label_attribute: Атрибут - label_attribute_plural: Атрибути - label_download: "%{count} превземање" - label_download_plural: "%{count} превземања" - label_no_data: Нема податоци за прикажување - label_change_status: Промени статус - label_history: Историја - label_attachment: Датотека - label_attachment_new: Нова датотека - label_attachment_delete: Избриши датотека - label_attachment_plural: Датотеки - label_file_added: Датотеката е додадена - label_report: Извештај - label_report_plural: Извештаи - label_news: Новост - label_news_new: Додади новост - label_news_plural: Новости - label_news_latest: Последни новости - label_news_view_all: Прегледај ги сите новости - label_news_added: Новостта е додадена - label_settings: Settings - label_overview: Преглед - label_version: Верзија - label_version_new: Нова верзија - label_version_plural: Верзии - label_close_versions: Затвори ги завршените врзии - label_confirmation: Потврда - label_export_to: 'Достапно и во:' - label_read: Прочитај... - label_public_projects: Јавни проекти - label_open_issues: отворена - label_open_issues_plural: отворени - label_closed_issues: затворена - label_closed_issues_plural: затворени - label_x_open_issues_abbr_on_total: - zero: 0 отворени / %{total} - one: 1 отворена / %{total} - other: "%{count} отворени / %{total}" - label_x_open_issues_abbr: - zero: 0 отворени - one: 1 отворена - other: "%{count} отворени" - label_x_closed_issues_abbr: - zero: 0 затворени - one: 1 затворена - other: "%{count} затворени" - label_total: Вкупно - label_permissions: Овластувања - label_current_status: Моментален статус - label_new_statuses_allowed: Дозволени нови статуси - label_all: сите - label_none: ниеден - label_nobody: никој - label_next: Следно - label_previous: Претходно - label_used_by: Користено од - label_details: Детали - label_add_note: Додади белешка - label_per_page: По страна - label_calendar: Календар - label_months_from: месеци од - label_gantt: Gantt - label_internal: Internal - label_last_changes: "последни %{count} промени" - label_change_view_all: Прегледај ги сите промени - label_personalize_page: Прилагоди ја странава - label_comment: Коментар - label_comment_plural: Коментари - label_x_comments: - zero: нема коментари - one: 1 коментар - other: "%{count} коментари" - label_comment_add: Додади коментар - label_comment_added: Коментарот е додаден - label_comment_delete: Избриши коментари - label_query: Custom query - label_query_plural: Custom queries - label_query_new: New query - label_filter_add: Додади филтер - label_filter_plural: Филтри - label_equals: е - label_not_equals: не е - label_in_less_than: за помалку од - label_in_more_than: за повеќе од - label_greater_or_equal: '>=' - label_less_or_equal: '<=' - label_in: во - label_today: денес - label_all_time: цело време - label_yesterday: вчера - label_this_week: оваа недела - label_last_week: минатата недела - label_last_n_days: "последните %{count} дена" - label_this_month: овој месец - label_last_month: минатиот месец - label_this_year: оваа година - label_date_range: Date range - label_less_than_ago: пред помалку од денови - label_more_than_ago: пред повеќе од денови - label_ago: пред денови - label_contains: содржи - label_not_contains: не содржи - label_day_plural: денови - label_repository: Складиште - label_repository_plural: Складишта - label_browse: Прелистувај - label_modification: "%{count} промени" - label_modification_plural: "%{count} промени" - label_branch: Гранка - label_tag: Tag - label_revision: Ревизија - label_revision_plural: Ревизии - label_revision_id: "Ревизија %{value}" - label_associated_revisions: Associated revisions - label_added: added - label_modified: modified - label_copied: copied - label_renamed: renamed - label_deleted: deleted - label_latest_revision: Последна ревизија - label_latest_revision_plural: Последни ревизии - label_view_revisions: Прегледај ги ревизиите - label_view_all_revisions: Прегледај ги сите ревизии - label_max_size: Макс. големина - label_sort_highest: Премести најгоре - label_sort_higher: Премести нагоре - label_sort_lower: Премести надоле - label_sort_lowest: Премести најдоле - label_roadmap: Roadmap - label_roadmap_due_in: "Due in %{value}" - label_roadmap_overdue: "Касни %{value}" - label_roadmap_no_issues: Нема задачи за оваа верзија - label_search: Барај - label_result_plural: Резултати - label_all_words: Сите зборови - label_wiki: Вики - label_wiki_edit: Вики уредување - label_wiki_edit_plural: Вики уредувања - label_wiki_page: Вики страница - label_wiki_page_plural: Вики страници - label_index_by_title: Индекс по наслов - label_index_by_date: Индекс по дата - label_current_version: Current version - label_preview: Preview - label_feed_plural: Feeds - label_changes_details: Детали за сите промени - label_issue_tracking: Следење на задачи - label_spent_time: Потрошено време - label_overall_spent_time: Вкупно потрошено време - label_f_hour: "%{value} час" - label_f_hour_plural: "%{value} часа" - label_time_tracking: Следење на време - label_change_plural: Промени - label_statistics: Статистики - label_commits_per_month: Commits per month - label_commits_per_author: Commits per author - label_view_diff: View differences - label_diff_inline: inline - label_diff_side_by_side: side by side - label_options: Опции - label_copy_workflow_from: Copy workflow from - label_permissions_report: Permissions report - label_watched_issues: Watched issues - label_related_issues: Поврзани задачи - label_applied_status: Applied status - label_loading: Loading... - label_relation_new: Нова релација - label_relation_delete: Избриши релација - label_relates_to: related to - label_duplicates: дупликати - label_duplicated_by: duplicated by - label_blocks: blocks - label_blocked_by: блокирано од - label_precedes: претходи - label_follows: следи - label_end_to_start: крај до почеток - label_end_to_end: крај до крај - label_start_to_start: почеток до почеток - label_start_to_end: почеток до крај - label_stay_logged_in: Останете најавени - label_disabled: disabled - label_show_completed_versions: Show completed versions - label_me: јас - label_board: Форум - label_board_new: Нов форум - label_board_plural: Форуми - label_board_locked: Заклучен - label_board_sticky: Sticky - label_topic_plural: Теми - label_message_plural: Пораки - label_message_last: Последна порака - label_message_new: Нова порака - label_message_posted: Поракате е додадена - label_reply_plural: Одговори - label_send_information: Испрати ги информациите за профилот на корисникот - label_year: Година - label_month: Месец - label_week: Недела - label_date_from: Од - label_date_to: До - label_language_based: Според јазикот на корисникот - label_sort_by: "Подреди според %{value}" - label_send_test_email: Испрати тест е-порака - label_feeds_access_key: RSS клуч за пристап - label_missing_feeds_access_key: Недостика RSS клуч за пристап - label_feeds_access_key_created_on: "RSS клучот за пристап креиран пред %{value}" - label_module_plural: Модули - label_added_time_by: "Додадено од %{author} пред %{age}" - label_updated_time_by: "Ажурирано од %{author} пред %{age}" - label_updated_time: "Ажурирано пред %{value}" - label_jump_to_a_project: Префрли се на проект... - label_file_plural: Датотеки - label_changeset_plural: Changesets - label_default_columns: Основни колони - label_no_change_option: (Без промена) - label_bulk_edit_selected_issues: Групно уредување на задачи - label_theme: Тема - label_default: Default - label_search_titles_only: Пребарувај само наслови - label_user_mail_option_all: "За било кој настан во сите мои проекти" - label_user_mail_option_selected: "За било кој настан само во избраните проекти..." - label_user_mail_no_self_notified: "Не ме известувај за промените што јас ги правам" - label_registration_activation_by_email: активација на профил преку е-пошта - label_registration_manual_activation: мануелна активација на профил - label_registration_automatic_activation: автоматска активација на профил - label_display_per_page: "По страна: %{value}" - label_age: Age - label_change_properties: Change properties - label_general: Општо - label_more: Повеќе - label_scm: SCM - label_plugins: Додатоци - label_ldap_authentication: LDAP автентикација - label_downloads_abbr: Превземања - label_optional_description: Опис (незадолжително) - label_add_another_file: Додади уште една датотека - label_preferences: Preferences - label_chronological_order: Во хронолошки ред - label_reverse_chronological_order: In reverse chronological order - label_planning: Планирање - label_incoming_emails: Дојдовни е-пораки - label_generate_key: Генерирај клуч - label_issue_watchers: Watchers - label_example: Пример - label_display: Прикажи - label_sort: Подреди - label_ascending: Растечки - label_descending: Опаѓачки - label_date_from_to: Од %{start} до %{end} - label_wiki_content_added: Вики страница додадена - label_wiki_content_updated: Вики страница ажурирана - label_group: Група - label_group_plural: Групи - label_group_new: Нова група - label_time_entry_plural: Потрошено време - label_version_sharing_none: Не споделено - label_version_sharing_descendants: Со сите подпроекти - label_version_sharing_hierarchy: Со хиерархијата на проектот - label_version_sharing_tree: Со дрвото на проектот - label_version_sharing_system: Со сите проекти - label_update_issue_done_ratios: Update issue done ratios - label_copy_source: Извор - label_copy_target: Дестинација - label_copy_same_as_target: Исто како дестинацијата - label_display_used_statuses_only: Only display statuses that are used by this tracker - label_api_access_key: API клуч за пристап - label_missing_api_access_key: Недостига API клуч за пристап - label_api_access_key_created_on: "API клучот за пристап е креиран пред %{value}" - label_profile: Профил - label_subtask_plural: Подзадачи - label_project_copy_notifications: Праќај известувања по е-пошта при копирање на проект - - button_login: Најави се - button_submit: Испрати - button_save: Зачувај - button_check_all: Штиклирај ги сите - button_uncheck_all: Одштиклирај ги сите - button_delete: Избриши - button_create: Креирај - button_create_and_continue: Креирај и продолжи - button_test: Тест - button_edit: Уреди - button_add: Додади - button_change: Промени - button_apply: Примени - button_clear: Избриши - button_lock: Заклучи - button_unlock: Отклучи - button_download: Превземи - button_list: List - button_view: Прегледај - button_move: Премести - button_move_and_follow: Премести и следи - button_back: Back - button_cancel: Откажи - button_activate: Активирај - button_sort: Подреди - button_log_time: Бележи време - button_rollback: Rollback to this version - button_watch: Следи - button_unwatch: Не следи - button_reply: Одговори - button_archive: Архивирај - button_unarchive: Одархивирај - button_reset: Reset - button_rename: Преименувај - button_change_password: Промени лозинка - button_copy: Копирај - button_copy_and_follow: Копирај и следи - button_annotate: Annotate - button_update: Ажурирај - button_configure: Конфигурирај - button_quote: Цитирај - button_duplicate: Копирај - button_show: Show - - status_active: активни - status_registered: регистрирани - status_locked: заклучени - - version_status_open: отворени - version_status_locked: заклучени - version_status_closed: затворени - - field_active: Active - - text_select_mail_notifications: Изберете за кои настани да се праќаат известувања по е-пошта да се праќаат. - text_regexp_info: eg. ^[A-Z0-9]+$ - text_min_max_length_info: 0 значи без ограничување - text_project_destroy_confirmation: Дали сте сигурни дека сакате да го избришете проектот и сите поврзани податоци? - text_subprojects_destroy_warning: "Неговите подпроекти: %{value} исто така ќе бидат избришани." - text_workflow_edit: Select a role and a tracker to edit the workflow - text_are_you_sure: Дали сте сигурни? - text_journal_changed: "%{label} променето од %{old} во %{new}" - text_journal_set_to: "%{label} set to %{value}" - text_journal_deleted: "%{label} избришан (%{old})" - text_journal_added: "%{label} %{value} додаден" - text_tip_issue_begin_day: задачи што почнуваат овој ден - text_tip_issue_end_day: задачи што завршуваат овој ден - text_tip_issue_begin_end_day: задачи што почнуваат и завршуваат овој ден - text_project_identifier_info: 'Only lower case letters (a-z), numbers, dashes and underscores are allowed.
Once saved, the identifier can not be changed.' - text_caracters_maximum: "%{count} знаци максимум." - text_caracters_minimum: "Мора да е најмалку %{count} знаци долго." - text_length_between: "Должина помеѓу %{min} и %{max} знаци." - text_tracker_no_workflow: No workflow defined for this tracker - text_unallowed_characters: Недозволени знаци - text_comma_separated: Дозволени се повеќе вредности (разделени со запирка). - text_line_separated: Дозволени се повеќе вредности (една линија за секоја вредност). - text_issues_ref_in_commit_messages: Referencing and fixing issues in commit messages - text_issue_added: "Задачата %{id} е пријавена од %{author}." - text_issue_updated: "Задачата %{id} е ажурирана од %{author}." - text_wiki_destroy_confirmation: Дали сте сигурни дека сакате да го избришете ова вики и целата негова содржина? - text_issue_category_destroy_question: "Некои задачи (%{count}) се доделени на оваа категорија. Што сакате да правите?" - text_issue_category_destroy_assignments: Remove category assignments - text_issue_category_reassign_to: Додели ги задачите на оваа категорија - text_user_mail_option: "For unselected projects, you will only receive notifications about things you watch or you're involved in (eg. issues you're the author or assignee)." - text_no_configuration_data: "Roles, trackers, issue statuses and workflow have not been configured yet.\nIt is highly recommended to load the default configuration. You will be able to modify it once loaded." - text_load_default_configuration: Load the default configuration - text_status_changed_by_changeset: "Applied in changeset %{value}." - text_issues_destroy_confirmation: 'Дали сте сигурни дека сакате да ги избришете избраните задачи?' - text_select_project_modules: 'Изберете модули за овој проект:' - text_default_administrator_account_changed: Default administrator account changed - text_file_repository_writable: Во папката за прилози може да се запишува - text_plugin_assets_writable: Во папката за додатоци може да се запишува - text_rmagick_available: RMagick available (незадолжително) - text_destroy_time_entries_question: "%{hours} hours were reported on the issues you are about to delete. What do you want to do ?" - text_destroy_time_entries: Delete reported hours - text_assign_time_entries_to_project: Додели ги пријавените часови на проектот - text_reassign_time_entries: 'Reassign reported hours to this issue:' - text_user_wrote: "%{value} напиша:" - text_enumeration_destroy_question: "%{count} objects are assigned to this value." - text_enumeration_category_reassign_to: 'Reassign them to this value:' - text_email_delivery_not_configured: "Доставата по е-пошта не е конфигурирана, и известувањата се оневозможени.\nКонфигурирајте го Вашиот SMTP сервер во config/configuration.yml и рестартирајте ја апликацијата." - text_repository_usernames_mapping: "Select or update the Redmine user mapped to each username found in the repository log.\nUsers with the same Redmine and repository username or email are automatically mapped." - text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.' - text_custom_field_possible_values_info: 'One line for each value' - text_wiki_page_destroy_question: "This page has %{descendants} child page(s) and descendant(s). What do you want to do?" - text_wiki_page_nullify_children: "Keep child pages as root pages" - text_wiki_page_destroy_children: "Delete child pages and all their descendants" - text_wiki_page_reassign_children: "Reassign child pages to this parent page" - text_own_membership_delete_confirmation: "You are about to remove some or all of your permissions and may no longer be able to edit this project after that.\nAre you sure you want to continue?" - text_zoom_in: Zoom in - text_zoom_out: Zoom out - - default_role_manager: Менаџер - default_role_developer: Developer - default_role_reporter: Reporter - default_role_non_member: Non member - default_role_anonymous: Anonymous - default_tracker_bug: Грешка - default_tracker_feature: Функционалност - default_tracker_support: Поддршка - default_issue_status_new: Нова - default_issue_status_in_progress: Во прогрес - default_issue_status_resolved: Разрешена - default_issue_status_feedback: Feedback - default_issue_status_closed: Затворена - default_issue_status_rejected: Одбиена - default_doc_category_user: Корисничка документација - default_doc_category_tech: Техничка документација - default_priority_low: Низок - default_priority_normal: Нормален - default_priority_high: Висок - default_priority_urgent: Итно - default_priority_immediate: Веднаш - default_activity_design: Дизајн - default_activity_development: Развој - - enumeration_issue_priorities: Приоритети на задача - enumeration_doc_categories: Категории на документ - enumeration_activities: Активности (следење на време) - enumeration_system_activity: Системска активност - - button_edit_associated_wikipage: "Edit associated Wiki page: %{page_title}" - text_are_you_sure_with_children: Delete issue and all child issues? - field_text: Text field - label_user_mail_option_only_owner: Only for things I am the owner of - setting_default_notification_option: Default notification option - label_user_mail_option_only_my_events: Only for things I watch or I'm involved in - label_user_mail_option_only_assigned: Only for things I am assigned to - label_user_mail_option_none: No events - field_member_of_group: Assignee's group - field_assigned_to_role: Assignee's role - notice_not_authorized_archived_project: The project you're trying to access has been archived. - label_principal_search: "Search for user or group:" - label_user_search: "Search for user:" - field_visible: Visible - setting_emails_header: Emails header - setting_commit_logtime_activity_id: Activity for logged time - text_time_logged_by_changeset: Applied in changeset %{value}. - setting_commit_logtime_enabled: Enable time logging - notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max}) - setting_gantt_items_limit: Maximum number of items displayed on the gantt chart - text_powered_by: Powered by %{link} +mk: + # Text direction: Left-to-Right (ltr) or Right-to-Left (rtl) + direction: ltr + date: + formats: + # Use the strftime parameters for formats. + # When no format has been given, it uses default. + # You can provide other formats here if you like! + default: "%d/%m/%Y" + short: "%d %b" + long: "%d %B, %Y" + + day_names: [недела, понеделник, вторник, среда, четврток, петок, сабота] + abbr_day_names: [нед, пон, вто, сре, чет, пет, саб] + + # Don't forget the nil at the beginning; there's no such thing as a 0th month + month_names: [~, јануари, февруари, март, април, мај, јуни, јули, август, септември, октомври, ноември, декември] + abbr_month_names: [~, јан, фев, мар, апр, мај, јун, јул, авг, сеп, окт, ное, дек] + # Used in date_select and datime_select. + order: + - :day + - :month + - :year + + time: + formats: + default: "%d/%m/%Y %H:%M" + time: "%H:%M" + short: "%d %b %H:%M" + long: "%d %B, %Y %H:%M" + am: "предпладне" + pm: "попладне" + + datetime: + distance_in_words: + half_a_minute: "пола минута" + less_than_x_seconds: + one: "помалку од 1 секунда" + other: "помалку од %{count} секунди" + x_seconds: + one: "1 секунда" + other: "%{count} секунди" + less_than_x_minutes: + one: "помалку од 1 минута" + other: "помалку од %{count} минути" + x_minutes: + one: "1 минута" + other: "%{count} минути" + about_x_hours: + one: "околу 1 час" + other: "околу %{count} часа" + x_days: + one: "1 ден" + other: "%{count} дена" + about_x_months: + one: "околу 1 месец" + other: "околу %{count} месеци" + x_months: + one: "1 месец" + other: "%{count} месеци" + about_x_years: + one: "околу 1 година" + other: "околу %{count} години" + over_x_years: + one: "преку 1 година" + other: "преку %{count} години" + almost_x_years: + one: "скоро 1 година" + other: "скоро %{count} години" + + number: + # Default format for numbers + format: + separator: "." + delimiter: "" + precision: 3 + human: + format: + delimiter: "" + precision: 1 + storage_units: + format: "%n %u" + units: + byte: + one: "Byte" + other: "Bytes" + kb: "KB" + mb: "MB" + gb: "GB" + tb: "TB" + + +# Used in array.to_sentence. + support: + array: + sentence_connector: "и" + skip_last_comma: false + + activerecord: + errors: + template: + header: + one: "1 error prohibited this %{model} from being saved" + other: "%{count} errors prohibited this %{model} from being saved" + messages: + inclusion: "не е вклучено во листата" + exclusion: "е резервирано" + invalid: "е невалидно" + confirmation: "не се совпаѓа со потврдата" + accepted: "мора да е прифатено" + empty: "неможе да е празно" + blank: "неможе да е празно" + too_long: "е предолго (макс. %{count} знаци)" + too_short: "е прекратко (мин. %{count} знаци)" + wrong_length: "е погрешна должина (треба да е %{count} знаци)" + taken: "е веќе зафатено" + not_a_number: "не е број" + not_a_date: "не е валидна дата" + greater_than: "мора да е поголемо од %{count}" + greater_than_or_equal_to: "мора да е поголемо или еднакво на %{count}" + equal_to: "мора да е еднакво на %{count}" + less_than: "мора да е помало од %{count}" + less_than_or_equal_to: "мора да е помало или еднакво на %{count}" + odd: "мора да е непарно" + even: "мора да е парно" + greater_than_start_date: "мора да е поголема од почетната дата" + not_same_project: "не припаѓа на истиот проект" + circular_dependency: "Оваа врска ќе креира кружна зависност" + cant_link_an_issue_with_a_descendant: "Задача неможе да се поврзе со една од нејзините подзадачи" + + actionview_instancetag_blank_option: Изберете + + general_text_No: 'Не' + general_text_Yes: 'Да' + general_text_no: 'не' + general_text_yes: 'да' + general_lang_name: 'Macedonian (Македонски)' + general_csv_separator: ',' + general_csv_decimal_separator: '.' + general_csv_encoding: UTF-8 + general_pdf_encoding: UTF-8 + general_first_day_of_week: '1' + + notice_account_updated: Профилот е успешно ажуриран. + notice_account_invalid_creditentials: Неточен корисник или лозинка + notice_account_password_updated: Лозинката е успешно ажурирана. + notice_account_wrong_password: Погрешна лозинка + notice_account_register_done: Профилот е успешно креиран. За активација, клкнете на врската што ви е пратена по е-пошта. + notice_account_unknown_email: Непознат корисник. + notice_can_t_change_password: This account uses an external authentication source. Impossible to change the password. + notice_account_lost_email_sent: An email with instructions to choose a new password has been sent to you. + notice_account_activated: Your account has been activated. You can now log in. + notice_successful_create: Успешно креирање. + notice_successful_update: Успешно ажурирање. + notice_successful_delete: Успешно бришење. + notice_successful_connection: Успешна конекција. + notice_file_not_found: The page you were trying to access doesn't exist or has been removed. + notice_locking_conflict: Data has been updated by another user. + notice_not_authorized: You are not authorized to access this page. + notice_email_sent: "Е-порака е пратена на %{value}" + notice_email_error: "Се случи грешка при праќање на е-пораката (%{value})" + notice_feeds_access_key_reseted: Вашиот RSS клуч за пристап е reset. + notice_api_access_key_reseted: Вашиот API клуч за пристап е reset. + notice_failed_to_save_issues: "Failed to save %{count} issue(s) on %{total} selected: %{ids}." + notice_failed_to_save_members: "Failed to save member(s): %{errors}." + notice_no_issue_selected: "No issue is selected! Please, check the issues you want to edit." + notice_account_pending: "Your account was created and is now pending administrator approval." + notice_default_data_loaded: Default configuration successfully loaded. + notice_unable_delete_version: Unable to delete version. + notice_unable_delete_time_entry: Unable to delete time log entry. + notice_issue_done_ratios_updated: Issue done ratios updated. + + error_can_t_load_default_data: "Default configuration could not be loaded: %{value}" + error_scm_not_found: "The entry or revision was not found in the repository." + error_scm_command_failed: "An error occurred when trying to access the repository: %{value}" + error_scm_annotate: "The entry does not exist or can not be annotated." + error_issue_not_found_in_project: 'The issue was not found or does not belong to this project' + error_no_tracker_in_project: 'No tracker is associated to this project. Please check the Project settings.' + error_no_default_issue_status: 'No default issue status is defined. Please check your configuration (Go to "Administration -> Issue statuses").' + error_can_not_delete_custom_field: Unable to delete custom field + error_can_not_delete_tracker: "This tracker contains issues and can't be deleted." + error_can_not_remove_role: "This role is in use and can not be deleted." + error_can_not_reopen_issue_on_closed_version: 'An issue assigned to a closed version can not be reopened' + error_can_not_archive_project: This project can not be archived + error_issue_done_ratios_not_updated: "Issue done ratios not updated." + error_workflow_copy_source: 'Please select a source tracker or role' + error_workflow_copy_target: 'Please select target tracker(s) and role(s)' + error_unable_delete_issue_status: 'Unable to delete issue status' + error_unable_to_connect: "Unable to connect (%{value})" + warning_attachments_not_saved: "%{count} file(s) could not be saved." + + mail_subject_lost_password: "Вашата %{value} лозинка" + mail_body_lost_password: 'To change your password, click on the following link:' + mail_subject_register: "Your %{value} account activation" + mail_body_register: 'To activate your account, click on the following link:' + mail_body_account_information_external: "You can use your %{value} account to log in." + mail_body_account_information: Your account information + mail_subject_account_activation_request: "%{value} account activation request" + mail_body_account_activation_request: "Нов корисник (%{value}) е регистриран. The account is pending your approval:" + mail_subject_reminder: "%{count} issue(s) due in the next %{days} days" + mail_body_reminder: "%{count} issue(s) that are assigned to you are due in the next %{days} days:" + mail_subject_wiki_content_added: "'%{id}' wiki page has been added" + mail_body_wiki_content_added: "The '%{id}' wiki page has been added by %{author}." + mail_subject_wiki_content_updated: "'%{id}' wiki page has been updated" + mail_body_wiki_content_updated: "The '%{id}' wiki page has been updated by %{author}." + + gui_validation_error: 1 грешка + gui_validation_error_plural: "%{count} грешки" + + field_name: Име + field_description: Опис + field_summary: Краток опис + field_is_required: Задолжително + field_firstname: Име + field_lastname: Презиме + field_mail: Е-пошта + field_filename: Датотека + field_filesize: Големина + field_downloads: Превземања + field_author: Автор + field_created_on: Креиран + field_updated_on: Ажурирано + field_field_format: Формат + field_is_for_all: За сите проекти + field_possible_values: Можни вредности + field_regexp: Regular expression + field_min_length: Минимална должина + field_max_length: Максимална должина + field_value: Вредност + field_category: Категорија + field_title: Наслов + field_project: Проект + field_issue: Задача + field_status: Статус + field_notes: Белешки + field_is_closed: Задачата е затворена + field_is_default: Default value + field_tracker: Tracker + field_subject: Наслов + field_due_date: Краен рок + field_assigned_to: Доделена на + field_priority: Приоритет + field_fixed_version: Target version + field_user: Корисник + field_principal: Principal + field_role: Улога + field_homepage: Веб страна + field_is_public: Јавен + field_parent: Подпроект на + field_is_in_roadmap: Issues displayed in roadmap + field_login: Корисник + field_mail_notification: Известувања по e-пошта + field_admin: Администратор + field_last_login_on: Последна најава + field_language: Јазик + field_password: Лозинка + field_new_password: Нова лозинка + field_password_confirmation: Потврда + field_version: Верзија + field_type: Тип + field_host: Хост + field_port: Порт + field_account: Account + field_base_dn: Base DN + field_attr_login: Login attribute + field_attr_firstname: Firstname attribute + field_attr_lastname: Lastname attribute + field_attr_mail: Email attribute + field_onthefly: Моментално (On-the-fly) креирање на корисници + field_start_date: Почеток + field_done_ratio: "% Завршено" + field_auth_source: Режим на автентикација + field_hide_mail: Криј ја мојата адреса на е-пошта + field_comments: Коментар + field_url: URL + field_start_page: Почетна страна + field_subproject: Подпроект + field_hours: Часови + field_activity: Активност + field_spent_on: Дата + field_identifier: Идентификатор + field_is_filter: Користи како филтер + field_issue_to: Поврзана задача + field_delay: Доцнење + field_assignable: На оваа улога може да се доделуваат задачи + field_redirect_existing_links: Пренасочи ги постоечките врски + field_estimated_hours: Проценето време + field_column_names: Колони + field_time_entries: Бележи време + field_time_zone: Временска зона + field_searchable: Може да се пребарува + field_default_value: Default value + field_comments_sorting: Прикажувај коментари + field_parent_title: Parent page + field_editable: Може да се уредува + field_watcher: Watcher + field_identity_url: OpenID URL + field_content: Содржина + field_group_by: Групирај ги резултатите според + field_sharing: Споделување + field_parent_issue: Parent task + + setting_app_title: Наслов на апликацијата + setting_app_subtitle: Поднаслов на апликацијата + setting_welcome_text: Текст за добредојде + setting_default_language: Default јазик + setting_login_required: Задолжителна автентикација + setting_self_registration: Само-регистрација + setting_attachment_max_size: Макс. големина на прилог + setting_issues_export_limit: Issues export limit + setting_mail_from: Emission email address + setting_bcc_recipients: Blind carbon copy recipients (bcc) + setting_plain_text_mail: Текстуални е-пораки (без HTML) + setting_host_name: Име на хост и патека + setting_text_formatting: Форматирање на текст + setting_wiki_compression: Компресија на историјата на вики + setting_feeds_limit: Feed content limit + setting_default_projects_public: Новите проекти се иницијално јавни + setting_autofetch_changesets: Autofetch commits + setting_sys_api_enabled: Enable WS for repository management + setting_commit_ref_keywords: Referencing keywords + setting_commit_fix_keywords: Fixing keywords + setting_autologin: Автоматска најава + setting_date_format: Формат на дата + setting_time_format: Формат на време + setting_cross_project_issue_relations: Дозволи релации на задачи меѓу проекти + setting_issue_list_default_columns: Default columns displayed on the issue list + setting_repositories_encodings: Repositories encodings + setting_commit_logs_encoding: Commit messages encoding + setting_emails_footer: Emails footer + setting_protocol: Протокол + setting_per_page_options: Objects per page options + setting_user_format: Приказ на корисниците + setting_activity_days_default: Денови прикажана во активноста на проектот + setting_display_subprojects_issues: Прикажи ги задачите на подпроектите во главните проекти + setting_enabled_scm: Овозможи SCM + setting_mail_handler_body_delimiters: "Truncate emails after one of these lines" + setting_mail_handler_api_enabled: Enable WS for incoming emails + setting_mail_handler_api_key: API клуч + setting_sequential_project_identifiers: Генерирај последователни идентификатори на проекти + setting_gravatar_enabled: Користи Gravatar кориснички икони + setting_gravatar_default: Default Gravatar image + setting_diff_max_lines_displayed: Max number of diff lines displayed + setting_file_max_size_displayed: Max size of text files displayed inline + setting_repository_log_display_limit: Maximum number of revisions displayed on file log + setting_openid: Дозволи OpenID најава и регистрација + setting_password_min_length: Мин. должина на лозинка + setting_new_project_user_role_id: Улога доделена на неадминистраторски корисник кој креира проект + setting_default_projects_modules: Default enabled modules for new projects + setting_issue_done_ratio: Calculate the issue done ratio with + setting_issue_done_ratio_issue_field: Use the issue field + setting_issue_done_ratio_issue_status: Use the issue status + setting_start_of_week: Start calendars on + setting_rest_api_enabled: Enable REST web service + setting_cache_formatted_text: Cache formatted text + + permission_add_project: Креирај проекти + permission_add_subprojects: Креирај подпроекти + permission_edit_project: Уреди проект + permission_select_project_modules: Изберете модули за проект + permission_manage_members: Manage members + permission_manage_project_activities: Manage project activities + permission_manage_versions: Manage versions + permission_manage_categories: Manage issue categories + permission_view_issues: Прегледај задачи + permission_add_issues: Додавај задачи + permission_edit_issues: Уредувај задачи + permission_manage_issue_relations: Manage issue relations + permission_add_issue_notes: Додавај белешки + permission_edit_issue_notes: Уредувај белешки + permission_edit_own_issue_notes: Уредувај сопствени белешки + permission_move_issues: Преместувај задачи + permission_delete_issues: Бриши задачи + permission_manage_public_queries: Manage public queries + permission_save_queries: Save queries + permission_view_gantt: View gantt chart + permission_view_calendar: View calendar + permission_view_issue_watchers: View watchers list + permission_add_issue_watchers: Add watchers + permission_delete_issue_watchers: Delete watchers + permission_log_time: Бележи потрошено време + permission_view_time_entries: Прегледај потрошено време + permission_edit_time_entries: Уредувај белешки за потрошено време + permission_edit_own_time_entries: Уредувај сопствени белешки за потрошено време + permission_manage_news: Manage news + permission_comment_news: Коментирај на вести + permission_manage_documents: Manage documents + permission_view_documents: Прегледувај документи + permission_manage_files: Manage files + permission_view_files: Прегледувај датотеки + permission_manage_wiki: Manage wiki + permission_rename_wiki_pages: Преименувај вики страници + permission_delete_wiki_pages: Бриши вики страници + permission_view_wiki_pages: Прегледувај вики + permission_view_wiki_edits: Прегледувај вики историја + permission_edit_wiki_pages: Уредувај вики страници + permission_delete_wiki_pages_attachments: Бриши прилози + permission_protect_wiki_pages: Заштитувај вики страници + permission_manage_repository: Manage repository + permission_browse_repository: Browse repository + permission_view_changesets: View changesets + permission_commit_access: Commit access + permission_manage_boards: Manage boards + permission_view_messages: View messages + permission_add_messages: Post messages + permission_edit_messages: Уредувај пораки + permission_edit_own_messages: Уредувај сопствени пораки + permission_delete_messages: Бриши пораки + permission_delete_own_messages: Бриши сопствени пораки + permission_export_wiki_pages: Export wiki pages + permission_manage_subtasks: Manage subtasks + + project_module_issue_tracking: Следење на задачи + project_module_time_tracking: Следење на време + project_module_news: Вести + project_module_documents: Документи + project_module_files: Датотеки + project_module_wiki: Вики + project_module_repository: Repository + project_module_boards: Форуми + project_module_calendar: Календар + project_module_gantt: Gantt + + label_user: Корисник + label_user_plural: Корисници + label_user_new: Нов корисник + label_user_anonymous: Анонимен + label_project: Проект + label_project_new: Нов проект + label_project_plural: Проекти + label_x_projects: + zero: нема проекти + one: 1 проект + other: "%{count} проекти" + label_project_all: Сите проекти + label_project_latest: Последните проекти + label_issue: Задача + label_issue_new: Нова задача + label_issue_plural: Задачи + label_issue_view_all: Прегледај ги сите задачи + label_issues_by: "Задачи по %{value}" + label_issue_added: Задачата е додадена + label_issue_updated: Задачата е ажурирана + label_document: Документ + label_document_new: Нов документ + label_document_plural: Документи + label_document_added: Документот е додаден + label_role: Улога + label_role_plural: Улоги + label_role_new: Нова улога + label_role_and_permissions: Улоги и овластувања + label_member: Член + label_member_new: Нов член + label_member_plural: Членови + label_tracker: Tracker + label_tracker_plural: Trackers + label_tracker_new: New tracker + label_workflow: Workflow + label_issue_status: Статус на задача + label_issue_status_plural: Статуси на задачи + label_issue_status_new: Нов статус + label_issue_category: Категорија на задача + label_issue_category_plural: Категории на задачи + label_issue_category_new: Нова категорија + label_custom_field: Прилагодено поле + label_custom_field_plural: Прилагодени полиња + label_custom_field_new: Ново прилагодено поле + label_enumerations: Enumerations + label_enumeration_new: Нова вредност + label_information: Информација + label_information_plural: Информации + label_please_login: Најави се + label_register: Регистрирај се + label_login_with_open_id_option: или најави се со OpenID + label_password_lost: Изгубена лозинка + label_home: Почетна + label_my_page: Мојата страна + label_my_account: Мојот профил + label_my_projects: Мои проекти + label_my_page_block: Блок елемент + label_administration: Администрација + label_login: Најави се + label_logout: Одјави се + label_help: Помош + label_reported_issues: Пријавени задачи + label_assigned_to_me_issues: Задачи доделени на мене + label_last_login: Последна најава + label_registered_on: Регистриран на + label_activity: Активност + label_overall_activity: Севкупна активност + label_user_activity: "Активност на %{value}" + label_new: Нова + label_logged_as: Најавени сте како + label_environment: Опкружување + label_authentication: Автентикација + label_auth_source: Режим на автентикација + label_auth_source_new: Нов режим на автентикација + label_auth_source_plural: Режими на автентикација + label_subproject_plural: Подпроекти + label_subproject_new: Нов подпроект + label_and_its_subprojects: "%{value} и неговите подпроекти" + label_min_max_length: Мин. - Макс. должина + label_list: Листа + label_date: Дата + label_integer: Integer + label_float: Float + label_boolean: Boolean + label_string: Текст + label_text: Долг текст + label_attribute: Атрибут + label_attribute_plural: Атрибути + label_download: "%{count} превземање" + label_download_plural: "%{count} превземања" + label_no_data: Нема податоци за прикажување + label_change_status: Промени статус + label_history: Историја + label_attachment: Датотека + label_attachment_new: Нова датотека + label_attachment_delete: Избриши датотека + label_attachment_plural: Датотеки + label_file_added: Датотеката е додадена + label_report: Извештај + label_report_plural: Извештаи + label_news: Новост + label_news_new: Додади новост + label_news_plural: Новости + label_news_latest: Последни новости + label_news_view_all: Прегледај ги сите новости + label_news_added: Новостта е додадена + label_settings: Settings + label_overview: Преглед + label_version: Верзија + label_version_new: Нова верзија + label_version_plural: Верзии + label_close_versions: Затвори ги завршените врзии + label_confirmation: Потврда + label_export_to: 'Достапно и во:' + label_read: Прочитај... + label_public_projects: Јавни проекти + label_open_issues: отворена + label_open_issues_plural: отворени + label_closed_issues: затворена + label_closed_issues_plural: затворени + label_x_open_issues_abbr_on_total: + zero: 0 отворени / %{total} + one: 1 отворена / %{total} + other: "%{count} отворени / %{total}" + label_x_open_issues_abbr: + zero: 0 отворени + one: 1 отворена + other: "%{count} отворени" + label_x_closed_issues_abbr: + zero: 0 затворени + one: 1 затворена + other: "%{count} затворени" + label_total: Вкупно + label_permissions: Овластувања + label_current_status: Моментален статус + label_new_statuses_allowed: Дозволени нови статуси + label_all: сите + label_none: ниеден + label_nobody: никој + label_next: Следно + label_previous: Претходно + label_used_by: Користено од + label_details: Детали + label_add_note: Додади белешка + label_per_page: По страна + label_calendar: Календар + label_months_from: месеци од + label_gantt: Gantt + label_internal: Internal + label_last_changes: "последни %{count} промени" + label_change_view_all: Прегледај ги сите промени + label_personalize_page: Прилагоди ја странава + label_comment: Коментар + label_comment_plural: Коментари + label_x_comments: + zero: нема коментари + one: 1 коментар + other: "%{count} коментари" + label_comment_add: Додади коментар + label_comment_added: Коментарот е додаден + label_comment_delete: Избриши коментари + label_query: Custom query + label_query_plural: Custom queries + label_query_new: New query + label_filter_add: Додади филтер + label_filter_plural: Филтри + label_equals: е + label_not_equals: не е + label_in_less_than: за помалку од + label_in_more_than: за повеќе од + label_greater_or_equal: '>=' + label_less_or_equal: '<=' + label_in: во + label_today: денес + label_all_time: цело време + label_yesterday: вчера + label_this_week: оваа недела + label_last_week: минатата недела + label_last_n_days: "последните %{count} дена" + label_this_month: овој месец + label_last_month: минатиот месец + label_this_year: оваа година + label_date_range: Date range + label_less_than_ago: пред помалку од денови + label_more_than_ago: пред повеќе од денови + label_ago: пред денови + label_contains: содржи + label_not_contains: не содржи + label_day_plural: денови + label_repository: Складиште + label_repository_plural: Складишта + label_browse: Прелистувај + label_modification: "%{count} промени" + label_modification_plural: "%{count} промени" + label_branch: Гранка + label_tag: Tag + label_revision: Ревизија + label_revision_plural: Ревизии + label_revision_id: "Ревизија %{value}" + label_associated_revisions: Associated revisions + label_added: added + label_modified: modified + label_copied: copied + label_renamed: renamed + label_deleted: deleted + label_latest_revision: Последна ревизија + label_latest_revision_plural: Последни ревизии + label_view_revisions: Прегледај ги ревизиите + label_view_all_revisions: Прегледај ги сите ревизии + label_max_size: Макс. големина + label_sort_highest: Премести најгоре + label_sort_higher: Премести нагоре + label_sort_lower: Премести надоле + label_sort_lowest: Премести најдоле + label_roadmap: Roadmap + label_roadmap_due_in: "Due in %{value}" + label_roadmap_overdue: "Касни %{value}" + label_roadmap_no_issues: Нема задачи за оваа верзија + label_search: Барај + label_result_plural: Резултати + label_all_words: Сите зборови + label_wiki: Вики + label_wiki_edit: Вики уредување + label_wiki_edit_plural: Вики уредувања + label_wiki_page: Вики страница + label_wiki_page_plural: Вики страници + label_index_by_title: Индекс по наслов + label_index_by_date: Индекс по дата + label_current_version: Current version + label_preview: Preview + label_feed_plural: Feeds + label_changes_details: Детали за сите промени + label_issue_tracking: Следење на задачи + label_spent_time: Потрошено време + label_overall_spent_time: Вкупно потрошено време + label_f_hour: "%{value} час" + label_f_hour_plural: "%{value} часа" + label_time_tracking: Следење на време + label_change_plural: Промени + label_statistics: Статистики + label_commits_per_month: Commits per month + label_commits_per_author: Commits per author + label_view_diff: View differences + label_diff_inline: inline + label_diff_side_by_side: side by side + label_options: Опции + label_copy_workflow_from: Copy workflow from + label_permissions_report: Permissions report + label_watched_issues: Watched issues + label_related_issues: Поврзани задачи + label_applied_status: Applied status + label_loading: Loading... + label_relation_new: Нова релација + label_relation_delete: Избриши релација + label_relates_to: related to + label_duplicates: дупликати + label_duplicated_by: duplicated by + label_blocks: blocks + label_blocked_by: блокирано од + label_precedes: претходи + label_follows: следи + label_end_to_start: крај до почеток + label_end_to_end: крај до крај + label_start_to_start: почеток до почеток + label_start_to_end: почеток до крај + label_stay_logged_in: Останете најавени + label_disabled: disabled + label_show_completed_versions: Show completed versions + label_me: јас + label_board: Форум + label_board_new: Нов форум + label_board_plural: Форуми + label_board_locked: Заклучен + label_board_sticky: Sticky + label_topic_plural: Теми + label_message_plural: Пораки + label_message_last: Последна порака + label_message_new: Нова порака + label_message_posted: Поракате е додадена + label_reply_plural: Одговори + label_send_information: Испрати ги информациите за профилот на корисникот + label_year: Година + label_month: Месец + label_week: Недела + label_date_from: Од + label_date_to: До + label_language_based: Според јазикот на корисникот + label_sort_by: "Подреди според %{value}" + label_send_test_email: Испрати тест е-порака + label_feeds_access_key: RSS клуч за пристап + label_missing_feeds_access_key: Недостика RSS клуч за пристап + label_feeds_access_key_created_on: "RSS клучот за пристап креиран пред %{value}" + label_module_plural: Модули + label_added_time_by: "Додадено од %{author} пред %{age}" + label_updated_time_by: "Ажурирано од %{author} пред %{age}" + label_updated_time: "Ажурирано пред %{value}" + label_jump_to_a_project: Префрли се на проект... + label_file_plural: Датотеки + label_changeset_plural: Changesets + label_default_columns: Основни колони + label_no_change_option: (Без промена) + label_bulk_edit_selected_issues: Групно уредување на задачи + label_theme: Тема + label_default: Default + label_search_titles_only: Пребарувај само наслови + label_user_mail_option_all: "За било кој настан во сите мои проекти" + label_user_mail_option_selected: "За било кој настан само во избраните проекти..." + label_user_mail_no_self_notified: "Не ме известувај за промените што јас ги правам" + label_registration_activation_by_email: активација на профил преку е-пошта + label_registration_manual_activation: мануелна активација на профил + label_registration_automatic_activation: автоматска активација на профил + label_display_per_page: "По страна: %{value}" + label_age: Age + label_change_properties: Change properties + label_general: Општо + label_more: Повеќе + label_scm: SCM + label_plugins: Додатоци + label_ldap_authentication: LDAP автентикација + label_downloads_abbr: Превземања + label_optional_description: Опис (незадолжително) + label_add_another_file: Додади уште една датотека + label_preferences: Preferences + label_chronological_order: Во хронолошки ред + label_reverse_chronological_order: In reverse chronological order + label_planning: Планирање + label_incoming_emails: Дојдовни е-пораки + label_generate_key: Генерирај клуч + label_issue_watchers: Watchers + label_example: Пример + label_display: Прикажи + label_sort: Подреди + label_ascending: Растечки + label_descending: Опаѓачки + label_date_from_to: Од %{start} до %{end} + label_wiki_content_added: Вики страница додадена + label_wiki_content_updated: Вики страница ажурирана + label_group: Група + label_group_plural: Групи + label_group_new: Нова група + label_time_entry_plural: Потрошено време + label_version_sharing_none: Не споделено + label_version_sharing_descendants: Со сите подпроекти + label_version_sharing_hierarchy: Со хиерархијата на проектот + label_version_sharing_tree: Со дрвото на проектот + label_version_sharing_system: Со сите проекти + label_update_issue_done_ratios: Update issue done ratios + label_copy_source: Извор + label_copy_target: Дестинација + label_copy_same_as_target: Исто како дестинацијата + label_display_used_statuses_only: Only display statuses that are used by this tracker + label_api_access_key: API клуч за пристап + label_missing_api_access_key: Недостига API клуч за пристап + label_api_access_key_created_on: "API клучот за пристап е креиран пред %{value}" + label_profile: Профил + label_subtask_plural: Подзадачи + label_project_copy_notifications: Праќај известувања по е-пошта при копирање на проект + + button_login: Најави се + button_submit: Испрати + button_save: Зачувај + button_check_all: Штиклирај ги сите + button_uncheck_all: Одштиклирај ги сите + button_delete: Избриши + button_create: Креирај + button_create_and_continue: Креирај и продолжи + button_test: Тест + button_edit: Уреди + button_add: Додади + button_change: Промени + button_apply: Примени + button_clear: Избриши + button_lock: Заклучи + button_unlock: Отклучи + button_download: Превземи + button_list: List + button_view: Прегледај + button_move: Премести + button_move_and_follow: Премести и следи + button_back: Back + button_cancel: Откажи + button_activate: Активирај + button_sort: Подреди + button_log_time: Бележи време + button_rollback: Rollback to this version + button_watch: Следи + button_unwatch: Не следи + button_reply: Одговори + button_archive: Архивирај + button_unarchive: Одархивирај + button_reset: Reset + button_rename: Преименувај + button_change_password: Промени лозинка + button_copy: Копирај + button_copy_and_follow: Копирај и следи + button_annotate: Annotate + button_update: Ажурирај + button_configure: Конфигурирај + button_quote: Цитирај + button_duplicate: Копирај + button_show: Show + + status_active: активни + status_registered: регистрирани + status_locked: заклучени + + version_status_open: отворени + version_status_locked: заклучени + version_status_closed: затворени + + field_active: Active + + text_select_mail_notifications: Изберете за кои настани да се праќаат известувања по е-пошта да се праќаат. + text_regexp_info: eg. ^[A-Z0-9]+$ + text_min_max_length_info: 0 значи без ограничување + text_project_destroy_confirmation: Дали сте сигурни дека сакате да го избришете проектот и сите поврзани податоци? + text_subprojects_destroy_warning: "Неговите подпроекти: %{value} исто така ќе бидат избришани." + text_workflow_edit: Select a role and a tracker to edit the workflow + text_are_you_sure: Дали сте сигурни? + text_journal_changed: "%{label} променето од %{old} во %{new}" + text_journal_set_to: "%{label} set to %{value}" + text_journal_deleted: "%{label} избришан (%{old})" + text_journal_added: "%{label} %{value} додаден" + text_tip_issue_begin_day: задачи што почнуваат овој ден + text_tip_issue_end_day: задачи што завршуваат овој ден + text_tip_issue_begin_end_day: задачи што почнуваат и завршуваат овој ден + text_project_identifier_info: 'Only lower case letters (a-z), numbers, dashes and underscores are allowed.
Once saved, the identifier can not be changed.' + text_caracters_maximum: "%{count} знаци максимум." + text_caracters_minimum: "Мора да е најмалку %{count} знаци долго." + text_length_between: "Должина помеѓу %{min} и %{max} знаци." + text_tracker_no_workflow: No workflow defined for this tracker + text_unallowed_characters: Недозволени знаци + text_comma_separated: Дозволени се повеќе вредности (разделени со запирка). + text_line_separated: Дозволени се повеќе вредности (една линија за секоја вредност). + text_issues_ref_in_commit_messages: Referencing and fixing issues in commit messages + text_issue_added: "Задачата %{id} е пријавена од %{author}." + text_issue_updated: "Задачата %{id} е ажурирана од %{author}." + text_wiki_destroy_confirmation: Дали сте сигурни дека сакате да го избришете ова вики и целата негова содржина? + text_issue_category_destroy_question: "Некои задачи (%{count}) се доделени на оваа категорија. Што сакате да правите?" + text_issue_category_destroy_assignments: Remove category assignments + text_issue_category_reassign_to: Додели ги задачите на оваа категорија + text_user_mail_option: "For unselected projects, you will only receive notifications about things you watch or you're involved in (eg. issues you're the author or assignee)." + text_no_configuration_data: "Roles, trackers, issue statuses and workflow have not been configured yet.\nIt is highly recommended to load the default configuration. You will be able to modify it once loaded." + text_load_default_configuration: Load the default configuration + text_status_changed_by_changeset: "Applied in changeset %{value}." + text_issues_destroy_confirmation: 'Дали сте сигурни дека сакате да ги избришете избраните задачи?' + text_select_project_modules: 'Изберете модули за овој проект:' + text_default_administrator_account_changed: Default administrator account changed + text_file_repository_writable: Во папката за прилози може да се запишува + text_plugin_assets_writable: Во папката за додатоци може да се запишува + text_rmagick_available: RMagick available (незадолжително) + text_destroy_time_entries_question: "%{hours} hours were reported on the issues you are about to delete. What do you want to do ?" + text_destroy_time_entries: Delete reported hours + text_assign_time_entries_to_project: Додели ги пријавените часови на проектот + text_reassign_time_entries: 'Reassign reported hours to this issue:' + text_user_wrote: "%{value} напиша:" + text_enumeration_destroy_question: "%{count} objects are assigned to this value." + text_enumeration_category_reassign_to: 'Reassign them to this value:' + text_email_delivery_not_configured: "Доставата по е-пошта не е конфигурирана, и известувањата се оневозможени.\nКонфигурирајте го Вашиот SMTP сервер во config/configuration.yml и рестартирајте ја апликацијата." + text_repository_usernames_mapping: "Select or update the Redmine user mapped to each username found in the repository log.\nUsers with the same Redmine and repository username or email are automatically mapped." + text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.' + text_custom_field_possible_values_info: 'One line for each value' + text_wiki_page_destroy_question: "This page has %{descendants} child page(s) and descendant(s). What do you want to do?" + text_wiki_page_nullify_children: "Keep child pages as root pages" + text_wiki_page_destroy_children: "Delete child pages and all their descendants" + text_wiki_page_reassign_children: "Reassign child pages to this parent page" + text_own_membership_delete_confirmation: "You are about to remove some or all of your permissions and may no longer be able to edit this project after that.\nAre you sure you want to continue?" + text_zoom_in: Zoom in + text_zoom_out: Zoom out + + default_role_manager: Менаџер + default_role_developer: Developer + default_role_reporter: Reporter + default_role_non_member: Non member + default_role_anonymous: Anonymous + default_tracker_bug: Грешка + default_tracker_feature: Функционалност + default_tracker_support: Поддршка + default_issue_status_new: Нова + default_issue_status_in_progress: Во прогрес + default_issue_status_resolved: Разрешена + default_issue_status_feedback: Feedback + default_issue_status_closed: Затворена + default_issue_status_rejected: Одбиена + default_doc_category_user: Корисничка документација + default_doc_category_tech: Техничка документација + default_priority_low: Низок + default_priority_normal: Нормален + default_priority_high: Висок + default_priority_urgent: Итно + default_priority_immediate: Веднаш + default_activity_design: Дизајн + default_activity_development: Развој + + enumeration_issue_priorities: Приоритети на задача + enumeration_doc_categories: Категории на документ + enumeration_activities: Активности (следење на време) + enumeration_system_activity: Системска активност + + button_edit_associated_wikipage: "Edit associated Wiki page: %{page_title}" + text_are_you_sure_with_children: Delete issue and all child issues? + field_text: Text field + label_user_mail_option_only_owner: Only for things I am the owner of + setting_default_notification_option: Default notification option + label_user_mail_option_only_my_events: Only for things I watch or I'm involved in + label_user_mail_option_only_assigned: Only for things I am assigned to + label_user_mail_option_none: No events + field_member_of_group: Assignee's group + field_assigned_to_role: Assignee's role + notice_not_authorized_archived_project: The project you're trying to access has been archived. + label_principal_search: "Search for user or group:" + label_user_search: "Search for user:" + field_visible: Visible + setting_emails_header: Emails header + setting_commit_logtime_activity_id: Activity for logged time + text_time_logged_by_changeset: Applied in changeset %{value}. + setting_commit_logtime_enabled: Enable time logging + notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max}) + setting_gantt_items_limit: Maximum number of items displayed on the gantt chart + text_powered_by: Powered by %{link} label_cvs_module: Module label_filesystem_path: Root directory label_darcs_path: Root directory @@ -946,3 +948,18 @@ mk: label_cvs_path: CVSROOT label_git_path: Path to .git directory label_mercurial_path: Root directory + label_my_queries: My custom queries + label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee + text_journal_changed_no_detail: "%{label} updated" + button_expand_all: Expand all + button_collapse_all: Collapse all + label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author + field_effective_date: Due date + label_news_comment_added: Comment added to a news + field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text + text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page. + text_default_encoding: "Default: UTF-8" + text_git_repo_example: a bare and local repository (e.g. /gitrepo, c:\gitrepo) + label_notify_member_plural: Email issue updates + label_path_encoding: Path encoding + text_mercurial_repo_example: local repository (e.g. /hgrepo, c:\hgrepo) diff --git a/config/locales/mn.yml b/config/locales/mn.yml index 186c3133..2c62135a 100644 --- a/config/locales/mn.yml +++ b/config/locales/mn.yml @@ -1,945 +1,947 @@ -mn: - direction: ltr - date: - formats: - # Use the strftime parameters for formats. - # When no format has been given, it uses default. - # You can provide other formats here if you like! - default: "%Y/%m/%d" - short: "%b %d" - long: "%Y, %B %d" - - day_names: [Даваа, Мягмар, Лхагва, Пүрэв, Баасан, Бямба, Ням] - abbr_day_names: [Дав, Мяг, Лха, Пүр, Бсн, Бям, Ням] - - # Don't forget the nil at the beginning; there's no such thing as a 0th month - month_names: [~, 1-р сар, 2-р сар, 3-р сар, 4-р сар, 5-р сар, 6-р сар, 7-р сар, 8-р сар, 9-р сар, 10-р сар, 11-р сар, 12-р сар] - abbr_month_names: [~, 1сар, 2сар, 3сар, 4сар, 5сар, 6сар, 7сар, 8сар, 9сар, 10сар, 11сар, 12сар] - # Used in date_select and datime_select. - order: [ :day, :month, :year ] - - time: - formats: - default: "%Y/%m/%d %I:%M %p" - time: "%I:%M %p" - short: "%d %b %H:%M" - long: "%Y, %B %d %H:%M" - am: "am" - pm: "pm" - - datetime: - distance_in_words: - half_a_minute: "хагас минут" - less_than_x_seconds: - one: "секунд орчим" - other: "%{count} секундээс бага хугацаа" - x_seconds: - one: "1 секунд" - other: "%{count} секунд" - less_than_x_minutes: - one: "минутаас бага хугацаа" - other: "%{count} минутаас бага хугацаа" - x_minutes: - one: "1 минут" - other: "%{count} минут" - about_x_hours: - one: "1 цаг орчим" - other: "ойролцоогоор %{count} цаг" - x_days: - one: "1 өдөр" - other: "%{count} өдөр" - about_x_months: - one: "1 сар орчим" - other: "ойролцоогоор %{count} сар" - x_months: - one: "1 сар" - other: "%{count} сар" - about_x_years: - one: "ойролцоогоор 1 жил" - other: "ойролцоогоор %{count} жил" - over_x_years: - one: "1 жилээс их" - other: "%{count} жилээс их" - almost_x_years: - one: "бараг 1 жил" - other: "бараг %{count} жил" - - number: - format: - separator: "." - delimiter: "" - precision: 3 - human: - format: - delimiter: "" - precision: 1 - storage_units: - format: "%n %u" - units: - byte: - one: "Байт" - other: "Байт" - kb: "KB" - mb: "MB" - gb: "GB" - tb: "TB" - - -# Used in array.to_sentence. - support: - array: - sentence_connector: "бас" - skip_last_comma: false - - activerecord: - errors: - template: - header: - one: "1 error prohibited this %{model} from being saved" - other: "%{count} errors prohibited this %{model} from being saved" - messages: - inclusion: "жагсаалтад заагдаагүй байна" - exclusion: "нөөцлөгдсөн" - invalid: "буруу" - confirmation: "баталгаажсан өгөгдөлтэй таарахгүй байна" - accepted: "хүлээж авах ёстой" - empty: "хоосон байж болохгүй" - blank: "бланк байж болохгүй" - too_long: "дэндүү урт байна (хамгийн ихдээ %{count} тэмдэгт)" - too_short: "дэндүү богино байна (хамгийн багадаа %{count} тэмдэгт)" - wrong_length: "буруу урттай байна (заавал %{count} тэмдэгт)" - taken: "аль хэдийнэ авсан байна" - not_a_number: "тоо биш байна" - not_a_date: "зөв огноо биш байна" - greater_than: "%{count} их байх ёстой" - greater_than_or_equal_to: "must be greater than or equal to %{count}" - equal_to: "must be equal to %{count}" - less_than: "must be less than %{count}" - less_than_or_equal_to: "must be less than or equal to %{count}" - odd: "заавал сондгой" - even: "заавал тэгш" - greater_than_start_date: "must be greater than start date" - not_same_project: "нэг ижил төсөлд хамаарахгүй байна" - circular_dependency: "Энэ харьцаа нь гинжин(рекурсив) харьцаа үүсгэх юм байна" - cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks" - - actionview_instancetag_blank_option: Сонгоно уу - - general_text_No: 'Үгүй' - general_text_Yes: 'Тийм' - general_text_no: 'үгүй' - general_text_yes: 'тийм' - general_lang_name: 'Mongolian (Монгол)' - general_csv_separator: ',' - general_csv_decimal_separator: '.' - general_csv_encoding: UTF-8 - general_pdf_encoding: UTF-8 - general_first_day_of_week: '7' - - notice_account_updated: Дансыг амжилттай өөрчиллөө. - notice_account_invalid_creditentials: Хэрэглэгчийн нэр эсвэл нууц үг буруу байна - notice_account_password_updated: Нууц үгийг амжилттай өөрчиллөө. - notice_account_wrong_password: Буруу нууц үг - notice_account_register_done: Шинэ хэрэглэгч амжилттай үүсгэлээ. Идэвхжүүлэхийн тулд, бидний тань луу илгээсэн мэйл дотор байгаа холбоос дээр дараарай. - notice_account_unknown_email: Үл мэдэгдэх хэрэглэгч. - notice_can_t_change_password: Энэ эрх гадаад нэвтрэлтэд ашигладаг учраас нууц үгийг өөрчлөх боломжгүй. - notice_account_lost_email_sent: Бид таньд мэйлээр нууц үгээ өөрчлөх зааврыг илгээсэн байгаа. - notice_account_activated: Таны данс идэвхжлээ. Одоо нэвтэрч орж болно. - notice_successful_create: Амжилттай үүсгэлээ. - notice_successful_update: Амжилттай өөрчиллөө. - notice_successful_delete: Амжилттай устгалаа. - notice_successful_connection: Амжилттай холбогдлоо. - notice_file_not_found: Таны үзэх гэсэн хуудас байхгүй юмуу устгагдсан байна. - notice_locking_conflict: Өгөгдлийг өөр хүн өөрчилсөн байна. - notice_not_authorized: Танд энэ хуудсыг үзэх эрх байхгүй байна. - notice_email_sent: "%{value} - руу мэйл илгээлээ" - notice_email_error: "Мэйл илгээхэд алдаа гарлаа (%{value})" - notice_feeds_access_key_reseted: Таны RSS хандалтын түлхүүрийг дахин эхлүүллээ. - notice_api_access_key_reseted: Your API access key was reset. - notice_failed_to_save_issues: "%{total} асуудал сонгогдсоноос %{count} асуудлыг нь хадгалахад алдаа гарлаа: %{ids}." - notice_no_issue_selected: "Ямар ч асуудал сонгогдоогүй байна! Засварлах асуудлуудаа сонгоно уу." - notice_account_pending: "Таны дансыг үүсгэж дууслаа, администратор баталгаажуулах хүртэл хүлээнэ үү." - notice_default_data_loaded: Стандарт тохиргоог амжилттай ачааллаа. - notice_unable_delete_version: Хувилбарыг устгах боломжгүй. - notice_issue_done_ratios_updated: Issue done ratios updated. - - error_can_t_load_default_data: "Стандарт тохиргоог ачаалж чадсангүй: %{value}" - error_scm_not_found: "Repository дотор тухайн бичлэг эсвэл хувилбарыг олсонгүй." - error_scm_command_failed: "Repository-д хандахад алдаа гарлаа: %{value}" - error_scm_annotate: "Бичлэг байхгүй байна, эсвэл бичлэгт тайлбар хавсаргаж болохгүй." - error_issue_not_found_in_project: 'Сонгосон асуудал энэ төсөлд хамаардаггүй юм уу эсвэл системд байхгүй байна.' - error_no_tracker_in_project: 'No tracker is associated to this project. Please check the Project settings.' - error_no_default_issue_status: 'No default issue status is defined. Please check your configuration (Go to "Administration -> Issue statuses").' - error_can_not_reopen_issue_on_closed_version: 'An issue assigned to a closed version can not be reopened' - error_can_not_archive_project: This project can not be archived - error_issue_done_ratios_not_updated: "Issue done ratios not updated." - error_workflow_copy_source: 'Please select a source tracker or role' - error_workflow_copy_target: 'Please select target tracker(s) and role(s)' - - warning_attachments_not_saved: "%{count} file(s) файлыг хадгалж чадсангүй." - - mail_subject_lost_password: "Таны %{value} нууц үг" - mail_body_lost_password: 'Нууц үгээ өөрчлөхийн тулд доорх холбоос дээр дарна уу:' - mail_subject_register: "Таны %{value} дансыг идэвхжүүлэх" - mail_body_register: 'Дансаа идэвхжүүлэхийн тулд доорх холбоос дээр дарна уу:' - mail_body_account_information_external: "Та өөрийнхөө %{value} дансыг ашиглаж холбогдож болно." - mail_body_account_information: Таны дансны тухай мэдээлэл - mail_subject_account_activation_request: "%{value} дансыг идэвхжүүлэх хүсэлт" - mail_body_account_activation_request: "Шинэ хэрэглэгч (%{value}) бүртгүүлсэн байна. Таны баталгаажуулахыг хүлээж байна:" - mail_subject_reminder: "Дараагийн өдрүүдэд %{count} асуудлыг шийдэх хэрэгтэй (%{days})" - mail_body_reminder: "Танд оноогдсон %{count} асуудлуудыг дараагийн %{days} өдрүүдэд шийдэх хэрэгтэй:" - mail_subject_wiki_content_added: "'%{id}' wiki page has been added" - mail_body_wiki_content_added: "The '%{id}' wiki page has been added by %{author}." - mail_subject_wiki_content_updated: "'%{id}' wiki page has been updated" - mail_body_wiki_content_updated: "The '%{id}' wiki page has been updated by %{author}." - - gui_validation_error: 1 алдаа - gui_validation_error_plural: "%{count} алдаа" - - field_name: Нэр - field_description: Тайлбар - field_summary: Дүгнэлт - field_is_required: Зайлшгүй - field_firstname: Таны нэр - field_lastname: Овог - field_mail: Имэйл - field_filename: Файл - field_filesize: Хэмжээ - field_downloads: Татаж авах зүйлс - field_author: Зохиогч - field_created_on: Үүссэн - field_updated_on: Өөрчилсөн - field_field_format: Формат - field_is_for_all: Бүх төслийн хувьд - field_possible_values: Боломжтой утгууд - field_regexp: Энгийн илэрхийлэл - field_min_length: Минимум урт - field_max_length: Максимум урт - field_value: Утга - field_category: Төрөл - field_title: Гарчиг - field_project: Төсөл - field_issue: Асуудал - field_status: Төлөв - field_notes: Тэмдэглэлүүд - field_is_closed: Асуудал хаагдсан - field_is_default: Стандарт утга - field_tracker: Чиглэл - field_subject: Гарчиг - field_due_date: Дуусах огноо - field_assigned_to: Оноогдсон - field_priority: Зэрэглэл - field_fixed_version: Хувилбар - field_user: Хэрэглэгч - field_role: Хандалтын эрх - field_homepage: Нүүр хуудас - field_is_public: Олон нийтийн - field_parent: Эцэг төсөл нь - field_is_in_roadmap: Асуудлуудыг явцын зураг дээр харуулах - field_login: Нэвтрэх нэр - field_mail_notification: Имэйл мэдэгдлүүд - field_admin: Администратор - field_last_login_on: Сүүлийн холбоо - field_language: Хэл - field_effective_date: Огноо - field_password: Нууц үг - field_new_password: Шннэ нууц үг - field_password_confirmation: Баталгаажуулах - field_version: Хувилбар - field_type: Төрөл - field_host: Хост - field_port: Порт - field_account: Данс - field_base_dn: Үндсэн ДН - field_attr_login: Нэвтрэх аттрибут - field_attr_firstname: Таны нэр аттрибут - field_attr_lastname: Овог аттрибут - field_attr_mail: Имэйл аттрибут - field_onthefly: Хүссэн үедээ хэрэглэгч үүсгэх - field_start_date: Эхлэл - field_done_ratio: %% Гүйцэтгэсэн - field_auth_source: Нэвтрэх арга - field_hide_mail: Миний имэйл хаягийг нуу - field_comments: Тайлбар - field_url: URL Хаяг - field_start_page: Тэргүүн хуудас - field_subproject: Дэд төсөл - field_hours: Цаг - field_activity: Үйл ажиллагаа - field_spent_on: Огноо - field_identifier: Төслийн глобал нэр - field_is_filter: Шүүлтүүр болгон хэрэглэгддэг - field_issue_to: Хамаатай асуудал - field_delay: Хоцролт - field_assignable: Энэ хандалтын эрхэд асуудлуудыг оноож өгч болно - field_redirect_existing_links: Байгаа холбоосуудыг дахин чиглүүлэх - field_estimated_hours: Барагцаалсан цаг - field_column_names: Баганууд - field_time_zone: Цагын бүс - field_searchable: Хайж болох - field_default_value: Стандарт утга - field_comments_sorting: Тайлбаруудыг харуул - field_parent_title: Эцэг хуудас - field_editable: Засварлагдана - field_watcher: Харна - field_identity_url: OpenID URL - field_content: Агуулга - field_group_by: Үр дүнгээр бүлэглэх - field_sharing: Sharing - - setting_app_title: Программын гарчиг - setting_app_subtitle: Программын дэд гарчиг - setting_welcome_text: Мэндчилгээ - setting_default_language: Стандарт хэл - setting_login_required: Нэвтрэх шаардлагатай - setting_self_registration: Өөрийгөө бүртгүүлэх - setting_attachment_max_size: Хавсралт файлын дээд хэмжээ - setting_issues_export_limit: Асуудал экспортлох хязгаар - setting_mail_from: Ямар имэйл хаяг үүсгэх - setting_bcc_recipients: BCC талбарын хаягууд (bcc) - setting_plain_text_mail: дан текст мэйл (HTML биш) - setting_host_name: Хостын нэр болон зам - setting_text_formatting: Текст хэлбэржүүлэлт - setting_wiki_compression: Вики хуудсуудын түүх дээр шахалт хийх - setting_feeds_limit: Фийд агуулгын хязгаар - setting_default_projects_public: Шинэ төслүүд автоматаар олон нийтийнх байна - setting_autofetch_changesets: Комитуудыг автоматаар татаж авах - setting_sys_api_enabled: Репозитори менежментэд зориулан WS-ийг идэвхжүүлэх - setting_commit_ref_keywords: Хамааруулах түлхүүр үгс - setting_commit_fix_keywords: Зоолттой түлхүүр үгс - setting_autologin: Компьютер дээр санах - setting_date_format: Огнооны формат - setting_time_format: Цагийн формат - setting_cross_project_issue_relations: Төсөл хооронд асуудал хамааруулахыг зөвшөөрөх - setting_issue_list_default_columns: Асуудлуудыг харуулах стандарт баганууд - setting_repositories_encodings: Репозиторийн энкодинг - setting_commit_logs_encoding: Коммит хийх үед харуулах текстүүдийн энкодинг - setting_emails_footer: Имэйлүүдийн хөл хэсэг - setting_protocol: Протокол - setting_per_page_options: Нэг хуудсанд байх обьектуудын тохиргоо - setting_user_format: Хэрэглэгчдийг харуулах формат - setting_activity_days_default: Төслийн үйл ажиллагаа хэсэгт үзүүлэх өдрийн тоо - setting_display_subprojects_issues: Дэд төслүүдийн асуудлуудыг автоматаар гол төсөл дээр харуулах - setting_enabled_scm: SCM - ийг идэвхжүүлэх - setting_mail_handler_body_delimiters: "Truncate emails after one of these lines" - setting_mail_handler_api_enabled: Ирсэн мэйлүүдийн хувьд WS-ийг идэвхжүүлэх - setting_mail_handler_api_key: API түлхүүр - setting_sequential_project_identifiers: Дэс дараалсан төслийн глобал нэр үүсгэж байх - setting_gravatar_enabled: Gravatar дүрсүүдийг хэрэглэгчдэд хэрэглэж байх - setting_gravatar_default: Default Gravatar image - setting_diff_max_lines_displayed: Ялгаатай мөрүүдийн тоо (дээд тал нь) - setting_file_max_size_displayed: Max size of text files displayed inline - setting_repository_log_display_limit: Maximum number of revisions displayed on file log - setting_openid: Allow OpenID login and registration - setting_password_min_length: Minimum password length - setting_new_project_user_role_id: Role given to a non-admin user who creates a project - setting_default_projects_modules: Default enabled modules for new projects - setting_issue_done_ratio: Calculate the issue done ratio with - setting_issue_done_ratio_issue_field: Use the issue field - setting_issue_done_ratio_issue_status: Use the issue status - setting_start_of_week: Start calendars on - setting_rest_api_enabled: Enable REST web service - setting_cache_formatted_text: Cache formatted text - - permission_add_project: Create project - permission_add_subprojects: Create subprojects - permission_edit_project: Төслийг засварлах - permission_select_project_modules: Төслийн модулуудийг сонгоно уу - permission_manage_members: Системийн хэрэглэгчид - permission_manage_project_activities: Manage project activities - permission_manage_versions: Хувилбарууд - permission_manage_categories: Асуудлын ангиллууд - permission_view_issues: Асуудлуудыг харах - permission_add_issues: Асуудлууд нэмэх - permission_edit_issues: Асуудлуудыг засварлах - permission_manage_issue_relations: Асуудлын хамаарлыг зохицуулах - permission_add_issue_notes: Тэмдэглэл нэмэх - permission_edit_issue_notes: Тэмдэглэлүүд засварлах - permission_edit_own_issue_notes: Өөрийн үлдээсэн тэмдэглэлүүдийг засварлах - permission_move_issues: Асуудлуудыг зөөх - permission_delete_issues: Асуудлуудыг устгах - permission_manage_public_queries: Олон нийтийн асуултууд - permission_save_queries: Асуултуудыг хадгалах - permission_view_gantt: Гант диаграмыг үзэх - permission_view_calendar: Календарь үзэх - permission_view_issue_watchers: Ажиглагчдын жагсаалтыг харах - permission_add_issue_watchers: Ажиглагчид нэмэх - permission_delete_issue_watchers: Ажиглагчдыг устгах - permission_log_time: Зарцуулсан хугацааг лог хийх - permission_view_time_entries: Зарцуулсан хугацааг харах - permission_edit_time_entries: Хугацааны логуудыг засварлах - permission_edit_own_time_entries: Өөрийн хугацааны логуудыг засварлах - permission_manage_news: Мэдээ мэдээллүүд - permission_comment_news: Мэдээнд тайлбар үлдээх - permission_manage_documents: Бичиг баримтууд - permission_view_documents: Бичиг баримтуудыг харах - permission_manage_files: Файлууд - permission_view_files: Файлуудыг харах - permission_manage_wiki: Вики удирдах - permission_rename_wiki_pages: Вики хуудсуудыг дахиж нэрлэх - permission_delete_wiki_pages: Вики хуудсуудыг устгах - permission_view_wiki_pages: Вики үзэх - permission_view_wiki_edits: Вики түүх үзэх - permission_edit_wiki_pages: Вики хуудсуудыг засварлах - permission_delete_wiki_pages_attachments: Хавсралтуудыг устгах - permission_protect_wiki_pages: Вики хуудсуудыг хамгаалах - permission_manage_repository: Репозитори - permission_browse_repository: Репозиторийг үзэх - permission_view_changesets: Өөрчлөлтүүдийг харах - permission_commit_access: Коммит хандалт - permission_manage_boards: Самбарууд - permission_view_messages: Зурвасуудыг харах - permission_add_messages: Зурвас илгээх - permission_edit_messages: Зурвасуудыг засварлах - permission_edit_own_messages: Өөрийн зурвасуудыг засварлах - permission_delete_messages: Зурвасуудыг устгах - permission_delete_own_messages: Өөрийн зурвасуудыг устгах - permission_export_wiki_pages: Вики хуудсуудыг экспорт хийх - - project_module_issue_tracking: Асуудал хянах - project_module_time_tracking: Хугацаа хянах - project_module_news: Мэдээ мэдээллүүд - project_module_documents: Бичиг баримтууд - project_module_files: Файлууд - project_module_wiki: Вики - project_module_repository: Репозитори - project_module_boards: Самбарууд - - label_user: Хэрэглэгч - label_user_plural: Хэрэглэгчид - label_user_new: Шинэ хэрэглэгч - label_user_anonymous: Хамаагүй хэрэглэгч - label_project: Төсөл - label_project_new: Шинэ төсөл - label_project_plural: Төслүүд - label_x_projects: - zero: төсөл байхгүй - one: 1 төсөл - other: "%{count} төслүүд" - label_project_all: Бүх Төслүүд - label_project_latest: Сүүлийн үеийн төслүүд - label_issue: Асуудал - label_issue_new: Шинэ асуудал - label_issue_plural: Асуудлууд - label_issue_view_all: Бүх асуудлуудыг харах - label_issues_by: "%{value} - н асуудлууд" - label_issue_added: Асуудал нэмэгдлээ - label_issue_updated: Асуудал өөрчлөгдлөө - label_document: Бичиг баримт - label_document_new: Шинэ бичиг баримт - label_document_plural: Бичиг баримтууд - label_document_added: Бичиг баримт нэмэгдлээ - label_role: Хандалтын эрх - label_role_plural: Хандалтын эрхүүд - label_role_new: Шинэ хандалтын эрх - label_role_and_permissions: Хандалтын эрхүүд болон зөвшөөрлүүд - label_member: Гишүүн - label_member_new: Шинэ гишүүн - label_member_plural: Гишүүд - label_tracker: Чиглэл - label_tracker_plural: Чиглэлүүд - label_tracker_new: Шинэ чиглэл - label_workflow: Ажлын дараалал - label_issue_status: Асуудлын төлөв - label_issue_status_plural: Асуудлын төлвүүд - label_issue_status_new: Шинэ төлөв - label_issue_category: Асуудлын ангилал - label_issue_category_plural: Асуудлын ангиллууд - label_issue_category_new: Шинэ ангилал - label_custom_field: Хэрэглэгчийн тодорхойлсон талбар - label_custom_field_plural: Хэрэглэгчийн тодорхойлсон талбарууд - label_custom_field_new: Шинээр хэрэглэгчийн тодорхойлсон талбар үүсгэх - label_enumerations: Ангиллууд - label_enumeration_new: Шинэ утга - label_information: Мэдээлэл - label_information_plural: Мэдээллүүд - label_please_login: Нэвтэрч орно уу - label_register: Бүртгүүлэх - label_login_with_open_id_option: or login with OpenID - label_password_lost: Нууц үгээ алдсан - label_home: Нүүр - label_my_page: Миний хуудас - label_my_account: Миний данс - label_my_projects: Миний төслүүд - label_administration: Админ хэсэг - label_login: Нэвтрэх - label_logout: Гарах - label_help: Тусламж - label_reported_issues: Мэдэгдсэн асуудлууд - label_assigned_to_me_issues: Надад оноогдсон асуудлууд - label_last_login: Сүүлийн холболт - label_registered_on: Бүртгүүлсэн огноо - label_activity: Үйл ажиллагаа - label_overall_activity: Ерөнхий үйл ажиллагаа - label_user_activity: "%{value}-ийн үйл ажиллагаа" - label_new: Шинэ - label_logged_as: Холбогдсон нэр - label_environment: Орчин - label_authentication: Нэвтрэх - label_auth_source: Нэвтрэх арга - label_auth_source_new: Шинэ нэвтрэх арга - label_auth_source_plural: Нэвтрэх аргууд - label_subproject_plural: Дэд төслүүд - label_subproject_new: Шинэ дэд төсөл - label_and_its_subprojects: "%{value} болон холбогдох дэд төслүүд" - label_min_max_length: Дээд - Доод урт - label_list: Жагсаалт - label_date: Огноо - label_integer: Бүхэл тоо - label_float: Бутархай тоо - label_boolean: Үнэн худал утга - label_string: Текст - label_text: Урт текст - label_attribute: Аттрибут - label_attribute_plural: Аттрибутууд - label_download: "%{count} Татаж авсан зүйл" - label_download_plural: "%{count} Татаж авсан зүйлс" - label_no_data: Үзүүлэх өгөгдөл байхгүй байна - label_change_status: Төлвийг өөрчлөх - label_history: Түүх - label_attachment: Файл - label_attachment_new: Шинэ файл - label_attachment_delete: Файл устгах - label_attachment_plural: Файлууд - label_file_added: Файл нэмэгдлээ - label_report: Тайлан - label_report_plural: Тайлангууд - label_news: Мэдээ - label_news_new: Шинэ мэдээ - label_news_plural: Мэдээ - label_news_latest: Сүүлийн үеийн мэдээнүүд - label_news_view_all: Бүх мэдээг харах - label_news_added: Мэдээ нэмэгдлээ - label_change_log: Өөрчлөлтийн лог - label_settings: Тохиргоо - label_overview: Эхлэл - label_version: Хувилбар - label_version_new: Шинэ хувилбар - label_version_plural: Хувилбарууд - label_close_versions: Гүйцэт хувилбаруудыг хаалаа - label_confirmation: Баталгаажуулах - label_export_to: 'Өөр авч болох формат:' - label_read: Унших... - label_public_projects: Олон нийтийн төслүүд - label_open_issues: нээлттэй - label_open_issues_plural: нээлттэй - label_closed_issues: хаалттай - label_closed_issues_plural: хаалттай - label_x_open_issues_abbr_on_total: - zero: 0 нээлттэй / %{total} - one: 1 нээлттэй / %{total} - other: "%{count} нээлттэй / %{total}" - label_x_open_issues_abbr: - zero: 0 нээлттэй - one: 1 нээлттэй - other: "%{count} нээлттэй" - label_x_closed_issues_abbr: - zero: 0 хаалттай - one: 1 хаалттай - other: "%{count} хаалттай" - label_total: Нийт - label_permissions: Зөвшөөрлүүд - label_current_status: Одоогийн төлөв - label_new_statuses_allowed: Шинээр олгож болох төлвүүд - label_all: бүгд - label_none: хоосон - label_nobody: хэн ч биш - label_next: Дараагийн - label_previous: Өмнөх - label_used_by: Хэрэглэгддэг - label_details: Дэлгэрэнгүй - label_add_note: Тэмдэглэл нэмэх - label_per_page: Нэг хуудсанд - label_calendar: Календарь - label_months_from: Саруудыг хаанаас - label_gantt: Гант диаграм - label_internal: Дотоод - label_last_changes: "сүүлийн %{count} өөрчлөлтүүд" - label_change_view_all: Бүх өөрчлөлтүүдийг харах - label_personalize_page: Энэ хуудсыг өөрт зориулан өөрчлөх - label_comment: Тайлбар - label_comment_plural: Тайлбарууд - label_x_comments: - zero: сэтгэгдэл байхгүй - one: 1 сэтгэгдэлтэй - other: "%{count} сэтгэгдэлтэй" - label_comment_add: Тайлбар нэмэх - label_comment_added: Тайлбар нэмэгдлээ - label_comment_delete: Тайлбарууд устгах - label_query: Хэрэглэгчийн тодорхойлсон асуулт - label_query_plural: Хэрэглэгчийн тодорхойлсон асуултууд - label_query_new: Шинээр хэрэглэгчийн тодорхойлсон асуулт үүсгэх - label_filter_add: Шүүлтүүр нэмэх - label_filter_plural: Шүүлтүүрүүд - label_equals: бол - label_not_equals: биш - label_in_less_than: аас бага - label_in_more_than: аас их - label_greater_or_equal: '>=' - label_less_or_equal: '<=' - label_in: дотор - label_today: өнөөдөр - label_all_time: бүх хугацаа - label_yesterday: өчигдөр - label_this_week: энэ долоо хоног - label_last_week: өнгөрсөн долоо хоног - label_last_n_days: "сүүлийн %{count} өдрүүд" - label_this_month: энэ сар - label_last_month: сүүлийн сар - label_this_year: энэ жил - label_date_range: Хязгаар огноо - label_less_than_ago: бага өдрийн дотор - label_more_than_ago: их өдрийн дотор - label_ago: өдрийн өмнө - label_contains: агуулж байгаа - label_not_contains: агуулаагүй - label_day_plural: өдрүүд - label_repository: Репозитори - label_repository_plural: Репозиторууд - label_browse: Үзэх - label_modification: "%{count} өөрчлөлт" - label_modification_plural: "%{count} өөрчлөлтүүд" - label_branch: Салбар - label_tag: Шошго - label_revision: Хувилбар - label_revision_plural: Хувилбарууд - label_revision_id: "%{value} Хувилбар" - label_associated_revisions: Хамааралтай хувилбарууд - label_added: нэмэгдсэн - label_modified: өөрчлөгдсөн - label_copied: хуулсан - label_renamed: нэрийг нь өөрчилсөн - label_deleted: устгасан - label_latest_revision: Сүүлийн үеийн хувилбар - label_latest_revision_plural: Сүүлийн үеийн хувилбарууд - label_view_revisions: Хувилбаруудыг харах - label_view_all_revisions: Бүх хувилбаруудыг харах - label_max_size: Maximum size - label_sort_highest: Хамгийн дээр - label_sort_higher: Дээш нь - label_sort_lower: Доош нь - label_sort_lowest: Хамгийн доор - label_roadmap: Хөтөч - label_roadmap_due_in: "%{value} дотор дуусгах" - label_roadmap_overdue: "%{value} оройтсон" - label_roadmap_no_issues: Энэ хувилбарт асуудал байхгүй байна - label_search: Хайх - label_result_plural: Үр дүн - label_all_words: Бүх үгс - label_wiki: Вики - label_wiki_edit: Вики засвар - label_wiki_edit_plural: Вики засварууд - label_wiki_page: Вики хуудас - label_wiki_page_plural: Вики хуудас - label_index_by_title: Гарчгаар эрэмбэлэх - label_index_by_date: Огноогоор эрэмбэлэх - label_current_version: Одоогийн хувилбар - label_preview: Ямар харагдахыг шалгах - label_feed_plural: Feeds - label_changes_details: Бүх өөрчлөлтүүдийн дэлгэрэнгүй - label_issue_tracking: Асуудал хянах - label_spent_time: Зарцуулсан хугацаа - label_f_hour: "%{value} цаг" - label_f_hour_plural: "%{value} цаг" - label_time_tracking: Хугацааг хянах - label_change_plural: Өөрчлөлтүүд - label_statistics: Статистик - label_commits_per_month: Сард хийсэн коммитын тоо - label_commits_per_author: Зохиогч бүрийн хувьд коммитын тоо - label_view_diff: Ялгаануудыг харах - label_diff_inline: дотор нь - label_diff_side_by_side: зэрэгцүүлж - label_options: Тохиргоо - label_copy_workflow_from: Ажлын дарааллыг хуулах - label_permissions_report: Зөвшөөрлүүдийн таблиц - label_watched_issues: Ажиглагдаж байгаа асуудлууд - label_related_issues: Хамааралтай асуудлууд - label_applied_status: Олгосон төлөв - label_loading: Ачаалж байна... - label_relation_new: Шинэ хамаарал - label_relation_delete: Хамаарлыг устгах - label_relates_to: энгийн хамааралтай - label_duplicates: хос хамааралтай - label_duplicated_by: давхардуулсан эзэн - label_blocks: шаардах хамааралтай - label_blocked_by: блоколсон эзэн - label_precedes: урьдчилах хамааралтай - label_follows: дагаж - label_end_to_start: хойноос нь урагшаа - label_end_to_end: хойноос нь хойшоо - label_start_to_start: урдаас нь урагаа - label_start_to_end: урдаас нь хойшоо - label_stay_logged_in: Энэ комьютер дээр санах - label_disabled: идэвхгүй болсон - label_show_completed_versions: Гүйцэд хувилбаруудыг харуулах - label_me: би - label_board: Форум - label_board_new: Шинэ форум - label_board_plural: Форумууд - label_board_locked: Түгжээтэй - label_board_sticky: Sticky - label_topic_plural: Сэдвүүд - label_message_plural: Зурвасууд - label_message_last: Сүүлийн зурвас - label_message_new: Шинэ зурвас - label_message_posted: Зурвас нэмэгдлээ - label_reply_plural: Хариултууд - label_send_information: Дансны мэдээллийг хэрэглэгчид илгээх - label_year: Жил - label_month: Сар - label_week: Долоо хоног - label_date_from: Хэзээнээс - label_date_to: Хэдий хүртэл - label_language_based: Хэрэглэгчийн хэлнас шалтгаалан - label_sort_by: "%{value} талбараар нь эрэмбэлэх" - label_send_test_email: Турших мэйл илгээх - label_feeds_access_key: RSS хандах түлхүүр - label_missing_feeds_access_key: RSS хандах түлхүүр алга - label_feeds_access_key_created_on: "RSS хандалтын түлхүүр %{value}-ийн өмнө үүссэн" - label_module_plural: Модулууд - label_added_time_by: "%{author} %{age}-ийн өмнө нэмсэн" - label_updated_time_by: "%{author} %{age}-ийн өмнө өөрчилсөн" - label_updated_time: "%{value} -ийн өмнө өөрчлөгдсөн" - label_jump_to_a_project: Төсөл рүү очих... - label_file_plural: Файлууд - label_changeset_plural: Өөрчлөлтүүд - label_default_columns: Стандарт баганууд - label_no_change_option: (Өөрчлөлт байхгүй) - label_bulk_edit_selected_issues: Сонгогдсон асуудлуудыг бөөнөөр засварлах - label_theme: Системийн Дизайн - label_default: Стандарт - label_search_titles_only: Зөвхөн гарчиг хайх - label_user_mail_option_all: "Миний бүх төсөл дээрх бүх үзэгдлүүдийн хувьд" - label_user_mail_option_selected: "Сонгогдсон төслүүдийн хувьд бүх үзэгдэл дээр..." - label_user_mail_no_self_notified: "Миний өөрийн хийсэн өөрчлөлтүүдийн тухай надад мэдэгдэх хэрэггүй" - label_registration_activation_by_email: дансыг имэйлээр идэвхжүүлэх - label_registration_manual_activation: дансыг гараар идэвхжүүлэх - label_registration_automatic_activation: дансыг автоматаар идэвхжүүлэх - label_display_per_page: 'Нэг хуудсанд: %{value}' - label_age: Нас - label_change_properties: Тохиргоог өөрчлөх - label_general: Ерөнхий - label_more: Цааш нь - label_scm: SCM - label_plugins: Модулууд - label_ldap_authentication: LDAP нэвтрэх горим - label_downloads_abbr: D/L - label_optional_description: Дурын тайлбар - label_add_another_file: Дахин файл нэмэх - label_preferences: Тохиргоо - label_chronological_order: Цагаан толгойн үсгийн дарааллаар - label_reverse_chronological_order: Урвуу цагаан толгойн үсгийн дарааллаар - label_planning: Төлөвлөлт - label_incoming_emails: Ирсэн мэйлүүд - label_generate_key: Түлхүүр үүсгэх - label_issue_watchers: Ажиглагчид - label_example: Жишээ - label_display: Display - label_sort: Sort - label_ascending: Ascending - label_descending: Descending - label_date_from_to: From %{start} to %{end} - label_wiki_content_added: Wiki page added - label_wiki_content_updated: Wiki page updated - label_group: Group - label_group_plural: Groups - label_group_new: New group - label_time_entry_plural: Spent time - label_version_sharing_none: Not shared - label_version_sharing_descendants: With subprojects - label_version_sharing_hierarchy: With project hierarchy - label_version_sharing_tree: With project tree - label_version_sharing_system: With all projects - label_update_issue_done_ratios: Update issue done ratios - label_copy_source: Source - label_copy_target: Target - label_copy_same_as_target: Same as target - label_display_used_statuses_only: Only display statuses that are used by this tracker - label_api_access_key: API access key - label_missing_api_access_key: Missing an API access key - label_api_access_key_created_on: "API access key created %{value} ago" - - button_login: Нэвтрэх - button_submit: Илгээх - button_save: Хадгалах - button_check_all: Бүгдийг сонго - button_uncheck_all: Бүгдийг үл сонго - button_delete: Устгах - button_create: Үүсгэх - button_create_and_continue: Үүсгээд цааш үргэлжлүүлэх - button_test: Турших - button_edit: Засварлах - button_add: Нэмэх - button_change: Өөрчлөх - button_apply: Өөрчлөлтийг хадгалах - button_clear: Цэвэрлэх - button_lock: Түгжих - button_unlock: Түгжээг тайлах - button_download: Татах - button_list: Жагсаалт - button_view: Харах - button_move: Зөөх - button_move_and_follow: Зөө бас дага - button_back: Буцах - button_cancel: Болих - button_activate: Идэвхжүүлэх - button_sort: Эрэмбэлэх - button_log_time: Лог хийсэн хугацаа - button_rollback: Энэ хувилбар руу буцах - button_watch: Ажиглах - button_unwatch: Ажиглахаа болих - button_reply: Хариулах - button_archive: Архивлах - button_unarchive: Архивыг задлах - button_reset: Анхны утгууд - button_rename: Нэрийг нь солих - button_change_password: Нууц үгээ өөрчлөх - button_copy: Хуулах - button_copy_and_follow: Зөө бас дага - button_annotate: Тайлбар хавсаргах - button_update: Шинэчлэх - button_configure: Тохируулах - button_quote: Ишлэл - button_duplicate: Хуулбар - button_show: Үзэх - - status_active: идэвхтэй - status_registered: бүртгүүлсэн - status_locked: түгжээтэй - - version_status_open: нээлттэй - version_status_locked: түгжээтэй - version_status_closed: хаалттай - - field_active: идэвхтэй - - text_select_mail_notifications: Ямар үед имэйлээр мэдэгдэл илгээхийг сонгоно уу. - text_regexp_info: eg. ^[A-Z0-9]+$ - text_min_max_length_info: 0 гэвэл ямар ч хязгааргүй гэсэн үг - text_project_destroy_confirmation: Та энэ төсөл болоод бусад мэдээллийг нь үнэхээр устгамаар байна уу ? - text_subprojects_destroy_warning: "Уг төслийн дэд төслүүд : %{value} нь бас устгагдах болно." - text_workflow_edit: Ажлын дарааллыг өөрчлөхийн тулд хандалтын эрх болон асуудлын чиглэлийг сонгоно уу - text_are_you_sure: Та итгэлтэй байна уу ? - text_journal_changed: "%{label} %{old} байсан нь %{new} болов" - text_journal_set_to: "%{label} %{value} болгож өөрчиллөө" - text_journal_deleted: "%{label} устсан (%{old})" - text_journal_added: "%{label} %{value} нэмэгдсэн" - text_tip_issue_begin_day: энэ өдөр эхлэх ажил - text_tip_issue_end_day: энэ өдөр дуусах ажил - text_tip_issue_begin_end_day: энэ өдөр эхлээд мөн дуусч байгаа ажил - text_project_identifier_info: 'Only lower case letters (a-z), numbers, dashes and underscores are allowed.
Once saved, the identifier can not be changed.' - text_caracters_maximum: "дээд тал нь %{count} үсэг." - text_caracters_minimum: "Хамгийн багадаа ядаж %{count} тэмдэгт байх." - text_length_between: "Урт нь багадаа %{min}, ихдээ %{max} тэмдэгт." - text_tracker_no_workflow: Энэхүү асуудлын чиглэлд ямар ч ажлын дараалал тодорхойлогдоогүй байна - text_unallowed_characters: Хэрэглэж болохгүй тэмдэгтүүд - text_comma_separated: Таслалаар зааглан олон утга оруулж болно. - text_line_separated: Multiple values allowed (one line for each value). - text_issues_ref_in_commit_messages: Коммитийн зурвасуудад хамааруулсан болон байнгын асуудлууд - text_issue_added: "Асуудал %{id} - ийг хэрэглэгч %{author} мэдэгдсэн байна." - text_issue_updated: "Асуудал %{id} - ийг хэрэглэгч %{author} өөрчилсөн байна." - text_wiki_destroy_confirmation: Та энэ вики болон холбогдох бүх мэдээллийг үнэхээр устгамаар байна уу ? - text_issue_category_destroy_question: "Энэ ангилалд зарим асуудлууд (%{count}) орсон байна. Та яах вэ ?" - text_issue_category_destroy_assignments: Асуудлуудыг энэ ангиллаас авах - text_issue_category_reassign_to: Асуудлуудыг энэ ангилалд дахин оноох - text_user_mail_option: "Сонгогдоогүй төслүүдийн хувьд, та зөвхөн өөрийнхөө ажиглаж байгаа зүйлс юмуу танд хамаатай зүйлсийн талаар мэдэгдэл авах болно (Таны оруулсан асуудал, эсвэл танд оноосон гэх мэт)." - text_no_configuration_data: "Хандалтын эрхүүд, чиглэлүүд, асуудлын төлвүүд болон ажлын дарааллын тухай мэдээллийг хараахан оруулаагүй байна.\nТа стандарт өгөгдлүүдийг даруйхан оруулахыг зөвлөж байна, оруулсан хойно та засварлаж болно." - text_load_default_configuration: Стандарт өгөгдлийг ачаалах - text_status_changed_by_changeset: "%{value} өөрчлөлтөд хийгдсэн." - text_issues_destroy_confirmation: 'Та сонгогдсон асуудлуудыг үнэхээр устгамаар байна уу ?' - text_select_project_modules: 'Энэ төслийн хувьд идэвхжүүлэх модулуудаа сонгоно уу:' - text_default_administrator_account_changed: Стандарт администраторын бүртгэл өөрчлөгдлөө - text_file_repository_writable: Хавсралт файл хадгалах хавтас руу бичих эрхтэй - text_plugin_assets_writable: Плагин модулийн ассет хавтас руу бичих эрхтэй - text_rmagick_available: RMagick суулгагдсан (заавал биш) - text_destroy_time_entries_question: "Таны устгах гэж байгаа асуудлууд дээр нийт %{hours} цаг зарцуулсан юм байна, та яах вэ ?" - text_destroy_time_entries: Мэдэгдсэн цагуудыг устгах - text_assign_time_entries_to_project: Мэдэгдсэн асуудлуудыг төсөлд оноох - text_reassign_time_entries: 'Мэдэгдсэн асуудлуудыг энэ асуудалд дахин оноо:' - text_user_wrote: "%{value} бичихдээ:" - text_enumeration_destroy_question: "Энэ утгад %{count} обьект оноогдсон байна." - text_enumeration_category_reassign_to: 'Тэдгээрийг энэ утгад дахин оноо:' - text_email_delivery_not_configured: "Имэйлийн тохиргоог хараахан тохируулаагүй байна, тиймээс имэйл мэдэгдэл явуулах боломжгүй байна.\nSMTP сервэрээ config/configuration.yml файл дотор тохируулаад төслийн менежерээ дахиад эхлүүлээрэй." - text_repository_usernames_mapping: "Репозиторийн логд байгаа бүх хэрэглэгчийн нэрүүдэд харгалзсан Төслийн Менежер системд бүртгэлтэй хэрэглэгчдийг Сонгох юмуу шинэчилнэ үү.\nТөслийн менежер болон репозиторид байгаа ижилхэн нэр юмуу имэйлтэй хэрэглэгчид харилцан харгалзна." - text_diff_truncated: '... Файлын ялгаврын хэмжээ үзүүлэхэд дэндүү урт байгаа учраас төгсгөлөөс нь хасч үзүүлэв.' - text_custom_field_possible_values_info: 'One line for each value' - text_wiki_page_destroy_question: "This page has %{descendants} child page(s) and descendant(s). What do you want to do?" - text_wiki_page_nullify_children: "Keep child pages as root pages" - text_wiki_page_destroy_children: "Delete child pages and all their descendants" - text_wiki_page_reassign_children: "Reassign child pages to this parent page" - text_own_membership_delete_confirmation: "You are about to remove some or all of your permissions and may no longer be able to edit this project after that.\nAre you sure you want to continue?" - - default_role_manager: Менежер - default_role_developer: Хөгжүүлэгч - default_role_reporter: Мэдэгдэгч - default_role_non_member: Non member - default_role_anonymous: Anonymous - default_tracker_bug: Алдаа - default_tracker_feature: Онцлог - default_tracker_support: Тусламж - default_issue_status_new: Шинэ - default_issue_status_in_progress: Ахицтай - default_issue_status_assigned: Оноогдсон - default_issue_status_resolved: Шийдвэрлэгдсэн - default_issue_status_feedback: Feedback - default_issue_status_closed: Хаагдсан - default_issue_status_rejected: Хүлээж аваагүй - default_doc_category_user: Хэрэглэгчийн бичиг баримт - default_doc_category_tech: Техникийн бичиг баримт - default_priority_low: Бага - default_priority_normal: Хэвийн - default_priority_high: Өндөр - default_priority_urgent: Нэн яаралтай - default_priority_immediate: Нэн даруй - default_activity_design: Дизайн - default_activity_development: Хөгжүүлэлт - - enumeration_issue_priorities: Асуудлын зэрэглэлүүд - enumeration_doc_categories: Бичиг баримтын ангиллууд - enumeration_activities: Үйл ажиллагаанууд (хугацааг хянах) - enumeration_system_activity: Системийн үйл ажиллагаа - - permission_manage_subtasks: Manage subtasks - label_profile: Profile - field_parent_issue: Parent task - error_unable_delete_issue_status: Unable to delete issue status - label_subtask_plural: Subtasks - label_project_copy_notifications: Send email notifications during the project copy - error_can_not_delete_custom_field: Unable to delete custom field - error_unable_to_connect: Unable to connect (%{value}) - error_can_not_remove_role: This role is in use and can not be deleted. - error_can_not_delete_tracker: This tracker contains issues and can't be deleted. - field_principal: Principal - label_my_page_block: My page block - notice_failed_to_save_members: "Failed to save member(s): %{errors}." - text_zoom_out: Zoom out - text_zoom_in: Zoom in - notice_unable_delete_time_entry: Unable to delete time log entry. - label_overall_spent_time: Overall spent time - field_time_entries: Log time - project_module_gantt: Gantt - project_module_calendar: Calendar - button_edit_associated_wikipage: "Edit associated Wiki page: %{page_title}" - text_are_you_sure_with_children: Delete issue and all child issues? - field_text: Text field - label_user_mail_option_only_owner: Only for things I am the owner of - setting_default_notification_option: Default notification option - label_user_mail_option_only_my_events: Only for things I watch or I'm involved in - label_user_mail_option_only_assigned: Only for things I am assigned to - label_user_mail_option_none: No events - field_member_of_group: Assignee's group - field_assigned_to_role: Assignee's role - notice_not_authorized_archived_project: The project you're trying to access has been archived. - label_principal_search: "Search for user or group:" - label_user_search: "Search for user:" - field_visible: Visible - setting_emails_header: Emails header - setting_commit_logtime_activity_id: Activity for logged time - text_time_logged_by_changeset: Applied in changeset %{value}. - setting_commit_logtime_enabled: Enable time logging - notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max}) - setting_gantt_items_limit: Maximum number of items displayed on the gantt chart - text_powered_by: Powered by %{link} +mn: + direction: ltr + date: + formats: + # Use the strftime parameters for formats. + # When no format has been given, it uses default. + # You can provide other formats here if you like! + default: "%Y/%m/%d" + short: "%b %d" + long: "%Y, %B %d" + + day_names: [Даваа, Мягмар, Лхагва, Пүрэв, Баасан, Бямба, Ням] + abbr_day_names: [Дав, Мяг, Лха, Пүр, Бсн, Бям, Ням] + + # Don't forget the nil at the beginning; there's no such thing as a 0th month + month_names: [~, 1-р сар, 2-р сар, 3-р сар, 4-р сар, 5-р сар, 6-р сар, 7-р сар, 8-р сар, 9-р сар, 10-р сар, 11-р сар, 12-р сар] + abbr_month_names: [~, 1сар, 2сар, 3сар, 4сар, 5сар, 6сар, 7сар, 8сар, 9сар, 10сар, 11сар, 12сар] + # Used in date_select and datime_select. + order: + - :day + - :month + - :year + + time: + formats: + default: "%Y/%m/%d %I:%M %p" + time: "%I:%M %p" + short: "%d %b %H:%M" + long: "%Y, %B %d %H:%M" + am: "am" + pm: "pm" + + datetime: + distance_in_words: + half_a_minute: "хагас минут" + less_than_x_seconds: + one: "секунд орчим" + other: "%{count} секундээс бага хугацаа" + x_seconds: + one: "1 секунд" + other: "%{count} секунд" + less_than_x_minutes: + one: "минутаас бага хугацаа" + other: "%{count} минутаас бага хугацаа" + x_minutes: + one: "1 минут" + other: "%{count} минут" + about_x_hours: + one: "1 цаг орчим" + other: "ойролцоогоор %{count} цаг" + x_days: + one: "1 өдөр" + other: "%{count} өдөр" + about_x_months: + one: "1 сар орчим" + other: "ойролцоогоор %{count} сар" + x_months: + one: "1 сар" + other: "%{count} сар" + about_x_years: + one: "ойролцоогоор 1 жил" + other: "ойролцоогоор %{count} жил" + over_x_years: + one: "1 жилээс их" + other: "%{count} жилээс их" + almost_x_years: + one: "бараг 1 жил" + other: "бараг %{count} жил" + + number: + format: + separator: "." + delimiter: "" + precision: 3 + human: + format: + delimiter: "" + precision: 1 + storage_units: + format: "%n %u" + units: + byte: + one: "Байт" + other: "Байт" + kb: "KB" + mb: "MB" + gb: "GB" + tb: "TB" + + +# Used in array.to_sentence. + support: + array: + sentence_connector: "бас" + skip_last_comma: false + + activerecord: + errors: + template: + header: + one: "1 error prohibited this %{model} from being saved" + other: "%{count} errors prohibited this %{model} from being saved" + messages: + inclusion: "жагсаалтад заагдаагүй байна" + exclusion: "нөөцлөгдсөн" + invalid: "буруу" + confirmation: "баталгаажсан өгөгдөлтэй таарахгүй байна" + accepted: "хүлээж авах ёстой" + empty: "хоосон байж болохгүй" + blank: "бланк байж болохгүй" + too_long: "дэндүү урт байна (хамгийн ихдээ %{count} тэмдэгт)" + too_short: "дэндүү богино байна (хамгийн багадаа %{count} тэмдэгт)" + wrong_length: "буруу урттай байна (заавал %{count} тэмдэгт)" + taken: "аль хэдийнэ авсан байна" + not_a_number: "тоо биш байна" + not_a_date: "зөв огноо биш байна" + greater_than: "%{count} их байх ёстой" + greater_than_or_equal_to: "must be greater than or equal to %{count}" + equal_to: "must be equal to %{count}" + less_than: "must be less than %{count}" + less_than_or_equal_to: "must be less than or equal to %{count}" + odd: "заавал сондгой" + even: "заавал тэгш" + greater_than_start_date: "must be greater than start date" + not_same_project: "нэг ижил төсөлд хамаарахгүй байна" + circular_dependency: "Энэ харьцаа нь гинжин(рекурсив) харьцаа үүсгэх юм байна" + cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks" + + actionview_instancetag_blank_option: Сонгоно уу + + general_text_No: 'Үгүй' + general_text_Yes: 'Тийм' + general_text_no: 'үгүй' + general_text_yes: 'тийм' + general_lang_name: 'Mongolian (Монгол)' + general_csv_separator: ',' + general_csv_decimal_separator: '.' + general_csv_encoding: UTF-8 + general_pdf_encoding: UTF-8 + general_first_day_of_week: '7' + + notice_account_updated: Дансыг амжилттай өөрчиллөө. + notice_account_invalid_creditentials: Хэрэглэгчийн нэр эсвэл нууц үг буруу байна + notice_account_password_updated: Нууц үгийг амжилттай өөрчиллөө. + notice_account_wrong_password: Буруу нууц үг + notice_account_register_done: Шинэ хэрэглэгч амжилттай үүсгэлээ. Идэвхжүүлэхийн тулд, бидний тань луу илгээсэн мэйл дотор байгаа холбоос дээр дараарай. + notice_account_unknown_email: Үл мэдэгдэх хэрэглэгч. + notice_can_t_change_password: Энэ эрх гадаад нэвтрэлтэд ашигладаг учраас нууц үгийг өөрчлөх боломжгүй. + notice_account_lost_email_sent: Бид таньд мэйлээр нууц үгээ өөрчлөх зааврыг илгээсэн байгаа. + notice_account_activated: Таны данс идэвхжлээ. Одоо нэвтэрч орж болно. + notice_successful_create: Амжилттай үүсгэлээ. + notice_successful_update: Амжилттай өөрчиллөө. + notice_successful_delete: Амжилттай устгалаа. + notice_successful_connection: Амжилттай холбогдлоо. + notice_file_not_found: Таны үзэх гэсэн хуудас байхгүй юмуу устгагдсан байна. + notice_locking_conflict: Өгөгдлийг өөр хүн өөрчилсөн байна. + notice_not_authorized: Танд энэ хуудсыг үзэх эрх байхгүй байна. + notice_email_sent: "%{value} - руу мэйл илгээлээ" + notice_email_error: "Мэйл илгээхэд алдаа гарлаа (%{value})" + notice_feeds_access_key_reseted: Таны RSS хандалтын түлхүүрийг дахин эхлүүллээ. + notice_api_access_key_reseted: Your API access key was reset. + notice_failed_to_save_issues: "%{total} асуудал сонгогдсоноос %{count} асуудлыг нь хадгалахад алдаа гарлаа: %{ids}." + notice_no_issue_selected: "Ямар ч асуудал сонгогдоогүй байна! Засварлах асуудлуудаа сонгоно уу." + notice_account_pending: "Таны дансыг үүсгэж дууслаа, администратор баталгаажуулах хүртэл хүлээнэ үү." + notice_default_data_loaded: Стандарт тохиргоог амжилттай ачааллаа. + notice_unable_delete_version: Хувилбарыг устгах боломжгүй. + notice_issue_done_ratios_updated: Issue done ratios updated. + + error_can_t_load_default_data: "Стандарт тохиргоог ачаалж чадсангүй: %{value}" + error_scm_not_found: "Repository дотор тухайн бичлэг эсвэл хувилбарыг олсонгүй." + error_scm_command_failed: "Repository-д хандахад алдаа гарлаа: %{value}" + error_scm_annotate: "Бичлэг байхгүй байна, эсвэл бичлэгт тайлбар хавсаргаж болохгүй." + error_issue_not_found_in_project: 'Сонгосон асуудал энэ төсөлд хамаардаггүй юм уу эсвэл системд байхгүй байна.' + error_no_tracker_in_project: 'No tracker is associated to this project. Please check the Project settings.' + error_no_default_issue_status: 'No default issue status is defined. Please check your configuration (Go to "Administration -> Issue statuses").' + error_can_not_reopen_issue_on_closed_version: 'An issue assigned to a closed version can not be reopened' + error_can_not_archive_project: This project can not be archived + error_issue_done_ratios_not_updated: "Issue done ratios not updated." + error_workflow_copy_source: 'Please select a source tracker or role' + error_workflow_copy_target: 'Please select target tracker(s) and role(s)' + + warning_attachments_not_saved: "%{count} file(s) файлыг хадгалж чадсангүй." + + mail_subject_lost_password: "Таны %{value} нууц үг" + mail_body_lost_password: 'Нууц үгээ өөрчлөхийн тулд доорх холбоос дээр дарна уу:' + mail_subject_register: "Таны %{value} дансыг идэвхжүүлэх" + mail_body_register: 'Дансаа идэвхжүүлэхийн тулд доорх холбоос дээр дарна уу:' + mail_body_account_information_external: "Та өөрийнхөө %{value} дансыг ашиглаж холбогдож болно." + mail_body_account_information: Таны дансны тухай мэдээлэл + mail_subject_account_activation_request: "%{value} дансыг идэвхжүүлэх хүсэлт" + mail_body_account_activation_request: "Шинэ хэрэглэгч (%{value}) бүртгүүлсэн байна. Таны баталгаажуулахыг хүлээж байна:" + mail_subject_reminder: "Дараагийн өдрүүдэд %{count} асуудлыг шийдэх хэрэгтэй (%{days})" + mail_body_reminder: "Танд оноогдсон %{count} асуудлуудыг дараагийн %{days} өдрүүдэд шийдэх хэрэгтэй:" + mail_subject_wiki_content_added: "'%{id}' wiki page has been added" + mail_body_wiki_content_added: "The '%{id}' wiki page has been added by %{author}." + mail_subject_wiki_content_updated: "'%{id}' wiki page has been updated" + mail_body_wiki_content_updated: "The '%{id}' wiki page has been updated by %{author}." + + gui_validation_error: 1 алдаа + gui_validation_error_plural: "%{count} алдаа" + + field_name: Нэр + field_description: Тайлбар + field_summary: Дүгнэлт + field_is_required: Зайлшгүй + field_firstname: Таны нэр + field_lastname: Овог + field_mail: Имэйл + field_filename: Файл + field_filesize: Хэмжээ + field_downloads: Татаж авах зүйлс + field_author: Зохиогч + field_created_on: Үүссэн + field_updated_on: Өөрчилсөн + field_field_format: Формат + field_is_for_all: Бүх төслийн хувьд + field_possible_values: Боломжтой утгууд + field_regexp: Энгийн илэрхийлэл + field_min_length: Минимум урт + field_max_length: Максимум урт + field_value: Утга + field_category: Төрөл + field_title: Гарчиг + field_project: Төсөл + field_issue: Асуудал + field_status: Төлөв + field_notes: Тэмдэглэлүүд + field_is_closed: Асуудал хаагдсан + field_is_default: Стандарт утга + field_tracker: Чиглэл + field_subject: Гарчиг + field_due_date: Дуусах огноо + field_assigned_to: Оноогдсон + field_priority: Зэрэглэл + field_fixed_version: Хувилбар + field_user: Хэрэглэгч + field_role: Хандалтын эрх + field_homepage: Нүүр хуудас + field_is_public: Олон нийтийн + field_parent: Эцэг төсөл нь + field_is_in_roadmap: Асуудлуудыг явцын зураг дээр харуулах + field_login: Нэвтрэх нэр + field_mail_notification: Имэйл мэдэгдлүүд + field_admin: Администратор + field_last_login_on: Сүүлийн холбоо + field_language: Хэл + field_password: Нууц үг + field_new_password: Шннэ нууц үг + field_password_confirmation: Баталгаажуулах + field_version: Хувилбар + field_type: Төрөл + field_host: Хост + field_port: Порт + field_account: Данс + field_base_dn: Үндсэн ДН + field_attr_login: Нэвтрэх аттрибут + field_attr_firstname: Таны нэр аттрибут + field_attr_lastname: Овог аттрибут + field_attr_mail: Имэйл аттрибут + field_onthefly: Хүссэн үедээ хэрэглэгч үүсгэх + field_start_date: Эхлэл + field_done_ratio: "%% Гүйцэтгэсэн" + field_auth_source: Нэвтрэх арга + field_hide_mail: Миний имэйл хаягийг нуу + field_comments: Тайлбар + field_url: URL Хаяг + field_start_page: Тэргүүн хуудас + field_subproject: Дэд төсөл + field_hours: Цаг + field_activity: Үйл ажиллагаа + field_spent_on: Огноо + field_identifier: Төслийн глобал нэр + field_is_filter: Шүүлтүүр болгон хэрэглэгддэг + field_issue_to: Хамаатай асуудал + field_delay: Хоцролт + field_assignable: Энэ хандалтын эрхэд асуудлуудыг оноож өгч болно + field_redirect_existing_links: Байгаа холбоосуудыг дахин чиглүүлэх + field_estimated_hours: Барагцаалсан цаг + field_column_names: Баганууд + field_time_zone: Цагын бүс + field_searchable: Хайж болох + field_default_value: Стандарт утга + field_comments_sorting: Тайлбаруудыг харуул + field_parent_title: Эцэг хуудас + field_editable: Засварлагдана + field_watcher: Харна + field_identity_url: OpenID URL + field_content: Агуулга + field_group_by: Үр дүнгээр бүлэглэх + field_sharing: Sharing + + setting_app_title: Программын гарчиг + setting_app_subtitle: Программын дэд гарчиг + setting_welcome_text: Мэндчилгээ + setting_default_language: Стандарт хэл + setting_login_required: Нэвтрэх шаардлагатай + setting_self_registration: Өөрийгөө бүртгүүлэх + setting_attachment_max_size: Хавсралт файлын дээд хэмжээ + setting_issues_export_limit: Асуудал экспортлох хязгаар + setting_mail_from: Ямар имэйл хаяг үүсгэх + setting_bcc_recipients: BCC талбарын хаягууд (bcc) + setting_plain_text_mail: дан текст мэйл (HTML биш) + setting_host_name: Хостын нэр болон зам + setting_text_formatting: Текст хэлбэржүүлэлт + setting_wiki_compression: Вики хуудсуудын түүх дээр шахалт хийх + setting_feeds_limit: Фийд агуулгын хязгаар + setting_default_projects_public: Шинэ төслүүд автоматаар олон нийтийнх байна + setting_autofetch_changesets: Комитуудыг автоматаар татаж авах + setting_sys_api_enabled: Репозитори менежментэд зориулан WS-ийг идэвхжүүлэх + setting_commit_ref_keywords: Хамааруулах түлхүүр үгс + setting_commit_fix_keywords: Зоолттой түлхүүр үгс + setting_autologin: Компьютер дээр санах + setting_date_format: Огнооны формат + setting_time_format: Цагийн формат + setting_cross_project_issue_relations: Төсөл хооронд асуудал хамааруулахыг зөвшөөрөх + setting_issue_list_default_columns: Асуудлуудыг харуулах стандарт баганууд + setting_repositories_encodings: Репозиторийн энкодинг + setting_commit_logs_encoding: Коммит хийх үед харуулах текстүүдийн энкодинг + setting_emails_footer: Имэйлүүдийн хөл хэсэг + setting_protocol: Протокол + setting_per_page_options: Нэг хуудсанд байх обьектуудын тохиргоо + setting_user_format: Хэрэглэгчдийг харуулах формат + setting_activity_days_default: Төслийн үйл ажиллагаа хэсэгт үзүүлэх өдрийн тоо + setting_display_subprojects_issues: Дэд төслүүдийн асуудлуудыг автоматаар гол төсөл дээр харуулах + setting_enabled_scm: SCM - ийг идэвхжүүлэх + setting_mail_handler_body_delimiters: "Truncate emails after one of these lines" + setting_mail_handler_api_enabled: Ирсэн мэйлүүдийн хувьд WS-ийг идэвхжүүлэх + setting_mail_handler_api_key: API түлхүүр + setting_sequential_project_identifiers: Дэс дараалсан төслийн глобал нэр үүсгэж байх + setting_gravatar_enabled: Gravatar дүрсүүдийг хэрэглэгчдэд хэрэглэж байх + setting_gravatar_default: Default Gravatar image + setting_diff_max_lines_displayed: Ялгаатай мөрүүдийн тоо (дээд тал нь) + setting_file_max_size_displayed: Max size of text files displayed inline + setting_repository_log_display_limit: Maximum number of revisions displayed on file log + setting_openid: Allow OpenID login and registration + setting_password_min_length: Minimum password length + setting_new_project_user_role_id: Role given to a non-admin user who creates a project + setting_default_projects_modules: Default enabled modules for new projects + setting_issue_done_ratio: Calculate the issue done ratio with + setting_issue_done_ratio_issue_field: Use the issue field + setting_issue_done_ratio_issue_status: Use the issue status + setting_start_of_week: Start calendars on + setting_rest_api_enabled: Enable REST web service + setting_cache_formatted_text: Cache formatted text + + permission_add_project: Create project + permission_add_subprojects: Create subprojects + permission_edit_project: Төслийг засварлах + permission_select_project_modules: Төслийн модулуудийг сонгоно уу + permission_manage_members: Системийн хэрэглэгчид + permission_manage_project_activities: Manage project activities + permission_manage_versions: Хувилбарууд + permission_manage_categories: Асуудлын ангиллууд + permission_view_issues: Асуудлуудыг харах + permission_add_issues: Асуудлууд нэмэх + permission_edit_issues: Асуудлуудыг засварлах + permission_manage_issue_relations: Асуудлын хамаарлыг зохицуулах + permission_add_issue_notes: Тэмдэглэл нэмэх + permission_edit_issue_notes: Тэмдэглэлүүд засварлах + permission_edit_own_issue_notes: Өөрийн үлдээсэн тэмдэглэлүүдийг засварлах + permission_move_issues: Асуудлуудыг зөөх + permission_delete_issues: Асуудлуудыг устгах + permission_manage_public_queries: Олон нийтийн асуултууд + permission_save_queries: Асуултуудыг хадгалах + permission_view_gantt: Гант диаграмыг үзэх + permission_view_calendar: Календарь үзэх + permission_view_issue_watchers: Ажиглагчдын жагсаалтыг харах + permission_add_issue_watchers: Ажиглагчид нэмэх + permission_delete_issue_watchers: Ажиглагчдыг устгах + permission_log_time: Зарцуулсан хугацааг лог хийх + permission_view_time_entries: Зарцуулсан хугацааг харах + permission_edit_time_entries: Хугацааны логуудыг засварлах + permission_edit_own_time_entries: Өөрийн хугацааны логуудыг засварлах + permission_manage_news: Мэдээ мэдээллүүд + permission_comment_news: Мэдээнд тайлбар үлдээх + permission_manage_documents: Бичиг баримтууд + permission_view_documents: Бичиг баримтуудыг харах + permission_manage_files: Файлууд + permission_view_files: Файлуудыг харах + permission_manage_wiki: Вики удирдах + permission_rename_wiki_pages: Вики хуудсуудыг дахиж нэрлэх + permission_delete_wiki_pages: Вики хуудсуудыг устгах + permission_view_wiki_pages: Вики үзэх + permission_view_wiki_edits: Вики түүх үзэх + permission_edit_wiki_pages: Вики хуудсуудыг засварлах + permission_delete_wiki_pages_attachments: Хавсралтуудыг устгах + permission_protect_wiki_pages: Вики хуудсуудыг хамгаалах + permission_manage_repository: Репозитори + permission_browse_repository: Репозиторийг үзэх + permission_view_changesets: Өөрчлөлтүүдийг харах + permission_commit_access: Коммит хандалт + permission_manage_boards: Самбарууд + permission_view_messages: Зурвасуудыг харах + permission_add_messages: Зурвас илгээх + permission_edit_messages: Зурвасуудыг засварлах + permission_edit_own_messages: Өөрийн зурвасуудыг засварлах + permission_delete_messages: Зурвасуудыг устгах + permission_delete_own_messages: Өөрийн зурвасуудыг устгах + permission_export_wiki_pages: Вики хуудсуудыг экспорт хийх + + project_module_issue_tracking: Асуудал хянах + project_module_time_tracking: Хугацаа хянах + project_module_news: Мэдээ мэдээллүүд + project_module_documents: Бичиг баримтууд + project_module_files: Файлууд + project_module_wiki: Вики + project_module_repository: Репозитори + project_module_boards: Самбарууд + + label_user: Хэрэглэгч + label_user_plural: Хэрэглэгчид + label_user_new: Шинэ хэрэглэгч + label_user_anonymous: Хамаагүй хэрэглэгч + label_project: Төсөл + label_project_new: Шинэ төсөл + label_project_plural: Төслүүд + label_x_projects: + zero: төсөл байхгүй + one: 1 төсөл + other: "%{count} төслүүд" + label_project_all: Бүх Төслүүд + label_project_latest: Сүүлийн үеийн төслүүд + label_issue: Асуудал + label_issue_new: Шинэ асуудал + label_issue_plural: Асуудлууд + label_issue_view_all: Бүх асуудлуудыг харах + label_issues_by: "%{value} - н асуудлууд" + label_issue_added: Асуудал нэмэгдлээ + label_issue_updated: Асуудал өөрчлөгдлөө + label_document: Бичиг баримт + label_document_new: Шинэ бичиг баримт + label_document_plural: Бичиг баримтууд + label_document_added: Бичиг баримт нэмэгдлээ + label_role: Хандалтын эрх + label_role_plural: Хандалтын эрхүүд + label_role_new: Шинэ хандалтын эрх + label_role_and_permissions: Хандалтын эрхүүд болон зөвшөөрлүүд + label_member: Гишүүн + label_member_new: Шинэ гишүүн + label_member_plural: Гишүүд + label_tracker: Чиглэл + label_tracker_plural: Чиглэлүүд + label_tracker_new: Шинэ чиглэл + label_workflow: Ажлын дараалал + label_issue_status: Асуудлын төлөв + label_issue_status_plural: Асуудлын төлвүүд + label_issue_status_new: Шинэ төлөв + label_issue_category: Асуудлын ангилал + label_issue_category_plural: Асуудлын ангиллууд + label_issue_category_new: Шинэ ангилал + label_custom_field: Хэрэглэгчийн тодорхойлсон талбар + label_custom_field_plural: Хэрэглэгчийн тодорхойлсон талбарууд + label_custom_field_new: Шинээр хэрэглэгчийн тодорхойлсон талбар үүсгэх + label_enumerations: Ангиллууд + label_enumeration_new: Шинэ утга + label_information: Мэдээлэл + label_information_plural: Мэдээллүүд + label_please_login: Нэвтэрч орно уу + label_register: Бүртгүүлэх + label_login_with_open_id_option: or login with OpenID + label_password_lost: Нууц үгээ алдсан + label_home: Нүүр + label_my_page: Миний хуудас + label_my_account: Миний данс + label_my_projects: Миний төслүүд + label_administration: Админ хэсэг + label_login: Нэвтрэх + label_logout: Гарах + label_help: Тусламж + label_reported_issues: Мэдэгдсэн асуудлууд + label_assigned_to_me_issues: Надад оноогдсон асуудлууд + label_last_login: Сүүлийн холболт + label_registered_on: Бүртгүүлсэн огноо + label_activity: Үйл ажиллагаа + label_overall_activity: Ерөнхий үйл ажиллагаа + label_user_activity: "%{value}-ийн үйл ажиллагаа" + label_new: Шинэ + label_logged_as: Холбогдсон нэр + label_environment: Орчин + label_authentication: Нэвтрэх + label_auth_source: Нэвтрэх арга + label_auth_source_new: Шинэ нэвтрэх арга + label_auth_source_plural: Нэвтрэх аргууд + label_subproject_plural: Дэд төслүүд + label_subproject_new: Шинэ дэд төсөл + label_and_its_subprojects: "%{value} болон холбогдох дэд төслүүд" + label_min_max_length: Дээд - Доод урт + label_list: Жагсаалт + label_date: Огноо + label_integer: Бүхэл тоо + label_float: Бутархай тоо + label_boolean: Үнэн худал утга + label_string: Текст + label_text: Урт текст + label_attribute: Аттрибут + label_attribute_plural: Аттрибутууд + label_download: "%{count} Татаж авсан зүйл" + label_download_plural: "%{count} Татаж авсан зүйлс" + label_no_data: Үзүүлэх өгөгдөл байхгүй байна + label_change_status: Төлвийг өөрчлөх + label_history: Түүх + label_attachment: Файл + label_attachment_new: Шинэ файл + label_attachment_delete: Файл устгах + label_attachment_plural: Файлууд + label_file_added: Файл нэмэгдлээ + label_report: Тайлан + label_report_plural: Тайлангууд + label_news: Мэдээ + label_news_new: Шинэ мэдээ + label_news_plural: Мэдээ + label_news_latest: Сүүлийн үеийн мэдээнүүд + label_news_view_all: Бүх мэдээг харах + label_news_added: Мэдээ нэмэгдлээ + label_change_log: Өөрчлөлтийн лог + label_settings: Тохиргоо + label_overview: Эхлэл + label_version: Хувилбар + label_version_new: Шинэ хувилбар + label_version_plural: Хувилбарууд + label_close_versions: Гүйцэт хувилбаруудыг хаалаа + label_confirmation: Баталгаажуулах + label_export_to: 'Өөр авч болох формат:' + label_read: Унших... + label_public_projects: Олон нийтийн төслүүд + label_open_issues: нээлттэй + label_open_issues_plural: нээлттэй + label_closed_issues: хаалттай + label_closed_issues_plural: хаалттай + label_x_open_issues_abbr_on_total: + zero: 0 нээлттэй / %{total} + one: 1 нээлттэй / %{total} + other: "%{count} нээлттэй / %{total}" + label_x_open_issues_abbr: + zero: 0 нээлттэй + one: 1 нээлттэй + other: "%{count} нээлттэй" + label_x_closed_issues_abbr: + zero: 0 хаалттай + one: 1 хаалттай + other: "%{count} хаалттай" + label_total: Нийт + label_permissions: Зөвшөөрлүүд + label_current_status: Одоогийн төлөв + label_new_statuses_allowed: Шинээр олгож болох төлвүүд + label_all: бүгд + label_none: хоосон + label_nobody: хэн ч биш + label_next: Дараагийн + label_previous: Өмнөх + label_used_by: Хэрэглэгддэг + label_details: Дэлгэрэнгүй + label_add_note: Тэмдэглэл нэмэх + label_per_page: Нэг хуудсанд + label_calendar: Календарь + label_months_from: Саруудыг хаанаас + label_gantt: Гант диаграм + label_internal: Дотоод + label_last_changes: "сүүлийн %{count} өөрчлөлтүүд" + label_change_view_all: Бүх өөрчлөлтүүдийг харах + label_personalize_page: Энэ хуудсыг өөрт зориулан өөрчлөх + label_comment: Тайлбар + label_comment_plural: Тайлбарууд + label_x_comments: + zero: сэтгэгдэл байхгүй + one: 1 сэтгэгдэлтэй + other: "%{count} сэтгэгдэлтэй" + label_comment_add: Тайлбар нэмэх + label_comment_added: Тайлбар нэмэгдлээ + label_comment_delete: Тайлбарууд устгах + label_query: Хэрэглэгчийн тодорхойлсон асуулт + label_query_plural: Хэрэглэгчийн тодорхойлсон асуултууд + label_query_new: Шинээр хэрэглэгчийн тодорхойлсон асуулт үүсгэх + label_filter_add: Шүүлтүүр нэмэх + label_filter_plural: Шүүлтүүрүүд + label_equals: бол + label_not_equals: биш + label_in_less_than: аас бага + label_in_more_than: аас их + label_greater_or_equal: '>=' + label_less_or_equal: '<=' + label_in: дотор + label_today: өнөөдөр + label_all_time: бүх хугацаа + label_yesterday: өчигдөр + label_this_week: энэ долоо хоног + label_last_week: өнгөрсөн долоо хоног + label_last_n_days: "сүүлийн %{count} өдрүүд" + label_this_month: энэ сар + label_last_month: сүүлийн сар + label_this_year: энэ жил + label_date_range: Хязгаар огноо + label_less_than_ago: бага өдрийн дотор + label_more_than_ago: их өдрийн дотор + label_ago: өдрийн өмнө + label_contains: агуулж байгаа + label_not_contains: агуулаагүй + label_day_plural: өдрүүд + label_repository: Репозитори + label_repository_plural: Репозиторууд + label_browse: Үзэх + label_modification: "%{count} өөрчлөлт" + label_modification_plural: "%{count} өөрчлөлтүүд" + label_branch: Салбар + label_tag: Шошго + label_revision: Хувилбар + label_revision_plural: Хувилбарууд + label_revision_id: "%{value} Хувилбар" + label_associated_revisions: Хамааралтай хувилбарууд + label_added: нэмэгдсэн + label_modified: өөрчлөгдсөн + label_copied: хуулсан + label_renamed: нэрийг нь өөрчилсөн + label_deleted: устгасан + label_latest_revision: Сүүлийн үеийн хувилбар + label_latest_revision_plural: Сүүлийн үеийн хувилбарууд + label_view_revisions: Хувилбаруудыг харах + label_view_all_revisions: Бүх хувилбаруудыг харах + label_max_size: Maximum size + label_sort_highest: Хамгийн дээр + label_sort_higher: Дээш нь + label_sort_lower: Доош нь + label_sort_lowest: Хамгийн доор + label_roadmap: Хөтөч + label_roadmap_due_in: "%{value} дотор дуусгах" + label_roadmap_overdue: "%{value} оройтсон" + label_roadmap_no_issues: Энэ хувилбарт асуудал байхгүй байна + label_search: Хайх + label_result_plural: Үр дүн + label_all_words: Бүх үгс + label_wiki: Вики + label_wiki_edit: Вики засвар + label_wiki_edit_plural: Вики засварууд + label_wiki_page: Вики хуудас + label_wiki_page_plural: Вики хуудас + label_index_by_title: Гарчгаар эрэмбэлэх + label_index_by_date: Огноогоор эрэмбэлэх + label_current_version: Одоогийн хувилбар + label_preview: Ямар харагдахыг шалгах + label_feed_plural: Feeds + label_changes_details: Бүх өөрчлөлтүүдийн дэлгэрэнгүй + label_issue_tracking: Асуудал хянах + label_spent_time: Зарцуулсан хугацаа + label_f_hour: "%{value} цаг" + label_f_hour_plural: "%{value} цаг" + label_time_tracking: Хугацааг хянах + label_change_plural: Өөрчлөлтүүд + label_statistics: Статистик + label_commits_per_month: Сард хийсэн коммитын тоо + label_commits_per_author: Зохиогч бүрийн хувьд коммитын тоо + label_view_diff: Ялгаануудыг харах + label_diff_inline: дотор нь + label_diff_side_by_side: зэрэгцүүлж + label_options: Тохиргоо + label_copy_workflow_from: Ажлын дарааллыг хуулах + label_permissions_report: Зөвшөөрлүүдийн таблиц + label_watched_issues: Ажиглагдаж байгаа асуудлууд + label_related_issues: Хамааралтай асуудлууд + label_applied_status: Олгосон төлөв + label_loading: Ачаалж байна... + label_relation_new: Шинэ хамаарал + label_relation_delete: Хамаарлыг устгах + label_relates_to: энгийн хамааралтай + label_duplicates: хос хамааралтай + label_duplicated_by: давхардуулсан эзэн + label_blocks: шаардах хамааралтай + label_blocked_by: блоколсон эзэн + label_precedes: урьдчилах хамааралтай + label_follows: дагаж + label_end_to_start: хойноос нь урагшаа + label_end_to_end: хойноос нь хойшоо + label_start_to_start: урдаас нь урагаа + label_start_to_end: урдаас нь хойшоо + label_stay_logged_in: Энэ комьютер дээр санах + label_disabled: идэвхгүй болсон + label_show_completed_versions: Гүйцэд хувилбаруудыг харуулах + label_me: би + label_board: Форум + label_board_new: Шинэ форум + label_board_plural: Форумууд + label_board_locked: Түгжээтэй + label_board_sticky: Sticky + label_topic_plural: Сэдвүүд + label_message_plural: Зурвасууд + label_message_last: Сүүлийн зурвас + label_message_new: Шинэ зурвас + label_message_posted: Зурвас нэмэгдлээ + label_reply_plural: Хариултууд + label_send_information: Дансны мэдээллийг хэрэглэгчид илгээх + label_year: Жил + label_month: Сар + label_week: Долоо хоног + label_date_from: Хэзээнээс + label_date_to: Хэдий хүртэл + label_language_based: Хэрэглэгчийн хэлнас шалтгаалан + label_sort_by: "%{value} талбараар нь эрэмбэлэх" + label_send_test_email: Турших мэйл илгээх + label_feeds_access_key: RSS хандах түлхүүр + label_missing_feeds_access_key: RSS хандах түлхүүр алга + label_feeds_access_key_created_on: "RSS хандалтын түлхүүр %{value}-ийн өмнө үүссэн" + label_module_plural: Модулууд + label_added_time_by: "%{author} %{age}-ийн өмнө нэмсэн" + label_updated_time_by: "%{author} %{age}-ийн өмнө өөрчилсөн" + label_updated_time: "%{value} -ийн өмнө өөрчлөгдсөн" + label_jump_to_a_project: Төсөл рүү очих... + label_file_plural: Файлууд + label_changeset_plural: Өөрчлөлтүүд + label_default_columns: Стандарт баганууд + label_no_change_option: (Өөрчлөлт байхгүй) + label_bulk_edit_selected_issues: Сонгогдсон асуудлуудыг бөөнөөр засварлах + label_theme: Системийн Дизайн + label_default: Стандарт + label_search_titles_only: Зөвхөн гарчиг хайх + label_user_mail_option_all: "Миний бүх төсөл дээрх бүх үзэгдлүүдийн хувьд" + label_user_mail_option_selected: "Сонгогдсон төслүүдийн хувьд бүх үзэгдэл дээр..." + label_user_mail_no_self_notified: "Миний өөрийн хийсэн өөрчлөлтүүдийн тухай надад мэдэгдэх хэрэггүй" + label_registration_activation_by_email: дансыг имэйлээр идэвхжүүлэх + label_registration_manual_activation: дансыг гараар идэвхжүүлэх + label_registration_automatic_activation: дансыг автоматаар идэвхжүүлэх + label_display_per_page: 'Нэг хуудсанд: %{value}' + label_age: Нас + label_change_properties: Тохиргоог өөрчлөх + label_general: Ерөнхий + label_more: Цааш нь + label_scm: SCM + label_plugins: Модулууд + label_ldap_authentication: LDAP нэвтрэх горим + label_downloads_abbr: D/L + label_optional_description: Дурын тайлбар + label_add_another_file: Дахин файл нэмэх + label_preferences: Тохиргоо + label_chronological_order: Цагаан толгойн үсгийн дарааллаар + label_reverse_chronological_order: Урвуу цагаан толгойн үсгийн дарааллаар + label_planning: Төлөвлөлт + label_incoming_emails: Ирсэн мэйлүүд + label_generate_key: Түлхүүр үүсгэх + label_issue_watchers: Ажиглагчид + label_example: Жишээ + label_display: Display + label_sort: Sort + label_ascending: Ascending + label_descending: Descending + label_date_from_to: From %{start} to %{end} + label_wiki_content_added: Wiki page added + label_wiki_content_updated: Wiki page updated + label_group: Group + label_group_plural: Groups + label_group_new: New group + label_time_entry_plural: Spent time + label_version_sharing_none: Not shared + label_version_sharing_descendants: With subprojects + label_version_sharing_hierarchy: With project hierarchy + label_version_sharing_tree: With project tree + label_version_sharing_system: With all projects + label_update_issue_done_ratios: Update issue done ratios + label_copy_source: Source + label_copy_target: Target + label_copy_same_as_target: Same as target + label_display_used_statuses_only: Only display statuses that are used by this tracker + label_api_access_key: API access key + label_missing_api_access_key: Missing an API access key + label_api_access_key_created_on: "API access key created %{value} ago" + + button_login: Нэвтрэх + button_submit: Илгээх + button_save: Хадгалах + button_check_all: Бүгдийг сонго + button_uncheck_all: Бүгдийг үл сонго + button_delete: Устгах + button_create: Үүсгэх + button_create_and_continue: Үүсгээд цааш үргэлжлүүлэх + button_test: Турших + button_edit: Засварлах + button_add: Нэмэх + button_change: Өөрчлөх + button_apply: Өөрчлөлтийг хадгалах + button_clear: Цэвэрлэх + button_lock: Түгжих + button_unlock: Түгжээг тайлах + button_download: Татах + button_list: Жагсаалт + button_view: Харах + button_move: Зөөх + button_move_and_follow: Зөө бас дага + button_back: Буцах + button_cancel: Болих + button_activate: Идэвхжүүлэх + button_sort: Эрэмбэлэх + button_log_time: Лог хийсэн хугацаа + button_rollback: Энэ хувилбар руу буцах + button_watch: Ажиглах + button_unwatch: Ажиглахаа болих + button_reply: Хариулах + button_archive: Архивлах + button_unarchive: Архивыг задлах + button_reset: Анхны утгууд + button_rename: Нэрийг нь солих + button_change_password: Нууц үгээ өөрчлөх + button_copy: Хуулах + button_copy_and_follow: Зөө бас дага + button_annotate: Тайлбар хавсаргах + button_update: Шинэчлэх + button_configure: Тохируулах + button_quote: Ишлэл + button_duplicate: Хуулбар + button_show: Үзэх + + status_active: идэвхтэй + status_registered: бүртгүүлсэн + status_locked: түгжээтэй + + version_status_open: нээлттэй + version_status_locked: түгжээтэй + version_status_closed: хаалттай + + field_active: идэвхтэй + + text_select_mail_notifications: Ямар үед имэйлээр мэдэгдэл илгээхийг сонгоно уу. + text_regexp_info: eg. ^[A-Z0-9]+$ + text_min_max_length_info: 0 гэвэл ямар ч хязгааргүй гэсэн үг + text_project_destroy_confirmation: Та энэ төсөл болоод бусад мэдээллийг нь үнэхээр устгамаар байна уу ? + text_subprojects_destroy_warning: "Уг төслийн дэд төслүүд : %{value} нь бас устгагдах болно." + text_workflow_edit: Ажлын дарааллыг өөрчлөхийн тулд хандалтын эрх болон асуудлын чиглэлийг сонгоно уу + text_are_you_sure: Та итгэлтэй байна уу ? + text_journal_changed: "%{label} %{old} байсан нь %{new} болов" + text_journal_set_to: "%{label} %{value} болгож өөрчиллөө" + text_journal_deleted: "%{label} устсан (%{old})" + text_journal_added: "%{label} %{value} нэмэгдсэн" + text_tip_issue_begin_day: энэ өдөр эхлэх ажил + text_tip_issue_end_day: энэ өдөр дуусах ажил + text_tip_issue_begin_end_day: энэ өдөр эхлээд мөн дуусч байгаа ажил + text_project_identifier_info: 'Only lower case letters (a-z), numbers, dashes and underscores are allowed.
Once saved, the identifier can not be changed.' + text_caracters_maximum: "дээд тал нь %{count} үсэг." + text_caracters_minimum: "Хамгийн багадаа ядаж %{count} тэмдэгт байх." + text_length_between: "Урт нь багадаа %{min}, ихдээ %{max} тэмдэгт." + text_tracker_no_workflow: Энэхүү асуудлын чиглэлд ямар ч ажлын дараалал тодорхойлогдоогүй байна + text_unallowed_characters: Хэрэглэж болохгүй тэмдэгтүүд + text_comma_separated: Таслалаар зааглан олон утга оруулж болно. + text_line_separated: Multiple values allowed (one line for each value). + text_issues_ref_in_commit_messages: Коммитийн зурвасуудад хамааруулсан болон байнгын асуудлууд + text_issue_added: "Асуудал %{id} - ийг хэрэглэгч %{author} мэдэгдсэн байна." + text_issue_updated: "Асуудал %{id} - ийг хэрэглэгч %{author} өөрчилсөн байна." + text_wiki_destroy_confirmation: Та энэ вики болон холбогдох бүх мэдээллийг үнэхээр устгамаар байна уу ? + text_issue_category_destroy_question: "Энэ ангилалд зарим асуудлууд (%{count}) орсон байна. Та яах вэ ?" + text_issue_category_destroy_assignments: Асуудлуудыг энэ ангиллаас авах + text_issue_category_reassign_to: Асуудлуудыг энэ ангилалд дахин оноох + text_user_mail_option: "Сонгогдоогүй төслүүдийн хувьд, та зөвхөн өөрийнхөө ажиглаж байгаа зүйлс юмуу танд хамаатай зүйлсийн талаар мэдэгдэл авах болно (Таны оруулсан асуудал, эсвэл танд оноосон гэх мэт)." + text_no_configuration_data: "Хандалтын эрхүүд, чиглэлүүд, асуудлын төлвүүд болон ажлын дарааллын тухай мэдээллийг хараахан оруулаагүй байна.\nТа стандарт өгөгдлүүдийг даруйхан оруулахыг зөвлөж байна, оруулсан хойно та засварлаж болно." + text_load_default_configuration: Стандарт өгөгдлийг ачаалах + text_status_changed_by_changeset: "%{value} өөрчлөлтөд хийгдсэн." + text_issues_destroy_confirmation: 'Та сонгогдсон асуудлуудыг үнэхээр устгамаар байна уу ?' + text_select_project_modules: 'Энэ төслийн хувьд идэвхжүүлэх модулуудаа сонгоно уу:' + text_default_administrator_account_changed: Стандарт администраторын бүртгэл өөрчлөгдлөө + text_file_repository_writable: Хавсралт файл хадгалах хавтас руу бичих эрхтэй + text_plugin_assets_writable: Плагин модулийн ассет хавтас руу бичих эрхтэй + text_rmagick_available: RMagick суулгагдсан (заавал биш) + text_destroy_time_entries_question: "Таны устгах гэж байгаа асуудлууд дээр нийт %{hours} цаг зарцуулсан юм байна, та яах вэ ?" + text_destroy_time_entries: Мэдэгдсэн цагуудыг устгах + text_assign_time_entries_to_project: Мэдэгдсэн асуудлуудыг төсөлд оноох + text_reassign_time_entries: 'Мэдэгдсэн асуудлуудыг энэ асуудалд дахин оноо:' + text_user_wrote: "%{value} бичихдээ:" + text_enumeration_destroy_question: "Энэ утгад %{count} обьект оноогдсон байна." + text_enumeration_category_reassign_to: 'Тэдгээрийг энэ утгад дахин оноо:' + text_email_delivery_not_configured: "Имэйлийн тохиргоог хараахан тохируулаагүй байна, тиймээс имэйл мэдэгдэл явуулах боломжгүй байна.\nSMTP сервэрээ config/configuration.yml файл дотор тохируулаад төслийн менежерээ дахиад эхлүүлээрэй." + text_repository_usernames_mapping: "Репозиторийн логд байгаа бүх хэрэглэгчийн нэрүүдэд харгалзсан Төслийн Менежер системд бүртгэлтэй хэрэглэгчдийг Сонгох юмуу шинэчилнэ үү.\nТөслийн менежер болон репозиторид байгаа ижилхэн нэр юмуу имэйлтэй хэрэглэгчид харилцан харгалзна." + text_diff_truncated: '... Файлын ялгаврын хэмжээ үзүүлэхэд дэндүү урт байгаа учраас төгсгөлөөс нь хасч үзүүлэв.' + text_custom_field_possible_values_info: 'One line for each value' + text_wiki_page_destroy_question: "This page has %{descendants} child page(s) and descendant(s). What do you want to do?" + text_wiki_page_nullify_children: "Keep child pages as root pages" + text_wiki_page_destroy_children: "Delete child pages and all their descendants" + text_wiki_page_reassign_children: "Reassign child pages to this parent page" + text_own_membership_delete_confirmation: "You are about to remove some or all of your permissions and may no longer be able to edit this project after that.\nAre you sure you want to continue?" + + default_role_manager: Менежер + default_role_developer: Хөгжүүлэгч + default_role_reporter: Мэдэгдэгч + default_role_non_member: Non member + default_role_anonymous: Anonymous + default_tracker_bug: Алдаа + default_tracker_feature: Онцлог + default_tracker_support: Тусламж + default_issue_status_new: Шинэ + default_issue_status_in_progress: Ахицтай + default_issue_status_assigned: Оноогдсон + default_issue_status_resolved: Шийдвэрлэгдсэн + default_issue_status_feedback: Feedback + default_issue_status_closed: Хаагдсан + default_issue_status_rejected: Хүлээж аваагүй + default_doc_category_user: Хэрэглэгчийн бичиг баримт + default_doc_category_tech: Техникийн бичиг баримт + default_priority_low: Бага + default_priority_normal: Хэвийн + default_priority_high: Өндөр + default_priority_urgent: Нэн яаралтай + default_priority_immediate: Нэн даруй + default_activity_design: Дизайн + default_activity_development: Хөгжүүлэлт + + enumeration_issue_priorities: Асуудлын зэрэглэлүүд + enumeration_doc_categories: Бичиг баримтын ангиллууд + enumeration_activities: Үйл ажиллагаанууд (хугацааг хянах) + enumeration_system_activity: Системийн үйл ажиллагаа + + permission_manage_subtasks: Manage subtasks + label_profile: Profile + field_parent_issue: Parent task + error_unable_delete_issue_status: Unable to delete issue status + label_subtask_plural: Subtasks + label_project_copy_notifications: Send email notifications during the project copy + error_can_not_delete_custom_field: Unable to delete custom field + error_unable_to_connect: Unable to connect (%{value}) + error_can_not_remove_role: This role is in use and can not be deleted. + error_can_not_delete_tracker: This tracker contains issues and can't be deleted. + field_principal: Principal + label_my_page_block: My page block + notice_failed_to_save_members: "Failed to save member(s): %{errors}." + text_zoom_out: Zoom out + text_zoom_in: Zoom in + notice_unable_delete_time_entry: Unable to delete time log entry. + label_overall_spent_time: Overall spent time + field_time_entries: Log time + project_module_gantt: Gantt + project_module_calendar: Calendar + button_edit_associated_wikipage: "Edit associated Wiki page: %{page_title}" + text_are_you_sure_with_children: Delete issue and all child issues? + field_text: Text field + label_user_mail_option_only_owner: Only for things I am the owner of + setting_default_notification_option: Default notification option + label_user_mail_option_only_my_events: Only for things I watch or I'm involved in + label_user_mail_option_only_assigned: Only for things I am assigned to + label_user_mail_option_none: No events + field_member_of_group: Assignee's group + field_assigned_to_role: Assignee's role + notice_not_authorized_archived_project: The project you're trying to access has been archived. + label_principal_search: "Search for user or group:" + label_user_search: "Search for user:" + field_visible: Visible + setting_emails_header: Emails header + setting_commit_logtime_activity_id: Activity for logged time + text_time_logged_by_changeset: Applied in changeset %{value}. + setting_commit_logtime_enabled: Enable time logging + notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max}) + setting_gantt_items_limit: Maximum number of items displayed on the gantt chart + text_powered_by: Powered by %{link} label_cvs_module: Module label_filesystem_path: Root directory label_darcs_path: Root directory @@ -947,3 +949,18 @@ mn: label_cvs_path: CVSROOT label_git_path: Path to .git directory label_mercurial_path: Root directory + label_my_queries: My custom queries + label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee + text_journal_changed_no_detail: "%{label} updated" + button_expand_all: Expand all + button_collapse_all: Collapse all + label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author + field_effective_date: Due date + label_news_comment_added: Comment added to a news + field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text + text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page. + text_default_encoding: "Default: UTF-8" + text_git_repo_example: a bare and local repository (e.g. /gitrepo, c:\gitrepo) + label_notify_member_plural: Email issue updates + label_path_encoding: Path encoding + text_mercurial_repo_example: local repository (e.g. /hgrepo, c:\hgrepo) diff --git a/config/locales/nl.yml b/config/locales/nl.yml index 4dcf7cf9..7fa08fc5 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -5,34 +5,37 @@ nl: # Use the strftime parameters for formats. # When no format has been given, it uses default. # You can provide other formats here if you like! - default: "%Y-%m-%d" - short: "%b %d" - long: "%B %d, %Y" - - day_names: [Zondag, Maandag, Dinsdag, Woensdag, Donderdag, Vrijdag, Zaterdag] - abbr_day_names: [Zo, Ma, Di, Woe, Do, Vr, Zat] - + default: "%d-%m-%Y" + short: "%e %b" + long: "%d %B, %Y" + + day_names: [zondag, maandag, dinsdag, woensdag, donderdag, vrijdag, zaterdag] + abbr_day_names: [zo, ma, di, wo, do, vr, za] + # Don't forget the nil at the beginning; there's no such thing as a 0th month - month_names: [~, Januari, Februari, Maart, April, Mei, Juni, Juli, Augustus, September, Oktober, November, December] - abbr_month_names: [~, Jan, Feb, Mar, Apr, Mei, Jun, Jul, Aug, Sep, Okt, Nov, Dec] + month_names: [~, januari, februari, maart, april, mei, juni, juli, augustus, september, oktober, november, december] + abbr_month_names: [~, jan, feb, mar, apr, mei, jun, jul, aug, sep, okt, nov, dec] # Used in date_select and datime_select. - order: [ :year, :month, :day ] + order: + - :day + - :month + - :year time: formats: default: "%a, %d %b %Y %H:%M:%S %z" time: "%H:%M" - short: "%d %b %H:%M" - long: "%B %d, %Y %H:%M" + short: "%e %b %H:%M" + long: "%d %B, %Y %H:%M" am: "am" pm: "pm" - + datetime: distance_in_words: half_a_minute: "halve minuut" less_than_x_seconds: one: "minder dan een seconde" - other: "mindera dan %{count} seconden" + other: "minder dan %{count} seconden" x_seconds: one: "1 seconde" other: "%{count} seconden" @@ -56,46 +59,46 @@ nl: other: "%{count} maanden" about_x_years: one: "ongeveer 1 jaar" - other: "ongeveer %{count} jaren" + other: "ongeveer %{count} jaar" over_x_years: - one: "over 1 jaar" - other: "over %{count} jaren" + one: "meer dan 1 jaar" + other: "meer dan %{count} jaar" almost_x_years: - one: "almost 1 year" - other: "almost %{count} years" + one: "bijna 1 jaar" + other: "bijna %{count} jaar" number: format: separator: "." delimiter: "" precision: 3 - human: - format: + human: + format: precision: 1 delimiter: "" - storage_units: + storage_units: format: "%n %u" - units: + units: kb: KB tb: TB gb: GB - byte: + byte: one: Byte other: Bytes mb: MB - + # Used in array.to_sentence. support: array: sentence_connector: "en" skip_last_comma: false - + activerecord: errors: template: header: - one: "1 error prohibited this %{model} from being saved" - other: "%{count} errors prohibited this %{model} from being saved" + one: "Door een fout kon dit %{model} niet worden opgeslagen" + other: "Door %{count} fouten kon dit %{model} niet worden opgeslagen" messages: inclusion: "staat niet in de lijst" exclusion: "is gereserveerd" @@ -123,7 +126,7 @@ nl: cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks" actionview_instancetag_blank_option: Selecteer - + button_activate: Activeer button_add: Voeg toe button_annotate: Annoteer @@ -143,7 +146,7 @@ nl: button_edit: Bewerk button_list: Lijst button_lock: Sluit - button_log_time: Log tijd + button_log_time: Registreer tijd button_login: Inloggen button_move: Verplaatsen button_quote: Citaat @@ -213,10 +216,9 @@ nl: field_default_value: Standaardwaarde field_delay: Vertraging field_description: Beschrijving - field_done_ratio: % Gereed + field_done_ratio: "% Gereed" field_downloads: Downloads field_due_date: Verwachte datum gereed - field_effective_date: Datum field_estimated_hours: Geschatte tijd field_field_format: Formaat field_filename: Bestand @@ -515,9 +517,9 @@ nl: one: 1 project other: "%{count} projects" label_public_projects: Publieke projecten - label_query: Eigen zoekvraag - label_query_new: Nieuwe zoekvraag - label_query_plural: Eigen zoekvragen + label_query: Eigen zoekopdracht + label_query_new: Nieuwe zoekopdracht + label_query_plural: Eigen zoekopdrachten label_read: Lees... label_register: Registreer label_registered_on: Geregistreerd op @@ -583,7 +585,7 @@ nl: label_used_by: Gebruikt door label_user: Gebruiker label_user_activity: "%{value}'s activiteit" - label_user_mail_no_self_notified: "Ik wil niet op de hoogte gehouden worden van wijzigingen die ik zelf maak." + label_user_mail_no_self_notified: Ik wil niet op de hoogte gehouden worden van mijn eigen wijzigingen label_user_mail_option_all: "Bij elk gebeurtenis in al mijn projecten..." label_user_mail_option_selected: "Enkel bij elke gebeurtenis op het geselecteerde project..." label_user_new: Nieuwe gebruiker @@ -715,12 +717,12 @@ nl: setting_gravatar_enabled: Gebruik Gravatar gebruikersiconen setting_host_name: Hostnaam setting_issue_list_default_columns: Standaardkolommen getoond op de lijst met issues - setting_issues_export_limit: Max aantal te exporteren issues + setting_issues_export_limit: Max aantal te exporteren issues setting_login_required: Authenticatie vereist setting_mail_from: Afzender e-mail adres setting_mail_handler_api_enabled: Schakel WS in voor inkomende mail. setting_mail_handler_api_key: API sleutel - setting_per_page_options: Objects per pagina-opties + setting_per_page_options: Aantal objecten per pagina (opties) setting_plain_text_mail: platte tekst (geen HTML) setting_protocol: Protocol setting_repositories_encodings: Repositories coderingen @@ -744,7 +746,7 @@ nl: text_destroy_time_entries: Verwijder gerapporteerde uren text_destroy_time_entries_question: "%{hours} uren werden gerapporteerd op de issue(s) die u wilde verwijderen. Wat wil u doen?" text_diff_truncated: '... Deze diff werd afgekort omdat het de maximale weer te geven karakters overschreed.' - text_email_delivery_not_configured: "E-mailbezorging is niet geconfigureerd. Notificaties zijn uitgeschakeld.\nConfigureer uw SMTP server in config/configuration.yml en herstart de applicatie om dit te activeren." + text_email_delivery_not_configured: "E-mailbezorging is niet geconfigureerd. Mededelingen zijn uitgeschakeld.\nConfigureer uw SMTP server in config/configuration.yml en herstart de applicatie om dit te activeren." text_enumeration_category_reassign_to: 'Wijs de volgende waarde toe:' text_enumeration_destroy_question: "%{count} objecten zijn toegewezen aan deze waarde." text_file_repository_writable: Bestandsrepository beschrijfbaar @@ -775,7 +777,7 @@ nl: text_tip_issue_end_day: issue die op deze dag eindigt text_tracker_no_workflow: Geen workflow gedefinieerd voor deze tracker text_unallowed_characters: Niet toegestane tekens - text_user_mail_option: "Bij niet-geselecteerde projecten zult u enkel notificaties ontvangen voor issues die u monitort of waar u bij betrokken bent (als auteur of toegewezen persoon)." + text_user_mail_option: "Bij niet-geselecteerde projecten zult u enkel mededelingen ontvangen voor issues die u monitort of waar u bij betrokken bent (als auteur of toegewezen persoon)." text_user_wrote: "%{value} schreef:" text_wiki_destroy_confirmation: Weet u zeker dat u deze wiki en zijn inhoud wenst te verwijderen? text_workflow_edit: Selecteer een rol en een tracker om de workflow te wijzigen @@ -784,7 +786,7 @@ nl: text_custom_field_possible_values_info: 'Per lijn een waarde' label_display: Toon field_editable: Bewerkbaar - setting_repository_log_display_limit: Max aantal revisies zichbaar + setting_repository_log_display_limit: Max aantal revisies zichbaar setting_file_max_size_displayed: Max grootte van tekst bestanden inline zichtbaar field_watcher: Watcher setting_openid: Sta OpenID login en registratie toe @@ -797,7 +799,7 @@ nl: label_date_from_to: Van %{start} tot %{end} label_greater_or_equal: ">=" label_less_or_equal: <= - text_wiki_page_destroy_question: Deze pagina heeft %{descendants} subpagina's en onderliggende pagina's?. Wil wil je ermee doen? + text_wiki_page_destroy_question: Deze pagina heeft %{descendants} subpagina's en onderliggende pagina's?. Wat wilt u hiermee doen? text_wiki_page_reassign_children: Alle subpagina's toewijzen aan deze hoofdpagina text_wiki_page_nullify_children: Behoud subpagina's als hoofdpagina's text_wiki_page_destroy_children: Verwijder alle subpagina's en onderliggende pagina's @@ -806,9 +808,9 @@ nl: mail_subject_wiki_content_updated: "'%{id}' wiki pagina is bijgewerkt" label_wiki_content_added: Wiki pagina toegevoegd mail_subject_wiki_content_added: "'%{id}' wiki pagina is toegevoegd" - mail_body_wiki_content_added: The '%{id}' wiki pagina is toegevoegd door %{author}. + mail_body_wiki_content_added: De '%{id}' wiki pagina is toegevoegd door %{author}. label_wiki_content_updated: Wiki pagina bijgewerkt - mail_body_wiki_content_updated: The '%{id}' wiki pagina is bijgewerkt door %{author}. + mail_body_wiki_content_updated: De '%{id}' wiki pagina is bijgewerkt door %{author}. permission_add_project: Maak project setting_new_project_user_role_id: Rol van gebruiker die een project maakt label_view_all_revisions: Bekijk alle revisies @@ -897,34 +899,49 @@ nl: text_zoom_in: Zoom in notice_unable_delete_time_entry: Verwijderen niet mogelijk van tijd log invoer. label_overall_spent_time: Totaal bestede tijd - field_time_entries: Log tijd + field_time_entries: Registreer tijd project_module_gantt: Gantt project_module_calendar: Kalender - button_edit_associated_wikipage: "Edit associated Wiki page: %{page_title}" - text_are_you_sure_with_children: Delete issue and all child issues? - field_text: Text field - label_user_mail_option_only_owner: Only for things I am the owner of - setting_default_notification_option: Default notification option - label_user_mail_option_only_my_events: Only for things I watch or I'm involved in - label_user_mail_option_only_assigned: Only for things I am assigned to - label_user_mail_option_none: No events + button_edit_associated_wikipage: "Bewerk bijbehorende wiki pagina: %{page_title}" + text_are_you_sure_with_children: Verwijder issue en alle onderliggende issues? + field_text: Tekst veld + label_user_mail_option_only_owner: Alleen voor dingen waarvan ik de auteur ben + setting_default_notification_option: Standaard instelling voor mededelingen + label_user_mail_option_only_my_events: Alleen voor dingen die ik volg of bij betrokken ben + label_user_mail_option_only_assigned: Alleen voor dingen die aan mij zijn toegewezen + label_user_mail_option_none: Bij geen enkele gebeurtenis field_member_of_group: Assignee's group field_assigned_to_role: Assignee's role - notice_not_authorized_archived_project: The project you're trying to access has been archived. - label_principal_search: "Search for user or group:" - label_user_search: "Search for user:" - field_visible: Visible + notice_not_authorized_archived_project: Het project dat u wilt bezoeken is gearchiveerd. + label_principal_search: "Zoek naar gebruiker of groep:" + label_user_search: "Zoek naar gebruiker:" + field_visible: Zichtbaar setting_emails_header: Emails header - setting_commit_logtime_activity_id: Activity for logged time - text_time_logged_by_changeset: Applied in changeset %{value}. - setting_commit_logtime_enabled: Enable time logging - notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max}) - setting_gantt_items_limit: Maximum number of items displayed on the gantt chart - text_powered_by: Powered by %{link} + setting_commit_logtime_activity_id: Standaard activiteit voor tijdregistratie + text_time_logged_by_changeset: Toegepast in changeset %{value}. + setting_commit_logtime_enabled: Activeer tijdregistratie + notice_gantt_chart_truncated: De gantt chart is ingekort omdat het meer objecten bevat dan kan worden weergegeven, (%{max}) + setting_gantt_items_limit: Max. aantal objecten op gantt chart + field_warn_on_leaving_unsaved: Waarschuw me wanneer ik een pagina verlaat waarvan de tekst niet opgeslagen is + text_warn_on_leaving_unsaved: De huidige pagina bevat tekst die niet is opgeslagen en dit zal verloren gaan als u deze pagina nu verlaat. + label_my_queries: Mijn aangepaste zoekopdrachten + label_news_comment_added: Commentaar toegevoegd aan een nieuwsitem + button_expand_all: Expand all + button_collapse_all: Collapse all + label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee + label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author label_cvs_module: Module label_filesystem_path: Root directory label_darcs_path: Root directory + text_journal_changed_no_detail: "%{label} updated" + field_effective_date: Due date label_bazaar_path: Root directory label_cvs_path: CVSROOT label_git_path: Path to .git directory + text_powered_by: Powered by %{link} label_mercurial_path: Root directory + text_default_encoding: "Default: UTF-8" + text_git_repo_example: a bare and local repository (e.g. /gitrepo, c:\gitrepo) + label_notify_member_plural: Email issue updates + label_path_encoding: Path encoding + text_mercurial_repo_example: local repository (e.g. /hgrepo, c:\hgrepo) diff --git a/config/locales/no.yml b/config/locales/no.yml index 5120869e..14e2a953 100644 --- a/config/locales/no.yml +++ b/config/locales/no.yml @@ -13,7 +13,10 @@ abbr_day_names: [søn, man, tir, ons, tor, fre, lør] month_names: [~, januar, februar, mars, april, mai, juni, juli, august, september, oktober, november, desember] abbr_month_names: [~, jan, feb, mar, apr, mai, jun, jul, aug, sep, okt, nov, des] - order: [:day, :month, :year] + order: + - :day + - :month + - :year time: formats: default: "%A, %e. %B %Y, %H:%M" @@ -113,9 +116,9 @@ circular_dependency: "Denne relasjonen ville lagd en sirkulær avhengighet" cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks" - + actionview_instancetag_blank_option: Vennligst velg - + general_text_No: 'Nei' general_text_Yes: 'Ja' general_text_no: 'nei' @@ -126,7 +129,7 @@ general_csv_encoding: ISO-8859-1 general_pdf_encoding: ISO-8859-1 general_first_day_of_week: '1' - + notice_account_updated: Kontoen er oppdatert. notice_account_invalid_creditentials: Feil brukernavn eller passord notice_account_password_updated: Passordet er oppdatert. @@ -150,13 +153,13 @@ notice_no_issue_selected: "Ingen sak valgt! Vennligst merk sakene du vil endre." notice_account_pending: "Din konto ble opprettet og avventer nå administrativ godkjenning." notice_default_data_loaded: Standardkonfigurasjonen lastet inn. - + error_can_t_load_default_data: "Standardkonfigurasjonen kunne ikke lastes inn: %{value}" error_scm_not_found: "Elementet og/eller revisjonen eksisterer ikke i depoet." error_scm_command_failed: "En feil oppstod under tilkobling til depoet: %{value}" error_scm_annotate: "Elementet eksisterer ikke, eller kan ikke noteres." error_issue_not_found_in_project: 'Saken eksisterer ikke, eller hører ikke til dette prosjektet' - + mail_subject_lost_password: "Ditt %{value} passord" mail_body_lost_password: 'Klikk følgende lenke for å endre ditt passord:' mail_subject_register: "%{value} kontoaktivering" @@ -167,10 +170,10 @@ mail_body_account_activation_request: "En ny bruker (%{value}) er registrert, og avventer din godkjenning:" mail_subject_reminder: "%{count} sak(er) har frist de kommende %{days} dagene" mail_body_reminder: "%{count} sak(er) som er tildelt deg har frist de kommende %{days} dager:" - + gui_validation_error: 1 feil gui_validation_error_plural: "%{count} feil" - + field_name: Navn field_description: Beskrivelse field_summary: Oppsummering @@ -216,7 +219,6 @@ field_admin: Administrator field_last_login_on: Sist innlogget field_language: Språk - field_effective_date: Dato field_password: Passord field_new_password: Nytt passord field_password_confirmation: Bekreft passord @@ -232,7 +234,7 @@ field_attr_mail: E-post-attributt field_onthefly: On-the-fly brukeropprettelse field_start_date: Start - field_done_ratio: % Ferdig + field_done_ratio: "% Ferdig" field_auth_source: Autentifikasjonsmodus field_hide_mail: Skjul min e-post-adresse field_comments: Kommentarer @@ -254,7 +256,7 @@ field_searchable: Søkbar field_default_value: Standardverdi field_comments_sorting: Vis kommentarer - + setting_app_title: Applikasjonstittel setting_app_subtitle: Applikasjonens undertittel setting_welcome_text: Velkomsttekst @@ -287,7 +289,7 @@ setting_activity_days_default: Dager vist på prosjektaktivitet setting_display_subprojects_issues: Vis saker fra underprosjekter på hovedprosjekt som standard setting_enabled_scm: Aktiviserte SCM - + project_module_issue_tracking: Sakssporing project_module_time_tracking: Tidssporing project_module_news: Nyheter @@ -296,7 +298,7 @@ project_module_wiki: Wiki project_module_repository: Depot project_module_boards: Forumer - + label_user: Bruker label_user_plural: Brukere label_user_new: Ny bruker @@ -356,7 +358,7 @@ label_logout: Logg ut label_help: Hjelp label_reported_issues: Rapporterte saker - label_assigned_to_me_issues: Saker tildelt meg + label_assigned_to_me_issues: Saker tildelt meg label_last_login: Sist innlogget label_registered_on: Registrert label_activity: Aktivitet @@ -603,7 +605,7 @@ label_chronological_order: I kronologisk rekkefølge label_reverse_chronological_order: I omvendt kronologisk rekkefølge label_planning: Planlegging - + button_login: Logg inn button_submit: Send button_save: Lagre @@ -641,11 +643,11 @@ button_annotate: Notér button_update: Oppdater button_configure: Konfigurer - + status_active: aktiv status_registered: registrert status_locked: låst - + text_select_mail_notifications: Velg hendelser som skal varsles med e-post. text_regexp_info: eg. ^[A-Z0-9]+$ text_min_max_length_info: 0 betyr ingen begrensning @@ -684,7 +686,7 @@ text_assign_time_entries_to_project: Overfør førte timer til prosjektet text_reassign_time_entries: 'Overfør førte timer til denne saken:' text_user_wrote: "%{value} skrev:" - + default_role_manager: Leder default_role_developer: Utvikler default_role_reporter: Rapportør @@ -708,7 +710,7 @@ default_priority_immediate: Omgående default_activity_design: Design default_activity_development: Utvikling - + enumeration_issue_priorities: Sakssprioriteringer enumeration_doc_categories: Dokument-kategorier enumeration_activities: Aktiviteter (tidssporing) @@ -933,3 +935,18 @@ label_cvs_path: CVSROOT label_git_path: Path to .git directory label_mercurial_path: Root directory + label_my_queries: My custom queries + label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee + text_journal_changed_no_detail: "%{label} updated" + button_expand_all: Expand all + button_collapse_all: Collapse all + label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author + field_effective_date: Due date + label_news_comment_added: Comment added to a news + field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text + text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page. + text_default_encoding: "Default: UTF-8" + text_git_repo_example: a bare and local repository (e.g. /gitrepo, c:\gitrepo) + label_notify_member_plural: Email issue updates + label_path_encoding: Path encoding + text_mercurial_repo_example: local repository (e.g. /hgrepo, c:\hgrepo) diff --git a/config/locales/pl.yml b/config/locales/pl.yml index 97bc9801..bd83c30a 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -39,13 +39,16 @@ pl: default: "%Y-%m-%d" short: "%d %b" long: "%d %B %Y" - + day_names: [Niedziela, Poniedziałek, Wtorek, Środa, Czwartek, Piątek, Sobota] abbr_day_names: [nie, pon, wto, śro, czw, pia, sob] - + month_names: [~, Styczeń, Luty, Marzec, Kwiecień, Maj, Czerwiec, Lipiec, Sierpień, Wrzesień, Październik, Listopad, Grudzień] abbr_month_names: [~, sty, lut, mar, kwi, maj, cze, lip, sie, wrz, paź, lis, gru] - order: [ :year, :month, :day ] + order: + - :year + - :month + - :day time: formats: @@ -130,7 +133,7 @@ pl: not_same_project: "nie należy do tego samego projektu" circular_dependency: "Ta relacja może wytworzyć kołową zależność" cant_link_an_issue_with_a_descendant: "Zagadnienie nie może zostać powiązane z jednym z własnych podzagadnień" - + support: array: sentence_connector: "i" @@ -140,7 +143,7 @@ pl: # Best regards from Lublin@Poland :-) # PL translation by Mariusz@Olejnik.net, actionview_instancetag_blank_option: Proszę wybierz - + button_activate: Aktywuj button_add: Dodaj button_annotate: Adnotuj @@ -230,10 +233,9 @@ pl: field_default_value: Domyślny field_delay: Opóźnienie field_description: Opis - field_done_ratio: % Wykonane + field_done_ratio: "% Wykonane" field_downloads: Pobrań field_due_date: Data oddania - field_effective_date: Data field_estimated_hours: Szacowany czas field_field_format: Format field_filename: Plik @@ -296,9 +298,9 @@ pl: field_version: Wersja field_vf_personnel: Personel field_vf_watcher: Obserwator - general_csv_decimal_separator: '.' + general_csv_decimal_separator: ',' general_csv_encoding: UTF-8 - general_csv_separator: ',' + general_csv_separator: ';' general_first_day_of_week: '1' general_lang_name: 'Polski' general_pdf_encoding: UTF-8 @@ -807,7 +809,7 @@ pl: text_user_wrote: "%{value} napisał:" text_wiki_destroy_confirmation: Jesteś pewien, że chcesz usunąć to wiki i całą jego zawartość ? text_workflow_edit: Zaznacz rolę i typ zagadnienia do edycji przepływu - + label_user_activity: "Aktywność: %{value}" label_updated_time_by: "Uaktualnione przez %{author} %{age} temu" text_diff_truncated: '... Ten plik różnic został przycięty ponieważ jest zbyt długi.' @@ -866,7 +868,7 @@ pl: button_show: Pokaż error_can_not_archive_project: Ten projekt nie może zostać zarchiwizowany error_can_not_reopen_issue_on_closed_version: Zagadnienie przydzielone do zakończonej wersji nie może zostać ponownie otwarte - error_issue_done_ratios_not_updated: % wykonania zagadnienia nie został uaktualniony. + error_issue_done_ratios_not_updated: "% wykonania zagadnienia nie został uaktualniony." error_workflow_copy_source: Proszę wybrać źródłowy typ zagadnienia lub rolę error_workflow_copy_target: Proszę wybrać docelowe typ(y) zagadnień i rolę(e) field_sharing: Współdzielenie @@ -897,7 +899,7 @@ pl: setting_default_projects_modules: Domyślnie włączone moduły dla nowo tworzonych projektów setting_gravatar_default: Domyślny obraz Gravatar setting_issue_done_ratio: Obliczaj postęp realizacji zagadnień za pomocą - setting_issue_done_ratio_issue_field: % Wykonania zagadnienia + setting_issue_done_ratio_issue_field: "% Wykonania zagadnienia" setting_issue_done_ratio_issue_status: Statusu zagadnienia setting_mail_handler_body_delimiters: Przycinaj e-maile po jednej z tych linii setting_rest_api_enabled: Uaktywnij usługę sieciową REST @@ -909,7 +911,7 @@ pl: version_status_closed: zamknięta version_status_locked: zablokowana version_status_open: otwarta - + label_board_sticky: Przyklejona label_board_locked: Zamknięta permission_export_wiki_pages: Eksport stron wiki @@ -963,3 +965,18 @@ pl: label_cvs_path: CVSROOT label_git_path: Path to .git directory label_mercurial_path: Root directory + label_my_queries: My custom queries + label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee + text_journal_changed_no_detail: "%{label} updated" + button_expand_all: Expand all + button_collapse_all: Collapse all + label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author + field_effective_date: Due date + label_news_comment_added: Comment added to a news + field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text + text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page. + text_default_encoding: "Default: UTF-8" + text_git_repo_example: a bare and local repository (e.g. /gitrepo, c:\gitrepo) + label_notify_member_plural: Email issue updates + label_path_encoding: Path encoding + text_mercurial_repo_example: local repository (e.g. /hgrepo, c:\hgrepo) diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index 7a879f5b..421b9098 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -12,7 +12,10 @@ pt-BR: abbr_day_names: [Dom, Seg, Ter, Qua, Qui, Sex, Sáb] month_names: [~, Janeiro, Fevereiro, Março, Abril, Maio, Junho, Julho, Agosto, Setembro, Outubro, Novembro, Dezembro] abbr_month_names: [~, Jan, Fev, Mar, Abr, Mai, Jun, Jul, Ago, Set, Out, Nov, Dez] - order: [:day,:month,:year] + order: + - :day + - :month + - :year time: formats: @@ -249,7 +252,6 @@ pt-BR: field_admin: Administrador field_last_login_on: Última conexão field_language: Idioma - field_effective_date: Data field_password: Senha field_new_password: Nova senha field_password_confirmation: Confirmação @@ -265,7 +267,7 @@ pt-BR: field_attr_mail: Atributo para e-mail field_onthefly: Criar usuários dinamicamente ("on-the-fly") field_start_date: Início - field_done_ratio: % Terminado + field_done_ratio: "% Terminado" field_auth_source: Modo de autenticação field_hide_mail: Ocultar meu e-mail field_comments: Comentário @@ -315,7 +317,7 @@ pt-BR: setting_issue_list_default_columns: Colunas padrão visíveis na lista de tarefas setting_repositories_encodings: Codificação dos repositórios setting_commit_logs_encoding: Codificação das mensagens de commit - setting_emails_footer: Rodapé dos e-mails + setting_emails_footer: Rodapé do e-mail setting_protocol: Protocolo setting_per_page_options: Número de itens exibidos por página setting_user_format: Formato de exibição de nome de usuário @@ -354,6 +356,9 @@ pt-BR: label_issues_by: "Tarefas por %{value}" label_issue_added: Tarefa adicionada label_issue_updated: Tarefa atualizada + label_issue_note_added: Nota adicionada + label_issue_status_updated: Situação atualizada + label_issue_priority_updated: Prioridade atualizada label_document: Documento label_document_new: Novo documento label_document_plural: Documentos @@ -557,7 +562,7 @@ pt-BR: label_spent_time: Tempo gasto label_f_hour: "%{value} hora" label_f_hour_plural: "%{value} horas" - label_time_tracking: Controle de horas + label_time_tracking: Registro de horas label_change_plural: Alterações label_statistics: Estatísticas label_commits_per_month: Commits por mês @@ -756,7 +761,7 @@ pt-BR: enumeration_issue_priorities: Prioridade das tarefas enumeration_doc_categories: Categorias de documento - enumeration_activities: Atividades (time tracking) + enumeration_activities: Atividades (registro de horas) notice_unable_delete_version: Não foi possível excluir a versão label_renamed: renomeado label_copied: copiado @@ -958,11 +963,27 @@ pt-BR: setting_commit_logtime_enabled: Habilitar registro de horas notice_gantt_chart_truncated: O gráfico foi cortado por exceder o tamanho máximo de linhas que podem ser exibidas (%{max}) setting_gantt_items_limit: Número máximo de itens exibidos no gráfico gatt - text_powered_by: Powered by %{link} + field_warn_on_leaving_unsaved: Alertar-me ao sarir de uma página sem salvar o texto + text_warn_on_leaving_unsaved: A página atual contem texto que não foi salvo e será perdido se você sair desta página. + label_my_queries: Minhas consultas personalizadas + text_journal_changed_no_detail: "%{label} atualizado(a)" + label_news_comment_added: Notícia recebeu um comentário + button_expand_all: Expandir tudo + button_collapse_all: Recolher tudo + label_additional_workflow_transitions_for_assignee: Transições adicionais permitidas quando o usuário é o responsável pela tarefa + label_additional_workflow_transitions_for_author: Transições adicionais permitidas quando o usuário é o autor + field_effective_date: Data prevista + label_cvs_path: CVSROOT + text_powered_by: Tecnologia empregada por %{link} + text_default_encoding: "Padrão: UTF-8" + text_git_repo_example: "um repositório local do tipo bare (ex.: /gitrepo, c:\\gitrepo)" + label_notify_member_plural: Enviar atualizações da tarefa por e-mail + label_path_encoding: Codificação do caminho + text_mercurial_repo_example: "repositório local (ex.: /hgrepo, c:\\hgrepo)" label_cvs_module: Módulo label_filesystem_path: Diretório raiz label_darcs_path: Diretório raiz label_bazaar_path: Diretório raiz - label_cvs_path: CVSROOT label_git_path: Caminho para o diretório .git label_mercurial_path: Diretório raiz + diff --git a/config/locales/pt.yml b/config/locales/pt.yml index e9742865..d99fbb75 100644 --- a/config/locales/pt.yml +++ b/config/locales/pt.yml @@ -5,7 +5,7 @@ pt: array: sentence_connector: "e" skip_last_comma: true - + direction: ltr date: formats: @@ -17,17 +17,20 @@ pt: abbr_day_names: [Dom, Seg, Ter, Qua, Qui, Sex, Sáb] month_names: [~, Janeiro, Fevereiro, Março, Abril, Maio, Junho, Julho, Agosto, Setembro, Outubro, Novembro, Dezembro] abbr_month_names: [~, Jan, Fev, Mar, Abr, Mai, Jun, Jul, Ago, Set, Out, Nov, Dez] - order: [:day, :month, :year] - + order: + - :day + - :month + - :year + time: - formats: + formats: default: "%A, %d de %B de %Y, %H:%Mh" time: "%H:%M" short: "%d/%m, %H:%M hs" long: "%A, %d de %B de %Y, %H:%Mh" am: '' pm: '' - + datetime: distance_in_words: half_a_minute: "meio minuto" @@ -37,7 +40,7 @@ pt: x_seconds: one: "1 segundo" other: "%{count} segundos" - less_than_x_minutes: + less_than_x_minutes: one: "menos de um minuto" other: "menos de %{count} minutos" x_minutes: @@ -64,7 +67,7 @@ pt: almost_x_years: one: "almost 1 year" other: "almost %{count} years" - + number: format: precision: 3 @@ -132,7 +135,7 @@ pt: ## Translated by: Pedro Araújo actionview_instancetag_blank_option: Seleccione - + general_text_No: 'Não' general_text_Yes: 'Sim' general_text_no: 'não' @@ -143,7 +146,7 @@ pt: general_csv_encoding: ISO-8859-15 general_pdf_encoding: ISO-8859-15 general_first_day_of_week: '1' - + notice_account_updated: A conta foi actualizada com sucesso. notice_account_invalid_creditentials: Utilizador ou palavra-chave inválidos. notice_account_password_updated: A palavra-chave foi alterada com sucesso. @@ -168,13 +171,13 @@ pt: notice_account_pending: "A sua conta foi criada e está agora à espera de aprovação do administrador." notice_default_data_loaded: Configuração padrão carregada com sucesso. notice_unable_delete_version: Não foi possível apagar a versão. - + error_can_t_load_default_data: "Não foi possível carregar a configuração padrão: %{value}" error_scm_not_found: "A entrada ou revisão não foi encontrada no repositório." error_scm_command_failed: "Ocorreu um erro ao tentar aceder ao repositório: %{value}" error_scm_annotate: "A entrada não existe ou não pode ser anotada." error_issue_not_found_in_project: 'A tarefa não foi encontrada ou não pertence a este projecto.' - + mail_subject_lost_password: "Palavra-chave de %{value}" mail_body_lost_password: 'Para mudar a sua palavra-chave, clique na ligação abaixo:' mail_subject_register: "Activação de conta de %{value}" @@ -185,10 +188,10 @@ pt: mail_body_account_activation_request: "Um novo utilizador (%{value}) registou-se. A sua conta está à espera de aprovação:" mail_subject_reminder: "%{count} tarefa(s) para entregar nos próximos %{days} dias" mail_body_reminder: "%{count} tarefa(s) que estão atribuídas a si estão agendadas para estarem completas nos próximos %{days} dias:" - + gui_validation_error: 1 erro gui_validation_error_plural: "%{count} erros" - + field_name: Nome field_description: Descrição field_summary: Sumário @@ -234,7 +237,6 @@ pt: field_admin: Administrador field_last_login_on: Última visita field_language: Língua - field_effective_date: Data field_password: Palavra-chave field_new_password: Nova palavra-chave field_password_confirmation: Confirmação @@ -250,7 +252,7 @@ pt: field_attr_mail: Atributo e-mail field_onthefly: Criação de utilizadores na hora field_start_date: Início - field_done_ratio: % Completo + field_done_ratio: "% Completo" field_auth_source: Modo de autenticação field_hide_mail: Esconder endereço de e-mail field_comments: Comentário @@ -273,7 +275,7 @@ pt: field_default_value: Valor por omissão field_comments_sorting: Mostrar comentários field_parent_title: Página pai - + setting_app_title: Título da aplicação setting_app_subtitle: Sub-título da aplicação setting_welcome_text: Texto de boas vindas @@ -310,7 +312,7 @@ pt: setting_mail_handler_api_enabled: Activar Web Service para e-mails recebidos setting_mail_handler_api_key: Chave da API setting_sequential_project_identifiers: Gerar identificadores de projecto sequênciais - + project_module_issue_tracking: Tarefas project_module_time_tracking: Registo de tempo project_module_news: Notícias @@ -319,7 +321,7 @@ pt: project_module_wiki: Wiki project_module_repository: Repositório project_module_boards: Forum - + label_user: Utilizador label_user_plural: Utilizadores label_user_new: Novo utilizador @@ -631,7 +633,7 @@ pt: label_incoming_emails: E-mails a chegar label_generate_key: Gerar uma chave label_issue_watchers: Observadores - + button_login: Entrar button_submit: Submeter button_save: Guardar @@ -670,11 +672,11 @@ pt: button_update: Actualizar button_configure: Configurar button_quote: Citar - + status_active: activo status_registered: registado status_locked: bloqueado - + text_select_mail_notifications: Seleccionar as acções que originam uma notificação por e-mail. text_regexp_info: ex. ^[A-Z0-9]+$ text_min_max_length_info: 0 siginifica sem restrição @@ -716,7 +718,7 @@ pt: text_enumeration_destroy_question: "%{count} objectos estão atribuídos a este valor." text_enumeration_category_reassign_to: 'Re-atribuí-los para este valor:' text_email_delivery_not_configured: "Entrega por e-mail não está configurada, e as notificação estão desactivadas.\nConfigure o seu servidor de SMTP em config/configuration.yml e reinicie a aplicação para activar estas funcionalidades." - + default_role_manager: Gestor default_role_developer: Programador default_role_reporter: Repórter @@ -740,7 +742,7 @@ pt: default_priority_immediate: Imediata default_activity_design: Planeamento default_activity_development: Desenvolvimento - + enumeration_issue_priorities: Prioridade de tarefas enumeration_doc_categories: Categorias de documentos enumeration_activities: Actividades (Registo de tempo) @@ -867,7 +869,7 @@ pt: button_duplicate: Duplicar button_copy_and_follow: Copiar e seguir label_copy_source: Origem - setting_issue_done_ratio: Calcular a percentagem de progresso da tarefa + setting_issue_done_ratio: Calcular a percentagem de progresso da tarefa setting_issue_done_ratio_issue_status: Através do estado da tarefa error_issue_done_ratios_not_updated: Percentagens de progresso da tarefa não foram actualizadas. error_workflow_copy_target: Seleccione os tipos de tarefas e funções desejadas @@ -950,3 +952,18 @@ pt: label_cvs_path: CVSROOT label_git_path: Path to .git directory label_mercurial_path: Root directory + label_my_queries: My custom queries + label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee + text_journal_changed_no_detail: "%{label} updated" + button_expand_all: Expand all + button_collapse_all: Collapse all + label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author + field_effective_date: Due date + label_news_comment_added: Comment added to a news + field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text + text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page. + text_default_encoding: "Default: UTF-8" + text_git_repo_example: a bare and local repository (e.g. /gitrepo, c:\gitrepo) + label_notify_member_plural: Email issue updates + label_path_encoding: Path encoding + text_mercurial_repo_example: local repository (e.g. /hgrepo, c:\hgrepo) diff --git a/config/locales/ro.yml b/config/locales/ro.yml index 115ba952..360be912 100644 --- a/config/locales/ro.yml +++ b/config/locales/ro.yml @@ -6,15 +6,18 @@ ro: short: "%d %b" long: "%d %B %Y" only_day: "%e" - + day_names: [Duminică, Luni, Marti, Miercuri, Joi, Vineri, Sâmbătă] abbr_day_names: [Dum, Lun, Mar, Mie, Joi, Vin, Sâm] - + # Don't forget the nil at the beginning; there's no such thing as a 0th month month_names: [~, Ianuarie, Februarie, Martie, Aprilie, Mai, Iunie, Iulie, August, Septembrie, Octombrie, Noiembrie, Decembrie] abbr_month_names: [~, Ian, Feb, Mar, Apr, Mai, Iun, Iul, Aug, Sep, Oct, Noi, Dec] # Used in date_select and datime_select. - order: [ :day, :month, :year ] + order: + - :day + - :month + - :year time: formats: @@ -24,7 +27,7 @@ ro: long: "%B %d, %Y %H:%M" am: "am" pm: "pm" - + datetime: distance_in_words: half_a_minute: "jumătate de minut" @@ -62,28 +65,28 @@ ro: one: "almost 1 year" other: "almost %{count} years" - number: - human: - format: + number: + human: + format: precision: 1 delimiter: "" - storage_units: + storage_units: format: "%n %u" - units: + units: kb: KB tb: TB gb: GB - byte: + byte: one: Byte other: Bytes mb: MB - + # Used in array.to_sentence. support: array: sentence_connector: "și" skip_last_comma: true - + activerecord: errors: template: @@ -117,7 +120,7 @@ ro: cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks" actionview_instancetag_blank_option: Selectați - + general_text_No: 'Nu' general_text_Yes: 'Da' general_text_no: 'nu' @@ -128,7 +131,7 @@ ro: general_csv_encoding: UTF-8 general_pdf_encoding: UTF-8 general_first_day_of_week: '2' - + notice_account_updated: Cont actualizat. notice_account_invalid_creditentials: Utilizator sau parola nevalidă notice_account_password_updated: Parolă actualizată. @@ -153,15 +156,15 @@ ro: notice_account_pending: "Contul dumneavoastră a fost creat și așteaptă aprobarea administratorului." notice_default_data_loaded: S-a încărcat configurația implicită. notice_unable_delete_version: Nu se poate șterge versiunea. - + error_can_t_load_default_data: "Nu s-a putut încărca configurația implicită: %{value}" error_scm_not_found: "Nu s-a găsit articolul sau revizia în depozit." error_scm_command_failed: "A intervenit o eroare la accesarea depozitului: %{value}" error_scm_annotate: "Nu există sau nu poate fi adnotată." error_issue_not_found_in_project: 'Tichetul nu a fost găsit sau nu aparține acestui proiect' - + warning_attachments_not_saved: "Nu s-au putut salva %{count} fișiere." - + mail_subject_lost_password: "Parola dumneavoastră: %{value}" mail_body_lost_password: 'Pentru a schimba parola, accesați:' mail_subject_register: "Activarea contului %{value}" @@ -172,10 +175,10 @@ ro: mail_body_account_activation_request: "S-a înregistrat un utilizator nou (%{value}). Contul așteaptă aprobarea dumneavoastră:" mail_subject_reminder: "%{count} tichete trebuie rezolvate în următoarele %{days} zile" mail_body_reminder: "%{count} tichete atribuite dumneavoastră trebuie rezolvate în următoarele %{days} zile:" - + gui_validation_error: o eroare gui_validation_error_plural: "%{count} erori" - + field_name: Nume field_description: Descriere field_summary: Rezumat @@ -221,7 +224,6 @@ ro: field_admin: Administrator field_last_login_on: Ultima autentificare în field_language: Limba - field_effective_date: Data field_password: Parola field_new_password: Parola nouă field_password_confirmation: Confirmare @@ -264,7 +266,7 @@ ro: field_watcher: Urmărește field_identity_url: URL OpenID field_content: Conținut - + setting_app_title: Titlu aplicație setting_app_subtitle: Subtitlu aplicație setting_welcome_text: Text de întâmpinare @@ -307,7 +309,7 @@ ro: setting_file_max_size_displayed: Număr maxim de fișiere text afișate în pagină (inline) setting_repository_log_display_limit: Număr maxim de revizii afișate în istoricul fișierului setting_openid: Permite înregistrare și autentificare cu OpenID - + permission_edit_project: Editează proiectul permission_select_project_modules: Alege module pentru proiect permission_manage_members: Editează membri @@ -356,7 +358,7 @@ ro: permission_edit_own_messages: Editează mesajele proprii permission_delete_messages: Șterge mesaje permission_delete_own_messages: Șterge mesajele proprii - + project_module_issue_tracking: Tichete project_module_time_tracking: Timp de lucru project_module_news: Știri @@ -365,7 +367,7 @@ ro: project_module_wiki: Wiki project_module_repository: Depozit project_module_boards: Forum - + label_user: Utilizator label_user_plural: Utilizatori label_user_new: Utilizator nou @@ -682,13 +684,13 @@ ro: label_issue_watchers: Cine urmărește label_example: Exemplu label_display: Afișează - + label_sort: Sortează label_ascending: Crescător label_descending: Descrescător label_date_from_to: De la %{start} la %{end} - + button_login: Autentificare button_submit: Trimite button_save: Salvează @@ -728,11 +730,11 @@ ro: button_update: Actualizează button_configure: Configurează button_quote: Citează - + status_active: activ status_registered: înregistrat status_locked: blocat - + text_select_mail_notifications: Selectați acțiunile notificate prin email. text_regexp_info: ex. ^[A-Z0-9]+$ text_min_max_length_info: 0 înseamnă fără restricții @@ -775,10 +777,10 @@ ro: text_enumeration_destroy_question: "Această valoare are %{count} obiecte." text_enumeration_category_reassign_to: 'Atribuie la această valoare:' text_email_delivery_not_configured: "Trimiterea de emailuri nu este configurată și ca urmare, notificările sunt dezactivate.\nConfigurați serverul SMTP în config/configuration.yml și reporniți aplicația pentru a le activa." - text_repository_usernames_mapping: "Selectați sau modificați contul Redmine echivalent contului din istoricul depozitului.\nUtilizatorii cu un cont (sau e-mail) identic în Redmine și depozit sunt echivalate automat." + text_repository_usernames_mapping: "Selectați sau modificați contul Redmine echivalent contului din istoricul depozitului.\nUtilizatorii cu un cont (sau e-mail) identic în Redmine și depozit sunt echivalate automat." text_diff_truncated: '... Comparația a fost trunchiată pentru ca depășește lungimea maximă de text care poate fi afișat.' text_custom_field_possible_values_info: 'O linie pentru fiecare valoare' - + default_role_manager: Manager default_role_developer: Dezvoltator default_role_reporter: Creator de rapoarte @@ -802,7 +804,7 @@ ro: default_priority_immediate: imediată default_activity_design: Design default_activity_development: Dezvoltare - + enumeration_issue_priorities: Priorități tichete enumeration_doc_categories: Categorii documente enumeration_activities: Activități (timp de lucru) @@ -939,3 +941,18 @@ ro: label_cvs_path: CVSROOT label_git_path: Path to .git directory label_mercurial_path: Root directory + label_my_queries: My custom queries + label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee + text_journal_changed_no_detail: "%{label} updated" + button_expand_all: Expand all + button_collapse_all: Collapse all + label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author + field_effective_date: Due date + label_news_comment_added: Comment added to a news + field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text + text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page. + text_default_encoding: "Default: UTF-8" + text_git_repo_example: a bare and local repository (e.g. /gitrepo, c:\gitrepo) + label_notify_member_plural: Email issue updates + label_path_encoding: Path encoding + text_mercurial_repo_example: local repository (e.g. /hgrepo, c:\hgrepo) diff --git a/config/locales/ru.yml b/config/locales/ru.yml index e2f5d2ba..94deeee3 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -28,7 +28,10 @@ ru: abbr_month_names: [~, янв., февр., марта, апр., мая, июня, июля, авг., сент., окт., нояб., дек.] standalone_abbr_month_names: [~, янв., февр., март, апр., май, июнь, июль, авг., сент., окт., нояб., дек.] - order: [ :day, :month, :year ] + order: + - :day + - :month + - :year time: formats: @@ -57,7 +60,7 @@ ru: percentage: format: delimiter: "" - + precision: format: delimiter: "" @@ -204,7 +207,7 @@ ru: # Rails 2.2 sentence_connector: "и" skip_last_comma: true - + # Rails 2.3 words_connector: ", " two_words_connector: " и " @@ -280,7 +283,7 @@ ru: enumeration_activities: Действия (учет времени) enumeration_doc_categories: Категории документов enumeration_issue_priorities: Приоритеты задач - + error_can_not_remove_role: Эта роль используется и не может быть удалена. error_can_not_delete_custom_field: Невозможно удалить настраиваемое поле error_can_not_delete_tracker: Этот трекер содержит задачи и не может быть удален. @@ -317,7 +320,6 @@ ru: field_downloads: Загрузки field_due_date: Дата выполнения field_editable: Редактируемый - field_effective_date: Дата field_estimated_hours: Оцененное время field_field_format: Формат field_filename: Файл @@ -903,7 +905,7 @@ ru: status_active: активен status_locked: заблокирован status_registered: зарегистрирован - + text_are_you_sure_with_children: Удалить задачу и все ее подзадачи? text_are_you_sure: Подтвердите text_assign_time_entries_to_project: Прикрепить зарегистрированное время к проекту @@ -1059,3 +1061,18 @@ ru: label_cvs_path: CVSROOT label_git_path: Путь к каталогу .git label_mercurial_path: Каталог + label_my_queries: My custom queries + label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee + text_journal_changed_no_detail: "%{label} updated" + button_expand_all: Expand all + button_collapse_all: Collapse all + label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author + field_effective_date: Due date + label_news_comment_added: Comment added to a news + field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text + text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page. + text_default_encoding: "Default: UTF-8" + text_git_repo_example: a bare and local repository (e.g. /gitrepo, c:\gitrepo) + label_notify_member_plural: Email issue updates + label_path_encoding: Path encoding + text_mercurial_repo_example: local repository (e.g. /hgrepo, c:\hgrepo) diff --git a/config/locales/sk.yml b/config/locales/sk.yml index f752a07a..a1323505 100644 --- a/config/locales/sk.yml +++ b/config/locales/sk.yml @@ -8,15 +8,18 @@ sk: default: "%Y-%m-%d" short: "%b %d" long: "%B %d, %Y" - + day_names: [Nedeľa, Pondelok, Utorok, Streda, Štvrtok, Piatok, Sobota] abbr_day_names: [Ne, Po, Ut, St, Št, Pi, So] - + # Don't forget the nil at the beginning; there's no such thing as a 0th month month_names: [~, Január, Február, Marec, Apríl, Máj, Jún, Júl, August, September, Október, November, December] abbr_month_names: [~, Jan, Feb, Mar, Apr, Máj, Jún, Júl, Aug, Sep, Okt, Nov, Dec] # Used in date_select and datime_select. - order: [ :year, :month, :day ] + order: + - :year + - :month + - :day time: formats: @@ -26,7 +29,7 @@ sk: long: "%B %d, %Y %H:%M" am: "am" pm: "pm" - + datetime: distance_in_words: half_a_minute: "pol minúty" @@ -64,28 +67,28 @@ sk: one: "almost 1 year" other: "almost %{count} years" - number: - human: - format: + number: + human: + format: precision: 1 delimiter: "" - storage_units: + storage_units: format: "%n %u" - units: + units: kb: KB tb: TB gb: GB - byte: + byte: one: Byte other: Bytes mb: MB - + # Used in array.to_sentence. support: array: sentence_connector: "a" skip_last_comma: false - + activerecord: errors: template: @@ -119,9 +122,9 @@ sk: cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks" # SK translation by Stanislav Pach | stano.pach@seznam.cz - + actionview_instancetag_blank_option: Prosím vyberte - + general_text_No: 'Nie' general_text_Yes: 'Áno' general_text_no: 'nie' @@ -132,7 +135,7 @@ sk: general_csv_encoding: UTF-8 general_pdf_encoding: UTF-8 general_first_day_of_week: '1' - + notice_account_updated: Účet bol úspešne zmenený. notice_account_invalid_creditentials: Chybné meno alebo heslo notice_account_password_updated: Heslo bolo úspešne zmenené. @@ -157,12 +160,12 @@ sk: notice_no_issue_selected: "Nebola zvolená žiadná úloha. Prosím, zvoľte úlohy, ktoré chcete upraviť" notice_account_pending: "Váš účet bol vytvorený, teraz čaká na schválenie administrátorom." notice_default_data_loaded: Výchozia konfigurácia úspešne nahraná. - + error_can_t_load_default_data: "Výchozia konfigurácia nebola nahraná: %{value}" error_scm_not_found: "Položka a/alebo revízia neexistuje v repozitári." error_scm_command_failed: "Pri pokuse o prístup k repozitári došlo k chybe: %{value}" error_issue_not_found_in_project: 'Úloha nebola nájdená alebo nepatrí k tomuto projektu' - + mail_subject_lost_password: "Vaše heslo (%{value})" mail_body_lost_password: 'Pre zmenu vašeho hesla kliknite na následujúci odkaz:' mail_subject_register: "Aktivácia účtu (%{value})" @@ -171,10 +174,10 @@ sk: mail_body_account_information: Informácie o vašom účte mail_subject_account_activation_request: "Aktivácia %{value} účtu" mail_body_account_activation_request: "Bol zaregistrovaný nový uživateľ %{value}. Aktivácia jeho účtu závisí na vašom potvrdení." - + gui_validation_error: 1 chyba gui_validation_error_plural: "%{count} chyb(y)" - + field_name: Názov field_description: Popis field_summary: Prehľad @@ -220,7 +223,6 @@ sk: field_admin: Administrátor field_last_login_on: Posledné prihlásenie field_language: Jazyk - field_effective_date: Dátum field_password: Heslo field_new_password: Nové heslo field_password_confirmation: Potvrdenie @@ -236,7 +238,7 @@ sk: field_attr_mail: Email (atribut) field_onthefly: Automatické vytváranie užívateľov field_start_date: Začiatok - field_done_ratio: % hotovo + field_done_ratio: "% hotovo" field_auth_source: Autentifikačný mód field_hide_mail: Nezobrazovať môj email field_comments: Komentár @@ -258,7 +260,7 @@ sk: field_searchable: Umožniť vyhľadávanie field_default_value: Východzia hodnota field_comments_sorting: Zobraziť komentáre - + setting_app_title: Názov aplikácie setting_app_subtitle: Podtitulok aplikácie setting_welcome_text: Uvítací text @@ -271,7 +273,7 @@ sk: setting_bcc_recipients: Príjemcovia skrytej kópie (bcc) setting_host_name: Hostname setting_text_formatting: Formátovanie textu - setting_wiki_compression: Kompresia histórie Wiki + setting_wiki_compression: Kompresia histórie Wiki setting_feeds_limit: Limit zobrazených položiek (Atom feed) setting_default_projects_public: Nové projekty nastavovať ako verejné setting_autofetch_changesets: Automatický prenos zmien @@ -283,23 +285,23 @@ sk: setting_time_format: Formát času setting_cross_project_issue_relations: Povoliť väzby úloh skrz projekty setting_issue_list_default_columns: Východzie stĺpce zobrazené v zozname úloh - setting_ itories_encodings: Kódovanie + setting_ itories_encodings: Kódovanie setting_emails_footer: Zapätie emailov setting_protocol: Protokol setting_per_page_options: Povolené množstvo riadkov na stránke setting_user_format: Formát zobrazenia užívateľa - setting_activity_days_default: "Zobrazené dni aktivity projektu:" + setting_activity_days_default: "Zobrazené dni aktivity projektu:" setting_display_subprojects_issues: Prednastavenie zobrazenia úloh podporojektov v hlavnom projekte - + project_module_issue_tracking: Sledovanie úloh project_module_time_tracking: Sledovanie času project_module_news: Novinky project_module_documents: Dokumenty project_module_files: Súbory - project_module_wiki: Wiki + project_module_wiki: Wiki project_module_repository: Repozitár project_module_boards: Diskusie - + label_user: Užívateľ label_user_plural: Užívatelia label_user_new: Nový užívateľ @@ -506,7 +508,7 @@ sk: label_search: Hľadať label_result_plural: Výsledky label_all_words: Všetky slova - label_wiki: Wiki + label_wiki: Wiki label_wiki_edit: Wiki úprava label_wiki_edit_plural: Wiki úpravy label_wiki_page: Wiki stránka @@ -603,7 +605,7 @@ sk: label_preferences: Nastavenia label_chronological_order: V chronologickom poradí label_reverse_chronological_order: V obrátenom chronologickom poradí - + button_login: Prihlásiť button_submit: Potvrdiť button_save: Uložiť @@ -641,11 +643,11 @@ sk: button_annotate: Komentovať button_update: Aktualizovať button_configure: Konfigurovať - + status_active: aktívny status_registered: registrovaný status_locked: uzamknutý - + text_select_mail_notifications: Vyberte akciu, pri ktorej bude zaslané upozornenie emailom text_regexp_info: napr. ^[A-Z0-9]+$ text_min_max_length_info: 0 znamená bez limitu @@ -682,7 +684,7 @@ sk: text_destroy_time_entries: Odstrániť evidované hodiny. text_assign_time_entries_to_project: Priradiť evidované hodiny projektu text_reassign_time_entries: 'Preradiť evidované hodiny k tejto úlohe:' - + default_role_manager: Manažér default_role_developer: Vývojár default_role_reporter: Reportér @@ -706,7 +708,7 @@ sk: default_priority_immediate: Okamžitá default_activity_design: Design default_activity_development: Vývoj - + enumeration_issue_priorities: Priority úloh enumeration_doc_categories: Kategorie dokumentov enumeration_activities: Aktivity (sledovanie času) @@ -744,7 +746,7 @@ sk: permission_view_changesets: Zobrazenie sád zmien permission_view_time_entries: Zobrazenie stráveného času permission_manage_versions: Správa verzií - permission_manage_wiki: Správa Wiki + permission_manage_wiki: Správa Wiki permission_manage_categories: Správa kategórií úloh permission_protect_wiki_pages: Ochrana Wiki strániek permission_comment_news: Komentovanie noviniek @@ -886,7 +888,7 @@ sk: label_subproject_new: Nový podprojekt text_own_membership_delete_confirmation: |- Práve sa pokúšate o odstránenie niektorých alebo všetkých prístupových práv a možno nebudete mať možnost naďalej upravovať tento projekt. - Ste si istý(á), že chcete pokračovat? + Ste si istý(á), že chcete pokračovat? label_close_versions: Uzavrieť ukončené verzie label_board_sticky: Sticky label_board_locked: Uzamknuté @@ -941,3 +943,18 @@ sk: label_cvs_path: CVSROOT label_git_path: Path to .git directory label_mercurial_path: Root directory + label_my_queries: My custom queries + label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee + text_journal_changed_no_detail: "%{label} updated" + button_expand_all: Expand all + button_collapse_all: Collapse all + label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author + field_effective_date: Due date + label_news_comment_added: Comment added to a news + field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text + text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page. + text_default_encoding: "Default: UTF-8" + text_git_repo_example: a bare and local repository (e.g. /gitrepo, c:\gitrepo) + label_notify_member_plural: Email issue updates + label_path_encoding: Path encoding + text_mercurial_repo_example: local repository (e.g. /hgrepo, c:\hgrepo) diff --git a/config/locales/sl.yml b/config/locales/sl.yml index b4b4bc34..c6461fc8 100644 --- a/config/locales/sl.yml +++ b/config/locales/sl.yml @@ -8,15 +8,18 @@ sl: default: "%Y-%m-%d" short: "%b %d" long: "%B %d, %Y" - + day_names: [Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday] abbr_day_names: [Sun, Mon, Tue, Wed, Thu, Fri, Sat] - + # Don't forget the nil at the beginning; there's no such thing as a 0th month month_names: [~, January, February, March, April, May, June, July, August, September, October, November, December] abbr_month_names: [~, Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec] # Used in date_select and datime_select. - order: [ :year, :month, :day ] + order: + - :year + - :month + - :day time: formats: @@ -26,7 +29,7 @@ sl: long: "%B %d, %Y %H:%M" am: "am" pm: "pm" - + datetime: distance_in_words: half_a_minute: "half a minute" @@ -69,27 +72,27 @@ sl: separator: "," delimiter: "." precision: 3 - human: - format: + human: + format: precision: 1 delimiter: "" - storage_units: + storage_units: format: "%n %u" - units: + units: kb: KB tb: TB gb: GB - byte: + byte: one: Byte other: Bytes mb: MB - + # Used in array.to_sentence. support: array: sentence_connector: "and" skip_last_comma: false - + activerecord: errors: template: @@ -123,7 +126,7 @@ sl: cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks" actionview_instancetag_blank_option: Prosimo izberite - + general_text_No: 'Ne' general_text_Yes: 'Da' general_text_no: 'ne' @@ -132,9 +135,9 @@ sl: general_csv_separator: ',' general_csv_decimal_separator: '.' general_csv_encoding: UTF-8 - general_pdf_encoding: UFT-8 + general_pdf_encoding: UTF-8 general_first_day_of_week: '1' - + notice_account_updated: Račun je bil uspešno posodobljen. notice_account_invalid_creditentials: Napačno uporabniško ime ali geslo notice_account_password_updated: Geslo je bilo uspešno posodobljeno. @@ -159,13 +162,13 @@ sl: notice_account_pending: "Vaš račun je bil ustvarjen in čaka na potrditev s strani administratorja." notice_default_data_loaded: Privzete nastavitve so bile uspešno naložene. notice_unable_delete_version: Verzije ni bilo mogoče izbrisati. - + error_can_t_load_default_data: "Privzetih nastavitev ni bilo mogoče naložiti: %{value}" error_scm_not_found: "Vnos ali revizija v shrambi ni bila najdena ." error_scm_command_failed: "Med vzpostavljem povezave s shrambo je prišlo do napake: %{value}" error_scm_annotate: "Vnos ne obstaja ali pa ga ni mogoče komentirati." error_issue_not_found_in_project: 'Zahtevek ni bil najden ali pa ne pripada temu projektu' - + mail_subject_lost_password: "Vaše %{value} geslo" mail_body_lost_password: 'Za spremembo glesla kliknite na naslednjo povezavo:' mail_subject_register: "Aktivacija %{value} vašega računa" @@ -176,10 +179,10 @@ sl: mail_body_account_activation_request: "Registriral se je nov uporabnik (%{value}). Račun čaka na vašo odobritev:" mail_subject_reminder: "%{count} zahtevek(zahtevki) zapadejo v naslednjih %{days} dneh" mail_body_reminder: "%{count} zahtevek(zahtevki), ki so vam dodeljeni bodo zapadli v naslednjih %{days} dneh:" - + gui_validation_error: 1 napaka gui_validation_error_plural: "%{count} napak" - + field_name: Ime field_description: Opis field_summary: Povzetek @@ -225,7 +228,6 @@ sl: field_admin: Administrator field_last_login_on: Zadnjič povezan(a) field_language: Jezik - field_effective_date: Datum field_password: Geslo field_new_password: Novo geslo field_password_confirmation: Potrditev @@ -241,7 +243,7 @@ sl: field_attr_mail: Oznaka za e-naslov field_onthefly: Sprotna izdelava uporabnikov field_start_date: Začetek - field_done_ratio: % Narejeno + field_done_ratio: "% Narejeno" field_auth_source: Način overovljanja field_hide_mail: Skrij moj e-naslov field_comments: Komentar @@ -264,7 +266,7 @@ sl: field_default_value: Privzeta vrednost field_comments_sorting: Prikaži komentarje field_parent_title: Matična stran - + setting_app_title: Naslov aplikacije setting_app_subtitle: Podnaslov aplikacije setting_welcome_text: Pozdravno besedilo @@ -304,7 +306,7 @@ sl: setting_sequential_project_identifiers: Generiraj projektne identifikatorje sekvenčno setting_gravatar_enabled: Uporabljaj Gravatar ikone setting_diff_max_lines_displayed: Maksimalno število prikazanih vrstic različnosti - + permission_edit_project: Uredi projekt permission_select_project_modules: Izberi module projekta permission_manage_members: Uredi člane @@ -353,7 +355,7 @@ sl: permission_edit_own_messages: Uredi lastna sporočila permission_delete_messages: Izbriši sporočila permission_delete_own_messages: Izbriši lastna sporočila - + project_module_issue_tracking: Sledenje zahtevkom project_module_time_tracking: Sledenje časa project_module_news: Novice @@ -362,7 +364,7 @@ sl: project_module_wiki: Wiki project_module_repository: Shramba project_module_boards: Table - + label_user: Uporabnik label_user_plural: Uporabniki label_user_new: Nov uporabnik @@ -677,7 +679,7 @@ sl: label_generate_key: Ustvari ključ label_issue_watchers: Spremljevalci label_example: Vzorec - + button_login: Prijavi se button_submit: Pošlji button_save: Shrani @@ -716,11 +718,11 @@ sl: button_update: Posodobi button_configure: Konfiguriraj button_quote: Citiraj - + status_active: aktivni status_registered: registriran status_locked: zaklenjen - + text_select_mail_notifications: Izberi dejanja za katera naj bodo poslana oznanila preko e-pošto. text_regexp_info: npr. ^[A-Z0-9]+$ text_min_max_length_info: 0 pomeni brez omejitev @@ -764,7 +766,7 @@ sl: text_email_delivery_not_configured: "E-poštna dostava ni nastavljena in oznanila so onemogočena.\nNastavite vaš SMTP strežnik v config/configuration.yml in ponovno zaženite aplikacijo da ga omogočite.\n" text_repository_usernames_mapping: "Izberite ali posodobite Redmine uporabnika dodeljenega vsakemu uporabniškemu imenu najdenemu v zapisniku shrambe.\n Uporabniki z enakim Redmine ali shrambinem uporabniškem imenu ali e-poštnem naslovu so samodejno dodeljeni." text_diff_truncated: '... Ta sprememba je bila odsekana ker presega največjo velikost ki je lahko prikazana.' - + default_role_manager: Upravnik default_role_developer: Razvijalec default_role_reporter: Poročevalec @@ -788,7 +790,7 @@ sl: default_priority_immediate: Takojšnje ukrepanje default_activity_design: Oblikovanje default_activity_development: Razvoj - + enumeration_issue_priorities: Prioritete zahtevkov enumeration_doc_categories: Kategorije dokumentov enumeration_activities: Aktivnosti (sledenje časa) @@ -942,3 +944,18 @@ sl: label_cvs_path: CVSROOT label_git_path: Path to .git directory label_mercurial_path: Root directory + label_my_queries: My custom queries + label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee + text_journal_changed_no_detail: "%{label} updated" + button_expand_all: Expand all + button_collapse_all: Collapse all + label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author + field_effective_date: Due date + label_news_comment_added: Comment added to a news + field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text + text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page. + text_default_encoding: "Default: UTF-8" + text_git_repo_example: a bare and local repository (e.g. /gitrepo, c:\gitrepo) + label_notify_member_plural: Email issue updates + label_path_encoding: Path encoding + text_mercurial_repo_example: local repository (e.g. /hgrepo, c:\hgrepo) diff --git a/config/locales/sr-YU.yml b/config/locales/sr-YU.yml index 512070ca..8f83a5d0 100644 --- a/config/locales/sr-YU.yml +++ b/config/locales/sr-YU.yml @@ -1,944 +1,946 @@ -# Serbian translations for Redmine -# by Vladimir Medarović (vlada@medarovic.com) -sr-YU: - direction: ltr - date: - formats: - # Use the strftime parameters for formats. - # When no format has been given, it uses default. - # You can provide other formats here if you like! - default: "%d.%m.%Y." - short: "%e %b" - long: "%B %e, %Y" - - day_names: [nedelja, ponedeljak, utorak, sreda, četvrtak, petak, subota] - abbr_day_names: [ned, pon, uto, sre, čet, pet, sub] - - # Don't forget the nil at the beginning; there's no such thing as a 0th month - month_names: [~, januar, februar, mart, april, maj, jun, jul, avgust, septembar, oktobar, novembar, decembar] - abbr_month_names: [~, jan, feb, mar, apr, maj, jun, jul, avg, sep, okt, nov, dec] - # Used in date_select and datime_select. - order: [ :day, :month, :year ] - - time: - formats: - default: "%d.%m.%Y. u %H:%M" - time: "%H:%M" - short: "%d. %b u %H:%M" - long: "%d. %B %Y u %H:%M" - am: "am" - pm: "pm" - - datetime: - distance_in_words: - half_a_minute: "pola minuta" - less_than_x_seconds: - one: "manje od jedne sekunde" - other: "manje od %{count} sek." - x_seconds: - one: "jedna sekunda" - other: "%{count} sek." - less_than_x_minutes: - one: "manje od minuta" - other: "manje od %{count} min." - x_minutes: - one: "jedan minut" - other: "%{count} min." - about_x_hours: - one: "približno jedan sat" - other: "približno %{count} sati" - x_days: - one: "jedan dan" - other: "%{count} dana" - about_x_months: - one: "približno jedan mesec" - other: "približno %{count} meseci" - x_months: - one: "jedan mesec" - other: "%{count} meseci" - about_x_years: - one: "približno godinu dana" - other: "približno %{count} god." - over_x_years: - one: "preko godinu dana" - other: "preko %{count} god." - almost_x_years: - one: "skoro godinu dana" - other: "skoro %{count} god." - - number: - format: - separator: "," - delimiter: "" - precision: 3 - human: - format: - delimiter: "" - precision: 1 - storage_units: - format: "%n %u" - units: - byte: - one: "Byte" - other: "Bytes" - kb: "KB" - mb: "MB" - gb: "GB" - tb: "TB" - - -# Used in array.to_sentence. - support: - array: - sentence_connector: "i" - skip_last_comma: false - - activerecord: - errors: - template: - header: - one: "1 error prohibited this %{model} from being saved" - other: "%{count} errors prohibited this %{model} from being saved" - messages: - inclusion: "nije uključen u spisak" - exclusion: "je rezervisan" - invalid: "je neispravan" - confirmation: "potvrda ne odgovara" - accepted: "mora biti prihvaćen" - empty: "ne može biti prazno" - blank: "ne može biti prazno" - too_long: "je predugačka (maksimum znakova je %{count})" - too_short: "je prekratka (minimum znakova je %{count})" - wrong_length: "je pogrešne dužine (broj znakova mora biti %{count})" - taken: "je već u upotrebi" - not_a_number: "nije broj" - not_a_date: "nije ispravan datum" - greater_than: "mora biti veći od %{count}" - greater_than_or_equal_to: "mora biti veći ili jednak %{count}" - equal_to: "mora biti jednak %{count}" - less_than: "mora biti manji od %{count}" - less_than_or_equal_to: "mora biti manji ili jednak %{count}" - odd: "mora biti paran" - even: "mora biti neparan" - greater_than_start_date: "mora biti veći od početnog datuma" - not_same_project: "ne pripada istom projektu" - circular_dependency: "Ova veza će stvoriti kružnu referencu" - cant_link_an_issue_with_a_descendant: "Problem ne može biti povezan sa jednim od svojih podzadataka" - - actionview_instancetag_blank_option: Molim odaberite - - general_text_No: 'Ne' - general_text_Yes: 'Da' - general_text_no: 'ne' - general_text_yes: 'da' - general_lang_name: 'Srpski' - general_csv_separator: ',' - general_csv_decimal_separator: '.' - general_csv_encoding: UTF-8 - general_pdf_encoding: UTF-8 - general_first_day_of_week: '1' - - notice_account_updated: Nalog je uspešno ažuriran. - notice_account_invalid_creditentials: Neispravno korisničko ime ili lozinka. - notice_account_password_updated: Lozinka je uspešno ažurirana. - notice_account_wrong_password: Pogrešna lozinka - notice_account_register_done: Korisnički nalog je uspešno kreiran. Kliknite na link koji ste dobili u e-poruci za aktivaciju. - notice_account_unknown_email: Nepoznat korisnik. - notice_can_t_change_password: Ovaj korisnički nalog za potvrdu identiteta koristi spoljni izvor. Nemoguće je promeniti lozinku. - notice_account_lost_email_sent: Poslata vam je e-poruka sa uputstvom za izbor nove lozinke - notice_account_activated: Vaš korisnički nalog je aktiviran. Sada se možete prijaviti. - notice_successful_create: Uspešno kreiranje. - notice_successful_update: Uspešno ažuriranje. - notice_successful_delete: Uspešno brisanje. - notice_successful_connection: Uspešno povezivanje. - notice_file_not_found: Strana kojoj želite pristupiti ne postoji ili je uklonjena. - notice_locking_conflict: Podatak je ažuriran od strane drugog korisnika. - notice_not_authorized: Niste ovlašćeni za pristup ovoj strani. - notice_email_sent: "E-poruka je poslata na %{value}" - notice_email_error: "Dogodila se greška prilikom slanja e-poruke (%{value})" - notice_feeds_access_key_reseted: Vaš RSS pristupni ključ je poništen. - notice_api_access_key_reseted: Vaš API pristupni ključ je poništen. - notice_failed_to_save_issues: "Neuspešno snimanje %{count} problema od %{total} odabranih: %{ids}." - notice_failed_to_save_members: "Neuspešno snimanje člana(ova): %{errors}." - notice_no_issue_selected: "Ni jedan problem nije odabran! Molimo, odaberite problem koji želite da menjate." - notice_account_pending: "Vaš nalog je kreiran i čeka na odobrenje administratora." - notice_default_data_loaded: Podrazumevano konfigurisanje je uspešno učitano. - notice_unable_delete_version: Verziju je nemoguće izbrisati. - notice_unable_delete_time_entry: Stavku evidencije vremena je nemoguće izbrisati. - notice_issue_done_ratios_updated: Odnos rešenih problema je ažuriran. - - error_can_t_load_default_data: "Podrazumevano konfigurisanje je nemoguće učitati: %{value}" - error_scm_not_found: "Stavka ili ispravka nisu pronađene u spremištu." - error_scm_command_failed: "Greška se javila prilikom pokušaja pristupa spremištu: %{value}" - error_scm_annotate: "Stavka ne postoji ili ne može biti označena." - error_issue_not_found_in_project: 'Problem nije pronađen ili ne pripada ovom projektu.' - error_no_tracker_in_project: 'Ni jedno praćenje nije povezano sa ovim projektom. Molimo proverite podešavanja projekta.' - error_no_default_issue_status: 'Podrazumevani status problema nije definisan. Molimo proverite vaše konfigurisanje (idite na "Administracija -> Statusi problema").' - error_can_not_delete_custom_field: Nemoguće je izbrisati prilagođeno polje - error_can_not_delete_tracker: "Ovo praćenje sadrži probleme i ne može biti obrisano." - error_can_not_remove_role: "Ova uloga je u upotrebi i ne može biti obrisana." - error_can_not_reopen_issue_on_closed_version: 'Problem dodeljen zatvorenoj verziji ne može biti ponovo otvoren' - error_can_not_archive_project: Ovaj projekat se ne može arhivirati - error_issue_done_ratios_not_updated: "Odnos rešenih problema nije ažuriran." - error_workflow_copy_source: 'Molimo odaberite izvorno praćenje ili ulogu' - error_workflow_copy_target: 'Molimo odaberite odredišno praćenje i ulogu' - error_unable_delete_issue_status: 'Status problema je nemoguće obrisati' - error_unable_to_connect: "Povezivanje sa (%{value}) je nemoguće" - warning_attachments_not_saved: "%{count} datoteka ne može biti snimljena." - - mail_subject_lost_password: "Vaša %{value} lozinka" - mail_body_lost_password: 'Za promenu vaše lozinke, kliknite na sledeći link:' - mail_subject_register: "Aktivacija vašeg %{value} naloga" - mail_body_register: 'Za aktivaciju vašeg naloga, kliknite na sledeći link:' - mail_body_account_information_external: "Vaš nalog %{value} možete koristiti za prijavu." - mail_body_account_information: Informacije o vašem nalogu - mail_subject_account_activation_request: "Zahtev za aktivaciju naloga %{value}" - mail_body_account_activation_request: "Novi korisnik (%{value}) je registrovan. Nalog čeka na vaše odobrenje:" - mail_subject_reminder: "%{count} problema dospeva narednih %{days} dana" - mail_body_reminder: "%{count} problema dodeljenih vama dospeva u narednih %{days} dana:" - mail_subject_wiki_content_added: "Wiki stranica '%{id}' je dodata" - mail_body_wiki_content_added: "%{author} je dodao wiki stranicu '%{id}'." - mail_subject_wiki_content_updated: "Wiki stranica '%{id}' je ažurirana" - mail_body_wiki_content_updated: "%{author} je ažurirao wiki stranicu '%{id}'." - - gui_validation_error: jedna greška - gui_validation_error_plural: "%{count} grešaka" - - field_name: Naziv - field_description: Opis - field_summary: Rezime - field_is_required: Obavezno - field_firstname: Ime - field_lastname: Prezime - field_mail: E-adresa - field_filename: Datoteka - field_filesize: Veličina - field_downloads: Preuzimanja - field_author: Autor - field_created_on: Kreirano - field_updated_on: Ažurirano - field_field_format: Format - field_is_for_all: Za sve projekte - field_possible_values: Moguće vrednosti - field_regexp: Regularan izraz - field_min_length: Minimalna dužina - field_max_length: Maksimalna dužina - field_value: Vrednost - field_category: Kategorija - field_title: Naslov - field_project: Projekat - field_issue: Problem - field_status: Status - field_notes: Beleške - field_is_closed: Zatvoren problem - field_is_default: Podrazumevana vrednost - field_tracker: Praćenje - field_subject: Predmet - field_due_date: Krajnji rok - field_assigned_to: Dodeljeno - field_priority: Prioritet - field_fixed_version: Odredišna verzija - field_user: Korisnik - field_principal: Glavni - field_role: Uloga - field_homepage: Početna stranica - field_is_public: Javno objavljivanje - field_parent: Potprojekat od - field_is_in_roadmap: Problemi prikazani u planu rada - field_login: Korisničko ime - field_mail_notification: Obaveštenja putem e-pošte - field_admin: Administrator - field_last_login_on: Poslednje povezivanje - field_language: Jezik - field_effective_date: Datum - field_password: Lozinka - field_new_password: Nova lozinka - field_password_confirmation: Potvrda lozinke - field_version: Verzija - field_type: Tip - field_host: Glavni računar - field_port: Port - field_account: Korisnički nalog - field_base_dn: Bazni DN - field_attr_login: Atribut prijavljivanja - field_attr_firstname: Atribut imena - field_attr_lastname: Atribut prezimena - field_attr_mail: Atribut e-adrese - field_onthefly: Kreiranje korisnika u toku rada - field_start_date: Početak - field_done_ratio: % urađeno - field_auth_source: Režim potvrde identiteta - field_hide_mail: Sakrij moju e-adresu - field_comments: Komentar - field_url: URL - field_start_page: Početna stranica - field_subproject: Potprojekat - field_hours: sati - field_activity: Aktivnost - field_spent_on: Datum - field_identifier: Identifikator - field_is_filter: Upotrebi kao filter - field_issue_to: Srodni problemi - field_delay: Kašnjenje - field_assignable: Problem može biti dodeljen ovoj ulozi - field_redirect_existing_links: Preusmeri postojeće veze - field_estimated_hours: Proteklo vreme - field_column_names: Kolone - field_time_zone: Vremenska zona - field_searchable: Može da se pretražuje - field_default_value: Podrazumevana vrednost - field_comments_sorting: Prikaži komentare - field_parent_title: Matična stranica - field_editable: Izmenljivo - field_watcher: Posmatrač - field_identity_url: OpenID URL - field_content: Sadržaj - field_group_by: Grupisanje rezultata po - field_sharing: Deljenje - field_parent_issue: Matični zadatak - - setting_app_title: Naslov aplikacije - setting_app_subtitle: Podnaslov aplikacije - setting_welcome_text: Tekst dobrodošlice - setting_default_language: Podrazumevani jezik - setting_login_required: Obavezna potvrda identiteta - setting_self_registration: Samoregistracija - setting_attachment_max_size: Maks. veličina priložene datoteke - setting_issues_export_limit: Ograničenje izvoza „problema“ - setting_mail_from: E-adresa pošiljaoca - setting_bcc_recipients: Primaoci „Bcc“ kopije - setting_plain_text_mail: Poruka sa čistim tekstom (bez HTML-a) - setting_host_name: Putanja i naziv glavnog računara - setting_text_formatting: Oblikovanje teksta - setting_wiki_compression: Kompresija Wiki istorije - setting_feeds_limit: Ograničenje sadržaja izvora vesti - setting_default_projects_public: Podrazumeva se javno prikazivanje novih projekata - setting_autofetch_changesets: Izvršavanje automatskog preuzimanja - setting_sys_api_enabled: Omogućavanje WS za upravljanje spremištem - setting_commit_ref_keywords: Referenciranje ključnih reči - setting_commit_fix_keywords: Popravljanje ključnih reči - setting_autologin: Automatska prijava - setting_date_format: Format datuma - setting_time_format: Format vremena - setting_cross_project_issue_relations: Dozvoli povezivanje problema iz unakrsnih projekata - setting_issue_list_default_columns: Podrazumevane kolone prikazane na spisku problema - setting_repositories_encodings: Kodiranje spremišta - setting_commit_logs_encoding: Kodiranje izvršnih poruka - setting_emails_footer: Podnožje stranice e-poruke - setting_protocol: Protokol - setting_per_page_options: Opcije prikaza objekata po stranici - setting_user_format: Format prikaza korisnika - setting_activity_days_default: Broj dana prikazanih na projektnoj aktivnosti - setting_display_subprojects_issues: Prikazuj probleme iz potprojekata na glavnom projektu, ukoliko nije drugačije navedeno - setting_enabled_scm: Omogućavanje SCM - setting_mail_handler_body_delimiters: "Skraćivanje e-poruke nakon jedne od ovih linija" - setting_mail_handler_api_enabled: Omogućavanje WS dolazne e-poruke - setting_mail_handler_api_key: API ključ - setting_sequential_project_identifiers: Generisanje sekvencijalnog imena projekta - setting_gravatar_enabled: Koristi Gravatar korisničke ikone - setting_gravatar_default: Podrazumevana Gravatar slika - setting_diff_max_lines_displayed: Maks. broj prikazanih različitih linija - setting_file_max_size_displayed: Maks. veličina tekst. datoteka prikazanih umetnuto - setting_repository_log_display_limit: Maks. broj revizija prikazanih u datoteci za evidenciju - setting_openid: Dozvoli OpenID prijavu i registraciju - setting_password_min_length: Minimalna dužina lozinke - setting_new_project_user_role_id: Kreatoru projekta (koji nije administrator) dodeljuje je uloga - setting_default_projects_modules: Podrazumevano omogućeni moduli za nove projekte - setting_issue_done_ratio: Izračunaj odnos rešenih problema - setting_issue_done_ratio_issue_field: koristeći polje problema - setting_issue_done_ratio_issue_status: koristeći status problema - setting_start_of_week: Prvi dan u sedmici - setting_rest_api_enabled: Omogući REST web usluge - setting_cache_formatted_text: Keširanje obrađenog teksta - - permission_add_project: Kreiranje projekta - permission_add_subprojects: Kreiranje potpojekta - permission_edit_project: Izmena projekata - permission_select_project_modules: Odabiranje modula projekta - permission_manage_members: Upravljanje članovima - permission_manage_project_activities: Upravljanje projektnim aktivnostima - permission_manage_versions: Upravljanje verzijama - permission_manage_categories: Upravljanje kategorijama problema - permission_view_issues: Pregled problema - permission_add_issues: Dodavanje problema - permission_edit_issues: Izmena problema - permission_manage_issue_relations: Upravljanje vezama između problema - permission_add_issue_notes: Dodavanje beleški - permission_edit_issue_notes: Izmena beleški - permission_edit_own_issue_notes: Izmena sopstvenih beleški - permission_move_issues: Pomeranje problema - permission_delete_issues: Brisanje problema - permission_manage_public_queries: Upravljanje javnim upitima - permission_save_queries: Snimanje upita - permission_view_gantt: Pregledanje Gantovog dijagrama - permission_view_calendar: Pregledanje kalendara - permission_view_issue_watchers: Pregledanje spiska posmatrača - permission_add_issue_watchers: Dodavanje posmatrača - permission_delete_issue_watchers: Brisanje posmatrača - permission_log_time: Beleženje utrošenog vremena - permission_view_time_entries: Pregledanje utrošenog vremena - permission_edit_time_entries: Izmena utrošenog vremena - permission_edit_own_time_entries: Izmena sopstvenog utrošenog vremena - permission_manage_news: Upravljanje vestima - permission_comment_news: Komentarisanje vesti - permission_manage_documents: Upravljanje dokumentima - permission_view_documents: Pregledanje dokumenata - permission_manage_files: Upravljanje datotekama - permission_view_files: Pregledanje datoteka - permission_manage_wiki: Upravljanje wiki stranicama - permission_rename_wiki_pages: Promena imena wiki stranicama - permission_delete_wiki_pages: Brisanje wiki stranica - permission_view_wiki_pages: Pregledanje wiki stranica - permission_view_wiki_edits: Pregledanje wiki istorije - permission_edit_wiki_pages: Izmena wiki stranica - permission_delete_wiki_pages_attachments: Brisanje priloženih datoteka - permission_protect_wiki_pages: Zaštita wiki stranica - permission_manage_repository: Upravljanje spremištem - permission_browse_repository: Pregledanje spremišta - permission_view_changesets: Pregledanje skupa promena - permission_commit_access: Potvrda pristupa - permission_manage_boards: Upravljanje forumima - permission_view_messages: Pregledanje poruka - permission_add_messages: Slanje poruka - permission_edit_messages: Izmena poruka - permission_edit_own_messages: Izmena sopstvenih poruka - permission_delete_messages: Brisanje poruka - permission_delete_own_messages: Brisanje sopstvenih poruka - permission_export_wiki_pages: Izvoz wiki stranica - permission_manage_subtasks: Upravljanje podzadacima - - project_module_issue_tracking: Praćenje problema - project_module_time_tracking: Praćenje vremena - project_module_news: Vesti - project_module_documents: Dokumenti - project_module_files: Datoteke - project_module_wiki: Wiki - project_module_repository: Spremište - project_module_boards: Forumi - - label_user: Korisnik - label_user_plural: Korisnici - label_user_new: Novi korisnik - label_user_anonymous: Anoniman - label_project: Projekat - label_project_new: Novi projekat - label_project_plural: Projekti - label_x_projects: - zero: nema projekata - one: jedan projekat - other: "%{count} projekata" - label_project_all: Svi projekti - label_project_latest: Poslednji projekti - label_issue: Problem - label_issue_new: Novi problem - label_issue_plural: Problemi - label_issue_view_all: Prikaz svih problema - label_issues_by: "Problemi (%{value})" - label_issue_added: Problem je dodat - label_issue_updated: Problem je ažuriran - label_document: Dokument - label_document_new: Novi dokument - label_document_plural: Dokumenti - label_document_added: Dokument je dodat - label_role: Uloga - label_role_plural: Uloge - label_role_new: Nova uloga - label_role_and_permissions: Uloge i dozvole - label_member: Član - label_member_new: Novi član - label_member_plural: Članovi - label_tracker: Praćenje - label_tracker_plural: Praćenja - label_tracker_new: Novo praćenje - label_workflow: Tok posla - label_issue_status: Status problema - label_issue_status_plural: Statusi problema - label_issue_status_new: Novi status - label_issue_category: Kategorija problema - label_issue_category_plural: Kategorije problema - label_issue_category_new: Nova kategorija - label_custom_field: Prilagođeno polje - label_custom_field_plural: Prilagođena polja - label_custom_field_new: Novo prilagođeno polje - label_enumerations: Nabrojiva lista - label_enumeration_new: Nova vrednost - label_information: Informacija - label_information_plural: Informacije - label_please_login: Molimo, prijavite se - label_register: Registracija - label_login_with_open_id_option: ili prijava sa OpenID - label_password_lost: Izgubljena lozinka - label_home: Početak - label_my_page: Moja stranica - label_my_account: Moj nalog - label_my_projects: Moji projekti - label_my_page_block: My page block - label_administration: Administracija - label_login: Prijava - label_logout: Odjava - label_help: Pomoć - label_reported_issues: Prijavljeni problemi - label_assigned_to_me_issues: Problemi dodeljeni meni - label_last_login: Poslednje povezivanje - label_registered_on: Registrovan - label_activity: Aktivnost - label_overall_activity: Celokupna aktivnost - label_user_activity: "Aktivnost korisnika %{value}" - label_new: Novo - label_logged_as: Prijavljeni ste kao - label_environment: Okruženje - label_authentication: Potvrda identiteta - label_auth_source: Režim potvrde identiteta - label_auth_source_new: Novi režim potvrde identiteta - label_auth_source_plural: Režimi potvrde identiteta - label_subproject_plural: Potprojekti - label_subproject_new: Novi potprojekat - label_and_its_subprojects: "%{value} i njegovi potprojekti" - label_min_max_length: Min. - Maks. dužina - label_list: Spisak - label_date: Datum - label_integer: Ceo broj - label_float: Sa pokretnim zarezom - label_boolean: Logički operator - label_string: Tekst - label_text: Dugi tekst - label_attribute: Osobina - label_attribute_plural: Osobine - label_download: "%{count} preuzimanje" - label_download_plural: "%{count} preuzimanja" - label_no_data: Nema podataka za prikazivanje - label_change_status: Promena statusa - label_history: Istorija - label_attachment: Datoteka - label_attachment_new: Nova datoteka - label_attachment_delete: Brisanje datoteke - label_attachment_plural: Datoteke - label_file_added: Datoteka je dodata - label_report: Izveštaj - label_report_plural: Izveštaji - label_news: Vesti - label_news_new: Dodavanje vesti - label_news_plural: Vesti - label_news_latest: Poslednje vesti - label_news_view_all: Prikaz svih vesti - label_news_added: Vesti su dodate - label_settings: Podešavanja - label_overview: Pregled - label_version: Verzija - label_version_new: Nova verzija - label_version_plural: Verzije - label_close_versions: Zatvori završene verzije - label_confirmation: Potvrda - label_export_to: 'Takođe dostupno i u varijanti:' - label_read: Čitanje... - label_public_projects: Javni projekti - label_open_issues: otvoren - label_open_issues_plural: otvorenih - label_closed_issues: zatvoren - label_closed_issues_plural: zatvorenih - label_x_open_issues_abbr_on_total: - zero: 0 otvorenih / %{total} - one: 1 otvoren / %{total} - other: "%{count} otvorenih / %{total}" - label_x_open_issues_abbr: - zero: 0 otvorenih - one: 1 otvoren - other: "%{count} otvorenih" - label_x_closed_issues_abbr: - zero: 0 zatvorenih - one: 1 zatvoren - other: "%{count} zatvorenih" - label_total: Ukupno - label_permissions: Dozvole - label_current_status: Trenutni status - label_new_statuses_allowed: Novi statusi dozvoljeni - label_all: svi - label_none: nijedan - label_nobody: nikome - label_next: Sledeće - label_previous: Prethodno - label_used_by: Koristio - label_details: Detalji - label_add_note: Dodaj belešku - label_per_page: Po strani - label_calendar: Kalendar - label_months_from: meseci od - label_gantt: Gantov dijagram - label_internal: Unutrašnji - label_last_changes: "poslednjih %{count} promena" - label_change_view_all: Prikaži sve promene - label_personalize_page: Personalizuj ovu stranu - label_comment: Komentar - label_comment_plural: Komentari - label_x_comments: - zero: bez komentara - one: jedan komentar - other: "%{count} komentara" - label_comment_add: Dodaj komentar - label_comment_added: Komentar dodat - label_comment_delete: Obriši komentare - label_query: Prilagođen upit - label_query_plural: Prilagođeni upiti - label_query_new: Novi upit - label_filter_add: Dodavanje filtera - label_filter_plural: Filteri - label_equals: je - label_not_equals: nije - label_in_less_than: manje od - label_in_more_than: više od - label_greater_or_equal: '>=' - label_less_or_equal: '<=' - label_in: u - label_today: danas - label_all_time: sve vreme - label_yesterday: juče - label_this_week: ove sedmice - label_last_week: poslednje sedmice - label_last_n_days: "poslednjih %{count} dana" - label_this_month: ovog meseca - label_last_month: poslednjeg meseca - label_this_year: ove godine - label_date_range: Vremenski period - label_less_than_ago: pre manje od nekoliko dana - label_more_than_ago: pre više od nekoliko dana - label_ago: pre nekoliko dana - label_contains: sadrži - label_not_contains: ne sadrži - label_day_plural: dana - label_repository: Spremište - label_repository_plural: Spremišta - label_browse: Pregledanje - label_modification: "%{count} promena" - label_modification_plural: "%{count} promena" - label_branch: Grana - label_tag: Oznaka - label_revision: Revizija - label_revision_plural: Revizije - label_revision_id: "Revizija %{value}" - label_associated_revisions: Pridružene revizije - label_added: dodato - label_modified: promenjeno - label_copied: kopirano - label_renamed: preimenovano - label_deleted: izbrisano - label_latest_revision: Poslednja revizija - label_latest_revision_plural: Poslednje revizije - label_view_revisions: Pregled revizija - label_view_all_revisions: Pregled svih revizija - label_max_size: Maksimalna veličina - label_sort_highest: Premeštanje na vrh - label_sort_higher: Premeštanje na gore - label_sort_lower: Premeštanje na dole - label_sort_lowest: Premeštanje na dno - label_roadmap: Plan rada - label_roadmap_due_in: "Dospeva %{value}" - label_roadmap_overdue: "%{value} najkasnije" - label_roadmap_no_issues: Nema problema za ovu verziju - label_search: Pretraga - label_result_plural: Rezultati - label_all_words: Sve reči - label_wiki: Wiki - label_wiki_edit: Wiki izmena - label_wiki_edit_plural: Wiki izmene - label_wiki_page: Wiki stranica - label_wiki_page_plural: Wiki stranice - label_index_by_title: Indeksiranje po naslovu - label_index_by_date: Indeksiranje po datumu - label_current_version: Trenutna verzija - label_preview: Pregled - label_feed_plural: Izvori vesti - label_changes_details: Detalji svih promena - label_issue_tracking: Praćenje problema - label_spent_time: Utrošeno vreme - label_overall_spent_time: Celokupno utrošeno vreme - label_f_hour: "%{value} sat" - label_f_hour_plural: "%{value} sati" - label_time_tracking: Praćenje vremena - label_change_plural: Promene - label_statistics: Statistika - label_commits_per_month: Izvršenja mesečno - label_commits_per_author: Izvršenja po autoru - label_view_diff: Pogledaj razlike - label_diff_inline: unutra - label_diff_side_by_side: uporedo - label_options: Opcije - label_copy_workflow_from: Kopiranje toka posla od - label_permissions_report: Izveštaj o dozvolama - label_watched_issues: Posmatrani problemi - label_related_issues: Srodni problemi - label_applied_status: Primenjeni statusi - label_loading: Učitavanje... - label_relation_new: Nova relacija - label_relation_delete: Brisanje relacije - label_relates_to: srodnih sa - label_duplicates: dupliranih - label_duplicated_by: dupliranih od - label_blocks: odbijenih - label_blocked_by: odbijenih od - label_precedes: prethodi - label_follows: praćenih - label_end_to_start: od kraja do početka - label_end_to_end: od kraja do kraja - label_start_to_start: od početka do početka - label_start_to_end: od početka do kraja - label_stay_logged_in: Ostanite prijavljeni - label_disabled: onemogućeno - label_show_completed_versions: Prikazivanje završene verzije - label_me: meni - label_board: Forum - label_board_new: Novi forum - label_board_plural: Forumi - label_board_locked: Zaključana - label_board_sticky: Lepljiva - label_topic_plural: Teme - label_message_plural: Poruke - label_message_last: Poslednja poruka - label_message_new: Nova poruka - label_message_posted: Poruka je dodata - label_reply_plural: Odgovori - label_send_information: Pošalji korisniku detalje naloga - label_year: Godina - label_month: Mesec - label_week: Sedmica - label_date_from: Šalje - label_date_to: Prima - label_language_based: Bazirano na jeziku korisnika - label_sort_by: "Sortirano po %{value}" - label_send_test_email: Slanje probne e-poruke - label_feeds_access_key: RSS pristupni ključ - label_missing_feeds_access_key: RSS pristupni ključ nedostaje - label_feeds_access_key_created_on: "RSS pristupni ključ je napravljen pre %{value}" - label_module_plural: Moduli - label_added_time_by: "Dodao %{author} pre %{age}" - label_updated_time_by: "Ažurirao %{author} pre %{age}" - label_updated_time: "Ažurirano pre %{value}" - label_jump_to_a_project: Skok na projekat... - label_file_plural: Datoteke - label_changeset_plural: Skupovi promena - label_default_columns: Podrazumevane kolone - label_no_change_option: (Bez promena) - label_bulk_edit_selected_issues: Grupna izmena odabranih problema - label_theme: Tema - label_default: Podrazumevano - label_search_titles_only: Pretražuj samo naslove - label_user_mail_option_all: "Za bilo koji događaj na svim mojim projektima" - label_user_mail_option_selected: "Za bilo koji događaj na samo odabranim projektima..." - label_user_mail_no_self_notified: "Ne želim biti obaveštavan za promene koje sam pravim" - label_registration_activation_by_email: aktivacija naloga putem e-poruke - label_registration_manual_activation: ručna aktivacija naloga - label_registration_automatic_activation: automatska aktivacija naloga - label_display_per_page: "Broj stavki po stranici: %{value}" - label_age: Starost - label_change_properties: Promeni svojstva - label_general: Opšti - label_more: Više - label_scm: SCM - label_plugins: Dodatne komponente - label_ldap_authentication: LDAP potvrda identiteta - label_downloads_abbr: D/L - label_optional_description: Opciono opis - label_add_another_file: Dodaj još jednu datoteku - label_preferences: Podešavanja - label_chronological_order: po hronološkom redosledu - label_reverse_chronological_order: po obrnutom hronološkom redosledu - label_planning: Planiranje - label_incoming_emails: Dolazne e-poruke - label_generate_key: Generisanje ključa - label_issue_watchers: Posmatrači - label_example: Primer - label_display: Prikaz - label_sort: Sortiranje - label_ascending: Rastući niz - label_descending: Opadajući niz - label_date_from_to: Od %{start} do %{end} - label_wiki_content_added: Wiki stranica je dodata - label_wiki_content_updated: Wiki stranica je ažurirana - label_group: Grupa - label_group_plural: Grupe - label_group_new: Nova grupa - label_time_entry_plural: Utrošeno vreme - label_version_sharing_none: Nije deljeno - label_version_sharing_descendants: Sa potprojektima - label_version_sharing_hierarchy: Sa hijerarhijom projekta - label_version_sharing_tree: Sa stablom projekta - label_version_sharing_system: Sa svim projektima - label_update_issue_done_ratios: Ažuriraj odnos rešenih problema - label_copy_source: Izvor - label_copy_target: Odredište - label_copy_same_as_target: Isto kao odredište - label_display_used_statuses_only: Prikazuj statuse korišćene samo od strane ovog praćenja - label_api_access_key: API pristupni ključ - label_missing_api_access_key: Nedostaje API pristupni ključ - label_api_access_key_created_on: "API pristupni ključ je kreiran pre %{value}" - label_profile: Profil - label_subtask_plural: Podzadatak - label_project_copy_notifications: Pošalji e-poruku sa obaveštenjem prilikom kopiranja projekta - - button_login: Prijava - button_submit: Pošalji - button_save: Snimi - button_check_all: Uključi sve - button_uncheck_all: Isključi sve - button_delete: Izbriši - button_create: Kreiraj - button_create_and_continue: Kreiraj i nastavi - button_test: Test - button_edit: Izmeni - button_add: Dodaj - button_change: Promeni - button_apply: Primeni - button_clear: Obriši - button_lock: Zaključaj - button_unlock: Otključaj - button_download: Preuzmi - button_list: Spisak - button_view: Prikaži - button_move: Pomeri - button_move_and_follow: Pomeri i prati - button_back: Nazad - button_cancel: Poništi - button_activate: Aktiviraj - button_sort: Sortiraj - button_log_time: Evidentiraj vreme - button_rollback: Povratak na ovu verziju - button_watch: Prati - button_unwatch: Ne prati više - button_reply: Odgovori - button_archive: Arhiviraj - button_unarchive: Vrati iz arhive - button_reset: Poništi - button_rename: Preimenuj - button_change_password: Promeni lozinku - button_copy: Kopiraj - button_copy_and_follow: Kopiraj i prati - button_annotate: Pribeleži - button_update: Ažuriraj - button_configure: Podesi - button_quote: Pod navodnicima - button_duplicate: Dupliraj - button_show: Prikaži - - status_active: aktivni - status_registered: registrovani - status_locked: zaključani - - version_status_open: otvoren - version_status_locked: zaključan - version_status_closed: zatvoren - - field_active: Aktivan - - text_select_mail_notifications: Odaberi akcije za koje će obaveštenje biti poslato putem e-pošte. - text_regexp_info: npr. ^[A-Z0-9]+$ - text_min_max_length_info: 0 znači bez ograničenja - text_project_destroy_confirmation: Jeste li sigurni da želite da izbrišete ovaj projekat i sve pripadajuće podatke? - text_subprojects_destroy_warning: "Potprojekti: %{value} će takođe biti izbrisan." - text_workflow_edit: Odaberite ulogu i praćenje za izmenu toka posla - text_are_you_sure: Jeste li sigurni? - text_journal_changed: "%{label} promenjen od %{old} u %{new}" - text_journal_set_to: "%{label} postavljen u %{value}" - text_journal_deleted: "%{label} izbrisano (%{old})" - text_journal_added: "%{label} %{value} dodato" - text_tip_issue_begin_day: zadatak počinje ovog dana - text_tip_issue_end_day: zadatak se završava ovog dana - text_tip_issue_begin_end_day: zadatak počinje i završava ovog dana - text_project_identifier_info: 'Only lower case letters (a-z), numbers, dashes and underscores are allowed.
Once saved, the identifier can not be changed.' - text_caracters_maximum: "Najviše %{count} znak(ova)." - text_caracters_minimum: "Broj znakova mora biti najmanje %{count}." - text_length_between: "Broj znakova mora biti između %{min} i %{max}." - text_tracker_no_workflow: Ovo praćenje nema definisan tok posla - text_unallowed_characters: Nedozvoljeni znakovi - text_comma_separated: Dozvoljene su višestruke vrednosti (odvojene zarezom). - text_line_separated: Dozvoljene su višestruke vrednosti (jedan red za svaku vrednost). - text_issues_ref_in_commit_messages: Referenciranje i popravljanje problema u izvršnim porukama - text_issue_added: "%{author} je prijavio problem %{id}." - text_issue_updated: "%{author} je ažurirao problem %{id}." - text_wiki_destroy_confirmation: Jeste li sigurni da želite da obrišete wiki i sav sadržaj? - text_issue_category_destroy_question: "Nekoliko problema (%{count}) je dodeljeno ovoj kategoriji. Šta želite da uradite?" - text_issue_category_destroy_assignments: Ukloni dodeljene kategorije - text_issue_category_reassign_to: Dodeli ponovo probleme ovoj kategoriji - text_user_mail_option: "Za neizabrane projekte, dobićete samo obaveštenje o stvarima koje pratite ili ste uključeni (npr. problemi čiji ste vi autor ili zastupnik)." - text_no_configuration_data: "Uloge, praćenja, statusi problema i toka posla još uvek nisu podešeni.\nPreporučljivo je da učitate podrazumevano konfigurisanje. Izmena je moguća nakon prvog učitavanja." - text_load_default_configuration: Učitaj podrazumevano konfigurisanje - text_status_changed_by_changeset: "Primenjeno u skupu sa promenama %{value}." - text_issues_destroy_confirmation: 'Jeste li sigurni da želite da izbrišete odabrane probleme?' - text_select_project_modules: 'Odaberite module koje želite omogućiti za ovaj projekat:' - text_default_administrator_account_changed: Podrazumevani administratorski nalog je promenjen - text_file_repository_writable: Fascikla priloženih datoteka je upisiva - text_plugin_assets_writable: Fascikla elemenata dodatnih komponenti je upisiva - text_rmagick_available: RMagick je dostupan (opciono) - text_destroy_time_entries_question: "%{hours} sati je prijavljeno za ovaj problem koji želite izbrisati. Šta želite da uradite?" - text_destroy_time_entries: Izbriši prijavljene sate - text_assign_time_entries_to_project: Dodeli prijavljene sate projektu - text_reassign_time_entries: 'Dodeli ponovo prijavljene sate ovom problemu:' - text_user_wrote: "%{value} je napisao:" - text_enumeration_destroy_question: "%{count} objekat(a) je dodeljeno ovoj vrednosti." - text_enumeration_category_reassign_to: 'Dodeli ih ponovo ovoj vrednosti:' - text_email_delivery_not_configured: "Isporuka e-poruka nije konfigurisana i obaveštenja su onemogućena.\nPodesite vaš SMTP server u config/configuration.yml i pokrenite ponovo aplikaciju za njihovo omogućavanje." - text_repository_usernames_mapping: "Odaberite ili ažurirajte Redmine korisnike mapiranjem svakog korisničkog imena pronađenog u evidenciji spremišta.\nKorisnici sa istim Redmine imenom i imenom spremišta ili e-adresom su automatski mapirani." - text_diff_truncated: '... Ova razlika je isečena jer je dostignuta maksimalna veličina prikaza.' - text_custom_field_possible_values_info: 'Jedan red za svaku vrednost' - text_wiki_page_destroy_question: "Ova stranica ima %{descendants} podređenih stranica i podstranica. Šta želite da uradite?" - text_wiki_page_nullify_children: "Zadrži podređene stranice kao korene stranice" - text_wiki_page_destroy_children: "Izbriši podređene stranice i sve njihove podstranice" - text_wiki_page_reassign_children: "Dodeli ponovo podređene stranice ovoj matičnoj stranici" - text_own_membership_delete_confirmation: "Nakon uklanjanja pojedinih ili svih vaših dozvola nećete više moći da uređujete ovaj projekat.\nŽelite li da nastavite?" - text_zoom_in: Uvećaj - text_zoom_out: Umanji - - default_role_manager: Menadžer - default_role_developer: Programer - default_role_reporter: Izveštač - default_role_non_member: Non member - default_role_anonymous: Anonymous - default_tracker_bug: Greška - default_tracker_feature: Funkcionalnost - default_tracker_support: Podrška - default_issue_status_new: Novo - default_issue_status_in_progress: U toku - default_issue_status_resolved: Rešeno - default_issue_status_feedback: Povratna informacija - default_issue_status_closed: Zatvoreno - default_issue_status_rejected: Odbijeno - default_doc_category_user: Korisnička dokumentacija - default_doc_category_tech: Tehnička dokumentacija - default_priority_low: Nizak - default_priority_normal: Normalan - default_priority_high: Visok - default_priority_urgent: Hitno - default_priority_immediate: Neposredno - default_activity_design: Dizajn - default_activity_development: Razvoj - - enumeration_issue_priorities: Prioriteti problema - enumeration_doc_categories: Kategorije dokumenta - enumeration_activities: Aktivnosti (praćenje vremena) - enumeration_system_activity: Sistemska aktivnost - - field_time_entries: Vreme evidencije - project_module_gantt: Gantov dijagram - project_module_calendar: Kalendar - button_edit_associated_wikipage: "Edit associated Wiki page: %{page_title}" - text_are_you_sure_with_children: Delete issue and all child issues? - field_text: Text field - label_user_mail_option_only_owner: Only for things I am the owner of - setting_default_notification_option: Default notification option - label_user_mail_option_only_my_events: Only for things I watch or I'm involved in - label_user_mail_option_only_assigned: Only for things I am assigned to - label_user_mail_option_none: No events - field_member_of_group: Assignee's group - field_assigned_to_role: Assignee's role - notice_not_authorized_archived_project: The project you're trying to access has been archived. - label_principal_search: "Search for user or group:" - label_user_search: "Search for user:" - field_visible: Visible - setting_emails_header: Emails header - setting_commit_logtime_activity_id: Activity for logged time - text_time_logged_by_changeset: Applied in changeset %{value}. - setting_commit_logtime_enabled: Enable time logging - notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max}) - setting_gantt_items_limit: Maximum number of items displayed on the gantt chart - text_powered_by: Powered by %{link} +# Serbian translations for Redmine +# by Vladimir Medarović (vlada@medarovic.com) +sr-YU: + direction: ltr + date: + formats: + # Use the strftime parameters for formats. + # When no format has been given, it uses default. + # You can provide other formats here if you like! + default: "%d.%m.%Y." + short: "%e %b" + long: "%B %e, %Y" + + day_names: [nedelja, ponedeljak, utorak, sreda, četvrtak, petak, subota] + abbr_day_names: [ned, pon, uto, sre, čet, pet, sub] + + # Don't forget the nil at the beginning; there's no such thing as a 0th month + month_names: [~, januar, februar, mart, april, maj, jun, jul, avgust, septembar, oktobar, novembar, decembar] + abbr_month_names: [~, jan, feb, mar, apr, maj, jun, jul, avg, sep, okt, nov, dec] + # Used in date_select and datime_select. + order: + - :day + - :month + - :year + + time: + formats: + default: "%d.%m.%Y. u %H:%M" + time: "%H:%M" + short: "%d. %b u %H:%M" + long: "%d. %B %Y u %H:%M" + am: "am" + pm: "pm" + + datetime: + distance_in_words: + half_a_minute: "pola minuta" + less_than_x_seconds: + one: "manje od jedne sekunde" + other: "manje od %{count} sek." + x_seconds: + one: "jedna sekunda" + other: "%{count} sek." + less_than_x_minutes: + one: "manje od minuta" + other: "manje od %{count} min." + x_minutes: + one: "jedan minut" + other: "%{count} min." + about_x_hours: + one: "približno jedan sat" + other: "približno %{count} sati" + x_days: + one: "jedan dan" + other: "%{count} dana" + about_x_months: + one: "približno jedan mesec" + other: "približno %{count} meseci" + x_months: + one: "jedan mesec" + other: "%{count} meseci" + about_x_years: + one: "približno godinu dana" + other: "približno %{count} god." + over_x_years: + one: "preko godinu dana" + other: "preko %{count} god." + almost_x_years: + one: "skoro godinu dana" + other: "skoro %{count} god." + + number: + format: + separator: "," + delimiter: "" + precision: 3 + human: + format: + delimiter: "" + precision: 1 + storage_units: + format: "%n %u" + units: + byte: + one: "Byte" + other: "Bytes" + kb: "KB" + mb: "MB" + gb: "GB" + tb: "TB" + + +# Used in array.to_sentence. + support: + array: + sentence_connector: "i" + skip_last_comma: false + + activerecord: + errors: + template: + header: + one: "1 error prohibited this %{model} from being saved" + other: "%{count} errors prohibited this %{model} from being saved" + messages: + inclusion: "nije uključen u spisak" + exclusion: "je rezervisan" + invalid: "je neispravan" + confirmation: "potvrda ne odgovara" + accepted: "mora biti prihvaćen" + empty: "ne može biti prazno" + blank: "ne može biti prazno" + too_long: "je predugačka (maksimum znakova je %{count})" + too_short: "je prekratka (minimum znakova je %{count})" + wrong_length: "je pogrešne dužine (broj znakova mora biti %{count})" + taken: "je već u upotrebi" + not_a_number: "nije broj" + not_a_date: "nije ispravan datum" + greater_than: "mora biti veći od %{count}" + greater_than_or_equal_to: "mora biti veći ili jednak %{count}" + equal_to: "mora biti jednak %{count}" + less_than: "mora biti manji od %{count}" + less_than_or_equal_to: "mora biti manji ili jednak %{count}" + odd: "mora biti paran" + even: "mora biti neparan" + greater_than_start_date: "mora biti veći od početnog datuma" + not_same_project: "ne pripada istom projektu" + circular_dependency: "Ova veza će stvoriti kružnu referencu" + cant_link_an_issue_with_a_descendant: "Problem ne može biti povezan sa jednim od svojih podzadataka" + + actionview_instancetag_blank_option: Molim odaberite + + general_text_No: 'Ne' + general_text_Yes: 'Da' + general_text_no: 'ne' + general_text_yes: 'da' + general_lang_name: 'Srpski' + general_csv_separator: ',' + general_csv_decimal_separator: '.' + general_csv_encoding: UTF-8 + general_pdf_encoding: UTF-8 + general_first_day_of_week: '1' + + notice_account_updated: Nalog je uspešno ažuriran. + notice_account_invalid_creditentials: Neispravno korisničko ime ili lozinka. + notice_account_password_updated: Lozinka je uspešno ažurirana. + notice_account_wrong_password: Pogrešna lozinka + notice_account_register_done: Korisnički nalog je uspešno kreiran. Kliknite na link koji ste dobili u e-poruci za aktivaciju. + notice_account_unknown_email: Nepoznat korisnik. + notice_can_t_change_password: Ovaj korisnički nalog za potvrdu identiteta koristi spoljni izvor. Nemoguće je promeniti lozinku. + notice_account_lost_email_sent: Poslata vam je e-poruka sa uputstvom za izbor nove lozinke + notice_account_activated: Vaš korisnički nalog je aktiviran. Sada se možete prijaviti. + notice_successful_create: Uspešno kreiranje. + notice_successful_update: Uspešno ažuriranje. + notice_successful_delete: Uspešno brisanje. + notice_successful_connection: Uspešno povezivanje. + notice_file_not_found: Strana kojoj želite pristupiti ne postoji ili je uklonjena. + notice_locking_conflict: Podatak je ažuriran od strane drugog korisnika. + notice_not_authorized: Niste ovlašćeni za pristup ovoj strani. + notice_email_sent: "E-poruka je poslata na %{value}" + notice_email_error: "Dogodila se greška prilikom slanja e-poruke (%{value})" + notice_feeds_access_key_reseted: Vaš RSS pristupni ključ je poništen. + notice_api_access_key_reseted: Vaš API pristupni ključ je poništen. + notice_failed_to_save_issues: "Neuspešno snimanje %{count} problema od %{total} odabranih: %{ids}." + notice_failed_to_save_members: "Neuspešno snimanje člana(ova): %{errors}." + notice_no_issue_selected: "Ni jedan problem nije odabran! Molimo, odaberite problem koji želite da menjate." + notice_account_pending: "Vaš nalog je kreiran i čeka na odobrenje administratora." + notice_default_data_loaded: Podrazumevano konfigurisanje je uspešno učitano. + notice_unable_delete_version: Verziju je nemoguće izbrisati. + notice_unable_delete_time_entry: Stavku evidencije vremena je nemoguće izbrisati. + notice_issue_done_ratios_updated: Odnos rešenih problema je ažuriran. + + error_can_t_load_default_data: "Podrazumevano konfigurisanje je nemoguće učitati: %{value}" + error_scm_not_found: "Stavka ili ispravka nisu pronađene u spremištu." + error_scm_command_failed: "Greška se javila prilikom pokušaja pristupa spremištu: %{value}" + error_scm_annotate: "Stavka ne postoji ili ne može biti označena." + error_issue_not_found_in_project: 'Problem nije pronađen ili ne pripada ovom projektu.' + error_no_tracker_in_project: 'Ni jedno praćenje nije povezano sa ovim projektom. Molimo proverite podešavanja projekta.' + error_no_default_issue_status: 'Podrazumevani status problema nije definisan. Molimo proverite vaše konfigurisanje (idite na "Administracija -> Statusi problema").' + error_can_not_delete_custom_field: Nemoguće je izbrisati prilagođeno polje + error_can_not_delete_tracker: "Ovo praćenje sadrži probleme i ne može biti obrisano." + error_can_not_remove_role: "Ova uloga je u upotrebi i ne može biti obrisana." + error_can_not_reopen_issue_on_closed_version: 'Problem dodeljen zatvorenoj verziji ne može biti ponovo otvoren' + error_can_not_archive_project: Ovaj projekat se ne može arhivirati + error_issue_done_ratios_not_updated: "Odnos rešenih problema nije ažuriran." + error_workflow_copy_source: 'Molimo odaberite izvorno praćenje ili ulogu' + error_workflow_copy_target: 'Molimo odaberite odredišno praćenje i ulogu' + error_unable_delete_issue_status: 'Status problema je nemoguće obrisati' + error_unable_to_connect: "Povezivanje sa (%{value}) je nemoguće" + warning_attachments_not_saved: "%{count} datoteka ne može biti snimljena." + + mail_subject_lost_password: "Vaša %{value} lozinka" + mail_body_lost_password: 'Za promenu vaše lozinke, kliknite na sledeći link:' + mail_subject_register: "Aktivacija vašeg %{value} naloga" + mail_body_register: 'Za aktivaciju vašeg naloga, kliknite na sledeći link:' + mail_body_account_information_external: "Vaš nalog %{value} možete koristiti za prijavu." + mail_body_account_information: Informacije o vašem nalogu + mail_subject_account_activation_request: "Zahtev za aktivaciju naloga %{value}" + mail_body_account_activation_request: "Novi korisnik (%{value}) je registrovan. Nalog čeka na vaše odobrenje:" + mail_subject_reminder: "%{count} problema dospeva narednih %{days} dana" + mail_body_reminder: "%{count} problema dodeljenih vama dospeva u narednih %{days} dana:" + mail_subject_wiki_content_added: "Wiki stranica '%{id}' je dodata" + mail_body_wiki_content_added: "%{author} je dodao wiki stranicu '%{id}'." + mail_subject_wiki_content_updated: "Wiki stranica '%{id}' je ažurirana" + mail_body_wiki_content_updated: "%{author} je ažurirao wiki stranicu '%{id}'." + + gui_validation_error: jedna greška + gui_validation_error_plural: "%{count} grešaka" + + field_name: Naziv + field_description: Opis + field_summary: Rezime + field_is_required: Obavezno + field_firstname: Ime + field_lastname: Prezime + field_mail: E-adresa + field_filename: Datoteka + field_filesize: Veličina + field_downloads: Preuzimanja + field_author: Autor + field_created_on: Kreirano + field_updated_on: Ažurirano + field_field_format: Format + field_is_for_all: Za sve projekte + field_possible_values: Moguće vrednosti + field_regexp: Regularan izraz + field_min_length: Minimalna dužina + field_max_length: Maksimalna dužina + field_value: Vrednost + field_category: Kategorija + field_title: Naslov + field_project: Projekat + field_issue: Problem + field_status: Status + field_notes: Beleške + field_is_closed: Zatvoren problem + field_is_default: Podrazumevana vrednost + field_tracker: Praćenje + field_subject: Predmet + field_due_date: Krajnji rok + field_assigned_to: Dodeljeno + field_priority: Prioritet + field_fixed_version: Odredišna verzija + field_user: Korisnik + field_principal: Glavni + field_role: Uloga + field_homepage: Početna stranica + field_is_public: Javno objavljivanje + field_parent: Potprojekat od + field_is_in_roadmap: Problemi prikazani u planu rada + field_login: Korisničko ime + field_mail_notification: Obaveštenja putem e-pošte + field_admin: Administrator + field_last_login_on: Poslednje povezivanje + field_language: Jezik + field_password: Lozinka + field_new_password: Nova lozinka + field_password_confirmation: Potvrda lozinke + field_version: Verzija + field_type: Tip + field_host: Glavni računar + field_port: Port + field_account: Korisnički nalog + field_base_dn: Bazni DN + field_attr_login: Atribut prijavljivanja + field_attr_firstname: Atribut imena + field_attr_lastname: Atribut prezimena + field_attr_mail: Atribut e-adrese + field_onthefly: Kreiranje korisnika u toku rada + field_start_date: Početak + field_done_ratio: "% urađeno" + field_auth_source: Režim potvrde identiteta + field_hide_mail: Sakrij moju e-adresu + field_comments: Komentar + field_url: URL + field_start_page: Početna stranica + field_subproject: Potprojekat + field_hours: sati + field_activity: Aktivnost + field_spent_on: Datum + field_identifier: Identifikator + field_is_filter: Upotrebi kao filter + field_issue_to: Srodni problemi + field_delay: Kašnjenje + field_assignable: Problem može biti dodeljen ovoj ulozi + field_redirect_existing_links: Preusmeri postojeće veze + field_estimated_hours: Proteklo vreme + field_column_names: Kolone + field_time_zone: Vremenska zona + field_searchable: Može da se pretražuje + field_default_value: Podrazumevana vrednost + field_comments_sorting: Prikaži komentare + field_parent_title: Matična stranica + field_editable: Izmenljivo + field_watcher: Posmatrač + field_identity_url: OpenID URL + field_content: Sadržaj + field_group_by: Grupisanje rezultata po + field_sharing: Deljenje + field_parent_issue: Matični zadatak + + setting_app_title: Naslov aplikacije + setting_app_subtitle: Podnaslov aplikacije + setting_welcome_text: Tekst dobrodošlice + setting_default_language: Podrazumevani jezik + setting_login_required: Obavezna potvrda identiteta + setting_self_registration: Samoregistracija + setting_attachment_max_size: Maks. veličina priložene datoteke + setting_issues_export_limit: Ograničenje izvoza „problema“ + setting_mail_from: E-adresa pošiljaoca + setting_bcc_recipients: Primaoci „Bcc“ kopije + setting_plain_text_mail: Poruka sa čistim tekstom (bez HTML-a) + setting_host_name: Putanja i naziv glavnog računara + setting_text_formatting: Oblikovanje teksta + setting_wiki_compression: Kompresija Wiki istorije + setting_feeds_limit: Ograničenje sadržaja izvora vesti + setting_default_projects_public: Podrazumeva se javno prikazivanje novih projekata + setting_autofetch_changesets: Izvršavanje automatskog preuzimanja + setting_sys_api_enabled: Omogućavanje WS za upravljanje spremištem + setting_commit_ref_keywords: Referenciranje ključnih reči + setting_commit_fix_keywords: Popravljanje ključnih reči + setting_autologin: Automatska prijava + setting_date_format: Format datuma + setting_time_format: Format vremena + setting_cross_project_issue_relations: Dozvoli povezivanje problema iz unakrsnih projekata + setting_issue_list_default_columns: Podrazumevane kolone prikazane na spisku problema + setting_repositories_encodings: Kodiranje spremišta + setting_commit_logs_encoding: Kodiranje izvršnih poruka + setting_emails_footer: Podnožje stranice e-poruke + setting_protocol: Protokol + setting_per_page_options: Opcije prikaza objekata po stranici + setting_user_format: Format prikaza korisnika + setting_activity_days_default: Broj dana prikazanih na projektnoj aktivnosti + setting_display_subprojects_issues: Prikazuj probleme iz potprojekata na glavnom projektu, ukoliko nije drugačije navedeno + setting_enabled_scm: Omogućavanje SCM + setting_mail_handler_body_delimiters: "Skraćivanje e-poruke nakon jedne od ovih linija" + setting_mail_handler_api_enabled: Omogućavanje WS dolazne e-poruke + setting_mail_handler_api_key: API ključ + setting_sequential_project_identifiers: Generisanje sekvencijalnog imena projekta + setting_gravatar_enabled: Koristi Gravatar korisničke ikone + setting_gravatar_default: Podrazumevana Gravatar slika + setting_diff_max_lines_displayed: Maks. broj prikazanih različitih linija + setting_file_max_size_displayed: Maks. veličina tekst. datoteka prikazanih umetnuto + setting_repository_log_display_limit: Maks. broj revizija prikazanih u datoteci za evidenciju + setting_openid: Dozvoli OpenID prijavu i registraciju + setting_password_min_length: Minimalna dužina lozinke + setting_new_project_user_role_id: Kreatoru projekta (koji nije administrator) dodeljuje je uloga + setting_default_projects_modules: Podrazumevano omogućeni moduli za nove projekte + setting_issue_done_ratio: Izračunaj odnos rešenih problema + setting_issue_done_ratio_issue_field: koristeći polje problema + setting_issue_done_ratio_issue_status: koristeći status problema + setting_start_of_week: Prvi dan u sedmici + setting_rest_api_enabled: Omogući REST web usluge + setting_cache_formatted_text: Keširanje obrađenog teksta + + permission_add_project: Kreiranje projekta + permission_add_subprojects: Kreiranje potpojekta + permission_edit_project: Izmena projekata + permission_select_project_modules: Odabiranje modula projekta + permission_manage_members: Upravljanje članovima + permission_manage_project_activities: Upravljanje projektnim aktivnostima + permission_manage_versions: Upravljanje verzijama + permission_manage_categories: Upravljanje kategorijama problema + permission_view_issues: Pregled problema + permission_add_issues: Dodavanje problema + permission_edit_issues: Izmena problema + permission_manage_issue_relations: Upravljanje vezama između problema + permission_add_issue_notes: Dodavanje beleški + permission_edit_issue_notes: Izmena beleški + permission_edit_own_issue_notes: Izmena sopstvenih beleški + permission_move_issues: Pomeranje problema + permission_delete_issues: Brisanje problema + permission_manage_public_queries: Upravljanje javnim upitima + permission_save_queries: Snimanje upita + permission_view_gantt: Pregledanje Gantovog dijagrama + permission_view_calendar: Pregledanje kalendara + permission_view_issue_watchers: Pregledanje spiska posmatrača + permission_add_issue_watchers: Dodavanje posmatrača + permission_delete_issue_watchers: Brisanje posmatrača + permission_log_time: Beleženje utrošenog vremena + permission_view_time_entries: Pregledanje utrošenog vremena + permission_edit_time_entries: Izmena utrošenog vremena + permission_edit_own_time_entries: Izmena sopstvenog utrošenog vremena + permission_manage_news: Upravljanje vestima + permission_comment_news: Komentarisanje vesti + permission_manage_documents: Upravljanje dokumentima + permission_view_documents: Pregledanje dokumenata + permission_manage_files: Upravljanje datotekama + permission_view_files: Pregledanje datoteka + permission_manage_wiki: Upravljanje wiki stranicama + permission_rename_wiki_pages: Promena imena wiki stranicama + permission_delete_wiki_pages: Brisanje wiki stranica + permission_view_wiki_pages: Pregledanje wiki stranica + permission_view_wiki_edits: Pregledanje wiki istorije + permission_edit_wiki_pages: Izmena wiki stranica + permission_delete_wiki_pages_attachments: Brisanje priloženih datoteka + permission_protect_wiki_pages: Zaštita wiki stranica + permission_manage_repository: Upravljanje spremištem + permission_browse_repository: Pregledanje spremišta + permission_view_changesets: Pregledanje skupa promena + permission_commit_access: Potvrda pristupa + permission_manage_boards: Upravljanje forumima + permission_view_messages: Pregledanje poruka + permission_add_messages: Slanje poruka + permission_edit_messages: Izmena poruka + permission_edit_own_messages: Izmena sopstvenih poruka + permission_delete_messages: Brisanje poruka + permission_delete_own_messages: Brisanje sopstvenih poruka + permission_export_wiki_pages: Izvoz wiki stranica + permission_manage_subtasks: Upravljanje podzadacima + + project_module_issue_tracking: Praćenje problema + project_module_time_tracking: Praćenje vremena + project_module_news: Vesti + project_module_documents: Dokumenti + project_module_files: Datoteke + project_module_wiki: Wiki + project_module_repository: Spremište + project_module_boards: Forumi + + label_user: Korisnik + label_user_plural: Korisnici + label_user_new: Novi korisnik + label_user_anonymous: Anoniman + label_project: Projekat + label_project_new: Novi projekat + label_project_plural: Projekti + label_x_projects: + zero: nema projekata + one: jedan projekat + other: "%{count} projekata" + label_project_all: Svi projekti + label_project_latest: Poslednji projekti + label_issue: Problem + label_issue_new: Novi problem + label_issue_plural: Problemi + label_issue_view_all: Prikaz svih problema + label_issues_by: "Problemi (%{value})" + label_issue_added: Problem je dodat + label_issue_updated: Problem je ažuriran + label_document: Dokument + label_document_new: Novi dokument + label_document_plural: Dokumenti + label_document_added: Dokument je dodat + label_role: Uloga + label_role_plural: Uloge + label_role_new: Nova uloga + label_role_and_permissions: Uloge i dozvole + label_member: Član + label_member_new: Novi član + label_member_plural: Članovi + label_tracker: Praćenje + label_tracker_plural: Praćenja + label_tracker_new: Novo praćenje + label_workflow: Tok posla + label_issue_status: Status problema + label_issue_status_plural: Statusi problema + label_issue_status_new: Novi status + label_issue_category: Kategorija problema + label_issue_category_plural: Kategorije problema + label_issue_category_new: Nova kategorija + label_custom_field: Prilagođeno polje + label_custom_field_plural: Prilagođena polja + label_custom_field_new: Novo prilagođeno polje + label_enumerations: Nabrojiva lista + label_enumeration_new: Nova vrednost + label_information: Informacija + label_information_plural: Informacije + label_please_login: Molimo, prijavite se + label_register: Registracija + label_login_with_open_id_option: ili prijava sa OpenID + label_password_lost: Izgubljena lozinka + label_home: Početak + label_my_page: Moja stranica + label_my_account: Moj nalog + label_my_projects: Moji projekti + label_my_page_block: My page block + label_administration: Administracija + label_login: Prijava + label_logout: Odjava + label_help: Pomoć + label_reported_issues: Prijavljeni problemi + label_assigned_to_me_issues: Problemi dodeljeni meni + label_last_login: Poslednje povezivanje + label_registered_on: Registrovan + label_activity: Aktivnost + label_overall_activity: Celokupna aktivnost + label_user_activity: "Aktivnost korisnika %{value}" + label_new: Novo + label_logged_as: Prijavljeni ste kao + label_environment: Okruženje + label_authentication: Potvrda identiteta + label_auth_source: Režim potvrde identiteta + label_auth_source_new: Novi režim potvrde identiteta + label_auth_source_plural: Režimi potvrde identiteta + label_subproject_plural: Potprojekti + label_subproject_new: Novi potprojekat + label_and_its_subprojects: "%{value} i njegovi potprojekti" + label_min_max_length: Min. - Maks. dužina + label_list: Spisak + label_date: Datum + label_integer: Ceo broj + label_float: Sa pokretnim zarezom + label_boolean: Logički operator + label_string: Tekst + label_text: Dugi tekst + label_attribute: Osobina + label_attribute_plural: Osobine + label_download: "%{count} preuzimanje" + label_download_plural: "%{count} preuzimanja" + label_no_data: Nema podataka za prikazivanje + label_change_status: Promena statusa + label_history: Istorija + label_attachment: Datoteka + label_attachment_new: Nova datoteka + label_attachment_delete: Brisanje datoteke + label_attachment_plural: Datoteke + label_file_added: Datoteka je dodata + label_report: Izveštaj + label_report_plural: Izveštaji + label_news: Vesti + label_news_new: Dodavanje vesti + label_news_plural: Vesti + label_news_latest: Poslednje vesti + label_news_view_all: Prikaz svih vesti + label_news_added: Vesti su dodate + label_settings: Podešavanja + label_overview: Pregled + label_version: Verzija + label_version_new: Nova verzija + label_version_plural: Verzije + label_close_versions: Zatvori završene verzije + label_confirmation: Potvrda + label_export_to: 'Takođe dostupno i u varijanti:' + label_read: Čitanje... + label_public_projects: Javni projekti + label_open_issues: otvoren + label_open_issues_plural: otvorenih + label_closed_issues: zatvoren + label_closed_issues_plural: zatvorenih + label_x_open_issues_abbr_on_total: + zero: 0 otvorenih / %{total} + one: 1 otvoren / %{total} + other: "%{count} otvorenih / %{total}" + label_x_open_issues_abbr: + zero: 0 otvorenih + one: 1 otvoren + other: "%{count} otvorenih" + label_x_closed_issues_abbr: + zero: 0 zatvorenih + one: 1 zatvoren + other: "%{count} zatvorenih" + label_total: Ukupno + label_permissions: Dozvole + label_current_status: Trenutni status + label_new_statuses_allowed: Novi statusi dozvoljeni + label_all: svi + label_none: nijedan + label_nobody: nikome + label_next: Sledeće + label_previous: Prethodno + label_used_by: Koristio + label_details: Detalji + label_add_note: Dodaj belešku + label_per_page: Po strani + label_calendar: Kalendar + label_months_from: meseci od + label_gantt: Gantov dijagram + label_internal: Unutrašnji + label_last_changes: "poslednjih %{count} promena" + label_change_view_all: Prikaži sve promene + label_personalize_page: Personalizuj ovu stranu + label_comment: Komentar + label_comment_plural: Komentari + label_x_comments: + zero: bez komentara + one: jedan komentar + other: "%{count} komentara" + label_comment_add: Dodaj komentar + label_comment_added: Komentar dodat + label_comment_delete: Obriši komentare + label_query: Prilagođen upit + label_query_plural: Prilagođeni upiti + label_query_new: Novi upit + label_filter_add: Dodavanje filtera + label_filter_plural: Filteri + label_equals: je + label_not_equals: nije + label_in_less_than: manje od + label_in_more_than: više od + label_greater_or_equal: '>=' + label_less_or_equal: '<=' + label_in: u + label_today: danas + label_all_time: sve vreme + label_yesterday: juče + label_this_week: ove sedmice + label_last_week: poslednje sedmice + label_last_n_days: "poslednjih %{count} dana" + label_this_month: ovog meseca + label_last_month: poslednjeg meseca + label_this_year: ove godine + label_date_range: Vremenski period + label_less_than_ago: pre manje od nekoliko dana + label_more_than_ago: pre više od nekoliko dana + label_ago: pre nekoliko dana + label_contains: sadrži + label_not_contains: ne sadrži + label_day_plural: dana + label_repository: Spremište + label_repository_plural: Spremišta + label_browse: Pregledanje + label_modification: "%{count} promena" + label_modification_plural: "%{count} promena" + label_branch: Grana + label_tag: Oznaka + label_revision: Revizija + label_revision_plural: Revizije + label_revision_id: "Revizija %{value}" + label_associated_revisions: Pridružene revizije + label_added: dodato + label_modified: promenjeno + label_copied: kopirano + label_renamed: preimenovano + label_deleted: izbrisano + label_latest_revision: Poslednja revizija + label_latest_revision_plural: Poslednje revizije + label_view_revisions: Pregled revizija + label_view_all_revisions: Pregled svih revizija + label_max_size: Maksimalna veličina + label_sort_highest: Premeštanje na vrh + label_sort_higher: Premeštanje na gore + label_sort_lower: Premeštanje na dole + label_sort_lowest: Premeštanje na dno + label_roadmap: Plan rada + label_roadmap_due_in: "Dospeva %{value}" + label_roadmap_overdue: "%{value} najkasnije" + label_roadmap_no_issues: Nema problema za ovu verziju + label_search: Pretraga + label_result_plural: Rezultati + label_all_words: Sve reči + label_wiki: Wiki + label_wiki_edit: Wiki izmena + label_wiki_edit_plural: Wiki izmene + label_wiki_page: Wiki stranica + label_wiki_page_plural: Wiki stranice + label_index_by_title: Indeksiranje po naslovu + label_index_by_date: Indeksiranje po datumu + label_current_version: Trenutna verzija + label_preview: Pregled + label_feed_plural: Izvori vesti + label_changes_details: Detalji svih promena + label_issue_tracking: Praćenje problema + label_spent_time: Utrošeno vreme + label_overall_spent_time: Celokupno utrošeno vreme + label_f_hour: "%{value} sat" + label_f_hour_plural: "%{value} sati" + label_time_tracking: Praćenje vremena + label_change_plural: Promene + label_statistics: Statistika + label_commits_per_month: Izvršenja mesečno + label_commits_per_author: Izvršenja po autoru + label_view_diff: Pogledaj razlike + label_diff_inline: unutra + label_diff_side_by_side: uporedo + label_options: Opcije + label_copy_workflow_from: Kopiranje toka posla od + label_permissions_report: Izveštaj o dozvolama + label_watched_issues: Posmatrani problemi + label_related_issues: Srodni problemi + label_applied_status: Primenjeni statusi + label_loading: Učitavanje... + label_relation_new: Nova relacija + label_relation_delete: Brisanje relacije + label_relates_to: srodnih sa + label_duplicates: dupliranih + label_duplicated_by: dupliranih od + label_blocks: odbijenih + label_blocked_by: odbijenih od + label_precedes: prethodi + label_follows: praćenih + label_end_to_start: od kraja do početka + label_end_to_end: od kraja do kraja + label_start_to_start: od početka do početka + label_start_to_end: od početka do kraja + label_stay_logged_in: Ostanite prijavljeni + label_disabled: onemogućeno + label_show_completed_versions: Prikazivanje završene verzije + label_me: meni + label_board: Forum + label_board_new: Novi forum + label_board_plural: Forumi + label_board_locked: Zaključana + label_board_sticky: Lepljiva + label_topic_plural: Teme + label_message_plural: Poruke + label_message_last: Poslednja poruka + label_message_new: Nova poruka + label_message_posted: Poruka je dodata + label_reply_plural: Odgovori + label_send_information: Pošalji korisniku detalje naloga + label_year: Godina + label_month: Mesec + label_week: Sedmica + label_date_from: Šalje + label_date_to: Prima + label_language_based: Bazirano na jeziku korisnika + label_sort_by: "Sortirano po %{value}" + label_send_test_email: Slanje probne e-poruke + label_feeds_access_key: RSS pristupni ključ + label_missing_feeds_access_key: RSS pristupni ključ nedostaje + label_feeds_access_key_created_on: "RSS pristupni ključ je napravljen pre %{value}" + label_module_plural: Moduli + label_added_time_by: "Dodao %{author} pre %{age}" + label_updated_time_by: "Ažurirao %{author} pre %{age}" + label_updated_time: "Ažurirano pre %{value}" + label_jump_to_a_project: Skok na projekat... + label_file_plural: Datoteke + label_changeset_plural: Skupovi promena + label_default_columns: Podrazumevane kolone + label_no_change_option: (Bez promena) + label_bulk_edit_selected_issues: Grupna izmena odabranih problema + label_theme: Tema + label_default: Podrazumevano + label_search_titles_only: Pretražuj samo naslove + label_user_mail_option_all: "Za bilo koji događaj na svim mojim projektima" + label_user_mail_option_selected: "Za bilo koji događaj na samo odabranim projektima..." + label_user_mail_no_self_notified: "Ne želim biti obaveštavan za promene koje sam pravim" + label_registration_activation_by_email: aktivacija naloga putem e-poruke + label_registration_manual_activation: ručna aktivacija naloga + label_registration_automatic_activation: automatska aktivacija naloga + label_display_per_page: "Broj stavki po stranici: %{value}" + label_age: Starost + label_change_properties: Promeni svojstva + label_general: Opšti + label_more: Više + label_scm: SCM + label_plugins: Dodatne komponente + label_ldap_authentication: LDAP potvrda identiteta + label_downloads_abbr: D/L + label_optional_description: Opciono opis + label_add_another_file: Dodaj još jednu datoteku + label_preferences: Podešavanja + label_chronological_order: po hronološkom redosledu + label_reverse_chronological_order: po obrnutom hronološkom redosledu + label_planning: Planiranje + label_incoming_emails: Dolazne e-poruke + label_generate_key: Generisanje ključa + label_issue_watchers: Posmatrači + label_example: Primer + label_display: Prikaz + label_sort: Sortiranje + label_ascending: Rastući niz + label_descending: Opadajući niz + label_date_from_to: Od %{start} do %{end} + label_wiki_content_added: Wiki stranica je dodata + label_wiki_content_updated: Wiki stranica je ažurirana + label_group: Grupa + label_group_plural: Grupe + label_group_new: Nova grupa + label_time_entry_plural: Utrošeno vreme + label_version_sharing_none: Nije deljeno + label_version_sharing_descendants: Sa potprojektima + label_version_sharing_hierarchy: Sa hijerarhijom projekta + label_version_sharing_tree: Sa stablom projekta + label_version_sharing_system: Sa svim projektima + label_update_issue_done_ratios: Ažuriraj odnos rešenih problema + label_copy_source: Izvor + label_copy_target: Odredište + label_copy_same_as_target: Isto kao odredište + label_display_used_statuses_only: Prikazuj statuse korišćene samo od strane ovog praćenja + label_api_access_key: API pristupni ključ + label_missing_api_access_key: Nedostaje API pristupni ključ + label_api_access_key_created_on: "API pristupni ključ je kreiran pre %{value}" + label_profile: Profil + label_subtask_plural: Podzadatak + label_project_copy_notifications: Pošalji e-poruku sa obaveštenjem prilikom kopiranja projekta + + button_login: Prijava + button_submit: Pošalji + button_save: Snimi + button_check_all: Uključi sve + button_uncheck_all: Isključi sve + button_delete: Izbriši + button_create: Kreiraj + button_create_and_continue: Kreiraj i nastavi + button_test: Test + button_edit: Izmeni + button_add: Dodaj + button_change: Promeni + button_apply: Primeni + button_clear: Obriši + button_lock: Zaključaj + button_unlock: Otključaj + button_download: Preuzmi + button_list: Spisak + button_view: Prikaži + button_move: Pomeri + button_move_and_follow: Pomeri i prati + button_back: Nazad + button_cancel: Poništi + button_activate: Aktiviraj + button_sort: Sortiraj + button_log_time: Evidentiraj vreme + button_rollback: Povratak na ovu verziju + button_watch: Prati + button_unwatch: Ne prati više + button_reply: Odgovori + button_archive: Arhiviraj + button_unarchive: Vrati iz arhive + button_reset: Poništi + button_rename: Preimenuj + button_change_password: Promeni lozinku + button_copy: Kopiraj + button_copy_and_follow: Kopiraj i prati + button_annotate: Pribeleži + button_update: Ažuriraj + button_configure: Podesi + button_quote: Pod navodnicima + button_duplicate: Dupliraj + button_show: Prikaži + + status_active: aktivni + status_registered: registrovani + status_locked: zaključani + + version_status_open: otvoren + version_status_locked: zaključan + version_status_closed: zatvoren + + field_active: Aktivan + + text_select_mail_notifications: Odaberi akcije za koje će obaveštenje biti poslato putem e-pošte. + text_regexp_info: npr. ^[A-Z0-9]+$ + text_min_max_length_info: 0 znači bez ograničenja + text_project_destroy_confirmation: Jeste li sigurni da želite da izbrišete ovaj projekat i sve pripadajuće podatke? + text_subprojects_destroy_warning: "Potprojekti: %{value} će takođe biti izbrisan." + text_workflow_edit: Odaberite ulogu i praćenje za izmenu toka posla + text_are_you_sure: Jeste li sigurni? + text_journal_changed: "%{label} promenjen od %{old} u %{new}" + text_journal_set_to: "%{label} postavljen u %{value}" + text_journal_deleted: "%{label} izbrisano (%{old})" + text_journal_added: "%{label} %{value} dodato" + text_tip_issue_begin_day: zadatak počinje ovog dana + text_tip_issue_end_day: zadatak se završava ovog dana + text_tip_issue_begin_end_day: zadatak počinje i završava ovog dana + text_project_identifier_info: 'Only lower case letters (a-z), numbers, dashes and underscores are allowed.
Once saved, the identifier can not be changed.' + text_caracters_maximum: "Najviše %{count} znak(ova)." + text_caracters_minimum: "Broj znakova mora biti najmanje %{count}." + text_length_between: "Broj znakova mora biti između %{min} i %{max}." + text_tracker_no_workflow: Ovo praćenje nema definisan tok posla + text_unallowed_characters: Nedozvoljeni znakovi + text_comma_separated: Dozvoljene su višestruke vrednosti (odvojene zarezom). + text_line_separated: Dozvoljene su višestruke vrednosti (jedan red za svaku vrednost). + text_issues_ref_in_commit_messages: Referenciranje i popravljanje problema u izvršnim porukama + text_issue_added: "%{author} je prijavio problem %{id}." + text_issue_updated: "%{author} je ažurirao problem %{id}." + text_wiki_destroy_confirmation: Jeste li sigurni da želite da obrišete wiki i sav sadržaj? + text_issue_category_destroy_question: "Nekoliko problema (%{count}) je dodeljeno ovoj kategoriji. Šta želite da uradite?" + text_issue_category_destroy_assignments: Ukloni dodeljene kategorije + text_issue_category_reassign_to: Dodeli ponovo probleme ovoj kategoriji + text_user_mail_option: "Za neizabrane projekte, dobićete samo obaveštenje o stvarima koje pratite ili ste uključeni (npr. problemi čiji ste vi autor ili zastupnik)." + text_no_configuration_data: "Uloge, praćenja, statusi problema i toka posla još uvek nisu podešeni.\nPreporučljivo je da učitate podrazumevano konfigurisanje. Izmena je moguća nakon prvog učitavanja." + text_load_default_configuration: Učitaj podrazumevano konfigurisanje + text_status_changed_by_changeset: "Primenjeno u skupu sa promenama %{value}." + text_issues_destroy_confirmation: 'Jeste li sigurni da želite da izbrišete odabrane probleme?' + text_select_project_modules: 'Odaberite module koje želite omogućiti za ovaj projekat:' + text_default_administrator_account_changed: Podrazumevani administratorski nalog je promenjen + text_file_repository_writable: Fascikla priloženih datoteka je upisiva + text_plugin_assets_writable: Fascikla elemenata dodatnih komponenti je upisiva + text_rmagick_available: RMagick je dostupan (opciono) + text_destroy_time_entries_question: "%{hours} sati je prijavljeno za ovaj problem koji želite izbrisati. Šta želite da uradite?" + text_destroy_time_entries: Izbriši prijavljene sate + text_assign_time_entries_to_project: Dodeli prijavljene sate projektu + text_reassign_time_entries: 'Dodeli ponovo prijavljene sate ovom problemu:' + text_user_wrote: "%{value} je napisao:" + text_enumeration_destroy_question: "%{count} objekat(a) je dodeljeno ovoj vrednosti." + text_enumeration_category_reassign_to: 'Dodeli ih ponovo ovoj vrednosti:' + text_email_delivery_not_configured: "Isporuka e-poruka nije konfigurisana i obaveštenja su onemogućena.\nPodesite vaš SMTP server u config/configuration.yml i pokrenite ponovo aplikaciju za njihovo omogućavanje." + text_repository_usernames_mapping: "Odaberite ili ažurirajte Redmine korisnike mapiranjem svakog korisničkog imena pronađenog u evidenciji spremišta.\nKorisnici sa istim Redmine imenom i imenom spremišta ili e-adresom su automatski mapirani." + text_diff_truncated: '... Ova razlika je isečena jer je dostignuta maksimalna veličina prikaza.' + text_custom_field_possible_values_info: 'Jedan red za svaku vrednost' + text_wiki_page_destroy_question: "Ova stranica ima %{descendants} podređenih stranica i podstranica. Šta želite da uradite?" + text_wiki_page_nullify_children: "Zadrži podređene stranice kao korene stranice" + text_wiki_page_destroy_children: "Izbriši podređene stranice i sve njihove podstranice" + text_wiki_page_reassign_children: "Dodeli ponovo podređene stranice ovoj matičnoj stranici" + text_own_membership_delete_confirmation: "Nakon uklanjanja pojedinih ili svih vaših dozvola nećete više moći da uređujete ovaj projekat.\nŽelite li da nastavite?" + text_zoom_in: Uvećaj + text_zoom_out: Umanji + + default_role_manager: Menadžer + default_role_developer: Programer + default_role_reporter: Izveštač + default_role_non_member: Non member + default_role_anonymous: Anonymous + default_tracker_bug: Greška + default_tracker_feature: Funkcionalnost + default_tracker_support: Podrška + default_issue_status_new: Novo + default_issue_status_in_progress: U toku + default_issue_status_resolved: Rešeno + default_issue_status_feedback: Povratna informacija + default_issue_status_closed: Zatvoreno + default_issue_status_rejected: Odbijeno + default_doc_category_user: Korisnička dokumentacija + default_doc_category_tech: Tehnička dokumentacija + default_priority_low: Nizak + default_priority_normal: Normalan + default_priority_high: Visok + default_priority_urgent: Hitno + default_priority_immediate: Neposredno + default_activity_design: Dizajn + default_activity_development: Razvoj + + enumeration_issue_priorities: Prioriteti problema + enumeration_doc_categories: Kategorije dokumenta + enumeration_activities: Aktivnosti (praćenje vremena) + enumeration_system_activity: Sistemska aktivnost + + field_time_entries: Vreme evidencije + project_module_gantt: Gantov dijagram + project_module_calendar: Kalendar + button_edit_associated_wikipage: "Edit associated Wiki page: %{page_title}" + text_are_you_sure_with_children: Delete issue and all child issues? + field_text: Text field + label_user_mail_option_only_owner: Only for things I am the owner of + setting_default_notification_option: Default notification option + label_user_mail_option_only_my_events: Only for things I watch or I'm involved in + label_user_mail_option_only_assigned: Only for things I am assigned to + label_user_mail_option_none: No events + field_member_of_group: Assignee's group + field_assigned_to_role: Assignee's role + notice_not_authorized_archived_project: The project you're trying to access has been archived. + label_principal_search: "Search for user or group:" + label_user_search: "Search for user:" + field_visible: Visible + setting_emails_header: Emails header + setting_commit_logtime_activity_id: Activity for logged time + text_time_logged_by_changeset: Applied in changeset %{value}. + setting_commit_logtime_enabled: Enable time logging + notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max}) + setting_gantt_items_limit: Maximum number of items displayed on the gantt chart + text_powered_by: Powered by %{link} label_cvs_module: Module label_filesystem_path: Root directory label_darcs_path: Root directory @@ -946,3 +948,18 @@ sr-YU: label_cvs_path: CVSROOT label_git_path: Path to .git directory label_mercurial_path: Root directory + label_my_queries: My custom queries + label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee + text_journal_changed_no_detail: "%{label} updated" + button_expand_all: Expand all + button_collapse_all: Collapse all + label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author + field_effective_date: Due date + label_news_comment_added: Comment added to a news + field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text + text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page. + text_default_encoding: "Default: UTF-8" + text_git_repo_example: a bare and local repository (e.g. /gitrepo, c:\gitrepo) + label_notify_member_plural: Email issue updates + label_path_encoding: Path encoding + text_mercurial_repo_example: local repository (e.g. /hgrepo, c:\hgrepo) diff --git a/config/locales/sr.yml b/config/locales/sr.yml index 9ea33b65..77403621 100644 --- a/config/locales/sr.yml +++ b/config/locales/sr.yml @@ -10,15 +10,18 @@ sr: default: "%d.%m.%Y." short: "%e %b" long: "%B %e, %Y" - + day_names: [недеља, понедељак, уторак, среда, четвртак, петак, субота] abbr_day_names: [нед, пон, уто, сре, чет, пет, суб] - + # Don't forget the nil at the beginning; there's no such thing as a 0th month month_names: [~, јануар, фебруар, март, април, мај, јун, јул, август, септембар, октобар, новембар, децембар] abbr_month_names: [~, јан, феб, мар, апр, мај, јун, јул, авг, сеп, окт, нов, дец] # Used in date_select and datime_select. - order: [ :day, :month, :year ] + order: + - :day + - :month + - :year time: formats: @@ -92,7 +95,7 @@ sr: array: sentence_connector: "и" skip_last_comma: false - + activerecord: errors: template: @@ -126,7 +129,7 @@ sr: cant_link_an_issue_with_a_descendant: "Проблем не може бити повезан са једним од својих подзадатака" actionview_instancetag_blank_option: Молим одаберите - + general_text_No: 'Не' general_text_Yes: 'Да' general_text_no: 'не' @@ -137,7 +140,7 @@ sr: general_csv_encoding: UTF-8 general_pdf_encoding: UTF-8 general_first_day_of_week: '1' - + notice_account_updated: Налог је успешно ажуриран. notice_account_invalid_creditentials: Неисправно корисничко име или лозинка. notice_account_password_updated: Лозинка је успешно ажурирана. @@ -166,7 +169,7 @@ sr: notice_unable_delete_version: Верзију је немогуће избрисати. notice_unable_delete_time_entry: Ставку евиденције времена је немогуће избрисати. notice_issue_done_ratios_updated: Однос решених проблема је ажуриран. - + error_can_t_load_default_data: "Подразумевано конфигурисање је немогуће учитати: %{value}" error_scm_not_found: "Ставка или исправка нису пронађене у спремишту." error_scm_command_failed: "Грешка се јавила приликом покушаја приступа спремишту: %{value}" @@ -183,9 +186,9 @@ sr: error_workflow_copy_source: 'Молимо одаберите изворно праћење или улогу' error_workflow_copy_target: 'Молимо одаберите одредишно праћење и улогу' error_unable_delete_issue_status: 'Статус проблема је немогуће обрисати' - error_unable_to_connect: "Повезивање са (%{value}) је немогуће" + error_unable_to_connect: "Повезивање са (%{value}) је немогуће" warning_attachments_not_saved: "%{count} датотека не може бити снимљена." - + mail_subject_lost_password: "Ваша %{value} лозинка" mail_body_lost_password: 'За промену ваше лозинке, кликните на следећи линк:' mail_subject_register: "Активација вашег %{value} налога" @@ -200,10 +203,10 @@ sr: mail_body_wiki_content_added: "%{author} је додао wiki страницу '%{id}'." mail_subject_wiki_content_updated: "Wiki страница '%{id}' је ажурирана" mail_body_wiki_content_updated: "%{author} је ажурирао wiki страницу '%{id}'." - + gui_validation_error: једна грешка gui_validation_error_plural: "%{count} грешака" - + field_name: Назив field_description: Опис field_summary: Резиме @@ -250,7 +253,6 @@ sr: field_admin: Администратор field_last_login_on: Последње повезивање field_language: Језик - field_effective_date: Датум field_password: Лозинка field_new_password: Нова лозинка field_password_confirmation: Потврда лозинке @@ -266,7 +268,7 @@ sr: field_attr_mail: Атрибут е-адресе field_onthefly: Креирање корисника у току рада field_start_date: Почетак - field_done_ratio: % урађено + field_done_ratio: "% урађено" field_auth_source: Режим потврде идентитета field_hide_mail: Сакриј моју е-адресу field_comments: Коментар @@ -296,7 +298,7 @@ sr: field_group_by: Груписање резултата по field_sharing: Дељење field_parent_issue: Матични задатак - + setting_app_title: Наслов апликације setting_app_subtitle: Поднаслов апликације setting_welcome_text: Текст добродошлице @@ -350,7 +352,7 @@ sr: setting_start_of_week: Први дан у седмици setting_rest_api_enabled: Омогући REST web услуге setting_cache_formatted_text: Кеширање обрађеног текста - + permission_add_project: Креирање пројекта permission_add_subprojects: Креирање потпојекта permission_edit_project: Измена пројеката @@ -406,7 +408,7 @@ sr: permission_delete_own_messages: Брисање сопствених порука permission_export_wiki_pages: Извоз wiki страница permission_manage_subtasks: Управљање подзадацима - + project_module_issue_tracking: Праћење проблема project_module_time_tracking: Праћење времена project_module_news: Вести @@ -415,7 +417,7 @@ sr: project_module_wiki: Wiki project_module_repository: Спремиште project_module_boards: Форуми - + label_user: Корисник label_user_plural: Корисници label_user_new: Нови корисник @@ -772,8 +774,8 @@ sr: label_api_access_key_created_on: "API приступни кључ је креиран пре %{value}" label_profile: Профил label_subtask_plural: Подзадатак - label_project_copy_notifications: Пошаљи е-поруку са обавештењем приликом копирања пројекта - + label_project_copy_notifications: Пошаљи е-поруку са обавештењем приликом копирања пројекта + button_login: Пријава button_submit: Пошаљи button_save: Сними @@ -817,17 +819,17 @@ sr: button_quote: Под наводницима button_duplicate: Дуплирај button_show: Прикажи - + status_active: активни status_registered: регистровани status_locked: закључани - + version_status_open: отворен version_status_locked: закључан version_status_closed: затворен field_active: Активан - + text_select_mail_notifications: Одабери акције за које ће обавештење бити послато путем е-поште. text_regexp_info: нпр. ^[A-Z0-9]+$ text_min_max_length_info: 0 значи без ограничења @@ -885,7 +887,7 @@ sr: text_own_membership_delete_confirmation: "Након уклањања појединих или свих ваших дозвола нећете више моћи да уређујете овај пројекат.\nЖелите ли да наставите?" text_zoom_in: Увећај text_zoom_out: Умањи - + default_role_manager: Менаџер default_role_developer: Програмер default_role_reporter: Извештач @@ -909,12 +911,12 @@ sr: default_priority_immediate: Непосредно default_activity_design: Дизајн default_activity_development: Развој - + enumeration_issue_priorities: Приоритети проблема enumeration_doc_categories: Категорије документа enumeration_activities: Активности (праћење времена) enumeration_system_activity: Системска активност - + field_time_entries: Време евиденције project_module_gantt: Гантов дијаграм project_module_calendar: Календар @@ -947,3 +949,18 @@ sr: label_cvs_path: CVSROOT label_git_path: Path to .git directory label_mercurial_path: Root directory + label_my_queries: My custom queries + label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee + text_journal_changed_no_detail: "%{label} updated" + button_expand_all: Expand all + button_collapse_all: Collapse all + label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author + field_effective_date: Due date + label_news_comment_added: Comment added to a news + field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text + text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page. + text_default_encoding: "Default: UTF-8" + text_git_repo_example: a bare and local repository (e.g. /gitrepo, c:\gitrepo) + label_notify_member_plural: Email issue updates + label_path_encoding: Path encoding + text_mercurial_repo_example: local repository (e.g. /hgrepo, c:\hgrepo) diff --git a/config/locales/sv.yml b/config/locales/sv.yml index cda64c85..d034af42 100644 --- a/config/locales/sv.yml +++ b/config/locales/sv.yml @@ -13,7 +13,7 @@ sv: delimiter: "." # Number of decimals, behind the separator (the number 1 with a precision of 2 gives: 1.00) precision: 2 - + # Used in number_to_currency() currency: format: @@ -24,15 +24,15 @@ sv: # separator: "." # delimiter: "," # precision: 2 - + # Used in number_to_percentage() percentage: format: # These three are to override number.format and are optional - # separator: + # separator: delimiter: "" - # precision: - + # precision: + # Used in number_to_precision() precision: format: @@ -40,12 +40,12 @@ sv: # separator: delimiter: "" # precision: - + # Used in number_to_human_size() human: format: # These three are to override number.format and are optional - # separator: + # separator: delimiter: "" # precision: 1 storage_units: @@ -96,7 +96,7 @@ sv: almost_x_years: one: "nästan 1 år" other: "nästan %{count} år" - + activerecord: errors: template: @@ -141,15 +141,18 @@ sv: default: "%Y-%m-%d" short: "%e %b" long: "%e %B, %Y" - + day_names: [söndag, måndag, tisdag, onsdag, torsdag, fredag, lördag] abbr_day_names: [sön, mån, tis, ons, tor, fre, lör] - + # Don't forget the nil at the beginning; there's no such thing as a 0th month month_names: [~, januari, februari, mars, april, maj, juni, juli, augusti, september, oktober, november, december] abbr_month_names: [~, jan, feb, mar, apr, maj, jun, jul, aug, sep, okt, nov, dec] # Used in date_select and datime_select. - order: [ :day, :month, :year ] + order: + - :day + - :month + - :year time: formats: @@ -159,7 +162,7 @@ sv: long: "%d %B, %Y %H:%M" am: "" pm: "" - + # Used in array.to_sentence. support: array: @@ -167,7 +170,7 @@ sv: skip_last_comma: true actionview_instancetag_blank_option: Var god välj - + general_text_No: 'Nej' general_text_Yes: 'Ja' general_text_no: 'nej' @@ -178,7 +181,7 @@ sv: general_csv_encoding: ISO-8859-1 general_pdf_encoding: ISO-8859-1 general_first_day_of_week: '1' - + notice_account_updated: Kontot har uppdaterats notice_account_invalid_creditentials: Fel användarnamn eller lösenord notice_account_password_updated: Lösenordet har uppdaterats @@ -207,9 +210,9 @@ sv: notice_default_data_loaded: Standardkonfiguration inläst. notice_unable_delete_version: Denna version var inte möjlig att ta bort. notice_unable_delete_time_entry: Tidloggning kunde inte tas bort. - notice_issue_done_ratios_updated: % klart uppdaterade. + notice_issue_done_ratios_updated: "% klart uppdaterade." notice_gantt_chart_truncated: "Schemat förminskades eftersom det överskrider det maximala antalet aktiviteter som får visas (%{max})" - + error_can_t_load_default_data: "Standardkonfiguration gick inte att läsa in: %{value}" error_scm_not_found: "Inlägg och/eller revision finns inte i detta versionsarkiv." error_scm_command_failed: "Ett fel inträffade vid försök att nå versionsarkivet: %{value}" @@ -227,9 +230,9 @@ sv: error_workflow_copy_target: 'Vänligen välj ärendetyp(er) och roll(er) för mål' error_unable_delete_issue_status: 'Ärendestatus kunde inte tas bort' error_unable_to_connect: "Kan inte ansluta (%{value})" - + warning_attachments_not_saved: "%{count} fil(er) kunde inte sparas." - + mail_subject_lost_password: "Ditt %{value} lösenord" mail_body_lost_password: 'För att ändra ditt lösenord, klicka på följande länk:' mail_subject_register: "Din %{value} kontoaktivering" @@ -244,10 +247,10 @@ sv: mail_body_wiki_content_added: "The '%{id}' wikisida has lagts till av %{author}." mail_subject_wiki_content_updated: "'%{id}' wikisida har uppdaterats" mail_body_wiki_content_updated: "The '%{id}' wikisida har uppdaterats av %{author}." - + gui_validation_error: 1 fel gui_validation_error_plural: "%{count} fel" - + field_name: Namn field_description: Beskrivning field_summary: Sammanfattning @@ -294,7 +297,6 @@ sv: field_admin: Administratör field_last_login_on: Senaste inloggning field_language: Språk - field_effective_date: Datum field_password: Lösenord field_new_password: Nytt lösenord field_password_confirmation: Bekräfta lösenord @@ -310,7 +312,7 @@ sv: field_attr_mail: Mailattribut field_onthefly: Skapa användare on-the-fly field_start_date: Startdatum - field_done_ratio: % Klart + field_done_ratio: "% Klart" field_auth_source: Autentiseringsläge field_hide_mail: Dölj min mailadress field_comments: Kommentar @@ -335,7 +337,7 @@ sv: field_comments_sorting: Visa kommentarer field_parent_title: Föräldersida field_editable: Redigerbar - field_watcher: Bevakare + field_watcher: Bevakare field_identity_url: OpenID URL field_content: Innehåll field_group_by: Gruppera resultat efter @@ -345,7 +347,8 @@ sv: field_assigned_to_role: "Tilldelad användares roll" field_text: Textfält field_visible: Synlig - + field_warn_on_leaving_unsaved: Varna om jag lämnar en sida med osparad text + setting_app_title: Applikationsrubrik setting_app_subtitle: Applikationsunderrubrik setting_welcome_text: Välkomsttext @@ -404,7 +407,7 @@ sv: setting_commit_logtime_enabled: Aktivera tidloggning setting_commit_logtime_activity_id: Aktivitet för loggad tid setting_gantt_items_limit: Maximalt antal aktiviteter som visas i gantt-schemat - + permission_add_project: Skapa projekt permission_add_subprojects: Skapa underprojekt permission_edit_project: Ändra projekt @@ -460,7 +463,7 @@ sv: permission_delete_own_messages: Ta bort egna meddelanden permission_export_wiki_pages: Exportera wikisidor permission_manage_subtasks: Hantera underaktiviteter - + project_module_issue_tracking: Ärendeuppföljning project_module_time_tracking: Tidsuppföljning project_module_news: Nyheter @@ -471,7 +474,7 @@ sv: project_module_boards: Forum project_module_calendar: Kalender project_module_gantt: Gantt - + label_user: Användare label_user_plural: Användare label_user_new: Ny användare @@ -636,6 +639,7 @@ sv: label_query: Användardefinerad fråga label_query_plural: Användardefinerade frågor label_query_new: Ny fråga + label_my_queries: Mina egna frågor label_filter_add: Lägg till filter label_filter_plural: Filter label_equals: är @@ -835,7 +839,7 @@ sv: label_project_copy_notifications: Skicka mailnotifieringar när projektet kopieras label_principal_search: "Sök efter användare eller grupp:" label_user_search: "Sök efter användare:" - + button_login: Logga in button_submit: Skicka button_save: Spara @@ -880,17 +884,17 @@ sv: button_quote: Citera button_duplicate: Duplicera button_show: Visa - + status_active: aktiv status_registered: registrerad status_locked: låst - + version_status_open: öppen version_status_locked: låst version_status_closed: stängd - + field_active: Aktiv - + text_select_mail_notifications: Välj för vilka händelser mail ska skickas. text_regexp_info: eg. ^[A-Z0-9]+$ text_min_max_length_info: 0 betyder ingen gräns @@ -900,6 +904,7 @@ sv: text_are_you_sure: Är du säker ? text_are_you_sure_with_children: Ta bort ärende och alla underärenden? text_journal_changed: "%{label} ändrad från %{old} till %{new}" + text_journal_changed_no_detail: "%{label} uppdaterad" text_journal_set_to: "%{label} satt till %{value}" text_journal_deleted: "%{label} borttagen (%{old})" text_journal_added: "%{label} %{value} tillagd" @@ -950,7 +955,8 @@ sv: text_own_membership_delete_confirmation: "Några av, eller alla, dina behörigheter kommer att tas bort och du kanske inte längre kommer kunna göra ändringar i det här projektet.\nVill du verkligen fortsätta?" text_zoom_out: Zooma ut text_zoom_in: Zooma in - + text_warn_on_leaving_unsaved: Nuvarande sida innehåller osparad text som kommer försvinna om du lämnar sidan. + default_role_manager: Projektledare default_role_developer: Utvecklare default_role_reporter: Rapportör @@ -974,7 +980,7 @@ sv: default_priority_immediate: Omedelbar default_activity_design: Design default_activity_development: Utveckling - + enumeration_issue_priorities: Ärendeprioriteter enumeration_doc_categories: Dokumentkategorier enumeration_activities: Aktiviteter (tidsuppföljning) @@ -987,3 +993,15 @@ sv: label_cvs_path: CVSROOT label_git_path: Path to .git directory label_mercurial_path: Root directory + + label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee + button_expand_all: Expand all + button_collapse_all: Collapse all + label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author + field_effective_date: Due date + label_news_comment_added: Comment added to a news + text_default_encoding: "Default: UTF-8" + text_git_repo_example: a bare and local repository (e.g. /gitrepo, c:\gitrepo) + label_notify_member_plural: Email issue updates + label_path_encoding: Path encoding + text_mercurial_repo_example: local repository (e.g. /hgrepo, c:\hgrepo) diff --git a/config/locales/th.yml b/config/locales/th.yml index 5f174307..86b45445 100644 --- a/config/locales/th.yml +++ b/config/locales/th.yml @@ -8,15 +8,18 @@ th: default: "%Y-%m-%d" short: "%b %d" long: "%B %d, %Y" - + day_names: [Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday] abbr_day_names: [Sun, Mon, Tue, Wed, Thu, Fri, Sat] - + # Don't forget the nil at the beginning; there's no such thing as a 0th month month_names: [~, January, February, March, April, May, June, July, August, September, October, November, December] abbr_month_names: [~, Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec] # Used in date_select and datime_select. - order: [ :year, :month, :day ] + order: + - :year + - :month + - :day time: formats: @@ -26,7 +29,7 @@ th: long: "%B %d, %Y %H:%M" am: "am" pm: "pm" - + datetime: distance_in_words: half_a_minute: "half a minute" @@ -69,27 +72,27 @@ th: separator: "." delimiter: "" precision: 3 - human: - format: + human: + format: precision: 1 delimiter: "" - storage_units: + storage_units: format: "%n %u" - units: + units: kb: KB tb: TB gb: GB - byte: + byte: one: Byte other: Bytes mb: MB - + # Used in array.to_sentence. support: array: sentence_connector: "and" skip_last_comma: false - + activerecord: errors: template: @@ -123,7 +126,7 @@ th: cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks" actionview_instancetag_blank_option: กรุณาเลือก - + general_text_No: 'ไม่' general_text_Yes: 'ใช่' general_text_no: 'ไม่' @@ -134,7 +137,7 @@ th: general_csv_encoding: Windows-874 general_pdf_encoding: cp874 general_first_day_of_week: '1' - + notice_account_updated: บัญชีได้ถูกปรับปรุงแล้ว. notice_account_invalid_creditentials: ชื้ผู้ใช้หรือรหัสผ่านไม่ถูกต้อง notice_account_password_updated: รหัสได้ถูกปรับปรุงแล้ว. @@ -158,13 +161,13 @@ th: notice_no_issue_selected: "ไม่มีปัญหาที่ถูกเลือก! กรุณาเลือกปัญหาที่คุณต้องการแก้ไข." notice_account_pending: "บัญชีของคุณสร้างเสร็จแล้ว ขณะนี้รอการอนุมัติจากผู้บริหารจัดการ." notice_default_data_loaded: ค่าเริ่มต้นโหลดเสร็จแล้ว. - + error_can_t_load_default_data: "ค่าเริ่มต้นโหลดไม่สำเร็จ: %{value}" error_scm_not_found: "ไม่พบรุ่นที่ต้องการในแหล่งเก็บต้นฉบับ." error_scm_command_failed: "เกิดความผิดพลาดในการเข้าถึงแหล่งเก็บต้นฉบับ: %{value}" error_scm_annotate: "entry ไม่มีอยู่จริง หรือไม่สามารถเขียนหมายเหตุประกอบ." error_issue_not_found_in_project: 'ไม่พบปัญหานี้ หรือปัญหาไม่ได้อยู่ในโครงการนี้' - + mail_subject_lost_password: "รหัสผ่าน %{value} ของคุณ" mail_body_lost_password: 'คลิ๊กที่ลิงค์ต่อไปนี้เพื่อเปลี่ยนรหัสผ่าน:' mail_subject_register: "เปิดบัญชี %{value} ของคุณ" @@ -173,10 +176,10 @@ th: mail_body_account_information: ข้อมูลบัญชีของคุณ mail_subject_account_activation_request: "กรุณาเปิดบัญชี %{value}" mail_body_account_activation_request: "ผู้ใช้ใหม่ (%{value}) ได้ลงทะเบียน. บัญชีของเขากำลังรออนุมัติ:" - + gui_validation_error: 1 ข้อผิดพลาด gui_validation_error_plural: "%{count} ข้อผิดพลาด" - + field_name: ชื่อ field_description: รายละเอียด field_summary: สรุปย่อ @@ -222,7 +225,6 @@ th: field_admin: ผู้บริหารจัดการ field_last_login_on: เข้าระบบครั้งสุดท้าย field_language: ภาษา - field_effective_date: วันที่ field_password: รหัสผ่าน field_new_password: รหัสผ่านใหม่ field_password_confirmation: ยืนยันรหัสผ่าน @@ -238,7 +240,7 @@ th: field_attr_mail: อีเมล์ attribute field_onthefly: สร้างผู้ใช้ทันที field_start_date: เริ่ม - field_done_ratio: % สำเร็จ + field_done_ratio: "% สำเร็จ" field_auth_source: วิธีการยืนยันตัวตน field_hide_mail: ซ่อนอีเมล์ของฉัน field_comments: ความเห็น @@ -260,7 +262,7 @@ th: field_searchable: ค้นหาได้ field_default_value: ค่าเริ่มต้น field_comments_sorting: แสดงความเห็น - + setting_app_title: ชื่อโปรแกรม setting_app_subtitle: ชื่อโปรแกรมรอง setting_welcome_text: ข้อความต้อนรับ @@ -292,7 +294,7 @@ th: setting_user_format: รูปแบบการแสดงชื่อผู้ใช้ setting_activity_days_default: จำนวนวันที่แสดงในกิจกรรมของโครงการ setting_display_subprojects_issues: แสดงปัญหาของโครงการย่อยในโครงการหลัก - + project_module_issue_tracking: การติดตามปัญหา project_module_time_tracking: การใช้เวลา project_module_news: ข่าว @@ -301,7 +303,7 @@ th: project_module_wiki: Wiki project_module_repository: ที่เก็บต้นฉบับ project_module_boards: กระดานข้อความ - + label_user: ผู้ใช้ label_user_plural: ผู้ใช้ label_user_new: ผู้ใช้ใหม่ @@ -608,7 +610,7 @@ th: label_chronological_order: เรียงจากเก่าไปใหม่ label_reverse_chronological_order: เรียงจากใหม่ไปเก่า label_planning: การวางแผน - + button_login: เข้าระบบ button_submit: จัดส่งข้อมูล button_save: จัดเก็บ @@ -646,11 +648,11 @@ th: button_annotate: หมายเหตุประกอบ button_update: ปรับปรุง button_configure: ปรับแต่ง - + status_active: เปิดใช้งานแล้ว status_registered: รอการอนุมัติ status_locked: ล็อค - + text_select_mail_notifications: เลือกการกระทำที่ต้องการให้ส่งอีเมล์แจ้ง. text_regexp_info: ตัวอย่าง ^[A-Z0-9]+$ text_min_max_length_info: 0 หมายถึงไม่จำกัด @@ -688,7 +690,7 @@ th: text_destroy_time_entries: ลบเวลาที่รายงานไว้ text_assign_time_entries_to_project: ระบุเวลาที่ใช้ในโครงการนี้ text_reassign_time_entries: 'ระบุเวลาที่ใช้ในโครงการนี่อีกครั้ง:' - + default_role_manager: ผู้จัดการ default_role_developer: ผู้พัฒนา default_role_reporter: ผู้รายงาน @@ -712,7 +714,7 @@ th: default_priority_immediate: ด่วนมาก default_activity_design: ออกแบบ default_activity_development: พัฒนา - + enumeration_issue_priorities: ความสำคัญของปัญหา enumeration_doc_categories: ประเภทเอกสาร enumeration_activities: กิจกรรม (ใช้ในการติดตามเวลา) @@ -943,3 +945,18 @@ th: label_cvs_path: CVSROOT label_git_path: Path to .git directory label_mercurial_path: Root directory + label_my_queries: My custom queries + label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee + text_journal_changed_no_detail: "%{label} updated" + button_expand_all: Expand all + button_collapse_all: Collapse all + label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author + field_effective_date: Due date + label_news_comment_added: Comment added to a news + field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text + text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page. + text_default_encoding: "Default: UTF-8" + text_git_repo_example: a bare and local repository (e.g. /gitrepo, c:\gitrepo) + label_notify_member_plural: Email issue updates + label_path_encoding: Path encoding + text_mercurial_repo_example: local repository (e.g. /hgrepo, c:\hgrepo) diff --git a/config/locales/tr.yml b/config/locales/tr.yml index 1e698213..368bc7ae 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -1,4 +1,4 @@ -# Turkish translations for Ruby on Rails +# Turkish translations for Ruby on Rails # by Ozgun Ataman (ozataman@gmail.com) tr: @@ -18,8 +18,11 @@ tr: abbr_day_names: [Pzr, Pzt, Sal, Çrş, Prş, Cum, Cts] month_names: [~, Ocak, Şubat, Mart, Nisan, Mayıs, Haziran, Temmuz, Ağustos, Eylül, Ekim, Kasım, Aralık] abbr_month_names: [~, Oca, Şub, Mar, Nis, May, Haz, Tem, Ağu, Eyl, Eki, Kas, Ara] - order: [ :day, :month, :year ] - + order: + - :day + - :month + - :year + time: formats: default: "%a %d.%b.%y %H:%M" @@ -30,7 +33,7 @@ tr: am: "öğleden önce" pm: "öğleden sonra" - + datetime: distance_in_words: half_a_minute: 'yarım dakika' @@ -69,7 +72,7 @@ tr: almost_x_years: one: "almost 1 year" other: "almost %{count} years" - + number: format: precision: 2 @@ -111,7 +114,7 @@ tr: array: sentence_connector: "ve" skip_last_comma: true - + activerecord: errors: template: @@ -145,9 +148,9 @@ tr: circular_dependency: "Bu ilişki döngüsel bağımlılık meydana getirecektir" cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks" models: - + actionview_instancetag_blank_option: Lütfen Seçin - + general_text_No: 'Hayır' general_text_Yes: 'Evet' general_text_no: 'hayır' @@ -157,7 +160,7 @@ tr: general_csv_encoding: ISO-8859-1 general_pdf_encoding: ISO-8859-1 general_first_day_of_week: '7' - + notice_account_updated: Hesap başarıyla güncelleştirildi. notice_account_invalid_creditentials: Geçersiz kullanıcı ya da parola notice_account_password_updated: Parola başarıyla güncellendi. @@ -181,13 +184,13 @@ tr: notice_no_issue_selected: "Seçili ileti yok! Lütfen, düzenlemek istediğiniz iletileri işaretleyin." notice_account_pending: "Hesabınız oluşturuldu ve yönetici onayı bekliyor." notice_default_data_loaded: Varasayılan konfigürasyon başarılıyla yüklendi. - + error_can_t_load_default_data: "Varsayılan konfigürasyon yüklenemedi: %{value}" error_scm_not_found: "Depoda, giriş ya da revizyon yok." error_scm_command_failed: "Depoya erişmeye çalışırken bir hata meydana geldi: %{value}" error_scm_annotate: "Giriş mevcut değil veya izah edilemedi." error_issue_not_found_in_project: 'İleti bilgisi bulunamadı veya bu projeye ait değil' - + mail_subject_lost_password: "Parolanız %{value}" mail_body_lost_password: 'Parolanızı değiştirmek için, aşağıdaki bağlantıya tıklayın:' mail_subject_register: "Your %{value} hesap aktivasyonu" @@ -196,10 +199,10 @@ tr: mail_body_account_information: Hesap bilgileriniz mail_subject_account_activation_request: "%{value} hesabı etkinleştirme isteği" mail_body_account_activation_request: "Yeni bir kullanıcı (%{value}) kaydedildi. Hesap onaylanmayı bekliyor:" - + gui_validation_error: 1 hata gui_validation_error_plural: "%{count} hata" - + field_name: İsim field_description: Açıklama field_summary: Özet @@ -245,7 +248,6 @@ tr: field_admin: Yönetici field_last_login_on: Son Bağlantı field_language: Dil - field_effective_date: Tarih field_password: Parola field_new_password: Yeni Parola field_password_confirmation: Onay @@ -261,7 +263,7 @@ tr: field_attr_mail: E-Posta Niteliği field_onthefly: Anında kullanıcı oluşturma field_start_date: Başlangıç - field_done_ratio: % tamamlandı + field_done_ratio: "% tamamlandı " field_auth_source: Kimlik Denetim Modu field_hide_mail: E-posta adresimi gizle field_comments: Açıklama @@ -283,7 +285,7 @@ tr: field_searchable: Aranabilir field_default_value: Varsayılan değer field_comments_sorting: Açıklamaları göster - + setting_app_title: Uygulama Bağlığı setting_app_subtitle: Uygulama alt başlığı setting_welcome_text: Hoşgeldin Mesajı @@ -315,7 +317,7 @@ tr: setting_user_format: Kullanıcı gösterim formatı setting_activity_days_default: Proje Faaliyetlerinde gösterilen gün sayısı setting_display_subprojects_issues: Varsayılan olarak ana projenin ileti listesinde alt proje iletilerini göster - + project_module_issue_tracking: İleti Takibi project_module_time_tracking: Zaman Takibi project_module_news: Haberler @@ -324,7 +326,7 @@ tr: project_module_wiki: Wiki project_module_repository: Depo project_module_boards: Tartışma Alanı - + label_user: Kullanıcı label_user_plural: Kullanıcılar label_user_new: Yeni Kullanıcı @@ -629,7 +631,7 @@ tr: label_chronological_order: Tarih sırasına göre label_reverse_chronological_order: Ters tarih sırasına göre label_planning: Planlanıyor - + button_login: Giriş button_submit: Gönder button_save: Kaydet @@ -667,11 +669,11 @@ tr: button_annotate: Revizyon geçmişine göre göster button_update: Güncelle button_configure: Yapılandır - + status_active: faal status_registered: kayıtlı status_locked: kilitli - + text_select_mail_notifications: Gönderilecek e-posta uyarısına göre hareketi seçin. text_regexp_info: eg. ^[A-Z0-9]+$ text_min_max_length_info: 0 sınırlama yok demektir @@ -709,7 +711,7 @@ tr: text_destroy_time_entries: Raporlanmış saatleri sil text_assign_time_entries_to_project: Raporlanmış saatleri projeye ata text_reassign_time_entries: 'Raporlanmış saatleri bu iletiye tekrar ata:' - + default_role_manager: Yönetici default_role_developer: Geliştirici default_role_reporter: Raporlayıcı @@ -733,7 +735,7 @@ tr: default_priority_immediate: Derhal default_activity_design: Tasarım default_activity_development: Geliştirim - + enumeration_issue_priorities: İleti önceliği enumeration_doc_categories: Belge Kategorileri enumeration_activities: Faaliyetler (zaman takibi) @@ -965,3 +967,18 @@ tr: label_cvs_path: CVSROOT label_git_path: Path to .git directory label_mercurial_path: Root directory + label_my_queries: My custom queries + label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee + text_journal_changed_no_detail: "%{label} updated" + button_expand_all: Expand all + button_collapse_all: Collapse all + label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author + field_effective_date: Due date + label_news_comment_added: Comment added to a news + field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text + text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page. + text_default_encoding: "Default: UTF-8" + text_git_repo_example: a bare and local repository (e.g. /gitrepo, c:\gitrepo) + label_notify_member_plural: Email issue updates + label_path_encoding: Path encoding + text_mercurial_repo_example: local repository (e.g. /hgrepo, c:\hgrepo) diff --git a/config/locales/uk.yml b/config/locales/uk.yml index bfa62a60..c7d0f7a3 100644 --- a/config/locales/uk.yml +++ b/config/locales/uk.yml @@ -8,15 +8,18 @@ uk: default: "%Y-%m-%d" short: "%b %d" long: "%B %d, %Y" - + day_names: [Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday] abbr_day_names: [Sun, Mon, Tue, Wed, Thu, Fri, Sat] - + # Don't forget the nil at the beginning; there's no such thing as a 0th month month_names: [~, January, February, March, April, May, June, July, August, September, October, November, December] abbr_month_names: [~, Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec] # Used in date_select and datime_select. - order: [ :year, :month, :day ] + order: + - :year + - :month + - :day time: formats: @@ -26,7 +29,7 @@ uk: long: "%B %d, %Y %H:%M" am: "am" pm: "pm" - + datetime: distance_in_words: half_a_minute: "half a minute" @@ -64,32 +67,32 @@ uk: one: "almost 1 year" other: "almost %{count} years" - number: + number: format: separator: "." delimiter: "" precision: 3 - human: - format: + human: + format: precision: 1 delimiter: "" - storage_units: + storage_units: format: "%n %u" - units: + units: kb: KB tb: TB gb: GB - byte: + byte: one: Byte other: Bytes mb: MB - + # Used in array.to_sentence. support: array: sentence_connector: "and" skip_last_comma: false - + activerecord: errors: template: @@ -123,7 +126,7 @@ uk: cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks" actionview_instancetag_blank_option: Оберіть - + general_text_No: 'Ні' general_text_Yes: 'Так' general_text_no: 'Ні' @@ -134,7 +137,7 @@ uk: general_csv_encoding: UTF-8 general_pdf_encoding: UTF-8 general_first_day_of_week: '1' - + notice_account_updated: Обліковий запис успішно оновлений. notice_account_invalid_creditentials: Неправильне ім'я користувача або пароль notice_account_password_updated: Пароль успішно оновлений. @@ -158,7 +161,7 @@ uk: notice_failed_to_save_issues: "Не вдалося зберегти %{count} пункт(ів) з %{total} вибраних: %{ids}." notice_no_issue_selected: "Не вибрано жодної задачі! Будь ласка, відзначте задачу, яку ви хочете відредагувати." notice_account_pending: "Ваш обліковий запис створено і він чекає на підтвердження адміністратором." - + mail_subject_lost_password: "Ваш %{value} пароль" mail_body_lost_password: 'Для зміни пароля, зайдіть за наступним посиланням:' mail_subject_register: "Активація облікового запису %{value}" @@ -167,10 +170,10 @@ uk: mail_body_account_information: Інформація по Вашому обліковому запису mail_subject_account_activation_request: "Запит на активацію облікового запису %{value}" mail_body_account_activation_request: "Новий користувач (%{value}) зареєструвався. Його обліковий запис чекає на ваше підтвердження:" - + gui_validation_error: 1 помилка gui_validation_error_plural: "%{count} помилки(ок)" - + field_name: Ім'я field_description: Опис field_summary: Короткий опис @@ -188,8 +191,8 @@ uk: field_is_for_all: Для усіх проектів field_possible_values: Можливі значення field_regexp: Регулярний вираз - field_min_length: Мінімальна довжина - field_max_length: Максимальна довжина + field_min_length: Мінімальна довжина + field_max_length: Максимальна довжина field_value: Значення field_category: Категорія field_title: Назва @@ -211,12 +214,11 @@ uk: field_is_public: Публічний field_parent: Підпроект field_is_in_roadmap: Питання, що відображаються в оперативному плані - field_login: Вхід + field_login: Вхід field_mail_notification: Повідомлення за електронною поштою - field_admin: Адміністратор + field_admin: Адміністратор field_last_login_on: Останнє підключення field_language: Мова - field_effective_date: Дата field_password: Пароль field_new_password: Новий пароль field_password_confirmation: Підтвердження @@ -232,7 +234,7 @@ uk: field_attr_mail: Атрибут Email field_onthefly: Створення користувача на льоту field_start_date: Початок - field_done_ratio: % зроблено + field_done_ratio: "% зроблено" field_auth_source: Режим аутентифікації field_hide_mail: Приховувати мій email field_comments: Коментар @@ -252,7 +254,7 @@ uk: field_column_names: Колонки field_time_zone: Часовий пояс field_searchable: Вживається у пошуку - + setting_app_title: Назва додатку setting_app_subtitle: Підзаголовок додатку setting_welcome_text: Текст привітання @@ -279,7 +281,7 @@ uk: setting_repositories_encodings: Кодування репозиторія setting_emails_footer: Підпис до електронної пошти setting_protocol: Протокол - + label_user: Користувач label_user_plural: Користувачі label_user_new: Новий користувач @@ -402,15 +404,15 @@ uk: label_total: Всього label_permissions: Права доступу label_current_status: Поточний статус - label_new_statuses_allowed: Дозволені нові статуси + label_new_statuses_allowed: Дозволені нові статуси label_all: Усі label_none: Нікому label_nobody: Ніхто label_next: Наступний label_previous: Попередній - label_used_by: Використовується + label_used_by: Використовується label_details: Подробиці - label_add_note: Додати зауваження + label_add_note: Додати зауваження label_per_page: На сторінку label_calendar: Календар label_months_from: місяців(ця) з @@ -440,8 +442,8 @@ uk: label_in: у label_today: сьогодні label_this_week: цього тижня - label_less_than_ago: менш ніж днів(я) назад - label_more_than_ago: більш ніж днів(я) назад + label_less_than_ago: менш ніж днів(я) назад + label_more_than_ago: більш ніж днів(я) назад label_ago: днів(я) назад label_contains: містить label_not_contains: не містить @@ -453,7 +455,7 @@ uk: label_revision: Версія label_revision_plural: Версій label_added: додано - label_modified: змінене + label_modified: змінене label_deleted: видалено label_latest_revision: Остання версія label_latest_revision_plural: Останні версії @@ -468,11 +470,11 @@ uk: label_roadmap_overdue: "%{value} запізнення" label_roadmap_no_issues: Немає питань для даної версії label_search: Пошук - label_result_plural: Результати + label_result_plural: Результати label_all_words: Всі слова label_wiki: Wiki label_wiki_edit: Редагування Wiki - label_wiki_edit_plural: Редагування Wiki + label_wiki_edit_plural: Редагування Wiki label_wiki_page: Сторінка Wiki label_wiki_page_plural: Сторінки Wiki label_index_by_title: Індекс за назвою @@ -480,7 +482,7 @@ uk: label_current_version: Поточна версія label_preview: Попередній перегляд label_feed_plural: Подання - label_changes_details: Подробиці по всіх змінах + label_changes_details: Подробиці по всіх змінах label_issue_tracking: Координація питань label_spent_time: Витрачений час label_f_hour: "%{value} година" @@ -489,7 +491,7 @@ uk: label_change_plural: Зміни label_statistics: Статистика label_commits_per_month: Подань на місяць - label_commits_per_author: Подань на користувача + label_commits_per_author: Подань на користувача label_view_diff: Проглянути відмінності label_diff_inline: підключений label_diff_side_by_side: поряд @@ -505,7 +507,7 @@ uk: label_relates_to: пов'язане з label_duplicates: дублює label_blocks: блокує - label_blocked_by: заблоковане + label_blocked_by: заблоковане label_precedes: передує label_follows: наступний за label_end_to_start: з кінця до початку @@ -553,12 +555,12 @@ uk: label_registration_manual_activation: ручна активація облікового запису label_registration_automatic_activation: автоматична активація облыкового label_my_time_report: Мій звіт витраченого часу - + button_login: Вхід button_submit: Відправити button_save: Зберегти - button_check_all: Відзначити все - button_uncheck_all: Очистити + button_check_all: Відзначити все + button_uncheck_all: Очистити button_delete: Видалити button_create: Створити button_test: Перевірити @@ -586,14 +588,14 @@ uk: button_unarchive: Розархівувати button_reset: Перезапустити button_rename: Перейменувати - button_change_password: Змінити пароль + button_change_password: Змінити пароль button_copy: Копіювати button_annotate: Анотувати - + status_active: Активний - status_registered: Зареєстрований + status_registered: Зареєстрований status_locked: Заблокований - + text_select_mail_notifications: Виберіть дії, на які відсилатиметься повідомлення на електронну пошту. text_regexp_info: eg. ^[A-Z0-9]+$ text_min_max_length_info: 0 означає відсутність заборон @@ -618,12 +620,12 @@ uk: text_issue_category_destroy_assignments: Видалити призначення категорії text_issue_category_reassign_to: Перепризначити задачі до даної категорії text_user_mail_option: "Для невибраних проектів ви отримуватимете повідомлення тільки про те, що проглядаєте або в чому берете участь (наприклад, питання автором яких ви є або які вам призначені)." - + default_role_manager: Менеджер default_role_developer: Розробник default_role_reporter: Репортер звітів default_tracker_bug: Помилка - default_tracker_feature: Властивість + default_tracker_feature: Властивість default_tracker_support: Підтримка default_issue_status_new: Новий default_issue_status_in_progress: In Progress @@ -632,7 +634,7 @@ uk: default_issue_status_closed: Зачинено default_issue_status_rejected: Відмовлено default_doc_category_user: Документація користувача - default_doc_category_tech: Технічна документація + default_doc_category_tech: Технічна документація default_priority_low: Низький default_priority_normal: Нормальний default_priority_high: Високий @@ -640,7 +642,7 @@ uk: default_priority_immediate: Негайний default_activity_design: Проектування default_activity_development: Розробка - + enumeration_issue_priorities: Пріоритети питань enumeration_doc_categories: Категорії документів enumeration_activities: Дії (облік часу) @@ -942,3 +944,18 @@ uk: label_cvs_path: CVSROOT label_git_path: Path to .git directory label_mercurial_path: Root directory + label_my_queries: My custom queries + label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee + text_journal_changed_no_detail: "%{label} updated" + button_expand_all: Expand all + button_collapse_all: Collapse all + label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author + field_effective_date: Due date + label_news_comment_added: Comment added to a news + field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text + text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page. + text_default_encoding: "Default: UTF-8" + text_git_repo_example: a bare and local repository (e.g. /gitrepo, c:\gitrepo) + label_notify_member_plural: Email issue updates + label_path_encoding: Path encoding + text_mercurial_repo_example: local repository (e.g. /hgrepo, c:\hgrepo) diff --git a/config/locales/vi.yml b/config/locales/vi.yml index bc7d4d25..8daf9b80 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -158,7 +158,10 @@ vi: month_names: [~, "Tháng một", "Tháng hai", "Tháng ba", "Tháng tư", "Tháng năm", "Tháng sáu", "Tháng bảy", "Tháng tám", "Tháng chín", "Tháng mười", "Tháng mười một", "Tháng mười hai"] abbr_month_names: [~, "Tháng một", "Tháng hai", "Tháng ba", "Tháng tư", "Tháng năm", "Tháng sáu", "Tháng bảy", "Tháng tám", "Tháng chín", "Tháng mười", "Tháng mười một", "Tháng mười hai"] # Used in date_select and datime_select. - order: [ :day, :month, :year ] + order: + - :day + - :month + - :year time: formats: @@ -175,9 +178,9 @@ vi: words_connector: ", " two_words_connector: " và " last_word_connector: ", và " - + actionview_instancetag_blank_option: Vui lòng chọn - + general_text_No: 'Không' general_text_Yes: 'Có' general_text_no: 'không' @@ -188,7 +191,7 @@ vi: general_csv_encoding: UTF-8 general_pdf_encoding: UTF-8 general_first_day_of_week: '1' - + notice_account_updated: Cập nhật tài khoản thành công. notice_account_invalid_creditentials: Tài khoản hoặc mật mã không hợp lệ notice_account_password_updated: Cập nhật mật mã thành công. @@ -213,13 +216,13 @@ vi: notice_account_pending: "Thông tin tài khoản đã được tạo ra và đang chờ chứng thực từ ban quản trị." notice_default_data_loaded: Đã nạp cấu hình mặc định. notice_unable_delete_version: Không thể xóa phiên bản. - + error_can_t_load_default_data: "Không thể nạp cấu hình mặc định: %{value}" error_scm_not_found: "The entry or revision was not found in the repository." error_scm_command_failed: "Lỗi xảy ra khi truy cập vào kho lưu trữ: %{value}" error_scm_annotate: "The entry does not exist or can not be annotated." error_issue_not_found_in_project: 'Vấn đề không tồn tại hoặc không thuộc dự án' - + mail_subject_lost_password: "%{value}: mật mã của bạn" mail_body_lost_password: "Để đổi mật mã, hãy click chuột vào liên kết sau:" mail_subject_register: "%{value}: kích hoạt tài khoản" @@ -230,10 +233,10 @@ vi: mail_body_account_activation_request: "Người dùng (%{value}) mới đăng ký và cần bạn xác nhận:" mail_subject_reminder: "%{count} vấn đề hết hạn trong các %{days} ngày tới" mail_body_reminder: "%{count} vấn đề gán cho bạn sẽ hết hạn trong %{days} ngày tới:" - + gui_validation_error: 1 lỗi gui_validation_error_plural: "%{count} lỗi" - + field_name: Tên field_description: Mô tả field_summary: Tóm tắt @@ -279,7 +282,6 @@ vi: field_admin: Quản trị field_last_login_on: Kết nối cuối field_language: Ngôn ngữ - field_effective_date: Ngày field_password: Mật mã field_new_password: Mật mã mới field_password_confirmation: Khẳng định lại @@ -318,7 +320,7 @@ vi: field_default_value: Giá trị mặc định field_comments_sorting: Liệt kê bình luận field_parent_title: Trang mẹ - + setting_app_title: Tựa đề ứng dụng setting_app_subtitle: Tựa đề nhỏ của ứng dụng setting_welcome_text: Thông điệp chào mừng @@ -355,7 +357,7 @@ vi: setting_mail_handler_api_enabled: Enable WS for incoming emails setting_mail_handler_api_key: Mã số API setting_sequential_project_identifiers: Tự sinh chuỗi ID dự án - + project_module_issue_tracking: Theo dõi vấn đề project_module_time_tracking: Theo dõi thời gian project_module_news: Tin tức @@ -364,7 +366,7 @@ vi: project_module_wiki: Wiki project_module_repository: Kho lưu trữ project_module_boards: Diễn đàn - + label_user: Tài khoản label_user_plural: Tài khoản label_user_new: Tài khoản mới @@ -676,7 +678,7 @@ vi: label_incoming_emails: Nhận mail label_generate_key: Tạo mã label_issue_watchers: Theo dõi - + button_login: Đăng nhập button_submit: Gửi button_save: Lưu @@ -715,11 +717,11 @@ vi: button_update: Cập nhật button_configure: Cấu hình button_quote: Trích dẫn - + status_active: hoạt động status_registered: đăng ký status_locked: khóa - + text_select_mail_notifications: Chọn hành động đối với mỗi email thông báo sẽ gửi. text_regexp_info: eg. ^[A-Z0-9]+$ text_min_max_length_info: 0 để chỉ không hạn chế @@ -761,7 +763,7 @@ vi: text_enumeration_destroy_question: "%{count} objects are assigned to this value." text_enumeration_category_reassign_to: 'Reassign them to this value:' text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server in config/configuration.yml and restart the application to enable them." - + default_role_manager: Điều hành default_role_developer: Phát triển default_role_reporter: Báo cáo @@ -785,11 +787,11 @@ vi: default_priority_immediate: Trung bình default_activity_design: Thiết kế default_activity_development: Phát triển - + enumeration_issue_priorities: Mức độ ưu tiên vấn đề enumeration_doc_categories: Chủ đề tài liệu enumeration_activities: Hoạt động (theo dõi thời gian) - + setting_plain_text_mail: mail dạng text đơn giản (không dùng HTML) setting_gravatar_enabled: Dùng biểu tượng Gravatar permission_edit_project: Chỉnh dự án @@ -997,3 +999,18 @@ vi: label_cvs_path: CVSROOT label_git_path: Path to .git directory label_mercurial_path: Root directory + label_my_queries: My custom queries + label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee + text_journal_changed_no_detail: "%{label} updated" + button_expand_all: Expand all + button_collapse_all: Collapse all + label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author + field_effective_date: Due date + label_news_comment_added: Comment added to a news + field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text + text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page. + text_default_encoding: "Default: UTF-8" + text_git_repo_example: a bare and local repository (e.g. /gitrepo, c:\gitrepo) + label_notify_member_plural: Email issue updates + label_path_encoding: Path encoding + text_mercurial_repo_example: local repository (e.g. /hgrepo, c:\hgrepo) diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index e98d03ba..b67b01da 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -1,4 +1,4 @@ -# Chinese (Taiwan) translations for Ruby on Rails +# Chinese (Taiwan) translations for Ruby on Rails # by tsechingho (http://github.com/tsechingho) # See http://github.com/svenfuchs/rails-i18n/ for details. @@ -20,8 +20,11 @@ month_names: [~, 一月, 二月, 三月, 四月, 五月, 六月, 七月, 八月, 九月, 十月, 十一月, 十二月] abbr_month_names: [~, 1月, 2月, 3月, 4月, 5月, 6月, 7月, 8月, 9月, 10月, 11月, 12月] # 使用於 date_select 與 datime_select. - order: [ :year, :month, :day ] - + order: + - :year + - :month + - :day + time: formats: default: "%Y年%b%d日 %A %H:%M:%S %Z" @@ -66,9 +69,9 @@ percentage: format: # 下列三個選項設定, 若有設定值將會取代 number.format 成為預設值 - # separator: + # separator: delimiter: "" - # precision: + # precision: # 使用於 number_to_precision() precision: @@ -76,13 +79,13 @@ # 下列三個選項設定, 若有設定值將會取代 number.format 成為預設值 # separator: delimiter: "" - # precision: + # precision: # 使用於 number_to_human_size() human: format: # 下列三個選項設定, 若有設定值將會取代 number.format 成為預設值 - # separator: + # separator: delimiter: "" precision: 1 # 儲存單位輸出格式. @@ -146,7 +149,7 @@ activerecord: errors: template: - header: + header: one: "有 1 個錯誤發生使得「%{model}」無法被儲存。" other: "有 %{count} 個錯誤發生使得「%{model}」無法被儲存。" # The variable :count is also available @@ -189,16 +192,16 @@ # attributes: # login: # blank: "This is a custom blank message for User login" - # Will define custom blank validation message for User model and + # Will define custom blank validation message for User model and # custom blank validation message for login attribute of User model. #models: - + # Translate model names. Used in Model.human_name(). #models: # For example, # user: "Dude" # will translate User model name to "Dude" - + # Translate model attribute names. Used in Model.human_attribute_name(attribute). #attributes: # For example, @@ -207,7 +210,7 @@ # will translate User attribute "login" as "Handle" actionview_instancetag_blank_option: 請選擇 - + general_text_No: '否' general_text_Yes: '是' general_text_no: '否' @@ -218,7 +221,7 @@ general_csv_encoding: Big5 general_pdf_encoding: Big5 general_first_day_of_week: '7' - + notice_account_updated: 帳戶更新資訊已儲存 notice_account_invalid_creditentials: 帳戶或密碼不正確 notice_account_password_updated: 帳戶新密碼已儲存 @@ -268,7 +271,7 @@ error_unable_delete_issue_status: '無法刪除項目狀態' error_unable_to_connect: "無法連線至(%{value})" warning_attachments_not_saved: "%{count} 個附加檔案無法被儲存。" - + mail_subject_lost_password: 您的 Redmine 網站密碼 mail_body_lost_password: '欲變更您的 Redmine 網站密碼, 請點選以下鏈結:' mail_subject_register: 啟用您的 Redmine 帳號 @@ -283,10 +286,10 @@ mail_body_wiki_content_added: "此 '%{id}' wiki 頁面已被 %{author} 新增。" mail_subject_wiki_content_updated: "'%{id}' wiki 頁面已被更新" mail_body_wiki_content_updated: "此 '%{id}' wiki 頁面已被 %{author} 更新。" - + gui_validation_error: 1 個錯誤 gui_validation_error_plural: "%{count} 個錯誤" - + field_name: 名稱 field_description: 概述 field_summary: 摘要 @@ -334,7 +337,6 @@ field_admin: 管理者 field_last_login_on: 最近連線日期 field_language: 語系 - field_effective_date: 日期 field_password: 目前密碼 field_new_password: 新密碼 field_password_confirmation: 確認新密碼 @@ -385,7 +387,8 @@ field_assigned_to_role: "被指派者的角色" field_text: 內容文字 field_visible: 可被看見 - + field_warn_on_leaving_unsaved: "提醒我將要離開的頁面中尚有未儲存的資料" + setting_app_title: 標題 setting_app_subtitle: 副標題 setting_welcome_text: 歡迎詞 @@ -444,7 +447,7 @@ setting_commit_logtime_enabled: 啟用送交中的時間記錄 setting_commit_logtime_activity_id: 時間記錄對應的活動 setting_gantt_items_limit: 甘特圖中項目顯示數量的最大值 - + permission_add_project: 建立專案 permission_add_subprojects: 建立子專案 permission_edit_project: 編輯專案 @@ -500,7 +503,7 @@ permission_delete_own_messages: 刪除自己的訊息 permission_export_wiki_pages: 匯出 wiki 頁面 permission_manage_subtasks: 管理子工作項目 - + project_module_issue_tracking: 項目追蹤 project_module_time_tracking: 工時追蹤 project_module_news: 新聞 @@ -511,7 +514,7 @@ project_module_boards: 討論區 project_module_calendar: 日曆 project_module_gantt: 甘特圖 - + label_user: 用戶 label_user_plural: 用戶清單 label_user_new: 建立新用戶 @@ -676,6 +679,7 @@ label_query: 自訂查詢 label_query_plural: 自訂查詢 label_query_new: 建立新查詢 + label_my_queries: 我的自訂查詢 label_filter_add: 加入新篩選條件 label_filter_plural: 篩選條件 label_equals: 等於 @@ -707,7 +711,7 @@ label_modification: "%{count} 變更" label_modification_plural: "%{count} 變更" label_branch: 分支 - label_tag: 標籤 + label_tag: 標籤 label_revision: 版次 label_revision_plural: 版次清單 label_revision_id: "版次 %{value}" @@ -920,17 +924,17 @@ button_quote: 引用 button_duplicate: 重製 button_show: 顯示 - + status_active: 活動中 status_registered: 註冊完成 status_locked: 鎖定中 - + version_status_open: 進行中 version_status_locked: 已鎖定 version_status_closed: 已結束 - + field_active: 活動中 - + text_select_mail_notifications: 選擇欲寄送提醒通知郵件之動作 text_regexp_info: eg. ^[A-Z0-9]+$ text_min_max_length_info: 0 代表「不限制」 @@ -940,6 +944,7 @@ text_are_you_sure: 確定執行? text_are_you_sure_with_children: "確定刪除此工作項目及其子項目?" text_journal_changed: "%{label} 從 %{old} 變更為 %{new}" + text_journal_changed_no_detail: "%{label} 已更新" text_journal_set_to: "%{label} 設定為 %{value}" text_journal_deleted: "%{label} 已刪除 (%{old})" text_journal_added: "%{label} %{value} 已新增" @@ -990,7 +995,8 @@ text_own_membership_delete_confirmation: "您在專案中,所擁有的部分或全部權限即將被移除,在這之後可能無法再次編輯此專案。\n您確定要繼續執行這個動作?" text_zoom_in: 放大 text_zoom_out: 縮小 - + text_warn_on_leaving_unsaved: "若您離開這個頁面,此頁面所包含的未儲存資料將會遺失。" + default_role_manager: 管理人員 default_role_developer: 開發人員 default_role_reporter: 報告人員 @@ -1014,7 +1020,7 @@ default_priority_immediate: 急 default_activity_design: 設計 default_activity_development: 開發 - + enumeration_issue_priorities: 項目優先權 enumeration_doc_categories: 文件分類 enumeration_activities: 活動 (時間追蹤) @@ -1027,3 +1033,15 @@ label_cvs_path: CVSROOT label_git_path: Path to .git directory label_mercurial_path: Root directory + label_my_queries: My custom queries + label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee + button_expand_all: Expand all + button_collapse_all: Collapse all + label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author + field_effective_date: Due date + label_news_comment_added: Comment added to a news + text_default_encoding: "Default: UTF-8" + text_git_repo_example: a bare and local repository (e.g. /gitrepo, c:\gitrepo) + label_notify_member_plural: Email issue updates + label_path_encoding: Path encoding + text_mercurial_repo_example: local repository (e.g. /hgrepo, c:\hgrepo) diff --git a/config/locales/zh.yml b/config/locales/zh.yml index fb5dcf85..aec61201 100644 --- a/config/locales/zh.yml +++ b/config/locales/zh.yml @@ -1,4 +1,4 @@ -# Chinese (China) translations for Ruby on Rails +# Chinese (China) translations for Ruby on Rails # by tsechingho (http://github.com/tsechingho) zh: @@ -12,8 +12,11 @@ zh: abbr_day_names: [日, 一, 二, 三, 四, 五, 六] month_names: [~, 一月, 二月, 三月, 四月, 五月, 六月, 七月, 八月, 九月, 十月, 十一月, 十二月] abbr_month_names: [~, 1月, 2月, 3月, 4月, 5月, 6月, 7月, 8月, 9月, 10月, 11月, 12月] - order: [ :year, :month, :day ] - + order: + - :year + - :month + - :day + time: formats: default: "%Y年%b%d日 %A %H:%M:%S" @@ -23,7 +26,7 @@ zh: long: "%Y年%b%d日 %H:%M" am: "上午" pm: "下午" - + datetime: distance_in_words: half_a_minute: "半分钟" @@ -67,7 +70,7 @@ zh: hour: "时" minute: "分" second: "秒" - + number: format: separator: "." @@ -100,17 +103,17 @@ zh: mb: "MB" gb: "GB" tb: "TB" - + support: array: words_connector: ", " two_words_connector: " 和 " last_word_connector: ", 和 " - + activerecord: errors: template: - header: + header: one: "有 1 个错误发生导致「%{model}」无法被保存。" other: "有 %{count} 个错误发生导致「%{model}」无法被保存。" body: "如下字段出现错误:" @@ -140,7 +143,7 @@ zh: cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks" actionview_instancetag_blank_option: 请选择 - + general_text_No: '否' general_text_Yes: '是' general_text_no: '否' @@ -151,7 +154,7 @@ zh: general_csv_encoding: gb18030 general_pdf_encoding: gb18030 general_first_day_of_week: '7' - + notice_account_updated: 帐号更新成功 notice_account_invalid_creditentials: 无效的用户名或密码 notice_account_password_updated: 密码更新成功 @@ -193,7 +196,7 @@ zh: error_workflow_copy_target: 请选择目标跟踪标签和角色 warning_attachments_not_saved: "%{count} 个文件保存失败。" - + mail_subject_lost_password: "您的 %{value} 密码" mail_body_lost_password: '请点击以下链接来修改您的密码:' mail_subject_register: "%{value}帐号激活" @@ -211,7 +214,7 @@ zh: gui_validation_error: 1 个错误 gui_validation_error_plural: "%{count} 个错误" - + field_name: 名称 field_description: 描述 field_summary: 摘要 @@ -257,7 +260,6 @@ zh: field_admin: 管理员 field_last_login_on: 最后登录 field_language: 语言 - field_effective_date: 日期 field_password: 密码 field_new_password: 新密码 field_password_confirmation: 确认 @@ -417,7 +419,7 @@ zh: project_module_wiki: Wiki project_module_repository: 版本库 project_module_boards: 讨论区 - + label_user: 用户 label_user_plural: 用户 label_user_new: 新建用户 @@ -768,7 +770,7 @@ zh: label_api_access_key: API访问键 label_missing_api_access_key: 缺少API访问键 label_api_access_key_created_on: API访问键是在 %{value} 之前建立的 - + button_login: 登录 button_submit: 提交 button_save: 保存 @@ -902,7 +904,7 @@ zh: default_priority_immediate: 立刻 default_activity_design: 设计 default_activity_development: 开发 - + enumeration_issue_priorities: 问题优先级 enumeration_doc_categories: 文档类别 enumeration_activities: 活动(时间跟踪) @@ -960,3 +962,18 @@ zh: label_cvs_path: CVSROOT label_git_path: Path to .git directory label_mercurial_path: Root directory + label_my_queries: My custom queries + label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee + text_journal_changed_no_detail: "%{label} updated" + button_expand_all: Expand all + button_collapse_all: Collapse all + label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author + field_effective_date: Due date + label_news_comment_added: Comment added to a news + field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text + text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page. + text_default_encoding: "Default: UTF-8" + text_git_repo_example: a bare and local repository (e.g. /gitrepo, c:\gitrepo) + label_notify_member_plural: Email issue updates + label_path_encoding: Path encoding + text_mercurial_repo_example: local repository (e.g. /hgrepo, c:\hgrepo) diff --git a/config/preinitializer.rb b/config/preinitializer.rb new file mode 100644 index 00000000..ed24a10e --- /dev/null +++ b/config/preinitializer.rb @@ -0,0 +1,33 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + +begin + require "rubygems" + require "bundler" +rescue LoadError + raise "Could not load the bundler gem. Install it with `gem install bundler`." +end + +if Gem::Version.new(Bundler::VERSION) <= Gem::Version.new("0.9.24") + raise RuntimeError, "Your bundler version is too old for Rails 2.3." + + "Run `gem install bundler` to upgrade." +end + +begin + # Set up load paths for all bundled gems + ENV["BUNDLE_GEMFILE"] = File.expand_path("../../Gemfile", __FILE__) + Bundler.setup +rescue Bundler::GemNotFound + raise RuntimeError, "Bundler couldn't find some gems." + + "Did you run `bundle install`?" +end diff --git a/config/routes.rb b/config/routes.rb index 3b37b515..971966ac 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,33 +1,47 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + ActionController::Routing::Routes.draw do |map| # Add your own custom routes here. # The priority is based upon order of creation: first created -> highest priority. - + # Here's a sample route: # map.connect 'products/:id', :controller => 'catalog', :action => 'view' # Keep in mind you can assign values other than :controller and :action map.home '', :controller => 'welcome' - + map.signin 'login', :controller => 'account', :action => 'login' map.signout 'logout', :controller => 'account', :action => 'logout' - + map.connect 'roles/workflow/:id/:role_id/:tracker_id', :controller => 'roles', :action => 'workflow' map.connect 'help/:ctrl/:page', :controller => 'help' - map.connect 'projects/:project_id/time_entries/report', :controller => 'time_entry_reports', :action => 'report' map.with_options :controller => 'time_entry_reports', :action => 'report',:conditions => {:method => :get} do |time_report| + time_report.connect 'projects/:project_id/issues/:issue_id/time_entries/report' + time_report.connect 'projects/:project_id/issues/:issue_id/time_entries/report.:format' + time_report.connect 'projects/:project_id/time_entries/report' + time_report.connect 'projects/:project_id/time_entries/report.:format' time_report.connect 'time_entries/report' time_report.connect 'time_entries/report.:format' - time_report.connect 'projects/:project_id/time_entries/report.:format' end - # TODO: wasteful since this is also nested under issues, projects, and projects/issues map.resources :time_entries, :controller => 'timelog' - + map.connect 'projects/:id/wiki', :controller => 'wikis', :action => 'edit', :conditions => {:method => :post} map.connect 'projects/:id/wiki/destroy', :controller => 'wikis', :action => 'destroy', :conditions => {:method => :get} map.connect 'projects/:id/wiki/destroy', :controller => 'wikis', :action => 'destroy', :conditions => {:method => :post} - + map.with_options :controller => 'messages' do |messages_routes| messages_routes.with_options :conditions => {:method => :get} do |messages_views| messages_views.connect 'boards/:board_id/topics/new', :action => 'new' @@ -40,7 +54,7 @@ ActionController::Routing::Routes.draw do |map| messages_actions.connect 'boards/:board_id/topics/:id/:action', :action => /edit|destroy/ end end - + map.with_options :controller => 'boards' do |board_routes| board_routes.with_options :conditions => {:method => :get} do |board_views| board_views.connect 'projects/:project_id/boards', :action => 'index' @@ -54,7 +68,7 @@ ActionController::Routing::Routes.draw do |map| board_actions.connect 'projects/:project_id/boards/:id/:action', :action => /edit|destroy/ end end - + map.with_options :controller => 'documents' do |document_routes| document_routes.with_options :conditions => {:method => :get} do |document_views| document_views.connect 'projects/:project_id/documents', :action => 'index' @@ -93,11 +107,11 @@ ActionController::Routing::Routes.draw do |map| # Following two routes conflict with the resources because #index allows POST map.connect '/issues', :controller => 'issues', :action => 'index', :conditions => { :method => :post } map.connect '/issues/create', :controller => 'issues', :action => 'index', :conditions => { :method => :post } - + map.resources :issues, :member => { :edit => :post }, :collection => {} do |issues| issues.resources :time_entries, :controller => 'timelog' end - + map.resources :issues, :path_prefix => '/projects/:project_id', :collection => { :create => :post } do |issues| issues.resources :time_entries, :controller => 'timelog' end @@ -111,7 +125,7 @@ ActionController::Routing::Routes.draw do |map| map.with_options :controller => 'users' do |users| users.connect 'users/:id/edit/:tab', :action => 'edit', :tab => nil, :conditions => {:method => :get} - + users.with_options :conditions => {:method => :post} do |user_actions| user_actions.connect 'users/:id/memberships', :action => 'edit_membership' user_actions.connect 'users/:id/memberships/:membership_id', :action => 'edit_membership' @@ -175,7 +189,7 @@ ActionController::Routing::Routes.draw do |map| project_views.connect 'projects/:project_id/issues/:copy_from/copy', :controller => 'issues', :action => 'new' end end - + map.with_options :controller => 'activities', :action => 'index', :conditions => {:method => :get} do |activity| activity.connect 'projects/:id/activity' activity.connect 'projects/:id/activity.:format' @@ -183,11 +197,11 @@ ActionController::Routing::Routes.draw do |map| activity.connect 'activity.:format', :id => nil end - + map.with_options :controller => 'issue_categories' do |categories| categories.connect 'projects/:project_id/issue_categories/new', :action => 'new' end - + map.with_options :controller => 'repositories' do |repositories| repositories.with_options :conditions => {:method => :get} do |repository_views| repository_views.connect 'projects/:id/repository', :action => 'show' @@ -205,16 +219,16 @@ ActionController::Routing::Routes.draw do |map| repository_views.connect 'projects/:id/repository/entry/*path', :action => 'entry' repository_views.connect 'projects/:id/repository/:action/*path' end - + repositories.connect 'projects/:id/repository/:action', :conditions => {:method => :post} end - + map.connect 'attachments/:id', :controller => 'attachments', :action => 'show', :id => /\d+/ map.connect 'attachments/:id/:filename', :controller => 'attachments', :action => 'show', :id => /\d+/, :filename => /.*/ map.connect 'attachments/download/:id/:filename', :controller => 'attachments', :action => 'download', :id => /\d+/, :filename => /.*/ - + map.resources :groups - + #left old routes at the bottom for backwards compat map.connect 'projects/:project_id/issues/:action', :controller => 'issues' map.connect 'projects/:project_id/documents/:action', :controller => 'documents' @@ -222,7 +236,7 @@ ActionController::Routing::Routes.draw do |map| map.connect 'boards/:board_id/topics/:action/:id', :controller => 'messages' map.connect 'wiki/:id/:page/:action', :page => nil, :controller => 'wiki' map.connect 'issues/:issue_id/relations/:action/:id', :controller => 'issue_relations' - map.connect 'projects/:project_id/news/:action', :controller => 'news' + map.connect 'projects/:project_id/news/:action', :controller => 'news' map.connect 'projects/:project_id/timelog/:action/:id', :controller => 'timelog', :project_id => /.+/ map.with_options :controller => 'repositories' do |omap| omap.repositories_show 'repositories/browse/:id/*path', :action => 'browse' @@ -232,12 +246,12 @@ ActionController::Routing::Routes.draw do |map| omap.repositories_entry 'repositories/annotate/:id/*path', :action => 'annotate' omap.connect 'repositories/revision/:id/:rev', :action => 'revision' end - + map.with_options :controller => 'sys' do |sys| sys.connect 'sys/projects.:format', :action => 'projects', :conditions => {:method => :get} sys.connect 'sys/projects/:id/repository.:format', :action => 'create_project_repository', :conditions => {:method => :post} end - + # Install the default route as the lowest priority. map.connect ':controller/:action/:id' map.connect 'robots.txt', :controller => 'welcome', :action => 'robots' diff --git a/config/settings.yml b/config/settings.yml index 73007c4a..79bfdf35 100644 --- a/config/settings.yml +++ b/config/settings.yml @@ -1,21 +1,3 @@ -# redMine - project management software -# Copyright (C) 2006-2007 Jean-Philippe Lang -# -# 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 -# of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - - # DO NOT MODIFY THIS FILE !!! # Settings can be defined through the application in Admin -> Settings @@ -79,7 +61,7 @@ diff_max_lines_displayed: default: 1500 enabled_scm: serialized: true - default: + default: - Subversion - Darcs - Mercurial @@ -107,7 +89,7 @@ commit_logtime_activity_id: format: int default: 0 # autologin duration in days -# 0 means autologin is disabled +# 0 means autologin is disabled autologin: format: int default: 0 @@ -123,7 +105,7 @@ cross_project_issue_relations: default: 0 notified_events: serialized: true - default: + default: - issue_added - issue_updated mail_handler_body_delimiters: @@ -131,10 +113,10 @@ mail_handler_body_delimiters: mail_handler_api_enabled: default: 0 mail_handler_api_key: - default: + default: issue_list_default_columns: serialized: true - default: + default: - tracker - status - priority @@ -149,7 +131,7 @@ default_projects_public: default: 1 default_projects_modules: serialized: true - default: + default: - issue_tracking - time_tracking - news @@ -182,7 +164,7 @@ emails_footer: default: |- You have received this notification because you have either subscribed to it, or are involved in it. To change your notification preferences, please click here: http://hostname/my/account -gravatar_enabled: +gravatar_enabled: default: 0 openid: default: 0 diff --git a/db/migrate/001_setup.rb b/db/migrate/001_setup.rb index f5b0d108..b190b6e3 100644 --- a/db/migrate/001_setup.rb +++ b/db/migrate/001_setup.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + # redMine - project management software # Copyright (C) 2006 Jean-Philippe Lang # @@ -5,35 +18,35 @@ # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, 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. -# +# # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. class Setup < ActiveRecord::Migration - + class User < ActiveRecord::Base; end # model removed class Permission < ActiveRecord::Base; end - - def self.up - create_table "attachments", :force => true do |t| - t.column "container_id", :integer, :default => 0, :null => false - t.column "container_type", :string, :limit => 30, :default => "", :null => false - t.column "filename", :string, :default => "", :null => false - t.column "disk_filename", :string, :default => "", :null => false - t.column "filesize", :integer, :default => 0, :null => false - t.column "content_type", :string, :limit => 60, :default => "" - t.column "digest", :string, :limit => 40, :default => "", :null => false - t.column "downloads", :integer, :default => 0, :null => false - t.column "author_id", :integer, :default => 0, :null => false - t.column "created_on", :timestamp - end + + def self.up + create_table "attachments", :force => true do |t| + t.column "container_id", :integer, :default => 0, :null => false + t.column "container_type", :string, :limit => 30, :default => "", :null => false + t.column "filename", :string, :default => "", :null => false + t.column "disk_filename", :string, :default => "", :null => false + t.column "filesize", :integer, :default => 0, :null => false + t.column "content_type", :string, :limit => 60, :default => "" + t.column "digest", :string, :limit => 40, :default => "", :null => false + t.column "downloads", :integer, :default => 0, :null => false + t.column "author_id", :integer, :default => 0, :null => false + t.column "created_on", :timestamp + end create_table "auth_sources", :force => true do |t| t.column "type", :string, :limit => 30, :default => "", :null => false @@ -49,143 +62,143 @@ class Setup < ActiveRecord::Migration t.column "attr_mail", :string, :limit => 30 t.column "onthefly_register", :boolean, :default => false, :null => false end - + create_table "custom_fields", :force => true do |t| - t.column "type", :string, :limit => 30, :default => "", :null => false - t.column "name", :string, :limit => 30, :default => "", :null => false - t.column "field_format", :string, :limit => 30, :default => "", :null => false - t.column "possible_values", :text - t.column "regexp", :string, :default => "" - t.column "min_length", :integer, :default => 0, :null => false - t.column "max_length", :integer, :default => 0, :null => false + t.column "type", :string, :limit => 30, :default => "", :null => false + t.column "name", :string, :limit => 30, :default => "", :null => false + t.column "field_format", :string, :limit => 30, :default => "", :null => false + t.column "possible_values", :text + t.column "regexp", :string, :default => "" + t.column "min_length", :integer, :default => 0, :null => false + t.column "max_length", :integer, :default => 0, :null => false t.column "is_required", :boolean, :default => false, :null => false t.column "is_for_all", :boolean, :default => false, :null => false - end - - create_table "custom_fields_projects", :id => false, :force => true do |t| - t.column "custom_field_id", :integer, :default => 0, :null => false - t.column "project_id", :integer, :default => 0, :null => false - end + end + + create_table "custom_fields_projects", :id => false, :force => true do |t| + t.column "custom_field_id", :integer, :default => 0, :null => false + t.column "project_id", :integer, :default => 0, :null => false + end create_table "custom_fields_trackers", :id => false, :force => true do |t| t.column "custom_field_id", :integer, :default => 0, :null => false t.column "tracker_id", :integer, :default => 0, :null => false end - - create_table "custom_values", :force => true do |t| + + create_table "custom_values", :force => true do |t| t.column "customized_type", :string, :limit => 30, :default => "", :null => false t.column "customized_id", :integer, :default => 0, :null => false - t.column "custom_field_id", :integer, :default => 0, :null => false - t.column "value", :text - end - - create_table "documents", :force => true do |t| - t.column "project_id", :integer, :default => 0, :null => false - t.column "category_id", :integer, :default => 0, :null => false - t.column "title", :string, :limit => 60, :default => "", :null => false - t.column "description", :text - t.column "created_on", :timestamp + t.column "custom_field_id", :integer, :default => 0, :null => false + t.column "value", :text end - - add_index "documents", ["project_id"], :name => "documents_project_id" - - create_table "enumerations", :force => true do |t| - t.column "opt", :string, :limit => 4, :default => "", :null => false - t.column "name", :string, :limit => 30, :default => "", :null => false - end - - create_table "issue_categories", :force => true do |t| - t.column "project_id", :integer, :default => 0, :null => false - t.column "name", :string, :limit => 30, :default => "", :null => false - end - - add_index "issue_categories", ["project_id"], :name => "issue_categories_project_id" - - create_table "issue_histories", :force => true do |t| - t.column "issue_id", :integer, :default => 0, :null => false - t.column "status_id", :integer, :default => 0, :null => false - t.column "author_id", :integer, :default => 0, :null => false - t.column "notes", :text - t.column "created_on", :timestamp - end - - add_index "issue_histories", ["issue_id"], :name => "issue_histories_issue_id" - - create_table "issue_statuses", :force => true do |t| - t.column "name", :string, :limit => 30, :default => "", :null => false - t.column "is_closed", :boolean, :default => false, :null => false - t.column "is_default", :boolean, :default => false, :null => false - t.column "html_color", :string, :limit => 6, :default => "FFFFFF", :null => false - end - - create_table "issues", :force => true do |t| - t.column "tracker_id", :integer, :default => 0, :null => false - t.column "project_id", :integer, :default => 0, :null => false - t.column "subject", :string, :default => "", :null => false + + create_table "documents", :force => true do |t| + t.column "project_id", :integer, :default => 0, :null => false + t.column "category_id", :integer, :default => 0, :null => false + t.column "title", :string, :limit => 60, :default => "", :null => false t.column "description", :text - t.column "due_date", :date - t.column "category_id", :integer - t.column "status_id", :integer, :default => 0, :null => false - t.column "assigned_to_id", :integer - t.column "priority_id", :integer, :default => 0, :null => false - t.column "fixed_version_id", :integer - t.column "author_id", :integer, :default => 0, :null => false - t.column "lock_version", :integer, :default => 0, :null => false - t.column "created_on", :timestamp - t.column "updated_on", :timestamp - end - - add_index "issues", ["project_id"], :name => "issues_project_id" - - create_table "members", :force => true do |t| - t.column "user_id", :integer, :default => 0, :null => false - t.column "project_id", :integer, :default => 0, :null => false - t.column "role_id", :integer, :default => 0, :null => false - t.column "created_on", :timestamp - end - - create_table "news", :force => true do |t| - t.column "project_id", :integer - t.column "title", :string, :limit => 60, :default => "", :null => false - t.column "summary", :string, :limit => 255, :default => "" - t.column "description", :text - t.column "author_id", :integer, :default => 0, :null => false - t.column "created_on", :timestamp + t.column "created_on", :timestamp end - - add_index "news", ["project_id"], :name => "news_project_id" - - create_table "permissions", :force => true do |t| - t.column "controller", :string, :limit => 30, :default => "", :null => false - t.column "action", :string, :limit => 30, :default => "", :null => false - t.column "description", :string, :limit => 60, :default => "", :null => false - t.column "is_public", :boolean, :default => false, :null => false - t.column "sort", :integer, :default => 0, :null => false - t.column "mail_option", :boolean, :default => false, :null => false - t.column "mail_enabled", :boolean, :default => false, :null => false - end - - create_table "permissions_roles", :id => false, :force => true do |t| - t.column "permission_id", :integer, :default => 0, :null => false - t.column "role_id", :integer, :default => 0, :null => false - end - - add_index "permissions_roles", ["role_id"], :name => "permissions_roles_role_id" - - create_table "projects", :force => true do |t| - t.column "name", :string, :limit => 30, :default => "", :null => false - t.column "description", :string, :default => "", :null => false - t.column "homepage", :string, :limit => 60, :default => "" + + add_index "documents", ["project_id"], :name => "documents_project_id" + + create_table "enumerations", :force => true do |t| + t.column "opt", :string, :limit => 4, :default => "", :null => false + t.column "name", :string, :limit => 30, :default => "", :null => false + end + + create_table "issue_categories", :force => true do |t| + t.column "project_id", :integer, :default => 0, :null => false + t.column "name", :string, :limit => 30, :default => "", :null => false + end + + add_index "issue_categories", ["project_id"], :name => "issue_categories_project_id" + + create_table "issue_histories", :force => true do |t| + t.column "issue_id", :integer, :default => 0, :null => false + t.column "status_id", :integer, :default => 0, :null => false + t.column "author_id", :integer, :default => 0, :null => false + t.column "notes", :text + t.column "created_on", :timestamp + end + + add_index "issue_histories", ["issue_id"], :name => "issue_histories_issue_id" + + create_table "issue_statuses", :force => true do |t| + t.column "name", :string, :limit => 30, :default => "", :null => false + t.column "is_closed", :boolean, :default => false, :null => false + t.column "is_default", :boolean, :default => false, :null => false + t.column "html_color", :string, :limit => 6, :default => "FFFFFF", :null => false + end + + create_table "issues", :force => true do |t| + t.column "tracker_id", :integer, :default => 0, :null => false + t.column "project_id", :integer, :default => 0, :null => false + t.column "subject", :string, :default => "", :null => false + t.column "description", :text + t.column "due_date", :date + t.column "category_id", :integer + t.column "status_id", :integer, :default => 0, :null => false + t.column "assigned_to_id", :integer + t.column "priority_id", :integer, :default => 0, :null => false + t.column "fixed_version_id", :integer + t.column "author_id", :integer, :default => 0, :null => false + t.column "lock_version", :integer, :default => 0, :null => false + t.column "created_on", :timestamp + t.column "updated_on", :timestamp + end + + add_index "issues", ["project_id"], :name => "issues_project_id" + + create_table "members", :force => true do |t| + t.column "user_id", :integer, :default => 0, :null => false + t.column "project_id", :integer, :default => 0, :null => false + t.column "role_id", :integer, :default => 0, :null => false + t.column "created_on", :timestamp + end + + create_table "news", :force => true do |t| + t.column "project_id", :integer + t.column "title", :string, :limit => 60, :default => "", :null => false + t.column "summary", :string, :limit => 255, :default => "" + t.column "description", :text + t.column "author_id", :integer, :default => 0, :null => false + t.column "created_on", :timestamp + end + + add_index "news", ["project_id"], :name => "news_project_id" + + create_table "permissions", :force => true do |t| + t.column "controller", :string, :limit => 30, :default => "", :null => false + t.column "action", :string, :limit => 30, :default => "", :null => false + t.column "description", :string, :limit => 60, :default => "", :null => false + t.column "is_public", :boolean, :default => false, :null => false + t.column "sort", :integer, :default => 0, :null => false + t.column "mail_option", :boolean, :default => false, :null => false + t.column "mail_enabled", :boolean, :default => false, :null => false + end + + create_table "permissions_roles", :id => false, :force => true do |t| + t.column "permission_id", :integer, :default => 0, :null => false + t.column "role_id", :integer, :default => 0, :null => false + end + + add_index "permissions_roles", ["role_id"], :name => "permissions_roles_role_id" + + create_table "projects", :force => true do |t| + t.column "name", :string, :limit => 30, :default => "", :null => false + t.column "description", :string, :default => "", :null => false + t.column "homepage", :string, :limit => 60, :default => "" t.column "is_public", :boolean, :default => true, :null => false t.column "parent_id", :integer - t.column "projects_count", :integer, :default => 0 - t.column "created_on", :timestamp - t.column "updated_on", :timestamp - end - - create_table "roles", :force => true do |t| - t.column "name", :string, :limit => 30, :default => "", :null => false - end + t.column "projects_count", :integer, :default => 0 + t.column "created_on", :timestamp + t.column "updated_on", :timestamp + end + + create_table "roles", :force => true do |t| + t.column "name", :string, :limit => 30, :default => "", :null => false + end create_table "tokens", :force => true do |t| t.column "user_id", :integer, :default => 0, :null => false @@ -193,98 +206,98 @@ class Setup < ActiveRecord::Migration t.column "value", :string, :limit => 40, :default => "", :null => false t.column "created_on", :datetime, :null => false end - - create_table "trackers", :force => true do |t| - t.column "name", :string, :limit => 30, :default => "", :null => false - t.column "is_in_chlog", :boolean, :default => false, :null => false - end - - create_table "users", :force => true do |t| - t.column "login", :string, :limit => 30, :default => "", :null => false - t.column "hashed_password", :string, :limit => 40, :default => "", :null => false - t.column "firstname", :string, :limit => 30, :default => "", :null => false - t.column "lastname", :string, :limit => 30, :default => "", :null => false - t.column "mail", :string, :limit => 60, :default => "", :null => false - t.column "mail_notification", :boolean, :default => true, :null => false - t.column "admin", :boolean, :default => false, :null => false - t.column "status", :integer, :default => 1, :null => false - t.column "last_login_on", :datetime - t.column "language", :string, :limit => 2, :default => "" - t.column "auth_source_id", :integer - t.column "created_on", :timestamp - t.column "updated_on", :timestamp - end - - create_table "versions", :force => true do |t| - t.column "project_id", :integer, :default => 0, :null => false - t.column "name", :string, :limit => 30, :default => "", :null => false - t.column "description", :string, :default => "" - t.column "effective_date", :date - t.column "created_on", :timestamp - t.column "updated_on", :timestamp + + create_table "trackers", :force => true do |t| + t.column "name", :string, :limit => 30, :default => "", :null => false + t.column "is_in_chlog", :boolean, :default => false, :null => false end - - add_index "versions", ["project_id"], :name => "versions_project_id" - - create_table "workflows", :force => true do |t| - t.column "tracker_id", :integer, :default => 0, :null => false - t.column "old_status_id", :integer, :default => 0, :null => false - t.column "new_status_id", :integer, :default => 0, :null => false - t.column "role_id", :integer, :default => 0, :null => false - end - - # project - Permission.create :controller => "projects", :action => "show", :description => "label_overview", :sort => 100, :is_public => true - Permission.create :controller => "projects", :action => "changelog", :description => "label_change_log", :sort => 105, :is_public => true - Permission.create :controller => "reports", :action => "issue_report", :description => "label_report_plural", :sort => 110, :is_public => true - Permission.create :controller => "projects", :action => "settings", :description => "label_settings", :sort => 150 - Permission.create :controller => "projects", :action => "edit", :description => "button_edit", :sort => 151 - # members - Permission.create :controller => "projects", :action => "list_members", :description => "button_list", :sort => 200, :is_public => true - Permission.create :controller => "projects", :action => "add_member", :description => "button_add", :sort => 220 - Permission.create :controller => "members", :action => "edit", :description => "button_edit", :sort => 221 - Permission.create :controller => "members", :action => "destroy", :description => "button_delete", :sort => 222 - # versions - Permission.create :controller => "projects", :action => "add_version", :description => "button_add", :sort => 320 - Permission.create :controller => "versions", :action => "edit", :description => "button_edit", :sort => 321 - Permission.create :controller => "versions", :action => "destroy", :description => "button_delete", :sort => 322 - # issue categories - Permission.create :controller => "projects", :action => "add_issue_category", :description => "button_add", :sort => 420 - Permission.create :controller => "issue_categories", :action => "edit", :description => "button_edit", :sort => 421 - Permission.create :controller => "issue_categories", :action => "destroy", :description => "button_delete", :sort => 422 - # issues - Permission.create :controller => "projects", :action => "list_issues", :description => "button_list", :sort => 1000, :is_public => true + + create_table "users", :force => true do |t| + t.column "login", :string, :limit => 30, :default => "", :null => false + t.column "hashed_password", :string, :limit => 40, :default => "", :null => false + t.column "firstname", :string, :limit => 30, :default => "", :null => false + t.column "lastname", :string, :limit => 30, :default => "", :null => false + t.column "mail", :string, :limit => 60, :default => "", :null => false + t.column "mail_notification", :boolean, :default => true, :null => false + t.column "admin", :boolean, :default => false, :null => false + t.column "status", :integer, :default => 1, :null => false + t.column "last_login_on", :datetime + t.column "language", :string, :limit => 2, :default => "" + t.column "auth_source_id", :integer + t.column "created_on", :timestamp + t.column "updated_on", :timestamp + end + + create_table "versions", :force => true do |t| + t.column "project_id", :integer, :default => 0, :null => false + t.column "name", :string, :limit => 30, :default => "", :null => false + t.column "description", :string, :default => "" + t.column "effective_date", :date + t.column "created_on", :timestamp + t.column "updated_on", :timestamp + end + + add_index "versions", ["project_id"], :name => "versions_project_id" + + create_table "workflows", :force => true do |t| + t.column "tracker_id", :integer, :default => 0, :null => false + t.column "old_status_id", :integer, :default => 0, :null => false + t.column "new_status_id", :integer, :default => 0, :null => false + t.column "role_id", :integer, :default => 0, :null => false + end + + # project + Permission.create :controller => "projects", :action => "show", :description => "label_overview", :sort => 100, :is_public => true + Permission.create :controller => "projects", :action => "changelog", :description => "label_change_log", :sort => 105, :is_public => true + Permission.create :controller => "reports", :action => "issue_report", :description => "label_report_plural", :sort => 110, :is_public => true + Permission.create :controller => "projects", :action => "settings", :description => "label_settings", :sort => 150 + Permission.create :controller => "projects", :action => "edit", :description => "button_edit", :sort => 151 + # members + Permission.create :controller => "projects", :action => "list_members", :description => "button_list", :sort => 200, :is_public => true + Permission.create :controller => "projects", :action => "add_member", :description => "button_add", :sort => 220 + Permission.create :controller => "members", :action => "edit", :description => "button_edit", :sort => 221 + Permission.create :controller => "members", :action => "destroy", :description => "button_delete", :sort => 222 + # versions + Permission.create :controller => "projects", :action => "add_version", :description => "button_add", :sort => 320 + Permission.create :controller => "versions", :action => "edit", :description => "button_edit", :sort => 321 + Permission.create :controller => "versions", :action => "destroy", :description => "button_delete", :sort => 322 + # issue categories + Permission.create :controller => "projects", :action => "add_issue_category", :description => "button_add", :sort => 420 + Permission.create :controller => "issue_categories", :action => "edit", :description => "button_edit", :sort => 421 + Permission.create :controller => "issue_categories", :action => "destroy", :description => "button_delete", :sort => 422 + # issues + Permission.create :controller => "projects", :action => "list_issues", :description => "button_list", :sort => 1000, :is_public => true Permission.create :controller => "projects", :action => "export_issues_csv", :description => "label_export_csv", :sort => 1001, :is_public => true - Permission.create :controller => "issues", :action => "show", :description => "button_view", :sort => 1005, :is_public => true - Permission.create :controller => "issues", :action => "download", :description => "button_download", :sort => 1010, :is_public => true - Permission.create :controller => "projects", :action => "add_issue", :description => "button_add", :sort => 1050, :mail_option => 1, :mail_enabled => 1 - Permission.create :controller => "issues", :action => "edit", :description => "button_edit", :sort => 1055 - Permission.create :controller => "issues", :action => "change_status", :description => "label_change_status", :sort => 1060, :mail_option => 1, :mail_enabled => 1 - Permission.create :controller => "issues", :action => "destroy", :description => "button_delete", :sort => 1065 - Permission.create :controller => "issues", :action => "add_attachment", :description => "label_attachment_new", :sort => 1070 - Permission.create :controller => "issues", :action => "destroy_attachment", :description => "label_attachment_delete", :sort => 1075 - # news - Permission.create :controller => "projects", :action => "list_news", :description => "button_list", :sort => 1100, :is_public => true - Permission.create :controller => "news", :action => "show", :description => "button_view", :sort => 1101, :is_public => true - Permission.create :controller => "projects", :action => "add_news", :description => "button_add", :sort => 1120 - Permission.create :controller => "news", :action => "edit", :description => "button_edit", :sort => 1121 - Permission.create :controller => "news", :action => "destroy", :description => "button_delete", :sort => 1122 + Permission.create :controller => "issues", :action => "show", :description => "button_view", :sort => 1005, :is_public => true + Permission.create :controller => "issues", :action => "download", :description => "button_download", :sort => 1010, :is_public => true + Permission.create :controller => "projects", :action => "add_issue", :description => "button_add", :sort => 1050, :mail_option => 1, :mail_enabled => 1 + Permission.create :controller => "issues", :action => "edit", :description => "button_edit", :sort => 1055 + Permission.create :controller => "issues", :action => "change_status", :description => "label_change_status", :sort => 1060, :mail_option => 1, :mail_enabled => 1 + Permission.create :controller => "issues", :action => "destroy", :description => "button_delete", :sort => 1065 + Permission.create :controller => "issues", :action => "add_attachment", :description => "label_attachment_new", :sort => 1070 + Permission.create :controller => "issues", :action => "destroy_attachment", :description => "label_attachment_delete", :sort => 1075 + # news + Permission.create :controller => "projects", :action => "list_news", :description => "button_list", :sort => 1100, :is_public => true + Permission.create :controller => "news", :action => "show", :description => "button_view", :sort => 1101, :is_public => true + Permission.create :controller => "projects", :action => "add_news", :description => "button_add", :sort => 1120 + Permission.create :controller => "news", :action => "edit", :description => "button_edit", :sort => 1121 + Permission.create :controller => "news", :action => "destroy", :description => "button_delete", :sort => 1122 # documents - Permission.create :controller => "projects", :action => "list_documents", :description => "button_list", :sort => 1200, :is_public => true - Permission.create :controller => "documents", :action => "show", :description => "button_view", :sort => 1201, :is_public => true - Permission.create :controller => "documents", :action => "download", :description => "button_download", :sort => 1202, :is_public => true - Permission.create :controller => "projects", :action => "add_document", :description => "button_add", :sort => 1220 - Permission.create :controller => "documents", :action => "edit", :description => "button_edit", :sort => 1221 - Permission.create :controller => "documents", :action => "destroy", :description => "button_delete", :sort => 1222 - Permission.create :controller => "documents", :action => "add_attachment", :description => "label_attachment_new", :sort => 1223 - Permission.create :controller => "documents", :action => "destroy_attachment", :description => "label_attachment_delete", :sort => 1224 - # files - Permission.create :controller => "projects", :action => "list_files", :description => "button_list", :sort => 1300, :is_public => true - Permission.create :controller => "versions", :action => "download", :description => "button_download", :sort => 1301, :is_public => true - Permission.create :controller => "projects", :action => "add_file", :description => "button_add", :sort => 1320 - Permission.create :controller => "versions", :action => "destroy_file", :description => "button_delete", :sort => 1322 - - # create default administrator account + Permission.create :controller => "projects", :action => "list_documents", :description => "button_list", :sort => 1200, :is_public => true + Permission.create :controller => "documents", :action => "show", :description => "button_view", :sort => 1201, :is_public => true + Permission.create :controller => "documents", :action => "download", :description => "button_download", :sort => 1202, :is_public => true + Permission.create :controller => "projects", :action => "add_document", :description => "button_add", :sort => 1220 + Permission.create :controller => "documents", :action => "edit", :description => "button_edit", :sort => 1221 + Permission.create :controller => "documents", :action => "destroy", :description => "button_delete", :sort => 1222 + Permission.create :controller => "documents", :action => "add_attachment", :description => "label_attachment_new", :sort => 1223 + Permission.create :controller => "documents", :action => "destroy_attachment", :description => "label_attachment_delete", :sort => 1224 + # files + Permission.create :controller => "projects", :action => "list_files", :description => "button_list", :sort => 1300, :is_public => true + Permission.create :controller => "versions", :action => "download", :description => "button_download", :sort => 1301, :is_public => true + Permission.create :controller => "projects", :action => "add_file", :description => "button_add", :sort => 1320 + Permission.create :controller => "versions", :action => "destroy_file", :description => "button_delete", :sort => 1322 + + # create default administrator account user = User.create :login => "admin", :hashed_password => "d033e22ae348aeb5660fc2140aec35850c4da997", :admin => true, @@ -296,29 +309,29 @@ class Setup < ActiveRecord::Migration :status => 1 end - def self.down + def self.down drop_table :attachments - drop_table :auth_sources - drop_table :custom_fields + drop_table :auth_sources + drop_table :custom_fields drop_table :custom_fields_projects - drop_table :custom_fields_trackers - drop_table :custom_values - drop_table :documents - drop_table :enumerations - drop_table :issue_categories - drop_table :issue_histories - drop_table :issue_statuses - drop_table :issues - drop_table :members - drop_table :news - drop_table :permissions - drop_table :permissions_roles - drop_table :projects - drop_table :roles - drop_table :trackers + drop_table :custom_fields_trackers + drop_table :custom_values + drop_table :documents + drop_table :enumerations + drop_table :issue_categories + drop_table :issue_histories + drop_table :issue_statuses + drop_table :issues + drop_table :members + drop_table :news + drop_table :permissions + drop_table :permissions_roles + drop_table :projects + drop_table :roles + drop_table :trackers drop_table :tokens - drop_table :users - drop_table :versions + drop_table :users + drop_table :versions drop_table :workflows end end diff --git a/db/migrate/002_issue_move.rb b/db/migrate/002_issue_move.rb index 085593e0..eb547f90 100644 --- a/db/migrate/002_issue_move.rb +++ b/db/migrate/002_issue_move.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class IssueMove < ActiveRecord::Migration # model removed class Permission < ActiveRecord::Base; end diff --git a/db/migrate/003_issue_add_note.rb b/db/migrate/003_issue_add_note.rb index a2ab756e..abad975e 100644 --- a/db/migrate/003_issue_add_note.rb +++ b/db/migrate/003_issue_add_note.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class IssueAddNote < ActiveRecord::Migration # model removed class Permission < ActiveRecord::Base; end diff --git a/db/migrate/004_export_pdf.rb b/db/migrate/004_export_pdf.rb index 6ccd67ea..81786055 100644 --- a/db/migrate/004_export_pdf.rb +++ b/db/migrate/004_export_pdf.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class ExportPdf < ActiveRecord::Migration # model removed class Permission < ActiveRecord::Base; end diff --git a/db/migrate/005_issue_start_date.rb b/db/migrate/005_issue_start_date.rb index 3d1693fc..8e307d13 100644 --- a/db/migrate/005_issue_start_date.rb +++ b/db/migrate/005_issue_start_date.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class IssueStartDate < ActiveRecord::Migration def self.up add_column :issues, :start_date, :date diff --git a/db/migrate/006_calendar_and_activity.rb b/db/migrate/006_calendar_and_activity.rb index 1cdc91d8..1327ced8 100644 --- a/db/migrate/006_calendar_and_activity.rb +++ b/db/migrate/006_calendar_and_activity.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class CalendarAndActivity < ActiveRecord::Migration # model removed class Permission < ActiveRecord::Base; end diff --git a/db/migrate/007_create_journals.rb b/db/migrate/007_create_journals.rb index b0034783..e53a0af8 100644 --- a/db/migrate/007_create_journals.rb +++ b/db/migrate/007_create_journals.rb @@ -1,10 +1,23 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class CreateJournals < ActiveRecord::Migration # model removed, but needed for data migration class IssueHistory < ActiveRecord::Base; belongs_to :issue; end # model removed class Permission < ActiveRecord::Base; end - + def self.up create_table :journals, :force => true do |t| t.column "journalized_id", :integer, :default => 0, :null => false @@ -20,19 +33,19 @@ class CreateJournals < ActiveRecord::Migration t.column "old_value", :string t.column "value", :string end - + # indexes add_index "journals", ["journalized_id", "journalized_type"], :name => "journals_journalized_id" add_index "journal_details", ["journal_id"], :name => "journal_details_journal_id" - + Permission.create :controller => "issues", :action => "history", :description => "label_history", :sort => 1006, :is_public => true, :mail_option => 0, :mail_enabled => 0 # data migration IssueHistory.find(:all, :include => :issue).each {|h| j = Journal.new(:journalized => h.issue, :user_id => h.author_id, :notes => h.notes, :created_on => h.created_on) j.details << JournalDetail.new(:property => 'attr', :prop_key => 'status_id', :value => h.status_id) - j.save - } + j.save + } drop_table :issue_histories end @@ -40,7 +53,7 @@ class CreateJournals < ActiveRecord::Migration def self.down drop_table :journal_details drop_table :journals - + create_table "issue_histories", :force => true do |t| t.column "issue_id", :integer, :default => 0, :null => false t.column "status_id", :integer, :default => 0, :null => false @@ -48,7 +61,7 @@ class CreateJournals < ActiveRecord::Migration t.column "notes", :text, :default => "" t.column "created_on", :timestamp end - + add_index "issue_histories", ["issue_id"], :name => "issue_histories_issue_id" Permission.find(:first, :conditions => ["controller=? and action=?", 'issues', 'history']).destroy diff --git a/db/migrate/008_create_user_preferences.rb b/db/migrate/008_create_user_preferences.rb index 80ae1cdf..a9375eed 100644 --- a/db/migrate/008_create_user_preferences.rb +++ b/db/migrate/008_create_user_preferences.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class CreateUserPreferences < ActiveRecord::Migration def self.up create_table :user_preferences do |t| diff --git a/db/migrate/009_add_hide_mail_pref.rb b/db/migrate/009_add_hide_mail_pref.rb index a22eafd9..34a93549 100644 --- a/db/migrate/009_add_hide_mail_pref.rb +++ b/db/migrate/009_add_hide_mail_pref.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddHideMailPref < ActiveRecord::Migration def self.up add_column :user_preferences, :hide_mail, :boolean, :default => false diff --git a/db/migrate/010_create_comments.rb b/db/migrate/010_create_comments.rb index 29e1116a..af428144 100644 --- a/db/migrate/010_create_comments.rb +++ b/db/migrate/010_create_comments.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class CreateComments < ActiveRecord::Migration def self.up create_table :comments do |t| diff --git a/db/migrate/011_add_news_comments_count.rb b/db/migrate/011_add_news_comments_count.rb index a2474399..3dd6f418 100644 --- a/db/migrate/011_add_news_comments_count.rb +++ b/db/migrate/011_add_news_comments_count.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddNewsCommentsCount < ActiveRecord::Migration def self.up add_column :news, :comments_count, :integer, :default => 0, :null => false diff --git a/db/migrate/012_add_comments_permissions.rb b/db/migrate/012_add_comments_permissions.rb index 2bbf87b0..b6738522 100644 --- a/db/migrate/012_add_comments_permissions.rb +++ b/db/migrate/012_add_comments_permissions.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddCommentsPermissions < ActiveRecord::Migration # model removed class Permission < ActiveRecord::Base; end diff --git a/db/migrate/013_create_queries.rb b/db/migrate/013_create_queries.rb index e0e8c90c..b7acd2e3 100644 --- a/db/migrate/013_create_queries.rb +++ b/db/migrate/013_create_queries.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class CreateQueries < ActiveRecord::Migration def self.up create_table :queries, :force => true do |t| diff --git a/db/migrate/014_add_queries_permissions.rb b/db/migrate/014_add_queries_permissions.rb index 34eba1e2..ac04869c 100644 --- a/db/migrate/014_add_queries_permissions.rb +++ b/db/migrate/014_add_queries_permissions.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddQueriesPermissions < ActiveRecord::Migration # model removed class Permission < ActiveRecord::Base; end diff --git a/db/migrate/015_create_repositories.rb b/db/migrate/015_create_repositories.rb index d8c0524b..f0ec0189 100644 --- a/db/migrate/015_create_repositories.rb +++ b/db/migrate/015_create_repositories.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class CreateRepositories < ActiveRecord::Migration def self.up create_table :repositories, :force => true do |t| diff --git a/db/migrate/016_add_repositories_permissions.rb b/db/migrate/016_add_repositories_permissions.rb index 34170763..eb6e7bd1 100644 --- a/db/migrate/016_add_repositories_permissions.rb +++ b/db/migrate/016_add_repositories_permissions.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddRepositoriesPermissions < ActiveRecord::Migration # model removed class Permission < ActiveRecord::Base; end diff --git a/db/migrate/017_create_settings.rb b/db/migrate/017_create_settings.rb index 99f96adf..9fe59661 100644 --- a/db/migrate/017_create_settings.rb +++ b/db/migrate/017_create_settings.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class CreateSettings < ActiveRecord::Migration def self.up create_table :settings, :force => true do |t| diff --git a/db/migrate/018_set_doc_and_files_notifications.rb b/db/migrate/018_set_doc_and_files_notifications.rb index 8c1d054c..9848c60d 100644 --- a/db/migrate/018_set_doc_and_files_notifications.rb +++ b/db/migrate/018_set_doc_and_files_notifications.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class SetDocAndFilesNotifications < ActiveRecord::Migration # model removed class Permission < ActiveRecord::Base; end diff --git a/db/migrate/019_add_issue_status_position.rb b/db/migrate/019_add_issue_status_position.rb index ed24d27c..aa588426 100644 --- a/db/migrate/019_add_issue_status_position.rb +++ b/db/migrate/019_add_issue_status_position.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddIssueStatusPosition < ActiveRecord::Migration def self.up add_column :issue_statuses, :position, :integer, :default => 1 diff --git a/db/migrate/020_add_role_position.rb b/db/migrate/020_add_role_position.rb index e220bd9f..5e39691e 100644 --- a/db/migrate/020_add_role_position.rb +++ b/db/migrate/020_add_role_position.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddRolePosition < ActiveRecord::Migration def self.up add_column :roles, :position, :integer, :default => 1 diff --git a/db/migrate/021_add_tracker_position.rb b/db/migrate/021_add_tracker_position.rb index ef977562..712fa20f 100644 --- a/db/migrate/021_add_tracker_position.rb +++ b/db/migrate/021_add_tracker_position.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddTrackerPosition < ActiveRecord::Migration def self.up add_column :trackers, :position, :integer, :default => 1 diff --git a/db/migrate/022_serialize_possibles_values.rb b/db/migrate/022_serialize_possibles_values.rb index 5158f37f..3360f1f3 100644 --- a/db/migrate/022_serialize_possibles_values.rb +++ b/db/migrate/022_serialize_possibles_values.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class SerializePossiblesValues < ActiveRecord::Migration def self.up CustomField.find(:all).each do |field| diff --git a/db/migrate/023_add_tracker_is_in_roadmap.rb b/db/migrate/023_add_tracker_is_in_roadmap.rb index 82ef87bb..c521f652 100644 --- a/db/migrate/023_add_tracker_is_in_roadmap.rb +++ b/db/migrate/023_add_tracker_is_in_roadmap.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddTrackerIsInRoadmap < ActiveRecord::Migration def self.up add_column :trackers, :is_in_roadmap, :boolean, :default => true, :null => false diff --git a/db/migrate/024_add_roadmap_permission.rb b/db/migrate/024_add_roadmap_permission.rb index 5c37beac..fffcde10 100644 --- a/db/migrate/024_add_roadmap_permission.rb +++ b/db/migrate/024_add_roadmap_permission.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddRoadmapPermission < ActiveRecord::Migration # model removed class Permission < ActiveRecord::Base; end diff --git a/db/migrate/025_add_search_permission.rb b/db/migrate/025_add_search_permission.rb index a942b01b..e279abe8 100644 --- a/db/migrate/025_add_search_permission.rb +++ b/db/migrate/025_add_search_permission.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddSearchPermission < ActiveRecord::Migration # model removed class Permission < ActiveRecord::Base; end diff --git a/db/migrate/026_add_repository_login_and_password.rb b/db/migrate/026_add_repository_login_and_password.rb index 5fc91972..a1c69f5b 100644 --- a/db/migrate/026_add_repository_login_and_password.rb +++ b/db/migrate/026_add_repository_login_and_password.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddRepositoryLoginAndPassword < ActiveRecord::Migration def self.up add_column :repositories, :login, :string, :limit => 60, :default => "" diff --git a/db/migrate/027_create_wikis.rb b/db/migrate/027_create_wikis.rb index ed678429..43529353 100644 --- a/db/migrate/027_create_wikis.rb +++ b/db/migrate/027_create_wikis.rb @@ -1,10 +1,23 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class CreateWikis < ActiveRecord::Migration def self.up create_table :wikis do |t| t.column :project_id, :integer, :null => false t.column :start_page, :string, :limit => 255, :null => false t.column :status, :integer, :default => 1, :null => false - end + end add_index :wikis, :project_id, :name => :wikis_project_id end diff --git a/db/migrate/028_create_wiki_pages.rb b/db/migrate/028_create_wiki_pages.rb index 535cbfb0..4b32a206 100644 --- a/db/migrate/028_create_wiki_pages.rb +++ b/db/migrate/028_create_wiki_pages.rb @@ -1,9 +1,22 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class CreateWikiPages < ActiveRecord::Migration def self.up create_table :wiki_pages do |t| t.column :wiki_id, :integer, :null => false t.column :title, :string, :limit => 255, :null => false - t.column :created_on, :datetime, :null => false + t.column :created_on, :datetime, :null => false end add_index :wiki_pages, [:wiki_id, :title], :name => :wiki_pages_wiki_id_title end diff --git a/db/migrate/029_create_wiki_contents.rb b/db/migrate/029_create_wiki_contents.rb index c5c9f2a4..26ec9ca7 100644 --- a/db/migrate/029_create_wiki_contents.rb +++ b/db/migrate/029_create_wiki_contents.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class CreateWikiContents < ActiveRecord::Migration def self.up create_table :wiki_contents do |t| @@ -9,7 +22,7 @@ class CreateWikiContents < ActiveRecord::Migration t.column :version, :integer, :null => false end add_index :wiki_contents, :page_id, :name => :wiki_contents_page_id - + create_table :wiki_content_versions do |t| t.column :wiki_content_id, :integer, :null => false t.column :page_id, :integer, :null => false diff --git a/db/migrate/030_add_projects_feeds_permissions.rb b/db/migrate/030_add_projects_feeds_permissions.rb index 7f97035b..79808041 100644 --- a/db/migrate/030_add_projects_feeds_permissions.rb +++ b/db/migrate/030_add_projects_feeds_permissions.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddProjectsFeedsPermissions < ActiveRecord::Migration # model removed class Permission < ActiveRecord::Base; end diff --git a/db/migrate/031_add_repository_root_url.rb b/db/migrate/031_add_repository_root_url.rb index df57809c..85d8a5e8 100644 --- a/db/migrate/031_add_repository_root_url.rb +++ b/db/migrate/031_add_repository_root_url.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddRepositoryRootUrl < ActiveRecord::Migration def self.up add_column :repositories, :root_url, :string, :limit => 255, :default => "" diff --git a/db/migrate/032_create_time_entries.rb b/db/migrate/032_create_time_entries.rb index 9b9a54eb..cee090a8 100644 --- a/db/migrate/032_create_time_entries.rb +++ b/db/migrate/032_create_time_entries.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class CreateTimeEntries < ActiveRecord::Migration def self.up create_table :time_entries do |t| diff --git a/db/migrate/033_add_timelog_permissions.rb b/db/migrate/033_add_timelog_permissions.rb index ab9c809e..023ea13b 100644 --- a/db/migrate/033_add_timelog_permissions.rb +++ b/db/migrate/033_add_timelog_permissions.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddTimelogPermissions < ActiveRecord::Migration # model removed class Permission < ActiveRecord::Base; end diff --git a/db/migrate/034_create_changesets.rb b/db/migrate/034_create_changesets.rb index 612fd46b..79cd3efa 100644 --- a/db/migrate/034_create_changesets.rb +++ b/db/migrate/034_create_changesets.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class CreateChangesets < ActiveRecord::Migration def self.up create_table :changesets do |t| diff --git a/db/migrate/035_create_changes.rb b/db/migrate/035_create_changes.rb index fa0cfac3..7054e5dd 100644 --- a/db/migrate/035_create_changes.rb +++ b/db/migrate/035_create_changes.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class CreateChanges < ActiveRecord::Migration def self.up create_table :changes do |t| diff --git a/db/migrate/036_add_changeset_commit_date.rb b/db/migrate/036_add_changeset_commit_date.rb index b9cc49b8..69c3d7c8 100644 --- a/db/migrate/036_add_changeset_commit_date.rb +++ b/db/migrate/036_add_changeset_commit_date.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddChangesetCommitDate < ActiveRecord::Migration def self.up add_column :changesets, :commit_date, :date diff --git a/db/migrate/037_add_project_identifier.rb b/db/migrate/037_add_project_identifier.rb index 0fd8c751..ef5bcdaf 100644 --- a/db/migrate/037_add_project_identifier.rb +++ b/db/migrate/037_add_project_identifier.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddProjectIdentifier < ActiveRecord::Migration def self.up add_column :projects, :identifier, :string, :limit => 20 diff --git a/db/migrate/038_add_custom_field_is_filter.rb b/db/migrate/038_add_custom_field_is_filter.rb index 519ee0bd..28cfae74 100644 --- a/db/migrate/038_add_custom_field_is_filter.rb +++ b/db/migrate/038_add_custom_field_is_filter.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddCustomFieldIsFilter < ActiveRecord::Migration def self.up add_column :custom_fields, :is_filter, :boolean, :null => false, :default => false diff --git a/db/migrate/039_create_watchers.rb b/db/migrate/039_create_watchers.rb index 9579e19a..e0f80a54 100644 --- a/db/migrate/039_create_watchers.rb +++ b/db/migrate/039_create_watchers.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class CreateWatchers < ActiveRecord::Migration def self.up create_table :watchers do |t| diff --git a/db/migrate/040_create_changesets_issues.rb b/db/migrate/040_create_changesets_issues.rb index 494d3cc4..125f3fca 100644 --- a/db/migrate/040_create_changesets_issues.rb +++ b/db/migrate/040_create_changesets_issues.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class CreateChangesetsIssues < ActiveRecord::Migration def self.up create_table :changesets_issues, :id => false do |t| diff --git a/db/migrate/041_rename_comment_to_comments.rb b/db/migrate/041_rename_comment_to_comments.rb index 93677e57..d9e7f460 100644 --- a/db/migrate/041_rename_comment_to_comments.rb +++ b/db/migrate/041_rename_comment_to_comments.rb @@ -1,8 +1,21 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class RenameCommentToComments < ActiveRecord::Migration def self.up rename_column(:comments, :comment, :comments) if ActiveRecord::Base.connection.columns(Comment.table_name).detect{|c| c.name == "comment"} rename_column(:wiki_contents, :comment, :comments) if ActiveRecord::Base.connection.columns(WikiContent.table_name).detect{|c| c.name == "comment"} - rename_column(:wiki_content_versions, :comment, :comments) if ActiveRecord::Base.connection.columns(WikiContent.versioned_table_name).detect{|c| c.name == "comment"} + rename_column(:wiki_content_versions, :comment, :comments) if ActiveRecord::Base.connection.columns("wiki_content_versions").detect{|c| c.name == "comment"} rename_column(:time_entries, :comment, :comments) if ActiveRecord::Base.connection.columns(TimeEntry.table_name).detect{|c| c.name == "comment"} rename_column(:changesets, :comment, :comments) if ActiveRecord::Base.connection.columns(Changeset.table_name).detect{|c| c.name == "comment"} end diff --git a/db/migrate/042_create_issue_relations.rb b/db/migrate/042_create_issue_relations.rb index 802c1243..8c3fd6de 100644 --- a/db/migrate/042_create_issue_relations.rb +++ b/db/migrate/042_create_issue_relations.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class CreateIssueRelations < ActiveRecord::Migration def self.up create_table :issue_relations do |t| diff --git a/db/migrate/043_add_relations_permissions.rb b/db/migrate/043_add_relations_permissions.rb index 32d464a5..a505b905 100644 --- a/db/migrate/043_add_relations_permissions.rb +++ b/db/migrate/043_add_relations_permissions.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddRelationsPermissions < ActiveRecord::Migration # model removed class Permission < ActiveRecord::Base; end diff --git a/db/migrate/044_set_language_length_to_five.rb b/db/migrate/044_set_language_length_to_five.rb index a417f7d7..9443f107 100644 --- a/db/migrate/044_set_language_length_to_five.rb +++ b/db/migrate/044_set_language_length_to_five.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class SetLanguageLengthToFive < ActiveRecord::Migration def self.up change_column :users, :language, :string, :limit => 5, :default => "" diff --git a/db/migrate/045_create_boards.rb b/db/migrate/045_create_boards.rb index 17f2bbbe..c998933a 100644 --- a/db/migrate/045_create_boards.rb +++ b/db/migrate/045_create_boards.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class CreateBoards < ActiveRecord::Migration def self.up create_table :boards do |t| diff --git a/db/migrate/046_create_messages.rb b/db/migrate/046_create_messages.rb index d99aaf84..0c4eecf4 100644 --- a/db/migrate/046_create_messages.rb +++ b/db/migrate/046_create_messages.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class CreateMessages < ActiveRecord::Migration def self.up create_table :messages do |t| diff --git a/db/migrate/047_add_boards_permissions.rb b/db/migrate/047_add_boards_permissions.rb index 5b1f6f77..eae89db2 100644 --- a/db/migrate/047_add_boards_permissions.rb +++ b/db/migrate/047_add_boards_permissions.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddBoardsPermissions < ActiveRecord::Migration # model removed class Permission < ActiveRecord::Base; end diff --git a/db/migrate/048_allow_null_version_effective_date.rb b/db/migrate/048_allow_null_version_effective_date.rb index 82d2a33e..6e762340 100644 --- a/db/migrate/048_allow_null_version_effective_date.rb +++ b/db/migrate/048_allow_null_version_effective_date.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AllowNullVersionEffectiveDate < ActiveRecord::Migration def self.up change_column :versions, :effective_date, :date, :default => nil, :null => true diff --git a/db/migrate/049_add_wiki_destroy_page_permission.rb b/db/migrate/049_add_wiki_destroy_page_permission.rb index c8215238..0fe37d64 100644 --- a/db/migrate/049_add_wiki_destroy_page_permission.rb +++ b/db/migrate/049_add_wiki_destroy_page_permission.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddWikiDestroyPagePermission < ActiveRecord::Migration # model removed class Permission < ActiveRecord::Base; end diff --git a/db/migrate/050_add_wiki_attachments_permissions.rb b/db/migrate/050_add_wiki_attachments_permissions.rb index c0697be9..a365993f 100644 --- a/db/migrate/050_add_wiki_attachments_permissions.rb +++ b/db/migrate/050_add_wiki_attachments_permissions.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddWikiAttachmentsPermissions < ActiveRecord::Migration # model removed class Permission < ActiveRecord::Base; end diff --git a/db/migrate/051_add_project_status.rb b/db/migrate/051_add_project_status.rb index fba36d23..3ee33450 100644 --- a/db/migrate/051_add_project_status.rb +++ b/db/migrate/051_add_project_status.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddProjectStatus < ActiveRecord::Migration def self.up add_column :projects, :status, :integer, :default => 1, :null => false diff --git a/db/migrate/052_add_changes_revision.rb b/db/migrate/052_add_changes_revision.rb index 6f58c1a7..ce3d8eda 100644 --- a/db/migrate/052_add_changes_revision.rb +++ b/db/migrate/052_add_changes_revision.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddChangesRevision < ActiveRecord::Migration def self.up add_column :changes, :revision, :string diff --git a/db/migrate/053_add_changes_branch.rb b/db/migrate/053_add_changes_branch.rb index 998ce2ba..4a8bc5dd 100644 --- a/db/migrate/053_add_changes_branch.rb +++ b/db/migrate/053_add_changes_branch.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddChangesBranch < ActiveRecord::Migration def self.up add_column :changes, :branch, :string diff --git a/db/migrate/054_add_changesets_scmid.rb b/db/migrate/054_add_changesets_scmid.rb index 188fa6ef..7de569bf 100644 --- a/db/migrate/054_add_changesets_scmid.rb +++ b/db/migrate/054_add_changesets_scmid.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddChangesetsScmid < ActiveRecord::Migration def self.up add_column :changesets, :scmid, :string diff --git a/db/migrate/055_add_repositories_type.rb b/db/migrate/055_add_repositories_type.rb index 599f70aa..1fb4f9e5 100644 --- a/db/migrate/055_add_repositories_type.rb +++ b/db/migrate/055_add_repositories_type.rb @@ -1,6 +1,19 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddRepositoriesType < ActiveRecord::Migration def self.up - add_column :repositories, :type, :string + add_column :repositories, :type, :string # Set class name for existing SVN repositories Repository.update_all "type = 'Subversion'" end diff --git a/db/migrate/056_add_repositories_changes_permission.rb b/db/migrate/056_add_repositories_changes_permission.rb index 0d9b13b5..9275e820 100644 --- a/db/migrate/056_add_repositories_changes_permission.rb +++ b/db/migrate/056_add_repositories_changes_permission.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddRepositoriesChangesPermission < ActiveRecord::Migration # model removed class Permission < ActiveRecord::Base; end diff --git a/db/migrate/057_add_versions_wiki_page_title.rb b/db/migrate/057_add_versions_wiki_page_title.rb index 58b8fd9a..6c7af230 100644 --- a/db/migrate/057_add_versions_wiki_page_title.rb +++ b/db/migrate/057_add_versions_wiki_page_title.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddVersionsWikiPageTitle < ActiveRecord::Migration def self.up add_column :versions, :wiki_page_title, :string diff --git a/db/migrate/058_add_issue_categories_assigned_to_id.rb b/db/migrate/058_add_issue_categories_assigned_to_id.rb index 8653532e..f0c533d4 100644 --- a/db/migrate/058_add_issue_categories_assigned_to_id.rb +++ b/db/migrate/058_add_issue_categories_assigned_to_id.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddIssueCategoriesAssignedToId < ActiveRecord::Migration def self.up add_column :issue_categories, :assigned_to_id, :integer diff --git a/db/migrate/059_add_roles_assignable.rb b/db/migrate/059_add_roles_assignable.rb index a1ba7963..fe08e30c 100644 --- a/db/migrate/059_add_roles_assignable.rb +++ b/db/migrate/059_add_roles_assignable.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddRolesAssignable < ActiveRecord::Migration def self.up add_column :roles, :assignable, :boolean, :default => true diff --git a/db/migrate/060_change_changesets_committer_limit.rb b/db/migrate/060_change_changesets_committer_limit.rb index b0509637..07380fe0 100644 --- a/db/migrate/060_change_changesets_committer_limit.rb +++ b/db/migrate/060_change_changesets_committer_limit.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class ChangeChangesetsCommitterLimit < ActiveRecord::Migration def self.up change_column :changesets, :committer, :string, :limit => nil diff --git a/db/migrate/061_add_roles_builtin.rb b/db/migrate/061_add_roles_builtin.rb index a8d6fe9e..ffd9eb48 100644 --- a/db/migrate/061_add_roles_builtin.rb +++ b/db/migrate/061_add_roles_builtin.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddRolesBuiltin < ActiveRecord::Migration def self.up add_column :roles, :builtin, :integer, :default => 0, :null => false diff --git a/db/migrate/062_insert_builtin_roles.rb b/db/migrate/062_insert_builtin_roles.rb index 27c7475c..5e0ebfed 100644 --- a/db/migrate/062_insert_builtin_roles.rb +++ b/db/migrate/062_insert_builtin_roles.rb @@ -1,12 +1,25 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class InsertBuiltinRoles < ActiveRecord::Migration def self.up nonmember = Role.new(:name => 'Non member', :position => 0) nonmember.builtin = Role::BUILTIN_NON_MEMBER nonmember.save - + anonymous = Role.new(:name => 'Anonymous', :position => 0) anonymous.builtin = Role::BUILTIN_ANONYMOUS - anonymous.save + anonymous.save end def self.down diff --git a/db/migrate/063_add_roles_permissions.rb b/db/migrate/063_add_roles_permissions.rb index 107a3af0..f5f4d0c5 100644 --- a/db/migrate/063_add_roles_permissions.rb +++ b/db/migrate/063_add_roles_permissions.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddRolesPermissions < ActiveRecord::Migration def self.up add_column :roles, :permissions, :text diff --git a/db/migrate/064_drop_permissions.rb b/db/migrate/064_drop_permissions.rb index f4ca470b..92db77d1 100644 --- a/db/migrate/064_drop_permissions.rb +++ b/db/migrate/064_drop_permissions.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class DropPermissions < ActiveRecord::Migration def self.up drop_table :permissions diff --git a/db/migrate/065_add_settings_updated_on.rb b/db/migrate/065_add_settings_updated_on.rb index 8c5fde33..bcce8777 100644 --- a/db/migrate/065_add_settings_updated_on.rb +++ b/db/migrate/065_add_settings_updated_on.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddSettingsUpdatedOn < ActiveRecord::Migration def self.up add_column :settings, :updated_on, :timestamp diff --git a/db/migrate/066_add_custom_value_customized_index.rb b/db/migrate/066_add_custom_value_customized_index.rb index 1f4c40da..4f312dc1 100644 --- a/db/migrate/066_add_custom_value_customized_index.rb +++ b/db/migrate/066_add_custom_value_customized_index.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddCustomValueCustomizedIndex < ActiveRecord::Migration def self.up add_index :custom_values, [:customized_type, :customized_id], :name => :custom_values_customized diff --git a/db/migrate/067_create_wiki_redirects.rb b/db/migrate/067_create_wiki_redirects.rb index dda6ba6d..d771ae29 100644 --- a/db/migrate/067_create_wiki_redirects.rb +++ b/db/migrate/067_create_wiki_redirects.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class CreateWikiRedirects < ActiveRecord::Migration def self.up create_table :wiki_redirects do |t| diff --git a/db/migrate/068_create_enabled_modules.rb b/db/migrate/068_create_enabled_modules.rb index fd848ef9..88710ab7 100644 --- a/db/migrate/068_create_enabled_modules.rb +++ b/db/migrate/068_create_enabled_modules.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class CreateEnabledModules < ActiveRecord::Migration def self.up create_table :enabled_modules do |t| @@ -5,7 +18,7 @@ class CreateEnabledModules < ActiveRecord::Migration t.column :name, :string, :null => false end add_index :enabled_modules, [:project_id], :name => :enabled_modules_project_id - + # Enable all modules for existing projects Project.find(:all).each do |project| project.enabled_module_names = Redmine::AccessControl.available_project_modules diff --git a/db/migrate/069_add_issues_estimated_hours.rb b/db/migrate/069_add_issues_estimated_hours.rb index 90b86e24..ad0ba91a 100644 --- a/db/migrate/069_add_issues_estimated_hours.rb +++ b/db/migrate/069_add_issues_estimated_hours.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddIssuesEstimatedHours < ActiveRecord::Migration def self.up add_column :issues, :estimated_hours, :float diff --git a/db/migrate/070_change_attachments_content_type_limit.rb b/db/migrate/070_change_attachments_content_type_limit.rb index ebf6d08c..96f2e386 100644 --- a/db/migrate/070_change_attachments_content_type_limit.rb +++ b/db/migrate/070_change_attachments_content_type_limit.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class ChangeAttachmentsContentTypeLimit < ActiveRecord::Migration def self.up change_column :attachments, :content_type, :string, :limit => nil diff --git a/db/migrate/071_add_queries_column_names.rb b/db/migrate/071_add_queries_column_names.rb index acaf4dab..d16f9d96 100644 --- a/db/migrate/071_add_queries_column_names.rb +++ b/db/migrate/071_add_queries_column_names.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddQueriesColumnNames < ActiveRecord::Migration def self.up add_column :queries, :column_names, :text diff --git a/db/migrate/072_add_enumerations_position.rb b/db/migrate/072_add_enumerations_position.rb index 22558a6e..15ca532e 100644 --- a/db/migrate/072_add_enumerations_position.rb +++ b/db/migrate/072_add_enumerations_position.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddEnumerationsPosition < ActiveRecord::Migration def self.up add_column(:enumerations, :position, :integer, :default => 1) unless Enumeration.column_names.include?('position') diff --git a/db/migrate/073_add_enumerations_is_default.rb b/db/migrate/073_add_enumerations_is_default.rb index 7365a141..6a304f9d 100644 --- a/db/migrate/073_add_enumerations_is_default.rb +++ b/db/migrate/073_add_enumerations_is_default.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddEnumerationsIsDefault < ActiveRecord::Migration def self.up add_column :enumerations, :is_default, :boolean, :default => false, :null => false diff --git a/db/migrate/074_add_auth_sources_tls.rb b/db/migrate/074_add_auth_sources_tls.rb index 3987f703..0c86fa41 100644 --- a/db/migrate/074_add_auth_sources_tls.rb +++ b/db/migrate/074_add_auth_sources_tls.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddAuthSourcesTls < ActiveRecord::Migration def self.up add_column :auth_sources, :tls, :boolean, :default => false, :null => false diff --git a/db/migrate/075_add_members_mail_notification.rb b/db/migrate/075_add_members_mail_notification.rb index d83ba8dd..d818f685 100644 --- a/db/migrate/075_add_members_mail_notification.rb +++ b/db/migrate/075_add_members_mail_notification.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddMembersMailNotification < ActiveRecord::Migration def self.up add_column :members, :mail_notification, :boolean, :default => false, :null => false diff --git a/db/migrate/076_allow_null_position.rb b/db/migrate/076_allow_null_position.rb index ece0370d..78e43976 100644 --- a/db/migrate/076_allow_null_position.rb +++ b/db/migrate/076_allow_null_position.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AllowNullPosition < ActiveRecord::Migration def self.up # removes the 'not null' constraint on position fields diff --git a/db/migrate/077_remove_issue_statuses_html_color.rb b/db/migrate/077_remove_issue_statuses_html_color.rb index a3e2c3f8..3c68bd32 100644 --- a/db/migrate/077_remove_issue_statuses_html_color.rb +++ b/db/migrate/077_remove_issue_statuses_html_color.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class RemoveIssueStatusesHtmlColor < ActiveRecord::Migration def self.up remove_column :issue_statuses, :html_color diff --git a/db/migrate/078_add_custom_fields_position.rb b/db/migrate/078_add_custom_fields_position.rb index 1c42ae73..7d904c6e 100644 --- a/db/migrate/078_add_custom_fields_position.rb +++ b/db/migrate/078_add_custom_fields_position.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddCustomFieldsPosition < ActiveRecord::Migration def self.up add_column(:custom_fields, :position, :integer, :default => 1) diff --git a/db/migrate/079_add_user_preferences_time_zone.rb b/db/migrate/079_add_user_preferences_time_zone.rb index 9e36790a..842d307c 100644 --- a/db/migrate/079_add_user_preferences_time_zone.rb +++ b/db/migrate/079_add_user_preferences_time_zone.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddUserPreferencesTimeZone < ActiveRecord::Migration def self.up add_column :user_preferences, :time_zone, :string diff --git a/db/migrate/080_add_users_type.rb b/db/migrate/080_add_users_type.rb index c907b472..9e4ad2ac 100644 --- a/db/migrate/080_add_users_type.rb +++ b/db/migrate/080_add_users_type.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddUsersType < ActiveRecord::Migration def self.up add_column :users, :type, :string diff --git a/db/migrate/081_create_projects_trackers.rb b/db/migrate/081_create_projects_trackers.rb index 70fea188..645ac63a 100644 --- a/db/migrate/081_create_projects_trackers.rb +++ b/db/migrate/081_create_projects_trackers.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class CreateProjectsTrackers < ActiveRecord::Migration def self.up create_table :projects_trackers, :id => false do |t| @@ -5,7 +18,7 @@ class CreateProjectsTrackers < ActiveRecord::Migration t.column :tracker_id, :integer, :default => 0, :null => false end add_index :projects_trackers, :project_id, :name => :projects_trackers_project_id - + # Associates all trackers to all projects (as it was before) tracker_ids = Tracker.find(:all).collect(&:id) Project.find(:all).each do |project| diff --git a/db/migrate/082_add_messages_locked.rb b/db/migrate/082_add_messages_locked.rb index 20a17256..44ba4bc2 100644 --- a/db/migrate/082_add_messages_locked.rb +++ b/db/migrate/082_add_messages_locked.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddMessagesLocked < ActiveRecord::Migration def self.up add_column :messages, :locked, :boolean, :default => false diff --git a/db/migrate/083_add_messages_sticky.rb b/db/migrate/083_add_messages_sticky.rb index 8fd5d2ce..d6e3ff27 100644 --- a/db/migrate/083_add_messages_sticky.rb +++ b/db/migrate/083_add_messages_sticky.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddMessagesSticky < ActiveRecord::Migration def self.up add_column :messages, :sticky, :integer, :default => 0 diff --git a/db/migrate/084_change_auth_sources_account_limit.rb b/db/migrate/084_change_auth_sources_account_limit.rb index cc127b43..e7e58781 100644 --- a/db/migrate/084_change_auth_sources_account_limit.rb +++ b/db/migrate/084_change_auth_sources_account_limit.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class ChangeAuthSourcesAccountLimit < ActiveRecord::Migration def self.up change_column :auth_sources, :account, :string, :limit => nil diff --git a/db/migrate/085_add_role_tracker_old_status_index_to_workflows.rb b/db/migrate/085_add_role_tracker_old_status_index_to_workflows.rb index a59135be..fc5a7952 100644 --- a/db/migrate/085_add_role_tracker_old_status_index_to_workflows.rb +++ b/db/migrate/085_add_role_tracker_old_status_index_to_workflows.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddRoleTrackerOldStatusIndexToWorkflows < ActiveRecord::Migration def self.up add_index :workflows, [:role_id, :tracker_id, :old_status_id], :name => :wkfs_role_tracker_old_status diff --git a/db/migrate/086_add_custom_fields_searchable.rb b/db/migrate/086_add_custom_fields_searchable.rb index 53158d14..0e311f6c 100644 --- a/db/migrate/086_add_custom_fields_searchable.rb +++ b/db/migrate/086_add_custom_fields_searchable.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddCustomFieldsSearchable < ActiveRecord::Migration def self.up add_column :custom_fields, :searchable, :boolean, :default => false diff --git a/db/migrate/087_change_projects_description_to_text.rb b/db/migrate/087_change_projects_description_to_text.rb index 132e921b..a167d87d 100644 --- a/db/migrate/087_change_projects_description_to_text.rb +++ b/db/migrate/087_change_projects_description_to_text.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class ChangeProjectsDescriptionToText < ActiveRecord::Migration def self.up change_column :projects, :description, :text, :null => true, :default => nil diff --git a/db/migrate/088_add_custom_fields_default_value.rb b/db/migrate/088_add_custom_fields_default_value.rb index 33a39ec6..b9c14dde 100644 --- a/db/migrate/088_add_custom_fields_default_value.rb +++ b/db/migrate/088_add_custom_fields_default_value.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddCustomFieldsDefaultValue < ActiveRecord::Migration def self.up add_column :custom_fields, :default_value, :text diff --git a/db/migrate/089_add_attachments_description.rb b/db/migrate/089_add_attachments_description.rb index 411dfe4d..b11c96cc 100644 --- a/db/migrate/089_add_attachments_description.rb +++ b/db/migrate/089_add_attachments_description.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddAttachmentsDescription < ActiveRecord::Migration def self.up add_column :attachments, :description, :string diff --git a/db/migrate/090_change_versions_name_limit.rb b/db/migrate/090_change_versions_name_limit.rb index 27642972..90a608e7 100644 --- a/db/migrate/090_change_versions_name_limit.rb +++ b/db/migrate/090_change_versions_name_limit.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class ChangeVersionsNameLimit < ActiveRecord::Migration def self.up change_column :versions, :name, :string, :limit => nil diff --git a/db/migrate/091_change_changesets_revision_to_string.rb b/db/migrate/091_change_changesets_revision_to_string.rb index e621a390..126f3a15 100644 --- a/db/migrate/091_change_changesets_revision_to_string.rb +++ b/db/migrate/091_change_changesets_revision_to_string.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class ChangeChangesetsRevisionToString < ActiveRecord::Migration def self.up change_column :changesets, :revision, :string, :null => false diff --git a/db/migrate/092_change_changes_from_revision_to_string.rb b/db/migrate/092_change_changes_from_revision_to_string.rb index b298a3f4..5793631a 100644 --- a/db/migrate/092_change_changes_from_revision_to_string.rb +++ b/db/migrate/092_change_changes_from_revision_to_string.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class ChangeChangesFromRevisionToString < ActiveRecord::Migration def self.up change_column :changes, :from_revision, :string diff --git a/db/migrate/093_add_wiki_pages_protected.rb b/db/migrate/093_add_wiki_pages_protected.rb index 49720fbb..c28bd4d9 100644 --- a/db/migrate/093_add_wiki_pages_protected.rb +++ b/db/migrate/093_add_wiki_pages_protected.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddWikiPagesProtected < ActiveRecord::Migration def self.up add_column :wiki_pages, :protected, :boolean, :default => false, :null => false diff --git a/db/migrate/094_change_projects_homepage_limit.rb b/db/migrate/094_change_projects_homepage_limit.rb index 98374aa4..e403c2b7 100644 --- a/db/migrate/094_change_projects_homepage_limit.rb +++ b/db/migrate/094_change_projects_homepage_limit.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class ChangeProjectsHomepageLimit < ActiveRecord::Migration def self.up change_column :projects, :homepage, :string, :limit => nil, :default => '' diff --git a/db/migrate/095_add_wiki_pages_parent_id.rb b/db/migrate/095_add_wiki_pages_parent_id.rb index 36b922ec..73e67b03 100644 --- a/db/migrate/095_add_wiki_pages_parent_id.rb +++ b/db/migrate/095_add_wiki_pages_parent_id.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddWikiPagesParentId < ActiveRecord::Migration def self.up add_column :wiki_pages, :parent_id, :integer, :default => nil diff --git a/db/migrate/096_add_commit_access_permission.rb b/db/migrate/096_add_commit_access_permission.rb index f73af2c0..8482053e 100644 --- a/db/migrate/096_add_commit_access_permission.rb +++ b/db/migrate/096_add_commit_access_permission.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddCommitAccessPermission < ActiveRecord::Migration def self.up diff --git a/db/migrate/097_add_view_wiki_edits_permission.rb b/db/migrate/097_add_view_wiki_edits_permission.rb index 3e4b26b8..c5e37155 100644 --- a/db/migrate/097_add_view_wiki_edits_permission.rb +++ b/db/migrate/097_add_view_wiki_edits_permission.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddViewWikiEditsPermission < ActiveRecord::Migration def self.up Role.find(:all).each do |r| diff --git a/db/migrate/098_set_topic_authors_as_watchers.rb b/db/migrate/098_set_topic_authors_as_watchers.rb index 92a53f4a..e79ac1d5 100644 --- a/db/migrate/098_set_topic_authors_as_watchers.rb +++ b/db/migrate/098_set_topic_authors_as_watchers.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class SetTopicAuthorsAsWatchers < ActiveRecord::Migration def self.up # Sets active users who created/replied a topic as watchers of the topic diff --git a/db/migrate/099_add_delete_wiki_pages_attachments_permission.rb b/db/migrate/099_add_delete_wiki_pages_attachments_permission.rb index 1ff888f3..0e73fead 100644 --- a/db/migrate/099_add_delete_wiki_pages_attachments_permission.rb +++ b/db/migrate/099_add_delete_wiki_pages_attachments_permission.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddDeleteWikiPagesAttachmentsPermission < ActiveRecord::Migration def self.up Role.find(:all).each do |r| diff --git a/db/migrate/100_add_changesets_user_id.rb b/db/migrate/100_add_changesets_user_id.rb index 9b25fd7b..16ce342f 100644 --- a/db/migrate/100_add_changesets_user_id.rb +++ b/db/migrate/100_add_changesets_user_id.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddChangesetsUserId < ActiveRecord::Migration def self.up add_column :changesets, :user_id, :integer, :default => nil diff --git a/db/migrate/101_populate_changesets_user_id.rb b/db/migrate/101_populate_changesets_user_id.rb index dd493d17..a3576eed 100644 --- a/db/migrate/101_populate_changesets_user_id.rb +++ b/db/migrate/101_populate_changesets_user_id.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class PopulateChangesetsUserId < ActiveRecord::Migration def self.up committers = Changeset.connection.select_values("SELECT DISTINCT committer FROM #{Changeset.table_name}") diff --git a/db/migrate/102_add_custom_fields_editable.rb b/db/migrate/102_add_custom_fields_editable.rb index 949f9db9..fdc2ad19 100644 --- a/db/migrate/102_add_custom_fields_editable.rb +++ b/db/migrate/102_add_custom_fields_editable.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddCustomFieldsEditable < ActiveRecord::Migration def self.up add_column :custom_fields, :editable, :boolean, :default => true diff --git a/db/migrate/103_set_custom_fields_editable.rb b/db/migrate/103_set_custom_fields_editable.rb index 937649e6..a662cb11 100644 --- a/db/migrate/103_set_custom_fields_editable.rb +++ b/db/migrate/103_set_custom_fields_editable.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class SetCustomFieldsEditable < ActiveRecord::Migration def self.up UserCustomField.update_all("editable = #{CustomField.connection.quoted_false}") diff --git a/db/migrate/104_add_projects_lft_and_rgt.rb b/db/migrate/104_add_projects_lft_and_rgt.rb index 8952c16e..8d8eed87 100644 --- a/db/migrate/104_add_projects_lft_and_rgt.rb +++ b/db/migrate/104_add_projects_lft_and_rgt.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddProjectsLftAndRgt < ActiveRecord::Migration def self.up add_column :projects, :lft, :integer diff --git a/db/migrate/105_build_projects_tree.rb b/db/migrate/105_build_projects_tree.rb index 92799f97..8e819869 100644 --- a/db/migrate/105_build_projects_tree.rb +++ b/db/migrate/105_build_projects_tree.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class BuildProjectsTree < ActiveRecord::Migration def self.up Project.rebuild! diff --git a/db/migrate/106_remove_projects_projects_count.rb b/db/migrate/106_remove_projects_projects_count.rb index 68bb3d11..2f4b1ea8 100644 --- a/db/migrate/106_remove_projects_projects_count.rb +++ b/db/migrate/106_remove_projects_projects_count.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class RemoveProjectsProjectsCount < ActiveRecord::Migration def self.up remove_column :projects, :projects_count diff --git a/db/migrate/107_add_open_id_authentication_tables.rb b/db/migrate/107_add_open_id_authentication_tables.rb index caae0d8c..7f102d3e 100644 --- a/db/migrate/107_add_open_id_authentication_tables.rb +++ b/db/migrate/107_add_open_id_authentication_tables.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddOpenIdAuthenticationTables < ActiveRecord::Migration def self.up create_table :open_id_authentication_associations, :force => true do |t| diff --git a/db/migrate/108_add_identity_url_to_users.rb b/db/migrate/108_add_identity_url_to_users.rb index f5af77b2..ab73c15a 100644 --- a/db/migrate/108_add_identity_url_to_users.rb +++ b/db/migrate/108_add_identity_url_to_users.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddIdentityUrlToUsers < ActiveRecord::Migration def self.up add_column :users, :identity_url, :string diff --git a/db/migrate/20090214190337_add_watchers_user_id_type_index.rb b/db/migrate/20090214190337_add_watchers_user_id_type_index.rb index 7ff4e542..bf3210d8 100644 --- a/db/migrate/20090214190337_add_watchers_user_id_type_index.rb +++ b/db/migrate/20090214190337_add_watchers_user_id_type_index.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddWatchersUserIdTypeIndex < ActiveRecord::Migration def self.up add_index :watchers, [:user_id, :watchable_type], :name => :watchers_user_id_type diff --git a/db/migrate/20090312172426_add_queries_sort_criteria.rb b/db/migrate/20090312172426_add_queries_sort_criteria.rb index 743ed42f..0e7605c8 100644 --- a/db/migrate/20090312172426_add_queries_sort_criteria.rb +++ b/db/migrate/20090312172426_add_queries_sort_criteria.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddQueriesSortCriteria < ActiveRecord::Migration def self.up add_column :queries, :sort_criteria, :text diff --git a/db/migrate/20090312194159_add_projects_trackers_unique_index.rb b/db/migrate/20090312194159_add_projects_trackers_unique_index.rb index 02a8fa68..034f68d1 100644 --- a/db/migrate/20090312194159_add_projects_trackers_unique_index.rb +++ b/db/migrate/20090312194159_add_projects_trackers_unique_index.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddProjectsTrackersUniqueIndex < ActiveRecord::Migration def self.up remove_duplicates diff --git a/db/migrate/20090318181151_extend_settings_name.rb b/db/migrate/20090318181151_extend_settings_name.rb index eca03d55..769da1a9 100644 --- a/db/migrate/20090318181151_extend_settings_name.rb +++ b/db/migrate/20090318181151_extend_settings_name.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class ExtendSettingsName < ActiveRecord::Migration def self.up change_column :settings, :name, :string, :limit => 255, :default => '', :null => false diff --git a/db/migrate/20090323224724_add_type_to_enumerations.rb b/db/migrate/20090323224724_add_type_to_enumerations.rb index c2aef5e4..2f8f27e8 100644 --- a/db/migrate/20090323224724_add_type_to_enumerations.rb +++ b/db/migrate/20090323224724_add_type_to_enumerations.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddTypeToEnumerations < ActiveRecord::Migration def self.up add_column :enumerations, :type, :string diff --git a/db/migrate/20090401221305_update_enumerations_to_sti.rb b/db/migrate/20090401221305_update_enumerations_to_sti.rb index 50bd5201..c2b36d83 100644 --- a/db/migrate/20090401221305_update_enumerations_to_sti.rb +++ b/db/migrate/20090401221305_update_enumerations_to_sti.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class UpdateEnumerationsToSti < ActiveRecord::Migration def self.up Enumeration.update_all("type = 'IssuePriority'", "opt = 'IPRI'") diff --git a/db/migrate/20090401231134_add_active_field_to_enumerations.rb b/db/migrate/20090401231134_add_active_field_to_enumerations.rb index 55824fa6..6917adab 100644 --- a/db/migrate/20090401231134_add_active_field_to_enumerations.rb +++ b/db/migrate/20090401231134_add_active_field_to_enumerations.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddActiveFieldToEnumerations < ActiveRecord::Migration def self.up add_column :enumerations, :active, :boolean, :default => true, :null => false diff --git a/db/migrate/20090403001910_add_project_to_enumerations.rb b/db/migrate/20090403001910_add_project_to_enumerations.rb index a3db6d51..88e023ec 100644 --- a/db/migrate/20090403001910_add_project_to_enumerations.rb +++ b/db/migrate/20090403001910_add_project_to_enumerations.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddProjectToEnumerations < ActiveRecord::Migration def self.up add_column :enumerations, :project_id, :integer, :null => true, :default => nil diff --git a/db/migrate/20090406161854_add_parent_id_to_enumerations.rb b/db/migrate/20090406161854_add_parent_id_to_enumerations.rb index 2c1b1780..31840f73 100644 --- a/db/migrate/20090406161854_add_parent_id_to_enumerations.rb +++ b/db/migrate/20090406161854_add_parent_id_to_enumerations.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddParentIdToEnumerations < ActiveRecord::Migration def self.up add_column :enumerations, :parent_id, :integer, :null => true, :default => nil diff --git a/db/migrate/20090425161243_add_queries_group_by.rb b/db/migrate/20090425161243_add_queries_group_by.rb index 1405f3d0..55683da2 100644 --- a/db/migrate/20090425161243_add_queries_group_by.rb +++ b/db/migrate/20090425161243_add_queries_group_by.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddQueriesGroupBy < ActiveRecord::Migration def self.up add_column :queries, :group_by, :string diff --git a/db/migrate/20090503121501_create_member_roles.rb b/db/migrate/20090503121501_create_member_roles.rb index 38519ea7..cea37740 100644 --- a/db/migrate/20090503121501_create_member_roles.rb +++ b/db/migrate/20090503121501_create_member_roles.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class CreateMemberRoles < ActiveRecord::Migration def self.up create_table :member_roles do |t| diff --git a/db/migrate/20090503121505_populate_member_roles.rb b/db/migrate/20090503121505_populate_member_roles.rb index aae9fc61..c986b22e 100644 --- a/db/migrate/20090503121505_populate_member_roles.rb +++ b/db/migrate/20090503121505_populate_member_roles.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class PopulateMemberRoles < ActiveRecord::Migration def self.up MemberRole.delete_all diff --git a/db/migrate/20090503121510_drop_members_role_id.rb b/db/migrate/20090503121510_drop_members_role_id.rb index c2811991..b0d10c1c 100644 --- a/db/migrate/20090503121510_drop_members_role_id.rb +++ b/db/migrate/20090503121510_drop_members_role_id.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class DropMembersRoleId < ActiveRecord::Migration def self.up remove_column :members, :role_id diff --git a/db/migrate/20090614091200_fix_messages_sticky_null.rb b/db/migrate/20090614091200_fix_messages_sticky_null.rb index cbe74173..c094195a 100644 --- a/db/migrate/20090614091200_fix_messages_sticky_null.rb +++ b/db/migrate/20090614091200_fix_messages_sticky_null.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class FixMessagesStickyNull < ActiveRecord::Migration def self.up Message.update_all('sticky = 0', 'sticky IS NULL') diff --git a/db/migrate/20090704172350_populate_users_type.rb b/db/migrate/20090704172350_populate_users_type.rb index 1c31fece..02bd40ef 100644 --- a/db/migrate/20090704172350_populate_users_type.rb +++ b/db/migrate/20090704172350_populate_users_type.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class PopulateUsersType < ActiveRecord::Migration def self.up Principal.update_all("type = 'User'", "type IS NULL") diff --git a/db/migrate/20090704172355_create_groups_users.rb b/db/migrate/20090704172355_create_groups_users.rb index 9ce03b95..6ba77ba2 100644 --- a/db/migrate/20090704172355_create_groups_users.rb +++ b/db/migrate/20090704172355_create_groups_users.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class CreateGroupsUsers < ActiveRecord::Migration def self.up create_table :groups_users, :id => false do |t| diff --git a/db/migrate/20090704172358_add_member_roles_inherited_from.rb b/db/migrate/20090704172358_add_member_roles_inherited_from.rb index 4ffa5238..57f3ef08 100644 --- a/db/migrate/20090704172358_add_member_roles_inherited_from.rb +++ b/db/migrate/20090704172358_add_member_roles_inherited_from.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddMemberRolesInheritedFrom < ActiveRecord::Migration def self.up add_column :member_roles, :inherited_from, :integer diff --git a/db/migrate/20091010093521_fix_users_custom_values.rb b/db/migrate/20091010093521_fix_users_custom_values.rb index 923c78fc..031a8594 100644 --- a/db/migrate/20091010093521_fix_users_custom_values.rb +++ b/db/migrate/20091010093521_fix_users_custom_values.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class FixUsersCustomValues < ActiveRecord::Migration def self.up CustomValue.update_all("customized_type = 'Principal'", "customized_type = 'User'") diff --git a/db/migrate/20091017212227_add_missing_indexes_to_workflows.rb b/db/migrate/20091017212227_add_missing_indexes_to_workflows.rb index 13fa0137..b4e75c9a 100644 --- a/db/migrate/20091017212227_add_missing_indexes_to_workflows.rb +++ b/db/migrate/20091017212227_add_missing_indexes_to_workflows.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddMissingIndexesToWorkflows < ActiveRecord::Migration def self.up add_index :workflows, :old_status_id diff --git a/db/migrate/20091017212457_add_missing_indexes_to_custom_fields_projects.rb b/db/migrate/20091017212457_add_missing_indexes_to_custom_fields_projects.rb index b95f5432..cd9fae6d 100644 --- a/db/migrate/20091017212457_add_missing_indexes_to_custom_fields_projects.rb +++ b/db/migrate/20091017212457_add_missing_indexes_to_custom_fields_projects.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddMissingIndexesToCustomFieldsProjects < ActiveRecord::Migration def self.up add_index :custom_fields_projects, [:custom_field_id, :project_id] diff --git a/db/migrate/20091017212644_add_missing_indexes_to_messages.rb b/db/migrate/20091017212644_add_missing_indexes_to_messages.rb index 23c27299..ce88cda2 100644 --- a/db/migrate/20091017212644_add_missing_indexes_to_messages.rb +++ b/db/migrate/20091017212644_add_missing_indexes_to_messages.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddMissingIndexesToMessages < ActiveRecord::Migration def self.up add_index :messages, :last_reply_id diff --git a/db/migrate/20091017212938_add_missing_indexes_to_repositories.rb b/db/migrate/20091017212938_add_missing_indexes_to_repositories.rb index b9f43b6d..962d7c60 100644 --- a/db/migrate/20091017212938_add_missing_indexes_to_repositories.rb +++ b/db/migrate/20091017212938_add_missing_indexes_to_repositories.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddMissingIndexesToRepositories < ActiveRecord::Migration def self.up add_index :repositories, :project_id diff --git a/db/migrate/20091017213027_add_missing_indexes_to_comments.rb b/db/migrate/20091017213027_add_missing_indexes_to_comments.rb index 2a1ed27c..9dd1e1c5 100644 --- a/db/migrate/20091017213027_add_missing_indexes_to_comments.rb +++ b/db/migrate/20091017213027_add_missing_indexes_to_comments.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddMissingIndexesToComments < ActiveRecord::Migration def self.up add_index :comments, [:commented_id, :commented_type] diff --git a/db/migrate/20091017213113_add_missing_indexes_to_enumerations.rb b/db/migrate/20091017213113_add_missing_indexes_to_enumerations.rb index 85dedf81..04cc792a 100644 --- a/db/migrate/20091017213113_add_missing_indexes_to_enumerations.rb +++ b/db/migrate/20091017213113_add_missing_indexes_to_enumerations.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddMissingIndexesToEnumerations < ActiveRecord::Migration def self.up add_index :enumerations, [:id, :type] diff --git a/db/migrate/20091017213151_add_missing_indexes_to_wiki_pages.rb b/db/migrate/20091017213151_add_missing_indexes_to_wiki_pages.rb index 7fab09e3..7c949acb 100644 --- a/db/migrate/20091017213151_add_missing_indexes_to_wiki_pages.rb +++ b/db/migrate/20091017213151_add_missing_indexes_to_wiki_pages.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddMissingIndexesToWikiPages < ActiveRecord::Migration def self.up add_index :wiki_pages, :wiki_id diff --git a/db/migrate/20091017213228_add_missing_indexes_to_watchers.rb b/db/migrate/20091017213228_add_missing_indexes_to_watchers.rb index 618e1cd9..fb398e57 100644 --- a/db/migrate/20091017213228_add_missing_indexes_to_watchers.rb +++ b/db/migrate/20091017213228_add_missing_indexes_to_watchers.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddMissingIndexesToWatchers < ActiveRecord::Migration def self.up add_index :watchers, :user_id diff --git a/db/migrate/20091017213257_add_missing_indexes_to_auth_sources.rb b/db/migrate/20091017213257_add_missing_indexes_to_auth_sources.rb index ccd4f044..c2861d97 100644 --- a/db/migrate/20091017213257_add_missing_indexes_to_auth_sources.rb +++ b/db/migrate/20091017213257_add_missing_indexes_to_auth_sources.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddMissingIndexesToAuthSources < ActiveRecord::Migration def self.up add_index :auth_sources, [:id, :type] diff --git a/db/migrate/20091017213332_add_missing_indexes_to_documents.rb b/db/migrate/20091017213332_add_missing_indexes_to_documents.rb index f5190181..99b57071 100644 --- a/db/migrate/20091017213332_add_missing_indexes_to_documents.rb +++ b/db/migrate/20091017213332_add_missing_indexes_to_documents.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddMissingIndexesToDocuments < ActiveRecord::Migration def self.up add_index :documents, :category_id diff --git a/db/migrate/20091017213444_add_missing_indexes_to_tokens.rb b/db/migrate/20091017213444_add_missing_indexes_to_tokens.rb index f0979f21..bea4f061 100644 --- a/db/migrate/20091017213444_add_missing_indexes_to_tokens.rb +++ b/db/migrate/20091017213444_add_missing_indexes_to_tokens.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddMissingIndexesToTokens < ActiveRecord::Migration def self.up add_index :tokens, :user_id diff --git a/db/migrate/20091017213536_add_missing_indexes_to_changesets.rb b/db/migrate/20091017213536_add_missing_indexes_to_changesets.rb index 303be838..1c2f1f23 100644 --- a/db/migrate/20091017213536_add_missing_indexes_to_changesets.rb +++ b/db/migrate/20091017213536_add_missing_indexes_to_changesets.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddMissingIndexesToChangesets < ActiveRecord::Migration def self.up add_index :changesets, :user_id diff --git a/db/migrate/20091017213642_add_missing_indexes_to_issue_categories.rb b/db/migrate/20091017213642_add_missing_indexes_to_issue_categories.rb index 3f5b2b18..9dae5a05 100644 --- a/db/migrate/20091017213642_add_missing_indexes_to_issue_categories.rb +++ b/db/migrate/20091017213642_add_missing_indexes_to_issue_categories.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddMissingIndexesToIssueCategories < ActiveRecord::Migration def self.up add_index :issue_categories, :assigned_to_id diff --git a/db/migrate/20091017213716_add_missing_indexes_to_member_roles.rb b/db/migrate/20091017213716_add_missing_indexes_to_member_roles.rb index e9ff62db..e4e531c4 100644 --- a/db/migrate/20091017213716_add_missing_indexes_to_member_roles.rb +++ b/db/migrate/20091017213716_add_missing_indexes_to_member_roles.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddMissingIndexesToMemberRoles < ActiveRecord::Migration def self.up add_index :member_roles, :member_id diff --git a/db/migrate/20091017213757_add_missing_indexes_to_boards.rb b/db/migrate/20091017213757_add_missing_indexes_to_boards.rb index d3e94226..13f3c6b7 100644 --- a/db/migrate/20091017213757_add_missing_indexes_to_boards.rb +++ b/db/migrate/20091017213757_add_missing_indexes_to_boards.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddMissingIndexesToBoards < ActiveRecord::Migration def self.up add_index :boards, :last_message_id diff --git a/db/migrate/20091017213835_add_missing_indexes_to_user_preferences.rb b/db/migrate/20091017213835_add_missing_indexes_to_user_preferences.rb index f3a8ccbc..33881775 100644 --- a/db/migrate/20091017213835_add_missing_indexes_to_user_preferences.rb +++ b/db/migrate/20091017213835_add_missing_indexes_to_user_preferences.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddMissingIndexesToUserPreferences < ActiveRecord::Migration def self.up add_index :user_preferences, :user_id diff --git a/db/migrate/20091017213910_add_missing_indexes_to_issues.rb b/db/migrate/20091017213910_add_missing_indexes_to_issues.rb index d651a546..a5eec39a 100644 --- a/db/migrate/20091017213910_add_missing_indexes_to_issues.rb +++ b/db/migrate/20091017213910_add_missing_indexes_to_issues.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddMissingIndexesToIssues < ActiveRecord::Migration def self.up add_index :issues, :status_id diff --git a/db/migrate/20091017214015_add_missing_indexes_to_members.rb b/db/migrate/20091017214015_add_missing_indexes_to_members.rb index 5fdf560f..08d7aa71 100644 --- a/db/migrate/20091017214015_add_missing_indexes_to_members.rb +++ b/db/migrate/20091017214015_add_missing_indexes_to_members.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddMissingIndexesToMembers < ActiveRecord::Migration def self.up add_index :members, :user_id diff --git a/db/migrate/20091017214107_add_missing_indexes_to_custom_fields.rb b/db/migrate/20091017214107_add_missing_indexes_to_custom_fields.rb index 18be0b44..f7589259 100644 --- a/db/migrate/20091017214107_add_missing_indexes_to_custom_fields.rb +++ b/db/migrate/20091017214107_add_missing_indexes_to_custom_fields.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddMissingIndexesToCustomFields < ActiveRecord::Migration def self.up add_index :custom_fields, [:id, :type] diff --git a/db/migrate/20091017214136_add_missing_indexes_to_queries.rb b/db/migrate/20091017214136_add_missing_indexes_to_queries.rb index 414b1ad6..d237ff51 100644 --- a/db/migrate/20091017214136_add_missing_indexes_to_queries.rb +++ b/db/migrate/20091017214136_add_missing_indexes_to_queries.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddMissingIndexesToQueries < ActiveRecord::Migration def self.up add_index :queries, :project_id diff --git a/db/migrate/20091017214236_add_missing_indexes_to_time_entries.rb b/db/migrate/20091017214236_add_missing_indexes_to_time_entries.rb index cffc528e..124f4ec2 100644 --- a/db/migrate/20091017214236_add_missing_indexes_to_time_entries.rb +++ b/db/migrate/20091017214236_add_missing_indexes_to_time_entries.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddMissingIndexesToTimeEntries < ActiveRecord::Migration def self.up add_index :time_entries, :activity_id diff --git a/db/migrate/20091017214308_add_missing_indexes_to_news.rb b/db/migrate/20091017214308_add_missing_indexes_to_news.rb index 808eb629..59527b14 100644 --- a/db/migrate/20091017214308_add_missing_indexes_to_news.rb +++ b/db/migrate/20091017214308_add_missing_indexes_to_news.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddMissingIndexesToNews < ActiveRecord::Migration def self.up add_index :news, :author_id diff --git a/db/migrate/20091017214336_add_missing_indexes_to_users.rb b/db/migrate/20091017214336_add_missing_indexes_to_users.rb index c5a50958..6ea4e199 100644 --- a/db/migrate/20091017214336_add_missing_indexes_to_users.rb +++ b/db/migrate/20091017214336_add_missing_indexes_to_users.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddMissingIndexesToUsers < ActiveRecord::Migration def self.up add_index :users, [:id, :type] diff --git a/db/migrate/20091017214406_add_missing_indexes_to_attachments.rb b/db/migrate/20091017214406_add_missing_indexes_to_attachments.rb index d22fc98e..29aa7771 100644 --- a/db/migrate/20091017214406_add_missing_indexes_to_attachments.rb +++ b/db/migrate/20091017214406_add_missing_indexes_to_attachments.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddMissingIndexesToAttachments < ActiveRecord::Migration def self.up add_index :attachments, [:container_id, :container_type] diff --git a/db/migrate/20091017214440_add_missing_indexes_to_wiki_contents.rb b/db/migrate/20091017214440_add_missing_indexes_to_wiki_contents.rb index 454e4c5d..aa1574a7 100644 --- a/db/migrate/20091017214440_add_missing_indexes_to_wiki_contents.rb +++ b/db/migrate/20091017214440_add_missing_indexes_to_wiki_contents.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddMissingIndexesToWikiContents < ActiveRecord::Migration def self.up add_index :wiki_contents, :author_id diff --git a/db/migrate/20091017214519_add_missing_indexes_to_custom_values.rb b/db/migrate/20091017214519_add_missing_indexes_to_custom_values.rb index b192a7e2..d68553ef 100644 --- a/db/migrate/20091017214519_add_missing_indexes_to_custom_values.rb +++ b/db/migrate/20091017214519_add_missing_indexes_to_custom_values.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddMissingIndexesToCustomValues < ActiveRecord::Migration def self.up add_index :custom_values, :custom_field_id diff --git a/db/migrate/20091017214611_add_missing_indexes_to_journals.rb b/db/migrate/20091017214611_add_missing_indexes_to_journals.rb index 2667f403..cce7be58 100644 --- a/db/migrate/20091017214611_add_missing_indexes_to_journals.rb +++ b/db/migrate/20091017214611_add_missing_indexes_to_journals.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddMissingIndexesToJournals < ActiveRecord::Migration def self.up add_index :journals, :user_id diff --git a/db/migrate/20091017214644_add_missing_indexes_to_issue_relations.rb b/db/migrate/20091017214644_add_missing_indexes_to_issue_relations.rb index fc57f18b..57204150 100644 --- a/db/migrate/20091017214644_add_missing_indexes_to_issue_relations.rb +++ b/db/migrate/20091017214644_add_missing_indexes_to_issue_relations.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddMissingIndexesToIssueRelations < ActiveRecord::Migration def self.up add_index :issue_relations, :issue_from_id diff --git a/db/migrate/20091017214720_add_missing_indexes_to_wiki_redirects.rb b/db/migrate/20091017214720_add_missing_indexes_to_wiki_redirects.rb index 7442a544..f5a38e43 100644 --- a/db/migrate/20091017214720_add_missing_indexes_to_wiki_redirects.rb +++ b/db/migrate/20091017214720_add_missing_indexes_to_wiki_redirects.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddMissingIndexesToWikiRedirects < ActiveRecord::Migration def self.up add_index :wiki_redirects, :wiki_id diff --git a/db/migrate/20091017214750_add_missing_indexes_to_custom_fields_trackers.rb b/db/migrate/20091017214750_add_missing_indexes_to_custom_fields_trackers.rb index c398b793..f40e50d9 100644 --- a/db/migrate/20091017214750_add_missing_indexes_to_custom_fields_trackers.rb +++ b/db/migrate/20091017214750_add_missing_indexes_to_custom_fields_trackers.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddMissingIndexesToCustomFieldsTrackers < ActiveRecord::Migration def self.up add_index :custom_fields_trackers, [:custom_field_id, :tracker_id] diff --git a/db/migrate/20091025163651_add_activity_indexes.rb b/db/migrate/20091025163651_add_activity_indexes.rb index f1805931..87933314 100644 --- a/db/migrate/20091025163651_add_activity_indexes.rb +++ b/db/migrate/20091025163651_add_activity_indexes.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddActivityIndexes < ActiveRecord::Migration def self.up add_index :journals, :created_on diff --git a/db/migrate/20091108092559_add_versions_status.rb b/db/migrate/20091108092559_add_versions_status.rb index 99f5f5a0..e310c3c6 100644 --- a/db/migrate/20091108092559_add_versions_status.rb +++ b/db/migrate/20091108092559_add_versions_status.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddVersionsStatus < ActiveRecord::Migration def self.up add_column :versions, :status, :string, :default => 'open' diff --git a/db/migrate/20091114105931_add_view_issues_permission.rb b/db/migrate/20091114105931_add_view_issues_permission.rb index 5092a8c9..a4db24b5 100644 --- a/db/migrate/20091114105931_add_view_issues_permission.rb +++ b/db/migrate/20091114105931_add_view_issues_permission.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddViewIssuesPermission < ActiveRecord::Migration def self.up Role.find(:all).each do |r| diff --git a/db/migrate/20091123212029_add_default_done_ratio_to_issue_status.rb b/db/migrate/20091123212029_add_default_done_ratio_to_issue_status.rb index 0ce67210..c05adc96 100644 --- a/db/migrate/20091123212029_add_default_done_ratio_to_issue_status.rb +++ b/db/migrate/20091123212029_add_default_done_ratio_to_issue_status.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddDefaultDoneRatioToIssueStatus < ActiveRecord::Migration def self.up add_column :issue_statuses, :default_done_ratio, :integer diff --git a/db/migrate/20091205124427_add_versions_sharing.rb b/db/migrate/20091205124427_add_versions_sharing.rb index 3c28e115..918a71d5 100644 --- a/db/migrate/20091205124427_add_versions_sharing.rb +++ b/db/migrate/20091205124427_add_versions_sharing.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddVersionsSharing < ActiveRecord::Migration def self.up add_column :versions, :sharing, :string, :default => 'none', :null => false diff --git a/db/migrate/20091220183509_add_lft_and_rgt_indexes_to_projects.rb b/db/migrate/20091220183509_add_lft_and_rgt_indexes_to_projects.rb index 1c0b4b31..cbcbf6b7 100644 --- a/db/migrate/20091220183509_add_lft_and_rgt_indexes_to_projects.rb +++ b/db/migrate/20091220183509_add_lft_and_rgt_indexes_to_projects.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddLftAndRgtIndexesToProjects < ActiveRecord::Migration def self.up add_index :projects, :lft diff --git a/db/migrate/20091220183727_add_index_to_settings_name.rb b/db/migrate/20091220183727_add_index_to_settings_name.rb index e6c96ec3..628f0d5f 100644 --- a/db/migrate/20091220183727_add_index_to_settings_name.rb +++ b/db/migrate/20091220183727_add_index_to_settings_name.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddIndexToSettingsName < ActiveRecord::Migration def self.up add_index :settings, :name diff --git a/db/migrate/20091220184736_add_indexes_to_issue_status.rb b/db/migrate/20091220184736_add_indexes_to_issue_status.rb index 2497a1e6..8879e3d9 100644 --- a/db/migrate/20091220184736_add_indexes_to_issue_status.rb +++ b/db/migrate/20091220184736_add_indexes_to_issue_status.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddIndexesToIssueStatus < ActiveRecord::Migration def self.up add_index :issue_statuses, :position diff --git a/db/migrate/20091225164732_remove_enumerations_opt.rb b/db/migrate/20091225164732_remove_enumerations_opt.rb index 72c39e05..089a095d 100644 --- a/db/migrate/20091225164732_remove_enumerations_opt.rb +++ b/db/migrate/20091225164732_remove_enumerations_opt.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class RemoveEnumerationsOpt < ActiveRecord::Migration def self.up remove_column :enumerations, :opt diff --git a/db/migrate/20091227112908_change_wiki_contents_text_limit.rb b/db/migrate/20091227112908_change_wiki_contents_text_limit.rb index 225f71e6..bbb4a8f9 100644 --- a/db/migrate/20091227112908_change_wiki_contents_text_limit.rb +++ b/db/migrate/20091227112908_change_wiki_contents_text_limit.rb @@ -1,9 +1,22 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class ChangeWikiContentsTextLimit < ActiveRecord::Migration def self.up # Migrates MySQL databases only # Postgres would raise an error (see http://dev.rubyonrails.org/ticket/3818) # Not fixed in Rails 2.3.5 - if ActiveRecord::Base.connection.adapter_name =~ /mysql/i + if ChiliProject::Database.mysql? max_size = 16.megabytes change_column :wiki_contents, :text, :text, :limit => max_size change_column :wiki_content_versions, :data, :binary, :limit => max_size diff --git a/db/migrate/20100129193402_change_users_mail_notification_to_string.rb b/db/migrate/20100129193402_change_users_mail_notification_to_string.rb index 401f6340..ddc68418 100644 --- a/db/migrate/20100129193402_change_users_mail_notification_to_string.rb +++ b/db/migrate/20100129193402_change_users_mail_notification_to_string.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class ChangeUsersMailNotificationToString < ActiveRecord::Migration def self.up rename_column :users, :mail_notification, :mail_notification_bool diff --git a/db/migrate/20100129193813_update_mail_notification_values.rb b/db/migrate/20100129193813_update_mail_notification_values.rb index a8a45ade..96535f11 100644 --- a/db/migrate/20100129193813_update_mail_notification_values.rb +++ b/db/migrate/20100129193813_update_mail_notification_values.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + # Patch the data from a boolean change. class UpdateMailNotificationValues < ActiveRecord::Migration def self.up diff --git a/db/migrate/20100221100219_add_index_on_changesets_scmid.rb b/db/migrate/20100221100219_add_index_on_changesets_scmid.rb index 96d85a3a..11303fd9 100644 --- a/db/migrate/20100221100219_add_index_on_changesets_scmid.rb +++ b/db/migrate/20100221100219_add_index_on_changesets_scmid.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddIndexOnChangesetsScmid < ActiveRecord::Migration def self.up add_index :changesets, [:repository_id, :scmid], :name => :changesets_repos_scmid diff --git a/db/migrate/20100313132032_add_issues_nested_sets_columns.rb b/db/migrate/20100313132032_add_issues_nested_sets_columns.rb index e7d03e98..f1eb1377 100644 --- a/db/migrate/20100313132032_add_issues_nested_sets_columns.rb +++ b/db/migrate/20100313132032_add_issues_nested_sets_columns.rb @@ -1,10 +1,23 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddIssuesNestedSetsColumns < ActiveRecord::Migration def self.up add_column :issues, :parent_id, :integer, :default => nil add_column :issues, :root_id, :integer, :default => nil add_column :issues, :lft, :integer, :default => nil add_column :issues, :rgt, :integer, :default => nil - + Issue.update_all("parent_id = NULL, root_id = id, lft = 1, rgt = 2") end diff --git a/db/migrate/20100313171051_add_index_on_issues_nested_set.rb b/db/migrate/20100313171051_add_index_on_issues_nested_set.rb index 4dc94800..76884ad7 100644 --- a/db/migrate/20100313171051_add_index_on_issues_nested_set.rb +++ b/db/migrate/20100313171051_add_index_on_issues_nested_set.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddIndexOnIssuesNestedSet < ActiveRecord::Migration def self.up add_index :issues, [:root_id, :lft, :rgt] diff --git a/db/migrate/20100705164950_change_changes_path_length_limit.rb b/db/migrate/20100705164950_change_changes_path_length_limit.rb index 62b8644a..9a302702 100644 --- a/db/migrate/20100705164950_change_changes_path_length_limit.rb +++ b/db/migrate/20100705164950_change_changes_path_length_limit.rb @@ -1,9 +1,22 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class ChangeChangesPathLengthLimit < ActiveRecord::Migration def self.up # these are two steps to please MySQL 5 on Win32 change_column :changes, :path, :text, :default => nil, :null => true change_column :changes, :path, :text, :null => false - + change_column :changes, :from_path, :text end diff --git a/db/migrate/20100714111651_prepare_journals_for_acts_as_journalized.rb b/db/migrate/20100714111651_prepare_journals_for_acts_as_journalized.rb new file mode 100644 index 00000000..66f47098 --- /dev/null +++ b/db/migrate/20100714111651_prepare_journals_for_acts_as_journalized.rb @@ -0,0 +1,55 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + +class PrepareJournalsForActsAsJournalized < ActiveRecord::Migration + def self.up + # This is provided here for migrating up after the JournalDetails has been removed + unless Object.const_defined?("JournalDetails") + Object.const_set("JournalDetails", Class.new(ActiveRecord::Base)) + end + + change_table :journals do |t| + t.rename :journalized_id, :journaled_id + t.rename :created_on, :created_at + + t.integer :version, :default => 0, :null => false + t.string :activity_type + t.text :changes + t.string :type + + t.index :journaled_id + t.index :activity_type + t.index :created_at + t.index :type + end + + end + + def self.down + change_table "journals" do |t| + t.rename :journaled_id, :journalized_id + t.rename :created_at, :created_on + + t.remove_index :journaled_id + t.remove_index :activity_type + t.remove_index :created_at + t.remove_index :type + + t.remove :type + t.remove :version + t.remove :activity_type + t.remove :changes + end + + end +end diff --git a/db/migrate/20100714111652_update_journals_for_acts_as_journalized.rb b/db/migrate/20100714111652_update_journals_for_acts_as_journalized.rb new file mode 100644 index 00000000..6792951f --- /dev/null +++ b/db/migrate/20100714111652_update_journals_for_acts_as_journalized.rb @@ -0,0 +1,47 @@ +Redmine::Activity.providers.values.flatten.uniq.collect(&:underscore).each {|klass| require_dependency klass } + +class UpdateJournalsForActsAsJournalized < ActiveRecord::Migration + def self.up + # This is provided here for migrating up after the JournalDetails has been removed + unless Object.const_defined?("JournalDetails") + Object.const_set("JournalDetails", Class.new(ActiveRecord::Base)) + end + + say_with_time("Updating existing Journals...") do + Journal.all.group_by(&:journaled_id).each_pair do |id, journals| + journals.sort_by(&:created_at).each_with_index do |j, idx| + # Recast the basic Journal into it's STI journalized class so callbacks work (#467) + klass_name = "#{j.journalized_type}Journal" + j = j.becomes(klass_name.constantize) + j.type = klass_name + j.version = idx + 2 # initial journal should be 1 + j.activity_type = j.journalized_type.constantize.activity_provider_options.keys.first + begin + j.save(false) + rescue ActiveRecord::RecordInvalid => ex + puts "Error saving: #{j.class.to_s}##{j.id} - #{ex.message}" + end + + end + end + end + + change_table :journals do |t| + t.remove :journalized_type + end + end + + def self.down + change_table "journals" do |t| + t.string :journalized_type, :limit => 30, :default => "", :null => false + end + + custom_field_names = CustomField.all.group_by(&:type)[IssueCustomField].collect(&:name) + Journal.all.each do |j| + # Can't used j.journalized.class.name because the model changes make it nil + j.update_attribute(:journalized_type, j.type.to_s.sub("Journal","")) if j.type.present? + end + + end +end + diff --git a/db/migrate/20100714111653_build_initial_journals_for_acts_as_journalized.rb b/db/migrate/20100714111653_build_initial_journals_for_acts_as_journalized.rb new file mode 100644 index 00000000..3574e642 --- /dev/null +++ b/db/migrate/20100714111653_build_initial_journals_for_acts_as_journalized.rb @@ -0,0 +1,80 @@ +class BuildInitialJournalsForActsAsJournalized < ActiveRecord::Migration + def self.up + # This is provided here for migrating up after the JournalDetails has been removed + unless Object.const_defined?("JournalDetails") + Object.const_set("JournalDetails", Class.new(ActiveRecord::Base)) + end + + # Reset class and subclasses, otherwise they will try to save using older attributes + Journal.reset_column_information + Journal.send(:subclasses).each do |klass| + klass.reset_column_information if klass.respond_to?(:reset_column_information) + end + + providers = Redmine::Activity.providers.collect {|k, v| v.collect(&:constantize) }.flatten.compact.uniq + providers.each do |p| + next unless p.table_exists? # Objects not in the DB yet need creation journal entries + + say_with_time("Building initial journals for #{p.class_name}") do + + activity_type = p.activity_provider_options.keys.first + + p.find(:all).each do |o| + # Create initial journals + new_journal = o.journals.build + # Mock up a list of changes for the creation journal based on Class defaults + new_attributes = o.class.new.attributes.except(o.class.primary_key, + o.class.inheritance_column, + :updated_on, + :updated_at, + :lock_version, + :lft, + :rgt) + creation_changes = {} + new_attributes.each do |name, default_value| + # Set changes based on the initial value to current. Can't get creation value without + # rebuiling the object history + creation_changes[name] = [default_value, o.send(name)] # [initial_value, creation_value] + end + new_journal.changes = creation_changes + new_journal.version = 1 + new_journal.activity_type = activity_type + + if o.respond_to?(:author) + new_journal.user = o.author + elsif o.respond_to?(:user) + new_journal.user = o.user + end + # Using rescue and save! here because either the Journal or the + # touched record could fail. This will catch either error and continue + begin + new_journal.save! + + new_journal.reload + + # Backdate journal + if o.respond_to?(:created_at) + new_journal.update_attribute(:created_at, o.created_at) + elsif o.respond_to?(:created_on) + new_journal.update_attribute(:created_at, o.created_on) + end + rescue ActiveRecord::RecordInvalid => ex + if new_journal.errors.count == 1 && new_journal.errors.first[0] == "version" + # Skip, only error was from creating the initial journal for a record that already had one. + else + puts "ERROR: errors creating the initial journal for #{o.class.to_s}##{o.id.to_s}:" + puts " #{ex.message}" + end + end + end + + end + end + + end + + def self.down + # No-op + end + +end diff --git a/db/migrate/20100714111654_add_changes_from_journal_details_for_acts_as_journalized.rb b/db/migrate/20100714111654_add_changes_from_journal_details_for_acts_as_journalized.rb new file mode 100644 index 00000000..43ef3256 --- /dev/null +++ b/db/migrate/20100714111654_add_changes_from_journal_details_for_acts_as_journalized.rb @@ -0,0 +1,35 @@ +class AddChangesFromJournalDetailsForActsAsJournalized < ActiveRecord::Migration + def self.up + # This is provided here for migrating up after the JournalDetails has been removed + unless Object.const_defined?("JournalDetails") + Object.const_set("JournalDetails", Class.new(ActiveRecord::Base)) + end + + say_with_time("Adding changes from JournalDetails") do + JournalDetails.all.each do |detail| + journal = Journal.find(detail.journal_id) + changes = journal.changes || {} + if detail.property == 'attr' # Standard attributes + changes[detail.prop_key.to_s] = [detail.old_value, detail.value] + elsif detail.property == 'cf' # Custom fields + changes["custom_values_" + detail.prop_key.to_s] = [detail.old_value, detail.value] + elsif detail.property == 'attachment' # Attachment + changes["attachments_" + detail.prop_key.to_s] = [detail.old_value, detail.value] + end + begin + journal.update_attribute(:changes, changes.to_yaml) + rescue ActiveRecord::RecordInvalid => ex + puts "Error saving: #{journal.class.to_s}##{journal.id} - #{ex.message}" + end + + end + + end + + end + + def self.down + # No-op + end + +end diff --git a/db/migrate/20100804112053_merge_wiki_versions_with_journals.rb b/db/migrate/20100804112053_merge_wiki_versions_with_journals.rb new file mode 100644 index 00000000..3e7d6517 --- /dev/null +++ b/db/migrate/20100804112053_merge_wiki_versions_with_journals.rb @@ -0,0 +1,62 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + +class MergeWikiVersionsWithJournals < ActiveRecord::Migration + def self.up + # This is provided here for migrating up after the WikiContent::Version class has been removed + unless WikiContent.const_defined?("Version") + WikiContent.const_set("Version", Class.new(ActiveRecord::Base)) + end + + WikiContent::Version.find_by_sql("SELECT * FROM wiki_content_versions").each do |wv| + journal = WikiContentJournal.create!(:journaled_id => wv.wiki_content_id, :user_id => wv.author_id, + :notes => wv.comments, :created_at => wv.updated_on, :activity_type => "wiki_edits") + changes = {} + changes["compression"] = wv.compression + changes["data"] = wv.data + journal.update_attribute(:changes, changes.to_yaml) + journal.update_attribute(:version, wv.version) + end + # drop_table :wiki_content_versions + + change_table :wiki_contents do |t| + t.rename :version, :lock_version + end + end + + def self.down + change_table :wiki_contents do |t| + t.rename :lock_version, :version + end + + # create_table :wiki_content_versions do |t| + # t.column :wiki_content_id, :integer, :null => false + # t.column :page_id, :integer, :null => false + # t.column :author_id, :integer + # t.column :data, :binary + # t.column :compression, :string, :limit => 6, :default => "" + # t.column :comments, :string, :limit => 255, :default => "" + # t.column :updated_on, :datetime, :null => false + # t.column :version, :integer, :null => false + # end + # add_index :wiki_content_versions, :wiki_content_id, :name => :wiki_content_versions_wcid + # + # WikiContentJournal.all.each do |j| + # WikiContent::Version.create(:wiki_content_id => j.journaled_id, :page_id => j.journaled.page_id, + # :author_id => j.user_id, :data => j.changes["data"], :compression => j.changes["compression"], + # :comments => j.notes, :updated_on => j.created_at, :version => j.version) + # end + + WikiContentJournal.destroy_all + end +end diff --git a/db/migrate/20100819172912_enable_calendar_and_gantt_modules_where_appropriate.rb b/db/migrate/20100819172912_enable_calendar_and_gantt_modules_where_appropriate.rb index 416607b4..cf00f20c 100644 --- a/db/migrate/20100819172912_enable_calendar_and_gantt_modules_where_appropriate.rb +++ b/db/migrate/20100819172912_enable_calendar_and_gantt_modules_where_appropriate.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class EnableCalendarAndGanttModulesWhereAppropriate < ActiveRecord::Migration def self.up EnabledModule.find(:all, :conditions => ["name = ?", 'issue_tracking']).each do |e| diff --git a/db/migrate/20101104182107_add_unique_index_on_members.rb b/db/migrate/20101104182107_add_unique_index_on_members.rb index ac51313b..8b8899df 100644 --- a/db/migrate/20101104182107_add_unique_index_on_members.rb +++ b/db/migrate/20101104182107_add_unique_index_on_members.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddUniqueIndexOnMembers < ActiveRecord::Migration def self.up # Clean and reassign MemberRole rows if needed @@ -11,7 +24,7 @@ class AddUniqueIndexOnMembers < ActiveRecord::Migration " WHERE m.id > (SELECT min(m1.id) FROM #{Member.table_name} m1 WHERE m1.user_id = m.user_id AND m1.project_id = m.project_id)").each do |i| Member.delete_all(["id = ?", i]) end - + # Then add a unique index add_index :members, [:user_id, :project_id], :unique => true end diff --git a/db/migrate/20101107130441_add_custom_fields_visible.rb b/db/migrate/20101107130441_add_custom_fields_visible.rb index 9d59faee..be554fb3 100644 --- a/db/migrate/20101107130441_add_custom_fields_visible.rb +++ b/db/migrate/20101107130441_add_custom_fields_visible.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class AddCustomFieldsVisible < ActiveRecord::Migration def self.up add_column :custom_fields, :visible, :boolean, :null => false, :default => true diff --git a/db/migrate/20101114115114_change_projects_name_limit.rb b/db/migrate/20101114115114_change_projects_name_limit.rb index fabc3c9d..9821c6fc 100644 --- a/db/migrate/20101114115114_change_projects_name_limit.rb +++ b/db/migrate/20101114115114_change_projects_name_limit.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class ChangeProjectsNameLimit < ActiveRecord::Migration def self.up change_column :projects, :name, :string, :limit => nil, :default => '', :null => false diff --git a/db/migrate/20101114115359_change_projects_identifier_limit.rb b/db/migrate/20101114115359_change_projects_identifier_limit.rb index 79426fad..56d8b696 100644 --- a/db/migrate/20101114115359_change_projects_identifier_limit.rb +++ b/db/migrate/20101114115359_change_projects_identifier_limit.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class ChangeProjectsIdentifierLimit < ActiveRecord::Migration def self.up change_column :projects, :identifier, :string, :limit => nil diff --git a/db/migrate/20110220160626_add_workflows_assignee_and_author.rb b/db/migrate/20110220160626_add_workflows_assignee_and_author.rb new file mode 100644 index 00000000..5b21ac2d --- /dev/null +++ b/db/migrate/20110220160626_add_workflows_assignee_and_author.rb @@ -0,0 +1,26 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + +class AddWorkflowsAssigneeAndAuthor < ActiveRecord::Migration + def self.up + add_column :workflows, :assignee, :boolean, :null => false, :default => false + add_column :workflows, :author, :boolean, :null => false, :default => false + Workflow.update_all("assignee = #{Workflow.connection.quoted_false}") + Workflow.update_all("author = #{Workflow.connection.quoted_false}") + end + + def self.down + remove_column :workflows, :assignee + remove_column :workflows, :author + end +end diff --git a/db/migrate/20110223180944_add_users_salt.rb b/db/migrate/20110223180944_add_users_salt.rb new file mode 100644 index 00000000..5d52fcb7 --- /dev/null +++ b/db/migrate/20110223180944_add_users_salt.rb @@ -0,0 +1,22 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + +class AddUsersSalt < ActiveRecord::Migration + def self.up + add_column :users, :salt, :string, :limit => 64 + end + + def self.down + remove_column :users, :salt + end +end diff --git a/db/migrate/20110223180953_salt_user_passwords.rb b/db/migrate/20110223180953_salt_user_passwords.rb new file mode 100644 index 00000000..19293bb0 --- /dev/null +++ b/db/migrate/20110223180953_salt_user_passwords.rb @@ -0,0 +1,26 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + +class SaltUserPasswords < ActiveRecord::Migration + + def self.up + say_with_time "Salting user passwords, this may take some time..." do + User.salt_unsalted_passwords! + end + end + + def self.down + # Unsalted passwords can not be restored + raise ActiveRecord::IrreversibleMigration, "Can't decypher salted passwords. This migration can not be rollback'ed." + end +end diff --git a/db/migrate/20110224000000_add_repositories_path_encoding.rb b/db/migrate/20110224000000_add_repositories_path_encoding.rb new file mode 100644 index 00000000..db50890b --- /dev/null +++ b/db/migrate/20110224000000_add_repositories_path_encoding.rb @@ -0,0 +1,22 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + +class AddRepositoriesPathEncoding < ActiveRecord::Migration + def self.up + add_column :repositories, :path_encoding, :string, :limit => 64, :default => nil + end + + def self.down + remove_column :repositories, :path_encoding + end +end diff --git a/db/migrate/20110226120112_change_repositories_password_limit.rb b/db/migrate/20110226120112_change_repositories_password_limit.rb new file mode 100644 index 00000000..f6b70e0d --- /dev/null +++ b/db/migrate/20110226120112_change_repositories_password_limit.rb @@ -0,0 +1,22 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + +class ChangeRepositoriesPasswordLimit < ActiveRecord::Migration + def self.up + change_column :repositories, :password, :string, :limit => nil, :default => '' + end + + def self.down + change_column :repositories, :password, :string, :limit => 60, :default => '' + end +end diff --git a/db/migrate/20110226120132_change_auth_sources_account_password_limit.rb b/db/migrate/20110226120132_change_auth_sources_account_password_limit.rb new file mode 100644 index 00000000..af43c6e7 --- /dev/null +++ b/db/migrate/20110226120132_change_auth_sources_account_password_limit.rb @@ -0,0 +1,22 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + +class ChangeAuthSourcesAccountPasswordLimit < ActiveRecord::Migration + def self.up + change_column :auth_sources, :account_password, :string, :limit => nil, :default => '' + end + + def self.down + change_column :auth_sources, :account_password, :string, :limit => 60, :default => '' + end +end diff --git a/db/migrate/20110227125750_change_journal_details_values_to_text.rb b/db/migrate/20110227125750_change_journal_details_values_to_text.rb new file mode 100644 index 00000000..50b0253a --- /dev/null +++ b/db/migrate/20110227125750_change_journal_details_values_to_text.rb @@ -0,0 +1,24 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + +class ChangeJournalDetailsValuesToText < ActiveRecord::Migration + def self.up + change_column :journal_details, :old_value, :text + change_column :journal_details, :value, :text + end + + def self.down + change_column :journal_details, :old_value, :string + change_column :journal_details, :value, :string + end +end diff --git a/db/migrate/20110228000000_add_repositories_log_encoding.rb b/db/migrate/20110228000000_add_repositories_log_encoding.rb new file mode 100644 index 00000000..df4632c1 --- /dev/null +++ b/db/migrate/20110228000000_add_repositories_log_encoding.rb @@ -0,0 +1,22 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + +class AddRepositoriesLogEncoding < ActiveRecord::Migration + def self.up + add_column :repositories, :log_encoding, :string, :limit => 64, :default => nil + end + + def self.down + remove_column :repositories, :log_encoding + end +end diff --git a/db/migrate/20110228000100_copy_repositories_log_encoding.rb b/db/migrate/20110228000100_copy_repositories_log_encoding.rb new file mode 100644 index 00000000..aecbcc39 --- /dev/null +++ b/db/migrate/20110228000100_copy_repositories_log_encoding.rb @@ -0,0 +1,31 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + +class CopyRepositoriesLogEncoding < ActiveRecord::Migration + def self.up + encoding = Setting.commit_logs_encoding.to_s.strip + encoding = encoding.blank? ? 'UTF-8' : encoding + Repository.find(:all).each do |repo| + scm = repo.scm_name + case scm + when 'Subversion', 'Mercurial', 'Git', 'Filesystem' + repo.update_attribute(:log_encoding, nil) + else + repo.update_attribute(:log_encoding, encoding) + end + end + end + + def self.down + end +end diff --git a/db/migrate/20110314014400_add_start_date_to_versions.rb b/db/migrate/20110314014400_add_start_date_to_versions.rb new file mode 100644 index 00000000..c62e370e --- /dev/null +++ b/db/migrate/20110314014400_add_start_date_to_versions.rb @@ -0,0 +1,22 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + +class AddStartDateToVersions < ActiveRecord::Migration + def self.up + add_column :versions, :start_date, :date + end + + def self.down + remove_column :versions, :start_date + end +end diff --git a/db/migrate/20110401192910_add_index_to_users_type.rb b/db/migrate/20110401192910_add_index_to_users_type.rb new file mode 100644 index 00000000..d8bb8879 --- /dev/null +++ b/db/migrate/20110401192910_add_index_to_users_type.rb @@ -0,0 +1,22 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + +class AddIndexToUsersType < ActiveRecord::Migration + def self.up + add_index :users, :type + end + + def self.down + remove_index :users, :type + end +end diff --git a/db/migrate/20110519194936_remove_comments_from_wiki_content.rb b/db/migrate/20110519194936_remove_comments_from_wiki_content.rb new file mode 100644 index 00000000..52860d08 --- /dev/null +++ b/db/migrate/20110519194936_remove_comments_from_wiki_content.rb @@ -0,0 +1,22 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + +class RemoveCommentsFromWikiContent < ActiveRecord::Migration + def self.up + remove_column :wiki_contents, :comments + end + + def self.down + add_column :wiki_contents, :comments, :string + end +end diff --git a/db/seeds.rb b/db/seeds.rb new file mode 100644 index 00000000..df5cc90e --- /dev/null +++ b/db/seeds.rb @@ -0,0 +1,20 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + +# This file should contain all the record creation needed to seed the database with its default values. +# The data can then be loaded with the rake db:seed (or created alongside the db with db:setup). +# +# Examples: +# +# cities = City.create([{ :name => 'Chicago' }, { :name => 'Copenhagen' }]) +# Major.create(:name => 'Daley', :city => cities.first) diff --git a/doc/CHANGELOG.rdoc b/doc/CHANGELOG.rdoc index 475eeed0..f0b27a59 100644 --- a/doc/CHANGELOG.rdoc +++ b/doc/CHANGELOG.rdoc @@ -1,5 +1,91 @@ = ChiliProject changelog +== TBD v2.0.0 + +* Bug #262: Fix line endings +* Bug #341: Remove English strings from RepositoriesHelper +* Bug #343: Review Gantt and Calender links from 07cf681 +* Bug #345: Entering large numbers for 'Estimated Time' fails with 'Invalid big Decimal Value' +* Bug #346: I18n YAML files not parsable with psych yaml library +* Bug #383: Fix broken tests in unstable caused by conflicting to_utf8 method names +* Bug #389: Context menu doesn't work in Opera +* Bug #390: mysql2 incompatibility in WikiPage model +* Bug #397: FIXME in generalize_journals migration +* Bug #398: Remove helper calls from IssuesController +* Bug #400: Review and fix the Activity event types +* Bug #401: Move JournalsHelpers from aaj to the core +* Bug #403: [AAJ] Attachment has it's files and documents activity provider removed but only documents added +* Bug #404: Move aaj/app/* to core +* Bug #405: Move aaj/test/* to core +* Bug #406: Check for missing Journal code from the AAJ merge +* Bug #407: Add Journal#visible +* Bug #408: Check IssueTest#test_saving_twice_should_not_duplicate_journal_details +* Bug #409: [AAJ] Check that bugfix 784bbccf was merged +* Bug #411: Issue Notes Preview +* Bug #412: Test errors on 1.9.2 after acts_as_journalized merge +* Bug #413: Test errors on 1.8.6 after acts_as_journalized merge +* Bug #414: Remove returning since it causes deprecation warnings +* Bug #415: Wikipages don't store/show the comment correctly +* Bug #419: Issue list context menu not working in IE9 +* Bug #422: cvs test are not working +* Bug #423: Remove explicit render from WikiController#show +* Bug #437: Encoding error on Ruby 1.9 in pdf exports +* Bug #441: Creating a Journal does not update the journaled record's updated_at/on attribute +* Bug #442: Issue atom feed shows "issue creation" journal, didn't before +* Bug #443: IssuesControllerTest.test_show_atom test failure on 1.9.2 +* Bug #444: ChangesetTest and RepositoryGitTest test failures on 1.9.2 +* Bug #445: Track initial attributes in a Journal when created +* Bug #453: Update to Rails 2.3.12 to fix some bugs +* Bug #466: SVN: Apache initialization error +* Bug #467: uninitialized constant Journal::Journaled +* Bug #468: Lost WIKI history timestamps during 2.0.0rc1 upgrade. +* Bug #469: Wong URL for WIKI activity entries in 2.0.0rc2 +* Bug #474: Changesets are displaying the wrong user and commit date in the Activity +* Bug #475: News, docs, changesets and time activities were not migrated to 2.0.0rc2 +* Bug #477: Getting rid of "rake/rdoctask is deprecated." warning +* Bug #479: Generalize Journals migrations does too much +* Bug #480: Issue Journal replies get ignored +* Bug #493: uninitialized constant TimeEntryJournal +* Bug #501: Updating a ticket that was created by email forces a "change" of description +* Bug #503: 2.0.0RC3 - YAML Parser fails in ruby 1.9 +* Feature #112: Provide a library function to detect the database type used +* Feature #123: Review and Merge acts_as_journalized +* Feature #196: Upgrade to Rails 2.3-latest +* Feature #197: Rake task to manage copyright inside of source files +* Feature #216: Remove the rubygems hack from boot.rb +* Feature #217: Remove the hack to require a specific i18n version in boot.rb +* Feature #269: Refactor lib/redmine/menu_manager.rb to increase extensibility +* Feature #279: Optional start date on Versions +* Feature #288: Review latest Redmine commits +* Feature #289: Switch to helper :all +* Feature #290: Add bundler +* Feature #310: Option to skip mail notifications on issue updates +* Feature #350: Setting model should use Rails.cache instead of class variable +* Feature #416: Refactor watcher_tag and watcher_link to use css selectors for the replace action +* Feature #436: Clean up trailing whitespace and tabs +* Feature #462: pt-BR translation update +* Feature #473: pt-BR translation fix +* Task #123: Review and Merge acts_as_journalized +* Task #197: Rake task to manage copyright inside of source files +* Task #288: Review latest Redmine commits +* Task #291: Update documentation to phase out Ruby 1.8.6 +* From Redmine v1.1.2 +** Defect #3132: Bulk editing menu non-functional in Opera browser +** Defect #6090: Most binary files become corrupted when downloading from CVS repository browser when Redmine is running on a Windows server +** Defect #7280: Issues subjects wrap in Gantt +** Defect #7288: Non ASCII filename downloaded from repo is broken on Internet Explorer. +** Defect #7317: Gantt tab gives internal error due to nil avatar icon +** Defect #7497: Aptana Studio .project file added to version 1.1.1-stable +** Defect #7611: Workflow summary shows X icon for workflow with exactly 1 status transition +** Defect #7625: Syntax highlighting unavailable from board new topic or topic edit preview +** Defect #7630: Spent time in commits not recognized +** Defect #7656: MySQL SQL Syntax Error when filtering issues by Assignee's Group +** Defect #7718: Minutes logged in commit message are converted to hours +** Defect #7763: Email notification are sent to watchers even if 'No events' setting is chosen +** Feature #7608: Add "retro" gravatars +** Patch #7598: Extensible MailHandler +** Patch #7795: Internal server error at journals#index with custom fields + == 2011-06-27 v1.5.0 * Bug #490: XSS in app/views/auth_sources/index.html.erb diff --git a/doc/COPYRIGHT.rdoc b/doc/COPYRIGHT.rdoc index 511e7bda..9292dc70 100644 --- a/doc/COPYRIGHT.rdoc +++ b/doc/COPYRIGHT.rdoc @@ -15,3 +15,24 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +--- + +ChiliProject is a derivative work based on Redmine, whose Copyright follows. + +Redmine - project management software +Copyright (C) 2006-2010 Jean-Philippe Lang + +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 +of the License, 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. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. diff --git a/doc/COPYRIGHT_short.rdoc b/doc/COPYRIGHT_short.rdoc new file mode 100644 index 00000000..5742770d --- /dev/null +++ b/doc/COPYRIGHT_short.rdoc @@ -0,0 +1,10 @@ +ChiliProject is a project management system. + +Copyright (C) 2010-2011 the ChiliProject Team + +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 +of the License, or (at your option) any later version. + +See doc/COPYRIGHT.rdoc for more details. diff --git a/doc/RUNNING_TESTS.rdoc b/doc/RUNNING_TESTS.rdoc index c5a52577..b3d6ccf7 100644 --- a/doc/RUNNING_TESTS.rdoc +++ b/doc/RUNNING_TESTS.rdoc @@ -1,31 +1,3 @@ -= Installing gems for testing += Testing ChiliProject -Run `rake gems RAILS_ENV=test` to list the required gems. Run -`rake gems:install RAILS_ENV=test` to install any missing gems. - -== Running Tests - -Run `rake --tasks test` to see available tests. -`rake test` will run the entire testsuite. - -Before running `rake test` you need to configure both development -and test databases. - -== Creating test repositories - -ChiliProject supports a wide array of different version control systems. -To test the support, a test repository needs to be created for each of those. - -Run `rake --tasks test:scm:setup` for a list of available test-repositories or -run `rake test:scm:setup:all` to set up all of them - -== Creating a test ldap database - -ChiliProject supports using LDAP for user authentications. To test LDAP -with ChiliProject, load the LDAP export from test/fixtures/ldap/test-ldap.ldif -into a testing LDAP server. Test that the ldap server can be accessed -at 127.0.0.1 on port 389. - -Setting up the test ldap server is beyond the scope of this documentation. -The OpenLDAP project provides a simple LDAP implementation that should work -good as a test server. +The detailed upgrade instructions are located on the {official website}[https://www.chiliproject.org/projects/chiliproject/wiki/Testing] diff --git a/extra/mail_handler/rdm-mailhandler.rb b/extra/mail_handler/rdm-mailhandler.rb index c1b5c287..d5d535b8 100644 --- a/extra/mail_handler/rdm-mailhandler.rb +++ b/extra/mail_handler/rdm-mailhandler.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + #!/usr/bin/env ruby # == Synopsis @@ -10,10 +23,10 @@ # rdm-mailhandler [options] --url= --key= # # == Arguments -# +# # -u, --url URL of the Redmine server # -k, --key Redmine API key -# +# # General options: # --unknown-user=ACTION how to handle emails from an unknown user # ACTION can be one of the following values: @@ -25,7 +38,7 @@ # -h, --help show this help # -v, --verbose show extra information # -V, --version show version information and exit -# +# # Issue attributes control options: # -p, --project=PROJECT identifier of the target project # -s, --status=STATUS name of the target status @@ -35,15 +48,15 @@ # -o, --allow-override=ATTRS allow email content to override attributes # specified by previous options # ATTRS is a comma separated list of attributes -# +# # == Examples # No project specified. Emails MUST contain the 'Project' keyword: -# +# # rdm-mailhandler --url http://redmine.domain.foo --key secret -# +# # Fixed project and default tracker specified, but emails can override # both tracker and priority attributes using keywords: -# +# # rdm-mailhandler --url https://domain.foo/redmine --key secret \\ # --project foo \\ # --tracker bug \\ @@ -71,12 +84,12 @@ end class RedmineMailHandler VERSION = '0.1' - + attr_accessor :verbose, :issue_attributes, :allow_override, :unknown_user, :no_permission_check, :url, :key def initialize self.issue_attributes = {} - + opts = GetoptLong.new( [ '--help', '-h', GetoptLong::NO_ARGUMENT ], [ '--version', '-V', GetoptLong::NO_ARGUMENT ], @@ -115,28 +128,28 @@ class RedmineMailHandler self.no_permission_check = '1' end end - + RDoc.usage if url.nil? end - + def submit(email) uri = url.gsub(%r{/*$}, '') + '/mail_handler' - + headers = { 'User-Agent' => "Redmine mail handler/#{VERSION}" } - - data = { 'key' => key, 'email' => email, + + data = { 'key' => key, 'email' => email, 'allow_override' => allow_override, 'unknown_user' => unknown_user, 'no_permission_check' => no_permission_check} issue_attributes.each { |attr, value| data["issue[#{attr}]"] = value } - + debug "Posting to #{uri}..." response = Net::HTTPS.post_form(URI.parse(uri), data, headers) debug "Response received: #{response.code}" - + case response.code.to_i when 403 - warn "Request was denied by your Redmine server. " + + warn "Request was denied by your Redmine server. " + "Make sure that 'WS for incoming emails' is enabled in application settings and that you provided the correct API key." return 77 when 422 @@ -156,9 +169,9 @@ class RedmineMailHandler return 1 end end - + private - + def debug(msg) puts msg if verbose end diff --git a/extra/sample_plugin/app/controllers/example_controller.rb b/extra/sample_plugin/app/controllers/example_controller.rb index 8d63206a..6528c6f3 100644 --- a/extra/sample_plugin/app/controllers/example_controller.rb +++ b/extra/sample_plugin/app/controllers/example_controller.rb @@ -1,20 +1,33 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + # Sample plugin controller class ExampleController < ApplicationController unloadable - - layout 'base' + + layout 'base' before_filter :find_project, :authorize menu_item :sample_plugin - + def say_hello @value = Setting.plugin_sample_plugin['sample_setting'] end def say_goodbye end - + private - def find_project + def find_project @project=Project.find(params[:id]) end end diff --git a/extra/sample_plugin/app/models/meeting.rb b/extra/sample_plugin/app/models/meeting.rb index c1bb64a9..cfdc6635 100644 --- a/extra/sample_plugin/app/models/meeting.rb +++ b/extra/sample_plugin/app/models/meeting.rb @@ -1,11 +1,22 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class Meeting < ActiveRecord::Base belongs_to :project - acts_as_event :title => Proc.new {|o| "#{o.scheduled_on} Meeting"}, - :datetime => :scheduled_on, - :author => nil, - :url => Proc.new {|o| {:controller => 'meetings', :action => 'show', :id => o.id}} - - acts_as_activity_provider :timestamp => 'scheduled_on', - :find_options => { :include => :project } + acts_as_journalized :event_title => Proc.new {|o| "#{o.scheduled_on} Meeting"}, + :event_datetime => :scheduled_on, + :event_author => nil, + :event_url => Proc.new {|o| {:controller => 'meetings', :action => 'show', :id => o.id}} + :activity_timestamp => 'scheduled_on' end diff --git a/extra/sample_plugin/db/migrate/001_create_meetings.rb b/extra/sample_plugin/db/migrate/001_create_meetings.rb index fec9c8bd..1a9b7386 100644 --- a/extra/sample_plugin/db/migrate/001_create_meetings.rb +++ b/extra/sample_plugin/db/migrate/001_create_meetings.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + # Sample plugin migration # Use rake db:migrate_plugins to migrate installed plugins class CreateMeetings < ActiveRecord::Migration diff --git a/extra/sample_plugin/init.rb b/extra/sample_plugin/init.rb index ec581821..a6720ccd 100644 --- a/extra/sample_plugin/init.rb +++ b/extra/sample_plugin/init.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + # Redmine sample plugin require 'redmine' @@ -24,7 +37,7 @@ Redmine::Plugin.register :sample_plugin do # A new item is added to the project menu menu :project_menu, :sample_plugin, { :controller => 'example', :action => 'say_hello' }, :caption => 'Sample' - + # Meetings are added to the activity view activity_provider :meetings end diff --git a/extra/svn/Redmine.pm b/extra/svn/Redmine.pm index ec3200a1..a780f114 100644 --- a/extra/svn/Redmine.pm +++ b/extra/svn/Redmine.pm @@ -231,7 +231,7 @@ sub RedmineDSN { my ($self, $parms, $arg) = @_; $self->{RedmineDSN} = $arg; my $query = "SELECT - hashed_password, auth_source_id, permissions + hashed_password, salt, auth_source_id, permissions FROM members, projects, users, roles, member_roles WHERE projects.id=members.project_id @@ -426,11 +426,12 @@ sub is_member { $sth->execute($redmine_user, $project_id); my $ret; - while (my ($hashed_password, $auth_source_id, $permissions) = $sth->fetchrow_array) { + while (my ($hashed_password, $salt, $auth_source_id, $permissions) = $sth->fetchrow_array) { unless ($auth_source_id) { - my $method = $r->method; - if ($hashed_password eq $pass_digest && ((request_is_read_only($r) && $permissions =~ /:browse_repository/) || $permissions =~ /:commit_access/) ) { + my $method = $r->method; + my $salted_password = Digest::SHA1::sha1_hex($salt.$pass_digest); + if ($hashed_password eq $salted_password && ((request_is_read_only($r) && $permissions =~ /:browse_repository/) || $permissions =~ /:commit_access/) ) { $ret = 1; last; } @@ -479,6 +480,7 @@ sub is_member { sub get_project_identifier { my $r = shift; + my $cfg = Apache2::Module::get_config(__PACKAGE__, $r->server, $r->per_dir_config); my $location = $r->location; my ($identifier) = $r->uri =~ m{$location/*([^/]+)}; $identifier =~ s/\.git$// if (defined $cfg->{RedmineGitSmartHttp} and $cfg->{RedmineGitSmartHttp}); diff --git a/extra/svn/reposman.rb b/extra/svn/reposman.rb index 4bfd10bd..b0c7cc39 100755 --- a/extra/svn/reposman.rb +++ b/extra/svn/reposman.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + #!/usr/bin/env ruby # == Synopsis @@ -209,7 +222,7 @@ end log("retrieved #{projects.size} projects", :level => 1) def set_owner_and_rights(project, repos_path, &block) - if RUBY_PLATFORM =~ /mswin/ + if mswin? yield if block_given? else uid, gid = Etc.getpwnam($svn_owner).uid, ($use_groupid ? Etc.getgrnam(project.identifier).gid : Etc.getgrnam($svn_group).gid) diff --git a/lib/SVG/Graph/Bar.rb b/lib/SVG/Graph/Bar.rb index 6836c501..69515659 100644 --- a/lib/SVG/Graph/Bar.rb +++ b/lib/SVG/Graph/Bar.rb @@ -1,148 +1,148 @@ -require 'rexml/document' -require 'SVG/Graph/Graph' -require 'SVG/Graph/BarBase' - -module SVG - module Graph - # === Create presentation quality SVG bar graphs easily - # - # = Synopsis - # - # require 'SVG/Graph/Bar' - # - # fields = %w(Jan Feb Mar); - # data_sales_02 = [12, 45, 21] - # - # graph = SVG::Graph::Bar.new( - # :height => 500, - # :width => 300, - # :fields => fields - # ) - # - # graph.add_data( - # :data => data_sales_02, - # :title => 'Sales 2002' - # ) - # - # print "Content-type: image/svg+xml\r\n\r\n" - # print graph.burn - # - # = Description - # - # This object aims to allow you to easily create high quality - # SVG[http://www.w3c.org/tr/svg bar graphs. You can either use the default - # style sheet or supply your own. Either way there are many options which - # can be configured to give you control over how the graph is generated - - # with or without a key, data elements at each point, title, subtitle etc. - # - # = Notes - # - # The default stylesheet handles upto 12 data sets, if you - # use more you must create your own stylesheet and add the - # additional settings for the extra data sets. You will know - # if you go over 12 data sets as they will have no style and - # be in black. - # - # = Examples - # - # * http://germane-software.com/repositories/public/SVG/test/test.rb - # - # = See also - # - # * SVG::Graph::Graph - # * SVG::Graph::BarHorizontal - # * SVG::Graph::Line - # * SVG::Graph::Pie - # * SVG::Graph::Plot - # * SVG::Graph::TimeSeries - class Bar < BarBase - include REXML - - # See Graph::initialize and BarBase::set_defaults - def set_defaults - super - self.top_align = self.top_font = 1 - end - - protected - - def get_x_labels - @config[:fields] - end - - def get_y_labels - maxvalue = max_value - minvalue = min_value - range = maxvalue - minvalue - - top_pad = range == 0 ? 10 : range / 20.0 - scale_range = (maxvalue + top_pad) - minvalue - - scale_division = scale_divisions || (scale_range / 10.0) - - if scale_integers - scale_division = scale_division < 1 ? 1 : scale_division.round - end - - rv = [] - maxvalue = maxvalue%scale_division == 0 ? - maxvalue : maxvalue + scale_division - minvalue.step( maxvalue, scale_division ) {|v| rv << v} - return rv - end - - def x_label_offset( width ) - width / 2.0 - end - - def draw_data - minvalue = min_value - fieldwidth = field_width - - unit_size = (@graph_height.to_f - font_size*2*top_font) / - (get_y_labels.max - get_y_labels.min) - bargap = bar_gap ? (fieldwidth < 10 ? fieldwidth / 2 : 10) : 0 - - bar_width = fieldwidth - bargap - bar_width /= @data.length if stack == :side - x_mod = (@graph_width-bargap)/2 - (stack==:side ? bar_width/2 : 0) - - bottom = @graph_height - - field_count = 0 - @config[:fields].each_index { |i| - dataset_count = 0 - for dataset in @data - - # cases (assume 0 = +ve): - # value min length - # +ve +ve value - min - # +ve -ve value - 0 - # -ve -ve value.abs - 0 - - value = dataset[:data][i] - - left = (fieldwidth * field_count) - - length = (value.abs - (minvalue > 0 ? minvalue : 0)) * unit_size - # top is 0 if value is negative - top = bottom - (((value < 0 ? 0 : value) - minvalue) * unit_size) - left += bar_width * dataset_count if stack == :side - - @graph.add_element( "rect", { - "x" => left.to_s, - "y" => top.to_s, - "width" => bar_width.to_s, - "height" => length.to_s, - "class" => "fill#{dataset_count+1}" - }) - - make_datapoint_text(left + bar_width/2.0, top - 6, value.to_s) - dataset_count += 1 - end - field_count += 1 - } - end - end - end -end +require 'rexml/document' +require 'SVG/Graph/Graph' +require 'SVG/Graph/BarBase' + +module SVG + module Graph + # === Create presentation quality SVG bar graphs easily + # + # = Synopsis + # + # require 'SVG/Graph/Bar' + # + # fields = %w(Jan Feb Mar); + # data_sales_02 = [12, 45, 21] + # + # graph = SVG::Graph::Bar.new( + # :height => 500, + # :width => 300, + # :fields => fields + # ) + # + # graph.add_data( + # :data => data_sales_02, + # :title => 'Sales 2002' + # ) + # + # print "Content-type: image/svg+xml\r\n\r\n" + # print graph.burn + # + # = Description + # + # This object aims to allow you to easily create high quality + # SVG[http://www.w3c.org/tr/svg bar graphs. You can either use the default + # style sheet or supply your own. Either way there are many options which + # can be configured to give you control over how the graph is generated - + # with or without a key, data elements at each point, title, subtitle etc. + # + # = Notes + # + # The default stylesheet handles upto 12 data sets, if you + # use more you must create your own stylesheet and add the + # additional settings for the extra data sets. You will know + # if you go over 12 data sets as they will have no style and + # be in black. + # + # = Examples + # + # * http://germane-software.com/repositories/public/SVG/test/test.rb + # + # = See also + # + # * SVG::Graph::Graph + # * SVG::Graph::BarHorizontal + # * SVG::Graph::Line + # * SVG::Graph::Pie + # * SVG::Graph::Plot + # * SVG::Graph::TimeSeries + class Bar < BarBase + include REXML + + # See Graph::initialize and BarBase::set_defaults + def set_defaults + super + self.top_align = self.top_font = 1 + end + + protected + + def get_x_labels + @config[:fields] + end + + def get_y_labels + maxvalue = max_value + minvalue = min_value + range = maxvalue - minvalue + + top_pad = range == 0 ? 10 : range / 20.0 + scale_range = (maxvalue + top_pad) - minvalue + + scale_division = scale_divisions || (scale_range / 10.0) + + if scale_integers + scale_division = scale_division < 1 ? 1 : scale_division.round + end + + rv = [] + maxvalue = maxvalue%scale_division == 0 ? + maxvalue : maxvalue + scale_division + minvalue.step( maxvalue, scale_division ) {|v| rv << v} + return rv + end + + def x_label_offset( width ) + width / 2.0 + end + + def draw_data + minvalue = min_value + fieldwidth = field_width + + unit_size = (@graph_height.to_f - font_size*2*top_font) / + (get_y_labels.max - get_y_labels.min) + bargap = bar_gap ? (fieldwidth < 10 ? fieldwidth / 2 : 10) : 0 + + bar_width = fieldwidth - bargap + bar_width /= @data.length if stack == :side + x_mod = (@graph_width-bargap)/2 - (stack==:side ? bar_width/2 : 0) + + bottom = @graph_height + + field_count = 0 + @config[:fields].each_index { |i| + dataset_count = 0 + for dataset in @data + + # cases (assume 0 = +ve): + # value min length + # +ve +ve value - min + # +ve -ve value - 0 + # -ve -ve value.abs - 0 + + value = dataset[:data][i] + + left = (fieldwidth * field_count) + + length = (value.abs - (minvalue > 0 ? minvalue : 0)) * unit_size + # top is 0 if value is negative + top = bottom - (((value < 0 ? 0 : value) - minvalue) * unit_size) + left += bar_width * dataset_count if stack == :side + + @graph.add_element( "rect", { + "x" => left.to_s, + "y" => top.to_s, + "width" => bar_width.to_s, + "height" => length.to_s, + "class" => "fill#{dataset_count+1}" + }) + + make_datapoint_text(left + bar_width/2.0, top - 6, value.to_s) + dataset_count += 1 + end + field_count += 1 + } + end + end + end +end diff --git a/lib/SVG/Graph/BarBase.rb b/lib/SVG/Graph/BarBase.rb index acc9fecd..7b7dda88 100644 --- a/lib/SVG/Graph/BarBase.rb +++ b/lib/SVG/Graph/BarBase.rb @@ -1,139 +1,139 @@ -require 'rexml/document' -require 'SVG/Graph/Graph' - -module SVG - module Graph - # = Synopsis - # - # A superclass for bar-style graphs. Do not attempt to instantiate - # directly; use one of the subclasses instead. - # - # = Author - # - # Sean E. Russell - # - # Copyright 2004 Sean E. Russell - # This software is available under the Ruby license[LICENSE.txt] - # - class BarBase < SVG::Graph::Graph - # Ensures that :fields are provided in the configuration. - def initialize config - raise "fields was not supplied or is empty" unless config[:fields] && - config[:fields].kind_of?(Array) && - config[:fields].length > 0 - super - end - - # In addition to the defaults set in Graph::initialize, sets - # [bar_gap] true - # [stack] :overlap - def set_defaults - init_with( :bar_gap => true, :stack => :overlap ) - end - - # Whether to have a gap between the bars or not, default - # is true, set to false if you don't want gaps. - attr_accessor :bar_gap - # How to stack data sets. :overlap overlaps bars with - # transparent colors, :top stacks bars on top of one another, - # :side stacks the bars side-by-side. Defaults to :overlap. - attr_accessor :stack - - - protected - - def max_value - @data.collect{|x| x[:data].max}.max - end - - def min_value - min = 0 - if min_scale_value.nil? - min = @data.collect{|x| x[:data].min}.min - min = min > 0 ? 0 : min - else - min = min_scale_value - end - return min - end - - def get_css - return < + # + # Copyright 2004 Sean E. Russell + # This software is available under the Ruby license[LICENSE.txt] + # + class BarBase < SVG::Graph::Graph + # Ensures that :fields are provided in the configuration. + def initialize config + raise "fields was not supplied or is empty" unless config[:fields] && + config[:fields].kind_of?(Array) && + config[:fields].length > 0 + super + end + + # In addition to the defaults set in Graph::initialize, sets + # [bar_gap] true + # [stack] :overlap + def set_defaults + init_with( :bar_gap => true, :stack => :overlap ) + end + + # Whether to have a gap between the bars or not, default + # is true, set to false if you don't want gaps. + attr_accessor :bar_gap + # How to stack data sets. :overlap overlaps bars with + # transparent colors, :top stacks bars on top of one another, + # :side stacks the bars side-by-side. Defaults to :overlap. + attr_accessor :stack + + + protected + + def max_value + @data.collect{|x| x[:data].max}.max + end + + def min_value + min = 0 + if min_scale_value.nil? + min = @data.collect{|x| x[:data].min}.min + min = min > 0 ? 0 : min + else + min = min_scale_value + end + return min + end + + def get_css + return < 500, - # :width => 300, - # :fields => fields, - # }) - # - # graph.add_data({ - # :data => data_sales_02, - # :title => 'Sales 2002', - # }) - # - # print "Content-type: image/svg+xml\r\n\r\n" - # print graph.burn - # - # = Description - # - # This object aims to allow you to easily create high quality - # SVG horitonzal bar graphs. You can either use the default style sheet - # or supply your own. Either way there are many options which can - # be configured to give you control over how the graph is - # generated - with or without a key, data elements at each point, - # title, subtitle etc. - # - # = Examples - # - # * http://germane-software.com/repositories/public/SVG/test/test.rb - # - # = See also - # - # * SVG::Graph::Graph - # * SVG::Graph::Bar - # * SVG::Graph::Line - # * SVG::Graph::Pie - # * SVG::Graph::Plot - # * SVG::Graph::TimeSeries - # - # == Author - # - # Sean E. Russell - # - # Copyright 2004 Sean E. Russell - # This software is available under the Ruby license[LICENSE.txt] - # - class BarHorizontal < BarBase - # In addition to the defaults set in BarBase::set_defaults, sets - # [rotate_y_labels] true - # [show_x_guidelines] true - # [show_y_guidelines] false - def set_defaults - super - init_with( - :rotate_y_labels => true, - :show_x_guidelines => true, - :show_y_guidelines => false - ) - self.right_align = self.right_font = 1 - end - - protected - - def get_x_labels - maxvalue = max_value - minvalue = min_value - range = maxvalue - minvalue - top_pad = range == 0 ? 10 : range / 20.0 - scale_range = (maxvalue + top_pad) - minvalue - - scale_division = scale_divisions || (scale_range / 10.0) - - if scale_integers - scale_division = scale_division < 1 ? 1 : scale_division.round - end - - rv = [] - maxvalue = maxvalue%scale_division == 0 ? - maxvalue : maxvalue + scale_division - minvalue.step( maxvalue, scale_division ) {|v| rv << v} - return rv - end - - def get_y_labels - @config[:fields] - end - - def y_label_offset( height ) - height / -2.0 - end - - def draw_data - minvalue = min_value - fieldheight = field_height - - unit_size = (@graph_width.to_f - font_size*2*right_font ) / - (get_x_labels.max - get_x_labels.min ) - bargap = bar_gap ? (fieldheight < 10 ? fieldheight / 2 : 10) : 0 - - bar_height = fieldheight - bargap - bar_height /= @data.length if stack == :side - y_mod = (bar_height / 2) + (font_size / 2) - - field_count = 1 - @config[:fields].each_index { |i| - dataset_count = 0 - for dataset in @data - value = dataset[:data][i] - - top = @graph_height - (fieldheight * field_count) - top += (bar_height * dataset_count) if stack == :side - # cases (assume 0 = +ve): - # value min length left - # +ve +ve value.abs - min minvalue.abs - # +ve -ve value.abs - 0 minvalue.abs - # -ve -ve value.abs - 0 minvalue.abs + value - length = (value.abs - (minvalue > 0 ? minvalue : 0)) * unit_size - left = (minvalue.abs + (value < 0 ? value : 0)) * unit_size - - @graph.add_element( "rect", { - "x" => left.to_s, - "y" => top.to_s, - "width" => length.to_s, - "height" => bar_height.to_s, - "class" => "fill#{dataset_count+1}" - }) - - make_datapoint_text( - left+length+5, top+y_mod, value, "text-anchor: start; " - ) - dataset_count += 1 - end - field_count += 1 - } - end - end - end -end +require 'rexml/document' +require 'SVG/Graph/BarBase' + +module SVG + module Graph + # === Create presentation quality SVG horitonzal bar graphs easily + # + # = Synopsis + # + # require 'SVG/Graph/BarHorizontal' + # + # fields = %w(Jan Feb Mar) + # data_sales_02 = [12, 45, 21] + # + # graph = SVG::Graph::BarHorizontal.new({ + # :height => 500, + # :width => 300, + # :fields => fields, + # }) + # + # graph.add_data({ + # :data => data_sales_02, + # :title => 'Sales 2002', + # }) + # + # print "Content-type: image/svg+xml\r\n\r\n" + # print graph.burn + # + # = Description + # + # This object aims to allow you to easily create high quality + # SVG horitonzal bar graphs. You can either use the default style sheet + # or supply your own. Either way there are many options which can + # be configured to give you control over how the graph is + # generated - with or without a key, data elements at each point, + # title, subtitle etc. + # + # = Examples + # + # * http://germane-software.com/repositories/public/SVG/test/test.rb + # + # = See also + # + # * SVG::Graph::Graph + # * SVG::Graph::Bar + # * SVG::Graph::Line + # * SVG::Graph::Pie + # * SVG::Graph::Plot + # * SVG::Graph::TimeSeries + # + # == Author + # + # Sean E. Russell + # + # Copyright 2004 Sean E. Russell + # This software is available under the Ruby license[LICENSE.txt] + # + class BarHorizontal < BarBase + # In addition to the defaults set in BarBase::set_defaults, sets + # [rotate_y_labels] true + # [show_x_guidelines] true + # [show_y_guidelines] false + def set_defaults + super + init_with( + :rotate_y_labels => true, + :show_x_guidelines => true, + :show_y_guidelines => false + ) + self.right_align = self.right_font = 1 + end + + protected + + def get_x_labels + maxvalue = max_value + minvalue = min_value + range = maxvalue - minvalue + top_pad = range == 0 ? 10 : range / 20.0 + scale_range = (maxvalue + top_pad) - minvalue + + scale_division = scale_divisions || (scale_range / 10.0) + + if scale_integers + scale_division = scale_division < 1 ? 1 : scale_division.round + end + + rv = [] + maxvalue = maxvalue%scale_division == 0 ? + maxvalue : maxvalue + scale_division + minvalue.step( maxvalue, scale_division ) {|v| rv << v} + return rv + end + + def get_y_labels + @config[:fields] + end + + def y_label_offset( height ) + height / -2.0 + end + + def draw_data + minvalue = min_value + fieldheight = field_height + + unit_size = (@graph_width.to_f - font_size*2*right_font ) / + (get_x_labels.max - get_x_labels.min ) + bargap = bar_gap ? (fieldheight < 10 ? fieldheight / 2 : 10) : 0 + + bar_height = fieldheight - bargap + bar_height /= @data.length if stack == :side + y_mod = (bar_height / 2) + (font_size / 2) + + field_count = 1 + @config[:fields].each_index { |i| + dataset_count = 0 + for dataset in @data + value = dataset[:data][i] + + top = @graph_height - (fieldheight * field_count) + top += (bar_height * dataset_count) if stack == :side + # cases (assume 0 = +ve): + # value min length left + # +ve +ve value.abs - min minvalue.abs + # +ve -ve value.abs - 0 minvalue.abs + # -ve -ve value.abs - 0 minvalue.abs + value + length = (value.abs - (minvalue > 0 ? minvalue : 0)) * unit_size + left = (minvalue.abs + (value < 0 ? value : 0)) * unit_size + + @graph.add_element( "rect", { + "x" => left.to_s, + "y" => top.to_s, + "width" => length.to_s, + "height" => bar_height.to_s, + "class" => "fill#{dataset_count+1}" + }) + + make_datapoint_text( + left+length+5, top+y_mod, value, "text-anchor: start; " + ) + dataset_count += 1 + end + field_count += 1 + } + end + end + end +end diff --git a/lib/SVG/Graph/Graph.rb b/lib/SVG/Graph/Graph.rb index 497bb7c3..8a840b2f 100644 --- a/lib/SVG/Graph/Graph.rb +++ b/lib/SVG/Graph/Graph.rb @@ -1,978 +1,978 @@ -begin - require 'zlib' - @@__have_zlib = true -rescue - @@__have_zlib = false -end - -require 'rexml/document' - -module SVG - module Graph - VERSION = '@ANT_VERSION@' - - # === Base object for generating SVG Graphs - # - # == Synopsis - # - # This class is only used as a superclass of specialized charts. Do not - # attempt to use this class directly, unless creating a new chart type. - # - # For examples of how to subclass this class, see the existing specific - # subclasses, such as SVG::Graph::Pie. - # - # == Examples - # - # For examples of how to use this package, see either the test files, or - # the documentation for the specific class you want to use. - # - # * file:test/plot.rb - # * file:test/single.rb - # * file:test/test.rb - # * file:test/timeseries.rb - # - # == Description - # - # This package should be used as a base for creating SVG graphs. - # - # == Acknowledgements - # - # Leo Lapworth for creating the SVG::TT::Graph package which this Ruby - # port is based on. - # - # Stephen Morgan for creating the TT template and SVG. - # - # == See - # - # * SVG::Graph::BarHorizontal - # * SVG::Graph::Bar - # * SVG::Graph::Line - # * SVG::Graph::Pie - # * SVG::Graph::Plot - # * SVG::Graph::TimeSeries - # - # == Author - # - # Sean E. Russell - # - # Copyright 2004 Sean E. Russell - # This software is available under the Ruby license[LICENSE.txt] - # - class Graph - include REXML - - # Initialize the graph object with the graph settings. You won't - # instantiate this class directly; see the subclass for options. - # [width] 500 - # [height] 300 - # [show_x_guidelines] false - # [show_y_guidelines] true - # [show_data_values] true - # [min_scale_value] 0 - # [show_x_labels] true - # [stagger_x_labels] false - # [rotate_x_labels] false - # [step_x_labels] 1 - # [step_include_first_x_label] true - # [show_y_labels] true - # [rotate_y_labels] false - # [scale_integers] false - # [show_x_title] false - # [x_title] 'X Field names' - # [show_y_title] false - # [y_title_text_direction] :bt - # [y_title] 'Y Scale' - # [show_graph_title] false - # [graph_title] 'Graph Title' - # [show_graph_subtitle] false - # [graph_subtitle] 'Graph Sub Title' - # [key] true, - # [key_position] :right, # bottom or righ - # [font_size] 12 - # [title_font_size] 16 - # [subtitle_font_size] 14 - # [x_label_font_size] 12 - # [x_title_font_size] 14 - # [y_label_font_size] 12 - # [y_title_font_size] 14 - # [key_font_size] 10 - # [no_css] false - # [add_popups] false - def initialize( config ) - @config = config - - self.top_align = self.top_font = self.right_align = self.right_font = 0 - - init_with({ - :width => 500, - :height => 300, - :show_x_guidelines => false, - :show_y_guidelines => true, - :show_data_values => true, - -# :min_scale_value => 0, - - :show_x_labels => true, - :stagger_x_labels => false, - :rotate_x_labels => false, - :step_x_labels => 1, - :step_include_first_x_label => true, - - :show_y_labels => true, - :rotate_y_labels => false, - :stagger_y_labels => false, - :scale_integers => false, - - :show_x_title => false, - :x_title => 'X Field names', - - :show_y_title => false, - :y_title_text_direction => :bt, - :y_title => 'Y Scale', - - :show_graph_title => false, - :graph_title => 'Graph Title', - :show_graph_subtitle => false, - :graph_subtitle => 'Graph Sub Title', - :key => true, - :key_position => :right, # bottom or right - - :font_size =>12, - :title_font_size =>16, - :subtitle_font_size =>14, - :x_label_font_size =>12, - :x_title_font_size =>14, - :y_label_font_size =>12, - :y_title_font_size =>14, - :key_font_size =>10, - - :no_css =>false, - :add_popups =>false, - }) - - set_defaults if respond_to? :set_defaults - - init_with config - end - - - # This method allows you do add data to the graph object. - # It can be called several times to add more data sets in. - # - # data_sales_02 = [12, 45, 21]; - # - # graph.add_data({ - # :data => data_sales_02, - # :title => 'Sales 2002' - # }) - def add_data conf - @data = [] unless defined? @data - - if conf[:data] and conf[:data].kind_of? Array - @data << conf - else - raise "No data provided by #{conf.inspect}" - end - end - - - # This method removes all data from the object so that you can - # reuse it to create a new graph but with the same config options. - # - # graph.clear_data - def clear_data - @data = [] - end - - - # This method processes the template with the data and - # config which has been set and returns the resulting SVG. - # - # This method will croak unless at least one data set has - # been added to the graph object. - # - # print graph.burn - def burn - raise "No data available" unless @data.size > 0 - - calculations if respond_to? :calculations - - start_svg - calculate_graph_dimensions - @foreground = Element.new( "g" ) - draw_graph - draw_titles - draw_legend - draw_data - @graph.add_element( @foreground ) - style - - data = "" - @doc.write( data, 0 ) - - if @config[:compress] - if @@__have_zlib - inp, out = IO.pipe - gz = Zlib::GzipWriter.new( out ) - gz.write data - gz.close - data = inp.read - else - data << ""; - end - end - - return data - end - - - # Set the height of the graph box, this is the total height - # of the SVG box created - not the graph it self which auto - # scales to fix the space. - attr_accessor :height - # Set the width of the graph box, this is the total width - # of the SVG box created - not the graph it self which auto - # scales to fix the space. - attr_accessor :width - # Set the path to an external stylesheet, set to '' if - # you want to revert back to using the defaut internal version. - # - # To create an external stylesheet create a graph using the - # default internal version and copy the stylesheet section to - # an external file and edit from there. - attr_accessor :style_sheet - # (Bool) Show the value of each element of data on the graph - attr_accessor :show_data_values - # The point at which the Y axis starts, defaults to '0', - # if set to nil it will default to the minimum data value. - attr_accessor :min_scale_value - # Whether to show labels on the X axis or not, defaults - # to true, set to false if you want to turn them off. - attr_accessor :show_x_labels - # This puts the X labels at alternative levels so if they - # are long field names they will not overlap so easily. - # Default it false, to turn on set to true. - attr_accessor :stagger_x_labels - # This puts the Y labels at alternative levels so if they - # are long field names they will not overlap so easily. - # Default it false, to turn on set to true. - attr_accessor :stagger_y_labels - # This turns the X axis labels by 90 degrees. - # Default it false, to turn on set to true. - attr_accessor :rotate_x_labels - # This turns the Y axis labels by 90 degrees. - # Default it false, to turn on set to true. - attr_accessor :rotate_y_labels - # How many "steps" to use between displayed X axis labels, - # a step of one means display every label, a step of two results - # in every other label being displayed (label label label), - # a step of three results in every third label being displayed - # (label label label) and so on. - attr_accessor :step_x_labels - # Whether to (when taking "steps" between X axis labels) step from - # the first label (i.e. always include the first label) or step from - # the X axis origin (i.e. start with a gap if step_x_labels is greater - # than one). - attr_accessor :step_include_first_x_label - # Whether to show labels on the Y axis or not, defaults - # to true, set to false if you want to turn them off. - attr_accessor :show_y_labels - # Ensures only whole numbers are used as the scale divisions. - # Default it false, to turn on set to true. This has no effect if - # scale divisions are less than 1. - attr_accessor :scale_integers - # This defines the gap between markers on the Y axis, - # default is a 10th of the max_value, e.g. you will have - # 10 markers on the Y axis. NOTE: do not set this too - # low - you are limited to 999 markers, after that the - # graph won't generate. - attr_accessor :scale_divisions - # Whether to show the title under the X axis labels, - # default is false, set to true to show. - attr_accessor :show_x_title - # What the title under X axis should be, e.g. 'Months'. - attr_accessor :x_title - # Whether to show the title under the Y axis labels, - # default is false, set to true to show. - attr_accessor :show_y_title - # Aligns writing mode for Y axis label. - # Defaults to :bt (Bottom to Top). - # Change to :tb (Top to Bottom) to reverse. - attr_accessor :y_title_text_direction - # What the title under Y axis should be, e.g. 'Sales in thousands'. - attr_accessor :y_title - # Whether to show a title on the graph, defaults - # to false, set to true to show. - attr_accessor :show_graph_title - # What the title on the graph should be. - attr_accessor :graph_title - # Whether to show a subtitle on the graph, defaults - # to false, set to true to show. - attr_accessor :show_graph_subtitle - # What the subtitle on the graph should be. - attr_accessor :graph_subtitle - # Whether to show a key, defaults to false, set to - # true if you want to show it. - attr_accessor :key - # Where the key should be positioned, defaults to - # :right, set to :bottom if you want to move it. - attr_accessor :key_position - # Set the font size (in points) of the data point labels - attr_accessor :font_size - # Set the font size of the X axis labels - attr_accessor :x_label_font_size - # Set the font size of the X axis title - attr_accessor :x_title_font_size - # Set the font size of the Y axis labels - attr_accessor :y_label_font_size - # Set the font size of the Y axis title - attr_accessor :y_title_font_size - # Set the title font size - attr_accessor :title_font_size - # Set the subtitle font size - attr_accessor :subtitle_font_size - # Set the key font size - attr_accessor :key_font_size - # Show guidelines for the X axis - attr_accessor :show_x_guidelines - # Show guidelines for the Y axis - attr_accessor :show_y_guidelines - # Do not use CSS if set to true. Many SVG viewers do not support CSS, but - # not using CSS can result in larger SVGs as well as making it impossible to - # change colors after the chart is generated. Defaults to false. - attr_accessor :no_css - # Add popups for the data points on some graphs - attr_accessor :add_popups - - - protected - - def sort( *arrys ) - sort_multiple( arrys ) - end - - # Overwrite configuration options with supplied options. Used - # by subclasses. - def init_with config - config.each { |key, value| - self.send((key.to_s+"=").to_sym, value ) if respond_to? key.to_sym - } - end - - attr_accessor :top_align, :top_font, :right_align, :right_font - - KEY_BOX_SIZE = 12 - - # Override this (and call super) to change the margin to the left - # of the plot area. Results in @border_left being set. - def calculate_left_margin - @border_left = 7 - # Check for Y labels - max_y_label_height_px = rotate_y_labels ? - y_label_font_size : - get_y_labels.max{|a,b| - a.to_s.length<=>b.to_s.length - }.to_s.length * y_label_font_size * 0.6 - @border_left += max_y_label_height_px if show_y_labels - @border_left += max_y_label_height_px + 10 if stagger_y_labels - @border_left += y_title_font_size + 5 if show_y_title - end - - - # Calculates the width of the widest Y label. This will be the - # character height if the Y labels are rotated - def max_y_label_width_px - return font_size if rotate_y_labels - end - - - # Override this (and call super) to change the margin to the right - # of the plot area. Results in @border_right being set. - def calculate_right_margin - @border_right = 7 - if key and key_position == :right - val = keys.max { |a,b| a.length <=> b.length } - @border_right += val.length * key_font_size * 0.6 - @border_right += KEY_BOX_SIZE - @border_right += 10 # Some padding around the box - end - end - - - # Override this (and call super) to change the margin to the top - # of the plot area. Results in @border_top being set. - def calculate_top_margin - @border_top = 5 - @border_top += title_font_size if show_graph_title - @border_top += 5 - @border_top += subtitle_font_size if show_graph_subtitle - end - - - # Adds pop-up point information to a graph. - def add_popup( x, y, label ) - txt_width = label.length * font_size * 0.6 + 10 - tx = (x+txt_width > width ? x-5 : x+5) - t = @foreground.add_element( "text", { - "x" => tx.to_s, - "y" => (y - font_size).to_s, - "visibility" => "hidden", - }) - t.attributes["style"] = "fill: #000; "+ - (x+txt_width > width ? "text-anchor: end;" : "text-anchor: start;") - t.text = label.to_s - t.attributes["id"] = t.object_id.to_s - - @foreground.add_element( "circle", { - "cx" => x.to_s, - "cy" => y.to_s, - "r" => "10", - "style" => "opacity: 0", - "onmouseover" => - "document.getElementById(#{t.object_id}).setAttribute('visibility', 'visible' )", - "onmouseout" => - "document.getElementById(#{t.object_id}).setAttribute('visibility', 'hidden' )", - }) - - end - - - # Override this (and call super) to change the margin to the bottom - # of the plot area. Results in @border_bottom being set. - def calculate_bottom_margin - @border_bottom = 7 - if key and key_position == :bottom - @border_bottom += @data.size * (font_size + 5) - @border_bottom += 10 - end - if show_x_labels - max_x_label_height_px = (not rotate_x_labels) ? - x_label_font_size : - get_x_labels.max{|a,b| - a.to_s.length<=>b.to_s.length - }.to_s.length * x_label_font_size * 0.6 - @border_bottom += max_x_label_height_px - @border_bottom += max_x_label_height_px + 10 if stagger_x_labels - end - @border_bottom += x_title_font_size + 5 if show_x_title - end - - - # Draws the background, axis, and labels. - def draw_graph - @graph = @root.add_element( "g", { - "transform" => "translate( #@border_left #@border_top )" - }) - - # Background - @graph.add_element( "rect", { - "x" => "0", - "y" => "0", - "width" => @graph_width.to_s, - "height" => @graph_height.to_s, - "class" => "graphBackground" - }) - - # Axis - @graph.add_element( "path", { - "d" => "M 0 0 v#@graph_height", - "class" => "axis", - "id" => "xAxis" - }) - @graph.add_element( "path", { - "d" => "M 0 #@graph_height h#@graph_width", - "class" => "axis", - "id" => "yAxis" - }) - - draw_x_labels - draw_y_labels - end - - - # Where in the X area the label is drawn - # Centered in the field, should be width/2. Start, 0. - def x_label_offset( width ) - 0 - end - - def make_datapoint_text( x, y, value, style="" ) - if show_data_values - @foreground.add_element( "text", { - "x" => x.to_s, - "y" => y.to_s, - "class" => "dataPointLabel", - "style" => "#{style} stroke: #fff; stroke-width: 2;" - }).text = value.to_s - text = @foreground.add_element( "text", { - "x" => x.to_s, - "y" => y.to_s, - "class" => "dataPointLabel" - }) - text.text = value.to_s - text.attributes["style"] = style if style.length > 0 - end - end - - - # Draws the X axis labels - def draw_x_labels - stagger = x_label_font_size + 5 - if show_x_labels - label_width = field_width - - count = 0 - for label in get_x_labels - if step_include_first_x_label == true then - step = count % step_x_labels - else - step = (count + 1) % step_x_labels - end - - if step == 0 then - text = @graph.add_element( "text" ) - text.attributes["class"] = "xAxisLabels" - text.text = label.to_s - - x = count * label_width + x_label_offset( label_width ) - y = @graph_height + x_label_font_size + 3 - t = 0 - (font_size / 2) - - if stagger_x_labels and count % 2 == 1 - y += stagger - @graph.add_element( "path", { - "d" => "M#{x} #@graph_height v#{stagger}", - "class" => "staggerGuideLine" - }) - end - - text.attributes["x"] = x.to_s - text.attributes["y"] = y.to_s - if rotate_x_labels - text.attributes["transform"] = - "rotate( 90 #{x} #{y-x_label_font_size} )"+ - " translate( 0 -#{x_label_font_size/4} )" - text.attributes["style"] = "text-anchor: start" - else - text.attributes["style"] = "text-anchor: middle" - end - end - - draw_x_guidelines( label_width, count ) if show_x_guidelines - count += 1 - end - end - end - - - # Where in the Y area the label is drawn - # Centered in the field, should be width/2. Start, 0. - def y_label_offset( height ) - 0 - end - - - def field_width - (@graph_width.to_f - font_size*2*right_font) / - (get_x_labels.length - right_align) - end - - - def field_height - (@graph_height.to_f - font_size*2*top_font) / - (get_y_labels.length - top_align) - end - - - # Draws the Y axis labels - def draw_y_labels - stagger = y_label_font_size + 5 - if show_y_labels - label_height = field_height - - count = 0 - y_offset = @graph_height + y_label_offset( label_height ) - y_offset += font_size/1.2 unless rotate_y_labels - for label in get_y_labels - y = y_offset - (label_height * count) - x = rotate_y_labels ? 0 : -3 - - if stagger_y_labels and count % 2 == 1 - x -= stagger - @graph.add_element( "path", { - "d" => "M#{x} #{y} h#{stagger}", - "class" => "staggerGuideLine" - }) - end - - text = @graph.add_element( "text", { - "x" => x.to_s, - "y" => y.to_s, - "class" => "yAxisLabels" - }) - text.text = label.to_s - if rotate_y_labels - text.attributes["transform"] = "translate( -#{font_size} 0 ) "+ - "rotate( 90 #{x} #{y} ) " - text.attributes["style"] = "text-anchor: middle" - else - text.attributes["y"] = (y - (y_label_font_size/2)).to_s - text.attributes["style"] = "text-anchor: end" - end - draw_y_guidelines( label_height, count ) if show_y_guidelines - count += 1 - end - end - end - - - # Draws the X axis guidelines - def draw_x_guidelines( label_height, count ) - if count != 0 - @graph.add_element( "path", { - "d" => "M#{label_height*count} 0 v#@graph_height", - "class" => "guideLines" - }) - end - end - - - # Draws the Y axis guidelines - def draw_y_guidelines( label_height, count ) - if count != 0 - @graph.add_element( "path", { - "d" => "M0 #{@graph_height-(label_height*count)} h#@graph_width", - "class" => "guideLines" - }) - end - end - - - # Draws the graph title and subtitle - def draw_titles - if show_graph_title - @root.add_element( "text", { - "x" => (width / 2).to_s, - "y" => (title_font_size).to_s, - "class" => "mainTitle" - }).text = graph_title.to_s - end - - if show_graph_subtitle - y_subtitle = show_graph_title ? - title_font_size + 10 : - subtitle_font_size - @root.add_element("text", { - "x" => (width / 2).to_s, - "y" => (y_subtitle).to_s, - "class" => "subTitle" - }).text = graph_subtitle.to_s - end - - if show_x_title - y = @graph_height + @border_top + x_title_font_size - if show_x_labels - y += x_label_font_size + 5 if stagger_x_labels - y += x_label_font_size + 5 - end - x = width / 2 - - @root.add_element("text", { - "x" => x.to_s, - "y" => y.to_s, - "class" => "xAxisTitle", - }).text = x_title.to_s - end - - if show_y_title - x = y_title_font_size + (y_title_text_direction==:bt ? 3 : -3) - y = height / 2 - - text = @root.add_element("text", { - "x" => x.to_s, - "y" => y.to_s, - "class" => "yAxisTitle", - }) - text.text = y_title.to_s - if y_title_text_direction == :bt - text.attributes["transform"] = "rotate( -90, #{x}, #{y} )" - else - text.attributes["transform"] = "rotate( 90, #{x}, #{y} )" - end - end - end - - def keys - return @data.collect{ |d| d[:title] } - end - - # Draws the legend on the graph - def draw_legend - if key - group = @root.add_element( "g" ) - - key_count = 0 - for key_name in keys - y_offset = (KEY_BOX_SIZE * key_count) + (key_count * 5) - group.add_element( "rect", { - "x" => 0.to_s, - "y" => y_offset.to_s, - "width" => KEY_BOX_SIZE.to_s, - "height" => KEY_BOX_SIZE.to_s, - "class" => "key#{key_count+1}" - }) - group.add_element( "text", { - "x" => (KEY_BOX_SIZE + 5).to_s, - "y" => (y_offset + KEY_BOX_SIZE).to_s, - "class" => "keyText" - }).text = key_name.to_s - key_count += 1 - end - - case key_position - when :right - x_offset = @graph_width + @border_left + 10 - y_offset = @border_top + 20 - when :bottom - x_offset = @border_left + 20 - y_offset = @border_top + @graph_height + 5 - if show_x_labels - max_x_label_height_px = (not rotate_x_labels) ? - x_label_font_size : - get_x_labels.max{|a,b| - a.to_s.length<=>b.to_s.length - }.to_s.length * x_label_font_size * 0.6 - x_label_font_size - y_offset += max_x_label_height_px - y_offset += max_x_label_height_px + 5 if stagger_x_labels - end - y_offset += x_title_font_size + 5 if show_x_title - end - group.attributes["transform"] = "translate(#{x_offset} #{y_offset})" - end - end - - - private - - def sort_multiple( arrys, lo=0, hi=arrys[0].length-1 ) - if lo < hi - p = partition(arrys,lo,hi) - sort_multiple(arrys, lo, p-1) - sort_multiple(arrys, p+1, hi) - end - arrys - end - - def partition( arrys, lo, hi ) - p = arrys[0][lo] - l = lo - z = lo+1 - while z <= hi - if arrys[0][z] < p - l += 1 - arrys.each { |arry| arry[z], arry[l] = arry[l], arry[z] } - end - z += 1 - end - arrys.each { |arry| arry[lo], arry[l] = arry[l], arry[lo] } - l - end - - def style - if no_css - styles = parse_css - @root.elements.each("//*[@class]") { |el| - cl = el.attributes["class"] - style = styles[cl] - style += el.attributes["style"] if el.attributes["style"] - el.attributes["style"] = style - } - end - end - - def parse_css - css = get_style - rv = {} - while css =~ /^(\.(\w+)(?:\s*,\s*\.\w+)*)\s*\{/m - names_orig = names = $1 - css = $' - css =~ /([^}]+)\}/m - content = $1 - css = $' - - nms = [] - while names =~ /^\s*,?\s*\.(\w+)/ - nms << $1 - names = $' - end - - content = content.tr( "\n\t", " ") - for name in nms - current = rv[name] - current = current ? current+"; "+content : content - rv[name] = current.strip.squeeze(" ") - end - end - return rv - end - - - # Override and place code to add defs here - def add_defs defs - end - - - def start_svg - # Base document - @doc = Document.new - @doc << XMLDecl.new - @doc << DocType.new( %q{svg PUBLIC "-//W3C//DTD SVG 1.0//EN" } + - %q{"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd"} ) - if style_sheet && style_sheet != '' - @doc << Instruction.new( "xml-stylesheet", - %Q{href="#{style_sheet}" type="text/css"} ) - end - @root = @doc.add_element( "svg", { - "width" => width.to_s, - "height" => height.to_s, - "viewBox" => "0 0 #{width} #{height}", - "xmlns" => "http://www.w3.org/2000/svg", - "xmlns:xlink" => "http://www.w3.org/1999/xlink", - "xmlns:a3" => "http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/", - "a3:scriptImplementation" => "Adobe" - }) - @root << Comment.new( " "+"\\"*66 ) - @root << Comment.new( " Created with SVG::Graph " ) - @root << Comment.new( " SVG::Graph by Sean E. Russell " ) - @root << Comment.new( " Losely based on SVG::TT::Graph for Perl by"+ - " Leo Lapworth & Stephan Morgan " ) - @root << Comment.new( " "+"/"*66 ) - - defs = @root.add_element( "defs" ) - add_defs defs - if not(style_sheet && style_sheet != '') and !no_css - @root << Comment.new(" include default stylesheet if none specified ") - style = defs.add_element( "style", {"type"=>"text/css"} ) - style << CData.new( get_style ) - end - - @root << Comment.new( "SVG Background" ) - @root.add_element( "rect", { - "width" => width.to_s, - "height" => height.to_s, - "x" => "0", - "y" => "0", - "class" => "svgBackground" - }) - end - - - def calculate_graph_dimensions - calculate_left_margin - calculate_right_margin - calculate_bottom_margin - calculate_top_margin - @graph_width = width - @border_left - @border_right - @graph_height = height - @border_top - @border_bottom - end - - def get_style - return < + # + # Copyright 2004 Sean E. Russell + # This software is available under the Ruby license[LICENSE.txt] + # + class Graph + include REXML + + # Initialize the graph object with the graph settings. You won't + # instantiate this class directly; see the subclass for options. + # [width] 500 + # [height] 300 + # [show_x_guidelines] false + # [show_y_guidelines] true + # [show_data_values] true + # [min_scale_value] 0 + # [show_x_labels] true + # [stagger_x_labels] false + # [rotate_x_labels] false + # [step_x_labels] 1 + # [step_include_first_x_label] true + # [show_y_labels] true + # [rotate_y_labels] false + # [scale_integers] false + # [show_x_title] false + # [x_title] 'X Field names' + # [show_y_title] false + # [y_title_text_direction] :bt + # [y_title] 'Y Scale' + # [show_graph_title] false + # [graph_title] 'Graph Title' + # [show_graph_subtitle] false + # [graph_subtitle] 'Graph Sub Title' + # [key] true, + # [key_position] :right, # bottom or righ + # [font_size] 12 + # [title_font_size] 16 + # [subtitle_font_size] 14 + # [x_label_font_size] 12 + # [x_title_font_size] 14 + # [y_label_font_size] 12 + # [y_title_font_size] 14 + # [key_font_size] 10 + # [no_css] false + # [add_popups] false + def initialize( config ) + @config = config + + self.top_align = self.top_font = self.right_align = self.right_font = 0 + + init_with({ + :width => 500, + :height => 300, + :show_x_guidelines => false, + :show_y_guidelines => true, + :show_data_values => true, + +# :min_scale_value => 0, + + :show_x_labels => true, + :stagger_x_labels => false, + :rotate_x_labels => false, + :step_x_labels => 1, + :step_include_first_x_label => true, + + :show_y_labels => true, + :rotate_y_labels => false, + :stagger_y_labels => false, + :scale_integers => false, + + :show_x_title => false, + :x_title => 'X Field names', + + :show_y_title => false, + :y_title_text_direction => :bt, + :y_title => 'Y Scale', + + :show_graph_title => false, + :graph_title => 'Graph Title', + :show_graph_subtitle => false, + :graph_subtitle => 'Graph Sub Title', + :key => true, + :key_position => :right, # bottom or right + + :font_size =>12, + :title_font_size =>16, + :subtitle_font_size =>14, + :x_label_font_size =>12, + :x_title_font_size =>14, + :y_label_font_size =>12, + :y_title_font_size =>14, + :key_font_size =>10, + + :no_css =>false, + :add_popups =>false, + }) + + set_defaults if respond_to? :set_defaults + + init_with config + end + + + # This method allows you do add data to the graph object. + # It can be called several times to add more data sets in. + # + # data_sales_02 = [12, 45, 21]; + # + # graph.add_data({ + # :data => data_sales_02, + # :title => 'Sales 2002' + # }) + def add_data conf + @data = [] unless defined? @data + + if conf[:data] and conf[:data].kind_of? Array + @data << conf + else + raise "No data provided by #{conf.inspect}" + end + end + + + # This method removes all data from the object so that you can + # reuse it to create a new graph but with the same config options. + # + # graph.clear_data + def clear_data + @data = [] + end + + + # This method processes the template with the data and + # config which has been set and returns the resulting SVG. + # + # This method will croak unless at least one data set has + # been added to the graph object. + # + # print graph.burn + def burn + raise "No data available" unless @data.size > 0 + + calculations if respond_to? :calculations + + start_svg + calculate_graph_dimensions + @foreground = Element.new( "g" ) + draw_graph + draw_titles + draw_legend + draw_data + @graph.add_element( @foreground ) + style + + data = "" + @doc.write( data, 0 ) + + if @config[:compress] + if @@__have_zlib + inp, out = IO.pipe + gz = Zlib::GzipWriter.new( out ) + gz.write data + gz.close + data = inp.read + else + data << ""; + end + end + + return data + end + + + # Set the height of the graph box, this is the total height + # of the SVG box created - not the graph it self which auto + # scales to fix the space. + attr_accessor :height + # Set the width of the graph box, this is the total width + # of the SVG box created - not the graph it self which auto + # scales to fix the space. + attr_accessor :width + # Set the path to an external stylesheet, set to '' if + # you want to revert back to using the defaut internal version. + # + # To create an external stylesheet create a graph using the + # default internal version and copy the stylesheet section to + # an external file and edit from there. + attr_accessor :style_sheet + # (Bool) Show the value of each element of data on the graph + attr_accessor :show_data_values + # The point at which the Y axis starts, defaults to '0', + # if set to nil it will default to the minimum data value. + attr_accessor :min_scale_value + # Whether to show labels on the X axis or not, defaults + # to true, set to false if you want to turn them off. + attr_accessor :show_x_labels + # This puts the X labels at alternative levels so if they + # are long field names they will not overlap so easily. + # Default it false, to turn on set to true. + attr_accessor :stagger_x_labels + # This puts the Y labels at alternative levels so if they + # are long field names they will not overlap so easily. + # Default it false, to turn on set to true. + attr_accessor :stagger_y_labels + # This turns the X axis labels by 90 degrees. + # Default it false, to turn on set to true. + attr_accessor :rotate_x_labels + # This turns the Y axis labels by 90 degrees. + # Default it false, to turn on set to true. + attr_accessor :rotate_y_labels + # How many "steps" to use between displayed X axis labels, + # a step of one means display every label, a step of two results + # in every other label being displayed (label label label), + # a step of three results in every third label being displayed + # (label label label) and so on. + attr_accessor :step_x_labels + # Whether to (when taking "steps" between X axis labels) step from + # the first label (i.e. always include the first label) or step from + # the X axis origin (i.e. start with a gap if step_x_labels is greater + # than one). + attr_accessor :step_include_first_x_label + # Whether to show labels on the Y axis or not, defaults + # to true, set to false if you want to turn them off. + attr_accessor :show_y_labels + # Ensures only whole numbers are used as the scale divisions. + # Default it false, to turn on set to true. This has no effect if + # scale divisions are less than 1. + attr_accessor :scale_integers + # This defines the gap between markers on the Y axis, + # default is a 10th of the max_value, e.g. you will have + # 10 markers on the Y axis. NOTE: do not set this too + # low - you are limited to 999 markers, after that the + # graph won't generate. + attr_accessor :scale_divisions + # Whether to show the title under the X axis labels, + # default is false, set to true to show. + attr_accessor :show_x_title + # What the title under X axis should be, e.g. 'Months'. + attr_accessor :x_title + # Whether to show the title under the Y axis labels, + # default is false, set to true to show. + attr_accessor :show_y_title + # Aligns writing mode for Y axis label. + # Defaults to :bt (Bottom to Top). + # Change to :tb (Top to Bottom) to reverse. + attr_accessor :y_title_text_direction + # What the title under Y axis should be, e.g. 'Sales in thousands'. + attr_accessor :y_title + # Whether to show a title on the graph, defaults + # to false, set to true to show. + attr_accessor :show_graph_title + # What the title on the graph should be. + attr_accessor :graph_title + # Whether to show a subtitle on the graph, defaults + # to false, set to true to show. + attr_accessor :show_graph_subtitle + # What the subtitle on the graph should be. + attr_accessor :graph_subtitle + # Whether to show a key, defaults to false, set to + # true if you want to show it. + attr_accessor :key + # Where the key should be positioned, defaults to + # :right, set to :bottom if you want to move it. + attr_accessor :key_position + # Set the font size (in points) of the data point labels + attr_accessor :font_size + # Set the font size of the X axis labels + attr_accessor :x_label_font_size + # Set the font size of the X axis title + attr_accessor :x_title_font_size + # Set the font size of the Y axis labels + attr_accessor :y_label_font_size + # Set the font size of the Y axis title + attr_accessor :y_title_font_size + # Set the title font size + attr_accessor :title_font_size + # Set the subtitle font size + attr_accessor :subtitle_font_size + # Set the key font size + attr_accessor :key_font_size + # Show guidelines for the X axis + attr_accessor :show_x_guidelines + # Show guidelines for the Y axis + attr_accessor :show_y_guidelines + # Do not use CSS if set to true. Many SVG viewers do not support CSS, but + # not using CSS can result in larger SVGs as well as making it impossible to + # change colors after the chart is generated. Defaults to false. + attr_accessor :no_css + # Add popups for the data points on some graphs + attr_accessor :add_popups + + + protected + + def sort( *arrys ) + sort_multiple( arrys ) + end + + # Overwrite configuration options with supplied options. Used + # by subclasses. + def init_with config + config.each { |key, value| + self.send((key.to_s+"=").to_sym, value ) if respond_to? key.to_sym + } + end + + attr_accessor :top_align, :top_font, :right_align, :right_font + + KEY_BOX_SIZE = 12 + + # Override this (and call super) to change the margin to the left + # of the plot area. Results in @border_left being set. + def calculate_left_margin + @border_left = 7 + # Check for Y labels + max_y_label_height_px = rotate_y_labels ? + y_label_font_size : + get_y_labels.max{|a,b| + a.to_s.length<=>b.to_s.length + }.to_s.length * y_label_font_size * 0.6 + @border_left += max_y_label_height_px if show_y_labels + @border_left += max_y_label_height_px + 10 if stagger_y_labels + @border_left += y_title_font_size + 5 if show_y_title + end + + + # Calculates the width of the widest Y label. This will be the + # character height if the Y labels are rotated + def max_y_label_width_px + return font_size if rotate_y_labels + end + + + # Override this (and call super) to change the margin to the right + # of the plot area. Results in @border_right being set. + def calculate_right_margin + @border_right = 7 + if key and key_position == :right + val = keys.max { |a,b| a.length <=> b.length } + @border_right += val.length * key_font_size * 0.6 + @border_right += KEY_BOX_SIZE + @border_right += 10 # Some padding around the box + end + end + + + # Override this (and call super) to change the margin to the top + # of the plot area. Results in @border_top being set. + def calculate_top_margin + @border_top = 5 + @border_top += title_font_size if show_graph_title + @border_top += 5 + @border_top += subtitle_font_size if show_graph_subtitle + end + + + # Adds pop-up point information to a graph. + def add_popup( x, y, label ) + txt_width = label.length * font_size * 0.6 + 10 + tx = (x+txt_width > width ? x-5 : x+5) + t = @foreground.add_element( "text", { + "x" => tx.to_s, + "y" => (y - font_size).to_s, + "visibility" => "hidden", + }) + t.attributes["style"] = "fill: #000; "+ + (x+txt_width > width ? "text-anchor: end;" : "text-anchor: start;") + t.text = label.to_s + t.attributes["id"] = t.object_id.to_s + + @foreground.add_element( "circle", { + "cx" => x.to_s, + "cy" => y.to_s, + "r" => "10", + "style" => "opacity: 0", + "onmouseover" => + "document.getElementById(#{t.object_id}).setAttribute('visibility', 'visible' )", + "onmouseout" => + "document.getElementById(#{t.object_id}).setAttribute('visibility', 'hidden' )", + }) + + end + + + # Override this (and call super) to change the margin to the bottom + # of the plot area. Results in @border_bottom being set. + def calculate_bottom_margin + @border_bottom = 7 + if key and key_position == :bottom + @border_bottom += @data.size * (font_size + 5) + @border_bottom += 10 + end + if show_x_labels + max_x_label_height_px = (not rotate_x_labels) ? + x_label_font_size : + get_x_labels.max{|a,b| + a.to_s.length<=>b.to_s.length + }.to_s.length * x_label_font_size * 0.6 + @border_bottom += max_x_label_height_px + @border_bottom += max_x_label_height_px + 10 if stagger_x_labels + end + @border_bottom += x_title_font_size + 5 if show_x_title + end + + + # Draws the background, axis, and labels. + def draw_graph + @graph = @root.add_element( "g", { + "transform" => "translate( #@border_left #@border_top )" + }) + + # Background + @graph.add_element( "rect", { + "x" => "0", + "y" => "0", + "width" => @graph_width.to_s, + "height" => @graph_height.to_s, + "class" => "graphBackground" + }) + + # Axis + @graph.add_element( "path", { + "d" => "M 0 0 v#@graph_height", + "class" => "axis", + "id" => "xAxis" + }) + @graph.add_element( "path", { + "d" => "M 0 #@graph_height h#@graph_width", + "class" => "axis", + "id" => "yAxis" + }) + + draw_x_labels + draw_y_labels + end + + + # Where in the X area the label is drawn + # Centered in the field, should be width/2. Start, 0. + def x_label_offset( width ) + 0 + end + + def make_datapoint_text( x, y, value, style="" ) + if show_data_values + @foreground.add_element( "text", { + "x" => x.to_s, + "y" => y.to_s, + "class" => "dataPointLabel", + "style" => "#{style} stroke: #fff; stroke-width: 2;" + }).text = value.to_s + text = @foreground.add_element( "text", { + "x" => x.to_s, + "y" => y.to_s, + "class" => "dataPointLabel" + }) + text.text = value.to_s + text.attributes["style"] = style if style.length > 0 + end + end + + + # Draws the X axis labels + def draw_x_labels + stagger = x_label_font_size + 5 + if show_x_labels + label_width = field_width + + count = 0 + for label in get_x_labels + if step_include_first_x_label == true then + step = count % step_x_labels + else + step = (count + 1) % step_x_labels + end + + if step == 0 then + text = @graph.add_element( "text" ) + text.attributes["class"] = "xAxisLabels" + text.text = label.to_s + + x = count * label_width + x_label_offset( label_width ) + y = @graph_height + x_label_font_size + 3 + t = 0 - (font_size / 2) + + if stagger_x_labels and count % 2 == 1 + y += stagger + @graph.add_element( "path", { + "d" => "M#{x} #@graph_height v#{stagger}", + "class" => "staggerGuideLine" + }) + end + + text.attributes["x"] = x.to_s + text.attributes["y"] = y.to_s + if rotate_x_labels + text.attributes["transform"] = + "rotate( 90 #{x} #{y-x_label_font_size} )"+ + " translate( 0 -#{x_label_font_size/4} )" + text.attributes["style"] = "text-anchor: start" + else + text.attributes["style"] = "text-anchor: middle" + end + end + + draw_x_guidelines( label_width, count ) if show_x_guidelines + count += 1 + end + end + end + + + # Where in the Y area the label is drawn + # Centered in the field, should be width/2. Start, 0. + def y_label_offset( height ) + 0 + end + + + def field_width + (@graph_width.to_f - font_size*2*right_font) / + (get_x_labels.length - right_align) + end + + + def field_height + (@graph_height.to_f - font_size*2*top_font) / + (get_y_labels.length - top_align) + end + + + # Draws the Y axis labels + def draw_y_labels + stagger = y_label_font_size + 5 + if show_y_labels + label_height = field_height + + count = 0 + y_offset = @graph_height + y_label_offset( label_height ) + y_offset += font_size/1.2 unless rotate_y_labels + for label in get_y_labels + y = y_offset - (label_height * count) + x = rotate_y_labels ? 0 : -3 + + if stagger_y_labels and count % 2 == 1 + x -= stagger + @graph.add_element( "path", { + "d" => "M#{x} #{y} h#{stagger}", + "class" => "staggerGuideLine" + }) + end + + text = @graph.add_element( "text", { + "x" => x.to_s, + "y" => y.to_s, + "class" => "yAxisLabels" + }) + text.text = label.to_s + if rotate_y_labels + text.attributes["transform"] = "translate( -#{font_size} 0 ) "+ + "rotate( 90 #{x} #{y} ) " + text.attributes["style"] = "text-anchor: middle" + else + text.attributes["y"] = (y - (y_label_font_size/2)).to_s + text.attributes["style"] = "text-anchor: end" + end + draw_y_guidelines( label_height, count ) if show_y_guidelines + count += 1 + end + end + end + + + # Draws the X axis guidelines + def draw_x_guidelines( label_height, count ) + if count != 0 + @graph.add_element( "path", { + "d" => "M#{label_height*count} 0 v#@graph_height", + "class" => "guideLines" + }) + end + end + + + # Draws the Y axis guidelines + def draw_y_guidelines( label_height, count ) + if count != 0 + @graph.add_element( "path", { + "d" => "M0 #{@graph_height-(label_height*count)} h#@graph_width", + "class" => "guideLines" + }) + end + end + + + # Draws the graph title and subtitle + def draw_titles + if show_graph_title + @root.add_element( "text", { + "x" => (width / 2).to_s, + "y" => (title_font_size).to_s, + "class" => "mainTitle" + }).text = graph_title.to_s + end + + if show_graph_subtitle + y_subtitle = show_graph_title ? + title_font_size + 10 : + subtitle_font_size + @root.add_element("text", { + "x" => (width / 2).to_s, + "y" => (y_subtitle).to_s, + "class" => "subTitle" + }).text = graph_subtitle.to_s + end + + if show_x_title + y = @graph_height + @border_top + x_title_font_size + if show_x_labels + y += x_label_font_size + 5 if stagger_x_labels + y += x_label_font_size + 5 + end + x = width / 2 + + @root.add_element("text", { + "x" => x.to_s, + "y" => y.to_s, + "class" => "xAxisTitle", + }).text = x_title.to_s + end + + if show_y_title + x = y_title_font_size + (y_title_text_direction==:bt ? 3 : -3) + y = height / 2 + + text = @root.add_element("text", { + "x" => x.to_s, + "y" => y.to_s, + "class" => "yAxisTitle", + }) + text.text = y_title.to_s + if y_title_text_direction == :bt + text.attributes["transform"] = "rotate( -90, #{x}, #{y} )" + else + text.attributes["transform"] = "rotate( 90, #{x}, #{y} )" + end + end + end + + def keys + return @data.collect{ |d| d[:title] } + end + + # Draws the legend on the graph + def draw_legend + if key + group = @root.add_element( "g" ) + + key_count = 0 + for key_name in keys + y_offset = (KEY_BOX_SIZE * key_count) + (key_count * 5) + group.add_element( "rect", { + "x" => 0.to_s, + "y" => y_offset.to_s, + "width" => KEY_BOX_SIZE.to_s, + "height" => KEY_BOX_SIZE.to_s, + "class" => "key#{key_count+1}" + }) + group.add_element( "text", { + "x" => (KEY_BOX_SIZE + 5).to_s, + "y" => (y_offset + KEY_BOX_SIZE).to_s, + "class" => "keyText" + }).text = key_name.to_s + key_count += 1 + end + + case key_position + when :right + x_offset = @graph_width + @border_left + 10 + y_offset = @border_top + 20 + when :bottom + x_offset = @border_left + 20 + y_offset = @border_top + @graph_height + 5 + if show_x_labels + max_x_label_height_px = (not rotate_x_labels) ? + x_label_font_size : + get_x_labels.max{|a,b| + a.to_s.length<=>b.to_s.length + }.to_s.length * x_label_font_size * 0.6 + x_label_font_size + y_offset += max_x_label_height_px + y_offset += max_x_label_height_px + 5 if stagger_x_labels + end + y_offset += x_title_font_size + 5 if show_x_title + end + group.attributes["transform"] = "translate(#{x_offset} #{y_offset})" + end + end + + + private + + def sort_multiple( arrys, lo=0, hi=arrys[0].length-1 ) + if lo < hi + p = partition(arrys,lo,hi) + sort_multiple(arrys, lo, p-1) + sort_multiple(arrys, p+1, hi) + end + arrys + end + + def partition( arrys, lo, hi ) + p = arrys[0][lo] + l = lo + z = lo+1 + while z <= hi + if arrys[0][z] < p + l += 1 + arrys.each { |arry| arry[z], arry[l] = arry[l], arry[z] } + end + z += 1 + end + arrys.each { |arry| arry[lo], arry[l] = arry[l], arry[lo] } + l + end + + def style + if no_css + styles = parse_css + @root.elements.each("//*[@class]") { |el| + cl = el.attributes["class"] + style = styles[cl] + style += el.attributes["style"] if el.attributes["style"] + el.attributes["style"] = style + } + end + end + + def parse_css + css = get_style + rv = {} + while css =~ /^(\.(\w+)(?:\s*,\s*\.\w+)*)\s*\{/m + names_orig = names = $1 + css = $' + css =~ /([^}]+)\}/m + content = $1 + css = $' + + nms = [] + while names =~ /^\s*,?\s*\.(\w+)/ + nms << $1 + names = $' + end + + content = content.tr( "\n\t", " ") + for name in nms + current = rv[name] + current = current ? current+"; "+content : content + rv[name] = current.strip.squeeze(" ") + end + end + return rv + end + + + # Override and place code to add defs here + def add_defs defs + end + + + def start_svg + # Base document + @doc = Document.new + @doc << XMLDecl.new + @doc << DocType.new( %q{svg PUBLIC "-//W3C//DTD SVG 1.0//EN" } + + %q{"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd"} ) + if style_sheet && style_sheet != '' + @doc << Instruction.new( "xml-stylesheet", + %Q{href="#{style_sheet}" type="text/css"} ) + end + @root = @doc.add_element( "svg", { + "width" => width.to_s, + "height" => height.to_s, + "viewBox" => "0 0 #{width} #{height}", + "xmlns" => "http://www.w3.org/2000/svg", + "xmlns:xlink" => "http://www.w3.org/1999/xlink", + "xmlns:a3" => "http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/", + "a3:scriptImplementation" => "Adobe" + }) + @root << Comment.new( " "+"\\"*66 ) + @root << Comment.new( " Created with SVG::Graph " ) + @root << Comment.new( " SVG::Graph by Sean E. Russell " ) + @root << Comment.new( " Losely based on SVG::TT::Graph for Perl by"+ + " Leo Lapworth & Stephan Morgan " ) + @root << Comment.new( " "+"/"*66 ) + + defs = @root.add_element( "defs" ) + add_defs defs + if not(style_sheet && style_sheet != '') and !no_css + @root << Comment.new(" include default stylesheet if none specified ") + style = defs.add_element( "style", {"type"=>"text/css"} ) + style << CData.new( get_style ) + end + + @root << Comment.new( "SVG Background" ) + @root.add_element( "rect", { + "width" => width.to_s, + "height" => height.to_s, + "x" => "0", + "y" => "0", + "class" => "svgBackground" + }) + end + + + def calculate_graph_dimensions + calculate_left_margin + calculate_right_margin + calculate_bottom_margin + calculate_top_margin + @graph_width = width - @border_left - @border_right + @graph_height = height - @border_top - @border_bottom + end + + def get_style + return < 500, - # :width => 300, - # :fields => fields, - # }) - # - # graph.add_data({ - # :data => data_sales_02, - # :title => 'Sales 2002', - # }) - # - # print "Content-type: image/svg+xml\r\n\r\n" - # print graph.burn(); - # - # == Description - # - # This object aims to allow you to easily create high quality - # SVG pie graphs. You can either use the default style sheet - # or supply your own. Either way there are many options which can - # be configured to give you control over how the graph is - # generated - with or without a key, display percent on pie chart, - # title, subtitle etc. - # - # = Examples - # - # http://www.germane-software/repositories/public/SVG/test/single.rb - # - # == See also - # - # * SVG::Graph::Graph - # * SVG::Graph::BarHorizontal - # * SVG::Graph::Bar - # * SVG::Graph::Line - # * SVG::Graph::Plot - # * SVG::Graph::TimeSeries - # - # == Author - # - # Sean E. Russell - # - # Copyright 2004 Sean E. Russell - # This software is available under the Ruby license[LICENSE.txt] - # - class Pie < Graph - # Defaults are those set by Graph::initialize, and - # [show_shadow] true - # [shadow_offset] 10 - # [show_data_labels] false - # [show_actual_values] false - # [show_percent] true - # [show_key_data_labels] true - # [show_key_actual_values] true - # [show_key_percent] false - # [expanded] false - # [expand_greatest] false - # [expand_gap] 10 - # [show_x_labels] false - # [show_y_labels] false - # [datapoint_font_size] 12 - def set_defaults - init_with( - :show_shadow => true, - :shadow_offset => 10, - - :show_data_labels => false, - :show_actual_values => false, - :show_percent => true, - - :show_key_data_labels => true, - :show_key_actual_values => true, - :show_key_percent => false, - - :expanded => false, - :expand_greatest => false, - :expand_gap => 10, - - :show_x_labels => false, - :show_y_labels => false, - :datapoint_font_size => 12 - ) - @data = [] - end - - # Adds a data set to the graph. - # - # graph.add_data( { :data => [1,2,3,4] } ) - # - # Note that the :title is not necessary. If multiple - # data sets are added to the graph, the pie chart will - # display the +sums+ of the data. EG: - # - # graph.add_data( { :data => [1,2,3,4] } ) - # graph.add_data( { :data => [2,3,5,9] } ) - # - # is the same as: - # - # graph.add_data( { :data => [3,5,8,13] } ) - def add_data arg - arg[:data].each_index {|idx| - @data[idx] = 0 unless @data[idx] - @data[idx] += arg[:data][idx] - } - end - - # If true, displays a drop shadow for the chart - attr_accessor :show_shadow - # Sets the offset of the shadow from the pie chart - attr_accessor :shadow_offset - # If true, display the data labels on the chart - attr_accessor :show_data_labels - # If true, display the actual field values in the data labels - attr_accessor :show_actual_values - # If true, display the percentage value of each pie wedge in the data - # labels - attr_accessor :show_percent - # If true, display the labels in the key - attr_accessor :show_key_data_labels - # If true, display the actual value of the field in the key - attr_accessor :show_key_actual_values - # If true, display the percentage value of the wedges in the key - attr_accessor :show_key_percent - # If true, "explode" the pie (put space between the wedges) - attr_accessor :expanded - # If true, expand the largest pie wedge - attr_accessor :expand_greatest - # The amount of space between expanded wedges - attr_accessor :expand_gap - # The font size of the data point labels - attr_accessor :datapoint_font_size - - - protected - - def add_defs defs - gradient = defs.add_element( "filter", { - "id"=>"dropshadow", - "width" => "1.2", - "height" => "1.2", - } ) - gradient.add_element( "feGaussianBlur", { - "stdDeviation" => "4", - "result" => "blur" - }) - end - - # We don't need the graph - def draw_graph - end - - def get_y_labels - [""] - end - - def get_x_labels - [""] - end - - def keys - total = 0 - max_value = 0 - @data.each {|x| total += x } - percent_scale = 100.0 / total - count = -1 - a = @config[:fields].collect{ |x| - count += 1 - v = @data[count] - perc = show_key_percent ? " "+(v * percent_scale).round.to_s+"%" : "" - x + " [" + v.to_s + "]" + perc - } - end - - RADIANS = Math::PI/180 - - def draw_data - @graph = @root.add_element( "g" ) - background = @graph.add_element("g") - midground = @graph.add_element("g") - - diameter = @graph_height > @graph_width ? @graph_width : @graph_height - diameter -= expand_gap if expanded or expand_greatest - diameter -= datapoint_font_size if show_data_labels - diameter -= 10 if show_shadow - radius = diameter / 2.0 - - xoff = (width - diameter) / 2 - yoff = (height - @border_bottom - diameter) - yoff -= 10 if show_shadow - @graph.attributes['transform'] = "translate( #{xoff} #{yoff} )" - - wedge_text_pad = 5 - wedge_text_pad = 20 if show_percent and show_data_labels - - total = 0 - max_value = 0 - @data.each {|x| - max_value = max_value < x ? x : max_value - total += x - } - percent_scale = 100.0 / total - - prev_percent = 0 - rad_mult = 3.6 * RADIANS - @config[:fields].each_index { |count| - value = @data[count] - percent = percent_scale * value - - radians = prev_percent * rad_mult - x_start = radius+(Math.sin(radians) * radius) - y_start = radius-(Math.cos(radians) * radius) - radians = (prev_percent+percent) * rad_mult - x_end = radius+(Math.sin(radians) * radius) - x_end -= 0.00001 if @data.length == 1 - y_end = radius-(Math.cos(radians) * radius) - path = "M#{radius},#{radius} L#{x_start},#{y_start} "+ - "A#{radius},#{radius} "+ - "0, #{percent >= 50 ? '1' : '0'},1, "+ - "#{x_end} #{y_end} Z" - - - wedge = @foreground.add_element( "path", { - "d" => path, - "class" => "fill#{count+1}" - }) - - translate = nil - tx = 0 - ty = 0 - half_percent = prev_percent + percent / 2 - radians = half_percent * rad_mult - - if show_shadow - shadow = background.add_element( "path", { - "d" => path, - "filter" => "url(#dropshadow)", - "style" => "fill: #ccc; stroke: none;" - }) - clear = midground.add_element( "path", { - "d" => path, - "style" => "fill: #fff; stroke: none;" - }) - end - - if expanded or (expand_greatest && value == max_value) - tx = (Math.sin(radians) * expand_gap) - ty = -(Math.cos(radians) * expand_gap) - translate = "translate( #{tx} #{ty} )" - wedge.attributes["transform"] = translate - clear.attributes["transform"] = translate if clear - end - - if show_shadow - shadow.attributes["transform"] = - "translate( #{tx+shadow_offset} #{ty+shadow_offset} )" - end - - if show_data_labels and value != 0 - label = "" - label += @config[:fields][count] if show_key_data_labels - label += " ["+value.to_s+"]" if show_actual_values - label += " "+percent.round.to_s+"%" if show_percent - - msr = Math.sin(radians) - mcr = Math.cos(radians) - tx = radius + (msr * radius) - ty = radius -(mcr * radius) - - if expanded or (expand_greatest && value == max_value) - tx += (msr * expand_gap) - ty -= (mcr * expand_gap) - end - @foreground.add_element( "text", { - "x" => tx.to_s, - "y" => ty.to_s, - "class" => "dataPointLabel", - "style" => "stroke: #fff; stroke-width: 2;" - }).text = label.to_s - @foreground.add_element( "text", { - "x" => tx.to_s, - "y" => ty.to_s, - "class" => "dataPointLabel", - }).text = label.to_s - end - - prev_percent += percent - } - end - - - def round val, to - up = 10**to.to_f - (val * up).to_i / up - end - - - def get_css - return < 500, + # :width => 300, + # :fields => fields, + # }) + # + # graph.add_data({ + # :data => data_sales_02, + # :title => 'Sales 2002', + # }) + # + # print "Content-type: image/svg+xml\r\n\r\n" + # print graph.burn(); + # + # == Description + # + # This object aims to allow you to easily create high quality + # SVG pie graphs. You can either use the default style sheet + # or supply your own. Either way there are many options which can + # be configured to give you control over how the graph is + # generated - with or without a key, display percent on pie chart, + # title, subtitle etc. + # + # = Examples + # + # http://www.germane-software/repositories/public/SVG/test/single.rb + # + # == See also + # + # * SVG::Graph::Graph + # * SVG::Graph::BarHorizontal + # * SVG::Graph::Bar + # * SVG::Graph::Line + # * SVG::Graph::Plot + # * SVG::Graph::TimeSeries + # + # == Author + # + # Sean E. Russell + # + # Copyright 2004 Sean E. Russell + # This software is available under the Ruby license[LICENSE.txt] + # + class Pie < Graph + # Defaults are those set by Graph::initialize, and + # [show_shadow] true + # [shadow_offset] 10 + # [show_data_labels] false + # [show_actual_values] false + # [show_percent] true + # [show_key_data_labels] true + # [show_key_actual_values] true + # [show_key_percent] false + # [expanded] false + # [expand_greatest] false + # [expand_gap] 10 + # [show_x_labels] false + # [show_y_labels] false + # [datapoint_font_size] 12 + def set_defaults + init_with( + :show_shadow => true, + :shadow_offset => 10, + + :show_data_labels => false, + :show_actual_values => false, + :show_percent => true, + + :show_key_data_labels => true, + :show_key_actual_values => true, + :show_key_percent => false, + + :expanded => false, + :expand_greatest => false, + :expand_gap => 10, + + :show_x_labels => false, + :show_y_labels => false, + :datapoint_font_size => 12 + ) + @data = [] + end + + # Adds a data set to the graph. + # + # graph.add_data( { :data => [1,2,3,4] } ) + # + # Note that the :title is not necessary. If multiple + # data sets are added to the graph, the pie chart will + # display the +sums+ of the data. EG: + # + # graph.add_data( { :data => [1,2,3,4] } ) + # graph.add_data( { :data => [2,3,5,9] } ) + # + # is the same as: + # + # graph.add_data( { :data => [3,5,8,13] } ) + def add_data arg + arg[:data].each_index {|idx| + @data[idx] = 0 unless @data[idx] + @data[idx] += arg[:data][idx] + } + end + + # If true, displays a drop shadow for the chart + attr_accessor :show_shadow + # Sets the offset of the shadow from the pie chart + attr_accessor :shadow_offset + # If true, display the data labels on the chart + attr_accessor :show_data_labels + # If true, display the actual field values in the data labels + attr_accessor :show_actual_values + # If true, display the percentage value of each pie wedge in the data + # labels + attr_accessor :show_percent + # If true, display the labels in the key + attr_accessor :show_key_data_labels + # If true, display the actual value of the field in the key + attr_accessor :show_key_actual_values + # If true, display the percentage value of the wedges in the key + attr_accessor :show_key_percent + # If true, "explode" the pie (put space between the wedges) + attr_accessor :expanded + # If true, expand the largest pie wedge + attr_accessor :expand_greatest + # The amount of space between expanded wedges + attr_accessor :expand_gap + # The font size of the data point labels + attr_accessor :datapoint_font_size + + + protected + + def add_defs defs + gradient = defs.add_element( "filter", { + "id"=>"dropshadow", + "width" => "1.2", + "height" => "1.2", + } ) + gradient.add_element( "feGaussianBlur", { + "stdDeviation" => "4", + "result" => "blur" + }) + end + + # We don't need the graph + def draw_graph + end + + def get_y_labels + [""] + end + + def get_x_labels + [""] + end + + def keys + total = 0 + max_value = 0 + @data.each {|x| total += x } + percent_scale = 100.0 / total + count = -1 + a = @config[:fields].collect{ |x| + count += 1 + v = @data[count] + perc = show_key_percent ? " "+(v * percent_scale).round.to_s+"%" : "" + x + " [" + v.to_s + "]" + perc + } + end + + RADIANS = Math::PI/180 + + def draw_data + @graph = @root.add_element( "g" ) + background = @graph.add_element("g") + midground = @graph.add_element("g") + + diameter = @graph_height > @graph_width ? @graph_width : @graph_height + diameter -= expand_gap if expanded or expand_greatest + diameter -= datapoint_font_size if show_data_labels + diameter -= 10 if show_shadow + radius = diameter / 2.0 + + xoff = (width - diameter) / 2 + yoff = (height - @border_bottom - diameter) + yoff -= 10 if show_shadow + @graph.attributes['transform'] = "translate( #{xoff} #{yoff} )" + + wedge_text_pad = 5 + wedge_text_pad = 20 if show_percent and show_data_labels + + total = 0 + max_value = 0 + @data.each {|x| + max_value = max_value < x ? x : max_value + total += x + } + percent_scale = 100.0 / total + + prev_percent = 0 + rad_mult = 3.6 * RADIANS + @config[:fields].each_index { |count| + value = @data[count] + percent = percent_scale * value + + radians = prev_percent * rad_mult + x_start = radius+(Math.sin(radians) * radius) + y_start = radius-(Math.cos(radians) * radius) + radians = (prev_percent+percent) * rad_mult + x_end = radius+(Math.sin(radians) * radius) + x_end -= 0.00001 if @data.length == 1 + y_end = radius-(Math.cos(radians) * radius) + path = "M#{radius},#{radius} L#{x_start},#{y_start} "+ + "A#{radius},#{radius} "+ + "0, #{percent >= 50 ? '1' : '0'},1, "+ + "#{x_end} #{y_end} Z" + + + wedge = @foreground.add_element( "path", { + "d" => path, + "class" => "fill#{count+1}" + }) + + translate = nil + tx = 0 + ty = 0 + half_percent = prev_percent + percent / 2 + radians = half_percent * rad_mult + + if show_shadow + shadow = background.add_element( "path", { + "d" => path, + "filter" => "url(#dropshadow)", + "style" => "fill: #ccc; stroke: none;" + }) + clear = midground.add_element( "path", { + "d" => path, + "style" => "fill: #fff; stroke: none;" + }) + end + + if expanded or (expand_greatest && value == max_value) + tx = (Math.sin(radians) * expand_gap) + ty = -(Math.cos(radians) * expand_gap) + translate = "translate( #{tx} #{ty} )" + wedge.attributes["transform"] = translate + clear.attributes["transform"] = translate if clear + end + + if show_shadow + shadow.attributes["transform"] = + "translate( #{tx+shadow_offset} #{ty+shadow_offset} )" + end + + if show_data_labels and value != 0 + label = "" + label += @config[:fields][count] if show_key_data_labels + label += " ["+value.to_s+"]" if show_actual_values + label += " "+percent.round.to_s+"%" if show_percent + + msr = Math.sin(radians) + mcr = Math.cos(radians) + tx = radius + (msr * radius) + ty = radius -(mcr * radius) + + if expanded or (expand_greatest && value == max_value) + tx += (msr * expand_gap) + ty -= (mcr * expand_gap) + end + @foreground.add_element( "text", { + "x" => tx.to_s, + "y" => ty.to_s, + "class" => "dataPointLabel", + "style" => "stroke: #fff; stroke-width: 2;" + }).text = label.to_s + @foreground.add_element( "text", { + "x" => tx.to_s, + "y" => ty.to_s, + "class" => "dataPointLabel", + }).text = label.to_s + end + + prev_percent += percent + } + end + + + def round val, to + up = 10**to.to_f + (val * up).to_i / up + end + + + def get_css + return < 500, - # :width => 300, - # :key => true, - # :scale_x_integers => true, - # :scale_y_integerrs => true, - # }) - # - # graph.add_data({ - # :data => projection - # :title => 'Projected', - # }) - # - # graph.add_data({ - # :data => actual, - # :title => 'Actual', - # }) - # - # print graph.burn() - # - # = Description - # - # Produces a graph of scalar data. - # - # This object aims to allow you to easily create high quality - # SVG[http://www.w3c.org/tr/svg] scalar plots. You can either use the - # default style sheet or supply your own. Either way there are many options - # which can be configured to give you control over how the graph is - # generated - with or without a key, data elements at each point, title, - # subtitle etc. - # - # = Examples - # - # http://www.germane-software/repositories/public/SVG/test/plot.rb - # - # = Notes - # - # The default stylesheet handles upto 10 data sets, if you - # use more you must create your own stylesheet and add the - # additional settings for the extra data sets. You will know - # if you go over 10 data sets as they will have no style and - # be in black. - # - # Unlike the other types of charts, data sets must contain x,y pairs: - # - # [ 1, 2 ] # A data set with 1 point: (1,2) - # [ 1,2, 5,6] # A data set with 2 points: (1,2) and (5,6) - # - # = See also - # - # * SVG::Graph::Graph - # * SVG::Graph::BarHorizontal - # * SVG::Graph::Bar - # * SVG::Graph::Line - # * SVG::Graph::Pie - # * SVG::Graph::TimeSeries - # - # == Author - # - # Sean E. Russell - # - # Copyright 2004 Sean E. Russell - # This software is available under the Ruby license[LICENSE.txt] - # - class Plot < Graph - - # In addition to the defaults set by Graph::initialize, sets - # [show_data_values] true - # [show_data_points] true - # [area_fill] false - # [stacked] false - def set_defaults - init_with( - :show_data_values => true, - :show_data_points => true, - :area_fill => false, - :stacked => false - ) - self.top_align = self.right_align = self.top_font = self.right_font = 1 - end - - # Determines the scaling for the X axis divisions. - # - # graph.scale_x_divisions = 2 - # - # would cause the graph to attempt to generate labels stepped by 2; EG: - # 0,2,4,6,8... - attr_accessor :scale_x_divisions - # Determines the scaling for the Y axis divisions. - # - # graph.scale_y_divisions = 0.5 - # - # would cause the graph to attempt to generate labels stepped by 0.5; EG: - # 0, 0.5, 1, 1.5, 2, ... - attr_accessor :scale_y_divisions - # Make the X axis labels integers - attr_accessor :scale_x_integers - # Make the Y axis labels integers - attr_accessor :scale_y_integers - # Fill the area under the line - attr_accessor :area_fill - # Show a small circle on the graph where the line - # goes from one point to the next. - attr_accessor :show_data_points - # Set the minimum value of the X axis - attr_accessor :min_x_value - # Set the minimum value of the Y axis - attr_accessor :min_y_value - - - # Adds data to the plot. The data must be in X,Y pairs; EG - # [ 1, 2 ] # A data set with 1 point: (1,2) - # [ 1,2, 5,6] # A data set with 2 points: (1,2) and (5,6) - def add_data data - @data = [] unless @data - - raise "No data provided by #{conf.inspect}" unless data[:data] and - data[:data].kind_of? Array - raise "Data supplied must be x,y pairs! "+ - "The data provided contained an odd set of "+ - "data points" unless data[:data].length % 2 == 0 - return if data[:data].length == 0 - - x = [] - y = [] - data[:data].each_index {|i| - (i%2 == 0 ? x : y) << data[:data][i] - } - sort( x, y ) - data[:data] = [x,y] - @data << data - end - - - protected - - def keys - @data.collect{ |x| x[:title] } - end - - def calculate_left_margin - super - label_left = get_x_labels[0].to_s.length / 2 * font_size * 0.6 - @border_left = label_left if label_left > @border_left - end - - def calculate_right_margin - super - label_right = get_x_labels[-1].to_s.length / 2 * font_size * 0.6 - @border_right = label_right if label_right > @border_right - end - - - X = 0 - Y = 1 - def x_range - max_value = @data.collect{|x| x[:data][X][-1] }.max - min_value = @data.collect{|x| x[:data][X][0] }.min - min_value = min_value "M#{x_start} #@graph_height #{lpath} V#@graph_height Z", - "class" => "fill#{line}" - }) - end - - @graph.add_element( "path", { - "d" => "M#{x_start} #{y_start} #{lpath}", - "class" => "line#{line}" - }) - - if show_data_points || show_data_values - x_points.each_index { |idx| - x = (x_points[idx] - x_min) * x_step - y = @graph_height - (y_points[idx] - y_min) * y_step - if show_data_points - @graph.add_element( "circle", { - "cx" => x.to_s, - "cy" => y.to_s, - "r" => "2.5", - "class" => "dataPoint#{line}" - }) - add_popup(x, y, format( x_points[idx], y_points[idx] )) if add_popups - end - make_datapoint_text( x, y-6, y_points[idx] ) if show_data_values - } - end - line += 1 - end - end - - def format x, y - "(#{(x * 100).to_i / 100}, #{(y * 100).to_i / 100})" - end - - def get_css - return < 500, + # :width => 300, + # :key => true, + # :scale_x_integers => true, + # :scale_y_integerrs => true, + # }) + # + # graph.add_data({ + # :data => projection + # :title => 'Projected', + # }) + # + # graph.add_data({ + # :data => actual, + # :title => 'Actual', + # }) + # + # print graph.burn() + # + # = Description + # + # Produces a graph of scalar data. + # + # This object aims to allow you to easily create high quality + # SVG[http://www.w3c.org/tr/svg] scalar plots. You can either use the + # default style sheet or supply your own. Either way there are many options + # which can be configured to give you control over how the graph is + # generated - with or without a key, data elements at each point, title, + # subtitle etc. + # + # = Examples + # + # http://www.germane-software/repositories/public/SVG/test/plot.rb + # + # = Notes + # + # The default stylesheet handles upto 10 data sets, if you + # use more you must create your own stylesheet and add the + # additional settings for the extra data sets. You will know + # if you go over 10 data sets as they will have no style and + # be in black. + # + # Unlike the other types of charts, data sets must contain x,y pairs: + # + # [ 1, 2 ] # A data set with 1 point: (1,2) + # [ 1,2, 5,6] # A data set with 2 points: (1,2) and (5,6) + # + # = See also + # + # * SVG::Graph::Graph + # * SVG::Graph::BarHorizontal + # * SVG::Graph::Bar + # * SVG::Graph::Line + # * SVG::Graph::Pie + # * SVG::Graph::TimeSeries + # + # == Author + # + # Sean E. Russell + # + # Copyright 2004 Sean E. Russell + # This software is available under the Ruby license[LICENSE.txt] + # + class Plot < Graph + + # In addition to the defaults set by Graph::initialize, sets + # [show_data_values] true + # [show_data_points] true + # [area_fill] false + # [stacked] false + def set_defaults + init_with( + :show_data_values => true, + :show_data_points => true, + :area_fill => false, + :stacked => false + ) + self.top_align = self.right_align = self.top_font = self.right_font = 1 + end + + # Determines the scaling for the X axis divisions. + # + # graph.scale_x_divisions = 2 + # + # would cause the graph to attempt to generate labels stepped by 2; EG: + # 0,2,4,6,8... + attr_accessor :scale_x_divisions + # Determines the scaling for the Y axis divisions. + # + # graph.scale_y_divisions = 0.5 + # + # would cause the graph to attempt to generate labels stepped by 0.5; EG: + # 0, 0.5, 1, 1.5, 2, ... + attr_accessor :scale_y_divisions + # Make the X axis labels integers + attr_accessor :scale_x_integers + # Make the Y axis labels integers + attr_accessor :scale_y_integers + # Fill the area under the line + attr_accessor :area_fill + # Show a small circle on the graph where the line + # goes from one point to the next. + attr_accessor :show_data_points + # Set the minimum value of the X axis + attr_accessor :min_x_value + # Set the minimum value of the Y axis + attr_accessor :min_y_value + + + # Adds data to the plot. The data must be in X,Y pairs; EG + # [ 1, 2 ] # A data set with 1 point: (1,2) + # [ 1,2, 5,6] # A data set with 2 points: (1,2) and (5,6) + def add_data data + @data = [] unless @data + + raise "No data provided by #{conf.inspect}" unless data[:data] and + data[:data].kind_of? Array + raise "Data supplied must be x,y pairs! "+ + "The data provided contained an odd set of "+ + "data points" unless data[:data].length % 2 == 0 + return if data[:data].length == 0 + + x = [] + y = [] + data[:data].each_index {|i| + (i%2 == 0 ? x : y) << data[:data][i] + } + sort( x, y ) + data[:data] = [x,y] + @data << data + end + + + protected + + def keys + @data.collect{ |x| x[:title] } + end + + def calculate_left_margin + super + label_left = get_x_labels[0].to_s.length / 2 * font_size * 0.6 + @border_left = label_left if label_left > @border_left + end + + def calculate_right_margin + super + label_right = get_x_labels[-1].to_s.length / 2 * font_size * 0.6 + @border_right = label_right if label_right > @border_right + end + + + X = 0 + Y = 1 + def x_range + max_value = @data.collect{|x| x[:data][X][-1] }.max + min_value = @data.collect{|x| x[:data][X][0] }.min + min_value = min_value "M#{x_start} #@graph_height #{lpath} V#@graph_height Z", + "class" => "fill#{line}" + }) + end + + @graph.add_element( "path", { + "d" => "M#{x_start} #{y_start} #{lpath}", + "class" => "line#{line}" + }) + + if show_data_points || show_data_values + x_points.each_index { |idx| + x = (x_points[idx] - x_min) * x_step + y = @graph_height - (y_points[idx] - y_min) * y_step + if show_data_points + @graph.add_element( "circle", { + "cx" => x.to_s, + "cy" => y.to_s, + "r" => "2.5", + "class" => "dataPoint#{line}" + }) + add_popup(x, y, format( x_points[idx], y_points[idx] )) if add_popups + end + make_datapoint_text( x, y-6, y_points[idx] ) if show_data_values + } + end + line += 1 + end + end + + def format x, y + "(#{(x * 100).to_i / 100}, #{(y * 100).to_i / 100})" + end + + def get_css + return < 640, - # :height => 480, - # :graph_title => title, - # :show_graph_title => true, - # :no_css => true, - # :key => true, - # :scale_x_integers => true, - # :scale_y_integers => true, - # :min_x_value => 0, - # :min_y_value => 0, - # :show_data_labels => true, - # :show_x_guidelines => true, - # :show_x_title => true, - # :x_title => "Time", - # :show_y_title => true, - # :y_title => "Ice Cream Cones", - # :y_title_text_direction => :bt, - # :stagger_x_labels => true, - # :x_label_format => "%m/%d/%y", - # }) - # - # graph.add_data({ - # :data => projection - # :title => 'Projected', - # }) - # - # graph.add_data({ - # :data => actual, - # :title => 'Actual', - # }) - # - # print graph.burn() - # - # = Description - # - # Produces a graph of temporal scalar data. - # - # = Examples - # - # http://www.germane-software/repositories/public/SVG/test/timeseries.rb - # - # = Notes - # - # The default stylesheet handles upto 10 data sets, if you - # use more you must create your own stylesheet and add the - # additional settings for the extra data sets. You will know - # if you go over 10 data sets as they will have no style and - # be in black. - # - # Unlike the other types of charts, data sets must contain x,y pairs: - # - # [ "12:30", 2 ] # A data set with 1 point: ("12:30",2) - # [ "01:00",2, "14:20",6] # A data set with 2 points: ("01:00",2) and - # # ("14:20",6) - # - # Note that multiple data sets within the same chart can differ in length, - # and that the data in the datasets needn't be in order; they will be ordered - # by the plot along the X-axis. - # - # The dates must be parseable by ParseDate, but otherwise can be - # any order of magnitude (seconds within the hour, or years) - # - # = See also - # - # * SVG::Graph::Graph - # * SVG::Graph::BarHorizontal - # * SVG::Graph::Bar - # * SVG::Graph::Line - # * SVG::Graph::Pie - # * SVG::Graph::Plot - # - # == Author - # - # Sean E. Russell - # - # Copyright 2004 Sean E. Russell - # This software is available under the Ruby license[LICENSE.txt] - # - class TimeSeries < Plot - # In addition to the defaults set by Graph::initialize and - # Plot::set_defaults, sets: - # [x_label_format] '%Y-%m-%d %H:%M:%S' - # [popup_format] '%Y-%m-%d %H:%M:%S' - def set_defaults - super - init_with( - #:max_time_span => '', - :x_label_format => '%Y-%m-%d %H:%M:%S', - :popup_format => '%Y-%m-%d %H:%M:%S' - ) - end - - # The format string use do format the X axis labels. - # See Time::strformat - attr_accessor :x_label_format - # Use this to set the spacing between dates on the axis. The value - # must be of the form - # "\d+ ?(days|weeks|months|years|hours|minutes|seconds)?" - # - # EG: - # - # graph.timescale_divisions = "2 weeks" - # - # will cause the chart to try to divide the X axis up into segments of - # two week periods. - attr_accessor :timescale_divisions - # The formatting used for the popups. See x_label_format - attr_accessor :popup_format - - # Add data to the plot. - # - # d1 = [ "12:30", 2 ] # A data set with 1 point: ("12:30",2) - # d2 = [ "01:00",2, "14:20",6] # A data set with 2 points: ("01:00",2) and - # # ("14:20",6) - # graph.add_data( - # :data => d1, - # :title => 'One' - # ) - # graph.add_data( - # :data => d2, - # :title => 'Two' - # ) - # - # Note that the data must be in time,value pairs, and that the date format - # may be any date that is parseable by ParseDate. - def add_data data - @data = [] unless @data - - raise "No data provided by #{@data.inspect}" unless data[:data] and - data[:data].kind_of? Array - raise "Data supplied must be x,y pairs! "+ - "The data provided contained an odd set of "+ - "data points" unless data[:data].length % 2 == 0 - return if data[:data].length == 0 - - - x = [] - y = [] - data[:data].each_index {|i| - if i%2 == 0 - arr = ParseDate.parsedate( data[:data][i] ) - t = Time.local( *arr[0,6].compact ) - x << t.to_i - else - y << data[:data][i] - end - } - sort( x, y ) - data[:data] = [x,y] - @data << data - end - - - protected - - def min_x_value=(value) - arr = ParseDate.parsedate( value ) - @min_x_value = Time.local( *arr[0,6].compact ).to_i - end - - - def format x, y - Time.at( x ).strftime( popup_format ) - end - - def get_x_labels - get_x_values.collect { |v| Time.at(v).strftime( x_label_format ) } - end - - private - def get_x_values - rv = [] - min, max, scale_division = x_range - if timescale_divisions - timescale_divisions =~ /(\d+) ?(day|week|month|year|hour|minute|second)?/ - division_units = $2 ? $2 : "day" - amount = $1.to_i - if amount - step = nil - case division_units - when "month" - cur = min - while cur < max - rv << cur - arr = Time.at( cur ).to_a - arr[4] += amount - if arr[4] > 12 - arr[5] += (arr[4] / 12).to_i - arr[4] = (arr[4] % 12) - end - cur = Time.local(*arr).to_i - end - when "year" - cur = min - while cur < max - rv << cur - arr = Time.at( cur ).to_a - arr[5] += amount - cur = Time.local(*arr).to_i - end - when "week" - step = 7 * 24 * 60 * 60 * amount - when "day" - step = 24 * 60 * 60 * amount - when "hour" - step = 60 * 60 * amount - when "minute" - step = 60 * amount - when "second" - step = amount - end - min.step( max, step ) {|v| rv << v} if step - - return rv - end - end - min.step( max, scale_division ) {|v| rv << v} - return rv - end - end - end -end +require 'SVG/Graph/Plot' +require 'parsedate' + +module SVG + module Graph + # === For creating SVG plots of scalar temporal data + # + # = Synopsis + # + # require 'SVG/Graph/TimeSeriess' + # + # # Data sets are x,y pairs + # data1 = ["6/17/72", 11, "1/11/72", 7, "4/13/04 17:31", 11, + # "9/11/01", 9, "9/1/85", 2, "9/1/88", 1, "1/15/95", 13] + # data2 = ["8/1/73", 18, "3/1/77", 15, "10/1/98", 4, + # "5/1/02", 14, "3/1/95", 6, "8/1/91", 12, "12/1/87", 6, + # "5/1/84", 17, "10/1/80", 12] + # + # graph = SVG::Graph::TimeSeries.new( { + # :width => 640, + # :height => 480, + # :graph_title => title, + # :show_graph_title => true, + # :no_css => true, + # :key => true, + # :scale_x_integers => true, + # :scale_y_integers => true, + # :min_x_value => 0, + # :min_y_value => 0, + # :show_data_labels => true, + # :show_x_guidelines => true, + # :show_x_title => true, + # :x_title => "Time", + # :show_y_title => true, + # :y_title => "Ice Cream Cones", + # :y_title_text_direction => :bt, + # :stagger_x_labels => true, + # :x_label_format => "%m/%d/%y", + # }) + # + # graph.add_data({ + # :data => projection + # :title => 'Projected', + # }) + # + # graph.add_data({ + # :data => actual, + # :title => 'Actual', + # }) + # + # print graph.burn() + # + # = Description + # + # Produces a graph of temporal scalar data. + # + # = Examples + # + # http://www.germane-software/repositories/public/SVG/test/timeseries.rb + # + # = Notes + # + # The default stylesheet handles upto 10 data sets, if you + # use more you must create your own stylesheet and add the + # additional settings for the extra data sets. You will know + # if you go over 10 data sets as they will have no style and + # be in black. + # + # Unlike the other types of charts, data sets must contain x,y pairs: + # + # [ "12:30", 2 ] # A data set with 1 point: ("12:30",2) + # [ "01:00",2, "14:20",6] # A data set with 2 points: ("01:00",2) and + # # ("14:20",6) + # + # Note that multiple data sets within the same chart can differ in length, + # and that the data in the datasets needn't be in order; they will be ordered + # by the plot along the X-axis. + # + # The dates must be parseable by ParseDate, but otherwise can be + # any order of magnitude (seconds within the hour, or years) + # + # = See also + # + # * SVG::Graph::Graph + # * SVG::Graph::BarHorizontal + # * SVG::Graph::Bar + # * SVG::Graph::Line + # * SVG::Graph::Pie + # * SVG::Graph::Plot + # + # == Author + # + # Sean E. Russell + # + # Copyright 2004 Sean E. Russell + # This software is available under the Ruby license[LICENSE.txt] + # + class TimeSeries < Plot + # In addition to the defaults set by Graph::initialize and + # Plot::set_defaults, sets: + # [x_label_format] '%Y-%m-%d %H:%M:%S' + # [popup_format] '%Y-%m-%d %H:%M:%S' + def set_defaults + super + init_with( + #:max_time_span => '', + :x_label_format => '%Y-%m-%d %H:%M:%S', + :popup_format => '%Y-%m-%d %H:%M:%S' + ) + end + + # The format string use do format the X axis labels. + # See Time::strformat + attr_accessor :x_label_format + # Use this to set the spacing between dates on the axis. The value + # must be of the form + # "\d+ ?(days|weeks|months|years|hours|minutes|seconds)?" + # + # EG: + # + # graph.timescale_divisions = "2 weeks" + # + # will cause the chart to try to divide the X axis up into segments of + # two week periods. + attr_accessor :timescale_divisions + # The formatting used for the popups. See x_label_format + attr_accessor :popup_format + + # Add data to the plot. + # + # d1 = [ "12:30", 2 ] # A data set with 1 point: ("12:30",2) + # d2 = [ "01:00",2, "14:20",6] # A data set with 2 points: ("01:00",2) and + # # ("14:20",6) + # graph.add_data( + # :data => d1, + # :title => 'One' + # ) + # graph.add_data( + # :data => d2, + # :title => 'Two' + # ) + # + # Note that the data must be in time,value pairs, and that the date format + # may be any date that is parseable by ParseDate. + def add_data data + @data = [] unless @data + + raise "No data provided by #{@data.inspect}" unless data[:data] and + data[:data].kind_of? Array + raise "Data supplied must be x,y pairs! "+ + "The data provided contained an odd set of "+ + "data points" unless data[:data].length % 2 == 0 + return if data[:data].length == 0 + + + x = [] + y = [] + data[:data].each_index {|i| + if i%2 == 0 + arr = ParseDate.parsedate( data[:data][i] ) + t = Time.local( *arr[0,6].compact ) + x << t.to_i + else + y << data[:data][i] + end + } + sort( x, y ) + data[:data] = [x,y] + @data << data + end + + + protected + + def min_x_value=(value) + arr = ParseDate.parsedate( value ) + @min_x_value = Time.local( *arr[0,6].compact ).to_i + end + + + def format x, y + Time.at( x ).strftime( popup_format ) + end + + def get_x_labels + get_x_values.collect { |v| Time.at(v).strftime( x_label_format ) } + end + + private + def get_x_values + rv = [] + min, max, scale_division = x_range + if timescale_divisions + timescale_divisions =~ /(\d+) ?(day|week|month|year|hour|minute|second)?/ + division_units = $2 ? $2 : "day" + amount = $1.to_i + if amount + step = nil + case division_units + when "month" + cur = min + while cur < max + rv << cur + arr = Time.at( cur ).to_a + arr[4] += amount + if arr[4] > 12 + arr[5] += (arr[4] / 12).to_i + arr[4] = (arr[4] % 12) + end + cur = Time.local(*arr).to_i + end + when "year" + cur = min + while cur < max + rv << cur + arr = Time.at( cur ).to_a + arr[5] += amount + cur = Time.local(*arr).to_i + end + when "week" + step = 7 * 24 * 60 * 60 * amount + when "day" + step = 24 * 60 * 60 * amount + when "hour" + step = 60 * 60 * amount + when "minute" + step = 60 * amount + when "second" + step = amount + end + min.step( max, step ) {|v| rv << v} if step + + return rv + end + end + min.step( max, scale_division ) {|v| rv << v} + return rv + end + end + end +end diff --git a/lib/ar_condition.rb b/lib/ar_condition.rb index 30c5572e..5426ca44 100644 --- a/lib/ar_condition.rb +++ b/lib/ar_condition.rb @@ -1,28 +1,24 @@ -# redMine - project management software -# Copyright (C) 2006-2008 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ class ARCondition attr_reader :conditions - + def initialize(condition=nil) @conditions = ['1=1'] add(condition) if condition end - + def add(condition) if condition.is_a?(Array) @conditions.first << " AND (#{condition.first})" diff --git a/lib/chili_project.rb b/lib/chili_project.rb new file mode 100644 index 00000000..a5a58d36 --- /dev/null +++ b/lib/chili_project.rb @@ -0,0 +1,15 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + +module ChiliProject +end diff --git a/lib/chili_project/.empty b/lib/chili_project/.empty new file mode 100644 index 00000000..e69de29b diff --git a/lib/chili_project/database.rb b/lib/chili_project/database.rb new file mode 100644 index 00000000..02469e4a --- /dev/null +++ b/lib/chili_project/database.rb @@ -0,0 +1,78 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + +module ChiliProject + + # This module provides some information about the currently used database + # adapter. It can be used to write code specific to certain database + # vendors which, while not not encouraged, is sometimes necessary due to + # syntax differences. + + module Database + + # This method returns a hash which maps the identifier of the supported + # adapter to a regex matching the adapter_name. + def self.supported_adapters + @adapters ||= ({ + :mysql => /mysql/i, + :postgresql => /postgres/i, + :sqlite => /sqlite/i + }) + end + + # Get the raw namme of the currently used database adapter. + # This string is set by the used adapter gem. + def self.adapter_name + ActiveRecord::Base.connection.adapter_name + end + + # returns the identifier of the currently used database type + def self.name + supported_adapters.find(proc{ [:unknown, //] }) { |adapter, regex| + self.adapter_name =~ regex + }[0] + end + + # Provide helper methods to quickly check the database type + # ChiliProject::Database.mysql? returns true, if we have a MySQL DB + supported_adapters.keys.each do |adapter| + (class << self; self; end).class_eval do + define_method(:"#{adapter.to_s}?"){ send(:name) == adapter } + end + end + + # Return the version of the underlying database engine. + # Set the +raw+ argument to true to return the unmangled string + # from the database. + def self.version(raw = false) + case self.name + when :mysql + version = ActiveRecord::Base.connection.select_value('SELECT VERSION()') + when :postgresql + version = ActiveRecord::Base.connection.select_value('SELECT version()') + raw ? version : version.match(/^PostgreSQL (\S+)/i)[1] + when :sqlite + if Object.const_defined?('RUBY_ENGINE') && ::RUBY_ENGINE == 'jruby' + Jdbc::SQLite3::VERSION + else + if SQLite3.const_defined? 'SQLITE_VERSION' + SQLite3::SQLITE_VERSION + else + SQLite3::Driver::Native::API.sqlite3_libversion + end + end + end + end + + end +end diff --git a/lib/generators/chiliproject_plugin/chiliproject_plugin_generator.rb b/lib/generators/chiliproject_plugin/chiliproject_plugin_generator.rb index 02619c50..d7d09bbf 100644 --- a/lib/generators/chiliproject_plugin/chiliproject_plugin_generator.rb +++ b/lib/generators/chiliproject_plugin/chiliproject_plugin_generator.rb @@ -1,13 +1,26 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + class ChiliprojectPluginGenerator < Rails::Generator::NamedBase attr_reader :plugin_path, :plugin_name, :plugin_pretty_name - + def initialize(runtime_args, runtime_options = {}) super @plugin_name = "chiliproject_#{file_name.underscore}" @plugin_pretty_name = plugin_name.titleize @plugin_path = "vendor/plugins/#{plugin_name}" end - + def manifest record do |m| m.directory "#{plugin_path}/app/controllers" @@ -22,7 +35,7 @@ class ChiliprojectPluginGenerator < Rails::Generator::NamedBase m.directory "#{plugin_path}/lang" m.directory "#{plugin_path}/config/locales" m.directory "#{plugin_path}/test" - + m.template 'README.rdoc', "#{plugin_path}/README.rdoc" m.template 'init.rb.erb', "#{plugin_path}/init.rb" m.template 'en.yml', "#{plugin_path}/lang/en.yml" diff --git a/lib/generators/chiliproject_plugin_controller/chiliproject_plugin_controller_generator.rb b/lib/generators/chiliproject_plugin_controller/chiliproject_plugin_controller_generator.rb index 2cdbd2ca..975b23f2 100644 --- a/lib/generators/chiliproject_plugin_controller/chiliproject_plugin_controller_generator.rb +++ b/lib/generators/chiliproject_plugin_controller/chiliproject_plugin_controller_generator.rb @@ -1,9 +1,22 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + require 'rails_generator/base' require 'rails_generator/generators/components/controller/controller_generator' class ChiliprojectPluginControllerGenerator < ControllerGenerator attr_reader :plugin_path, :plugin_name, :plugin_pretty_name - + def initialize(runtime_args, runtime_options = {}) runtime_args = runtime_args.dup usage if runtime_args.empty? @@ -12,11 +25,11 @@ class ChiliprojectPluginControllerGenerator < ControllerGenerator @plugin_path = "vendor/plugins/#{plugin_name}" super(runtime_args, runtime_options) end - + def destination_root File.join(RAILS_ROOT, plugin_path) end - + def manifest record do |m| # Check for class naming collisions. diff --git a/lib/generators/chiliproject_plugin_model/chiliproject_plugin_model_generator.rb b/lib/generators/chiliproject_plugin_model/chiliproject_plugin_model_generator.rb index 54f26b5b..ad6be64c 100644 --- a/lib/generators/chiliproject_plugin_model/chiliproject_plugin_model_generator.rb +++ b/lib/generators/chiliproject_plugin_model/chiliproject_plugin_model_generator.rb @@ -1,9 +1,22 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + require 'rails_generator/base' require 'rails_generator/generators/components/model/model_generator' class ChiliprojectPluginModelGenerator < ModelGenerator attr_accessor :plugin_path, :plugin_name, :plugin_pretty_name - + def initialize(runtime_args, runtime_options = {}) runtime_args = runtime_args.dup usage if runtime_args.empty? @@ -12,11 +25,11 @@ class ChiliprojectPluginModelGenerator < ModelGenerator @plugin_path = "vendor/plugins/#{plugin_name}" super(runtime_args, runtime_options) end - + def destination_root File.join(RAILS_ROOT, plugin_path) end - + def manifest record do |m| # Check for class naming collisions. @@ -31,7 +44,7 @@ class ChiliprojectPluginModelGenerator < ModelGenerator m.template 'model.rb.erb', File.join('app/models', class_path, "#{file_name}.rb") m.template 'unit_test.rb.erb', File.join('test/unit', class_path, "#{file_name}_test.rb") - unless options[:skip_fixture] + unless options[:skip_fixture] m.template 'fixtures.yml', File.join('test/fixtures', "#{table_name}.yml") end diff --git a/lib/redcloth3.rb b/lib/redcloth3.rb index 7c9df072..f4c62443 100644 --- a/lib/redcloth3.rb +++ b/lib/redcloth3.rb @@ -296,11 +296,11 @@ class RedCloth3 < String rip_offtags text no_textile text escape_html_tags text + # need to do this before #hard_break and #blocks + block_textile_quotes text unless @lite_mode hard_break text unless @lite_mode refs text - # need to do this before text is split by #blocks - block_textile_quotes text blocks text end inline text @@ -707,11 +707,13 @@ class RedCloth3 < String atts = pba( atts ) # pass to prefix handler + replacement = nil if respond_to? "textile_#{ tag }", true - text.gsub!( $&, method( "textile_#{ tag }" ).call( tag, atts, cite, content ) ) + replacement = method( "textile_#{ tag }" ).call( tag, atts, cite, content ) elsif respond_to? "textile_#{ tagpre }_", true - text.gsub!( $&, method( "textile_#{ tagpre }_" ).call( tagpre, num, atts, cite, content ) ) + replacement = method( "textile_#{ tagpre }_" ).call( tagpre, num, atts, cite, content ) end + text.gsub!( $& ) { replacement } if replacement end end diff --git a/lib/redmine.rb b/lib/redmine.rb index 7fcd7647..983ceee6 100644 --- a/lib/redmine.rb +++ b/lib/redmine.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + require 'redmine/access_control' require 'redmine/menu_manager' require 'redmine/activity' @@ -41,6 +54,8 @@ Redmine::CustomFieldFormat.map do |fields| fields.register Redmine::CustomFieldFormat.new('list', :label => :label_list, :order => 5) fields.register Redmine::CustomFieldFormat.new('date', :label => :label_date, :order => 6) fields.register Redmine::CustomFieldFormat.new('bool', :label => :label_boolean, :order => 7) + fields.register Redmine::CustomFieldFormat.new('user', :label => :label_user, :only => %w(Issue TimeEntry Version Project), :edit_as => 'list', :order => 8) + fields.register Redmine::CustomFieldFormat.new('version', :label => :label_version, :only => %w(Issue TimeEntry Version Project), :edit_as => 'list', :order => 9) end # Permissions @@ -53,7 +68,7 @@ Redmine::AccessControl.map do |map| map.permission :manage_members, {:projects => :settings, :members => [:new, :edit, :destroy, :autocomplete_for_member]}, :require => :member map.permission :manage_versions, {:projects => :settings, :versions => [:new, :create, :edit, :update, :close_completed, :destroy]}, :require => :member map.permission :add_subprojects, {:projects => [:new, :create]}, :require => :member - + map.project_module :issue_tracking do |map| # Issue categories map.permission :manage_categories, {:projects => :settings, :issue_categories => [:new, :edit, :destroy]}, :require => :member @@ -62,7 +77,7 @@ Redmine::AccessControl.map do |map| :auto_complete => [:issues], :context_menus => [:issues], :versions => [:index, :show, :status_by], - :journals => :index, + :journals => [:index, :diff], :queries => :index, :reports => [:issue_report, :issue_report_details]} map.permission :add_issues, {:issues => [:new, :create, :update_form]} @@ -82,7 +97,7 @@ Redmine::AccessControl.map do |map| map.permission :add_issue_watchers, {:watchers => :new} map.permission :delete_issue_watchers, {:watchers => :destroy} end - + map.project_module :time_tracking do |map| map.permission :log_time, {:timelog => [:new, :create, :edit, :update]}, :require => :loggedin map.permission :view_time_entries, :timelog => [:index, :show], :time_entry_reports => [:report] @@ -90,7 +105,7 @@ Redmine::AccessControl.map do |map| map.permission :edit_own_time_entries, {:timelog => [:new, :create, :edit, :update, :destroy]}, :require => :loggedin map.permission :manage_project_activities, {:project_enumerations => [:update, :destroy]}, :require => :member end - + map.project_module :news do |map| map.permission :manage_news, {:news => [:new, :create, :edit, :update, :destroy], :comments => [:destroy]}, :require => :member map.permission :view_news, {:news => [:index, :show]}, :public => true @@ -101,12 +116,12 @@ Redmine::AccessControl.map do |map| map.permission :manage_documents, {:documents => [:new, :edit, :destroy, :add_attachment]}, :require => :loggedin map.permission :view_documents, :documents => [:index, :show, :download] end - + map.project_module :files do |map| map.permission :manage_files, {:files => [:new, :create]}, :require => :loggedin map.permission :view_files, :files => :index, :versions => :download end - + map.project_module :wiki do |map| map.permission :manage_wiki, {:wikis => [:edit, :destroy]}, :require => :member map.permission :rename_wiki_pages, {:wiki => :rename}, :require => :member @@ -118,7 +133,7 @@ Redmine::AccessControl.map do |map| map.permission :delete_wiki_pages_attachments, {} map.permission :protect_wiki_pages, {:wiki => :protect}, :require => :member end - + map.project_module :repository do |map| map.permission :manage_repository, {:repositories => [:edit, :committers, :destroy]}, :require => :member map.permission :browse_repository, :repositories => [:show, :browse, :entry, :annotate, :changes, :diff, :stats, :graph] @@ -206,12 +221,12 @@ Redmine::MenuManager.map :project_menu do |menu| end Redmine::Activity.map do |activity| - activity.register :issues, :class_name => %w(Issue Journal) + activity.register :issues, :class_name => 'Issue' activity.register :changesets activity.register :news activity.register :documents, :class_name => %w(Document Attachment) activity.register :files, :class_name => 'Attachment' - activity.register :wiki_edits, :class_name => 'WikiContent::Version', :default => false + activity.register :wiki_edits, :class_name => 'WikiContent', :default => false activity.register :messages, :default => false activity.register :time_entries, :default => false end diff --git a/lib/redmine/about.rb b/lib/redmine/about.rb index 0fcc29a9..14c23ac6 100644 --- a/lib/redmine/about.rb +++ b/lib/redmine/about.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + module Redmine class About def self.print_plugin_info diff --git a/lib/redmine/access_control.rb b/lib/redmine/access_control.rb index 25cf63d6..dabe531d 100644 --- a/lib/redmine/access_control.rb +++ b/lib/redmine/access_control.rb @@ -1,23 +1,19 @@ -# redMine - project management software -# Copyright (C) 2006-2007 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ module Redmine module AccessControl - + class << self def map mapper = Mapper.new @@ -25,69 +21,69 @@ module Redmine @permissions ||= [] @permissions += mapper.mapped_permissions end - + def permissions @permissions end - + # Returns the permission of given name or nil if it wasn't found # Argument should be a symbol def permission(name) permissions.detect {|p| p.name == name} end - + # Returns the actions that are allowed by the permission of given name def allowed_actions(permission_name) perm = permission(permission_name) perm ? perm.actions : [] end - + def public_permissions @public_permissions ||= @permissions.select {|p| p.public?} end - + def members_only_permissions @members_only_permissions ||= @permissions.select {|p| p.require_member?} end - + def loggedin_only_permissions @loggedin_only_permissions ||= @permissions.select {|p| p.require_loggedin?} end - + def available_project_modules @available_project_modules ||= @permissions.collect(&:project_module).uniq.compact end - + def modules_permissions(modules) @permissions.select {|p| p.project_module.nil? || modules.include?(p.project_module.to_s)} end end - + class Mapper def initialize @project_module = nil end - + def permission(name, hash, options={}) @permissions ||= [] options.merge!(:project_module => @project_module) @permissions << Permission.new(name, hash, options) end - + def project_module(name, options={}) @project_module = name yield self @project_module = nil end - + def mapped_permissions @permissions end end - + class Permission attr_reader :name, :actions, :project_module - + def initialize(name, hash, options) @name = name @actions = [] @@ -103,18 +99,18 @@ module Redmine end @actions.flatten! end - + def public? @public end - + def require_member? @require && @require == :member end - + def require_loggedin? @require && (@require == :member || @require == :loggedin) end - end + end end end diff --git a/lib/redmine/access_keys.rb b/lib/redmine/access_keys.rb index 96029a6f..d1165049 100644 --- a/lib/redmine/access_keys.rb +++ b/lib/redmine/access_keys.rb @@ -1,19 +1,15 @@ -# redMine - project management software -# Copyright (C) 2006-2008 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ module Redmine module AccessKeys @@ -23,7 +19,7 @@ module Redmine :search => '4', :new_issue => '7' }.freeze unless const_defined?(:ACCESSKEYS) - + def self.key_for(action) ACCESSKEYS[action] end diff --git a/lib/redmine/activity.rb b/lib/redmine/activity.rb index 565a53f3..b38484dd 100644 --- a/lib/redmine/activity.rb +++ b/lib/redmine/activity.rb @@ -1,25 +1,21 @@ -# Redmine - project management software -# Copyright (C) 2006-2008 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ module Redmine module Activity - + mattr_accessor :available_event_types, :default_event_types, :providers - + @@available_event_types = [] @@default_event_types = [] @@providers = Hash.new {|h,k| h[k]=[] } @@ -28,15 +24,15 @@ module Redmine def map(&block) yield self end - + # Registers an activity provider def register(event_type, options={}) options.assert_valid_keys(:class_name, :default) - + event_type = event_type.to_s providers = options[:class_name] || event_type.classify providers = ([] << providers) unless providers.is_a?(Array) - + @@available_event_types << event_type unless @@available_event_types.include?(event_type) @@default_event_types << event_type unless options[:default] == false @@providers[event_type] += providers diff --git a/lib/redmine/activity/fetcher.rb b/lib/redmine/activity/fetcher.rb index 6edc18f3..6ded1405 100644 --- a/lib/redmine/activity/fetcher.rb +++ b/lib/redmine/activity/fetcher.rb @@ -1,52 +1,58 @@ -# Redmine - project management software -# Copyright (C) 2006-2008 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ module Redmine module Activity # Class used to retrieve activity events class Fetcher attr_reader :user, :project, :scope - + # Needs to be unloaded in development mode @@constantized_providers = Hash.new {|h,k| h[k] = Redmine::Activity.providers[k].collect {|t| t.constantize } } - + def initialize(user, options={}) options.assert_valid_keys(:project, :with_subprojects, :author) @user = user @project = options[:project] @options = options - + @scope = event_types end - + # Returns an array of available event types def event_types return @event_types unless @event_types.nil? - + @event_types = Redmine::Activity.available_event_types - @event_types = @event_types.select {|o| @project.self_and_descendants.detect {|p| @user.allowed_to?("view_#{o}".to_sym, p)}} if @project + if @project + @event_types = @event_types.select do |o| + @project.self_and_descendants.detect do |p| + permissions = constantized_providers(o).collect do |p| + p.activity_provider_options[o].try(:[], :permission) + end.compact + return @user.allowed_to?("view_#{o}".to_sym, @project) if permissions.blank? + permissions.all? {|p| @user.allowed_to?(p, @project) } if @project + end + end + end @event_types end - + # Yields to filter the activity scope def scope_select(&block) @scope = @scope.select {|t| yield t } end - + # Sets the scope # Argument can be :all, :default or an array of event types def scope=(s) @@ -59,34 +65,34 @@ module Redmine @scope = s & event_types end end - + # Resets the scope to the default scope def default_scope! @scope = Redmine::Activity.default_event_types end - + # Returns an array of events for the given date range # sorted in reverse chronological order def events(from = nil, to = nil, options={}) e = [] @options[:limit] = options[:limit] - + @scope.each do |event_type| constantized_providers(event_type).each do |provider| e += provider.find_events(event_type, @user, from, to, @options) end end - + e.sort! {|a,b| b.event_datetime <=> a.event_datetime} - + if options[:limit] e = e.slice(0, options[:limit]) end e end - + private - + def constantized_providers(event_type) @@constantized_providers[event_type] end diff --git a/lib/redmine/ciphering.rb b/lib/redmine/ciphering.rb new file mode 100644 index 00000000..a8f7a8d0 --- /dev/null +++ b/lib/redmine/ciphering.rb @@ -0,0 +1,91 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + +module Redmine + module Ciphering + def self.included(base) + base.extend ClassMethods + end + + class << self + def encrypt_text(text) + if cipher_key.blank? + text + else + c = OpenSSL::Cipher::Cipher.new("aes-256-cbc") + iv = c.random_iv + c.encrypt + c.key = cipher_key + c.iv = iv + e = c.update(text.to_s) + e << c.final + "aes-256-cbc:" + [e, iv].map {|v| Base64.encode64(v).strip}.join('--') + end + end + + def decrypt_text(text) + if text && match = text.match(/\Aaes-256-cbc:(.+)\Z/) + text = match[1] + c = OpenSSL::Cipher::Cipher.new("aes-256-cbc") + e, iv = text.split("--").map {|s| Base64.decode64(s)} + c.decrypt + c.key = cipher_key + c.iv = iv + d = c.update(e) + d << c.final + else + text + end + end + + def cipher_key + key = Redmine::Configuration['database_cipher_key'].to_s + key.blank? ? nil : Digest::SHA256.hexdigest(key) + end + end + + module ClassMethods + def encrypt_all(attribute) + transaction do + all.each do |object| + clear = object.send(attribute) + object.send "#{attribute}=", clear + raise(ActiveRecord::Rollback) unless object.save(false) + end + end ? true : false + end + + def decrypt_all(attribute) + transaction do + all.each do |object| + clear = object.send(attribute) + object.write_attribute attribute, clear + raise(ActiveRecord::Rollback) unless object.save(false) + end + end + end ? true : false + end + + private + + # Returns the value of the given ciphered attribute + def read_ciphered_attribute(attribute) + Redmine::Ciphering.decrypt_text(read_attribute(attribute)) + end + + # Sets the value of the given ciphered attribute + def write_ciphered_attribute(attribute, value) + write_attribute(attribute, Redmine::Ciphering.encrypt_text(value)) + end + end +end diff --git a/lib/redmine/configuration.rb b/lib/redmine/configuration.rb index d4832272..3e4dedb6 100644 --- a/lib/redmine/configuration.rb +++ b/lib/redmine/configuration.rb @@ -1,23 +1,19 @@ -# Redmine - project management software -# Copyright (C) 2006-2011 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ module Redmine module Configuration - + # Configuration default values @defaults = { 'email_delivery' => nil, @@ -26,25 +22,25 @@ module Redmine 'autologin_cookie_path' => '/', 'autologin_cookie_secure' => false, } - + @config = nil - + class << self # Loads the Redmine configuration file # Valid options: # * :file: the configuration file to load (default: config/configuration.yml) - # * :env: the environment to load the configuration for (default: Rails.env) + # * :env: the environment to load the configuration for (default: Rails.env) def load(options={}) filename = options[:file] || File.join(Rails.root, 'config', 'configuration.yml') env = options[:env] || Rails.env - + @config = @defaults.dup - + load_deprecated_email_configuration(env) if File.file?(filename) @config.merge!(load_from_yaml(filename, env)) end - + # Compatibility mode for those who copy email.yml over configuration.yml %w(delivery_method smtp_settings sendmail_settings).each do |key| if value = @config.delete(key) @@ -52,7 +48,7 @@ module Redmine @config['email_delivery'][key] = value end end - + if @config['email_delivery'] ActionMailer::Base.perform_deliveries = true @config['email_delivery'].each do |k, v| @@ -60,18 +56,28 @@ module Redmine ActionMailer::Base.send("#{k}=", v) end end - + @config end - + # Returns a configuration setting def [](name) load unless @config @config[name] end - + + # Yields a block with the specified hash configuration settings + def with(settings) + settings.stringify_keys! + load unless @config + was = settings.keys.inject({}) {|h,v| h[v] = @config[v]; h} + @config.merge! settings + yield if block_given? + @config.merge! was + end + private - + def load_from_yaml(filename, env) yaml = YAML::load_file(filename) conf = {} @@ -88,7 +94,7 @@ module Redmine end conf end - + def load_deprecated_email_configuration(env) deprecated_email_conf = File.join(Rails.root, 'config', 'email.yml') if File.file?(deprecated_email_conf) diff --git a/lib/redmine/core_ext.rb b/lib/redmine/core_ext.rb index 573313e7..324f5737 100644 --- a/lib/redmine/core_ext.rb +++ b/lib/redmine/core_ext.rb @@ -1 +1,14 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + Dir[File.dirname(__FILE__) + "/core_ext/*.rb"].each { |file| require(file) } diff --git a/lib/redmine/core_ext/string.rb b/lib/redmine/core_ext/string.rb index 2da5ffef..b9d90b4d 100644 --- a/lib/redmine/core_ext/string.rb +++ b/lib/redmine/core_ext/string.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + require File.dirname(__FILE__) + '/string/conversions' require File.dirname(__FILE__) + '/string/inflections' diff --git a/lib/redmine/core_ext/string/conversions.rb b/lib/redmine/core_ext/string/conversions.rb index 0d1d32f5..19256020 100644 --- a/lib/redmine/core_ext/string/conversions.rb +++ b/lib/redmine/core_ext/string/conversions.rb @@ -1,19 +1,15 @@ -# redMine - project management software -# Copyright (C) 2008 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ module Redmine #:nodoc: module CoreExtensions #:nodoc: @@ -36,7 +32,7 @@ module Redmine #:nodoc: s.gsub!(',', '.') begin; Kernel.Float(s); rescue; nil; end end - + # Object#to_a removed in ruby1.9 if RUBY_VERSION > '1.9' def to_a diff --git a/lib/redmine/core_ext/string/inflections.rb b/lib/redmine/core_ext/string/inflections.rb index a59f268f..7d574ff9 100644 --- a/lib/redmine/core_ext/string/inflections.rb +++ b/lib/redmine/core_ext/string/inflections.rb @@ -1,19 +1,15 @@ -# Redmine - project management software -# Copyright (C) 2009 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ module Redmine #:nodoc: module CoreExtensions #:nodoc: diff --git a/lib/redmine/custom_field_format.rb b/lib/redmine/custom_field_format.rb index 2f12397d..ee4c7bd2 100644 --- a/lib/redmine/custom_field_format.rb +++ b/lib/redmine/custom_field_format.rb @@ -1,19 +1,15 @@ -# Redmine - project management software -# Copyright (C) 2006-2009 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ module Redmine class CustomFieldFormat @@ -22,12 +18,14 @@ module Redmine cattr_accessor :available @@available = {} - attr_accessor :name, :order, :label + attr_accessor :name, :order, :label, :edit_as, :class_names def initialize(name, options={}) self.name = name self.label = options[:label] self.order = options[:order] + self.edit_as = options[:edit_as] || name + self.class_names = options[:only] end def format(value) @@ -48,18 +46,17 @@ module Redmine } end - # Allow displaying the edit type of another field_format - # - # Example: display a custom field as a list - def edit_as - name + ['user', 'version'].each do |name| + define_method("format_as_#{name}") {|value| + return value.blank? ? "" : name.classify.constantize.find_by_id(value.to_i).to_s + } end class << self def map(&block) yield self end - + # Registers a custom field format def register(custom_field_format, options={}) @@available[custom_field_format.name] = custom_field_format unless @@available.keys.include?(custom_field_format.name) @@ -79,8 +76,10 @@ module Redmine end # Return an array of custom field formats which can be used in select_tag - def as_select - @@available.values.sort {|a,b| + def as_select(class_name=nil) + fields = @@available.values + fields = fields.select {|field| field.class_names.nil? || field.class_names.include?(class_name)} + fields.sort {|a,b| a.order <=> b.order }.collect {|custom_field_format| [ l(custom_field_format.label), custom_field_format.name ] @@ -97,5 +96,5 @@ module Redmine end end end - end + end end diff --git a/lib/redmine/default_data/loader.rb b/lib/redmine/default_data/loader.rb index 424b0e4e..a278ce5c 100644 --- a/lib/redmine/default_data/loader.rb +++ b/lib/redmine/default_data/loader.rb @@ -1,19 +1,15 @@ -# redMine - project management software -# Copyright (C) 2006-2007 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ module Redmine module DefaultData @@ -21,7 +17,7 @@ module Redmine module Loader include Redmine::I18n - + class << self # Returns true if no data is already loaded in the database # otherwise false @@ -31,23 +27,23 @@ module Redmine !IssueStatus.find(:first) && !Enumeration.find(:first) end - + # Loads the default data # Raises a RecordNotSaved exception if something goes wrong def load(lang=nil) raise DataAlreadyLoaded.new("Some configuration data is already loaded.") unless no_data? set_language_if_valid(lang) - + Role.transaction do # Roles - manager = Role.create! :name => l(:default_role_manager), + manager = Role.create! :name => l(:default_role_manager), :position => 1 manager.permissions = manager.setable_permissions.collect {|p| p.name} manager.save! - - developer = Role.create! :name => l(:default_role_developer), - :position => 2, - :permissions => [:manage_versions, + + developer = Role.create! :name => l(:default_role_developer), + :position => 2, + :permissions => [:manage_versions, :manage_categories, :view_issues, :add_issues, @@ -73,7 +69,7 @@ module Redmine :browse_repository, :view_changesets, :commit_access] - + reporter = Role.create! :name => l(:default_role_reporter), :position => 3, :permissions => [:view_issues, @@ -93,7 +89,7 @@ module Redmine :view_files, :browse_repository, :view_changesets] - + Role.non_member.update_attributes :name => l(:default_role_non_member), :permissions => [:view_issues, :add_issues, @@ -110,7 +106,7 @@ module Redmine :view_files, :browse_repository, :view_changesets] - + Role.anonymous.update_attributes :name => l(:default_role_anonymous), :permissions => [:view_issues, :view_gantt, @@ -122,12 +118,12 @@ module Redmine :view_files, :browse_repository, :view_changesets] - + # Trackers Tracker.create!(:name => l(:default_tracker_bug), :is_in_chlog => true, :is_in_roadmap => false, :position => 1) Tracker.create!(:name => l(:default_tracker_feature), :is_in_chlog => true, :is_in_roadmap => true, :position => 2) Tracker.create!(:name => l(:default_tracker_support), :is_in_chlog => false, :is_in_roadmap => false, :position => 3) - + # Issue statuses new = IssueStatus.create!(:name => l(:default_issue_status_new), :is_closed => false, :is_default => true, :position => 1) in_progress = IssueStatus.create!(:name => l(:default_issue_status_in_progress), :is_closed => false, :is_default => false, :position => 2) @@ -135,43 +131,43 @@ module Redmine feedback = IssueStatus.create!(:name => l(:default_issue_status_feedback), :is_closed => false, :is_default => false, :position => 4) closed = IssueStatus.create!(:name => l(:default_issue_status_closed), :is_closed => true, :is_default => false, :position => 5) rejected = IssueStatus.create!(:name => l(:default_issue_status_rejected), :is_closed => true, :is_default => false, :position => 6) - + # Workflow Tracker.find(:all).each { |t| IssueStatus.find(:all).each { |os| IssueStatus.find(:all).each { |ns| Workflow.create!(:tracker_id => t.id, :role_id => manager.id, :old_status_id => os.id, :new_status_id => ns.id) unless os == ns - } - } + } + } } - + Tracker.find(:all).each { |t| [new, in_progress, resolved, feedback].each { |os| [in_progress, resolved, feedback, closed].each { |ns| Workflow.create!(:tracker_id => t.id, :role_id => developer.id, :old_status_id => os.id, :new_status_id => ns.id) unless os == ns - } - } + } + } } - + Tracker.find(:all).each { |t| [new, in_progress, resolved, feedback].each { |os| [closed].each { |ns| Workflow.create!(:tracker_id => t.id, :role_id => reporter.id, :old_status_id => os.id, :new_status_id => ns.id) unless os == ns - } + } } Workflow.create!(:tracker_id => t.id, :role_id => reporter.id, :old_status_id => resolved.id, :new_status_id => feedback.id) } - + # Enumerations DocumentCategory.create!(:name => l(:default_doc_category_user), :position => 1) DocumentCategory.create!(:name => l(:default_doc_category_tech), :position => 2) - + IssuePriority.create!(:name => l(:default_priority_low), :position => 1) IssuePriority.create!(:name => l(:default_priority_normal), :position => 2, :is_default => true) IssuePriority.create!(:name => l(:default_priority_high), :position => 3) IssuePriority.create!(:name => l(:default_priority_urgent), :position => 4) IssuePriority.create!(:name => l(:default_priority_immediate), :position => 5) - + TimeEntryActivity.create!(:name => l(:default_activity_design), :position => 1) TimeEntryActivity.create!(:name => l(:default_activity_development), :position => 2) end diff --git a/lib/redmine/export/pdf.rb b/lib/redmine/export/pdf.rb index 85b51cd0..4e6a3b21 100644 --- a/lib/redmine/export/pdf.rb +++ b/lib/redmine/export/pdf.rb @@ -1,36 +1,85 @@ # encoding: utf-8 +#-- copyright +# ChiliProject is a project management system. # -# Redmine - project management software -# Copyright (C) 2006-2009 Jean-Philippe Lang +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ require 'iconv' require 'rfpdf/fpdf' -require 'rfpdf/chinese' +require 'fpdf/chinese' +require 'fpdf/japanese' +require 'fpdf/korean' module Redmine module Export module PDF include ActionView::Helpers::TextHelper include ActionView::Helpers::NumberHelper - + + class ITCPDF < TCPDF + include Redmine::I18n + attr_accessor :footer_date + + def initialize(lang) + super() + set_language_if_valid lang + @font_for_content = 'FreeSans' + @font_for_footer = 'FreeSans' + SetCreator(Redmine::Info.app_name) + SetFont(@font_for_content) + end + + def SetFontStyle(style, size) + SetFont(@font_for_content, style, size) + end + + def SetTitle(txt) + txt = begin + utf16txt = Iconv.conv('UTF-16BE', 'UTF-8', txt) + hextxt = "" + rescue + txt + end || '' + super(txt) + end + + def textstring(s) + # Format a text string + if s =~ /^ space_left @@ -212,34 +270,34 @@ module Redmine base_x = pdf.GetX base_y = pdf.GetY end - + # write the cells on page pdf.Cell(col_id_width, row_height, issue.id.to_s, "T", 0, 'C', 1) issues_to_pdf_write_cells(pdf, col_values, col_width, row_height) issues_to_pdf_draw_borders(pdf, base_x, base_y, base_y + max_height, col_id_width, col_width) pdf.SetY(base_y + max_height); end - + if issues.size == Setting.issues_export_limit.to_i pdf.SetFontStyle('B',10) - pdf.Cell(0, row_height, '...') + pdf.RDMCell(0, row_height, '...') end pdf.Output end - + # Renders MultiCells and returns the maximum height used def issues_to_pdf_write_cells(pdf, col_values, col_widths, row_height) base_y = pdf.GetY max_height = row_height col_values.each_with_index do |column, i| col_x = pdf.GetX - pdf.MultiCell(col_widths[i], row_height, col_values[i], "T", 'L', 1) + pdf.RDMMultiCell(col_widths[i], row_height, col_values[i], "T", 'L', 1) max_height = (pdf.GetY - base_y) if (pdf.GetY - base_y) > max_height pdf.SetXY(col_x + col_widths[i], base_y); end return max_height end - + # Draw lines to close the row (MultiCell border drawing in not uniform) def issues_to_pdf_draw_borders(pdf, top_x, top_y, lower_y, id_width, col_widths) col_x = top_x + id_width @@ -251,127 +309,131 @@ module Redmine pdf.Line(top_x, top_y, top_x, lower_y) # left border pdf.Line(top_x, lower_y, col_x, lower_y) # bottom border end - + # Returns a PDF string of a single issue def issue_to_pdf(issue) - pdf = IFPDF.new(current_language) + if ( current_language.to_s.downcase == 'ko' || + current_language.to_s.downcase == 'ja' || + current_language.to_s.downcase == 'zh' || + current_language.to_s.downcase == 'zh-tw' || + current_language.to_s.downcase == 'th' ) + pdf = IFPDF.new(current_language) + else + pdf = ITCPDF.new(current_language) + end pdf.SetTitle("#{issue.project} - ##{issue.tracker} #{issue.id}") - pdf.AliasNbPages + pdf.alias_nb_pages pdf.footer_date = format_date(Date.today) pdf.AddPage - - pdf.SetFontStyle('B',11) - pdf.MultiCell(190,5, "#{issue.project} - #{issue.tracker} # #{issue.id}: #{issue.subject}") + + pdf.SetFontStyle('B',11) + pdf.RDMMultiCell(190,5, "#{issue.project} - #{issue.tracker} # #{issue.id}: #{issue.subject}") pdf.Ln - + y0 = pdf.GetY - + pdf.SetFontStyle('B',9) - pdf.Cell(35,5, l(:field_status) + ":","LT") + pdf.RDMCell(35,5, l(:field_status) + ":","LT") pdf.SetFontStyle('',9) - pdf.Cell(60,5, issue.status.to_s,"RT") + pdf.RDMCell(60,5, issue.status.to_s,"RT") pdf.SetFontStyle('B',9) - pdf.Cell(35,5, l(:field_priority) + ":","LT") + pdf.RDMCell(35,5, l(:field_priority) + ":","LT") pdf.SetFontStyle('',9) - pdf.Cell(60,5, issue.priority.to_s,"RT") + pdf.RDMCell(60,5, issue.priority.to_s,"RT") pdf.Ln - + pdf.SetFontStyle('B',9) - pdf.Cell(35,5, l(:field_author) + ":","L") + pdf.RDMCell(35,5, l(:field_author) + ":","L") pdf.SetFontStyle('',9) - pdf.Cell(60,5, issue.author.to_s,"R") + pdf.RDMCell(60,5, issue.author.to_s,"R") pdf.SetFontStyle('B',9) - pdf.Cell(35,5, l(:field_category) + ":","L") + pdf.RDMCell(35,5, l(:field_category) + ":","L") pdf.SetFontStyle('',9) - pdf.Cell(60,5, issue.category.to_s,"R") - pdf.Ln - - pdf.SetFontStyle('B',9) - pdf.Cell(35,5, l(:field_created_on) + ":","L") - pdf.SetFontStyle('',9) - pdf.Cell(60,5, format_date(issue.created_on),"R") - pdf.SetFontStyle('B',9) - pdf.Cell(35,5, l(:field_assigned_to) + ":","L") - pdf.SetFontStyle('',9) - pdf.Cell(60,5, issue.assigned_to.to_s,"R") + pdf.RDMCell(60,5, issue.category.to_s,"R") pdf.Ln - + pdf.SetFontStyle('B',9) - pdf.Cell(35,5, l(:field_updated_on) + ":","LB") + pdf.RDMCell(35,5, l(:field_created_on) + ":","L") pdf.SetFontStyle('',9) - pdf.Cell(60,5, format_date(issue.updated_on),"RB") + pdf.RDMCell(60,5, format_date(issue.created_on),"R") pdf.SetFontStyle('B',9) - pdf.Cell(35,5, l(:field_due_date) + ":","LB") + pdf.RDMCell(35,5, l(:field_assigned_to) + ":","L") pdf.SetFontStyle('',9) - pdf.Cell(60,5, format_date(issue.due_date),"RB") + pdf.RDMCell(60,5, issue.assigned_to.to_s,"R") pdf.Ln - + + pdf.SetFontStyle('B',9) + pdf.RDMCell(35,5, l(:field_updated_on) + ":","LB") + pdf.SetFontStyle('',9) + pdf.RDMCell(60,5, format_date(issue.updated_on),"RB") + pdf.SetFontStyle('B',9) + pdf.RDMCell(35,5, l(:field_due_date) + ":","LB") + pdf.SetFontStyle('',9) + pdf.RDMCell(60,5, format_date(issue.due_date),"RB") + pdf.Ln + for custom_value in issue.custom_field_values pdf.SetFontStyle('B',9) - pdf.Cell(35,5, custom_value.custom_field.name + ":","L") + pdf.RDMCell(35,5, custom_value.custom_field.name + ":","L") pdf.SetFontStyle('',9) - pdf.MultiCell(155,5, (show_value custom_value),"R") + pdf.RDMMultiCell(155,5, (show_value custom_value),"R") end - + pdf.SetFontStyle('B',9) - pdf.Cell(35,5, l(:field_subject) + ":","LT") + pdf.RDMCell(35,5, l(:field_description) + ":") pdf.SetFontStyle('',9) - pdf.MultiCell(155,5, issue.subject,"RT") - - pdf.SetFontStyle('B',9) - pdf.Cell(35,5, l(:field_description) + ":","LT") - pdf.SetFontStyle('',9) - pdf.MultiCell(155,5, issue.description.to_s,"RT") - + pdf.RDMMultiCell(155,5, issue.description.to_s,"BR") + pdf.Line(pdf.GetX, y0, pdf.GetX, pdf.GetY) pdf.Line(pdf.GetX, pdf.GetY, pdf.GetX + 190, pdf.GetY) pdf.Ln - + if issue.changesets.any? && User.current.allowed_to?(:view_changesets, issue.project) pdf.SetFontStyle('B',9) - pdf.Cell(190,5, l(:label_associated_revisions), "B") + pdf.RDMCell(190,5, l(:label_associated_revisions), "B") pdf.Ln for changeset in issue.changesets pdf.SetFontStyle('B',8) - pdf.Cell(190,5, format_time(changeset.committed_on) + " - " + changeset.author.to_s) + pdf.RDMCell(190,5, format_time(changeset.committed_on) + " - " + changeset.author.to_s) pdf.Ln unless changeset.comments.blank? pdf.SetFontStyle('',8) - pdf.MultiCell(190,5, changeset.comments.to_s) - end + pdf.RDMMultiCell(190,5, changeset.comments.to_s) + end pdf.Ln end end - + pdf.SetFontStyle('B',9) - pdf.Cell(190,5, l(:label_history), "B") - pdf.Ln - for journal in issue.journals.find(:all, :include => [:user, :details], :order => "#{Journal.table_name}.created_on ASC") + pdf.RDMCell(190,5, l(:label_history), "B") + pdf.Ln + for journal in issue.journals.find(:all, :include => [:user], :order => "#{Journal.table_name}.created_at ASC") pdf.SetFontStyle('B',8) - pdf.Cell(190,5, format_time(journal.created_on) + " - " + journal.user.name) + pdf.RDMCell(190,5, format_time(journal.created_at) + " - " + journal.user.name) pdf.Ln pdf.SetFontStyle('I',8) for detail in journal.details - pdf.MultiCell(190,5, "- " + show_detail(detail, true)) + pdf.RDMMultiCell(190,5, "- " + journal.render_detail(detail, true)) + pdf.Ln end if journal.notes? pdf.Ln unless journal.details.empty? pdf.SetFontStyle('',8) - pdf.MultiCell(190,5, journal.notes.to_s) - end + pdf.RDMMultiCell(190,5, journal.notes.to_s) + end pdf.Ln end - + if issue.attachments.any? pdf.SetFontStyle('B',9) - pdf.Cell(190,5, l(:label_attachment_plural), "B") + pdf.RDMCell(190,5, l(:label_attachment_plural), "B") pdf.Ln for attachment in issue.attachments pdf.SetFontStyle('',8) - pdf.Cell(80,5, attachment.filename) - pdf.Cell(20,5, number_to_human_size(attachment.filesize),0,0,"R") - pdf.Cell(25,5, format_date(attachment.created_on),0,0,"R") - pdf.Cell(65,5, attachment.author.name,0,0,"R") + pdf.RDMCell(80,5, attachment.filename) + pdf.RDMCell(20,5, number_to_human_size(attachment.filesize),0,0,"R") + pdf.RDMCell(25,5, format_date(attachment.created_on),0,0,"R") + pdf.RDMCell(65,5, attachment.author.name,0,0,"R") pdf.Ln end end diff --git a/lib/redmine/helpers/calendar.rb b/lib/redmine/helpers/calendar.rb index ec474025..2a06ff3b 100644 --- a/lib/redmine/helpers/calendar.rb +++ b/lib/redmine/helpers/calendar.rb @@ -1,34 +1,30 @@ -# redMine - project management software -# Copyright (C) 2006-2007 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ module Redmine module Helpers - + # Simple class to compute the start and end dates of a calendar class Calendar include Redmine::I18n attr_reader :startdt, :enddt - + def initialize(date, lang = current_language, period = :month) @date = date @events = [] @ending_events_by_days = {} @starting_events_by_days = {} - set_language_if_valid lang + set_language_if_valid lang case period when :month @startdt = Date.civil(date.year, date.month, 1) @@ -44,40 +40,42 @@ module Redmine raise 'Invalid period' end end - + # Sets calendar events def events=(events) @events = events @ending_events_by_days = @events.group_by {|event| event.due_date} @starting_events_by_days = @events.group_by {|event| event.start_date} end - + # Returns events for the given day def events_on(day) ((@ending_events_by_days[day] || []) + (@starting_events_by_days[day] || [])).uniq end - + # Calendar current month def month @date.month end - + # Return the first day of week # 1 = Monday ... 7 = Sunday def first_wday case Setting.start_of_week.to_i when 1 @first_dow ||= (1 - 1)%7 + 1 + when 6 + @first_dow ||= (6 - 1)%7 + 1 when 7 @first_dow ||= (7 - 1)%7 + 1 else @first_dow ||= (l(:general_first_day_of_week).to_i - 1)%7 + 1 end end - + def last_wday @last_dow ||= (first_wday + 5)%7 + 1 end - end + end end end diff --git a/lib/redmine/helpers/diff.rb b/lib/redmine/helpers/diff.rb new file mode 100644 index 00000000..65ec46bd --- /dev/null +++ b/lib/redmine/helpers/diff.rb @@ -0,0 +1,68 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + +module Redmine + module Helpers + class Diff + include ERB::Util + include ActionView::Helpers::TagHelper + include ActionView::Helpers::TextHelper + attr_reader :diff, :words + + def initialize(content_to, content_from) + @words = content_to.to_s.split(/(\s+)/) + @words = @words.select {|word| word != ' '} + words_from = content_from.to_s.split(/(\s+)/) + words_from = words_from.select {|word| word != ' '} + @diff = words_from.diff @words + end + + def to_html + words = self.words.collect{|word| h(word)} + words_add = 0 + words_del = 0 + dels = 0 + del_off = 0 + diff.diffs.each do |diff| + add_at = nil + add_to = nil + del_at = nil + deleted = "" + diff.each do |change| + pos = change[1] + if change[0] == "+" + add_at = pos + dels unless add_at + add_to = pos + dels + words_add += 1 + else + del_at = pos unless del_at + deleted << ' ' + h(change[2]) + words_del += 1 + end + end + if add_at + words[add_at] = '' + words[add_at] + words[add_to] = words[add_to] + '' + end + if del_at + words.insert del_at - del_off + dels + words_add, '' + deleted + '' + dels += 1 + del_off += words_del + words_del = 0 + end + end + words.join(' ') + end + end + end +end diff --git a/lib/redmine/helpers/gantt.rb b/lib/redmine/helpers/gantt.rb index b68534b2..a10a5824 100644 --- a/lib/redmine/helpers/gantt.rb +++ b/lib/redmine/helpers/gantt.rb @@ -1,19 +1,15 @@ -# Redmine - project management software -# Copyright (C) 2006-2008 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ module Redmine module Helpers @@ -38,10 +34,10 @@ module Redmine attr_accessor :query attr_accessor :project attr_accessor :view - + def initialize(options={}) options = options.dup - + if options[:year] && options[:year].to_i >0 @year_from = options[:year].to_i if options[:month] && options[:month].to_i >=1 && options[:month].to_i <= 12 @@ -53,27 +49,27 @@ module Redmine @month_from ||= Date.today.month @year_from ||= Date.today.year end - + zoom = (options[:zoom] || User.current.pref[:gantt_zoom]).to_i - @zoom = (zoom > 0 && zoom < 5) ? zoom : 2 + @zoom = (zoom > 0 && zoom < 5) ? zoom : 2 months = (options[:months] || User.current.pref[:gantt_months]).to_i @months = (months > 0 && months < 25) ? months : 6 - + # Save gantt parameters as user preference (zoom and months count) if (User.current.logged? && (@zoom != User.current.pref[:gantt_zoom] || @months != User.current.pref[:gantt_months])) User.current.pref[:gantt_zoom], User.current.pref[:gantt_months] = @zoom, @months User.current.preference.save end - + @date_from = Date.civil(@year_from, @month_from, 1) @date_to = (@date_from >> @months) - 1 - + @subjects = '' @lines = '' @number_of_rows = nil - + @issue_ancestors = [] - + @truncated = false if options.has_key?(:max_rows) @max_rows = options[:max_rows] @@ -85,31 +81,24 @@ module Redmine def common_params { :controller => 'gantts', :action => 'show', :project_id => @project } end - + def params common_params.merge({ :zoom => zoom, :year => year_from, :month => month_from, :months => months }) end - + def params_previous common_params.merge({:year => (date_from << months).year, :month => (date_from << months).month, :zoom => zoom, :months => months }) end - + def params_next common_params.merge({:year => (date_from >> months).year, :month => (date_from >> months).month, :zoom => zoom, :months => months }) end - ### Extracted from the HTML view/helpers # Returns the number of rows that will be rendered on the Gantt chart def number_of_rows return @number_of_rows if @number_of_rows - - rows = if @project - number_of_rows_on_project(@project) - else - Project.roots.visible.has_module('issue_tracking').inject(0) do |total, project| - total += number_of_rows_on_project(project) - end - end + + rows = projects.inject(0) {|total, p| total += number_of_rows_on_project(p)} if @max_rows.present? rows > @max_rows ? @max_rows : rows @@ -121,29 +110,10 @@ module Redmine # Returns the number of rows that will be used to list a project on # the Gantt chart. This will recurse for each subproject. def number_of_rows_on_project(project) - # Remove the project requirement for Versions because it will - # restrict issues to only be on the current project. This - # ends up missing issues which are assigned to shared versions. - @query.project = nil if @query.project - - # One Root project + return 0 unless projects.include?(project) count = 1 - # Issues without a Version - count += project.issues.for_gantt.without_version.with_query(@query).count - - # Versions - count += project.versions.count - - # Issues on the Versions - project.versions.each do |version| - count += version.fixed_issues.for_gantt.with_query(@query).count - end - - # Subprojects - project.children.visible.has_module('issue_tracking').each do |subproject| - count += number_of_rows_on_project(subproject) - end - + count += project_issues(project).size + count += project_versions(project).size count end @@ -158,96 +128,119 @@ module Redmine render(options.merge(:only => :lines)) unless @lines_rendered @lines end - + + # Returns issues that will be rendered + def issues + @issues ||= @query.issues( + :include => [:assigned_to, :tracker, :priority, :category, :fixed_version], + :order => "#{Project.table_name}.lft ASC, #{Issue.table_name}.id ASC", + :limit => @max_rows + ) + end + + # Return all the project nodes that will be displayed + def projects + return @projects if @projects + + ids = issues.collect(&:project).uniq.collect(&:id) + if ids.any? + # All issues projects and their visible ancestors + @projects = Project.visible.all( + :joins => "LEFT JOIN #{Project.table_name} child ON #{Project.table_name}.lft <= child.lft AND #{Project.table_name}.rgt >= child.rgt", + :conditions => ["child.id IN (?)", ids], + :order => "#{Project.table_name}.lft ASC" + ).uniq + else + @projects = [] + end + end + + # Returns the issues that belong to +project+ + def project_issues(project) + @issues_by_project ||= issues.group_by(&:project) + @issues_by_project[project] || [] + end + + # Returns the distinct versions of the issues that belong to +project+ + def project_versions(project) + project_issues(project).collect(&:fixed_version).compact.uniq + end + + # Returns the issues that belong to +project+ and are assigned to +version+ + def version_issues(project, version) + project_issues(project).select {|issue| issue.fixed_version == version} + end + def render(options={}) - options = {:indent => 4, :render => :subject, :format => :html}.merge(options) - + options = {:top => 0, :top_increment => 20, :indent_increment => 20, :render => :subject, :format => :html}.merge(options) + indent = options[:indent] || 4 + @subjects = '' unless options[:only] == :lines @lines = '' unless options[:only] == :subjects @number_of_rows = 0 - - if @project - render_project(@project, options) - else - Project.roots.visible.has_module('issue_tracking').each do |project| - render_project(project, options) - break if abort? - end + + Project.project_tree(projects) do |project, level| + options[:indent] = indent + level * options[:indent_increment] + render_project(project, options) + break if abort? end - + @subjects_rendered = true unless options[:only] == :lines @lines_rendered = true unless options[:only] == :subjects - + render_end(options) end def render_project(project, options={}) - options[:top] = 0 unless options.key? :top - options[:indent_increment] = 20 unless options.key? :indent_increment - options[:top_increment] = 20 unless options.key? :top_increment - subject_for_project(project, options) unless options[:only] == :lines line_for_project(project, options) unless options[:only] == :subjects - + options[:top] += options[:top_increment] options[:indent] += options[:indent_increment] @number_of_rows += 1 return if abort? - - # Second, Issues without a version - issues = project.issues.for_gantt.without_version.with_query(@query).all(:limit => current_limit) + + issues = project_issues(project).select {|i| i.fixed_version.nil?} sort_issues!(issues) if issues render_issues(issues, options) return if abort? end - # Third, Versions - project.versions.sort.each do |version| - render_version(version, options) - return if abort? + versions = project_versions(project) + versions.each do |version| + render_version(project, version, options) end - # Fourth, subprojects - project.children.visible.has_module('issue_tracking').each do |project| - render_project(project, options) - return if abort? - end unless project.leaf? - # Remove indent to hit the next sibling options[:indent] -= options[:indent_increment] end def render_issues(issues, options={}) @issue_ancestors = [] - + issues.each do |i| subject_for_issue(i, options) unless options[:only] == :lines line_for_issue(i, options) unless options[:only] == :subjects - + options[:top] += options[:top_increment] @number_of_rows += 1 break if abort? end - + options[:indent] -= (options[:indent_increment] * @issue_ancestors.size) end - def render_version(version, options={}) + def render_version(project, version, options={}) # Version header subject_for_version(version, options) unless options[:only] == :lines line_for_version(version, options) unless options[:only] == :subjects - + options[:top] += options[:top_increment] @number_of_rows += 1 return if abort? - - # Remove the project requirement for Versions because it will - # restrict issues to only be on the current project. This - # ends up missing issues which are assigned to shared versions. - @query.project = nil if @query.project - - issues = version.fixed_issues.for_gantt.with_query(@query).all(:limit => current_limit) + + issues = version_issues(project, version) if issues sort_issues!(issues) # Indent issues @@ -256,10 +249,10 @@ module Redmine options[:indent] -= options[:indent_increment] end end - + def render_end(options={}) case options[:format] - when :pdf + when :pdf options[:pdf].Line(15, options[:top], PDF::TotalWidth, options[:top]) end end @@ -284,10 +277,10 @@ module Redmine if project.is_a?(Project) && project.start_date && project.due_date options[:zoom] ||= 1 options[:g_width] ||= (self.date_to - self.date_from + 1) * options[:zoom] - + coords = coordinates(project.start_date, project.due_date, nil, options[:zoom]) label = h(project) - + case options[:format] when :html html_task(options, coords, :css => "project task", :label => label, :markers => true) @@ -322,7 +315,7 @@ module Redmine if version.is_a?(Version) && version.start_date && version.due_date options[:zoom] ||= 1 options[:g_width] ||= (self.date_to - self.date_from + 1) * options[:zoom] - + coords = coordinates(version.start_date, version.due_date, version.completed_pourcent, options[:zoom]) label = "#{h version } #{h version.completed_pourcent.to_i.to_s}%" label = h("#{version.project} -") + label unless @project && @project == version.project @@ -346,22 +339,22 @@ module Redmine @issue_ancestors.pop options[:indent] -= options[:indent_increment] end - + output = case options[:format] when :html css_classes = '' css_classes << ' issue-overdue' if issue.overdue? css_classes << ' issue-behind-schedule' if issue.behind_schedule? css_classes << ' icon icon-issue' unless Setting.gravatar_enabled? && issue.assigned_to - + subject = "" if issue.assigned_to.present? assigned_string = l(:field_assigned_to) + ": " + issue.assigned_to.name - subject << view.avatar(issue.assigned_to, :class => 'gravatar icon-gravatar', :size => 10, :title => assigned_string) + subject << view.avatar(issue.assigned_to, :class => 'gravatar icon-gravatar', :size => 10, :title => assigned_string).to_s end subject << view.link_to_issue(issue) subject << '' - html_subject(options, subject, :css => "issue-subject") + "\n" + html_subject(options, subject, :css => "issue-subject", :title => issue.subject) + "\n" when :image image_subject(options, issue.subject) when :pdf @@ -373,7 +366,7 @@ module Redmine @issue_ancestors << issue options[:indent] += options[:indent_increment] end - + output end @@ -382,7 +375,7 @@ module Redmine if issue.is_a?(Issue) && issue.due_before coords = coordinates(issue.start_date, issue.due_before, issue.done_ratio, options[:zoom]) label = "#{ issue.status.name } #{ issue.done_ratio }%" - + case options[:format] when :html html_task(options, coords, :css => "task " + (issue.leaf? ? 'leaf' : 'parent'), :label => label, :issue => issue, :markers => !issue.leaf?) @@ -400,10 +393,10 @@ module Redmine # Generates a gantt image # Only defined if RMagick is avalaible def to_image(format='PNG') - date_to = (@date_from >> @months)-1 + date_to = (@date_from >> @months)-1 show_weeks = @zoom > 1 show_days = @zoom > 2 - + subject_width = 400 header_heigth = 18 # width of one day in pixels @@ -412,19 +405,19 @@ module Redmine g_height = 20 * number_of_rows + 30 headers_heigth = (show_weeks ? 2*header_heigth : header_heigth) height = g_height + headers_heigth - + imgl = Magick::ImageList.new imgl.new_image(subject_width+g_width+1, height) gc = Magick::Draw.new - + # Subjects gc.stroke('transparent') subjects(:image => gc, :top => (headers_heigth + 20), :indent => 4, :format => :image) - + # Months headers month_f = @date_from left = subject_width - @months.times do + @months.times do width = ((month_f >> 1) - month_f) * zoom gc.fill('white') gc.stroke('grey') @@ -437,7 +430,7 @@ module Redmine left = left + width month_f = month_f >> 1 end - + # Weeks headers if show_weeks left = subject_width @@ -469,13 +462,13 @@ module Redmine week_f = week_f+7 end end - + # Days details (week-end in grey) if show_days left = subject_width height = g_height + header_heigth - 1 wday = @date_from.cwday - (date_to - @date_from + 1).to_i.times do + (date_to - @date_from + 1).to_i.times do width = zoom gc.fill(wday == 6 || wday == 7 ? '#eee' : 'white') gc.stroke('#ddd') @@ -486,7 +479,7 @@ module Redmine wday = 1 if wday > 7 end end - + # border gc.fill('transparent') gc.stroke('grey') @@ -494,44 +487,52 @@ module Redmine gc.rectangle(0, 0, subject_width+g_width, headers_heigth) gc.stroke('black') gc.rectangle(0, 0, subject_width+g_width, g_height+ headers_heigth-1) - + # content top = headers_heigth + 20 gc.stroke('transparent') lines(:image => gc, :top => top, :zoom => zoom, :subject_width => subject_width, :format => :image) - + # today red line if Date.today >= @date_from and Date.today <= date_to gc.stroke('red') x = (Date.today-@date_from+1)*zoom + subject_width - gc.line(x, headers_heigth, x, headers_heigth + g_height-1) - end - + gc.line(x, headers_heigth, x, headers_heigth + g_height-1) + end + gc.draw(imgl) imgl.format = format imgl.to_blob end if Object.const_defined?(:Magick) def to_pdf - pdf = ::Redmine::Export::PDF::IFPDF.new(current_language) + if ( current_language.to_s.downcase == 'ko' || + current_language.to_s.downcase == 'ja' || + current_language.to_s.downcase == 'zh' || + current_language.to_s.downcase == 'zh-tw' || + current_language.to_s.downcase == 'th' ) + pdf = ::Redmine::Export::PDF::IFPDF.new(current_language) + else + pdf = ::Redmine::Export::PDF::ITCPDF.new(current_language) + end pdf.SetTitle("#{l(:label_gantt)} #{project}") - pdf.AliasNbPages + pdf.alias_nb_pages pdf.footer_date = format_date(Date.today) pdf.AddPage("L") pdf.SetFontStyle('B',12) pdf.SetX(15) - pdf.Cell(PDF::LeftPaneWidth, 20, project.to_s) + pdf.RDMCell(PDF::LeftPaneWidth, 20, project.to_s) pdf.Ln pdf.SetFontStyle('B',9) - + subject_width = PDF::LeftPaneWidth header_heigth = 5 - + headers_heigth = header_heigth show_weeks = false show_days = false - + if self.months < 7 show_weeks = true headers_heigth = 2*header_heigth @@ -540,27 +541,27 @@ module Redmine headers_heigth = 3*header_heigth end end - + g_width = PDF.right_pane_width zoom = (g_width) / (self.date_to - self.date_from + 1) g_height = 120 t_height = g_height + headers_heigth - + y_start = pdf.GetY - + # Months headers month_f = self.date_from left = subject_width height = header_heigth - self.months.times do - width = ((month_f >> 1) - month_f) * zoom + self.months.times do + width = ((month_f >> 1) - month_f) * zoom pdf.SetY(y_start) pdf.SetX(left) - pdf.Cell(width, height, "#{month_f.year}-#{month_f.month}", "LTR", 0, "C") + pdf.RDMCell(width, height, "#{month_f.year}-#{month_f.month}", "LTR", 0, "C") left = left + width month_f = month_f >> 1 - end - + end + # Weeks headers if show_weeks left = subject_width @@ -574,40 +575,40 @@ module Redmine width = (7 - self.date_from.cwday + 1) * zoom-1 pdf.SetY(y_start + header_heigth) pdf.SetX(left) - pdf.Cell(width + 1, height, "", "LTR") + pdf.RDMCell(width + 1, height, "", "LTR") left = left + width+1 end while week_f <= self.date_to width = (week_f + 6 <= self.date_to) ? 7 * zoom : (self.date_to - week_f + 1) * zoom pdf.SetY(y_start + header_heigth) pdf.SetX(left) - pdf.Cell(width, height, (width >= 5 ? week_f.cweek.to_s : ""), "LTR", 0, "C") + pdf.RDMCell(width, height, (width >= 5 ? week_f.cweek.to_s : ""), "LTR", 0, "C") left = left + width week_f = week_f+7 end end - + # Days headers if show_days left = subject_width height = header_heigth wday = self.date_from.cwday pdf.SetFontStyle('B',7) - (self.date_to - self.date_from + 1).to_i.times do + (self.date_to - self.date_from + 1).to_i.times do width = zoom pdf.SetY(y_start + 2 * header_heigth) pdf.SetX(left) - pdf.Cell(width, height, day_name(wday).first, "LTR", 0, "C") + pdf.RDMCell(width, height, day_name(wday).first, "LTR", 0, "C") left = left + width wday = wday + 1 wday = 1 if wday > 7 end end - + pdf.SetY(y_start) pdf.SetX(15) - pdf.Cell(subject_width+g_width-15, headers_heigth, "", 1) - + pdf.RDMCell(subject_width+g_width-15, headers_heigth, "", 1) + # Tasks top = headers_heigth + y_start options = { @@ -624,12 +625,12 @@ module Redmine render(options) pdf.Output end - + private - + def coordinates(start_date, end_date, progress, zoom=nil) zoom ||= @zoom - + coords = {} if start_date && end_date && start_date < self.date_to && end_date > self.date_from if start_date > self.date_from @@ -644,17 +645,17 @@ module Redmine else coords[:bar_end] = self.date_to - self.date_from + 1 end - + if progress - progress_date = start_date + (end_date - start_date) * (progress / 100.0) + progress_date = start_date + (end_date - start_date + 1) * (progress / 100.0) if progress_date > self.date_from && progress_date > start_date if progress_date < self.date_to - coords[:bar_progress_end] = progress_date - self.date_from + 1 + coords[:bar_progress_end] = progress_date - self.date_from else coords[:bar_progress_end] = self.date_to - self.date_from + 1 end end - + if progress_date < Date.today late_date = [Date.today, end_date].min if late_date > self.date_from && late_date > start_date @@ -667,7 +668,7 @@ module Redmine end end end - + # Transforms dates into pixels witdh coords.keys.each do |key| coords[key] = (coords[key] * zoom).floor @@ -679,7 +680,7 @@ module Redmine def sort_issues!(issues) issues.sort! { |a, b| gantt_issue_compare(a, b, issues) } end - + # TODO: top level issues should be sorted by start date def gantt_issue_compare(x, y, issues) if x.root_id == y.root_id @@ -688,7 +689,7 @@ module Redmine x.root_id <=> y.root_id end end - + def current_limit if @max_rows @max_rows - @number_of_rows @@ -696,13 +697,13 @@ module Redmine nil end end - + def abort? if @max_rows && @number_of_rows >= @max_rows @truncated = true end end - + def pdf_new_page?(options) if options[:top] > 180 options[:pdf].Line(15, options[:top], PDF::TotalWidth, options[:top]) @@ -711,40 +712,41 @@ module Redmine options[:pdf].Line(15, options[:top] - 0.1, PDF::TotalWidth, options[:top] - 0.1) end end - + def html_subject(params, subject, options={}) - output = "
" - output << subject - output << "
" + style = "position: absolute;top:#{params[:top]}px;left:#{params[:indent]}px;" + style << "width:#{params[:subject_width] - params[:indent]}px;" if params[:subject_width] + + output = view.content_tag 'div', subject, :class => options[:css], :style => style, :title => options[:title] @subjects << output output end - + def pdf_subject(params, subject, options={}) params[:pdf].SetY(params[:top]) params[:pdf].SetX(15) - + char_limit = PDF::MaxCharactorsForSubject - params[:indent] - params[:pdf].Cell(params[:subject_width]-15, 5, (" " * params[:indent]) + subject.to_s.sub(/^(.{#{char_limit}}[^\s]*\s).*$/, '\1 (...)'), "LR") - + params[:pdf].RDMCell(params[:subject_width]-15, 5, (" " * params[:indent]) + subject.to_s.sub(/^(.{#{char_limit}}[^\s]*\s).*$/, '\1 (...)'), "LR") + params[:pdf].SetY(params[:top]) params[:pdf].SetX(params[:subject_width]) - params[:pdf].Cell(params[:g_width], 5, "", "LR") + params[:pdf].RDMCell(params[:g_width], 5, "", "LR") end - + def image_subject(params, subject, options={}) params[:image].fill('black') params[:image].stroke('transparent') params[:image].stroke_width(1) params[:image].text(params[:indent], params[:top] + 2, subject) end - + def html_task(params, coords, options={}) output = '' # Renders the task bar, with progress and late if coords[:bar_start] && coords[:bar_end] output << "
 
" - + if coords[:bar_late_end] output << "
 
" end @@ -777,28 +779,28 @@ module Redmine @lines << output output end - + def pdf_task(params, coords, options={}) height = options[:height] || 2 - + # Renders the task bar, with progress and late if coords[:bar_start] && coords[:bar_end] params[:pdf].SetY(params[:top]+1.5) params[:pdf].SetX(params[:subject_width] + coords[:bar_start]) params[:pdf].SetFillColor(200,200,200) - params[:pdf].Cell(coords[:bar_end] - coords[:bar_start], height, "", 0, 0, "", 1) - + params[:pdf].RDMCell(coords[:bar_end] - coords[:bar_start], height, "", 0, 0, "", 1) + if coords[:bar_late_end] params[:pdf].SetY(params[:top]+1.5) params[:pdf].SetX(params[:subject_width] + coords[:bar_start]) params[:pdf].SetFillColor(255,100,100) - params[:pdf].Cell(coords[:bar_late_end] - coords[:bar_start], height, "", 0, 0, "", 1) + params[:pdf].RDMCell(coords[:bar_late_end] - coords[:bar_start], height, "", 0, 0, "", 1) end if coords[:bar_progress_end] params[:pdf].SetY(params[:top]+1.5) params[:pdf].SetX(params[:subject_width] + coords[:bar_start]) params[:pdf].SetFillColor(90,200,90) - params[:pdf].Cell(coords[:bar_progress_end] - coords[:bar_start], height, "", 0, 0, "", 1) + params[:pdf].RDMCell(coords[:bar_progress_end] - coords[:bar_start], height, "", 0, 0, "", 1) end end # Renders the markers @@ -807,30 +809,30 @@ module Redmine params[:pdf].SetY(params[:top] + 1) params[:pdf].SetX(params[:subject_width] + coords[:start] - 1) params[:pdf].SetFillColor(50,50,200) - params[:pdf].Cell(2, 2, "", 0, 0, "", 1) + params[:pdf].RDMCell(2, 2, "", 0, 0, "", 1) end if coords[:end] params[:pdf].SetY(params[:top] + 1) params[:pdf].SetX(params[:subject_width] + coords[:end] - 1) params[:pdf].SetFillColor(50,50,200) - params[:pdf].Cell(2, 2, "", 0, 0, "", 1) + params[:pdf].RDMCell(2, 2, "", 0, 0, "", 1) end end # Renders the label on the right if options[:label] params[:pdf].SetX(params[:subject_width] + (coords[:bar_end] || 0) + 5) - params[:pdf].Cell(30, 2, options[:label]) + params[:pdf].RDMCell(30, 2, options[:label]) end end def image_task(params, coords, options={}) height = options[:height] || 6 - + # Renders the task bar, with progress and late if coords[:bar_start] && coords[:bar_end] params[:image].fill('#aaa') params[:image].rectangle(params[:subject_width] + coords[:bar_start], params[:top], params[:subject_width] + coords[:bar_end], params[:top] - height) - + if coords[:bar_late_end] params[:image].fill('#f66') params[:image].rectangle(params[:subject_width] + coords[:bar_start], params[:top], params[:subject_width] + coords[:bar_late_end], params[:top] - height) diff --git a/lib/redmine/hook.rb b/lib/redmine/hook.rb index 84c33e32..c5b92459 100644 --- a/lib/redmine/hook.rb +++ b/lib/redmine/hook.rb @@ -1,19 +1,15 @@ -# Redmine - project management software -# Copyright (C) 2006-2008 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ module Redmine module Hook @@ -22,7 +18,7 @@ module Redmine @@listener_classes = [] @@listeners = nil @@hook_listeners = {} - + class << self # Adds a listener class. # Automatically called when a class inherits from Redmine::Hook::Listener. @@ -31,29 +27,29 @@ module Redmine @@listener_classes << klass clear_listeners_instances end - + # Returns all the listerners instances. def listeners @@listeners ||= @@listener_classes.collect {|listener| listener.instance} end - + # Returns the listeners instances for the given hook. def hook_listeners(hook) @@hook_listeners[hook] ||= listeners.select {|listener| listener.respond_to?(hook)} end - + # Clears all the listeners. def clear_listeners @@listener_classes = [] clear_listeners_instances end - + # Clears all the listeners instances. def clear_listeners_instances @@listeners = nil @@hook_listeners = {} end - + # Calls a hook. # Returns the listeners response. def call_hook(hook, context={}) @@ -101,11 +97,11 @@ module Redmine def self.default_url_options {:only_path => true } end - + # Helper method to directly render a partial using the context: - # + # # class MyHook < Redmine::Hook::ViewListener - # render_on :view_issues_show_details_bottom, :partial => "show_more_data" + # render_on :view_issues_show_details_bottom, :partial => "show_more_data" # end # def self.render_on(hook, options={}) @@ -117,23 +113,23 @@ module Redmine # Helper module included in ApplicationHelper and ActionControllerso that # hooks can be called in views like this: - # + # # <%= call_hook(:some_hook) %> # <%= call_hook(:another_hook, :foo => 'bar' %> - # + # # Or in controllers like: # call_hook(:some_hook) # call_hook(:another_hook, :foo => 'bar' - # + # # Hooks added to views will be concatenated into a string. Hooks added to # controllers will return an array of results. # # Several objects are automatically added to the call context: - # + # # * project => current project # * request => Request instance # * controller => current Controller instance - # + # module Helper def call_hook(hook, context={}) if is_a?(ActionController::Base) @@ -142,7 +138,7 @@ module Redmine else default_context = {:controller => controller, :project => @project, :request => request} Redmine::Hook.call_hook(hook, default_context.merge(context)).join(' ') - end + end end end end diff --git a/lib/redmine/i18n.rb b/lib/redmine/i18n.rb index 1bfca81e..3b4dc4ff 100644 --- a/lib/redmine/i18n.rb +++ b/lib/redmine/i18n.rb @@ -1,9 +1,22 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + module Redmine module I18n def self.included(base) base.extend Redmine::I18n end - + def l(*args) case args.size when 1 @@ -25,12 +38,12 @@ module Redmine k = "#{options[:prefix]}#{s}".to_sym ::I18n.t(k, :default => s.to_s.humanize) end - + def l_hours(hours) hours = hours.to_f l((hours < 2.0 ? :label_f_hour : :label_f_hour_plural), :value => ("%.2f" % hours.to_f)) end - + def ll(lang, str, value=nil) ::I18n.t(str.to_s, :value => value, :locale => lang.to_s.gsub(%r{(.+)\-(.+)$}) { "#{$1}-#{$2.upcase}" }) end @@ -39,39 +52,39 @@ module Redmine return nil unless date Setting.date_format.blank? ? ::I18n.l(date.to_date) : date.strftime(Setting.date_format) end - + def format_time(time, include_date = true) return nil unless time time = time.to_time if time.is_a?(String) zone = User.current.time_zone local = zone ? time.in_time_zone(zone) : (time.utc? ? time.localtime : time) - Setting.time_format.blank? ? ::I18n.l(local, :format => (include_date ? :default : :time)) : - ((include_date ? "#{format_date(time)} " : "") + "#{local.strftime(Setting.time_format)}") + (include_date ? "#{format_date(local)} " : "") + + (Setting.time_format.blank? ? ::I18n.l(local, :format => :time) : local.strftime(Setting.time_format)) end def day_name(day) ::I18n.t('date.day_names')[day % 7] end - + def month_name(month) ::I18n.t('date.month_names')[month] end - + def valid_languages @@valid_languages ||= Dir.glob(File.join(RAILS_ROOT, 'config', 'locales', '*.yml')).collect {|f| File.basename(f).split('.').first}.collect(&:to_sym) end - + def find_language(lang) @@languages_lookup = valid_languages.inject({}) {|k, v| k[v.to_s.downcase] = v; k } @@languages_lookup[lang.to_s.downcase] end - + def set_language_if_valid(lang) if l = find_language(lang) ::I18n.locale = l end end - + def current_language ::I18n.locale end diff --git a/lib/redmine/imap.rb b/lib/redmine/imap.rb index 383d82f2..d509062d 100644 --- a/lib/redmine/imap.rb +++ b/lib/redmine/imap.rb @@ -1,19 +1,15 @@ -# Redmine - project management software -# Copyright (C) 2006-2008 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ require 'net/imap' @@ -25,8 +21,8 @@ module Redmine port = imap_options[:port] || '143' ssl = !imap_options[:ssl].nil? folder = imap_options[:folder] || 'INBOX' - - imap = Net::IMAP.new(host, port, ssl) + + imap = Net::IMAP.new(host, port, ssl) imap.login(imap_options[:username], imap_options[:password]) unless imap_options[:username].nil? imap.select(folder) imap.search(['NOT', 'SEEN']).each do |message_id| @@ -49,9 +45,9 @@ module Redmine end imap.expunge end - + private - + def logger RAILS_DEFAULT_LOGGER end diff --git a/lib/redmine/info.rb b/lib/redmine/info.rb index d992bb13..c2a7e357 100644 --- a/lib/redmine/info.rb +++ b/lib/redmine/info.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + module Redmine module Info class << self diff --git a/lib/redmine/menu_manager.rb b/lib/redmine/menu_manager.rb index 51f8ed64..4beb21ca 100644 --- a/lib/redmine/menu_manager.rb +++ b/lib/redmine/menu_manager.rb @@ -1,451 +1,28 @@ -# redMine - project management software -# Copyright (C) 2006-2007 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ -require 'tree' # gem install rubytree - -# Monkey patch the TreeNode to add on a few more methods :nodoc: -module TreeNodePatch - def self.included(base) - base.class_eval do - attr_reader :last_items_count - - def initialize_with_redmine(name, content = nil) - extend InstanceMethods - @last_items_count = 0 - - initialize_without_redmine(name, content) - end - alias_method_chain :initialize, :redmine +module Redmine::MenuManager + def self.map(menu_name) + @items ||= {} + mapper = Mapper.new(menu_name.to_sym, @items) + if block_given? + yield mapper + else + mapper end end - - module InstanceMethods - # Adds the specified child node to the receiver node. The child node's - # parent is set to be the receiver. The child is added as the first child in - # the current list of children for the receiver node. - def prepend(child) - raise "Child already added" if @childrenHash.has_key?(child.name) - @childrenHash[child.name] = child - @children = [child] + @children - child.parent = self - return child - - end - - # Adds the specified child node to the receiver node. The child node's - # parent is set to be the receiver. The child is added at the position - # into the current list of children for the receiver node. - def add_at(child, position) - raise "Child already added" if @childrenHash.has_key?(child.name) - - @childrenHash[child.name] = child - @children = @children.insert(position, child) - child.parent = self - return child - - end - - def add_last(child) - raise "Child already added" if @childrenHash.has_key?(child.name) - - @childrenHash[child.name] = child - @children << child - @last_items_count += 1 - child.parent = self - return child - - end - - # Adds the specified child node to the receiver node. The child node's - # parent is set to be the receiver. The child is added as the last child in - # the current list of children for the receiver node. - def add(child) - raise "Child already added" if @childrenHash.has_key?(child.name) - - @childrenHash[child.name] = child - position = @children.size - @last_items_count - @children.insert(position, child) - child.parent = self - return child - - end - - # Wrapp remove! making sure to decrement the last_items counter if - # the removed child was a last item - def remove!(child) - @last_items_count -= +1 if child && child.last - super - end - - - # Will return the position (zero-based) of the current child in - # it's parent - def position - self.parent.children.index(self) - end - end -end -unless Tree::TreeNode.included_modules.include?(TreeNodePatch) - Tree::TreeNode.send(:include, TreeNodePatch) -end - -module Redmine - module MenuManager - class MenuError < StandardError #:nodoc: - end - - module MenuController - def self.included(base) - base.extend(ClassMethods) - end - - module ClassMethods - @@menu_items = Hash.new {|hash, key| hash[key] = {:default => key, :actions => {}}} - mattr_accessor :menu_items - - # Set the menu item name for a controller or specific actions - # Examples: - # * menu_item :tickets # => sets the menu name to :tickets for the whole controller - # * menu_item :tickets, :only => :list # => sets the menu name to :tickets for the 'list' action only - # * menu_item :tickets, :only => [:list, :show] # => sets the menu name to :tickets for 2 actions only - # - # The default menu item name for a controller is controller_name by default - # Eg. the default menu item name for ProjectsController is :projects - def menu_item(id, options = {}) - if actions = options[:only] - actions = [] << actions unless actions.is_a?(Array) - actions.each {|a| menu_items[controller_name.to_sym][:actions][a.to_sym] = id} - else - menu_items[controller_name.to_sym][:default] = id - end - end - end - - def menu_items - self.class.menu_items - end - - # Returns the menu item name according to the current action - def current_menu_item - @current_menu_item ||= menu_items[controller_name.to_sym][:actions][action_name.to_sym] || - menu_items[controller_name.to_sym][:default] - end - - # Redirects user to the menu item of the given project - # Returns false if user is not authorized - def redirect_to_project_menu_item(project, name) - item = Redmine::MenuManager.items(:project_menu).detect {|i| i.name.to_s == name.to_s} - if item && User.current.allowed_to?(item.url, project) && (item.condition.nil? || item.condition.call(project)) - redirect_to({item.param => project}.merge(item.url)) - return true - end - false - end - end - - module MenuHelper - # Returns the current menu item name - def current_menu_item - @controller.current_menu_item - end - - # Renders the application main menu - def render_main_menu(project) - render_menu((project && !project.new_record?) ? :project_menu : :application_menu, project) - end - - def display_main_menu?(project) - menu_name = project && !project.new_record? ? :project_menu : :application_menu - Redmine::MenuManager.items(menu_name).size > 1 # 1 element is the root - end - - def render_menu(menu, project=nil) - links = [] - menu_items_for(menu, project) do |node| - links << render_menu_node(node, project) - end - links.empty? ? nil : content_tag('ul', links.join("\n")) - end - - def render_menu_node(node, project=nil) - if node.hasChildren? || !node.child_menus.nil? - return render_menu_node_with_children(node, project) - else - caption, url, selected = extract_node_details(node, project) - return content_tag('li', - render_single_menu_node(node, caption, url, selected)) - end - end - - def render_menu_node_with_children(node, project=nil) - caption, url, selected = extract_node_details(node, project) - - html = [].tap do |html| - html << '
  • ' - # Parent - html << render_single_menu_node(node, caption, url, selected) - - # Standard children - standard_children_list = "".tap do |child_html| - node.children.each do |child| - child_html << render_menu_node(child, project) - end - end - - html << content_tag(:ul, standard_children_list, :class => 'menu-children') unless standard_children_list.empty? - - # Unattached children - unattached_children_list = render_unattached_children_menu(node, project) - html << content_tag(:ul, unattached_children_list, :class => 'menu-children unattached') unless unattached_children_list.blank? - - html << '
  • ' - end - return html.join("\n") - end - - # Returns a list of unattached children menu items - def render_unattached_children_menu(node, project) - return nil unless node.child_menus - - "".tap do |child_html| - unattached_children = node.child_menus.call(project) - # Tree nodes support #each so we need to do object detection - if unattached_children.is_a? Array - unattached_children.each do |child| - child_html << content_tag(:li, render_unattached_menu_item(child, project)) - end - else - raise MenuError, ":child_menus must be an array of MenuItems" - end - end - end - - def render_single_menu_node(item, caption, url, selected) - link_to(h(caption), url, item.html_options(:selected => selected)) - end - - def render_unattached_menu_item(menu_item, project) - raise MenuError, ":child_menus must be an array of MenuItems" unless menu_item.is_a? MenuItem - - if User.current.allowed_to?(menu_item.url, project) - link_to(h(menu_item.caption), - menu_item.url, - menu_item.html_options) - end - end - - def menu_items_for(menu, project=nil) - items = [] - Redmine::MenuManager.items(menu).root.children.each do |node| - if allowed_node?(node, User.current, project) - if block_given? - yield node - else - items << node # TODO: not used? - end - end - end - return block_given? ? nil : items - end - - def extract_node_details(node, project=nil) - item = node - url = case item.url - when Hash - project.nil? ? item.url : {item.param => project}.merge(item.url) - when Symbol - send(item.url) - else - item.url - end - caption = item.caption(project) - return [caption, url, (current_menu_item == item.name)] - end - - # Checks if a user is allowed to access the menu item by: - # - # * Checking the conditions of the item - # * Checking the url target (project only) - def allowed_node?(node, user, project) - if node.condition && !node.condition.call(project) - # Condition that doesn't pass - return false - end - - if project - return user && user.allowed_to?(node.url, project) - else - # outside a project, all menu items allowed - return true - end - end - end - - class << self - def map(menu_name) - @items ||= {} - mapper = Mapper.new(menu_name.to_sym, @items) - if block_given? - yield mapper - else - mapper - end - end - - def items(menu_name) - @items[menu_name.to_sym] || Tree::TreeNode.new(:root, {}) - end - end - - class Mapper - def initialize(menu, items) - items[menu] ||= Tree::TreeNode.new(:root, {}) - @menu = menu - @menu_items = items[menu] - end - - @@last_items_count = Hash.new {|h,k| h[k] = 0} - - # Adds an item at the end of the menu. Available options: - # * param: the parameter name that is used for the project id (default is :id) - # * if: a Proc that is called before rendering the item, the item is displayed only if it returns true - # * caption that can be: - # * a localized string Symbol - # * a String - # * a Proc that can take the project as argument - # * before, after: specify where the menu item should be inserted (eg. :after => :activity) - # * parent: menu item will be added as a child of another named menu (eg. :parent => :issues) - # * children: a Proc that is called before rendering the item. The Proc should return an array of MenuItems, which will be added as children to this item. - # eg. :children => Proc.new {|project| [Redmine::MenuManager::MenuItem.new(...)] } - # * last: menu item will stay at the end (eg. :last => true) - # * html_options: a hash of html options that are passed to link_to - def push(name, url, options={}) - options = options.dup - - if options[:parent] - subtree = self.find(options[:parent]) - if subtree - target_root = subtree - else - target_root = @menu_items.root - end - - else - target_root = @menu_items.root - end - - # menu item position - if first = options.delete(:first) - target_root.prepend(MenuItem.new(name, url, options)) - elsif before = options.delete(:before) - - if exists?(before) - target_root.add_at(MenuItem.new(name, url, options), position_of(before)) - else - target_root.add(MenuItem.new(name, url, options)) - end - - elsif after = options.delete(:after) - - if exists?(after) - target_root.add_at(MenuItem.new(name, url, options), position_of(after) + 1) - else - target_root.add(MenuItem.new(name, url, options)) - end - - elsif options[:last] # don't delete, needs to be stored - target_root.add_last(MenuItem.new(name, url, options)) - else - target_root.add(MenuItem.new(name, url, options)) - end - end - - # Removes a menu item - def delete(name) - if found = self.find(name) - @menu_items.remove!(found) - end - end - - # Checks if a menu item exists - def exists?(name) - @menu_items.any? {|node| node.name == name} - end - - def find(name) - @menu_items.find {|node| node.name == name} - end - - def position_of(name) - @menu_items.each do |node| - if node.name == name - return node.position - end - end - end - end - - class MenuItem < Tree::TreeNode - include Redmine::I18n - attr_reader :name, :url, :param, :condition, :parent, :child_menus, :last - - def initialize(name, url, options) - raise ArgumentError, "Invalid option :if for menu item '#{name}'" if options[:if] && !options[:if].respond_to?(:call) - raise ArgumentError, "Invalid option :html for menu item '#{name}'" if options[:html] && !options[:html].is_a?(Hash) - raise ArgumentError, "Cannot set the :parent to be the same as this item" if options[:parent] == name.to_sym - raise ArgumentError, "Invalid option :children for menu item '#{name}'" if options[:children] && !options[:children].respond_to?(:call) - @name = name - @url = url - @condition = options[:if] - @param = options[:param] || :id - @caption = options[:caption] - @html_options = options[:html] || {} - # Adds a unique class to each menu item based on its name - @html_options[:class] = [@html_options[:class], @name.to_s.dasherize].compact.join(' ') - @parent = options[:parent] - @child_menus = options[:children] - @last = options[:last] || false - super @name.to_sym - end - - def caption(project=nil) - if @caption.is_a?(Proc) - c = @caption.call(project).to_s - c = @name.to_s.humanize if c.blank? - c - else - if @caption.nil? - l_or_humanize(name, :prefix => 'label_') - else - @caption.is_a?(Symbol) ? l(@caption) : @caption - end - end - end - - def html_options(options={}) - if options[:selected] - o = @html_options.dup - o[:class] += ' selected' - o - else - @html_options - end - end - end + def self.items(menu_name) + @items[menu_name.to_sym] || Redmine::MenuManager::TreeNode.new(:root, {}) end end diff --git a/lib/redmine/menu_manager/mapper.rb b/lib/redmine/menu_manager/mapper.rb new file mode 100644 index 00000000..77e2248b --- /dev/null +++ b/lib/redmine/menu_manager/mapper.rb @@ -0,0 +1,100 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + +class Redmine::MenuManager::Mapper + def initialize(menu, items) + items[menu] ||= Redmine::MenuManager::TreeNode.new(:root, {}) + @menu = menu + @menu_items = items[menu] + end + + @@last_items_count = Hash.new {|h,k| h[k] = 0} + + # Adds an item at the end of the menu. Available options: + # * param: the parameter name that is used for the project id (default is :id) + # * if: a Proc that is called before rendering the item, the item is displayed only if it returns true + # * caption that can be: + # * a localized string Symbol + # * a String + # * a Proc that can take the project as argument + # * before, after: specify where the menu item should be inserted (eg. :after => :activity) + # * parent: menu item will be added as a child of another named menu (eg. :parent => :issues) + # * children: a Proc that is called before rendering the item. The Proc should return an array of MenuItems, which will be added as children to this item. + # eg. :children => Proc.new {|project| [Redmine::MenuManager::MenuItem.new(...)] } + # * last: menu item will stay at the end (eg. :last => true) + # * html_options: a hash of html options that are passed to link_to + def push(name, url, options={}) + options = options.dup + + if options[:parent] + subtree = self.find(options[:parent]) + if subtree + target_root = subtree + else + target_root = @menu_items.root + end + + else + target_root = @menu_items.root + end + + # menu item position + if first = options.delete(:first) + target_root.prepend(Redmine::MenuManager::MenuItem.new(name, url, options)) + elsif before = options.delete(:before) + + if exists?(before) + target_root.add_at(Redmine::MenuManager::MenuItem.new(name, url, options), position_of(before)) + else + target_root.add(Redmine::MenuManager::MenuItem.new(name, url, options)) + end + + elsif after = options.delete(:after) + + if exists?(after) + target_root.add_at(Redmine::MenuManager::MenuItem.new(name, url, options), position_of(after) + 1) + else + target_root.add(Redmine::MenuManager::MenuItem.new(name, url, options)) + end + + elsif options[:last] # don't delete, needs to be stored + target_root.add_last(Redmine::MenuManager::MenuItem.new(name, url, options)) + else + target_root.add(Redmine::MenuManager::MenuItem.new(name, url, options)) + end + end + + # Removes a menu item + def delete(name) + if found = self.find(name) + @menu_items.remove!(found) + end + end + + # Checks if a menu item exists + def exists?(name) + @menu_items.any? {|node| node.name == name} + end + + def find(name) + @menu_items.find {|node| node.name == name} + end + + def position_of(name) + @menu_items.each do |node| + if node.name == name + return node.position + end + end + end +end diff --git a/lib/redmine/menu_manager/menu_controller.rb b/lib/redmine/menu_manager/menu_controller.rb new file mode 100644 index 00000000..56513e68 --- /dev/null +++ b/lib/redmine/menu_manager/menu_controller.rb @@ -0,0 +1,61 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + +module Redmine::MenuManager::MenuController + def self.included(base) + base.extend(ClassMethods) + end + + module ClassMethods + @@menu_items = Hash.new {|hash, key| hash[key] = {:default => key, :actions => {}}} + mattr_accessor :menu_items + + # Set the menu item name for a controller or specific actions + # Examples: + # * menu_item :tickets # => sets the menu name to :tickets for the whole controller + # * menu_item :tickets, :only => :list # => sets the menu name to :tickets for the 'list' action only + # * menu_item :tickets, :only => [:list, :show] # => sets the menu name to :tickets for 2 actions only + # + # The default menu item name for a controller is controller_name by default + # Eg. the default menu item name for ProjectsController is :projects + def menu_item(id, options = {}) + if actions = options[:only] + actions = [] << actions unless actions.is_a?(Array) + actions.each {|a| menu_items[controller_name.to_sym][:actions][a.to_sym] = id} + else + menu_items[controller_name.to_sym][:default] = id + end + end + end + + def menu_items + self.class.menu_items + end + + # Returns the menu item name according to the current action + def current_menu_item + @current_menu_item ||= menu_items[controller_name.to_sym][:actions][action_name.to_sym] || + menu_items[controller_name.to_sym][:default] + end + + # Redirects user to the menu item of the given project + # Returns false if user is not authorized + def redirect_to_project_menu_item(project, name) + item = Redmine::MenuManager.items(:project_menu).detect {|i| i.name.to_s == name.to_s} + if item && User.current.allowed_to?(item.url, project) && (item.condition.nil? || item.condition.call(project)) + redirect_to({item.param => project}.merge(item.url)) + return true + end + false + end +end diff --git a/lib/redmine/menu_manager/menu_error.rb b/lib/redmine/menu_manager/menu_error.rb new file mode 100644 index 00000000..16279b5f --- /dev/null +++ b/lib/redmine/menu_manager/menu_error.rb @@ -0,0 +1,15 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + +class Redmine::MenuManager::MenuError < StandardError #:nodoc: +end diff --git a/lib/redmine/menu_manager/menu_helper.rb b/lib/redmine/menu_manager/menu_helper.rb new file mode 100644 index 00000000..3053693a --- /dev/null +++ b/lib/redmine/menu_manager/menu_helper.rb @@ -0,0 +1,150 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + +module Redmine::MenuManager::MenuHelper + # Returns the current menu item name + def current_menu_item + @controller.current_menu_item + end + + # Renders the application main menu + def render_main_menu(project) + render_menu((project && !project.new_record?) ? :project_menu : :application_menu, project) + end + + def display_main_menu?(project) + menu_name = project && !project.new_record? ? :project_menu : :application_menu + Redmine::MenuManager.items(menu_name).size > 1 # 1 element is the root + end + + def render_menu(menu, project=nil) + links = [] + menu_items_for(menu, project) do |node| + links << render_menu_node(node, project) + end + links.empty? ? nil : content_tag('ul', links.join("\n")) + end + + def render_menu_node(node, project=nil) + if node.hasChildren? || !node.child_menus.nil? + return render_menu_node_with_children(node, project) + else + caption, url, selected = extract_node_details(node, project) + return content_tag('li', + render_single_menu_node(node, caption, url, selected)) + end + end + + def render_menu_node_with_children(node, project=nil) + caption, url, selected = extract_node_details(node, project) + + html = [].tap do |html| + html << '
  • ' + # Parent + html << render_single_menu_node(node, caption, url, selected) + + # Standard children + standard_children_list = "".tap do |child_html| + node.children.each do |child| + child_html << render_menu_node(child, project) + end + end + + html << content_tag(:ul, standard_children_list, :class => 'menu-children') unless standard_children_list.empty? + + # Unattached children + unattached_children_list = render_unattached_children_menu(node, project) + html << content_tag(:ul, unattached_children_list, :class => 'menu-children unattached') unless unattached_children_list.blank? + + html << '
  • ' + end + return html.join("\n") + end + + # Returns a list of unattached children menu items + def render_unattached_children_menu(node, project) + return nil unless node.child_menus + + "".tap do |child_html| + unattached_children = node.child_menus.call(project) + # Tree nodes support #each so we need to do object detection + if unattached_children.is_a? Array + unattached_children.each do |child| + child_html << content_tag(:li, render_unattached_menu_item(child, project)) + end + else + raise Redmine::MenuManager::MenuError, ":child_menus must be an array of MenuItems" + end + end + end + + def render_single_menu_node(item, caption, url, selected) + link_to(h(caption), url, item.html_options(:selected => selected)) + end + + def render_unattached_menu_item(menu_item, project) + raise Redmine::MenuManager::MenuError, ":child_menus must be an array of MenuItems" unless menu_item.is_a? Redmine::MenuManager::MenuItem + + if User.current.allowed_to?(menu_item.url, project) + link_to(h(menu_item.caption), + menu_item.url, + menu_item.html_options) + end + end + + def menu_items_for(menu, project=nil) + items = [] + Redmine::MenuManager.items(menu).root.children.each do |node| + if allowed_node?(node, User.current, project) + if block_given? + yield node + else + items << node # TODO: not used? + end + end + end + return block_given? ? nil : items + end + + def extract_node_details(node, project=nil) + item = node + url = case item.url + when Hash + project.nil? ? item.url : {item.param => project}.merge(item.url) + when Symbol + send(item.url) + else + item.url + end + caption = item.caption(project) + return [caption, url, (current_menu_item == item.name)] + end + + # Checks if a user is allowed to access the menu item by: + # + # * Checking the conditions of the item + # * Checking the url target (project only) + def allowed_node?(node, user, project) + if node.condition && !node.condition.call(project) + # Condition that doesn't pass + return false + end + + if project + return user && user.allowed_to?(node.url, project) + else + # outside a project, all menu items allowed + return true + end + end +end diff --git a/lib/redmine/menu_manager/menu_item.rb b/lib/redmine/menu_manager/menu_item.rb new file mode 100644 index 00000000..f2608456 --- /dev/null +++ b/lib/redmine/menu_manager/menu_item.rb @@ -0,0 +1,60 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + +class Redmine::MenuManager::MenuItem < Redmine::MenuManager::TreeNode + include Redmine::I18n + attr_reader :name, :url, :param, :condition, :parent, :child_menus, :last + + def initialize(name, url, options) + raise ArgumentError, "Invalid option :if for menu item '#{name}'" if options[:if] && !options[:if].respond_to?(:call) + raise ArgumentError, "Invalid option :html for menu item '#{name}'" if options[:html] && !options[:html].is_a?(Hash) + raise ArgumentError, "Cannot set the :parent to be the same as this item" if options[:parent] == name.to_sym + raise ArgumentError, "Invalid option :children for menu item '#{name}'" if options[:children] && !options[:children].respond_to?(:call) + @name = name + @url = url + @condition = options[:if] + @param = options[:param] || :id + @caption = options[:caption] + @html_options = options[:html] || {} + # Adds a unique class to each menu item based on its name + @html_options[:class] = [@html_options[:class], @name.to_s.dasherize].compact.join(' ') + @parent = options[:parent] + @child_menus = options[:children] + @last = options[:last] || false + super @name.to_sym + end + + def caption(project=nil) + if @caption.is_a?(Proc) + c = @caption.call(project).to_s + c = @name.to_s.humanize if c.blank? + c + else + if @caption.nil? + l_or_humanize(name, :prefix => 'label_') + else + @caption.is_a?(Symbol) ? l(@caption) : @caption + end + end + end + + def html_options(options={}) + if options[:selected] + o = @html_options.dup + o[:class] += ' selected' + o + else + @html_options + end + end +end diff --git a/lib/redmine/menu_manager/tree_node.rb b/lib/redmine/menu_manager/tree_node.rb new file mode 100644 index 00000000..94cd2260 --- /dev/null +++ b/lib/redmine/menu_manager/tree_node.rb @@ -0,0 +1,88 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + +require 'tree' # gem install rubytree + +class Redmine::MenuManager::TreeNode < Tree::TreeNode + attr_reader :last_items_count + + def initialize(name, content = nil) + @last_items_count = 0 + super + end + + # Adds the specified child node to the receiver node. The child node's + # parent is set to be the receiver. The child is added as the first child in + # the current list of children for the receiver node. + def prepend(child) + raise "Child already added" if @childrenHash.has_key?(child.name) + + @childrenHash[child.name] = child + @children = [child] + @children + child.parent = self + return child + + end + + # Adds the specified child node to the receiver node. The child node's + # parent is set to be the receiver. The child is added at the position + # into the current list of children for the receiver node. + def add_at(child, position) + raise "Child already added" if @childrenHash.has_key?(child.name) + + @childrenHash[child.name] = child + @children = @children.insert(position, child) + child.parent = self + return child + + end + + def add_last(child) + raise "Child already added" if @childrenHash.has_key?(child.name) + + @childrenHash[child.name] = child + @children << child + @last_items_count += 1 + child.parent = self + return child + + end + + # Adds the specified child node to the receiver node. The child node's + # parent is set to be the receiver. The child is added as the last child in + # the current list of children for the receiver node. + def add(child) + raise "Child already added" if @childrenHash.has_key?(child.name) + + @childrenHash[child.name] = child + position = @children.size - @last_items_count + @children.insert(position, child) + child.parent = self + return child + + end + + # Wrapp remove! making sure to decrement the last_items counter if + # the removed child was a last item + def remove!(child) + @last_items_count -= +1 if child && child.last + super + end + + + # Will return the position (zero-based) of the current child in + # it's parent + def position + self.parent.children.index(self) + end +end diff --git a/lib/redmine/mime_type.rb b/lib/redmine/mime_type.rb index c85ebdcb..51d25e65 100644 --- a/lib/redmine/mime_type.rb +++ b/lib/redmine/mime_type.rb @@ -1,19 +1,15 @@ -# Redmine - project management software -# Copyright (C) 2006-2009 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ module Redmine module MimeType @@ -37,6 +33,7 @@ module Redmine 'text/xml' => 'xml,xsd,mxml', 'text/yaml' => 'yml,yaml', 'text/csv' => 'csv', + 'text/x-po' => 'po', 'image/gif' => 'gif', 'image/jpeg' => 'jpg,jpeg,jpe', 'image/png' => 'png', @@ -61,36 +58,36 @@ module Redmine 'application/zip' => 'zip', 'application/x-gzip' => 'gz', }.freeze - + EXTENSIONS = MIME_TYPES.inject({}) do |map, (type, exts)| exts.split(',').each {|ext| map[ext.strip] = type} map end - + # returns mime type for name or nil if unknown def self.of(name) return nil unless name m = name.to_s.match(/(^|\.)([^\.]+)$/) EXTENSIONS[m[2].downcase] if m end - + # Returns the css class associated to # the mime type of name def self.css_class_of(name) mime = of(name) mime && mime.gsub('/', '-') end - + def self.main_mimetype_of(name) mimetype = of(name) mimetype.split('/').first if mimetype end - + # return true if mime-type for name is type/* # otherwise false def self.is_type?(type, name) main_mimetype = main_mimetype_of(name) type.to_s == main_mimetype - end + end end end diff --git a/lib/redmine/notifiable.rb b/lib/redmine/notifiable.rb index 71d1ba50..c959d3c2 100644 --- a/lib/redmine/notifiable.rb +++ b/lib/redmine/notifiable.rb @@ -1,10 +1,23 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + module Redmine class Notifiable < Struct.new(:name, :parent) def to_s name end - + # TODO: Plugin API for adding a new notification? def self.all notifications = [] @@ -14,6 +27,7 @@ module Redmine notifications << Notifiable.new('issue_status_updated', 'issue_updated') notifications << Notifiable.new('issue_priority_updated', 'issue_updated') notifications << Notifiable.new('news_added') + notifications << Notifiable.new('news_comment_added') notifications << Notifiable.new('document_added') notifications << Notifiable.new('file_added') notifications << Notifiable.new('message_posted') diff --git a/lib/redmine/platform.rb b/lib/redmine/platform.rb index f41b92f2..1ed3a987 100644 --- a/lib/redmine/platform.rb +++ b/lib/redmine/platform.rb @@ -1,19 +1,15 @@ -# Redmine - project management software -# Copyright (C) 2006-2008 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ module Redmine module Platform diff --git a/lib/redmine/plugin.rb b/lib/redmine/plugin.rb index f30277ad..5fdbb2f3 100644 --- a/lib/redmine/plugin.rb +++ b/lib/redmine/plugin.rb @@ -1,28 +1,24 @@ -# redMine - project management software -# Copyright (C) 2006-2007 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ module Redmine #:nodoc: class PluginNotFound < StandardError; end class PluginRequirementError < StandardError; end - + # Base class for Redmine plugins. # Plugins are registered using the register class method that acts as the public constructor. - # + # # Redmine::Plugin.register :example do # name 'Example plugin' # author 'John Smith' @@ -30,9 +26,9 @@ module Redmine #:nodoc: # version '0.0.1' # settings :default => {'foo'=>'bar'}, :partial => 'settings/settings' # end - # + # # === Plugin attributes - # + # # +settings+ is an optional attribute that let the plugin be configurable. # It must be a hash with the following keys: # * :default: default value for the plugin settings @@ -40,7 +36,7 @@ module Redmine #:nodoc: # Example: # settings :default => {'foo'=>'bar'}, :partial => 'settings/settings' # In this example, the settings partial will be found here in the plugin directory: app/views/settings/_settings.rhtml. - # + # # When rendered, the plugin settings value is available as the local variable +settings+ class Plugin @registered_plugins = {} @@ -49,9 +45,9 @@ module Redmine #:nodoc: private :new def def_field(*names) - class_eval do + class_eval do names.each do |name| - define_method(name) do |*args| + define_method(name) do |*args| args.empty? ? instance_variable_get("@#{name}") : instance_variable_set("@#{name}", *args) end end @@ -60,7 +56,7 @@ module Redmine #:nodoc: end def_field :name, :description, :url, :author, :author_url, :version, :settings attr_reader :id - + # Plugin constructor def self.register(id, &block) p = new(id) @@ -72,18 +68,18 @@ module Redmine #:nodoc: ::I18n.load_path += Dir.glob(File.join(RAILS_ROOT, 'vendor', 'plugins', id.to_s, 'config', 'locales', '*.yml')) registered_plugins[id] = p end - + # Returns an array off all registered plugins def self.all registered_plugins.values.sort end - + # Finds a plugin by its id # Returns a PluginNotFound exception if the plugin doesn't exist def self.find(id) registered_plugins[id.to_sym] || raise(PluginNotFound) end - + # Clears the registered plugins hash # It doesn't unload installed plugins def self.clear @@ -96,15 +92,15 @@ module Redmine #:nodoc: def self.installed?(id) registered_plugins[id.to_sym].present? end - + def initialize(id) @id = id.to_sym end - + def <=>(plugin) self.id.to_s <=> plugin.id.to_s end - + # Sets a requirement on Redmine version # Raises a PluginRequirementError exception if the requirement is not met # @@ -119,7 +115,7 @@ module Redmine #:nodoc: def requires_redmine(arg) arg = { :version_or_higher => arg } unless arg.is_a?(Hash) arg.assert_valid_keys(:version, :version_or_higher) - + current = Redmine::VERSION.to_a arg.each do |k, v| v = [] << v unless v.is_a?(Array) @@ -178,39 +174,39 @@ module Redmine #:nodoc: # Adds an item to the given +menu+. # The +id+ parameter (equals to the project id) is automatically added to the url. # menu :project_menu, :plugin_example, { :controller => 'example', :action => 'say_hello' }, :caption => 'Sample' - # + # # +name+ parameter can be: :top_menu, :account_menu, :application_menu or :project_menu - # + # def menu(menu, item, url, options={}) Redmine::MenuManager.map(menu).push(item, url, options) end alias :add_menu_item :menu - + # Removes +item+ from the given +menu+. def delete_menu_item(menu, item) Redmine::MenuManager.map(menu).delete(item) end # Defines a permission called +name+ for the given +actions+. - # + # # The +actions+ argument is a hash with controllers as keys and actions as values (a single value or an array): # permission :destroy_contacts, { :contacts => :destroy } # permission :view_contacts, { :contacts => [:index, :show] } - # + # # The +options+ argument can be used to make the permission public (implicitly given to any user) # or to restrict users the permission can be given to. - # + # # Examples # # A permission that is implicitly given to any user # # This permission won't appear on the Roles & Permissions setup screen # permission :say_hello, { :example => :say_hello }, :public => true - # + # # # A permission that can be given to any user # permission :say_hello, { :example => :say_hello } - # + # # # A permission that can be given to registered users only # permission :say_hello, { :example => :say_hello }, :require => :loggedin - # + # # # A permission that can be given to project members only # permission :say_hello, { :example => :say_hello }, :require => :member def permission(name, actions, options = {}) @@ -220,10 +216,10 @@ module Redmine #:nodoc: Redmine::AccessControl.map {|map| map.permission(name, actions, options)} end end - + # Defines a project module, that can be enabled/disabled for each project. # Permissions defined inside +block+ will be bind to the module. - # + # # project_module :things do # permission :view_contacts, { :contacts => [:list, :show] }, :public => true # permission :destroy_contacts, { :contacts => :destroy } @@ -233,33 +229,33 @@ module Redmine #:nodoc: self.instance_eval(&block) @project_module = nil end - + # Registers an activity provider. # # Options: # * :class_name - one or more model(s) that provide these events (inferred from event_type by default) # * :default - setting this option to false will make the events not displayed by default - # + # # A model can provide several activity event types. - # + # # Examples: # register :news # register :scrums, :class_name => 'Meeting' # register :issues, :class_name => ['Issue', 'Journal'] - # + # # Retrieving events: # Associated model(s) must implement the find_events class method. # ActiveRecord models can use acts_as_activity_provider as a way to implement this class method. - # - # The following call should return all the scrum events visible by current user that occured in the 5 last days: + # + # The following call should return all the scrum events visible by current user that occured in the 5 last days: # Meeting.find_events('scrums', User.current, 5.days.ago, Date.today) # Meeting.find_events('scrums', User.current, 5.days.ago, Date.today, :project => foo) # events for project foo only - # + # # Note that :view_scrums permission is required to view these events in the activity view. def activity_provider(*args) Redmine::Activity.register(*args) end - + # Registers a wiki formatter. # # Parameters: diff --git a/lib/redmine/pop3.rb b/lib/redmine/pop3.rb index ddccfe88..33dadac3 100644 --- a/lib/redmine/pop3.rb +++ b/lib/redmine/pop3.rb @@ -1,19 +1,15 @@ -# Redmine - project management software -# Copyright (C) 2006-2010 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ require 'net/pop' @@ -51,7 +47,7 @@ module Redmine end end end - + private def logger diff --git a/lib/redmine/safe_attributes.rb b/lib/redmine/safe_attributes.rb index 13db6a45..a9673aa5 100644 --- a/lib/redmine/safe_attributes.rb +++ b/lib/redmine/safe_attributes.rb @@ -1,26 +1,22 @@ -# Redmine - project management software -# Copyright (C) 2006-2010 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ module Redmine module SafeAttributes def self.included(base) base.extend(ClassMethods) end - + module ClassMethods # Declares safe attributes # An optional Proc can be given for conditional inclusion @@ -58,10 +54,10 @@ module Redmine end names.uniq end - + # Returns a hash with unsafe attributes removed # from the given attrs hash - # + # # Example: # book.delete_unsafe_attributes({'title' => 'My book', 'foo' => 'bar'}) # # => {'title' => 'My book'} @@ -69,7 +65,7 @@ module Redmine safe = safe_attribute_names(user) attrs.dup.delete_if {|k,v| !safe.include?(k.to_s)} end - + # Sets attributes from attrs that are safe # attrs is a Hash with string keys def safe_attributes=(attrs, user=User.current) diff --git a/lib/redmine/scm/adapters/abstract_adapter.rb b/lib/redmine/scm/adapters/abstract_adapter.rb index 3442276b..51926180 100644 --- a/lib/redmine/scm/adapters/abstract_adapter.rb +++ b/lib/redmine/scm/adapters/abstract_adapter.rb @@ -1,28 +1,24 @@ -# redMine - project management software -# Copyright (C) 2006-2007 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ require 'cgi' module Redmine module Scm - module Adapters + module Adapters class CommandFailed < StandardError #:nodoc: end - + class AbstractAdapter #:nodoc: class << self def client_command @@ -34,14 +30,14 @@ module Redmine def client_version [] end - + # Returns the version string of the scm client # Eg: '1.5.0' or 'Unknown version' if unknown def client_version_string v = client_version || 'Unknown version' v.is_a?(Array) ? v.join('.') : v.to_s end - + # Returns true if the current client version is above # or equals the given one # If option is :unknown is set to true, it will return @@ -63,17 +59,18 @@ module Redmine end end - def initialize(url, root_url=nil, login=nil, password=nil) + def initialize(url, root_url=nil, login=nil, password=nil, + path_encoding=nil) @url = url @login = login if login && !login.empty? @password = (password || "") if @login @root_url = root_url.blank? ? retrieve_root_url : root_url end - + def adapter_name 'Abstract' end - + def supports_cat? true end @@ -81,20 +78,20 @@ module Redmine def supports_annotate? respond_to?('annotate') end - + def root_url @root_url end - + def url @url end - + # get info about the svn repository def info return nil end - + # Returns the entry identified by path and revision identifier # or nil if entry doesn't exist in the repository def entry(path=nil, identifier=nil) @@ -110,7 +107,7 @@ module Redmine es ? es.detect {|e| e.name == search_name} : nil end end - + # Returns an Entries collection # or nil if the given path doesn't exist in the repository def entries(path=nil, identifier=nil) @@ -121,30 +118,30 @@ module Redmine return nil end - def tags + def tags return nil end def default_branch return nil end - + def properties(path, identifier=nil) return nil end - + def revisions(path=nil, identifier_from=nil, identifier_to=nil, options={}) return nil end - + def diff(path, identifier_from, identifier_to=nil) return nil end - + def cat(path, identifier=nil) return nil end - + def with_leading_slash(path) path ||= '' (path[0,1]!="/") ? "/#{path}" : path @@ -174,7 +171,7 @@ module Redmine info = self.info info ? info.root_url : nil end - + def target(path) path ||= '' base = path.match(/^\//) ? root_url : url @@ -188,11 +185,11 @@ module Redmine def shellout(cmd, &block) self.class.shellout(cmd, &block) end - + def self.logger RAILS_DEFAULT_LOGGER end - + def self.shellout(cmd, &block) logger.debug "Shelling out: #{strip_credential(cmd)}" if logger && logger.debug? if Rails.env == 'development' @@ -200,7 +197,12 @@ module Redmine cmd = "#{cmd} 2>>#{RAILS_ROOT}/log/scm.stderr.log" end begin - IO.popen(cmd, "r+") do |io| + if RUBY_VERSION < '1.9' + mode = "r+" + else + mode = "r+:ASCII-8BIT" + end + IO.popen(cmd, mode) do |io| io.close_write block.call(io) if block_given? end @@ -210,35 +212,46 @@ module Redmine logger.error("SCM command failed, make sure that your SCM binary (eg. svn) is in PATH (#{ENV['PATH']}): #{strip_credential(cmd)}\n with: #{msg}") raise CommandFailed.new(msg) end - end - + end + # Hides username/password in a given command def self.strip_credential(cmd) q = (Redmine::Platform.mswin? ? '"' : "'") cmd.to_s.gsub(/(\-\-(password|username))\s+(#{q}[^#{q}]+#{q}|[^#{q}]\S+)/, '\\1 xxxx') end - + def strip_credential(cmd) self.class.strip_credential(cmd) end + + def scm_iconv(to, from, str) + return nil if str.nil? + return str if to == from + begin + Iconv.conv(to, from, str) + rescue Iconv::Failure => err + logger.error("failed to convert from #{from} to #{to}. #{err}") + nil + end + end end - + class Entries < Array def sort_by_name - sort {|x,y| + sort {|x,y| if x.kind == y.kind x.name.to_s <=> y.name.to_s else x.kind <=> y.kind end - } + } end - + def revisions revisions ||= Revisions.new(collect{|entry| entry.lastrev}.compact) end end - + class Info attr_accessor :root_url, :lastrev def initialize(attributes={}) @@ -246,7 +259,7 @@ module Redmine self.lastrev = attributes[:lastrev] end end - + class Entry attr_accessor :name, :path, :kind, :size, :lastrev def initialize(attributes={}) @@ -256,20 +269,20 @@ module Redmine self.size = attributes[:size].to_i if attributes[:size] self.lastrev = attributes[:lastrev] end - + def is_file? 'file' == self.kind end - + def is_dir? 'dir' == self.kind end - + def is_text? Redmine::MimeType.is_type?('text', name) end end - + class Revisions < Array def latest sort {|x,y| @@ -279,9 +292,9 @@ module Redmine 0 end }.last - end + end end - + class Revision attr_accessor :scmid, :name, :author, :time, :message, :paths, :revision, :branch attr_writer :identifier @@ -307,46 +320,25 @@ module Redmine def format_identifier identifier end - - def save(repo) - Changeset.transaction do - changeset = Changeset.new( - :repository => repo, - :revision => identifier, - :scmid => scmid, - :committer => author, - :committed_on => time, - :comments => message) - - if changeset.save - paths.each do |file| - Change.create( - :changeset => changeset, - :action => file[:action], - :path => file[:path]) - end - end - end - end end - + class Annotate attr_reader :lines, :revisions - + def initialize @lines = [] @revisions = [] end - + def add_line(line, revision) @lines << line @revisions << revision end - + def content content = lines.join("\n") end - + def empty? lines.empty? end diff --git a/lib/redmine/scm/adapters/bazaar_adapter.rb b/lib/redmine/scm/adapters/bazaar_adapter.rb index 1a11f639..bff38ce4 100644 --- a/lib/redmine/scm/adapters/bazaar_adapter.rb +++ b/lib/redmine/scm/adapters/bazaar_adapter.rb @@ -1,19 +1,15 @@ -# redMine - project management software -# Copyright (C) 2006-2007 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ require 'redmine/scm/adapters/abstract_adapter' @@ -33,6 +29,28 @@ module Redmine def sq_bin @@sq_bin ||= shell_quote(BZR_BIN) end + + def client_version + @@client_version ||= (scm_command_version || []) + end + + def client_available + !client_version.empty? + end + + def scm_command_version + scm_version = scm_version_from_command_line.dup + if scm_version.respond_to?(:force_encoding) + scm_version.force_encoding('ASCII-8BIT') + end + if m = scm_version.match(%r{\A(.*?)((\d+\.)+\d+)}) + m[2].scan(%r{\d+}).collect(&:to_i) + end + end + + def scm_version_from_command_line + shellout("#{sq_bin} --version") { |io| io.read }.to_s + end end # Get info about the repository @@ -60,8 +78,8 @@ module Redmine path ||= '' entries = Entries.new cmd = "#{self.class.sq_bin} ls -v --show-ids" - identifier = -1 unless identifier && identifier.to_i > 0 - cmd << " -r#{identifier.to_i}" + identifier = -1 unless identifier && identifier.to_i > 0 + cmd << " -r#{identifier.to_i}" cmd << " #{target(path)}" shellout(cmd) do |io| prefix = "#{url}/#{path}".gsub('\\', '/') @@ -98,7 +116,7 @@ module Redmine parsing = nil else next unless revision - + if line =~ /^revno: (\d+)($|\s\[merge\]$)/ revision.identifier = $1.to_i elsif line =~ /^committer: (.+)$/ @@ -146,7 +164,7 @@ module Redmine def diff(path, identifier_from, identifier_to=nil) path ||= '' if identifier_to - identifier_to = identifier_to.to_i + identifier_to = identifier_to.to_i else identifier_to = identifier_from.to_i - 1 end diff --git a/lib/redmine/scm/adapters/cvs_adapter.rb b/lib/redmine/scm/adapters/cvs_adapter.rb index c3d3bf72..dfab8668 100644 --- a/lib/redmine/scm/adapters/cvs_adapter.rb +++ b/lib/redmine/scm/adapters/cvs_adapter.rb @@ -1,19 +1,15 @@ -# redMine - project management software -# Copyright (C) 2006-2007 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ require 'redmine/scm/adapters/abstract_adapter' @@ -25,6 +21,9 @@ module Redmine # CVS executable name CVS_BIN = Redmine::Configuration['scm_cvs_command'] || "cvs" + # raised if scm command exited with error, e.g. unknown revision. + class ScmCommandAborted < CommandFailed; end + class << self def client_command @@bin ||= CVS_BIN @@ -33,6 +32,28 @@ module Redmine def sq_bin @@sq_bin ||= shell_quote(CVS_BIN) end + + def client_version + @@client_version ||= (scm_command_version || []) + end + + def client_available + client_version_above?([1, 12]) + end + + def scm_command_version + scm_version = scm_version_from_command_line.dup + if scm_version.respond_to?(:force_encoding) + scm_version.force_encoding('ASCII-8BIT') + end + if m = scm_version.match(%r{\A(.*?)((\d+\.)+\d+)}m) + m[2].scan(%r{\d+}).collect(&:to_i) + end + end + + def scm_version_from_command_line + shellout("#{sq_bin} --version") { |io| io.read }.to_s + end end # Guidelines for the input: @@ -40,7 +61,8 @@ module Redmine # root_url -> the good old, sometimes damned, CVSROOT # login -> unnecessary # password -> unnecessary too - def initialize(url, root_url=nil, login=nil, password=nil) + def initialize(url, root_url=nil, login=nil, password=nil, + path_encoding=nil) @url = url @login = login if login && !login.empty? @password = (password || "") if @login @@ -73,39 +95,54 @@ module Redmine logger.debug " entries '#{path}' with identifier '#{identifier}'" path_with_project="#{url}#{with_leading_slash(path)}" entries = Entries.new - cmd = "#{self.class.sq_bin} -d #{shell_quote root_url} rls -e" - cmd << " -D \"#{time_to_cvstime(identifier)}\"" if identifier - cmd << " #{shell_quote path_with_project}" - shellout(cmd) do |io| - io.each_line(){|line| - fields=line.chop.split('/',-1) + cmd_args = %w|rls -e| + cmd_args << "-D" << time_to_cvstime_rlog(identifier) if identifier + cmd_args << path_with_project + scm_cmd(*cmd_args) do |io| + io.each_line() do |line| + fields = line.chop.split('/',-1) logger.debug(">>InspectLine #{fields.inspect}") - if fields[0]!="D" - entries << Entry.new({:name => fields[-5], + time = nil + # Thu Dec 13 16:27:22 2007 + time_l = fields[-3].split(' ') + if time_l.size == 5 && time_l[4].length == 4 + begin + time = Time.parse( + "#{time_l[1]} #{time_l[2]} #{time_l[3]} GMT #{time_l[4]}") + rescue + end + end + entries << Entry.new( + { + :name => fields[-5], #:path => fields[-4].include?(path)?fields[-4]:(path + "/"+ fields[-4]), :path => "#{path}/#{fields[-5]}", :kind => 'file', :size => nil, - :lastrev => Revision.new({ - :revision => fields[-4], - :name => fields[-4], - :time => Time.parse(fields[-3]), - :author => '' + :lastrev => Revision.new( + { + :revision => fields[-4], + :name => fields[-4], + :time => time, + :author => '' + }) }) - }) else - entries << Entry.new({:name => fields[1], + entries << Entry.new( + { + :name => fields[1], :path => "#{path}/#{fields[1]}", :kind => 'dir', :size => nil, :lastrev => nil - }) + }) end - } + end end - return nil if $? && $?.exitstatus != 0 entries.sort_by_name + rescue ScmCommandAborted + nil end STARTLOG="----------------------------" @@ -118,12 +155,12 @@ module Redmine logger.debug " revisions path:'#{path}',identifier_from #{identifier_from}, identifier_to #{identifier_to}" path_with_project="#{url}#{with_leading_slash(path)}" - cmd = "#{self.class.sq_bin} -d #{shell_quote root_url} rlog" - cmd << " -d\">#{time_to_cvstime_rlog(identifier_from)}\"" if identifier_from - cmd << " #{shell_quote path_with_project}" - shellout(cmd) do |io| + cmd_args = %w|rlog| + cmd_args << "-d" << ">#{time_to_cvstime_rlog(identifier_from)}" if identifier_from + cmd_args << path_with_project + scm_cmd(*cmd_args) do |io| state="entry_start" - + commit_log=String.new revision=nil date=nil @@ -132,15 +169,15 @@ module Redmine entry_name=nil file_state=nil branch_map=nil - + io.each_line() do |line| - + if state!="revision" && /^#{ENDLOG}/ =~ line commit_log=String.new revision=nil state="entry_start" end - + if state=="entry_start" branch_map=Hash.new if /^RCS file: #{Regexp.escape(root_url_path)}\/#{Regexp.escape(path_with_project)}(.+),v$/ =~ line @@ -154,15 +191,15 @@ module Redmine elsif /^#{STARTLOG}/ =~ line commit_log=String.new state="revision" - end + end next elsif state=="symbolic" - if /^(.*):\s(.*)/ =~ (line.strip) + if /^(.*):\s(.*)/ =~ (line.strip) branch_map[$1]=$2 else state="tags" next - end + end elsif state=="tags" if /^#{STARTLOG}/ =~ line commit_log = "" @@ -177,15 +214,15 @@ module Redmine revHelper=CvsRevisionHelper.new(revision) revBranch="HEAD" - + branch_map.each() do |branch_name,branch_point| if revHelper.is_in_branch_with_symbol(branch_point) revBranch=branch_name end end - + logger.debug("********** YIELD Revision #{revision}::#{revBranch}") - + yield Revision.new({ :time => date, :author => author, @@ -203,7 +240,7 @@ module Redmine commit_log=String.new revision=nil - + if /^#{ENDLOG}/ =~ line state="entry_start" end @@ -213,7 +250,7 @@ module Redmine if /^branches: (.+)$/ =~ line #TODO: version.branch = $1 elsif /^revision (\d+(?:\.\d+)+).*$/ =~ line - revision = $1 + revision = $1 elsif /^date:\s+(\d+.\d+.\d+\s+\d+:\d+:\d+)/ =~ line date = Time.parse($1) author = /author: ([^;]+)/.match(line)[1] @@ -234,6 +271,8 @@ module Redmine end end end + rescue ScmCommandAborted + Revisions.new end def diff(path, identifier_from, identifier_to=nil) @@ -295,7 +334,7 @@ module Redmine def time_to_cvstime(time) return nil if time.nil? return Time.now if time == 'HEAD' - + unless time.kind_of? Time time = Time.parse(time) end @@ -307,63 +346,78 @@ module Redmine t1 = time.clone.localtime return t1.strftime("%Y-%m-%d %H:%M:%S") end - + def normalize_cvs_path(path) normalize_path(path.gsub(/Attic\//,'')) end - + def normalize_path(path) path.sub(/^(\/)*(.*)/,'\2').sub(/(.*)(,v)+/,'\1') - end - end - + end + + def scm_cmd(*args, &block) + full_args = [CVS_BIN, '-d', root_url] + full_args += args + ret = shellout(full_args.map { |e| shell_quote e.to_s }.join(' '), &block) + if $? && $?.exitstatus != 0 + raise ScmCommandAborted, "cvs exited with non-zero status: #{$?.exitstatus}" + end + ret + end + private :scm_cmd + end + class CvsRevisionHelper attr_accessor :complete_rev, :revision, :base, :branchid - + def initialize(complete_rev) @complete_rev = complete_rev parseRevision() end - + def branchPoint return @base end - + def branchVersion if isBranchRevision return @base+"."+@branchid end return @base end - + def isBranchRevision !@branchid.nil? end - + def prevRev unless @revision==0 return buildRevision(@revision-1) end - return buildRevision(@revision) + return buildRevision(@revision) end - + def is_in_branch_with_symbol(branch_symbol) bpieces=branch_symbol.split(".") branch_start="#{bpieces[0..-3].join(".")}.#{bpieces[-1]}" return (branchVersion==branch_start) end - + private def buildRevision(rev) if rev== 0 - @base - elsif @branchid.nil? + if @branchid.nil? + @base+".0" + else + @base + end + elsif @branchid.nil? @base+"."+rev.to_s else @base+"."+@branchid+"."+rev.to_s end end - + # Interpretiert die cvs revisionsnummern wie z.b. 1.14 oder 1.3.0.15 def parseRevision() pieces=@complete_rev.split(".") @@ -373,7 +427,7 @@ module Redmine @base=pieces[0..-baseSize].join(".") if baseSize > 2 @branchid=pieces[-2] - end + end end end end diff --git a/lib/redmine/scm/adapters/darcs_adapter.rb b/lib/redmine/scm/adapters/darcs_adapter.rb index 4eed61e9..6af646c9 100644 --- a/lib/redmine/scm/adapters/darcs_adapter.rb +++ b/lib/redmine/scm/adapters/darcs_adapter.rb @@ -1,19 +1,15 @@ -# redMine - project management software -# Copyright (C) 2006-2007 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ require 'redmine/scm/adapters/abstract_adapter' require 'rexml/document' @@ -21,7 +17,7 @@ require 'rexml/document' module Redmine module Scm module Adapters - class DarcsAdapter < AbstractAdapter + class DarcsAdapter < AbstractAdapter # Darcs executable name DARCS_BIN = Redmine::Configuration['scm_darcs_command'] || "darcs" @@ -38,8 +34,15 @@ module Redmine @@client_version ||= (darcs_binary_version || []) end + def client_available + !client_version.empty? + end + def darcs_binary_version - darcsversion = darcs_binary_version_from_command_line + darcsversion = darcs_binary_version_from_command_line.dup + if darcsversion.respond_to?(:force_encoding) + darcsversion.force_encoding('ASCII-8BIT') + end if m = darcsversion.match(%r{\A(.*?)((\d+\.)+\d+)}) m[2].scan(%r{\d+}).collect(&:to_i) end @@ -50,7 +53,8 @@ module Redmine end end - def initialize(url, root_url=nil, login=nil, password=nil) + def initialize(url, root_url=nil, login=nil, password=nil, + path_encoding=nil) @url = url @root_url = url end @@ -73,7 +77,7 @@ module Redmine if path.blank? path = ( self.class.client_version_above?([2, 2, 0]) ? @url : '.' ) end - entries = Entries.new + entries = Entries.new cmd = "#{self.class.sq_bin} annotate --repodir #{shell_quote @url} --xml-output" cmd << " --match #{shell_quote("hash #{identifier}")}" if identifier cmd << " #{shell_quote path}" @@ -164,7 +168,7 @@ module Redmine if modified_element.elements['modified_how'].text.match(/removed/) return nil end - + Entry.new({:name => element.attributes['name'], :path => path_prefix + element.attributes['name'], :kind => element.name == 'file' ? 'file' : 'dir', @@ -173,7 +177,7 @@ module Redmine :identifier => nil, :scmid => modified_element.elements['patch'].attributes['hash'] }) - }) + }) end def get_paths_for_patch(hash) diff --git a/lib/redmine/scm/adapters/filesystem_adapter.rb b/lib/redmine/scm/adapters/filesystem_adapter.rb index b88892b5..96402585 100644 --- a/lib/redmine/scm/adapters/filesystem_adapter.rb +++ b/lib/redmine/scm/adapters/filesystem_adapter.rb @@ -1,29 +1,22 @@ -# redMine - project management software -# Copyright (C) 2006-2007 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. # -# FileSystem adapter -# File written by Paul Rivier, at Demotera. +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ require 'redmine/scm/adapters/abstract_adapter' require 'find' module Redmine module Scm - module Adapters + module Adapters class FilesystemAdapter < AbstractAdapter class << self @@ -32,15 +25,17 @@ module Redmine end end - def initialize(url, root_url=nil, login=nil, password=nil) + def initialize(url, root_url=nil, login=nil, password=nil, + path_encoding=nil) @url = with_trailling_slash(url) + @path_encoding = path_encoding || 'UTF-8' end def format_path_ends(path, leading=true, trailling=true) - path = leading ? with_leading_slash(path) : + path = leading ? with_leading_slash(path) : without_leading_slash(path) - trailling ? with_trailling_slash(path) : - without_trailling_slash(path) + trailling ? with_trailling_slash(path) : + without_trailling_slash(path) end def info @@ -51,47 +46,61 @@ module Redmine rescue CommandFailed return nil end - + def entries(path="", identifier=nil) entries = Entries.new - Dir.new(target(path)).each do |e| - relative_path = format_path_ends((format_path_ends(path, - false, - true) + e), - false,false) - target = target(relative_path) - entries << - Entry.new({ :name => File.basename(e), + trgt_utf8 = target(path) + trgt = scm_iconv(@path_encoding, 'UTF-8', trgt_utf8) + Dir.new(trgt).each do |e1| + e_utf8 = scm_iconv('UTF-8', @path_encoding, e1) + next if e_utf8.blank? + relative_path_utf8 = format_path_ends( + (format_path_ends(path,false,true) + e_utf8),false,false) + t1_utf8 = target(relative_path_utf8) + t1 = scm_iconv(@path_encoding, 'UTF-8', t1_utf8) + relative_path = scm_iconv(@path_encoding, 'UTF-8', relative_path_utf8) + e1 = scm_iconv(@path_encoding, 'UTF-8', e_utf8) + if File.exist?(t1) and # paranoid test + %w{file directory}.include?(File.ftype(t1)) and # avoid special types + not File.basename(e1).match(/^\.+$/) # avoid . and .. + p1 = File.readable?(t1) ? relative_path : "" + utf_8_path = scm_iconv('UTF-8', @path_encoding, p1) + entries << + Entry.new({ :name => scm_iconv('UTF-8', @path_encoding, File.basename(e1)), # below : list unreadable files, but dont link them. - :path => File.readable?(target) ? relative_path : "", - :kind => (File.directory?(target) ? 'dir' : 'file'), - :size => (File.directory?(target) ? nil : [File.size(target)].pack('l').unpack('L').first), - :lastrev => - Revision.new({:time => (File.mtime(target)).localtime, - }) - }) if File.exist?(target) and # paranoid test - %w{file directory}.include?(File.ftype(target)) and # avoid special types - not File.basename(e).match(/^\.+$/) # avoid . and .. + :path => utf_8_path, + :kind => (File.directory?(t1) ? 'dir' : 'file'), + :size => (File.directory?(t1) ? nil : [File.size(t1)].pack('l').unpack('L').first), + :lastrev => + Revision.new({:time => (File.mtime(t1)) }) + }) + end end entries.sort_by_name + rescue => err + logger.error "scm: filesystem: error: #{err.message}" + raise CommandFailed.new(err.message) end - + def cat(path, identifier=nil) - File.new(target(path), "rb").read + p = scm_iconv(@path_encoding, 'UTF-8', target(path)) + File.new(p, "rb").read + rescue => err + logger.error "scm: filesystem: error: #{err.message}" + raise CommandFailed.new(err.message) end private - + # AbstractAdapter::target is implicitly made to quote paths. # Here we do not shell-out, so we do not want quotes. def target(path=nil) - #Prevent the use of .. + # Prevent the use of .. if path and !path.match(/(^|\/)\.\.(\/|$)/) return "#{self.url}#{without_leading_slash(path)}" end return self.url end - end end end diff --git a/lib/redmine/scm/adapters/git_adapter.rb b/lib/redmine/scm/adapters/git_adapter.rb index a241f839..641eedbb 100644 --- a/lib/redmine/scm/adapters/git_adapter.rb +++ b/lib/redmine/scm/adapters/git_adapter.rb @@ -1,19 +1,15 @@ -# redMine - project management software -# Copyright (C) 2006-2007 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ require 'redmine/scm/adapters/abstract_adapter' @@ -21,9 +17,15 @@ module Redmine module Scm module Adapters class GitAdapter < AbstractAdapter + + SCM_GIT_REPORT_LAST_COMMIT = true + # Git executable name GIT_BIN = Redmine::Configuration['scm_git_command'] || "git" + # raised if scm command exited with error, e.g. unknown revision. + class ScmCommandAborted < CommandFailed; end + class << self def client_command @@bin ||= GIT_BIN @@ -33,9 +35,33 @@ module Redmine @@sq_bin ||= shell_quote(GIT_BIN) end + def client_version + @@client_version ||= (scm_command_version || []) + end + def client_available !client_version.empty? end + + def scm_command_version + scm_version = scm_version_from_command_line.dup + if scm_version.respond_to?(:force_encoding) + scm_version.force_encoding('ASCII-8BIT') + end + if m = scm_version.match(%r{\A(.*?)((\d+\.)+\d+)}) + m[2].scan(%r{\d+}).collect(&:to_i) + end + end + + def scm_version_from_command_line + shellout("#{sq_bin} --version --no-color") { |io| io.read }.to_s + end + end + + def initialize(url, root_url=nil, login=nil, password=nil, path_encoding=nil) + super + @path_encoding = path_encoding || 'UTF-8' + @flag_report_last_commit = SCM_GIT_REPORT_LAST_COMMIT end def info @@ -49,99 +75,113 @@ module Redmine def branches return @branches if @branches @branches = [] - cmd = "#{self.class.sq_bin} --git-dir #{target('')} branch --no-color" - shellout(cmd) do |io| + cmd_args = %w|branch --no-color| + scm_cmd(*cmd_args) do |io| io.each_line do |line| @branches << line.match('\s*\*?\s*(.*)$')[1] end end @branches.sort! + rescue ScmCommandAborted + nil end def tags return @tags if @tags - cmd = "#{self.class.sq_bin} --git-dir #{target('')} tag" - shellout(cmd) do |io| + cmd_args = %w|tag| + scm_cmd(*cmd_args) do |io| @tags = io.readlines.sort!.map{|t| t.strip} end + rescue ScmCommandAborted + nil end def default_branch - branches.include?('master') ? 'master' : branches.first + bras = self.branches + return nil if bras.nil? + bras.include?('master') ? 'master' : bras.first end - + def entries(path=nil, identifier=nil) path ||= '' + p = scm_iconv(@path_encoding, 'UTF-8', path) entries = Entries.new - cmd = "#{self.class.sq_bin} --git-dir #{target('')} ls-tree -l " - cmd << shell_quote("HEAD:" + path) if identifier.nil? - cmd << shell_quote(identifier + ":" + path) if identifier - shellout(cmd) do |io| + cmd_args = %w|ls-tree -l| + cmd_args << "HEAD:#{p}" if identifier.nil? + cmd_args << "#{identifier}:#{p}" if identifier + scm_cmd(*cmd_args) do |io| io.each_line do |line| e = line.chomp.to_s if e =~ /^\d+\s+(\w+)\s+([0-9a-f]{40})\s+([0-9-]+)\t(.+)$/ type = $1 - sha = $2 + sha = $2 size = $3 name = $4 - full_path = path.empty? ? name : "#{path}/#{name}" - entries << Entry.new({:name => name, - :path => full_path, + if name.respond_to?(:force_encoding) + name.force_encoding(@path_encoding) + end + full_path = p.empty? ? name : "#{p}/#{name}" + n = scm_iconv('UTF-8', @path_encoding, name) + full_p = scm_iconv('UTF-8', @path_encoding, full_path) + entries << Entry.new({:name => n, + :path => full_p, :kind => (type == "tree") ? 'dir' : 'file', :size => (type == "tree") ? nil : size, - :lastrev => lastrev(full_path,identifier) + :lastrev => @flag_report_last_commit ? lastrev(full_path, identifier) : Revision.new }) unless entries.detect{|entry| entry.name == name} end end end - return nil if $? && $?.exitstatus != 0 entries.sort_by_name + rescue ScmCommandAborted + nil end - def lastrev(path,rev) + def lastrev(path, rev) return nil if path.nil? - cmd = "#{self.class.sq_bin} --git-dir #{target('')} log --no-color --date=iso --pretty=fuller --no-merges -n 1 " - cmd << " #{shell_quote rev} " if rev - cmd << "-- #{shell_quote path} " unless path.empty? + cmd_args = %w|log --no-color --encoding=UTF-8 --date=iso --pretty=fuller --no-merges -n 1| + cmd_args << rev if rev + cmd_args << "--" << path unless path.empty? lines = [] - shellout(cmd) { |io| lines = io.readlines } - return nil if $? && $?.exitstatus != 0 + scm_cmd(*cmd_args) { |io| lines = io.readlines } begin id = lines[0].split[1] author = lines[1].match('Author:\s+(.*)$')[1] - time = Time.parse(lines[4].match('CommitDate:\s+(.*)$')[1]).localtime + time = Time.parse(lines[4].match('CommitDate:\s+(.*)$')[1]) Revision.new({ :identifier => id, :scmid => id, - :author => author, + :author => author, :time => time, - :message => nil, - :paths => nil - }) + :message => nil, + :paths => nil + }) rescue NoMethodError => e logger.error("The revision '#{path}' has a wrong format") return nil end + rescue ScmCommandAborted + nil end def revisions(path, identifier_from, identifier_to, options={}) revisions = Revisions.new + cmd_args = %w|log --no-color --encoding=UTF-8 --raw --date=iso --pretty=fuller| + cmd_args << "--reverse" if options[:reverse] + cmd_args << "--all" if options[:all] + cmd_args << "-n" << "#{options[:limit].to_i}" if options[:limit] + from_to = "" + from_to << "#{identifier_from}.." if identifier_from + from_to << "#{identifier_to}" if identifier_to + cmd_args << from_to if !from_to.empty? + cmd_args << "--since=#{options[:since].strftime("%Y-%m-%d %H:%M:%S")}" if options[:since] + cmd_args << "--" << scm_iconv(@path_encoding, 'UTF-8', path) if path && !path.empty? - cmd = "#{self.class.sq_bin} --git-dir #{target('')} log --no-color --raw --date=iso --pretty=fuller " - cmd << " --reverse " if options[:reverse] - cmd << " --all " if options[:all] - cmd << " -n #{options[:limit].to_i} " if options[:limit] - cmd << "#{shell_quote(identifier_from + '..')}" if identifier_from - cmd << "#{shell_quote identifier_to}" if identifier_to - cmd << " --since=#{shell_quote(options[:since].strftime("%Y-%m-%d %H:%M:%S"))}" if options[:since] - cmd << " -- #{shell_quote path}" if path && !path.empty? - - shellout(cmd) do |io| + scm_cmd *cmd_args do |io| files=[] changeset = {} parsing_descr = 0 #0: not parsing desc or files, 1: parsing desc, 2: parsing files - revno = 1 io.each_line do |line| if line =~ /^commit ([0-9a-f]{40})$/ @@ -164,7 +204,6 @@ module Redmine end changeset = {} files = [] - revno = revno + 1 end changeset[:commit] = $1 elsif (parsing_descr == 0) && line =~ /^(\w+):\s*(.*)$/ @@ -179,23 +218,25 @@ module Redmine parsing_descr = 1 changeset[:description] = "" elsif (parsing_descr == 1 || parsing_descr == 2) \ - && line =~ /^:\d+\s+\d+\s+[0-9a-f.]+\s+[0-9a-f.]+\s+(\w)\t(.+)$/ + && line =~ /^:\d+\s+\d+\s+[0-9a-f.]+\s+[0-9a-f.]+\s+(\w)\t(.+)$/ parsing_descr = 2 - fileaction = $1 - filepath = $2 - files << {:action => fileaction, :path => filepath} + fileaction = $1 + filepath = $2 + p = scm_iconv('UTF-8', @path_encoding, filepath) + files << {:action => fileaction, :path => p} elsif (parsing_descr == 1 || parsing_descr == 2) \ - && line =~ /^:\d+\s+\d+\s+[0-9a-f.]+\s+[0-9a-f.]+\s+(\w)\d+\s+(\S+)\t(.+)$/ + && line =~ /^:\d+\s+\d+\s+[0-9a-f.]+\s+[0-9a-f.]+\s+(\w)\d+\s+(\S+)\t(.+)$/ parsing_descr = 2 - fileaction = $1 - filepath = $3 - files << {:action => fileaction, :path => filepath} + fileaction = $1 + filepath = $3 + p = scm_iconv('UTF-8', @path_encoding, filepath) + files << {:action => fileaction, :path => p} elsif (parsing_descr == 1) && line.chomp.to_s == "" parsing_descr = 2 elsif (parsing_descr == 1) changeset[:description] << line[4..-1] end - end + end if changeset[:commit] revision = Revision.new({ @@ -214,38 +255,38 @@ module Redmine end end end - - return nil if $? && $?.exitstatus != 0 + revisions + rescue ScmCommandAborted revisions end def diff(path, identifier_from, identifier_to=nil) path ||= '' - + cmd_args = [] if identifier_to - cmd = "#{self.class.sq_bin} --git-dir #{target('')} diff --no-color #{shell_quote identifier_to} #{shell_quote identifier_from}" + cmd_args << "diff" << "--no-color" << identifier_to << identifier_from else - cmd = "#{self.class.sq_bin} --git-dir #{target('')} show --no-color #{shell_quote identifier_from}" + cmd_args << "show" << "--no-color" << identifier_from end - - cmd << " -- #{shell_quote path}" unless path.empty? + cmd_args << "--" << scm_iconv(@path_encoding, 'UTF-8', path) unless path.empty? diff = [] - shellout(cmd) do |io| + scm_cmd *cmd_args do |io| io.each_line do |line| diff << line end end - return nil if $? && $?.exitstatus != 0 diff + rescue ScmCommandAborted + nil end - + def annotate(path, identifier=nil) identifier = 'HEAD' if identifier.blank? - cmd = "#{self.class.sq_bin} --git-dir #{target('')} blame -p #{shell_quote identifier} -- #{shell_quote path}" + cmd_args = %w|blame| + cmd_args << "-p" << identifier << "--" << scm_iconv(@path_encoding, 'UTF-8', path) blame = Annotate.new content = nil - shellout(cmd) { |io| io.binmode; content = io.read } - return nil if $? && $?.exitstatus != 0 + scm_cmd(*cmd_args) { |io| io.binmode; content = io.read } # git annotates binary files return nil if content.is_binary_data? identifier = '' @@ -257,26 +298,32 @@ module Redmine elsif line =~ /^author (.+)/ authors_by_commit[identifier] = $1.strip elsif line =~ /^\t(.*)/ - blame.add_line($1, Revision.new(:identifier => identifier, :author => authors_by_commit[identifier])) + blame.add_line($1, Revision.new( + :identifier => identifier, + :author => authors_by_commit[identifier])) identifier = '' author = '' end end blame + rescue ScmCommandAborted + nil end - + def cat(path, identifier=nil) if identifier.nil? identifier = 'HEAD' end - cmd = "#{self.class.sq_bin} --git-dir #{target('')} show --no-color #{shell_quote(identifier + ':' + path)}" + cmd_args = %w|show --no-color| + cmd_args << "#{identifier}:#{scm_iconv(@path_encoding, 'UTF-8', path)}" cat = nil - shellout(cmd) do |io| + scm_cmd(*cmd_args) do |io| io.binmode cat = io.read end - return nil if $? && $?.exitstatus != 0 cat + rescue ScmCommandAborted + nil end class Revision < Redmine::Scm::Adapters::Revision @@ -285,6 +332,21 @@ module Redmine identifier[0,8] end end + + def scm_cmd(*args, &block) + repo_path = root_url || url + full_args = [GIT_BIN, '--git-dir', repo_path] + if self.class.client_version_above?([1, 7, 2]) + full_args << '-c' << 'core.quotepath=false' + end + full_args += args + ret = shellout(full_args.map { |e| shell_quote e.to_s }.join(' '), &block) + if $? && $?.exitstatus != 0 + raise ScmCommandAborted, "git exited with non-zero status: #{$?.exitstatus}" + end + ret + end + private :scm_cmd end end end diff --git a/lib/redmine/scm/adapters/mercurial/redminehelper.py b/lib/redmine/scm/adapters/mercurial/redminehelper.py new file mode 100644 index 00000000..7b3b639f --- /dev/null +++ b/lib/redmine/scm/adapters/mercurial/redminehelper.py @@ -0,0 +1,219 @@ +# redminehelper: Redmine helper extension for Mercurial +# +# Copyright 2010 Alessio Franceschelli (alefranz.net) +# Copyright 2010-2011 Yuya Nishihara +# +# This software may be used and distributed according to the terms of the +# GNU General Public License version 2 or any later version. +"""helper commands for Redmine to reduce the number of hg calls + +To test this extension, please try:: + + $ hg --config extensions.redminehelper=redminehelper.py rhsummary + +I/O encoding: + +:file path: urlencoded, raw string +:tag name: utf-8 +:branch name: utf-8 +:node: 12-digits (short) hex string + +Output example of rhsummary:: + + + + + + + + ... + + + +Output example of rhmanifest:: + + + + + + + ... + + ... + + + +""" +import re, time, cgi, urllib +from mercurial import cmdutil, commands, node, error + +_x = cgi.escape +_u = lambda s: cgi.escape(urllib.quote(s)) + +def _tip(ui, repo): + # see mercurial/commands.py:tip + def tiprev(): + try: + return len(repo) - 1 + except TypeError: # Mercurial < 1.1 + return repo.changelog.count() - 1 + tipctx = repo.changectx(tiprev()) + ui.write('\n' + % (tipctx.rev(), _x(node.short(tipctx.node())))) + +_SPECIAL_TAGS = ('tip',) + +def _tags(ui, repo): + # see mercurial/commands.py:tags + for t, n in reversed(repo.tagslist()): + if t in _SPECIAL_TAGS: + continue + try: + r = repo.changelog.rev(n) + except error.LookupError: + continue + ui.write('\n' + % (r, _x(node.short(n)), _x(t))) + +def _branches(ui, repo): + # see mercurial/commands.py:branches + def iterbranches(): + for t, n in repo.branchtags().iteritems(): + yield t, n, repo.changelog.rev(n) + def branchheads(branch): + try: + return repo.branchheads(branch, closed=False) + except TypeError: # Mercurial < 1.2 + return repo.branchheads(branch) + for t, n, r in sorted(iterbranches(), key=lambda e: e[2], reverse=True): + if repo.lookup(r) in branchheads(t): + ui.write('\n' + % (r, _x(node.short(n)), _x(t))) + +def _manifest(ui, repo, path, rev): + ctx = repo.changectx(rev) + ui.write('\n' + % (ctx.rev(), _u(path))) + + known = set() + pathprefix = (path.rstrip('/') + '/').lstrip('/') + for f, n in sorted(ctx.manifest().iteritems(), key=lambda e: e[0]): + if not f.startswith(pathprefix): + continue + name = re.sub(r'/.*', '/', f[len(pathprefix):]) + if name in known: + continue + known.add(name) + + if name.endswith('/'): + ui.write('\n' + % _x(urllib.quote(name[:-1]))) + else: + fctx = repo.filectx(f, fileid=n) + tm, tzoffset = fctx.date() + ui.write('\n' + % (_u(name), fctx.rev(), _x(node.short(fctx.node())), + tm, fctx.size(), )) + + ui.write('\n') + +def rhannotate(ui, repo, *pats, **opts): + rev = urllib.unquote_plus(opts.pop('rev', None)) + opts['rev'] = rev + return commands.annotate(ui, repo, *map(urllib.unquote_plus, pats), **opts) + +def rhcat(ui, repo, file1, *pats, **opts): + rev = urllib.unquote_plus(opts.pop('rev', None)) + opts['rev'] = rev + return commands.cat(ui, repo, urllib.unquote_plus(file1), *map(urllib.unquote_plus, pats), **opts) + +def rhdiff(ui, repo, *pats, **opts): + """diff repository (or selected files)""" + change = opts.pop('change', None) + if change: # add -c option for Mercurial<1.1 + base = repo.changectx(change).parents()[0].rev() + opts['rev'] = [str(base), change] + opts['nodates'] = True + return commands.diff(ui, repo, *map(urllib.unquote_plus, pats), **opts) + +def rhlog(ui, repo, *pats, **opts): + rev = opts.pop('rev') + bra0 = opts.pop('branch') + from_rev = urllib.unquote_plus(opts.pop('from', None)) + to_rev = urllib.unquote_plus(opts.pop('to' , None)) + bra = urllib.unquote_plus(opts.pop('rhbranch', None)) + from_rev = from_rev.replace('"', '\\"') + to_rev = to_rev.replace('"', '\\"') + opts['rev'] = ['"%s":"%s"' % (from_rev, to_rev)] + opts['branch'] = [bra] + return commands.log(ui, repo, *map(urllib.unquote_plus, pats), **opts) + +def rhmanifest(ui, repo, path='', **opts): + """output the sub-manifest of the specified directory""" + ui.write('\n') + ui.write('\n') + ui.write('\n' % _u(repo.root)) + try: + _manifest(ui, repo, urllib.unquote_plus(path), urllib.unquote_plus(opts.get('rev'))) + finally: + ui.write('\n') + ui.write('\n') + +def rhsummary(ui, repo, **opts): + """output the summary of the repository""" + ui.write('\n') + ui.write('\n') + ui.write('\n' % _u(repo.root)) + try: + _tip(ui, repo) + _tags(ui, repo) + _branches(ui, repo) + # TODO: bookmarks in core (Mercurial>=1.8) + finally: + ui.write('\n') + ui.write('\n') + +# This extension should be compatible with Mercurial 0.9.5. +# Note that Mercurial 0.9.5 doesn't have extensions.wrapfunction(). +cmdtable = { + 'rhannotate': (rhannotate, + [('r', 'rev', '', 'revision'), + ('u', 'user', None, 'list the author (long with -v)'), + ('n', 'number', None, 'list the revision number (default)'), + ('c', 'changeset', None, 'list the changeset'), + ], + 'hg rhannotate [-r REV] [-u] [-n] [-c] FILE...'), + 'rhcat': (rhcat, + [('r', 'rev', '', 'revision')], + 'hg rhcat ([-r REV] ...) FILE...'), + 'rhdiff': (rhdiff, + [('r', 'rev', [], 'revision'), + ('c', 'change', '', 'change made by revision')], + 'hg rhdiff ([-c REV] | [-r REV] ...) [FILE]...'), + 'rhlog': (rhlog, + [ + ('r', 'rev', [], 'show the specified revision'), + ('b', 'branch', [], + 'show changesets within the given named branch', 'BRANCH'), + ('l', 'limit', '', + 'limit number of changes displayed', 'NUM'), + ('d', 'date', '', + 'show revisions matching date spec', 'DATE'), + ('u', 'user', [], + 'revisions committed by user', 'USER'), + ('', 'from', '', + '', ''), + ('', 'to', '', + '', ''), + ('', 'rhbranch', '', + '', ''), + ('', 'template', '', + 'display with template', 'TEMPLATE')], + 'hg rhlog [OPTION]... [FILE]'), + 'rhmanifest': (rhmanifest, + [('r', 'rev', '', 'show the specified revision')], + 'hg rhmanifest [-r REV] [PATH]'), + 'rhsummary': (rhsummary, [], 'hg rhsummary'), +} diff --git a/lib/redmine/scm/adapters/mercurial_adapter.rb b/lib/redmine/scm/adapters/mercurial_adapter.rb index f8f925d4..63bbbbb8 100644 --- a/lib/redmine/scm/adapters/mercurial_adapter.rb +++ b/lib/redmine/scm/adapters/mercurial_adapter.rb @@ -1,19 +1,15 @@ -# redMine - project management software -# Copyright (C) 2006-2007 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ require 'redmine/scm/adapters/abstract_adapter' require 'cgi' @@ -25,10 +21,14 @@ module Redmine # Mercurial executable name HG_BIN = Redmine::Configuration['scm_mercurial_command'] || "hg" - TEMPLATES_DIR = File.dirname(__FILE__) + "/mercurial" + HELPERS_DIR = File.dirname(__FILE__) + "/mercurial" + HG_HELPER_EXT = "#{HELPERS_DIR}/redminehelper.py" TEMPLATE_NAME = "hg-template" TEMPLATE_EXTENSION = "tmpl" + # raised if hg command exited with error, e.g. unknown revision. + class HgCommandAborted < CommandFailed; end + class << self def client_command @@bin ||= HG_BIN @@ -50,7 +50,10 @@ module Redmine # The hg version is expressed either as a # release number (eg 0.9.5 or 1.0) or as a revision # id composed of 12 hexa characters. - theversion = hgversion_from_command_line + theversion = hgversion_from_command_line.dup + if theversion.respond_to?(:force_encoding) + theversion.force_encoding('ASCII-8BIT') + end if m = theversion.match(%r{\A(.*?)((\d+\.)+\d+)}) m[2].scan(%r{\d+}).collect(&:to_i) end @@ -70,153 +73,204 @@ module Redmine else ver = "0.9.5" end - "#{TEMPLATES_DIR}/#{TEMPLATE_NAME}-#{ver}.#{TEMPLATE_EXTENSION}" + "#{HELPERS_DIR}/#{TEMPLATE_NAME}-#{ver}.#{TEMPLATE_EXTENSION}" end end + def initialize(url, root_url=nil, login=nil, password=nil, path_encoding=nil) + super + @path_encoding = path_encoding || 'UTF-8' + end + def info - cmd = "#{self.class.sq_bin} -R #{target('')} root" - root_url = nil - shellout(cmd) do |io| - root_url = io.read - end - return nil if $? && $?.exitstatus != 0 - info = Info.new({:root_url => root_url.chomp, - :lastrev => revisions(nil,nil,nil,{:limit => 1}).last - }) - info - rescue CommandFailed - return nil + tip = summary['repository']['tip'] + Info.new(:root_url => CGI.unescape(summary['repository']['root']), + :lastrev => Revision.new(:revision => tip['revision'], + :scmid => tip['node'])) end + def tags + as_ary(summary['repository']['tag']).map { |e| e['name'] } + end + + # Returns map of {'tag' => 'nodeid', ...} + def tagmap + alist = as_ary(summary['repository']['tag']).map do |e| + e.values_at('name', 'node') + end + Hash[*alist.flatten] + end + + def branches + as_ary(summary['repository']['branch']).map { |e| e['name'] } + end + + # Returns map of {'branch' => 'nodeid', ...} + def branchmap + alist = as_ary(summary['repository']['branch']).map do |e| + e.values_at('name', 'node') + end + Hash[*alist.flatten] + end + + def summary + return @summary if @summary + hg 'rhsummary' do |io| + output = io.read + if output.respond_to?(:force_encoding) + output.force_encoding('UTF-8') + end + begin + @summary = ActiveSupport::XmlMini.parse(output)['rhsummary'] + rescue + end + end + end + private :summary + def entries(path=nil, identifier=nil) - path ||= '' - entries = Entries.new - cmd = "#{self.class.sq_bin} -R #{target('')} --cwd #{target('')} locate" - cmd << " -r #{hgrev(identifier)}" - cmd << " " + shell_quote("path:#{path}") unless path.empty? - shellout(cmd) do |io| - io.each_line do |line| - # HG uses antislashs as separator on Windows - line = line.gsub(/\\/, "/") - if path.empty? or e = line.gsub!(%r{^#{with_trailling_slash(path)}},'') - e ||= line - e = e.chomp.split(%r{[\/\\]}) - entries << Entry.new({:name => e.first, - :path => (path.nil? or path.empty? ? e.first : "#{with_trailling_slash(path)}#{e.first}"), - :kind => (e.size > 1 ? 'dir' : 'file'), - :lastrev => Revision.new - }) unless e.empty? || entries.detect{|entry| entry.name == e.first} - end + p1 = scm_iconv(@path_encoding, 'UTF-8', path) + manifest = hg('rhmanifest', '-r', CGI.escape(hgrev(identifier)), + CGI.escape(without_leading_slash(p1.to_s))) do |io| + output = io.read + if output.respond_to?(:force_encoding) + output.force_encoding('UTF-8') + end + begin + ActiveSupport::XmlMini.parse(output)['rhmanifest']['repository']['manifest'] + rescue end end - return nil if $? && $?.exitstatus != 0 - entries.sort_by_name + path_prefix = path.blank? ? '' : with_trailling_slash(path) + + entries = Entries.new + as_ary(manifest['dir']).each do |e| + n = scm_iconv('UTF-8', @path_encoding, CGI.unescape(e['name'])) + p = "#{path_prefix}#{n}" + entries << Entry.new(:name => n, :path => p, :kind => 'dir') + end + + as_ary(manifest['file']).each do |e| + n = scm_iconv('UTF-8', @path_encoding, CGI.unescape(e['name'])) + p = "#{path_prefix}#{n}" + lr = Revision.new(:revision => e['revision'], :scmid => e['node'], + :identifier => e['node'], + :time => Time.at(e['time'].to_i)) + entries << Entry.new(:name => n, :path => p, :kind => 'file', + :size => e['size'].to_i, :lastrev => lr) + end + + entries + rescue HgCommandAborted + nil # means not found end - # Fetch the revisions by using a template file that - # makes Mercurial produce a xml output. - def revisions(path=nil, identifier_from=nil, identifier_to=nil, options={}) - revisions = Revisions.new - cmd = "#{self.class.sq_bin} --debug --encoding utf8 -R #{target('')} log -C --style #{shell_quote self.class.template_path}" - if identifier_from && identifier_to - cmd << " -r #{hgrev(identifier_from)}:#{hgrev(identifier_to)}" - elsif identifier_from - cmd << " -r #{hgrev(identifier_from)}:" - end - cmd << " --limit #{options[:limit].to_i}" if options[:limit] - cmd << " #{shell_quote path}" unless path.blank? - shellout(cmd) do |io| - begin - # HG doesn't close the XML Document... - doc = REXML::Document.new(io.read << "") - doc.elements.each("log/logentry") do |logentry| - paths = [] - copies = logentry.get_elements('paths/path-copied') - logentry.elements.each("paths/path") do |path| - # Detect if the added file is a copy - if path.attributes['action'] == 'A' and c = copies.find{ |e| e.text == path.text } - from_path = c.attributes['copyfrom-path'] - from_rev = logentry.attributes['revision'] - end - paths << {:action => path.attributes['action'], - :path => "/#{CGI.unescape(path.text)}", - :from_path => from_path ? "/#{CGI.unescape(from_path)}" : nil, - :from_revision => from_rev ? from_rev : nil - } - end - paths.sort! { |x,y| x[:path] <=> y[:path] } + def revisions(path=nil, identifier_from=nil, identifier_to=nil, options={}) + revs = Revisions.new + each_revision(path, identifier_from, identifier_to, options) { |e| revs << e } + revs + end - revisions << Revision.new({:identifier => logentry.attributes['revision'], - :scmid => logentry.attributes['node'], - :author => (logentry.elements['author'] ? logentry.elements['author'].text : ""), - :time => Time.parse(logentry.elements['date'].text).localtime, - :message => logentry.elements['msg'].text, - :paths => paths - }) - end + # Iterates the revisions by using a template file that + # makes Mercurial produce a xml output. + def each_revision(path=nil, identifier_from=nil, identifier_to=nil, options={}) + hg_args = ['log', '--debug', '-C', '--style', self.class.template_path] + hg_args << '-r' << "#{hgrev(identifier_from)}:#{hgrev(identifier_to)}" + hg_args << '--limit' << options[:limit] if options[:limit] + hg_args << hgtarget(path) unless path.blank? + log = hg(*hg_args) do |io| + output = io.read + if output.respond_to?(:force_encoding) + output.force_encoding('UTF-8') + end + begin + # Mercurial < 1.5 does not support footer template for '' + ActiveSupport::XmlMini.parse("#{output}")['log'] rescue - logger.debug($!) end end - return nil if $? && $?.exitstatus != 0 - revisions + + as_ary(log['logentry']).each do |le| + cpalist = as_ary(le['paths']['path-copied']).map do |e| + [e['__content__'], e['copyfrom-path']].map do |s| + scm_iconv('UTF-8', @path_encoding, CGI.unescape(s)) + end + end + cpmap = Hash[*cpalist.flatten] + + paths = as_ary(le['paths']['path']).map do |e| + p = scm_iconv('UTF-8', @path_encoding, CGI.unescape(e['__content__']) ) + {:action => e['action'], :path => with_leading_slash(p), + :from_path => (cpmap.member?(p) ? with_leading_slash(cpmap[p]) : nil), + :from_revision => (cpmap.member?(p) ? le['revision'] : nil)} + end.sort { |a, b| a[:path] <=> b[:path] } + + yield Revision.new(:revision => le['revision'], + :scmid => le['node'], + :author => (le['author']['__content__'] rescue ''), + :time => Time.parse(le['date']['__content__']), + :message => le['msg']['__content__'], + :paths => paths) + end + self + end + + # Returns list of nodes in the specified branch + def nodes_in_branch(branch, options={}) + hg_args = ['rhlog', '--template', '{node|short}\n', '--rhbranch', CGI.escape(branch)] + hg_args << '--from' << CGI.escape(branch) + hg_args << '--to' << '0' + hg_args << '--limit' << options[:limit] if options[:limit] + hg(*hg_args) { |io| io.readlines.map { |e| e.chomp } } end def diff(path, identifier_from, identifier_to=nil) - path ||= '' - diff_args = '' - diff = [] + hg_args = %w|rhdiff| if identifier_to - diff_args = "-r #{hgrev(identifier_to)} -r #{hgrev(identifier_from)}" + hg_args << '-r' << hgrev(identifier_to) << '-r' << hgrev(identifier_from) else - if self.class.client_version_above?([1, 2]) - diff_args = "-c #{hgrev(identifier_from)}" - else - return [] - end + hg_args << '-c' << hgrev(identifier_from) end - cmd = "#{self.class.sq_bin} -R #{target('')} --config diff.git=false diff --nodates #{diff_args}" - cmd << " -I #{target(path)}" unless path.empty? - shellout(cmd) do |io| + unless path.blank? + p = scm_iconv(@path_encoding, 'UTF-8', path) + hg_args << CGI.escape(hgtarget(p)) + end + diff = [] + hg *hg_args do |io| io.each_line do |line| diff << line end end - return nil if $? && $?.exitstatus != 0 diff + rescue HgCommandAborted + nil # means not found end def cat(path, identifier=nil) - cmd = "#{self.class.sq_bin} -R #{target('')} cat" - cmd << " -r #{hgrev(identifier)}" - cmd << " #{target(path)}" - cat = nil - shellout(cmd) do |io| + p = CGI.escape(scm_iconv(@path_encoding, 'UTF-8', path)) + hg 'rhcat', '-r', CGI.escape(hgrev(identifier)), hgtarget(p) do |io| io.binmode - cat = io.read + io.read end - return nil if $? && $?.exitstatus != 0 - cat + rescue HgCommandAborted + nil # means not found end def annotate(path, identifier=nil) - path ||= '' - cmd = "#{self.class.sq_bin} -R #{target('')}" - cmd << " annotate -ncu" - cmd << " -r #{hgrev(identifier)}" - cmd << " #{target(path)}" + p = CGI.escape(scm_iconv(@path_encoding, 'UTF-8', path)) blame = Annotate.new - shellout(cmd) do |io| + hg 'rhannotate', '-ncu', '-r', CGI.escape(hgrev(identifier)), hgtarget(p) do |io| io.each_line do |line| + line.force_encoding('ASCII-8BIT') if line.respond_to?(:force_encoding) next unless line =~ %r{^([^:]+)\s(\d+)\s([0-9a-f]+):\s(.*)$} r = Revision.new(:author => $1.strip, :revision => $2, :scmid => $3, :identifier => $3) blame.add_line($4.rstrip, r) end end - return nil if $? && $?.exitstatus != 0 blame + rescue HgCommandAborted + nil # means not found or cannot be annotated end class Revision < Redmine::Scm::Adapters::Revision @@ -226,11 +280,40 @@ module Redmine end end + # Runs 'hg' command with the given args + def hg(*args, &block) + repo_path = root_url || url + full_args = [HG_BIN, '-R', repo_path, '--encoding', 'utf-8'] + full_args << '--config' << "extensions.redminehelper=#{HG_HELPER_EXT}" + full_args << '--config' << 'diff.git=false' + full_args += args + ret = shellout(full_args.map { |e| shell_quote e.to_s }.join(' '), &block) + if $? && $?.exitstatus != 0 + raise HgCommandAborted, "hg exited with non-zero status: #{$?.exitstatus}" + end + ret + end + private :hg + # Returns correct revision identifier - def hgrev(identifier) - shell_quote(identifier.blank? ? 'tip' : identifier.to_s) + def hgrev(identifier, sq=false) + rev = identifier.blank? ? 'tip' : identifier.to_s + rev = shell_quote(rev) if sq + rev end private :hgrev + + def hgtarget(path) + path ||= '' + root_url + '/' + without_leading_slash(path) + end + private :hgtarget + + def as_ary(o) + return [] unless o + o.is_a?(Array) ? o : Array[o] + end + private :as_ary end end end diff --git a/lib/redmine/scm/adapters/subversion_adapter.rb b/lib/redmine/scm/adapters/subversion_adapter.rb index c17d7a5e..89b8e8ec 100644 --- a/lib/redmine/scm/adapters/subversion_adapter.rb +++ b/lib/redmine/scm/adapters/subversion_adapter.rb @@ -1,264 +1,278 @@ -# Redmine - project management software -# Copyright (C) 2006-2010 Jean-Philippe Lang -# -# 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 -# of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - -require 'redmine/scm/adapters/abstract_adapter' -require 'uri' - -module Redmine - module Scm - module Adapters - class SubversionAdapter < AbstractAdapter - - # SVN executable name - SVN_BIN = Redmine::Configuration['scm_subversion_command'] || "svn" - - class << self - def client_command - @@bin ||= SVN_BIN - end - - def sq_bin - @@sq_bin ||= shell_quote(SVN_BIN) - end - - def client_version - @@client_version ||= (svn_binary_version || []) - end - - def svn_binary_version - cmd = "#{sq_bin} --version" - version = nil - shellout(cmd) do |io| - # Read svn version in first returned line - if m = io.read.to_s.match(%r{\A(.*?)((\d+\.)+\d+)}) - version = m[2].scan(%r{\d+}).collect(&:to_i) - end - end - return nil if $? && $?.exitstatus != 0 - version - end - end - - # Get info about the svn repository - def info - cmd = "#{self.class.sq_bin} info --xml #{target}" - cmd << credentials_string - info = nil - shellout(cmd) do |io| - output = io.read - begin - doc = ActiveSupport::XmlMini.parse(output) - #root_url = doc.elements["info/entry/repository/root"].text - info = Info.new({:root_url => doc['info']['entry']['repository']['root']['__content__'], - :lastrev => Revision.new({ - :identifier => doc['info']['entry']['commit']['revision'], - :time => Time.parse(doc['info']['entry']['commit']['date']['__content__']).localtime, - :author => (doc['info']['entry']['commit']['author'] ? doc['info']['entry']['commit']['author']['__content__'] : "") - }) - }) - rescue - end - end - return nil if $? && $?.exitstatus != 0 - info - rescue CommandFailed - return nil - end - - # Returns an Entries collection - # or nil if the given path doesn't exist in the repository - def entries(path=nil, identifier=nil) - path ||= '' - identifier = (identifier and identifier.to_i > 0) ? identifier.to_i : "HEAD" - entries = Entries.new - cmd = "#{self.class.sq_bin} list --xml #{target(path)}@#{identifier}" - cmd << credentials_string - shellout(cmd) do |io| - output = io.read - begin - doc = ActiveSupport::XmlMini.parse(output) - each_xml_element(doc['lists']['list'], 'entry') do |entry| - commit = entry['commit'] - commit_date = commit['date'] - # Skip directory if there is no commit date (usually that - # means that we don't have read access to it) - next if entry['kind'] == 'dir' && commit_date.nil? - name = entry['name']['__content__'] - entries << Entry.new({:name => URI.unescape(name), - :path => ((path.empty? ? "" : "#{path}/") + name), - :kind => entry['kind'], - :size => ((s = entry['size']) ? s['__content__'].to_i : nil), - :lastrev => Revision.new({ - :identifier => commit['revision'], - :time => Time.parse(commit_date['__content__'].to_s).localtime, - :author => ((a = commit['author']) ? a['__content__'] : nil) - }) - }) - end - rescue Exception => e - logger.error("Error parsing svn output: #{e.message}") - logger.error("Output was:\n #{output}") - end - end - return nil if $? && $?.exitstatus != 0 - logger.debug("Found #{entries.size} entries in the repository for #{target(path)}") if logger && logger.debug? - entries.sort_by_name - end - - def properties(path, identifier=nil) - # proplist xml output supported in svn 1.5.0 and higher - return nil unless self.class.client_version_above?([1, 5, 0]) - - identifier = (identifier and identifier.to_i > 0) ? identifier.to_i : "HEAD" - cmd = "#{self.class.sq_bin} proplist --verbose --xml #{target(path)}@#{identifier}" - cmd << credentials_string - properties = {} - shellout(cmd) do |io| - output = io.read - begin - doc = ActiveSupport::XmlMini.parse(output) - each_xml_element(doc['properties']['target'], 'property') do |property| - properties[ property['name'] ] = property['__content__'].to_s - end - rescue - end - end - return nil if $? && $?.exitstatus != 0 - properties - end - - def revisions(path=nil, identifier_from=nil, identifier_to=nil, options={}) - path ||= '' - identifier_from = (identifier_from && identifier_from.to_i > 0) ? identifier_from.to_i : "HEAD" - identifier_to = (identifier_to && identifier_to.to_i > 0) ? identifier_to.to_i : 1 - revisions = Revisions.new - cmd = "#{self.class.sq_bin} log --xml -r #{identifier_from}:#{identifier_to}" - cmd << credentials_string - cmd << " --verbose " if options[:with_paths] - cmd << " --limit #{options[:limit].to_i}" if options[:limit] - cmd << ' ' + target(path) - shellout(cmd) do |io| - output = io.read - begin - doc = ActiveSupport::XmlMini.parse(output) - each_xml_element(doc['log'], 'logentry') do |logentry| - paths = [] - each_xml_element(logentry['paths'], 'path') do |path| - paths << {:action => path['action'], - :path => path['__content__'], - :from_path => path['copyfrom-path'], - :from_revision => path['copyfrom-rev'] - } - end if logentry['paths'] && logentry['paths']['path'] - paths.sort! { |x,y| x[:path] <=> y[:path] } - - revisions << Revision.new({:identifier => logentry['revision'], - :author => (logentry['author'] ? logentry['author']['__content__'] : ""), - :time => Time.parse(logentry['date']['__content__'].to_s).localtime, - :message => logentry['msg']['__content__'], - :paths => paths - }) - end - rescue - end - end - return nil if $? && $?.exitstatus != 0 - revisions - end - - def diff(path, identifier_from, identifier_to=nil, type="inline") - path ||= '' - identifier_from = (identifier_from and identifier_from.to_i > 0) ? identifier_from.to_i : '' - identifier_to = (identifier_to and identifier_to.to_i > 0) ? identifier_to.to_i : (identifier_from.to_i - 1) - - cmd = "#{self.class.sq_bin} diff -r " - cmd << "#{identifier_to}:" - cmd << "#{identifier_from}" - cmd << " #{target(path)}@#{identifier_from}" - cmd << credentials_string - diff = [] - shellout(cmd) do |io| - io.each_line do |line| - diff << line - end - end - return nil if $? && $?.exitstatus != 0 - diff - end - - def cat(path, identifier=nil) - identifier = (identifier and identifier.to_i > 0) ? identifier.to_i : "HEAD" - cmd = "#{self.class.sq_bin} cat #{target(path)}@#{identifier}" - cmd << credentials_string - cat = nil - shellout(cmd) do |io| - io.binmode - cat = io.read - end - return nil if $? && $?.exitstatus != 0 - cat - end - - def annotate(path, identifier=nil) - identifier = (identifier and identifier.to_i > 0) ? identifier.to_i : "HEAD" - cmd = "#{self.class.sq_bin} blame #{target(path)}@#{identifier}" - cmd << credentials_string - blame = Annotate.new - shellout(cmd) do |io| - io.each_line do |line| - next unless line =~ %r{^\s*(\d+)\s*(\S+)\s(.*)$} - blame.add_line($3.rstrip, Revision.new(:identifier => $1.to_i, :author => $2.strip)) - end - end - return nil if $? && $?.exitstatus != 0 - blame - end - - private - - def credentials_string - str = '' - str << " --username #{shell_quote(@login)}" unless @login.blank? - str << " --password #{shell_quote(@password)}" unless @login.blank? || @password.blank? - str << " --no-auth-cache --non-interactive" - str - end - - # Helper that iterates over the child elements of a xml node - # MiniXml returns a hash when a single child is found or an array of hashes for multiple children - def each_xml_element(node, name) - if node && node[name] - if node[name].is_a?(Hash) - yield node[name] - else - node[name].each do |element| - yield element - end - end - end - end - - def target(path = '') - base = path.match(/^\//) ? root_url : url - uri = "#{base}/#{path}" - uri = URI.escape(URI.escape(uri), '[]') - shell_quote(uri.gsub(/[?<>\*]/, '')) - end - end - end - end -end +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + +require 'redmine/scm/adapters/abstract_adapter' +require 'uri' + +module Redmine + module Scm + module Adapters + class SubversionAdapter < AbstractAdapter + + # SVN executable name + SVN_BIN = Redmine::Configuration['scm_subversion_command'] || "svn" + + class << self + def client_command + @@bin ||= SVN_BIN + end + + def sq_bin + @@sq_bin ||= shell_quote(SVN_BIN) + end + + def client_version + @@client_version ||= (svn_binary_version || []) + end + + def client_available + !client_version.empty? + end + + def svn_binary_version + scm_version = scm_version_from_command_line.dup + if scm_version.respond_to?(:force_encoding) + scm_version.force_encoding('ASCII-8BIT') + end + if m = scm_version.match(%r{\A(.*?)((\d+\.)+\d+)}) + m[2].scan(%r{\d+}).collect(&:to_i) + end + end + + def scm_version_from_command_line + shellout("#{sq_bin} --version") { |io| io.read }.to_s + end + end + + # Get info about the svn repository + def info + cmd = "#{self.class.sq_bin} info --xml #{target}" + cmd << credentials_string + info = nil + shellout(cmd) do |io| + output = io.read + if output.respond_to?(:force_encoding) + output.force_encoding('UTF-8') + end + begin + doc = ActiveSupport::XmlMini.parse(output) + #root_url = doc.elements["info/entry/repository/root"].text + info = Info.new({:root_url => doc['info']['entry']['repository']['root']['__content__'], + :lastrev => Revision.new({ + :identifier => doc['info']['entry']['commit']['revision'], + :time => Time.parse(doc['info']['entry']['commit']['date']['__content__']).localtime, + :author => (doc['info']['entry']['commit']['author'] ? doc['info']['entry']['commit']['author']['__content__'] : "") + }) + }) + rescue + end + end + return nil if $? && $?.exitstatus != 0 + info + rescue CommandFailed + return nil + end + + # Returns an Entries collection + # or nil if the given path doesn't exist in the repository + def entries(path=nil, identifier=nil) + path ||= '' + identifier = (identifier and identifier.to_i > 0) ? identifier.to_i : "HEAD" + entries = Entries.new + cmd = "#{self.class.sq_bin} list --xml #{target(path)}@#{identifier}" + cmd << credentials_string + shellout(cmd) do |io| + output = io.read + if output.respond_to?(:force_encoding) + output.force_encoding('UTF-8') + end + begin + doc = ActiveSupport::XmlMini.parse(output) + each_xml_element(doc['lists']['list'], 'entry') do |entry| + commit = entry['commit'] + commit_date = commit['date'] + # Skip directory if there is no commit date (usually that + # means that we don't have read access to it) + next if entry['kind'] == 'dir' && commit_date.nil? + name = entry['name']['__content__'] + entries << Entry.new({:name => URI.unescape(name), + :path => ((path.empty? ? "" : "#{path}/") + name), + :kind => entry['kind'], + :size => ((s = entry['size']) ? s['__content__'].to_i : nil), + :lastrev => Revision.new({ + :identifier => commit['revision'], + :time => Time.parse(commit_date['__content__'].to_s).localtime, + :author => ((a = commit['author']) ? a['__content__'] : nil) + }) + }) + end + rescue Exception => e + logger.error("Error parsing svn output: #{e.message}") + logger.error("Output was:\n #{output}") + end + end + return nil if $? && $?.exitstatus != 0 + logger.debug("Found #{entries.size} entries in the repository for #{target(path)}") if logger && logger.debug? + entries.sort_by_name + end + + def properties(path, identifier=nil) + # proplist xml output supported in svn 1.5.0 and higher + return nil unless self.class.client_version_above?([1, 5, 0]) + + identifier = (identifier and identifier.to_i > 0) ? identifier.to_i : "HEAD" + cmd = "#{self.class.sq_bin} proplist --verbose --xml #{target(path)}@#{identifier}" + cmd << credentials_string + properties = {} + shellout(cmd) do |io| + output = io.read + if output.respond_to?(:force_encoding) + output.force_encoding('UTF-8') + end + begin + doc = ActiveSupport::XmlMini.parse(output) + each_xml_element(doc['properties']['target'], 'property') do |property| + properties[ property['name'] ] = property['__content__'].to_s + end + rescue + end + end + return nil if $? && $?.exitstatus != 0 + properties + end + + def revisions(path=nil, identifier_from=nil, identifier_to=nil, options={}) + path ||= '' + identifier_from = (identifier_from && identifier_from.to_i > 0) ? identifier_from.to_i : "HEAD" + identifier_to = (identifier_to && identifier_to.to_i > 0) ? identifier_to.to_i : 1 + revisions = Revisions.new + cmd = "#{self.class.sq_bin} log --xml -r #{identifier_from}:#{identifier_to}" + cmd << credentials_string + cmd << " --verbose " if options[:with_paths] + cmd << " --limit #{options[:limit].to_i}" if options[:limit] + cmd << ' ' + target(path) + shellout(cmd) do |io| + output = io.read + if output.respond_to?(:force_encoding) + output.force_encoding('UTF-8') + end + begin + doc = ActiveSupport::XmlMini.parse(output) + each_xml_element(doc['log'], 'logentry') do |logentry| + paths = [] + each_xml_element(logentry['paths'], 'path') do |path| + paths << {:action => path['action'], + :path => path['__content__'], + :from_path => path['copyfrom-path'], + :from_revision => path['copyfrom-rev'] + } + end if logentry['paths'] && logentry['paths']['path'] + paths.sort! { |x,y| x[:path] <=> y[:path] } + + revisions << Revision.new({:identifier => logentry['revision'], + :author => (logentry['author'] ? logentry['author']['__content__'] : ""), + :time => Time.parse(logentry['date']['__content__'].to_s).localtime, + :message => logentry['msg']['__content__'], + :paths => paths + }) + end + rescue + end + end + return nil if $? && $?.exitstatus != 0 + revisions + end + + def diff(path, identifier_from, identifier_to=nil, type="inline") + path ||= '' + identifier_from = (identifier_from and identifier_from.to_i > 0) ? identifier_from.to_i : '' + + identifier_to = (identifier_to and identifier_to.to_i > 0) ? identifier_to.to_i : (identifier_from.to_i - 1) + + cmd = "#{self.class.sq_bin} diff -r " + cmd << "#{identifier_to}:" + cmd << "#{identifier_from}" + cmd << " #{target(path)}@#{identifier_from}" + cmd << credentials_string + diff = [] + shellout(cmd) do |io| + io.each_line do |line| + diff << line + end + end + return nil if $? && $?.exitstatus != 0 + diff + end + + def cat(path, identifier=nil) + identifier = (identifier and identifier.to_i > 0) ? identifier.to_i : "HEAD" + cmd = "#{self.class.sq_bin} cat #{target(path)}@#{identifier}" + cmd << credentials_string + cat = nil + shellout(cmd) do |io| + io.binmode + cat = io.read + end + return nil if $? && $?.exitstatus != 0 + cat + end + + def annotate(path, identifier=nil) + identifier = (identifier and identifier.to_i > 0) ? identifier.to_i : "HEAD" + cmd = "#{self.class.sq_bin} blame #{target(path)}@#{identifier}" + cmd << credentials_string + blame = Annotate.new + shellout(cmd) do |io| + io.each_line do |line| + next unless line =~ %r{^\s*(\d+)\s*(\S+)\s(.*)$} + blame.add_line($3.rstrip, Revision.new(:identifier => $1.to_i, :author => $2.strip)) + end + end + return nil if $? && $?.exitstatus != 0 + blame + end + + private + + def credentials_string + str = '' + str << " --username #{shell_quote(@login)}" unless @login.blank? + str << " --password #{shell_quote(@password)}" unless @login.blank? || @password.blank? + str << " --no-auth-cache --non-interactive" + str + end + + # Helper that iterates over the child elements of a xml node + # MiniXml returns a hash when a single child is found or an array of hashes for multiple children + def each_xml_element(node, name) + if node && node[name] + if node[name].is_a?(Hash) + yield node[name] + else + node[name].each do |element| + yield element + end + end + end + end + + def target(path = '') + base = path.match(/^\//) ? root_url : url + uri = "#{base}/#{path}" + uri = URI.escape(URI.escape(uri), '[]') + shell_quote(uri.gsub(/[?<>\*]/, '')) + end + end + end + end +end diff --git a/lib/redmine/scm/base.rb b/lib/redmine/scm/base.rb index 43e8a187..195769b9 100644 --- a/lib/redmine/scm/base.rb +++ b/lib/redmine/scm/base.rb @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + module Redmine module Scm class Base diff --git a/lib/redmine/search.rb b/lib/redmine/search.rb index 153197ea..17bfc974 100644 --- a/lib/redmine/search.rb +++ b/lib/redmine/search.rb @@ -1,39 +1,35 @@ -# Redmine - project management software -# Copyright (C) 2006-2009 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ module Redmine module Search - + mattr_accessor :available_search_types - + @@available_search_types = [] class << self def map(&block) yield self end - + # Registers a search provider def register(search_type, options={}) search_type = search_type.to_s @@available_search_types << search_type unless @@available_search_types.include?(search_type) end end - + module Controller def self.included(base) base.extend(ClassMethods) @@ -42,7 +38,7 @@ module Redmine module ClassMethods @@default_search_scopes = Hash.new {|hash, key| hash[key] = {:default => nil, :actions => {}}} mattr_accessor :default_search_scopes - + # Set the default search scope for a controller or specific actions # Examples: # * search_scope :issues # => sets the search scope to :issues for the whole controller diff --git a/lib/redmine/syntax_highlighting.rb b/lib/redmine/syntax_highlighting.rb index 4455b90c..ff16b967 100644 --- a/lib/redmine/syntax_highlighting.rb +++ b/lib/redmine/syntax_highlighting.rb @@ -1,27 +1,23 @@ -# Redmine - project management software -# Copyright (C) 2006-2010 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ module Redmine module SyntaxHighlighting - + class << self attr_reader :highlighter delegate :highlight_by_filename, :highlight_by_language, :to => :highlighter - + def highlighter=(name) if name.is_a?(Module) @highlighter = name @@ -30,11 +26,11 @@ module Redmine end end end - + module CodeRay require 'coderay' require 'coderay/helpers/file_type' - + class << self # Highlights +text+ as the content of +filename+ # Should not return line numbers nor outer pre tag @@ -42,7 +38,7 @@ module Redmine language = ::CodeRay::FileType[filename] language ? ::CodeRay.scan(text, language).html : ERB::Util.h(text) end - + # Highlights +text+ using +language+ syntax # Should not return outer pre tag def highlight_by_language(text, language) @@ -51,6 +47,6 @@ module Redmine end end end - + SyntaxHighlighting.highlighter = 'CodeRay' end diff --git a/lib/redmine/themes.rb b/lib/redmine/themes.rb index 697b4a31..a30c8307 100644 --- a/lib/redmine/themes.rb +++ b/lib/redmine/themes.rb @@ -1,37 +1,33 @@ -# redMine - project management software -# Copyright (C) 2006-2007 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ module Redmine module Themes - + # Return an array of installed themes def self.themes @@installed_themes ||= scan_themes end - + # Rescan themes directory def self.rescan @@installed_themes = scan_themes end - + # Return theme for given id, or nil if it's not found def self.theme(id, options={}) return nil if id.blank? - + found = themes.find {|t| t.id == id} if found.nil? && options[:rescan] != false rescan @@ -39,11 +35,11 @@ module Redmine end found end - + # Class used to represent a theme class Theme attr_reader :path, :name, :dir - + def initialize(path) @path = path @dir = File.basename(path) @@ -51,43 +47,43 @@ module Redmine @stylesheets = nil @javascripts = nil end - + # Directory name used as the theme id def id; dir end - + def ==(theme) theme.is_a?(Theme) && theme.dir == dir end - + def <=>(theme) name <=> theme.name end - + def stylesheets @stylesheets ||= assets("stylesheets", "css") end - + def javascripts @javascripts ||= assets("javascripts", "js") end - + def stylesheet_path(source) "/themes/#{dir}/stylesheets/#{source}" end - + def javascript_path(source) "/themes/#{dir}/javascripts/#{source}" end - + private - + def assets(dir, ext) Dir.glob("#{path}/#{dir}/*.#{ext}").collect {|f| File.basename(f).gsub(/\.#{ext}$/, '')} end end - + private - + def self.scan_themes theme_paths.inject([]) do |themes, path| dirs = Dir.glob(File.join(path, '*')).select do |f| @@ -116,7 +112,7 @@ module ApplicationHelper end @current_theme end - + def stylesheet_path(source) if current_theme && current_theme.stylesheets.include?(source) super current_theme.stylesheet_path(source) @@ -124,11 +120,11 @@ module ApplicationHelper super end end - + def path_to_stylesheet(source) stylesheet_path source end - + # Returns the header tags for the current theme def heads_for_theme if current_theme && current_theme.javascripts.include?('theme') diff --git a/lib/redmine/unified_diff.rb b/lib/redmine/unified_diff.rb index 09fbfcf1..7d4cd1c2 100644 --- a/lib/redmine/unified_diff.rb +++ b/lib/redmine/unified_diff.rb @@ -1,34 +1,40 @@ -# redMine - project management software -# Copyright (C) 2006-2008 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ module Redmine # Class used to parse unified diffs - class UnifiedDiff < Array + class UnifiedDiff < Array + attr_reader :diff_type + def initialize(diff, options={}) options.assert_valid_keys(:type, :max_lines) diff = diff.split("\n") if diff.is_a?(String) - diff_type = options[:type] || 'inline' - + @diff_type = options[:type] || 'inline' lines = 0 @truncated = false - diff_table = DiffTable.new(diff_type) + diff_table = DiffTable.new(@diff_type) diff.each do |line| + line_encoding = nil + if line.respond_to?(:force_encoding) + line_encoding = line.encoding + # TODO: UTF-16 and Japanese CP932 which is imcompatible with ASCII + # In Japan, diffrence between file path encoding + # and file contents encoding is popular. + line.force_encoding('ASCII-8BIT') + end unless diff_table.add_line line - self << diff_table if diff_table.length > 1 + line.force_encoding(line_encoding) if line_encoding + self << diff_table if diff_table.length > 0 diff_table = DiffTable.new(diff_type) end lines += 1 @@ -40,22 +46,20 @@ module Redmine self << diff_table unless diff_table.empty? self end - + def truncated?; @truncated; end end # Class that represents a file diff - class DiffTable < Hash - attr_reader :file_name, :line_num_l, :line_num_r + class DiffTable < Array + attr_reader :file_name # Initialize with a Diff file and the type of Diff View # The type view must be inline or sbs (side_by_side) def initialize(type="inline") @parsing = false - @nb_line = 1 - @start = false - @before = 'same' - @second = true + @added = 0 + @removed = 0 @type = type end @@ -78,12 +82,22 @@ module Redmine @line_num_l = $2.to_i @line_num_r = $5.to_i else - @nb_line += 1 if parse_line(line, @type) + parse_line(line, @type) end end return true end + def each_line + prev_line_left, prev_line_right = nil, nil + each do |line| + spacing = prev_line_left && prev_line_right && (line.nb_line_left != prev_line_left+1) && (line.nb_line_right != prev_line_right+1) + yield spacing, line + prev_line_left = line.nb_line_left.to_i if line.nb_line_left.to_i > 0 + prev_line_right = line.nb_line_right.to_i if line.nb_line_right.to_i > 0 + end + end + def inspect puts '### DIFF TABLE ###' puts "file : #{file_name}" @@ -92,68 +106,54 @@ module Redmine end end - private - # Test if is a Side By Side type - def sbs?(type, func) - if @start and type == "sbs" - if @before == func and @second - tmp_nb_line = @nb_line - self[tmp_nb_line] = Diff.new - else - @second = false - tmp_nb_line = @start - @start += 1 - @nb_line -= 1 - end - else - tmp_nb_line = @nb_line - @start = @nb_line - self[tmp_nb_line] = Diff.new - @second = true - end - unless self[tmp_nb_line] - @nb_line += 1 - self[tmp_nb_line] = Diff.new - else - self[tmp_nb_line] - end - end + private # Escape the HTML for the diff def escapeHTML(line) CGI.escapeHTML(line) end + def diff_for_added_line + if @type == 'sbs' && @removed > 0 && @added < @removed + self[-(@removed - @added)] + else + diff = Diff.new + self << diff + diff + end + end + def parse_line(line, type="inline") if line[0, 1] == "+" - diff = sbs? type, 'add' - @before = 'add' + diff = diff_for_added_line diff.line_right = escapeHTML line[1..-1] diff.nb_line_right = @line_num_r diff.type_diff_right = 'diff_in' @line_num_r += 1 + @added += 1 true elsif line[0, 1] == "-" - diff = sbs? type, 'remove' - @before = 'remove' + diff = Diff.new diff.line_left = escapeHTML line[1..-1] diff.nb_line_left = @line_num_l diff.type_diff_left = 'diff_out' + self << diff @line_num_l += 1 + @removed += 1 true - elsif line[0, 1] =~ /\s/ - @before = 'same' - @start = false - diff = Diff.new - diff.line_right = escapeHTML line[1..-1] - diff.nb_line_right = @line_num_r - diff.line_left = escapeHTML line[1..-1] - diff.nb_line_left = @line_num_l - self[@nb_line] = diff - @line_num_l += 1 - @line_num_r += 1 - true - elsif line[0, 1] = "\\" + else + write_offsets + if line[0, 1] =~ /\s/ + diff = Diff.new + diff.line_right = escapeHTML line[1..-1] + diff.nb_line_right = @line_num_r + diff.line_left = escapeHTML line[1..-1] + diff.nb_line_left = @line_num_l + self << diff + @line_num_l += 1 + @line_num_r += 1 + true + elsif line[0, 1] = "\\" true else false @@ -161,15 +161,47 @@ module Redmine end end + def write_offsets + if @added > 0 && @added == @removed + @added.times do |i| + line = self[-(1 + i)] + removed = (@type == 'sbs') ? line : self[-(1 + @added + i)] + offsets = offsets(removed.line_left, line.line_right) + removed.offsets = line.offsets = offsets + end + end + @added = 0 + @removed = 0 + end + + def offsets(line_left, line_right) + if line_left.present? && line_right.present? && line_left != line_right + max = [line_left.size, line_right.size].min + starting = 0 + while starting < max && line_left[starting] == line_right[starting] + starting += 1 + end + ending = -1 + while ending >= -(max - starting) && line_left[ending] == line_right[ending] + ending -= 1 + end + unless starting == 0 && ending == -1 + [starting, ending] + end + end + end + end + # A line of diff - class Diff + class Diff attr_accessor :nb_line_left attr_accessor :line_left attr_accessor :nb_line_right attr_accessor :line_right attr_accessor :type_diff_right attr_accessor :type_diff_left - + attr_accessor :offsets + def initialize() self.nb_line_left = '' self.nb_line_right = '' @@ -179,6 +211,38 @@ module Redmine self.type_diff_left = '' end + def type_diff + type_diff_right == 'diff_in' ? type_diff_right : type_diff_left + end + + def line + type_diff_right == 'diff_in' ? line_right : line_left + end + + def html_line_left + if offsets + line_left.dup.insert(offsets.first, '').insert(offsets.last, '') + else + line_left + end + end + + def html_line_right + if offsets + line_right.dup.insert(offsets.first, '').insert(offsets.last, '') + else + line_right + end + end + + def html_line + if offsets + line.dup.insert(offsets.first, '').insert(offsets.last, '') + else + line + end + end + def inspect puts '### Start Line Diff ###' puts self.nb_line_left diff --git a/lib/redmine/utils.rb b/lib/redmine/utils.rb index 02f9d3e6..5e0b05ec 100644 --- a/lib/redmine/utils.rb +++ b/lib/redmine/utils.rb @@ -1,19 +1,15 @@ -# Redmine - project management software -# Copyright (C) 2006-2009 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# See doc/COPYRIGHT.rdoc for more details. +#++ module Redmine module Utils @@ -24,7 +20,7 @@ module Redmine ActionController::Base.relative_url_root.to_s : ActionController::AbstractRequest.relative_url_root.to_s end - + # Sets the relative root url of the application def relative_url_root=(arg) if ActionController::Base.respond_to?('relative_url_root=') diff --git a/lib/redmine/version.rb b/lib/redmine/version.rb index 436acc4a..abd878ef 100644 --- a/lib/redmine/version.rb +++ b/lib/redmine/version.rb @@ -1,11 +1,39 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + require 'rexml/document' module Redmine module VERSION #:nodoc: - MAJOR = 1 - MINOR = 5 - PATCH = 0 + MAJOR = 2 + MINOR = 0 + PATCH = 0 TINY = PATCH # Redmine compat + + # Used by semver to define the special version (if any). + # A special version "satify but have a lower precedence than the associated + # normal version". So 2.0.0RC1 would be part of the 2.0.0 series but + # be considered to be an older version. + # + # 1.4.0 < 2.0.0RC1 < 2.0.0RC2 < 2.0.0 < 2.1.0 + # + # This method may be overridden by third party code to provide vendor or + # distribution specific versions. They may or may not follow semver.org: + # + # 2.0.0debian-2 + def self.special + '' + end def self.revision revision = nil @@ -31,11 +59,11 @@ module Redmine REVISION = self.revision ARRAY = [MAJOR, MINOR, PATCH, REVISION].compact STRING = ARRAY.join('.') - + def self.to_a; ARRAY end - def self.to_s; STRING end + def self.to_s; STRING end def self.to_semver - [MAJOR, MINOR, PATCH].join('.') + [MAJOR, MINOR, PATCH].join('.') + special end end end diff --git a/lib/redmine/views/api_template_handler.rb b/lib/redmine/views/api_template_handler.rb index 4f73227e..47550657 100644 --- a/lib/redmine/views/api_template_handler.rb +++ b/lib/redmine/views/api_template_handler.rb @@ -1,26 +1,22 @@ -# Redmine - project management software -# Copyright (C) 2006-2010 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ module Redmine module Views class ApiTemplateHandler < ActionView::TemplateHandler include ActionView::TemplateHandlers::Compilable - def compile(template) + def compile(template) "Redmine::Views::Builders.for(params[:format]) do |api|; #{template.source}; self.output_buffer = api.output; end" end end diff --git a/lib/redmine/views/builders.rb b/lib/redmine/views/builders.rb index 6e0761c2..453ba48f 100644 --- a/lib/redmine/views/builders.rb +++ b/lib/redmine/views/builders.rb @@ -1,19 +1,15 @@ -# Redmine - project management software -# Copyright (C) 2006-2010 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ module Redmine module Views diff --git a/lib/redmine/views/builders/json.rb b/lib/redmine/views/builders/json.rb index 61037eb3..25d4a61a 100644 --- a/lib/redmine/views/builders/json.rb +++ b/lib/redmine/views/builders/json.rb @@ -1,19 +1,15 @@ -# Redmine - project management software -# Copyright (C) 2006-2010 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ require 'blankslate' diff --git a/lib/redmine/views/builders/structure.rb b/lib/redmine/views/builders/structure.rb index 65ba4747..7ad312cb 100644 --- a/lib/redmine/views/builders/structure.rb +++ b/lib/redmine/views/builders/structure.rb @@ -1,19 +1,15 @@ -# Redmine - project management software -# Copyright (C) 2006-2010 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ require 'blankslate' @@ -24,7 +20,7 @@ module Redmine def initialize @struct = [{}] end - + def array(tag, options={}, &block) @struct << [] block.call(self) @@ -32,7 +28,7 @@ module Redmine @struct.last[tag] = ret @struct.last.merge!(options) if options end - + def method_missing(sym, *args, &block) if args.any? if args.first.is_a?(Hash) @@ -49,7 +45,7 @@ module Redmine end end end - + if block @struct << (args.first.is_a?(Hash) ? args.first : {}) block.call(self) @@ -65,7 +61,7 @@ module Redmine end end end - + def output raise "Need to implement #{self.class.name}#output" end diff --git a/lib/redmine/views/builders/xml.rb b/lib/redmine/views/builders/xml.rb index 1211a1b4..8daf59a7 100644 --- a/lib/redmine/views/builders/xml.rb +++ b/lib/redmine/views/builders/xml.rb @@ -1,19 +1,15 @@ -# Redmine - project management software -# Copyright (C) 2006-2010 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ module Redmine module Views @@ -23,11 +19,11 @@ module Redmine super instruct! end - + def output target! end - + def method_missing(sym, *args, &block) if args.size == 1 && args.first.is_a?(Time) __send__ sym, args.first.xmlschema, &block @@ -35,7 +31,7 @@ module Redmine super end end - + def array(name, options={}, &block) __send__ name, (options || {}).merge(:type => 'array'), &block end diff --git a/lib/redmine/views/my_page/block.rb b/lib/redmine/views/my_page/block.rb index b6ca29f9..410f34c0 100644 --- a/lib/redmine/views/my_page/block.rb +++ b/lib/redmine/views/my_page/block.rb @@ -1,19 +1,15 @@ -# Redmine - project management software -# Copyright (C) 2006-2009 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ module Redmine module Views diff --git a/lib/redmine/views/other_formats_builder.rb b/lib/redmine/views/other_formats_builder.rb index c3c89b24..752ba209 100644 --- a/lib/redmine/views/other_formats_builder.rb +++ b/lib/redmine/views/other_formats_builder.rb @@ -1,19 +1,15 @@ -# Redmine - project management software -# Copyright (C) 2006-2009 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ module Redmine module Views @@ -21,7 +17,7 @@ module Redmine def initialize(view) @view = view end - + def link_to(name, options={}) url = { :format => name.to_s.downcase }.merge(options.delete(:url) || {}) caption = options.delete(:caption) || name diff --git a/lib/redmine/wiki_formatting.rb b/lib/redmine/wiki_formatting.rb index dcce0fc4..d75b0db7 100644 --- a/lib/redmine/wiki_formatting.rb +++ b/lib/redmine/wiki_formatting.rb @@ -1,19 +1,15 @@ -# Redmine - project management software -# Copyright (C) 2006-2008 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ module Redmine module WikiFormatting @@ -23,26 +19,26 @@ module Redmine def map yield self end - + def register(name, formatter, helper) raise ArgumentError, "format name '#{name}' is already taken" if @@formatters[name.to_s] @@formatters[name.to_s] = {:formatter => formatter, :helper => helper} end - + def formatter_for(name) entry = @@formatters[name.to_s] (entry && entry[:formatter]) || Redmine::WikiFormatting::NullFormatter::Formatter end - + def helper_for(name) entry = @@formatters[name.to_s] (entry && entry[:helper]) || Redmine::WikiFormatting::NullFormatter::Helper end - + def format_names @@formatters.keys.map end - + def to_html(format, text, options = {}, &block) text = if Setting.cache_formatted_text? && text.size > 2.kilobyte && cache_store && cache_key = cache_key_for(format, options[:object], options[:attribute]) # Text retrieved from the cache store may be frozen @@ -65,12 +61,12 @@ module Redmine "formatted_text/#{format}/#{object.class.model_name.cache_key}/#{object.id}-#{attribute}-#{object.updated_on.to_s(:number)}" end end - + # Returns the cache store used to cache HTML output def cache_store ActionController::Base.cache_store end - + MACROS_RE = / (!)? # escaping ( @@ -80,7 +76,7 @@ module Redmine \}\} # closing tag ) /x unless const_defined?(:MACROS_RE) - + # Macros substitution def execute_macros(text, macros_runner) text.gsub!(MACROS_RE) do @@ -98,30 +94,30 @@ module Redmine end end end - + # Default formatter module module NullFormatter class Formatter include ActionView::Helpers::TagHelper include ActionView::Helpers::TextHelper include ActionView::Helpers::UrlHelper - + def initialize(text) @text = text end - + def to_html(*args) simple_format(auto_link(CGI::escapeHTML(@text))) end end - + module Helper def wikitoolbar_for(field_id) end - + def heads_for_wiki_formatter end - + def initial_page_content(page) page.pretty_title.to_s end diff --git a/lib/redmine/wiki_formatting/macros.rb b/lib/redmine/wiki_formatting/macros.rb index 63cd2ab8..615d1b41 100644 --- a/lib/redmine/wiki_formatting/macros.rb +++ b/lib/redmine/wiki_formatting/macros.rb @@ -1,19 +1,15 @@ -# redMine - project management software -# Copyright (C) 2006-2007 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ module Redmine module WikiFormatting @@ -23,7 +19,7 @@ module Redmine method_name = "macro_#{name}" send(method_name, obj, args) if respond_to?(method_name) end - + def extract_macro_options(args, *keys) options = {} while args.last.to_s.strip =~ %r{^(.+)\=(.+)$} && keys.include?($1.downcase.to_sym) @@ -33,17 +29,17 @@ module Redmine return [args, options] end end - + @@available_macros = {} - + class << self # Called with a block to define additional macros. # Macro blocks accept 2 arguments: # * obj: the object that is rendered # * args: macro arguments - # + # # Plugins can use this method to define new macros: - # + # # Redmine::WikiFormatting::Macros.register do # desc "This is my macro" # macro :my_macro do |obj, args| @@ -53,7 +49,7 @@ module Redmine def register(&block) class_eval(&block) if block_given? end - + private # Defines a new macro with the given name and block. def macro(name, &block) @@ -63,19 +59,19 @@ module Redmine raise "Can not create a macro without a block!" unless block_given? Definitions.send :define_method, "macro_#{name}".downcase, &block end - + # Sets description for the next macro to be defined def desc(txt) @@desc = txt end end - + # Builtin macros desc "Sample macro." macro :hello_world do |obj, args| "Hello world! Object: #{obj.class.name}, " + (args.empty? ? "Called with no argument." : "Arguments: #{args.join(', ')}") end - + desc "Displays a list of all available macros, including description if available." macro :macro_list do out = '' @@ -85,7 +81,7 @@ module Redmine end content_tag('dl', out) end - + desc "Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:\n\n" + " !{{child_pages}} -- can be used from a wiki page only\n" + " !{{child_pages(Foo)}} -- lists all children of page Foo\n" + @@ -95,7 +91,7 @@ module Redmine page = nil if args.size > 0 page = Wiki.find_page(args.first.to_s, :project => @project) - elsif obj.is_a?(WikiContent) || obj.is_a?(WikiContent::Version) + elsif obj.is_a?(WikiContent) page = obj.page else raise 'With no argument, this macro can be called from wiki pages only.' @@ -104,7 +100,7 @@ module Redmine pages = ([page] + page.descendants).group_by(&:parent_id) render_page_hierarchy(pages, options[:parent] ? page.parent_id : page.id) end - + desc "Include a wiki page. Example:\n\n !{{include(Foo)}}\n\nor to include a page of a specific project wiki:\n\n !{{include(projectname:Foo)}}" macro :include do |obj, args| page = Wiki.find_page(args.first.to_s, :project => @project) diff --git a/lib/redmine/wiki_formatting/textile/formatter.rb b/lib/redmine/wiki_formatting/textile/formatter.rb index 88d52a6c..a96833fa 100644 --- a/lib/redmine/wiki_formatting/textile/formatter.rb +++ b/lib/redmine/wiki_formatting/textile/formatter.rb @@ -1,19 +1,15 @@ -# Redmine - project management software -# Copyright (C) 2006-2010 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ require 'redcloth3' @@ -22,30 +18,30 @@ module Redmine module Textile class Formatter < RedCloth3 include ActionView::Helpers::TagHelper - + # auto_link rule after textile rules so that it doesn't break !image_url! tags RULES = [:textile, :block_markdown_rule, :inline_auto_link, :inline_auto_mailto] - + def initialize(*args) super self.hard_breaks=true self.no_span_caps=true self.filter_styles=true end - + def to_html(*rules) @toc = [] super(*RULES).to_s end - + private - + # Patch for RedCloth. Fixed in RedCloth r128 but _why hasn't released it yet. # http://code.whytheluckystiff.net/redcloth/changeset/128 - def hard_break( text ) - text.gsub!( /(.)\n(?!\n|\Z|>| *([#*=]+(\s|$)|[{|]))/, "\\1
    " ) if hard_breaks + def hard_break( text ) + text.gsub!( /(.)\n(?!\n|\Z| *([#*=]+(\s|$)|[{|]))/, "\\1
    " ) if hard_breaks end - + # Patch to add code highlighting support to RedCloth def smooth_offtags( text ) unless @pre_list.empty? @@ -53,18 +49,18 @@ module Redmine text.gsub!(//) do content = @pre_list[$1.to_i] if content.match(/\s?(.+)/m) - content = "" + + content = "" + Redmine::SyntaxHighlighting.highlight_by_language($2, $1) end content end end end - + AUTO_LINK_RE = %r{ ( # leading text <\w+.*?>| # leading HTML tag, or - [^=<>!:'"/]| # leading punctuation, or + [^=<>!:'"/]| # leading punctuation, or ^ # beginning of line ) ( @@ -79,7 +75,7 @@ module Redmine ((?:>)?|[^\w\=\/;\(\)]*?) # post (?=<|\s|$) }x unless const_defined?(:AUTO_LINK_RE) - + # Turns all urls into clickable links (code from Rails). def inline_auto_link(text) text.gsub!(AUTO_LINK_RE) do @@ -100,7 +96,7 @@ module Redmine end end end - + # Turns all email addresses into clickable links (code from Rails). def inline_auto_mailto(text) text.gsub!(/([\w\.!#\$%\-+.]+@[A-Za-z0-9\-]+(\.[A-Za-z0-9\-]+)+)/) do diff --git a/lib/redmine/wiki_formatting/textile/helper.rb b/lib/redmine/wiki_formatting/textile/helper.rb index 18efc1aa..aefc8da5 100644 --- a/lib/redmine/wiki_formatting/textile/helper.rb +++ b/lib/redmine/wiki_formatting/textile/helper.rb @@ -1,44 +1,44 @@ -# Redmine - project management software -# Copyright (C) 2006-2008 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ module Redmine module WikiFormatting module Textile module Helper def wikitoolbar_for(field_id) + heads_for_wiki_formatter url = url_for(:controller => 'help', :action => 'wiki_syntax') + help_link = link_to(l(:setting_text_formatting), url, + :onclick => "window.open(\"#{ url }\", \"\", \"resizable=yes, location=no, width=300, height=640, menubar=no, status=no, scrollbars=yes\"); return false;", + :tabindex => -1) - help_link = l(:setting_text_formatting) + ': ' + - link_to(l(:label_help), url, - :onclick => "window.open(\"#{ url }\", \"\", \"resizable=yes, location=no, width=300, height=640, menubar=no, status=no, scrollbars=yes\"); return false;", - :tabindex => -1) - - javascript_include_tag('jstoolbar/jstoolbar') + - javascript_include_tag('jstoolbar/textile') + - javascript_include_tag("jstoolbar/lang/jstoolbar-#{current_language.to_s.downcase}") + - javascript_tag("var wikiToolbar = new jsToolBar($('#{field_id}')); wikiToolbar.setHelpLink('#{help_link}'); wikiToolbar.draw();") + javascript_tag("var wikiToolbar = new jsToolBar($('#{field_id}')); wikiToolbar.setHelpLink('#{escape_javascript help_link}'); wikiToolbar.draw();") end - + def initial_page_content(page) "h1. #{@page.pretty_title}" end - + def heads_for_wiki_formatter - stylesheet_link_tag 'jstoolbar' + unless @heads_for_wiki_formatter_included + content_for :header_tags do + javascript_include_tag('jstoolbar/jstoolbar') + + javascript_include_tag('jstoolbar/textile') + + javascript_include_tag("jstoolbar/lang/jstoolbar-#{current_language.to_s.downcase}") + + stylesheet_link_tag('jstoolbar') + end + @heads_for_wiki_formatter_included = true + end end end end diff --git a/lib/tabular_form_builder.rb b/lib/tabular_form_builder.rb index 8dc5265d..303f9a83 100644 --- a/lib/tabular_form_builder.rb +++ b/lib/tabular_form_builder.rb @@ -1,51 +1,47 @@ -# redMine - project management software -# Copyright (C) 2006-2007 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ require 'action_view/helpers/form_helper' class TabularFormBuilder < ActionView::Helpers::FormBuilder include Redmine::I18n - + def initialize(object_name, object, template, options, proc) set_language_if_valid options.delete(:lang) super - end - + end + (field_helpers - %w(radio_button hidden_field fields_for) + %w(date_select)).each do |selector| src = <<-END_SRC - def #{selector}(field, options = {}) + def #{selector}(field, options = {}) label_for_field(field, options) + super end END_SRC class_eval src, __FILE__, __LINE__ end - - def select(field, choices, options = {}, html_options = {}) + + def select(field, choices, options = {}, html_options = {}) label_for_field(field, options) + super end - + # Returns a label tag for the given field def label_for_field(field, options = {}) return '' if options.delete(:no_label) text = options[:label].is_a?(Symbol) ? l(options[:label]) : options[:label] text ||= l(("field_" + field.to_s.gsub(/\_id$/, "")).to_sym) text += @template.content_tag("span", " *", :class => "required") if options.delete(:required) - @template.content_tag("label", text, - :class => (@object && @object.errors[field] ? "error" : nil), + @template.content_tag("label", text, + :class => (@object && @object.errors[field] ? "error" : nil), :for => (@object_name.to_s + "_" + field.to_s)) end end diff --git a/lib/tasks/ci.rake b/lib/tasks/ci.rake index 70c1ecab..702307a8 100644 --- a/lib/tasks/ci.rake +++ b/lib/tasks/ci.rake @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + desc "Run the Continous Integration tests for Redmine" task :ci do # RAILS_ENV and ENV[] can diverge so force them both to test @@ -38,7 +51,7 @@ namespace :ci do result = `#{command}` "$ #{command}\n#{result}" end.join("\n") - + end end diff --git a/lib/tasks/ciphering.rake b/lib/tasks/ciphering.rake new file mode 100644 index 00000000..6581fe59 --- /dev/null +++ b/lib/tasks/ciphering.rake @@ -0,0 +1,31 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + + +namespace :db do + desc 'Encrypts SCM and LDAP passwords in the database.' + task :encrypt => :environment do + unless (Repository.encrypt_all(:password) && + AuthSource.encrypt_all(:account_password)) + raise "Some objects could not be saved after encryption, update was rollback'ed." + end + end + + desc 'Decrypts SCM and LDAP passwords in the database.' + task :decrypt => :environment do + unless (Repository.decrypt_all(:password) && + AuthSource.decrypt_all(:account_password)) + raise "Some objects could not be saved after decryption, update was rollback'ed." + end + end +end diff --git a/lib/tasks/code.rake b/lib/tasks/code.rake new file mode 100644 index 00000000..e4e67050 --- /dev/null +++ b/lib/tasks/code.rake @@ -0,0 +1,33 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + +namespace :code do + desc "Fix line endings of all source files" + task :fix_line_endings do + Dir.chdir(File.join(File.dirname(__FILE__), "../..")) do + files = Dir['**/**{.rb,.html.erb,.rhtml,.rjs,.rsb,.plain.erb,.rxml,.yml,.rake,.eml}'] + files.reject!{ |f| + f.include?("vendor") || + f.include?("lib/SVG") || + f.include?("lib/faster_csv") || + f.include?("lib/redcloth") || + f.include?("lib/diff") + } + + # handle files in chunks of 50 to avoid too long command lines + while (slice = files.slice!(0, 50)).present? + system('ruby', '-i', '-pe', 'gsub(/\s+$/,"\n")', *slice) + end + end + end +end diff --git a/lib/tasks/copyright.rake b/lib/tasks/copyright.rake new file mode 100644 index 00000000..c9468087 --- /dev/null +++ b/lib/tasks/copyright.rake @@ -0,0 +1,46 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + +namespace :copyright do + desc "Update the copyright on the source files" + task :update do + short_copyright = File.readlines("doc/COPYRIGHT_short.rdoc").collect do |line| + "# #{line}".rstrip + end.join("\n") + + short_copyright_as_rdoc = "#-- copyright\n" + short_copyright + "\n#++" + + Dir['**/**{.rb,.rake}'].each do |file_name| + # Skip 3rd party code + next if file_name.include?("vendor") || + file_name.include?("lib/SVG") || + file_name.include?("lib/faster_csv") || + file_name.include?("lib/redcloth") || + file_name.include?("lib/diff") + + file_content = File.read(file_name) + @copyright_regex = /^#--\s*copyright.*?\+\+/m + if file_content.match(@copyright_regex) + file_content.gsub!(@copyright_regex, short_copyright_as_rdoc) + else + file_content = short_copyright_as_rdoc + "\n\n" + file_content # Prepend + end + + File.open(file_name, "w") do |file| + file.write file_content + end + + end + + end +end diff --git a/lib/tasks/deprecated.rake b/lib/tasks/deprecated.rake index dca43ddc..d31f6b3b 100644 --- a/lib/tasks/deprecated.rake +++ b/lib/tasks/deprecated.rake @@ -1,5 +1,18 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + def deprecated_task(name, new_name) - task name=>new_name do + task name=>new_name do $stderr.puts "\nNote: The rake task #{name} has been deprecated, please use the replacement version #{new_name}" end end diff --git a/lib/tasks/documentation.rake b/lib/tasks/documentation.rake index 9271023a..6a4d4848 100644 --- a/lib/tasks/documentation.rake +++ b/lib/tasks/documentation.rake @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + #clear the doc:app task et al Rake::Task["doc:app"].clear Rake::Task["doc/app"].clear @@ -5,7 +18,7 @@ Rake::Task["doc/app/index.html"].clear namespace :doc do desc "Generate documentation for the application. Set custom template with TEMPLATE=/path/to/rdoc/template.rb or title with TITLE=\"Custom Title\"" - Rake::RDocTask.new("app") { |rdoc| + RDoc::Task.new("app") { |rdoc| rdoc.rdoc_dir = 'doc/app' rdoc.template = ENV['template'] if ENV['template'] rdoc.title = ENV['title'] || "ChiliProject" diff --git a/lib/tasks/email.rake b/lib/tasks/email.rake index a4036f90..be618cf4 100644 --- a/lib/tasks/email.rake +++ b/lib/tasks/email.rake @@ -1,186 +1,183 @@ -# Redmine - project management software -# Copyright (C) 2006-2008 Jean-Philippe Lang -# -# 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 -# of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - -namespace :redmine do - namespace :email do - - desc <<-END_DESC -Read an email from standard input. - -General options: - unknown_user=ACTION how to handle emails from an unknown user - ACTION can be one of the following values: - ignore: email is ignored (default) - accept: accept as anonymous user - create: create a user account - no_permission_check=1 disable permission checking when receiving - the email - -Issue attributes control options: - project=PROJECT identifier of the target project - status=STATUS name of the target status - tracker=TRACKER name of the target tracker - category=CATEGORY name of the target category - priority=PRIORITY name of the target priority - allow_override=ATTRS allow email content to override attributes - specified by previous options - ATTRS is a comma separated list of attributes - -Examples: - # No project specified. Emails MUST contain the 'Project' keyword: - rake redmine:email:read RAILS_ENV="production" < raw_email - - # Fixed project and default tracker specified, but emails can override - # both tracker and priority attributes: - rake redmine:email:read RAILS_ENV="production" \\ - project=foo \\ - tracker=bug \\ - allow_override=tracker,priority < raw_email -END_DESC - - task :read => :environment do - options = { :issue => {} } - %w(project status tracker category priority).each { |a| options[:issue][a.to_sym] = ENV[a] if ENV[a] } - options[:allow_override] = ENV['allow_override'] if ENV['allow_override'] - options[:unknown_user] = ENV['unknown_user'] if ENV['unknown_user'] - options[:no_permission_check] = ENV['no_permission_check'] if ENV['no_permission_check'] - - MailHandler.receive(STDIN.read, options) - end - - desc <<-END_DESC -Read emails from an IMAP server. - -General options: - unknown_user=ACTION how to handle emails from an unknown user - ACTION can be one of the following values: - ignore: email is ignored (default) - accept: accept as anonymous user - create: create a user account - no_permission_check=1 disable permission checking when receiving - the email - -Available IMAP options: - host=HOST IMAP server host (default: 127.0.0.1) - port=PORT IMAP server port (default: 143) - ssl=SSL Use SSL? (default: false) - username=USERNAME IMAP account - password=PASSWORD IMAP password - folder=FOLDER IMAP folder to read (default: INBOX) - -Issue attributes control options: - project=PROJECT identifier of the target project - status=STATUS name of the target status - tracker=TRACKER name of the target tracker - category=CATEGORY name of the target category - priority=PRIORITY name of the target priority - allow_override=ATTRS allow email content to override attributes - specified by previous options - ATTRS is a comma separated list of attributes - -Processed emails control options: - move_on_success=MAILBOX move emails that were successfully received - to MAILBOX instead of deleting them - move_on_failure=MAILBOX move emails that were ignored to MAILBOX - -Examples: - # No project specified. Emails MUST contain the 'Project' keyword: - - rake redmine:email:receive_iamp RAILS_ENV="production" \\ - host=imap.foo.bar username=redmine@example.net password=xxx - - - # Fixed project and default tracker specified, but emails can override - # both tracker and priority attributes: - - rake redmine:email:receive_iamp RAILS_ENV="production" \\ - host=imap.foo.bar username=redmine@example.net password=xxx ssl=1 \\ - project=foo \\ - tracker=bug \\ - allow_override=tracker,priority -END_DESC - - task :receive_imap => :environment do - imap_options = {:host => ENV['host'], - :port => ENV['port'], - :ssl => ENV['ssl'], - :username => ENV['username'], - :password => ENV['password'], - :folder => ENV['folder'], - :move_on_success => ENV['move_on_success'], - :move_on_failure => ENV['move_on_failure']} - - options = { :issue => {} } - %w(project status tracker category priority).each { |a| options[:issue][a.to_sym] = ENV[a] if ENV[a] } - options[:allow_override] = ENV['allow_override'] if ENV['allow_override'] - options[:unknown_user] = ENV['unknown_user'] if ENV['unknown_user'] - options[:no_permission_check] = ENV['no_permission_check'] if ENV['no_permission_check'] - - Redmine::IMAP.check(imap_options, options) - end - - desc <<-END_DESC -Read emails from an POP3 server. - -Available POP3 options: - host=HOST POP3 server host (default: 127.0.0.1) - port=PORT POP3 server port (default: 110) - username=USERNAME POP3 account - password=PASSWORD POP3 password - apop=1 use APOP authentication (default: false) - delete_unprocessed=1 delete messages that could not be processed - successfully from the server (default - behaviour is to leave them on the server) - -See redmine:email:receive_imap for more options and examples. -END_DESC - - task :receive_pop3 => :environment do - pop_options = {:host => ENV['host'], - :port => ENV['port'], - :apop => ENV['apop'], - :username => ENV['username'], - :password => ENV['password'], - :delete_unprocessed => ENV['delete_unprocessed']} - - options = { :issue => {} } - %w(project status tracker category priority).each { |a| options[:issue][a.to_sym] = ENV[a] if ENV[a] } - options[:allow_override] = ENV['allow_override'] if ENV['allow_override'] - options[:unknown_user] = ENV['unknown_user'] if ENV['unknown_user'] - options[:no_permission_check] = ENV['no_permission_check'] if ENV['no_permission_check'] - - Redmine::POP3.check(pop_options, options) - end - - desc "Send a test email to the user with the provided login name" - task :test, [:login] => :environment do |task, args| - include Redmine::I18n - abort l(:notice_email_error, "Please include the user login to test with. Example: login=example-login") if args[:login].blank? - - user = User.find_by_login(args[:login]) - abort l(:notice_email_error, "User #{args[:login]} not found") unless user && user.logged? - - ActionMailer::Base.raise_delivery_errors = true - begin - Mailer.deliver_test(User.current) - puts l(:notice_email_sent, user.mail) - rescue Exception => e - abort l(:notice_email_error, e.message) - end - end - end -end +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + + +namespace :redmine do + namespace :email do + + desc <<-END_DESC +Read an email from standard input. + +General options: + unknown_user=ACTION how to handle emails from an unknown user + ACTION can be one of the following values: + ignore: email is ignored (default) + accept: accept as anonymous user + create: create a user account + no_permission_check=1 disable permission checking when receiving + the email + +Issue attributes control options: + project=PROJECT identifier of the target project + status=STATUS name of the target status + tracker=TRACKER name of the target tracker + category=CATEGORY name of the target category + priority=PRIORITY name of the target priority + allow_override=ATTRS allow email content to override attributes + specified by previous options + ATTRS is a comma separated list of attributes + +Examples: + # No project specified. Emails MUST contain the 'Project' keyword: + rake redmine:email:read RAILS_ENV="production" < raw_email + + # Fixed project and default tracker specified, but emails can override + # both tracker and priority attributes: + rake redmine:email:read RAILS_ENV="production" \\ + project=foo \\ + tracker=bug \\ + allow_override=tracker,priority < raw_email +END_DESC + + task :read => :environment do + options = { :issue => {} } + %w(project status tracker category priority).each { |a| options[:issue][a.to_sym] = ENV[a] if ENV[a] } + options[:allow_override] = ENV['allow_override'] if ENV['allow_override'] + options[:unknown_user] = ENV['unknown_user'] if ENV['unknown_user'] + options[:no_permission_check] = ENV['no_permission_check'] if ENV['no_permission_check'] + + MailHandler.receive(STDIN.read, options) + end + + desc <<-END_DESC +Read emails from an IMAP server. + +General options: + unknown_user=ACTION how to handle emails from an unknown user + ACTION can be one of the following values: + ignore: email is ignored (default) + accept: accept as anonymous user + create: create a user account + no_permission_check=1 disable permission checking when receiving + the email + +Available IMAP options: + host=HOST IMAP server host (default: 127.0.0.1) + port=PORT IMAP server port (default: 143) + ssl=SSL Use SSL? (default: false) + username=USERNAME IMAP account + password=PASSWORD IMAP password + folder=FOLDER IMAP folder to read (default: INBOX) + +Issue attributes control options: + project=PROJECT identifier of the target project + status=STATUS name of the target status + tracker=TRACKER name of the target tracker + category=CATEGORY name of the target category + priority=PRIORITY name of the target priority + allow_override=ATTRS allow email content to override attributes + specified by previous options + ATTRS is a comma separated list of attributes + +Processed emails control options: + move_on_success=MAILBOX move emails that were successfully received + to MAILBOX instead of deleting them + move_on_failure=MAILBOX move emails that were ignored to MAILBOX + +Examples: + # No project specified. Emails MUST contain the 'Project' keyword: + + rake redmine:email:receive_iamp RAILS_ENV="production" \\ + host=imap.foo.bar username=redmine@example.net password=xxx + + + # Fixed project and default tracker specified, but emails can override + # both tracker and priority attributes: + + rake redmine:email:receive_iamp RAILS_ENV="production" \\ + host=imap.foo.bar username=redmine@example.net password=xxx ssl=1 \\ + project=foo \\ + tracker=bug \\ + allow_override=tracker,priority +END_DESC + + task :receive_imap => :environment do + imap_options = {:host => ENV['host'], + :port => ENV['port'], + :ssl => ENV['ssl'], + :username => ENV['username'], + :password => ENV['password'], + :folder => ENV['folder'], + :move_on_success => ENV['move_on_success'], + :move_on_failure => ENV['move_on_failure']} + + options = { :issue => {} } + %w(project status tracker category priority).each { |a| options[:issue][a.to_sym] = ENV[a] if ENV[a] } + options[:allow_override] = ENV['allow_override'] if ENV['allow_override'] + options[:unknown_user] = ENV['unknown_user'] if ENV['unknown_user'] + options[:no_permission_check] = ENV['no_permission_check'] if ENV['no_permission_check'] + + Redmine::IMAP.check(imap_options, options) + end + + desc <<-END_DESC +Read emails from an POP3 server. + +Available POP3 options: + host=HOST POP3 server host (default: 127.0.0.1) + port=PORT POP3 server port (default: 110) + username=USERNAME POP3 account + password=PASSWORD POP3 password + apop=1 use APOP authentication (default: false) + delete_unprocessed=1 delete messages that could not be processed + successfully from the server (default + behaviour is to leave them on the server) + +See redmine:email:receive_imap for more options and examples. +END_DESC + + task :receive_pop3 => :environment do + pop_options = {:host => ENV['host'], + :port => ENV['port'], + :apop => ENV['apop'], + :username => ENV['username'], + :password => ENV['password'], + :delete_unprocessed => ENV['delete_unprocessed']} + + options = { :issue => {} } + %w(project status tracker category priority).each { |a| options[:issue][a.to_sym] = ENV[a] if ENV[a] } + options[:allow_override] = ENV['allow_override'] if ENV['allow_override'] + options[:unknown_user] = ENV['unknown_user'] if ENV['unknown_user'] + options[:no_permission_check] = ENV['no_permission_check'] if ENV['no_permission_check'] + + Redmine::POP3.check(pop_options, options) + end + + desc "Send a test email to the user with the provided login name" + task :test, [:login] => :environment do |task, args| + include Redmine::I18n + abort l(:notice_email_error, "Please include the user login to test with. Example: login=example-login") if args[:login].blank? + + user = User.find_by_login(args[:login]) + abort l(:notice_email_error, "User #{args[:login]} not found") unless user && user.logged? + + ActionMailer::Base.raise_delivery_errors = true + begin + Mailer.deliver_test(User.current) + puts l(:notice_email_sent, user.mail) + rescue Exception => e + abort l(:notice_email_error, e.message) + end + end + end +end diff --git a/lib/tasks/extract_fixtures.rake b/lib/tasks/extract_fixtures.rake index 49834e5a..d97865fb 100644 --- a/lib/tasks/extract_fixtures.rake +++ b/lib/tasks/extract_fixtures.rake @@ -1,24 +1,37 @@ -desc 'Create YAML test fixtures from data in an existing database. -Defaults to development database. Set RAILS_ENV to override.' - -task :extract_fixtures => :environment do - sql = "SELECT * FROM %s" - skip_tables = ["schema_info"] - ActiveRecord::Base.establish_connection - (ActiveRecord::Base.connection.tables - skip_tables).each do |table_name| - i = "000" - File.open("#{RAILS_ROOT}/#{table_name}.yml", 'w' ) do |file| - data = ActiveRecord::Base.connection.select_all(sql % table_name) - file.write data.inject({}) { |hash, record| - - # cast extracted values - ActiveRecord::Base.connection.columns(table_name).each { |col| - record[col.name] = col.type_cast(record[col.name]) if record[col.name] - } - - hash["#{table_name}_#{i.succ!}"] = record - hash - }.to_yaml - end - end +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + +desc 'Create YAML test fixtures from data in an existing database. +Defaults to development database. Set RAILS_ENV to override.' + +task :extract_fixtures => :environment do + sql = "SELECT * FROM %s" + skip_tables = ["schema_info"] + ActiveRecord::Base.establish_connection + (ActiveRecord::Base.connection.tables - skip_tables).each do |table_name| + i = "000" + File.open("#{RAILS_ROOT}/#{table_name}.yml", 'w' ) do |file| + data = ActiveRecord::Base.connection.select_all(sql % table_name) + file.write data.inject({}) { |hash, record| + + # cast extracted values + ActiveRecord::Base.connection.columns(table_name).each { |col| + record[col.name] = col.type_cast(record[col.name]) if record[col.name] + } + + hash["#{table_name}_#{i.succ!}"] = record + hash + }.to_yaml + end + end end \ No newline at end of file diff --git a/lib/tasks/fetch_changesets.rake b/lib/tasks/fetch_changesets.rake index 681032bd..2803f4c4 100644 --- a/lib/tasks/fetch_changesets.rake +++ b/lib/tasks/fetch_changesets.rake @@ -1,24 +1,21 @@ -# redMine - project management software -# Copyright (C) 2006-2008 Jean-Philippe Lang -# -# 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 -# of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - -desc 'Fetch changesets from the repositories' - -namespace :redmine do - task :fetch_changesets => :environment do - Repository.fetch_changesets - end -end +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + + +desc 'Fetch changesets from the repositories' + +namespace :redmine do + task :fetch_changesets => :environment do + Repository.fetch_changesets + end +end diff --git a/lib/tasks/initializers.rake b/lib/tasks/initializers.rake index 1b198dc4..a4b02c7c 100644 --- a/lib/tasks/initializers.rake +++ b/lib/tasks/initializers.rake @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + desc 'Generates a configuration file for cookie store sessions.' file 'config/initializers/session_store.rb' do @@ -10,7 +23,7 @@ file 'config/initializers/session_store.rb' do # If you have a load-balancing Redmine cluster, you will need to use the # same version of this file on each machine. And be sure to restart your # server when you modify this file. - + # Your secret key for verifying cookie session data integrity. If you # change this key, all old sessions will become invalid! Make sure the # secret is at least 30 characters and all random, no regular words or diff --git a/lib/tasks/jdbc.rake b/lib/tasks/jdbc.rake index 289b3d94..48ba4a10 100644 --- a/lib/tasks/jdbc.rake +++ b/lib/tasks/jdbc.rake @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + # This file was generated by the "jdbc" generator, which is provided # by the activerecord-jdbc-adapter gem. # diff --git a/lib/tasks/load_default_data.rake b/lib/tasks/load_default_data.rake index 0aa7ab74..5a0fec70 100644 --- a/lib/tasks/load_default_data.rake +++ b/lib/tasks/load_default_data.rake @@ -1,35 +1,48 @@ -desc 'Load Redmine default configuration data. Language is chosen interactively or by setting REDMINE_LANG environment variable.' - -namespace :redmine do - task :load_default_data => :environment do - include Redmine::I18n - set_language_if_valid('en') - - envlang = ENV['REDMINE_LANG'] - if !envlang || !set_language_if_valid(envlang) - puts - while true - print "Select language: " - print valid_languages.collect(&:to_s).sort.join(", ") - print " [#{current_language}] " - STDOUT.flush - lang = STDIN.gets.chomp! - break if lang.empty? - break if set_language_if_valid(lang) - puts "Unknown language!" - end - STDOUT.flush - puts "====================================" - end - - begin - Redmine::DefaultData::Loader.load(current_language) - puts "Default configuration data loaded." - rescue Redmine::DefaultData::DataAlreadyLoaded => error - puts error - rescue => error - puts "Error: " + error - puts "Default configuration data was not loaded." - end - end -end +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + +desc 'Load Redmine default configuration data. Language is chosen interactively or by setting REDMINE_LANG environment variable.' + +namespace :redmine do + task :load_default_data => :environment do + include Redmine::I18n + set_language_if_valid('en') + + envlang = ENV['REDMINE_LANG'] + if !envlang || !set_language_if_valid(envlang) + puts + while true + print "Select language: " + print valid_languages.collect(&:to_s).sort.join(", ") + print " [#{current_language}] " + STDOUT.flush + lang = STDIN.gets.chomp! + break if lang.empty? + break if set_language_if_valid(lang) + puts "Unknown language!" + end + STDOUT.flush + puts "====================================" + end + + begin + Redmine::DefaultData::Loader.load(current_language) + puts "Default configuration data loaded." + rescue Redmine::DefaultData::DataAlreadyLoaded => error + puts error + rescue => error + puts "Error: " + error + puts "Default configuration data was not loaded." + end + end +end diff --git a/lib/tasks/locales.rake b/lib/tasks/locales.rake index 51253847..86d3688e 100644 --- a/lib/tasks/locales.rake +++ b/lib/tasks/locales.rake @@ -1,22 +1,42 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + +desc 'Updates and checks locales against en.yml' +task :locales do + %w(locales:update locales:check_interpolation).collect do |task| + Rake::Task[task].invoke + end +end + namespace :locales do desc 'Updates language files based on en.yml content (only works for new top level keys).' task :update do dir = ENV['DIR'] || './config/locales' - + en_strings = YAML.load(File.read(File.join(dir,'en.yml')))['en'] - + files = Dir.glob(File.join(dir,'*.{yaml,yml}')) files.each do |file| puts "Updating file #{file}" file_strings = YAML.load(File.read(file)) file_strings = file_strings[file_strings.keys.first] - + missing_keys = en_strings.keys - file_strings.keys next if missing_keys.empty? - + puts "==> Missing #{missing_keys.size} keys (#{missing_keys.join(', ')})" lang = File.open(file, 'a') - + missing_keys.each do |key| {key => en_strings[key]}.to_yaml.each_line do |line| next if line =~ /^---/ || line.empty? @@ -24,11 +44,31 @@ namespace :locales do lang << " #{line}" end end - + lang.close end end + desc 'Checks interpolation arguments in locals against en.yml' + task :check_interpolation do + dir = ENV['DIR'] || './config/locales' + en_strings = YAML.load(File.read(File.join(dir,'en.yml')))['en'] + files = Dir.glob(File.join(dir,'*.{yaml,yml}')) + files.each do |file| + file_strings = YAML.load(File.read(file)) + file_strings = file_strings[file_strings.keys.first] + + file_strings.each do |key, string| + next unless string.is_a?(String) + string.scan /%\{\w+\}/ do |match| + unless en_strings[key].nil? || en_strings[key].include?(match) + puts "#{file}: #{key} uses #{match} not found in en.yml" + end + end + end + end + end + desc <<-END_DESC Removes a translation string from all locale file (only works for top-level childless non-multiline keys, probably doesn\'t work on windows). @@ -44,7 +84,7 @@ END_DESC deletes = ENV['key'] ? Regexp.union(ENV['key'].split(',')) : nil # Ignore multiline keys (begin with | or >) and keys with children (nothing meaningful after :) delete_regex = /\A #{deletes}: +[^\|>\s#].*\z/ - + files.each do |path| # Skip certain locales (puts "Skipping #{path}"; next) if File.basename(path, ".yml") =~ skips @@ -53,7 +93,7 @@ END_DESC File.open(path, 'w') {|file| orig_content.each_line {|line| file.puts line unless line.chomp =~ delete_regex}} end end - + desc <<-END_DESC Adds a new top-level translation string to all locale file (only works for childless keys, probably doesn\'t work on windows, doesn't check for duplicates). diff --git a/lib/tasks/metrics.rake b/lib/tasks/metrics.rake index 214cc996..d0197cf1 100644 --- a/lib/tasks/metrics.rake +++ b/lib/tasks/metrics.rake @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + begin require 'metric_fu' rescue LoadError diff --git a/lib/tasks/migrate_from_mantis.rake b/lib/tasks/migrate_from_mantis.rake index c45ce68e..af65ed10 100644 --- a/lib/tasks/migrate_from_mantis.rake +++ b/lib/tasks/migrate_from_mantis.rake @@ -1,512 +1,509 @@ -# redMine - project management software -# Copyright (C) 2006-2007 Jean-Philippe Lang -# -# 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 -# of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - -desc 'Mantis migration script' - -require 'active_record' -require 'iconv' -require 'pp' - -namespace :redmine do -task :migrate_from_mantis => :environment do - - module MantisMigrate - - DEFAULT_STATUS = IssueStatus.default - assigned_status = IssueStatus.find_by_position(2) - resolved_status = IssueStatus.find_by_position(3) - feedback_status = IssueStatus.find_by_position(4) - closed_status = IssueStatus.find :first, :conditions => { :is_closed => true } - STATUS_MAPPING = {10 => DEFAULT_STATUS, # new - 20 => feedback_status, # feedback - 30 => DEFAULT_STATUS, # acknowledged - 40 => DEFAULT_STATUS, # confirmed - 50 => assigned_status, # assigned - 80 => resolved_status, # resolved - 90 => closed_status # closed - } - - priorities = IssuePriority.all - DEFAULT_PRIORITY = priorities[2] - PRIORITY_MAPPING = {10 => priorities[1], # none - 20 => priorities[1], # low - 30 => priorities[2], # normal - 40 => priorities[3], # high - 50 => priorities[4], # urgent - 60 => priorities[5] # immediate - } - - TRACKER_BUG = Tracker.find_by_position(1) - TRACKER_FEATURE = Tracker.find_by_position(2) - - roles = Role.find(:all, :conditions => {:builtin => 0}, :order => 'position ASC') - manager_role = roles[0] - developer_role = roles[1] - DEFAULT_ROLE = roles.last - ROLE_MAPPING = {10 => DEFAULT_ROLE, # viewer - 25 => DEFAULT_ROLE, # reporter - 40 => DEFAULT_ROLE, # updater - 55 => developer_role, # developer - 70 => manager_role, # manager - 90 => manager_role # administrator - } - - CUSTOM_FIELD_TYPE_MAPPING = {0 => 'string', # String - 1 => 'int', # Numeric - 2 => 'int', # Float - 3 => 'list', # Enumeration - 4 => 'string', # Email - 5 => 'bool', # Checkbox - 6 => 'list', # List - 7 => 'list', # Multiselection list - 8 => 'date', # Date - } - - RELATION_TYPE_MAPPING = {1 => IssueRelation::TYPE_RELATES, # related to - 2 => IssueRelation::TYPE_RELATES, # parent of - 3 => IssueRelation::TYPE_RELATES, # child of - 0 => IssueRelation::TYPE_DUPLICATES, # duplicate of - 4 => IssueRelation::TYPE_DUPLICATES # has duplicate - } - - class MantisUser < ActiveRecord::Base - set_table_name :mantis_user_table - - def firstname - @firstname = realname.blank? ? username : realname.split.first[0..29] - @firstname - end - - def lastname - @lastname = realname.blank? ? '-' : realname.split[1..-1].join(' ')[0..29] - @lastname = '-' if @lastname.blank? - @lastname - end - - def email - if read_attribute(:email).match(/^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i) && - !User.find_by_mail(read_attribute(:email)) - @email = read_attribute(:email) - else - @email = "#{username}@foo.bar" - end - end - - def username - read_attribute(:username)[0..29].gsub(/[^a-zA-Z0-9_\-@\.]/, '-') - end - end - - class MantisProject < ActiveRecord::Base - set_table_name :mantis_project_table - has_many :versions, :class_name => "MantisVersion", :foreign_key => :project_id - has_many :categories, :class_name => "MantisCategory", :foreign_key => :project_id - has_many :news, :class_name => "MantisNews", :foreign_key => :project_id - has_many :members, :class_name => "MantisProjectUser", :foreign_key => :project_id - - def identifier - read_attribute(:name).gsub(/[^a-z0-9\-]+/, '-').slice(0, Project::IDENTIFIER_MAX_LENGTH) - end - end - - class MantisVersion < ActiveRecord::Base - set_table_name :mantis_project_version_table - - def version - read_attribute(:version)[0..29] - end - - def description - read_attribute(:description)[0..254] - end - end - - class MantisCategory < ActiveRecord::Base - set_table_name :mantis_project_category_table - end - - class MantisProjectUser < ActiveRecord::Base - set_table_name :mantis_project_user_list_table - end - - class MantisBug < ActiveRecord::Base - set_table_name :mantis_bug_table - belongs_to :bug_text, :class_name => "MantisBugText", :foreign_key => :bug_text_id - has_many :bug_notes, :class_name => "MantisBugNote", :foreign_key => :bug_id - has_many :bug_files, :class_name => "MantisBugFile", :foreign_key => :bug_id - has_many :bug_monitors, :class_name => "MantisBugMonitor", :foreign_key => :bug_id - end - - class MantisBugText < ActiveRecord::Base - set_table_name :mantis_bug_text_table - - # Adds Mantis steps_to_reproduce and additional_information fields - # to description if any - def full_description - full_description = description - full_description += "\n\n*Steps to reproduce:*\n\n#{steps_to_reproduce}" unless steps_to_reproduce.blank? - full_description += "\n\n*Additional information:*\n\n#{additional_information}" unless additional_information.blank? - full_description - end - end - - class MantisBugNote < ActiveRecord::Base - set_table_name :mantis_bugnote_table - belongs_to :bug, :class_name => "MantisBug", :foreign_key => :bug_id - belongs_to :bug_note_text, :class_name => "MantisBugNoteText", :foreign_key => :bugnote_text_id - end - - class MantisBugNoteText < ActiveRecord::Base - set_table_name :mantis_bugnote_text_table - end - - class MantisBugFile < ActiveRecord::Base - set_table_name :mantis_bug_file_table - - def size - filesize - end - - def original_filename - MantisMigrate.encode(filename) - end - - def content_type - file_type - end - - def read(*args) - if @read_finished - nil - else - @read_finished = true - content - end - end - end - - class MantisBugRelationship < ActiveRecord::Base - set_table_name :mantis_bug_relationship_table - end - - class MantisBugMonitor < ActiveRecord::Base - set_table_name :mantis_bug_monitor_table - end - - class MantisNews < ActiveRecord::Base - set_table_name :mantis_news_table - end - - class MantisCustomField < ActiveRecord::Base - set_table_name :mantis_custom_field_table - set_inheritance_column :none - has_many :values, :class_name => "MantisCustomFieldString", :foreign_key => :field_id - has_many :projects, :class_name => "MantisCustomFieldProject", :foreign_key => :field_id - - def format - read_attribute :type - end - - def name - read_attribute(:name)[0..29] - end - end - - class MantisCustomFieldProject < ActiveRecord::Base - set_table_name :mantis_custom_field_project_table - end - - class MantisCustomFieldString < ActiveRecord::Base - set_table_name :mantis_custom_field_string_table - end - - - def self.migrate - - # Users - print "Migrating users" - User.delete_all "login <> 'admin'" - users_map = {} - users_migrated = 0 - MantisUser.find(:all).each do |user| - u = User.new :firstname => encode(user.firstname), - :lastname => encode(user.lastname), - :mail => user.email, - :last_login_on => user.last_visit - u.login = user.username - u.password = 'mantis' - u.status = User::STATUS_LOCKED if user.enabled != 1 - u.admin = true if user.access_level == 90 - next unless u.save! - users_migrated += 1 - users_map[user.id] = u.id - print '.' - end - puts - - # Projects - print "Migrating projects" - Project.destroy_all - projects_map = {} - versions_map = {} - categories_map = {} - MantisProject.find(:all).each do |project| - p = Project.new :name => encode(project.name), - :description => encode(project.description) - p.identifier = project.identifier - next unless p.save - projects_map[project.id] = p.id - p.enabled_module_names = ['issue_tracking', 'news', 'wiki'] - p.trackers << TRACKER_BUG - p.trackers << TRACKER_FEATURE - print '.' - - # Project members - project.members.each do |member| - m = Member.new :user => User.find_by_id(users_map[member.user_id]), - :roles => [ROLE_MAPPING[member.access_level] || DEFAULT_ROLE] - m.project = p - m.save - end - - # Project versions - project.versions.each do |version| - v = Version.new :name => encode(version.version), - :description => encode(version.description), - :effective_date => (version.date_order ? version.date_order.to_date : nil) - v.project = p - v.save - versions_map[version.id] = v.id - end - - # Project categories - project.categories.each do |category| - g = IssueCategory.new :name => category.category[0,30] - g.project = p - g.save - categories_map[category.category] = g.id - end - end - puts - - # Bugs - print "Migrating bugs" - Issue.destroy_all - issues_map = {} - keep_bug_ids = (Issue.count == 0) - MantisBug.find_each(:batch_size => 200) do |bug| - next unless projects_map[bug.project_id] && users_map[bug.reporter_id] - i = Issue.new :project_id => projects_map[bug.project_id], - :subject => encode(bug.summary), - :description => encode(bug.bug_text.full_description), - :priority => PRIORITY_MAPPING[bug.priority] || DEFAULT_PRIORITY, - :created_on => bug.date_submitted, - :updated_on => bug.last_updated - i.author = User.find_by_id(users_map[bug.reporter_id]) - i.category = IssueCategory.find_by_project_id_and_name(i.project_id, bug.category[0,30]) unless bug.category.blank? - i.fixed_version = Version.find_by_project_id_and_name(i.project_id, bug.fixed_in_version) unless bug.fixed_in_version.blank? - i.status = STATUS_MAPPING[bug.status] || DEFAULT_STATUS - i.tracker = (bug.severity == 10 ? TRACKER_FEATURE : TRACKER_BUG) - i.id = bug.id if keep_bug_ids - next unless i.save - issues_map[bug.id] = i.id - print '.' - STDOUT.flush - - # Assignee - # Redmine checks that the assignee is a project member - if (bug.handler_id && users_map[bug.handler_id]) - i.assigned_to = User.find_by_id(users_map[bug.handler_id]) - i.save_with_validation(false) - end - - # Bug notes - bug.bug_notes.each do |note| - next unless users_map[note.reporter_id] - n = Journal.new :notes => encode(note.bug_note_text.note), - :created_on => note.date_submitted - n.user = User.find_by_id(users_map[note.reporter_id]) - n.journalized = i - n.save - end - - # Bug files - bug.bug_files.each do |file| - a = Attachment.new :created_on => file.date_added - a.file = file - a.author = User.find :first - a.container = i - a.save - end - - # Bug monitors - bug.bug_monitors.each do |monitor| - next unless users_map[monitor.user_id] - i.add_watcher(User.find_by_id(users_map[monitor.user_id])) - end - end - - # update issue id sequence if needed (postgresql) - Issue.connection.reset_pk_sequence!(Issue.table_name) if Issue.connection.respond_to?('reset_pk_sequence!') - puts - - # Bug relationships - print "Migrating bug relations" - MantisBugRelationship.find(:all).each do |relation| - next unless issues_map[relation.source_bug_id] && issues_map[relation.destination_bug_id] - r = IssueRelation.new :relation_type => RELATION_TYPE_MAPPING[relation.relationship_type] - r.issue_from = Issue.find_by_id(issues_map[relation.source_bug_id]) - r.issue_to = Issue.find_by_id(issues_map[relation.destination_bug_id]) - pp r unless r.save - print '.' - STDOUT.flush - end - puts - - # News - print "Migrating news" - News.destroy_all - MantisNews.find(:all, :conditions => 'project_id > 0').each do |news| - next unless projects_map[news.project_id] - n = News.new :project_id => projects_map[news.project_id], - :title => encode(news.headline[0..59]), - :description => encode(news.body), - :created_on => news.date_posted - n.author = User.find_by_id(users_map[news.poster_id]) - n.save - print '.' - STDOUT.flush - end - puts - - # Custom fields - print "Migrating custom fields" - IssueCustomField.destroy_all - MantisCustomField.find(:all).each do |field| - f = IssueCustomField.new :name => field.name[0..29], - :field_format => CUSTOM_FIELD_TYPE_MAPPING[field.format], - :min_length => field.length_min, - :max_length => field.length_max, - :regexp => field.valid_regexp, - :possible_values => field.possible_values.split('|'), - :is_required => field.require_report? - next unless f.save - print '.' - STDOUT.flush - # Trackers association - f.trackers = Tracker.find :all - - # Projects association - field.projects.each do |project| - f.projects << Project.find_by_id(projects_map[project.project_id]) if projects_map[project.project_id] - end - - # Values - field.values.each do |value| - v = CustomValue.new :custom_field_id => f.id, - :value => value.value - v.customized = Issue.find_by_id(issues_map[value.bug_id]) if issues_map[value.bug_id] - v.save - end unless f.new_record? - end - puts - - puts - puts "Users: #{users_migrated}/#{MantisUser.count}" - puts "Projects: #{Project.count}/#{MantisProject.count}" - puts "Memberships: #{Member.count}/#{MantisProjectUser.count}" - puts "Versions: #{Version.count}/#{MantisVersion.count}" - puts "Categories: #{IssueCategory.count}/#{MantisCategory.count}" - puts "Bugs: #{Issue.count}/#{MantisBug.count}" - puts "Bug notes: #{Journal.count}/#{MantisBugNote.count}" - puts "Bug files: #{Attachment.count}/#{MantisBugFile.count}" - puts "Bug relations: #{IssueRelation.count}/#{MantisBugRelationship.count}" - puts "Bug monitors: #{Watcher.count}/#{MantisBugMonitor.count}" - puts "News: #{News.count}/#{MantisNews.count}" - puts "Custom fields: #{IssueCustomField.count}/#{MantisCustomField.count}" - end - - def self.encoding(charset) - @ic = Iconv.new('UTF-8', charset) - rescue Iconv::InvalidEncoding - return false - end - - def self.establish_connection(params) - constants.each do |const| - klass = const_get(const) - next unless klass.respond_to? 'establish_connection' - klass.establish_connection params - end - end - - def self.encode(text) - @ic.iconv text - rescue - text - end - end - - puts - if Redmine::DefaultData::Loader.no_data? - puts "Redmine configuration need to be loaded before importing data." - puts "Please, run this first:" - puts - puts " rake redmine:load_default_data RAILS_ENV=\"#{ENV['RAILS_ENV']}\"" - exit - end - - puts "WARNING: Your Redmine data will be deleted during this process." - print "Are you sure you want to continue ? [y/N] " - STDOUT.flush - break unless STDIN.gets.match(/^y$/i) - - # Default Mantis database settings - db_params = {:adapter => 'mysql', - :database => 'bugtracker', - :host => 'localhost', - :username => 'root', - :password => '' } - - puts - puts "Please enter settings for your Mantis database" - [:adapter, :host, :database, :username, :password].each do |param| - print "#{param} [#{db_params[param]}]: " - value = STDIN.gets.chomp! - db_params[param] = value unless value.blank? - end - - while true - print "encoding [UTF-8]: " - STDOUT.flush - encoding = STDIN.gets.chomp! - encoding = 'UTF-8' if encoding.blank? - break if MantisMigrate.encoding encoding - puts "Invalid encoding!" - end - puts - - # Make sure bugs can refer bugs in other projects - Setting.cross_project_issue_relations = 1 if Setting.respond_to? 'cross_project_issue_relations' - - # Turn off email notifications - Setting.notified_events = [] - - MantisMigrate.establish_connection db_params - MantisMigrate.migrate -end -end +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + + +desc 'Mantis migration script' + +require 'active_record' +require 'iconv' +require 'pp' + +namespace :redmine do +task :migrate_from_mantis => :environment do + + module MantisMigrate + + DEFAULT_STATUS = IssueStatus.default + assigned_status = IssueStatus.find_by_position(2) + resolved_status = IssueStatus.find_by_position(3) + feedback_status = IssueStatus.find_by_position(4) + closed_status = IssueStatus.find :first, :conditions => { :is_closed => true } + STATUS_MAPPING = {10 => DEFAULT_STATUS, # new + 20 => feedback_status, # feedback + 30 => DEFAULT_STATUS, # acknowledged + 40 => DEFAULT_STATUS, # confirmed + 50 => assigned_status, # assigned + 80 => resolved_status, # resolved + 90 => closed_status # closed + } + + priorities = IssuePriority.all + DEFAULT_PRIORITY = priorities[2] + PRIORITY_MAPPING = {10 => priorities[1], # none + 20 => priorities[1], # low + 30 => priorities[2], # normal + 40 => priorities[3], # high + 50 => priorities[4], # urgent + 60 => priorities[5] # immediate + } + + TRACKER_BUG = Tracker.find_by_position(1) + TRACKER_FEATURE = Tracker.find_by_position(2) + + roles = Role.find(:all, :conditions => {:builtin => 0}, :order => 'position ASC') + manager_role = roles[0] + developer_role = roles[1] + DEFAULT_ROLE = roles.last + ROLE_MAPPING = {10 => DEFAULT_ROLE, # viewer + 25 => DEFAULT_ROLE, # reporter + 40 => DEFAULT_ROLE, # updater + 55 => developer_role, # developer + 70 => manager_role, # manager + 90 => manager_role # administrator + } + + CUSTOM_FIELD_TYPE_MAPPING = {0 => 'string', # String + 1 => 'int', # Numeric + 2 => 'int', # Float + 3 => 'list', # Enumeration + 4 => 'string', # Email + 5 => 'bool', # Checkbox + 6 => 'list', # List + 7 => 'list', # Multiselection list + 8 => 'date', # Date + } + + RELATION_TYPE_MAPPING = {1 => IssueRelation::TYPE_RELATES, # related to + 2 => IssueRelation::TYPE_RELATES, # parent of + 3 => IssueRelation::TYPE_RELATES, # child of + 0 => IssueRelation::TYPE_DUPLICATES, # duplicate of + 4 => IssueRelation::TYPE_DUPLICATES # has duplicate + } + + class MantisUser < ActiveRecord::Base + set_table_name :mantis_user_table + + def firstname + @firstname = realname.blank? ? username : realname.split.first[0..29] + @firstname + end + + def lastname + @lastname = realname.blank? ? '-' : realname.split[1..-1].join(' ')[0..29] + @lastname = '-' if @lastname.blank? + @lastname + end + + def email + if read_attribute(:email).match(/^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i) && + !User.find_by_mail(read_attribute(:email)) + @email = read_attribute(:email) + else + @email = "#{username}@foo.bar" + end + end + + def username + read_attribute(:username)[0..29].gsub(/[^a-zA-Z0-9_\-@\.]/, '-') + end + end + + class MantisProject < ActiveRecord::Base + set_table_name :mantis_project_table + has_many :versions, :class_name => "MantisVersion", :foreign_key => :project_id + has_many :categories, :class_name => "MantisCategory", :foreign_key => :project_id + has_many :news, :class_name => "MantisNews", :foreign_key => :project_id + has_many :members, :class_name => "MantisProjectUser", :foreign_key => :project_id + + def identifier + read_attribute(:name).gsub(/[^a-z0-9\-]+/, '-').slice(0, Project::IDENTIFIER_MAX_LENGTH) + end + end + + class MantisVersion < ActiveRecord::Base + set_table_name :mantis_project_version_table + + def version + read_attribute(:version)[0..29] + end + + def description + read_attribute(:description)[0..254] + end + end + + class MantisCategory < ActiveRecord::Base + set_table_name :mantis_project_category_table + end + + class MantisProjectUser < ActiveRecord::Base + set_table_name :mantis_project_user_list_table + end + + class MantisBug < ActiveRecord::Base + set_table_name :mantis_bug_table + belongs_to :bug_text, :class_name => "MantisBugText", :foreign_key => :bug_text_id + has_many :bug_notes, :class_name => "MantisBugNote", :foreign_key => :bug_id + has_many :bug_files, :class_name => "MantisBugFile", :foreign_key => :bug_id + has_many :bug_monitors, :class_name => "MantisBugMonitor", :foreign_key => :bug_id + end + + class MantisBugText < ActiveRecord::Base + set_table_name :mantis_bug_text_table + + # Adds Mantis steps_to_reproduce and additional_information fields + # to description if any + def full_description + full_description = description + full_description += "\n\n*Steps to reproduce:*\n\n#{steps_to_reproduce}" unless steps_to_reproduce.blank? + full_description += "\n\n*Additional information:*\n\n#{additional_information}" unless additional_information.blank? + full_description + end + end + + class MantisBugNote < ActiveRecord::Base + set_table_name :mantis_bugnote_table + belongs_to :bug, :class_name => "MantisBug", :foreign_key => :bug_id + belongs_to :bug_note_text, :class_name => "MantisBugNoteText", :foreign_key => :bugnote_text_id + end + + class MantisBugNoteText < ActiveRecord::Base + set_table_name :mantis_bugnote_text_table + end + + class MantisBugFile < ActiveRecord::Base + set_table_name :mantis_bug_file_table + + def size + filesize + end + + def original_filename + MantisMigrate.encode(filename) + end + + def content_type + file_type + end + + def read(*args) + if @read_finished + nil + else + @read_finished = true + content + end + end + end + + class MantisBugRelationship < ActiveRecord::Base + set_table_name :mantis_bug_relationship_table + end + + class MantisBugMonitor < ActiveRecord::Base + set_table_name :mantis_bug_monitor_table + end + + class MantisNews < ActiveRecord::Base + set_table_name :mantis_news_table + end + + class MantisCustomField < ActiveRecord::Base + set_table_name :mantis_custom_field_table + set_inheritance_column :none + has_many :values, :class_name => "MantisCustomFieldString", :foreign_key => :field_id + has_many :projects, :class_name => "MantisCustomFieldProject", :foreign_key => :field_id + + def format + read_attribute :type + end + + def name + read_attribute(:name)[0..29] + end + end + + class MantisCustomFieldProject < ActiveRecord::Base + set_table_name :mantis_custom_field_project_table + end + + class MantisCustomFieldString < ActiveRecord::Base + set_table_name :mantis_custom_field_string_table + end + + + def self.migrate + + # Users + print "Migrating users" + User.delete_all "login <> 'admin'" + users_map = {} + users_migrated = 0 + MantisUser.find(:all).each do |user| + u = User.new :firstname => encode(user.firstname), + :lastname => encode(user.lastname), + :mail => user.email, + :last_login_on => user.last_visit + u.login = user.username + u.password = 'mantis' + u.status = User::STATUS_LOCKED if user.enabled != 1 + u.admin = true if user.access_level == 90 + next unless u.save! + users_migrated += 1 + users_map[user.id] = u.id + print '.' + end + puts + + # Projects + print "Migrating projects" + Project.destroy_all + projects_map = {} + versions_map = {} + categories_map = {} + MantisProject.find(:all).each do |project| + p = Project.new :name => encode(project.name), + :description => encode(project.description) + p.identifier = project.identifier + next unless p.save + projects_map[project.id] = p.id + p.enabled_module_names = ['issue_tracking', 'news', 'wiki'] + p.trackers << TRACKER_BUG + p.trackers << TRACKER_FEATURE + print '.' + + # Project members + project.members.each do |member| + m = Member.new :user => User.find_by_id(users_map[member.user_id]), + :roles => [ROLE_MAPPING[member.access_level] || DEFAULT_ROLE] + m.project = p + m.save + end + + # Project versions + project.versions.each do |version| + v = Version.new :name => encode(version.version), + :description => encode(version.description), + :effective_date => (version.date_order ? version.date_order.to_date : nil) + v.project = p + v.save + versions_map[version.id] = v.id + end + + # Project categories + project.categories.each do |category| + g = IssueCategory.new :name => category.category[0,30] + g.project = p + g.save + categories_map[category.category] = g.id + end + end + puts + + # Bugs + print "Migrating bugs" + Issue.destroy_all + issues_map = {} + keep_bug_ids = (Issue.count == 0) + MantisBug.find_each(:batch_size => 200) do |bug| + next unless projects_map[bug.project_id] && users_map[bug.reporter_id] + i = Issue.new :project_id => projects_map[bug.project_id], + :subject => encode(bug.summary), + :description => encode(bug.bug_text.full_description), + :priority => PRIORITY_MAPPING[bug.priority] || DEFAULT_PRIORITY, + :created_on => bug.date_submitted, + :updated_on => bug.last_updated + i.author = User.find_by_id(users_map[bug.reporter_id]) + i.category = IssueCategory.find_by_project_id_and_name(i.project_id, bug.category[0,30]) unless bug.category.blank? + i.fixed_version = Version.find_by_project_id_and_name(i.project_id, bug.fixed_in_version) unless bug.fixed_in_version.blank? + i.status = STATUS_MAPPING[bug.status] || DEFAULT_STATUS + i.tracker = (bug.severity == 10 ? TRACKER_FEATURE : TRACKER_BUG) + i.id = bug.id if keep_bug_ids + next unless i.save + issues_map[bug.id] = i.id + print '.' + STDOUT.flush + + # Assignee + # Redmine checks that the assignee is a project member + if (bug.handler_id && users_map[bug.handler_id]) + i.assigned_to = User.find_by_id(users_map[bug.handler_id]) + i.save_with_validation(false) + end + + # Bug notes + bug.bug_notes.each do |note| + next unless users_map[note.reporter_id] + n = Journal.new :notes => encode(note.bug_note_text.note), + :created_on => note.date_submitted + n.user = User.find_by_id(users_map[note.reporter_id]) + n.journalized = i + n.save + end + + # Bug files + bug.bug_files.each do |file| + a = Attachment.new :created_on => file.date_added + a.file = file + a.author = User.find :first + a.container = i + a.save + end + + # Bug monitors + bug.bug_monitors.each do |monitor| + next unless users_map[monitor.user_id] + i.add_watcher(User.find_by_id(users_map[monitor.user_id])) + end + end + + # update issue id sequence if needed (postgresql) + Issue.connection.reset_pk_sequence!(Issue.table_name) if Issue.connection.respond_to?('reset_pk_sequence!') + puts + + # Bug relationships + print "Migrating bug relations" + MantisBugRelationship.find(:all).each do |relation| + next unless issues_map[relation.source_bug_id] && issues_map[relation.destination_bug_id] + r = IssueRelation.new :relation_type => RELATION_TYPE_MAPPING[relation.relationship_type] + r.issue_from = Issue.find_by_id(issues_map[relation.source_bug_id]) + r.issue_to = Issue.find_by_id(issues_map[relation.destination_bug_id]) + pp r unless r.save + print '.' + STDOUT.flush + end + puts + + # News + print "Migrating news" + News.destroy_all + MantisNews.find(:all, :conditions => 'project_id > 0').each do |news| + next unless projects_map[news.project_id] + n = News.new :project_id => projects_map[news.project_id], + :title => encode(news.headline[0..59]), + :description => encode(news.body), + :created_on => news.date_posted + n.author = User.find_by_id(users_map[news.poster_id]) + n.save + print '.' + STDOUT.flush + end + puts + + # Custom fields + print "Migrating custom fields" + IssueCustomField.destroy_all + MantisCustomField.find(:all).each do |field| + f = IssueCustomField.new :name => field.name[0..29], + :field_format => CUSTOM_FIELD_TYPE_MAPPING[field.format], + :min_length => field.length_min, + :max_length => field.length_max, + :regexp => field.valid_regexp, + :possible_values => field.possible_values.split('|'), + :is_required => field.require_report? + next unless f.save + print '.' + STDOUT.flush + # Trackers association + f.trackers = Tracker.find :all + + # Projects association + field.projects.each do |project| + f.projects << Project.find_by_id(projects_map[project.project_id]) if projects_map[project.project_id] + end + + # Values + field.values.each do |value| + v = CustomValue.new :custom_field_id => f.id, + :value => value.value + v.customized = Issue.find_by_id(issues_map[value.bug_id]) if issues_map[value.bug_id] + v.save + end unless f.new_record? + end + puts + + puts + puts "Users: #{users_migrated}/#{MantisUser.count}" + puts "Projects: #{Project.count}/#{MantisProject.count}" + puts "Memberships: #{Member.count}/#{MantisProjectUser.count}" + puts "Versions: #{Version.count}/#{MantisVersion.count}" + puts "Categories: #{IssueCategory.count}/#{MantisCategory.count}" + puts "Bugs: #{Issue.count}/#{MantisBug.count}" + puts "Bug notes: #{Journal.count}/#{MantisBugNote.count}" + puts "Bug files: #{Attachment.count}/#{MantisBugFile.count}" + puts "Bug relations: #{IssueRelation.count}/#{MantisBugRelationship.count}" + puts "Bug monitors: #{Watcher.count}/#{MantisBugMonitor.count}" + puts "News: #{News.count}/#{MantisNews.count}" + puts "Custom fields: #{IssueCustomField.count}/#{MantisCustomField.count}" + end + + def self.encoding(charset) + @ic = Iconv.new('UTF-8', charset) + rescue Iconv::InvalidEncoding + return false + end + + def self.establish_connection(params) + constants.each do |const| + klass = const_get(const) + next unless klass.respond_to? 'establish_connection' + klass.establish_connection params + end + end + + def self.encode(text) + @ic.iconv text + rescue + text + end + end + + puts + if Redmine::DefaultData::Loader.no_data? + puts "Redmine configuration need to be loaded before importing data." + puts "Please, run this first:" + puts + puts " rake redmine:load_default_data RAILS_ENV=\"#{ENV['RAILS_ENV']}\"" + exit + end + + puts "WARNING: Your Redmine data will be deleted during this process." + print "Are you sure you want to continue ? [y/N] " + STDOUT.flush + break unless STDIN.gets.match(/^y$/i) + + # Default Mantis database settings + db_params = {:adapter => 'mysql', + :database => 'bugtracker', + :host => 'localhost', + :username => 'root', + :password => '' } + + puts + puts "Please enter settings for your Mantis database" + [:adapter, :host, :database, :username, :password].each do |param| + print "#{param} [#{db_params[param]}]: " + value = STDIN.gets.chomp! + db_params[param] = value unless value.blank? + end + + while true + print "encoding [UTF-8]: " + STDOUT.flush + encoding = STDIN.gets.chomp! + encoding = 'UTF-8' if encoding.blank? + break if MantisMigrate.encoding encoding + puts "Invalid encoding!" + end + puts + + # Make sure bugs can refer bugs in other projects + Setting.cross_project_issue_relations = 1 if Setting.respond_to? 'cross_project_issue_relations' + + # Turn off email notifications + Setting.notified_events = [] + + MantisMigrate.establish_connection db_params + MantisMigrate.migrate +end +end diff --git a/lib/tasks/migrate_from_trac.rake b/lib/tasks/migrate_from_trac.rake index f124703d..08b2d24f 100644 --- a/lib/tasks/migrate_from_trac.rake +++ b/lib/tasks/migrate_from_trac.rake @@ -1,19 +1,16 @@ -# redMine - project management software -# Copyright (C) 2006-2007 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# See doc/COPYRIGHT.rdoc for more details. +#++ + require 'active_record' require 'iconv' @@ -758,10 +755,10 @@ namespace :redmine do prompt('Trac database encoding', :default => 'UTF-8') {|encoding| TracMigrate.encoding encoding} prompt('Target project identifier') {|identifier| TracMigrate.target_project_identifier identifier} puts - + # Turn off email notifications Setting.notified_events = [] - + TracMigrate.migrate end end diff --git a/lib/tasks/migrate_plugins.rake b/lib/tasks/migrate_plugins.rake index 61df9c3f..fb279d62 100644 --- a/lib/tasks/migrate_plugins.rake +++ b/lib/tasks/migrate_plugins.rake @@ -1,15 +1,28 @@ -namespace :db do - desc 'Migrates installed plugins.' - task :migrate_plugins => :environment do - if Rails.respond_to?('plugins') - Rails.plugins.each do |plugin| - next unless plugin.respond_to?('migrate') - puts "Migrating #{plugin.name}..." - plugin.migrate - end - else - puts "Undefined method plugins for Rails!" - puts "Make sure engines plugin is installed." - end - end -end +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + +namespace :db do + desc 'Migrates installed plugins.' + task :migrate_plugins => :environment do + if Rails.respond_to?('plugins') + Rails.plugins.each do |plugin| + next unless plugin.respond_to?('migrate') + puts "Migrating #{plugin.name}..." + plugin.migrate + end + else + puts "Undefined method plugins for Rails!" + puts "Make sure engines plugin is installed." + end + end +end diff --git a/lib/tasks/permissions.rake b/lib/tasks/permissions.rake index 02ce1b2a..f04448d2 100644 --- a/lib/tasks/permissions.rake +++ b/lib/tasks/permissions.rake @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + namespace :redmine do desc "List all permissions and the actions registered with them" task :permissions => :environment do diff --git a/lib/tasks/plugins.rake b/lib/tasks/plugins.rake index 13687716..33013011 100644 --- a/lib/tasks/plugins.rake +++ b/lib/tasks/plugins.rake @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + require 'source_annotation_extractor' # Modified version of the SourceAnnotationExtractor in railties diff --git a/lib/tasks/release.rake b/lib/tasks/release.rake new file mode 100644 index 00000000..2f793e80 --- /dev/null +++ b/lib/tasks/release.rake @@ -0,0 +1,37 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + +require 'fileutils' + +desc "Package up a ChiliProject release from git. example: `rake release[1.1.0]`" +task :release, [:version] do |task, args| + version = args[:version] + abort "Missing version in the form of 1.0.0" unless version.present? + + dir = Pathname.new(ENV['HOME']) + 'dev' + 'chiliproject' + 'packages' + FileUtils.mkdir_p dir + + commands = [ + "cd #{dir}", + "git clone git://github.com/chiliproject/chiliproject.git chiliproject-#{version}", + "cd chiliproject-#{version}/", + "git checkout v#{version}", + "rm -vRf #{dir}/chiliproject-#{version}/.git", + "cd #{dir}", + "tar -zcvf chiliproject-#{version}.tar.gz chiliproject-#{version}", + "zip -r -9 chiliproject-#{version}.zip chiliproject-#{version}", + "md5sum chiliproject-#{version}.tar.gz chiliproject-#{version}.zip > chiliproject-#{version}.md5sum", + "echo 'Release ready'" + ].join(' && ') + system(commands) +end diff --git a/lib/tasks/reminder.rake b/lib/tasks/reminder.rake index d11c7ceb..721c3610 100644 --- a/lib/tasks/reminder.rake +++ b/lib/tasks/reminder.rake @@ -1,19 +1,16 @@ -# redMine - project management software -# Copyright (C) 2008 Jean-Philippe Lang +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team # # 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 # of the License, 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + desc <<-END_DESC Send reminders about issues due in the next days. @@ -35,7 +32,7 @@ namespace :redmine do options[:project] = ENV['project'] if ENV['project'] options[:tracker] = ENV['tracker'].to_i if ENV['tracker'] options[:users] = (ENV['users'] || '').split(',').each(&:strip!) - + Mailer.reminders(options) end end diff --git a/lib/tasks/testing.rake b/lib/tasks/testing.rake index 266dcf9c..18633348 100644 --- a/lib/tasks/testing.rake +++ b/lib/tasks/testing.rake @@ -1,91 +1,104 @@ -### From http://svn.geekdaily.org/public/rails/plugins/generally_useful/tasks/coverage_via_rcov.rake - -namespace :test do - desc 'Measures test coverage' - task :coverage do - rm_f "coverage" - rm_f "coverage.data" - rcov = "rcov --rails --aggregate coverage.data --text-summary -Ilib --html" - files = Dir.glob("test/**/*_test.rb").join(" ") - system("#{rcov} #{files}") - system("open coverage/index.html") if PLATFORM['darwin'] - end - - desc 'Run unit and functional scm tests' - task :scm do - errors = %w(test:scm:units test:scm:functionals).collect do |task| - begin - Rake::Task[task].invoke - nil - rescue => e - task - end - end.compact - abort "Errors running #{errors.to_sentence(:locale => :en)}!" if errors.any? - end - - namespace :scm do - namespace :setup do - desc "Creates directory for test repositories" - task :create_dir do - FileUtils.mkdir_p Rails.root + '/tmp/test' - end - - supported_scms = [:subversion, :cvs, :bazaar, :mercurial, :git, :darcs, :filesystem] - - desc "Creates a test subversion repository" - task :subversion => :create_dir do - repo_path = "tmp/test/subversion_repository" - system "svnadmin create #{repo_path}" - system "gunzip < test/fixtures/repositories/subversion_repository.dump.gz | svnadmin load #{repo_path}" - end - - desc "Creates a test mercurial repository" - task :mercurial => :create_dir do - repo_path = "tmp/test/mercurial_repository" - bundle_path = "test/fixtures/repositories/mercurial_repository.hg" - system "hg init #{repo_path}" - system "hg -R #{repo_path} pull #{bundle_path}" - end - - (supported_scms - [:subversion, :mercurial]).each do |scm| - desc "Creates a test #{scm} repository" - task scm => :create_dir do +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + +### From http://svn.geekdaily.org/public/rails/plugins/generally_useful/tasks/coverage_via_rcov.rake + +namespace :test do + desc 'Measures test coverage' + task :coverage do + rm_f "coverage" + rm_f "coverage.data" + rcov = "rcov --rails --aggregate coverage.data --text-summary -Ilib --html" + files = Dir.glob("test/**/*_test.rb").join(" ") + system("#{rcov} #{files}") + system("open coverage/index.html") if PLATFORM['darwin'] + end + + desc 'Run unit and functional scm tests' + task :scm do + errors = %w(test:scm:units test:scm:functionals).collect do |task| + begin + Rake::Task[task].invoke + nil + rescue => e + task + end + end.compact + abort "Errors running #{errors.to_sentence(:locale => :en)}!" if errors.any? + end + + namespace :scm do + namespace :setup do + desc "Creates directory for test repositories" + task :create_dir do + FileUtils.mkdir_p Rails.root + '/tmp/test' + end + + supported_scms = [:subversion, :cvs, :bazaar, :mercurial, :git, :darcs, :filesystem] + + desc "Creates a test subversion repository" + task :subversion => :create_dir do + repo_path = "tmp/test/subversion_repository" + system "svnadmin create #{repo_path}" + system "gunzip < test/fixtures/repositories/subversion_repository.dump.gz | svnadmin load #{repo_path}" + end + + desc "Creates a test mercurial repository" + task :mercurial => :create_dir do + repo_path = "tmp/test/mercurial_repository" + bundle_path = "test/fixtures/repositories/mercurial_repository.hg" + system "hg init #{repo_path}" + system "hg -R #{repo_path} pull #{bundle_path}" + end + + (supported_scms - [:subversion, :mercurial]).each do |scm| + desc "Creates a test #{scm} repository" + task scm => :create_dir do # system "gunzip < test/fixtures/repositories/#{scm}_repository.tar.gz | tar -xv -C tmp/test" system "tar -xvz -C tmp/test -f test/fixtures/repositories/#{scm}_repository.tar.gz" - end - end - - desc "Creates all test repositories" - task :all => supported_scms - end - - desc "Updates installed test repositories" - task :update do - require 'fileutils' - Dir.glob("tmp/test/*_repository").each do |dir| - next unless File.basename(dir) =~ %r{^(.+)_repository$} && File.directory?(dir) - scm = $1 - next unless fixture = Dir.glob("test/fixtures/repositories/#{scm}_repository.*").first - next if File.stat(dir).ctime > File.stat(fixture).mtime - - FileUtils.rm_rf dir - Rake::Task["test:scm:setup:#{scm}"].execute - end - end - - Rake::TestTask.new(:units => "db:test:prepare") do |t| - t.libs << "test" - t.verbose = true - t.test_files = FileList['test/unit/repository*_test.rb'] + FileList['test/unit/lib/redmine/scm/**/*_test.rb'] - end - Rake::Task['test:scm:units'].comment = "Run the scm unit tests" - - Rake::TestTask.new(:functionals => "db:test:prepare") do |t| - t.libs << "test" - t.verbose = true - t.test_files = FileList['test/functional/repositories*_test.rb'] - end - Rake::Task['test:scm:functionals'].comment = "Run the scm functional tests" - end -end + end + end + + desc "Creates all test repositories" + task :all => supported_scms + end + + desc "Updates installed test repositories" + task :update do + require 'fileutils' + Dir.glob("tmp/test/*_repository").each do |dir| + next unless File.basename(dir) =~ %r{^(.+)_repository$} && File.directory?(dir) + scm = $1 + next unless fixture = Dir.glob("test/fixtures/repositories/#{scm}_repository.*").first + next if File.stat(dir).ctime > File.stat(fixture).mtime + + FileUtils.rm_rf dir + Rake::Task["test:scm:setup:#{scm}"].execute + end + end + + Rake::TestTask.new(:units => "db:test:prepare") do |t| + t.libs << "test" + t.verbose = true + t.test_files = FileList['test/unit/repository*_test.rb'] + FileList['test/unit/lib/redmine/scm/**/*_test.rb'] + end + Rake::Task['test:scm:units'].comment = "Run the scm unit tests" + + Rake::TestTask.new(:functionals => "db:test:prepare") do |t| + t.libs << "test" + t.verbose = true + t.test_files = FileList['test/functional/repositories*_test.rb'] + end + Rake::Task['test:scm:functionals'].comment = "Run the scm functional tests" + end +end diff --git a/lib/tasks/watchers.rake b/lib/tasks/watchers.rake index caa9e05f..d9235f57 100644 --- a/lib/tasks/watchers.rake +++ b/lib/tasks/watchers.rake @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + desc 'Removes watchers from what they can no longer view.' namespace :redmine do diff --git a/lib/tasks/yardoc.rake b/lib/tasks/yardoc.rake index aa6c5eeb..41e1efa7 100644 --- a/lib/tasks/yardoc.rake +++ b/lib/tasks/yardoc.rake @@ -1,3 +1,16 @@ +#-- copyright +# ChiliProject is a project management system. +# +# Copyright (C) 2010-2011 the ChiliProject Team +# +# 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 +# of the License, or (at your option) any later version. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + begin require 'yard' diff --git a/public/422.html b/public/422.html new file mode 100644 index 00000000..b54e4a3c --- /dev/null +++ b/public/422.html @@ -0,0 +1,30 @@ + + + + + + + The change you wanted was rejected (422) + + + + + +
    +

    The change you wanted was rejected.

    +

    Maybe you tried to change something you didn't have access to.

    +
    + + \ No newline at end of file diff --git a/public/images/zoom_in.png b/public/images/zoom_in.png index a3d38574..af4fe074 100644 Binary files a/public/images/zoom_in.png and b/public/images/zoom_in.png differ diff --git a/public/images/zoom_in_g.png b/public/images/zoom_in_g.png deleted file mode 100644 index 260f6dbc..00000000 Binary files a/public/images/zoom_in_g.png and /dev/null differ diff --git a/public/images/zoom_out.png b/public/images/zoom_out.png index 819d32b6..81f28199 100644 Binary files a/public/images/zoom_out.png and b/public/images/zoom_out.png differ diff --git a/public/images/zoom_out_g.png b/public/images/zoom_out_g.png deleted file mode 100644 index 57805935..00000000 Binary files a/public/images/zoom_out_g.png and /dev/null differ diff --git a/public/javascripts/application.js b/public/javascripts/application.js index 26671685..11940f3c 100644 --- a/public/javascripts/application.js +++ b/public/javascripts/application.js @@ -40,12 +40,49 @@ function toggleRowGroup(el) { } } +function collapseAllRowGroups(el) { + var tbody = Element.up(el, 'tbody'); + tbody.childElements('tr').each(function(tr) { + if (tr.hasClassName('group')) { + tr.removeClassName('open'); + } else { + tr.hide(); + } + }) +} + +function expandAllRowGroups(el) { + var tbody = Element.up(el, 'tbody'); + tbody.childElements('tr').each(function(tr) { + if (tr.hasClassName('group')) { + tr.addClassName('open'); + } else { + tr.show(); + } + }) +} + +function toggleAllRowGroups(el) { + var tr = Element.up(el, 'tr'); + if (tr.hasClassName('open')) { + collapseAllRowGroups(el); + } else { + expandAllRowGroups(el); + } +} + function toggleFieldset(el) { var fieldset = Element.up(el, 'fieldset'); fieldset.toggleClassName('collapsed'); Effect.toggle(fieldset.down('div'), 'slide', {duration:0.2}); } +function hideFieldset(el) { + var fieldset = Element.up(el, 'fieldset'); + fieldset.toggleClassName('collapsed'); + fieldset.down('div').hide(); +} + var fileFieldCount = 1; function addFileField() { @@ -249,10 +286,71 @@ function observeProjectModules() { Event.observe('project_enabled_module_names_issue_tracking', 'change', f); } +/* + * Class used to warn user when leaving a page with unsaved textarea + * Author: mathias.fischer@berlinonline.de +*/ -/* shows and hides ajax indicator */ +var WarnLeavingUnsaved = Class.create({ + observedForms: false, + observedElements: false, + changedForms: false, + message: null, + + initialize: function(message){ + this.observedForms = $$('form'); + this.observedElements = $$('textarea'); + this.message = message; + + this.observedElements.each(this.observeChange.bind(this)); + this.observedForms.each(this.submitAction.bind(this)); + + window.onbeforeunload = this.unload.bind(this); + }, + + unload: function(){ + if(this.changedForms) + return this.message; + }, + + setChanged: function(){ + this.changedForms = true; + }, + + setUnchanged: function(){ + this.changedForms = false; + }, + + observeChange: function(element){ + element.observe('change',this.setChanged.bindAsEventListener(this)); + }, + + submitAction: function(element){ + element.observe('submit',this.setUnchanged.bindAsEventListener(this)); + } +}); + +/* + * 1 - registers a callback which copies the csrf token into the + * X-CSRF-Token header with each ajax request. Necessary to + * work with rails applications which have fixed + * CVE-2011-0447 + * 2 - shows and hides ajax indicator + */ Ajax.Responders.register({ - onCreate: function(){ + onCreate: function(request){ + var csrf_meta_tag = $$('meta[name=csrf-token]')[0]; + + if (csrf_meta_tag) { + var header = 'X-CSRF-Token', + token = csrf_meta_tag.readAttribute('content'); + + if (!request.options.requestHeaders) { + request.options.requestHeaders = {}; + } + request.options.requestHeaders[header] = token; + } + if ($('ajax-indicator') && Ajax.activeRequestCount > 0) { Element.show('ajax-indicator'); } diff --git a/public/javascripts/calendar/lang/calendar-fa.js b/public/javascripts/calendar/lang/calendar-fa.js new file mode 100644 index 00000000..01ebbb2a --- /dev/null +++ b/public/javascripts/calendar/lang/calendar-fa.js @@ -0,0 +1,127 @@ +// ** I18N + +// Calendar FA language +// Author: Behrang Noroozinia, behrangn at g mail +// Encoding: any +// Distributed under the same terms as the calendar itself. + +// For translators: please use UTF-8 if possible. We strongly believe that +// Unicode is the answer to a real internationalized world. Also please +// include your contact information in the header, as can be seen above. + +// full day names +Calendar._DN = new Array +("یک‌شنبه", + "دوشنبه", + "سه‌شنبه", + "چهارشنبه", + "پنج‌شنبه", + "آدینه", + "شنبه", + "یک‌شنبه"); + +// Please note that the following array of short day names (and the same goes +// for short month names, _SMN) isn't absolutely necessary. We give it here +// for exemplification on how one can customize the short day names, but if +// they are simply the first N letters of the full name you can simply say: +// +// Calendar._SDN_len = N; // short day name length +// Calendar._SMN_len = N; // short month name length +// +// If N = 3 then this is not needed either since we assume a value of 3 if not +// present, to be compatible with translation files that were written before +// this feature. + +// short day names +Calendar._SDN = new Array +("یک", + "دو", + "سه", + "چهار", + "پنج", + "آدینه", + "شنبه", + "یک"); + +// First day of the week. "0" means display Sunday first, "1" means display +// Monday first, etc. +Calendar._FD = 0; + +// full month names +Calendar._MN = new Array +("ژانویه", + "فوریه", + "مارس", + "آوریل", + "مه", + "ژوئن", + "ژوئیه", + "اوت", + "سپتامبر", + "اکتبر", + "نوامبر", + "دسامبر"); + +// short month names +Calendar._SMN = new Array +("ژان", + "فور", + "مار", + "آور", + "مه", + "ژوئن", + "ژوئیه", + "اوت", + "سپت", + "اکت", + "نوا", + "دسا"); + +// tooltips +Calendar._TT = {}; +Calendar._TT["INFO"] = "درباره گاهشمار"; + +Calendar._TT["ABOUT"] = +"DHTML Date/Time Selector\n" + +"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-) +"For latest version visit: http://www.dynarch.com/projects/calendar/\n" + +"Distributed under GNU LGPL. See http://gnu.org/licenses/lgpl.html for details." + +"\n\n" + +"Date selection:\n" + +"- Use the \xab, \xbb buttons to select year\n" + +"- Use the " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " buttons to select month\n" + +"- Hold mouse button on any of the above buttons for faster selection."; +Calendar._TT["ABOUT_TIME"] = "\n\n" + +"Time selection:\n" + +"- Click on any of the time parts to increase it\n" + +"- or Shift-click to decrease it\n" + +"- or click and drag for faster selection."; + +Calendar._TT["PREV_YEAR"] = "سال پیشین (برای فهرست نگه دارید)"; +Calendar._TT["PREV_MONTH"] = "ماه پیشین ( برای فهرست نگه دارید)"; +Calendar._TT["GO_TODAY"] = "برو به امروز"; +Calendar._TT["NEXT_MONTH"] = "ماه پسین (برای فهرست نگه دارید)"; +Calendar._TT["NEXT_YEAR"] = "سال پسین (برای فهرست نگه دارید)"; +Calendar._TT["SEL_DATE"] = "گزینش"; +Calendar._TT["DRAG_TO_MOVE"] = "برای جابجایی بکشید"; +Calendar._TT["PART_TODAY"] = " (امروز)"; + +// the following is to inform that "%s" is to be the first day of week +// %s will be replaced with the day name. +Calendar._TT["DAY_FIRST"] = "آغاز هفته از %s"; + +// This may be locale-dependent. It specifies the week-end days, as an array +// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1 +// means Monday, etc. +Calendar._TT["WEEKEND"] = "4,5"; + +Calendar._TT["CLOSE"] = "بسته"; +Calendar._TT["TODAY"] = "امروز"; +Calendar._TT["TIME_PART"] = "زدن (با Shift) یا کشیدن برای ویرایش"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d"; +Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e"; + +Calendar._TT["WK"] = "هفته"; +Calendar._TT["TIME"] = "زمان:"; diff --git a/public/javascripts/context_menu.js b/public/javascripts/context_menu.js index 4110c3d4..79d8ebba 100644 --- a/public/javascripts/context_menu.js +++ b/public/javascripts/context_menu.js @@ -11,7 +11,7 @@ ContextMenu.prototype = { if (!observingContextMenuClick) { Event.observe(document, 'click', this.Click.bindAsEventListener(this)); - Event.observe(document, (window.opera ? 'click' : 'contextmenu'), this.RightClick.bindAsEventListener(this)); + Event.observe(document, 'contextmenu', this.RightClick.bindAsEventListener(this)); observingContextMenuClick = true; } @@ -23,8 +23,6 @@ ContextMenu.prototype = { this.hideMenu(); // do not show the context menu on links if (Event.element(e).tagName == 'A') { return; } - // right-click simulated by Alt+Click with Opera - if (window.opera && !e.altKey) { return; } var tr = Event.findElement(e, 'tr'); if (tr == document || tr == undefined || !tr.hasClassName('hascontextmenu')) { return; } Event.stop(e); @@ -39,7 +37,6 @@ ContextMenu.prototype = { Click: function(e) { this.hideMenu(); if (Event.element(e).tagName == 'A') { return; } - if (window.opera && e.altKey) { return; } if (!Event.isRightClick(e) || (navigator.appVersion.match(/\bMSIE\b/))) { var tr = Event.findElement(e, 'tr'); if (tr!=null && tr!=document && tr.hasClassName('hascontextmenu')) { diff --git a/public/javascripts/controls.js b/public/javascripts/controls.js index ca29aefd..5137ab51 100644 --- a/public/javascripts/controls.js +++ b/public/javascripts/controls.js @@ -1,6 +1,8 @@ -// Copyright (c) 2005-2008 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) -// (c) 2005-2008 Ivan Krstic (http://blogs.law.harvard.edu/ivan) -// (c) 2005-2008 Jon Tirsen (http://www.tirsen.com) +// script.aculo.us controls.js v1.9.0, Thu Dec 23 16:54:48 -0500 2010 + +// Copyright (c) 2005-2010 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) +// (c) 2005-2010 Ivan Krstic (http://blogs.law.harvard.edu/ivan) +// (c) 2005-2010 Jon Tirsen (http://www.tirsen.com) // Contributors: // Richard Livsey // Rahul Bhargava diff --git a/public/javascripts/dragdrop.js b/public/javascripts/dragdrop.js index 07229f98..9ebfe24d 100644 --- a/public/javascripts/dragdrop.js +++ b/public/javascripts/dragdrop.js @@ -1,5 +1,6 @@ -// Copyright (c) 2005-2008 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) -// (c) 2005-2008 Sammi Williams (http://www.oriontransfer.co.nz, sammi@oriontransfer.co.nz) +// script.aculo.us dragdrop.js v1.9.0, Thu Dec 23 16:54:48 -0500 2010 + +// Copyright (c) 2005-2010 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) // // script.aculo.us is freely distributable under the terms of an MIT-style license. // For details, see the script.aculo.us web site: http://script.aculo.us/ @@ -311,7 +312,7 @@ var Draggable = Class.create({ tag_name=='TEXTAREA')) return; var pointer = [Event.pointerX(event), Event.pointerY(event)]; - var pos = Position.cumulativeOffset(this.element); + var pos = this.element.cumulativeOffset(); this.offset = [0,1].map( function(i) { return (pointer[i] - pos[i]) }); Draggables.activate(this); @@ -373,7 +374,7 @@ var Draggable = Class.create({ if (this.options.scroll == window) { with(this._getWindowScroll(this.options.scroll)) { p = [ left, top, left+width, top+height ]; } } else { - p = Position.page(this.options.scroll); + p = Position.page(this.options.scroll).toArray(); p[0] += this.options.scroll.scrollLeft + Position.deltaX; p[1] += this.options.scroll.scrollTop + Position.deltaY; p.push(p[0]+this.options.scroll.offsetWidth); @@ -454,7 +455,7 @@ var Draggable = Class.create({ }, draw: function(point) { - var pos = Position.cumulativeOffset(this.element); + var pos = this.element.cumulativeOffset(); if(this.options.ghosting) { var r = Position.realOffset(this.element); pos[0] += r[0] - Position.deltaX; pos[1] += r[1] - Position.deltaY; @@ -730,7 +731,7 @@ var Sortable = { } // keep reference - this.sortables[element.id] = options; + this.sortables[element.identify()] = options; // for onupdate Draggables.addObserver(new SortableObserver(element, options.onUpdate)); @@ -825,7 +826,7 @@ var Sortable = { hide().addClassName('dropmarker').setStyle({position:'absolute'}); document.getElementsByTagName("body").item(0).appendChild(Sortable._marker); } - var offsets = Position.cumulativeOffset(dropon); + var offsets = dropon.cumulativeOffset(); Sortable._marker.setStyle({left: offsets[0]+'px', top: offsets[1] + 'px'}); if(position=='after') diff --git a/public/javascripts/effects.js b/public/javascripts/effects.js index 5a639d2d..860ddc09 100644 --- a/public/javascripts/effects.js +++ b/public/javascripts/effects.js @@ -1,4 +1,6 @@ -// Copyright (c) 2005-2008 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) +// script.aculo.us effects.js v1.9.0, Thu Dec 23 16:54:48 -0500 2010 + +// Copyright (c) 2005-2010 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) // Contributors: // Justin Palmer (http://encytemedia.com/) // Mark Pilgrim (http://diveintomark.org/) @@ -145,14 +147,13 @@ var Effect = { 'blind': ['BlindDown','BlindUp'], 'appear': ['Appear','Fade'] }, - toggle: function(element, effect) { + toggle: function(element, effect, options) { element = $(element); - effect = (effect || 'appear').toLowerCase(); - var options = Object.extend({ + effect = (effect || 'appear').toLowerCase(); + + return Effect[ Effect.PAIRS[ effect ][ element.visible() ? 1 : 0 ] ](element, Object.extend({ queue: { position:'end', scope:(element.id || 'global'), limit: 1 } - }, arguments[2] || { }); - Effect[element.visible() ? - Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options); + }, options || {})); } }; @@ -228,12 +229,6 @@ Effect.Queue = Effect.Queues.get('global'); Effect.Base = Class.create({ position: null, start: function(options) { - function codeForEvent(options,eventName){ - return ( - (options[eventName+'Internal'] ? 'this.options.'+eventName+'Internal(this);' : '') + - (options[eventName] ? 'this.options.'+eventName+'(this);' : '') - ); - } if (options && options.transition === false) options.transition = Effect.Transitions.linear; this.options = Object.extend(Object.extend({ },Effect.DefaultOptions), options || { }); this.currentFrame = 0; diff --git a/public/javascripts/jstoolbar/lang/jstoolbar-fa.js b/public/javascripts/jstoolbar/lang/jstoolbar-fa.js new file mode 100644 index 00000000..61236bf6 --- /dev/null +++ b/public/javascripts/jstoolbar/lang/jstoolbar-fa.js @@ -0,0 +1,16 @@ +jsToolBar.strings = {}; +jsToolBar.strings['Strong'] = 'پررنگ'; +jsToolBar.strings['Italic'] = 'کج'; +jsToolBar.strings['Underline'] = 'زیرخط'; +jsToolBar.strings['Deleted'] = 'برداشته شده'; +jsToolBar.strings['Code'] = 'کد درون خطی'; +jsToolBar.strings['Heading 1'] = 'سربرگ ۱'; +jsToolBar.strings['Heading 2'] = 'سربرگ ۲'; +jsToolBar.strings['Heading 3'] = 'سربرگ ۳'; +jsToolBar.strings['Unordered list'] = 'فهرست بدون شماره'; +jsToolBar.strings['Ordered list'] = 'فهرست با شماره'; +jsToolBar.strings['Quote'] = 'تو بردن'; +jsToolBar.strings['Unquote'] = 'بیرون آوردن'; +jsToolBar.strings['Preformatted text'] = 'نوشته قالب بندی شده'; +jsToolBar.strings['Wiki link'] = 'پیوند به برگ ویکی'; +jsToolBar.strings['Image'] = 'عکس'; diff --git a/public/javascripts/prototype.js b/public/javascripts/prototype.js index dfe8ab4e..ba12e075 100644 --- a/public/javascripts/prototype.js +++ b/public/javascripts/prototype.js @@ -1,5 +1,5 @@ -/* Prototype JavaScript framework, version 1.6.0.3 - * (c) 2005-2008 Sam Stephenson +/* Prototype JavaScript framework, version 1.7 + * (c) 2005-2010 Sam Stephenson * * Prototype is freely distributable under the terms of an MIT-style license. * For details, see the Prototype web site: http://www.prototypejs.org/ @@ -7,42 +7,71 @@ *--------------------------------------------------------------------------*/ var Prototype = { - Version: '1.6.0.3', - Browser: { - IE: !!(window.attachEvent && - navigator.userAgent.indexOf('Opera') === -1), - Opera: navigator.userAgent.indexOf('Opera') > -1, - WebKit: navigator.userAgent.indexOf('AppleWebKit/') > -1, - Gecko: navigator.userAgent.indexOf('Gecko') > -1 && - navigator.userAgent.indexOf('KHTML') === -1, - MobileSafari: !!navigator.userAgent.match(/Apple.*Mobile.*Safari/) - }, + Version: '1.7', + + Browser: (function(){ + var ua = navigator.userAgent; + var isOpera = Object.prototype.toString.call(window.opera) == '[object Opera]'; + return { + IE: !!window.attachEvent && !isOpera, + Opera: isOpera, + WebKit: ua.indexOf('AppleWebKit/') > -1, + Gecko: ua.indexOf('Gecko') > -1 && ua.indexOf('KHTML') === -1, + MobileSafari: /Apple.*Mobile/.test(ua) + } + })(), BrowserFeatures: { XPath: !!document.evaluate, + SelectorsAPI: !!document.querySelector, - ElementExtensions: !!window.HTMLElement, - SpecificElementExtensions: - document.createElement('div')['__proto__'] && - document.createElement('div')['__proto__'] !== - document.createElement('form')['__proto__'] + + ElementExtensions: (function() { + var constructor = window.Element || window.HTMLElement; + return !!(constructor && constructor.prototype); + })(), + SpecificElementExtensions: (function() { + if (typeof window.HTMLDivElement !== 'undefined') + return true; + + var div = document.createElement('div'), + form = document.createElement('form'), + isSupported = false; + + if (div['__proto__'] && (div['__proto__'] !== form['__proto__'])) { + isSupported = true; + } + + div = form = null; + + return isSupported; + })() }, ScriptFragment: ']*>([\\S\\s]*?)<\/script>', JSONFilter: /^\/\*-secure-([\s\S]*)\*\/\s*$/, emptyFunction: function() { }, + K: function(x) { return x } }; if (Prototype.Browser.MobileSafari) Prototype.BrowserFeatures.SpecificElementExtensions = false; - - /* Based on Alex Arnell's inheritance implementation. */ -var Class = { - create: function() { + +var Class = (function() { + + var IS_DONTENUM_BUGGY = (function(){ + for (var p in { toString: 1 }) { + if (p === 'toString') return false; + } + return true; + })(); + + function subclass() {}; + function create() { var parent = null, properties = $A(arguments); if (Object.isFunction(properties[0])) parent = properties.shift(); @@ -56,39 +85,39 @@ var Class = { klass.subclasses = []; if (parent) { - var subclass = function() { }; subclass.prototype = parent.prototype; klass.prototype = new subclass; parent.subclasses.push(klass); } - for (var i = 0; i < properties.length; i++) + for (var i = 0, length = properties.length; i < length; i++) klass.addMethods(properties[i]); if (!klass.prototype.initialize) klass.prototype.initialize = Prototype.emptyFunction; klass.prototype.constructor = klass; - return klass; } -}; -Class.Methods = { - addMethods: function(source) { - var ancestor = this.superclass && this.superclass.prototype; - var properties = Object.keys(source); + function addMethods(source) { + var ancestor = this.superclass && this.superclass.prototype, + properties = Object.keys(source); - if (!Object.keys({ toString: true }).length) - properties.push("toString", "valueOf"); + if (IS_DONTENUM_BUGGY) { + if (source.toString != Object.prototype.toString) + properties.push("toString"); + if (source.valueOf != Object.prototype.valueOf) + properties.push("valueOf"); + } for (var i = 0, length = properties.length; i < length; i++) { var property = properties[i], value = source[property]; if (ancestor && Object.isFunction(value) && - value.argumentNames().first() == "$super") { + value.argumentNames()[0] == "$super") { var method = value; value = (function(m) { - return function() { return ancestor[m].apply(this, arguments) }; + return function() { return ancestor[m].apply(this, arguments); }; })(property).wrap(method); value.valueOf = method.valueOf.bind(method); @@ -99,198 +128,338 @@ Class.Methods = { return this; } -}; -var Abstract = { }; + return { + create: create, + Methods: { + addMethods: addMethods + } + }; +})(); +(function() { -Object.extend = function(destination, source) { - for (var property in source) - destination[property] = source[property]; - return destination; -}; + var _toString = Object.prototype.toString, + NULL_TYPE = 'Null', + UNDEFINED_TYPE = 'Undefined', + BOOLEAN_TYPE = 'Boolean', + NUMBER_TYPE = 'Number', + STRING_TYPE = 'String', + OBJECT_TYPE = 'Object', + FUNCTION_CLASS = '[object Function]', + BOOLEAN_CLASS = '[object Boolean]', + NUMBER_CLASS = '[object Number]', + STRING_CLASS = '[object String]', + ARRAY_CLASS = '[object Array]', + DATE_CLASS = '[object Date]', + NATIVE_JSON_STRINGIFY_SUPPORT = window.JSON && + typeof JSON.stringify === 'function' && + JSON.stringify(0) === '0' && + typeof JSON.stringify(Prototype.K) === 'undefined'; -Object.extend(Object, { - inspect: function(object) { + function Type(o) { + switch(o) { + case null: return NULL_TYPE; + case (void 0): return UNDEFINED_TYPE; + } + var type = typeof o; + switch(type) { + case 'boolean': return BOOLEAN_TYPE; + case 'number': return NUMBER_TYPE; + case 'string': return STRING_TYPE; + } + return OBJECT_TYPE; + } + + function extend(destination, source) { + for (var property in source) + destination[property] = source[property]; + return destination; + } + + function inspect(object) { try { - if (Object.isUndefined(object)) return 'undefined'; + if (isUndefined(object)) return 'undefined'; if (object === null) return 'null'; return object.inspect ? object.inspect() : String(object); } catch (e) { if (e instanceof RangeError) return '...'; throw e; } - }, + } - toJSON: function(object) { - var type = typeof object; - switch (type) { - case 'undefined': - case 'function': - case 'unknown': return; - case 'boolean': return object.toString(); + function toJSON(value) { + return Str('', { '': value }, []); + } + + function Str(key, holder, stack) { + var value = holder[key], + type = typeof value; + + if (Type(value) === OBJECT_TYPE && typeof value.toJSON === 'function') { + value = value.toJSON(key); } - if (object === null) return 'null'; - if (object.toJSON) return object.toJSON(); - if (Object.isElement(object)) return; + var _class = _toString.call(value); + switch (_class) { + case NUMBER_CLASS: + case BOOLEAN_CLASS: + case STRING_CLASS: + value = value.valueOf(); + } + + switch (value) { + case null: return 'null'; + case true: return 'true'; + case false: return 'false'; + } + + type = typeof value; + switch (type) { + case 'string': + return value.inspect(true); + case 'number': + return isFinite(value) ? String(value) : 'null'; + case 'object': + + for (var i = 0, length = stack.length; i < length; i++) { + if (stack[i] === value) { throw new TypeError(); } + } + stack.push(value); + + var partial = []; + if (_class === ARRAY_CLASS) { + for (var i = 0, length = value.length; i < length; i++) { + var str = Str(i, value, stack); + partial.push(typeof str === 'undefined' ? 'null' : str); + } + partial = '[' + partial.join(',') + ']'; + } else { + var keys = Object.keys(value); + for (var i = 0, length = keys.length; i < length; i++) { + var key = keys[i], str = Str(key, value, stack); + if (typeof str !== "undefined") { + partial.push(key.inspect(true)+ ':' + str); + } + } + partial = '{' + partial.join(',') + '}'; + } + stack.pop(); + return partial; + } + } + + function stringify(object) { + return JSON.stringify(object); + } + + function toQueryString(object) { + return $H(object).toQueryString(); + } + + function toHTML(object) { + return object && object.toHTML ? object.toHTML() : String.interpret(object); + } + + function keys(object) { + if (Type(object) !== OBJECT_TYPE) { throw new TypeError(); } var results = []; for (var property in object) { - var value = Object.toJSON(object[property]); - if (!Object.isUndefined(value)) - results.push(property.toJSON() + ': ' + value); + if (object.hasOwnProperty(property)) { + results.push(property); + } } - - return '{' + results.join(', ') + '}'; - }, - - toQueryString: function(object) { - return $H(object).toQueryString(); - }, - - toHTML: function(object) { - return object && object.toHTML ? object.toHTML() : String.interpret(object); - }, - - keys: function(object) { - var keys = []; - for (var property in object) - keys.push(property); - return keys; - }, - - values: function(object) { - var values = []; - for (var property in object) - values.push(object[property]); - return values; - }, - - clone: function(object) { - return Object.extend({ }, object); - }, - - isElement: function(object) { - return !!(object && object.nodeType == 1); - }, - - isArray: function(object) { - return object != null && typeof object == "object" && - 'splice' in object && 'join' in object; - }, - - isHash: function(object) { - return object instanceof Hash; - }, - - isFunction: function(object) { - return typeof object == "function"; - }, - - isString: function(object) { - return typeof object == "string"; - }, - - isNumber: function(object) { - return typeof object == "number"; - }, - - isUndefined: function(object) { - return typeof object == "undefined"; + return results; } -}); -Object.extend(Function.prototype, { - argumentNames: function() { - var names = this.toString().match(/^[\s\(]*function[^(]*\(([^\)]*)\)/)[1] + function values(object) { + var results = []; + for (var property in object) + results.push(object[property]); + return results; + } + + function clone(object) { + return extend({ }, object); + } + + function isElement(object) { + return !!(object && object.nodeType == 1); + } + + function isArray(object) { + return _toString.call(object) === ARRAY_CLASS; + } + + var hasNativeIsArray = (typeof Array.isArray == 'function') + && Array.isArray([]) && !Array.isArray({}); + + if (hasNativeIsArray) { + isArray = Array.isArray; + } + + function isHash(object) { + return object instanceof Hash; + } + + function isFunction(object) { + return _toString.call(object) === FUNCTION_CLASS; + } + + function isString(object) { + return _toString.call(object) === STRING_CLASS; + } + + function isNumber(object) { + return _toString.call(object) === NUMBER_CLASS; + } + + function isDate(object) { + return _toString.call(object) === DATE_CLASS; + } + + function isUndefined(object) { + return typeof object === "undefined"; + } + + extend(Object, { + extend: extend, + inspect: inspect, + toJSON: NATIVE_JSON_STRINGIFY_SUPPORT ? stringify : toJSON, + toQueryString: toQueryString, + toHTML: toHTML, + keys: Object.keys || keys, + values: values, + clone: clone, + isElement: isElement, + isArray: isArray, + isHash: isHash, + isFunction: isFunction, + isString: isString, + isNumber: isNumber, + isDate: isDate, + isUndefined: isUndefined + }); +})(); +Object.extend(Function.prototype, (function() { + var slice = Array.prototype.slice; + + function update(array, args) { + var arrayLength = array.length, length = args.length; + while (length--) array[arrayLength + length] = args[length]; + return array; + } + + function merge(array, args) { + array = slice.call(array, 0); + return update(array, args); + } + + function argumentNames() { + var names = this.toString().match(/^[\s\(]*function[^(]*\(([^)]*)\)/)[1] + .replace(/\/\/.*?[\r\n]|\/\*(?:.|[\r\n])*?\*\//g, '') .replace(/\s+/g, '').split(','); return names.length == 1 && !names[0] ? [] : names; - }, + } - bind: function() { + function bind(context) { if (arguments.length < 2 && Object.isUndefined(arguments[0])) return this; - var __method = this, args = $A(arguments), object = args.shift(); + var __method = this, args = slice.call(arguments, 1); return function() { - return __method.apply(object, args.concat($A(arguments))); + var a = merge(args, arguments); + return __method.apply(context, a); } - }, + } - bindAsEventListener: function() { - var __method = this, args = $A(arguments), object = args.shift(); + function bindAsEventListener(context) { + var __method = this, args = slice.call(arguments, 1); return function(event) { - return __method.apply(object, [event || window.event].concat(args)); + var a = update([event || window.event], args); + return __method.apply(context, a); } - }, + } - curry: function() { + function curry() { if (!arguments.length) return this; - var __method = this, args = $A(arguments); + var __method = this, args = slice.call(arguments, 0); return function() { - return __method.apply(this, args.concat($A(arguments))); + var a = merge(args, arguments); + return __method.apply(this, a); } - }, + } - delay: function() { - var __method = this, args = $A(arguments), timeout = args.shift() * 1000; + function delay(timeout) { + var __method = this, args = slice.call(arguments, 1); + timeout = timeout * 1000; return window.setTimeout(function() { return __method.apply(__method, args); }, timeout); - }, + } - defer: function() { - var args = [0.01].concat($A(arguments)); + function defer() { + var args = update([0.01], arguments); return this.delay.apply(this, args); - }, + } - wrap: function(wrapper) { + function wrap(wrapper) { var __method = this; return function() { - return wrapper.apply(this, [__method.bind(this)].concat($A(arguments))); + var a = update([__method.bind(this)], arguments); + return wrapper.apply(this, a); } - }, + } - methodize: function() { + function methodize() { if (this._methodized) return this._methodized; var __method = this; return this._methodized = function() { - return __method.apply(null, [this].concat($A(arguments))); + var a = update([this], arguments); + return __method.apply(null, a); }; } -}); -Date.prototype.toJSON = function() { - return '"' + this.getUTCFullYear() + '-' + - (this.getUTCMonth() + 1).toPaddedString(2) + '-' + - this.getUTCDate().toPaddedString(2) + 'T' + - this.getUTCHours().toPaddedString(2) + ':' + - this.getUTCMinutes().toPaddedString(2) + ':' + - this.getUTCSeconds().toPaddedString(2) + 'Z"'; -}; - -var Try = { - these: function() { - var returnValue; - - for (var i = 0, length = arguments.length; i < length; i++) { - var lambda = arguments[i]; - try { - returnValue = lambda(); - break; - } catch (e) { } - } - - return returnValue; + return { + argumentNames: argumentNames, + bind: bind, + bindAsEventListener: bindAsEventListener, + curry: curry, + delay: delay, + defer: defer, + wrap: wrap, + methodize: methodize } -}; +})()); + + + +(function(proto) { + + + function toISOString() { + return this.getUTCFullYear() + '-' + + (this.getUTCMonth() + 1).toPaddedString(2) + '-' + + this.getUTCDate().toPaddedString(2) + 'T' + + this.getUTCHours().toPaddedString(2) + ':' + + this.getUTCMinutes().toPaddedString(2) + ':' + + this.getUTCSeconds().toPaddedString(2) + 'Z'; + } + + + function toJSON() { + return this.toISOString(); + } + + if (!proto.toISOString) proto.toISOString = toISOString; + if (!proto.toJSON) proto.toJSON = toJSON; + +})(Date.prototype); + RegExp.prototype.match = RegExp.prototype.test; RegExp.escape = function(str) { return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1'); }; - -/*--------------------------------------------------------------------------*/ - var PeriodicalExecuter = Class.create({ initialize: function(callback, frequency) { this.callback = callback; @@ -319,8 +488,10 @@ var PeriodicalExecuter = Class.create({ try { this.currentlyExecuting = true; this.execute(); - } finally { this.currentlyExecuting = false; + } catch(e) { + this.currentlyExecuting = false; + throw e; } } } @@ -339,10 +510,28 @@ Object.extend(String, { } }); -Object.extend(String.prototype, { - gsub: function(pattern, replacement) { +Object.extend(String.prototype, (function() { + var NATIVE_JSON_PARSE_SUPPORT = window.JSON && + typeof JSON.parse === 'function' && + JSON.parse('{"test": true}').test; + + function prepareReplacement(replacement) { + if (Object.isFunction(replacement)) return replacement; + var template = new Template(replacement); + return function(match) { return template.evaluate(match) }; + } + + function gsub(pattern, replacement) { var result = '', source = this, match; - replacement = arguments.callee.prepareReplacement(replacement); + replacement = prepareReplacement(replacement); + + if (Object.isString(pattern)) + pattern = RegExp.escape(pattern); + + if (!(pattern.length || pattern.source)) { + replacement = replacement(''); + return replacement + source.split('').join(replacement) + replacement; + } while (source.length > 0) { if (match = source.match(pattern)) { @@ -354,76 +543,72 @@ Object.extend(String.prototype, { } } return result; - }, + } - sub: function(pattern, replacement, count) { - replacement = this.gsub.prepareReplacement(replacement); + function sub(pattern, replacement, count) { + replacement = prepareReplacement(replacement); count = Object.isUndefined(count) ? 1 : count; return this.gsub(pattern, function(match) { if (--count < 0) return match[0]; return replacement(match); }); - }, + } - scan: function(pattern, iterator) { + function scan(pattern, iterator) { this.gsub(pattern, iterator); return String(this); - }, + } - truncate: function(length, truncation) { + function truncate(length, truncation) { length = length || 30; truncation = Object.isUndefined(truncation) ? '...' : truncation; return this.length > length ? this.slice(0, length - truncation.length) + truncation : String(this); - }, + } - strip: function() { + function strip() { return this.replace(/^\s+/, '').replace(/\s+$/, ''); - }, + } - stripTags: function() { - return this.replace(/<\/?[^>]+>/gi, ''); - }, + function stripTags() { + return this.replace(/<\w+(\s+("[^"]*"|'[^']*'|[^>])+)?>|<\/\w+>/gi, ''); + } - stripScripts: function() { + function stripScripts() { return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), ''); - }, + } - extractScripts: function() { - var matchAll = new RegExp(Prototype.ScriptFragment, 'img'); - var matchOne = new RegExp(Prototype.ScriptFragment, 'im'); + function extractScripts() { + var matchAll = new RegExp(Prototype.ScriptFragment, 'img'), + matchOne = new RegExp(Prototype.ScriptFragment, 'im'); return (this.match(matchAll) || []).map(function(scriptTag) { return (scriptTag.match(matchOne) || ['', ''])[1]; }); - }, + } - evalScripts: function() { + function evalScripts() { return this.extractScripts().map(function(script) { return eval(script) }); - }, + } - escapeHTML: function() { - var self = arguments.callee; - self.text.data = this; - return self.div.innerHTML; - }, + function escapeHTML() { + return this.replace(/&/g,'&').replace(//g,'>'); + } - unescapeHTML: function() { - var div = new Element('div'); - div.innerHTML = this.stripTags(); - return div.childNodes[0] ? (div.childNodes.length > 1 ? - $A(div.childNodes).inject('', function(memo, node) { return memo+node.nodeValue }) : - div.childNodes[0].nodeValue) : ''; - }, + function unescapeHTML() { + return this.stripTags().replace(/</g,'<').replace(/>/g,'>').replace(/&/g,'&'); + } - toQueryParams: function(separator) { + + function toQueryParams(separator) { var match = this.strip().match(/([^?#]*)(#.*)?$/); if (!match) return { }; return match[1].split(separator || '&').inject({ }, function(hash, pair) { if ((pair = pair.split('='))[0]) { - var key = decodeURIComponent(pair.shift()); - var value = pair.length > 1 ? pair.join('=') : pair[0]; + var key = decodeURIComponent(pair.shift()), + value = pair.length > 1 ? pair.join('=') : pair[0]; + if (value != undefined) value = decodeURIComponent(value); if (key in hash) { @@ -434,128 +619,144 @@ Object.extend(String.prototype, { } return hash; }); - }, + } - toArray: function() { + function toArray() { return this.split(''); - }, + } - succ: function() { + function succ() { return this.slice(0, this.length - 1) + String.fromCharCode(this.charCodeAt(this.length - 1) + 1); - }, + } - times: function(count) { + function times(count) { return count < 1 ? '' : new Array(count + 1).join(this); - }, + } - camelize: function() { - var parts = this.split('-'), len = parts.length; - if (len == 1) return parts[0]; + function camelize() { + return this.replace(/-+(.)?/g, function(match, chr) { + return chr ? chr.toUpperCase() : ''; + }); + } - var camelized = this.charAt(0) == '-' - ? parts[0].charAt(0).toUpperCase() + parts[0].substring(1) - : parts[0]; - - for (var i = 1; i < len; i++) - camelized += parts[i].charAt(0).toUpperCase() + parts[i].substring(1); - - return camelized; - }, - - capitalize: function() { + function capitalize() { return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase(); - }, + } - underscore: function() { - return this.gsub(/::/, '/').gsub(/([A-Z]+)([A-Z][a-z])/,'#{1}_#{2}').gsub(/([a-z\d])([A-Z])/,'#{1}_#{2}').gsub(/-/,'_').toLowerCase(); - }, + function underscore() { + return this.replace(/::/g, '/') + .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2') + .replace(/([a-z\d])([A-Z])/g, '$1_$2') + .replace(/-/g, '_') + .toLowerCase(); + } - dasherize: function() { - return this.gsub(/_/,'-'); - }, + function dasherize() { + return this.replace(/_/g, '-'); + } - inspect: function(useDoubleQuotes) { - var escapedString = this.gsub(/[\x00-\x1f\\]/, function(match) { - var character = String.specialChar[match[0]]; - return character ? character : '\\u00' + match[0].charCodeAt().toPaddedString(2, 16); + function inspect(useDoubleQuotes) { + var escapedString = this.replace(/[\x00-\x1f\\]/g, function(character) { + if (character in String.specialChar) { + return String.specialChar[character]; + } + return '\\u00' + character.charCodeAt().toPaddedString(2, 16); }); if (useDoubleQuotes) return '"' + escapedString.replace(/"/g, '\\"') + '"'; return "'" + escapedString.replace(/'/g, '\\\'') + "'"; - }, + } - toJSON: function() { - return this.inspect(true); - }, + function unfilterJSON(filter) { + return this.replace(filter || Prototype.JSONFilter, '$1'); + } - unfilterJSON: function(filter) { - return this.sub(filter || Prototype.JSONFilter, '#{1}'); - }, - - isJSON: function() { + function isJSON() { var str = this; if (str.blank()) return false; - str = this.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, ''); - return (/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(str); - }, + str = str.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@'); + str = str.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']'); + str = str.replace(/(?:^|:|,)(?:\s*\[)+/g, ''); + return (/^[\],:{}\s]*$/).test(str); + } - evalJSON: function(sanitize) { - var json = this.unfilterJSON(); + function evalJSON(sanitize) { + var json = this.unfilterJSON(), + cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g; + if (cx.test(json)) { + json = json.replace(cx, function (a) { + return '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); + }); + } try { if (!sanitize || json.isJSON()) return eval('(' + json + ')'); } catch (e) { } throw new SyntaxError('Badly formed JSON string: ' + this.inspect()); - }, + } - include: function(pattern) { + function parseJSON() { + var json = this.unfilterJSON(); + return JSON.parse(json); + } + + function include(pattern) { return this.indexOf(pattern) > -1; - }, + } - startsWith: function(pattern) { - return this.indexOf(pattern) === 0; - }, + function startsWith(pattern) { + return this.lastIndexOf(pattern, 0) === 0; + } - endsWith: function(pattern) { + function endsWith(pattern) { var d = this.length - pattern.length; - return d >= 0 && this.lastIndexOf(pattern) === d; - }, + return d >= 0 && this.indexOf(pattern, d) === d; + } - empty: function() { + function empty() { return this == ''; - }, + } - blank: function() { + function blank() { return /^\s*$/.test(this); - }, + } - interpolate: function(object, pattern) { + function interpolate(object, pattern) { return new Template(this, pattern).evaluate(object); } -}); -if (Prototype.Browser.WebKit || Prototype.Browser.IE) Object.extend(String.prototype, { - escapeHTML: function() { - return this.replace(/&/g,'&').replace(//g,'>'); - }, - unescapeHTML: function() { - return this.stripTags().replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>'); - } -}); - -String.prototype.gsub.prepareReplacement = function(replacement) { - if (Object.isFunction(replacement)) return replacement; - var template = new Template(replacement); - return function(match) { return template.evaluate(match) }; -}; - -String.prototype.parseQuery = String.prototype.toQueryParams; - -Object.extend(String.prototype.escapeHTML, { - div: document.createElement('div'), - text: document.createTextNode('') -}); - -String.prototype.escapeHTML.div.appendChild(String.prototype.escapeHTML.text); + return { + gsub: gsub, + sub: sub, + scan: scan, + truncate: truncate, + strip: String.prototype.trim || strip, + stripTags: stripTags, + stripScripts: stripScripts, + extractScripts: extractScripts, + evalScripts: evalScripts, + escapeHTML: escapeHTML, + unescapeHTML: unescapeHTML, + toQueryParams: toQueryParams, + parseQuery: toQueryParams, + toArray: toArray, + succ: succ, + times: times, + camelize: camelize, + capitalize: capitalize, + underscore: underscore, + dasherize: dasherize, + inspect: inspect, + unfilterJSON: unfilterJSON, + isJSON: isJSON, + evalJSON: NATIVE_JSON_PARSE_SUPPORT ? parseJSON : evalJSON, + include: include, + startsWith: startsWith, + endsWith: endsWith, + empty: empty, + blank: blank, + interpolate: interpolate + }; +})()); var Template = Class.create({ initialize: function(template, pattern) { @@ -564,22 +765,23 @@ var Template = Class.create({ }, evaluate: function(object) { - if (Object.isFunction(object.toTemplateReplacements)) + if (object && Object.isFunction(object.toTemplateReplacements)) object = object.toTemplateReplacements(); return this.template.gsub(this.pattern, function(match) { - if (object == null) return ''; + if (object == null) return (match[1] + ''); var before = match[1] || ''; if (before == '\\') return match[2]; - var ctx = object, expr = match[3]; - var pattern = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/; + var ctx = object, expr = match[3], + pattern = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/; + match = pattern.exec(expr); if (match == null) return before; while (match != null) { - var comp = match[1].startsWith('[') ? match[2].gsub('\\\\]', ']') : match[1]; + var comp = match[1].startsWith('[') ? match[2].replace(/\\\\]/g, ']') : match[1]; ctx = ctx[comp]; if (null == ctx || '' == match[3]) break; expr = expr.substring('[' == match[3] ? match[1].length : match[0].length); @@ -594,8 +796,8 @@ Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/; var $break = { }; -var Enumerable = { - each: function(iterator, context) { +var Enumerable = (function() { + function each(iterator, context) { var index = 0; try { this._each(function(value) { @@ -605,17 +807,17 @@ var Enumerable = { if (e != $break) throw e; } return this; - }, + } - eachSlice: function(number, iterator, context) { + function eachSlice(number, iterator, context) { var index = -number, slices = [], array = this.toArray(); if (number < 1) return array; while ((index += number) < array.length) slices.push(array.slice(index, index+number)); return slices.collect(iterator, context); - }, + } - all: function(iterator, context) { + function all(iterator, context) { iterator = iterator || Prototype.K; var result = true; this.each(function(value, index) { @@ -623,9 +825,9 @@ var Enumerable = { if (!result) throw $break; }); return result; - }, + } - any: function(iterator, context) { + function any(iterator, context) { iterator = iterator || Prototype.K; var result = false; this.each(function(value, index) { @@ -633,18 +835,18 @@ var Enumerable = { throw $break; }); return result; - }, + } - collect: function(iterator, context) { + function collect(iterator, context) { iterator = iterator || Prototype.K; var results = []; this.each(function(value, index) { results.push(iterator.call(context, value, index)); }); return results; - }, + } - detect: function(iterator, context) { + function detect(iterator, context) { var result; this.each(function(value, index) { if (iterator.call(context, value, index)) { @@ -653,32 +855,32 @@ var Enumerable = { } }); return result; - }, + } - findAll: function(iterator, context) { + function findAll(iterator, context) { var results = []; this.each(function(value, index) { if (iterator.call(context, value, index)) results.push(value); }); return results; - }, + } - grep: function(filter, iterator, context) { + function grep(filter, iterator, context) { iterator = iterator || Prototype.K; var results = []; if (Object.isString(filter)) - filter = new RegExp(filter); + filter = new RegExp(RegExp.escape(filter)); this.each(function(value, index) { if (filter.match(value)) results.push(iterator.call(context, value, index)); }); return results; - }, + } - include: function(object) { + function include(object) { if (Object.isFunction(this.indexOf)) if (this.indexOf(object) != -1) return true; @@ -690,31 +892,31 @@ var Enumerable = { } }); return found; - }, + } - inGroupsOf: function(number, fillWith) { + function inGroupsOf(number, fillWith) { fillWith = Object.isUndefined(fillWith) ? null : fillWith; return this.eachSlice(number, function(slice) { while(slice.length < number) slice.push(fillWith); return slice; }); - }, + } - inject: function(memo, iterator, context) { + function inject(memo, iterator, context) { this.each(function(value, index) { memo = iterator.call(context, memo, value, index); }); return memo; - }, + } - invoke: function(method) { + function invoke(method) { var args = $A(arguments).slice(1); return this.map(function(value) { return value[method].apply(value, args); }); - }, + } - max: function(iterator, context) { + function max(iterator, context) { iterator = iterator || Prototype.K; var result; this.each(function(value, index) { @@ -723,9 +925,9 @@ var Enumerable = { result = value; }); return result; - }, + } - min: function(iterator, context) { + function min(iterator, context) { iterator = iterator || Prototype.K; var result; this.each(function(value, index) { @@ -734,9 +936,9 @@ var Enumerable = { result = value; }); return result; - }, + } - partition: function(iterator, context) { + function partition(iterator, context) { iterator = iterator || Prototype.K; var trues = [], falses = []; this.each(function(value, index) { @@ -744,26 +946,26 @@ var Enumerable = { trues : falses).push(value); }); return [trues, falses]; - }, + } - pluck: function(property) { + function pluck(property) { var results = []; this.each(function(value) { results.push(value[property]); }); return results; - }, + } - reject: function(iterator, context) { + function reject(iterator, context) { var results = []; this.each(function(value, index) { if (!iterator.call(context, value, index)) results.push(value); }); return results; - }, + } - sortBy: function(iterator, context) { + function sortBy(iterator, context) { return this.map(function(value, index) { return { value: value, @@ -773,13 +975,13 @@ var Enumerable = { var a = left.criteria, b = right.criteria; return a < b ? -1 : a > b ? 1 : 0; }).pluck('value'); - }, + } - toArray: function() { + function toArray() { return this.map(); - }, + } - zip: function() { + function zip() { var iterator = Prototype.K, args = $A(arguments); if (Object.isFunction(args.last())) iterator = args.pop(); @@ -788,159 +990,66 @@ var Enumerable = { return this.map(function(value, index) { return iterator(collections.pluck(index)); }); - }, + } - size: function() { + function size() { return this.toArray().length; - }, + } - inspect: function() { + function inspect() { return '#'; } -}; -Object.extend(Enumerable, { - map: Enumerable.collect, - find: Enumerable.detect, - select: Enumerable.findAll, - filter: Enumerable.findAll, - member: Enumerable.include, - entries: Enumerable.toArray, - every: Enumerable.all, - some: Enumerable.any -}); + + + + + + + + + return { + each: each, + eachSlice: eachSlice, + all: all, + every: all, + any: any, + some: any, + collect: collect, + map: collect, + detect: detect, + findAll: findAll, + select: findAll, + filter: findAll, + grep: grep, + include: include, + member: include, + inGroupsOf: inGroupsOf, + inject: inject, + invoke: invoke, + max: max, + min: min, + partition: partition, + pluck: pluck, + reject: reject, + sortBy: sortBy, + toArray: toArray, + entries: toArray, + zip: zip, + size: size, + inspect: inspect, + find: detect + }; +})(); + function $A(iterable) { if (!iterable) return []; - if (iterable.toArray) return iterable.toArray(); + if ('toArray' in Object(iterable)) return iterable.toArray(); var length = iterable.length || 0, results = new Array(length); while (length--) results[length] = iterable[length]; return results; } -if (Prototype.Browser.WebKit) { - $A = function(iterable) { - if (!iterable) return []; - // In Safari, only use the `toArray` method if it's not a NodeList. - // A NodeList is a function, has an function `item` property, and a numeric - // `length` property. Adapted from Google Doctype. - if (!(typeof iterable === 'function' && typeof iterable.length === - 'number' && typeof iterable.item === 'function') && iterable.toArray) - return iterable.toArray(); - var length = iterable.length || 0, results = new Array(length); - while (length--) results[length] = iterable[length]; - return results; - }; -} - -Array.from = $A; - -Object.extend(Array.prototype, Enumerable); - -if (!Array.prototype._reverse) Array.prototype._reverse = Array.prototype.reverse; - -Object.extend(Array.prototype, { - _each: function(iterator) { - for (var i = 0, length = this.length; i < length; i++) - iterator(this[i]); - }, - - clear: function() { - this.length = 0; - return this; - }, - - first: function() { - return this[0]; - }, - - last: function() { - return this[this.length - 1]; - }, - - compact: function() { - return this.select(function(value) { - return value != null; - }); - }, - - flatten: function() { - return this.inject([], function(array, value) { - return array.concat(Object.isArray(value) ? - value.flatten() : [value]); - }); - }, - - without: function() { - var values = $A(arguments); - return this.select(function(value) { - return !values.include(value); - }); - }, - - reverse: function(inline) { - return (inline !== false ? this : this.toArray())._reverse(); - }, - - reduce: function() { - return this.length > 1 ? this : this[0]; - }, - - uniq: function(sorted) { - return this.inject([], function(array, value, index) { - if (0 == index || (sorted ? array.last() != value : !array.include(value))) - array.push(value); - return array; - }); - }, - - intersect: function(array) { - return this.uniq().findAll(function(item) { - return array.detect(function(value) { return item === value }); - }); - }, - - clone: function() { - return [].concat(this); - }, - - size: function() { - return this.length; - }, - - inspect: function() { - return '[' + this.map(Object.inspect).join(', ') + ']'; - }, - - toJSON: function() { - var results = []; - this.each(function(object) { - var value = Object.toJSON(object); - if (!Object.isUndefined(value)) results.push(value); - }); - return '[' + results.join(', ') + ']'; - } -}); - -// use native browser JS 1.6 implementation if available -if (Object.isFunction(Array.prototype.forEach)) - Array.prototype._each = Array.prototype.forEach; - -if (!Array.prototype.indexOf) Array.prototype.indexOf = function(item, i) { - i || (i = 0); - var length = this.length; - if (i < 0) i = length + i; - for (; i < length; i++) - if (this[i] === item) return i; - return -1; -}; - -if (!Array.prototype.lastIndexOf) Array.prototype.lastIndexOf = function(item, i) { - i = isNaN(i) ? this.length : (i < 0 ? this.length + i : i) + 1; - var n = this.slice(0, i).reverse().indexOf(item); - return (n < 0) ? n : i - n - 1; -}; - -Array.prototype.toArray = Array.prototype.clone; function $w(string) { if (!Object.isString(string)) return []; @@ -948,175 +1057,367 @@ function $w(string) { return string ? string.split(/\s+/) : []; } -if (Prototype.Browser.Opera){ - Array.prototype.concat = function() { - var array = []; - for (var i = 0, length = this.length; i < length; i++) array.push(this[i]); +Array.from = $A; + + +(function() { + var arrayProto = Array.prototype, + slice = arrayProto.slice, + _each = arrayProto.forEach; // use native browser JS 1.6 implementation if available + + function each(iterator, context) { + for (var i = 0, length = this.length >>> 0; i < length; i++) { + if (i in this) iterator.call(context, this[i], i, this); + } + } + if (!_each) _each = each; + + function clear() { + this.length = 0; + return this; + } + + function first() { + return this[0]; + } + + function last() { + return this[this.length - 1]; + } + + function compact() { + return this.select(function(value) { + return value != null; + }); + } + + function flatten() { + return this.inject([], function(array, value) { + if (Object.isArray(value)) + return array.concat(value.flatten()); + array.push(value); + return array; + }); + } + + function without() { + var values = slice.call(arguments, 0); + return this.select(function(value) { + return !values.include(value); + }); + } + + function reverse(inline) { + return (inline === false ? this.toArray() : this)._reverse(); + } + + function uniq(sorted) { + return this.inject([], function(array, value, index) { + if (0 == index || (sorted ? array.last() != value : !array.include(value))) + array.push(value); + return array; + }); + } + + function intersect(array) { + return this.uniq().findAll(function(item) { + return array.detect(function(value) { return item === value }); + }); + } + + + function clone() { + return slice.call(this, 0); + } + + function size() { + return this.length; + } + + function inspect() { + return '[' + this.map(Object.inspect).join(', ') + ']'; + } + + function indexOf(item, i) { + i || (i = 0); + var length = this.length; + if (i < 0) i = length + i; + for (; i < length; i++) + if (this[i] === item) return i; + return -1; + } + + function lastIndexOf(item, i) { + i = isNaN(i) ? this.length : (i < 0 ? this.length + i : i) + 1; + var n = this.slice(0, i).reverse().indexOf(item); + return (n < 0) ? n : i - n - 1; + } + + function concat() { + var array = slice.call(this, 0), item; for (var i = 0, length = arguments.length; i < length; i++) { - if (Object.isArray(arguments[i])) { - for (var j = 0, arrayLength = arguments[i].length; j < arrayLength; j++) - array.push(arguments[i][j]); + item = arguments[i]; + if (Object.isArray(item) && !('callee' in item)) { + for (var j = 0, arrayLength = item.length; j < arrayLength; j++) + array.push(item[j]); } else { - array.push(arguments[i]); + array.push(item); } } return array; - }; -} -Object.extend(Number.prototype, { - toColorPart: function() { - return this.toPaddedString(2, 16); - }, - - succ: function() { - return this + 1; - }, - - times: function(iterator, context) { - $R(0, this, true).each(iterator, context); - return this; - }, - - toPaddedString: function(length, radix) { - var string = this.toString(radix || 10); - return '0'.times(length - string.length) + string; - }, - - toJSON: function() { - return isFinite(this) ? this.toString() : 'null'; } -}); -$w('abs round ceil floor').each(function(method){ - Number.prototype[method] = Math[method].methodize(); -}); + Object.extend(arrayProto, Enumerable); + + if (!arrayProto._reverse) + arrayProto._reverse = arrayProto.reverse; + + Object.extend(arrayProto, { + _each: _each, + clear: clear, + first: first, + last: last, + compact: compact, + flatten: flatten, + without: without, + reverse: reverse, + uniq: uniq, + intersect: intersect, + clone: clone, + toArray: clone, + size: size, + inspect: inspect + }); + + var CONCAT_ARGUMENTS_BUGGY = (function() { + return [].concat(arguments)[0][0] !== 1; + })(1,2) + + if (CONCAT_ARGUMENTS_BUGGY) arrayProto.concat = concat; + + if (!arrayProto.indexOf) arrayProto.indexOf = indexOf; + if (!arrayProto.lastIndexOf) arrayProto.lastIndexOf = lastIndexOf; +})(); function $H(object) { return new Hash(object); }; var Hash = Class.create(Enumerable, (function() { + function initialize(object) { + this._object = Object.isHash(object) ? object.toObject() : Object.clone(object); + } + + + function _each(iterator) { + for (var key in this._object) { + var value = this._object[key], pair = [key, value]; + pair.key = key; + pair.value = value; + iterator(pair); + } + } + + function set(key, value) { + return this._object[key] = value; + } + + function get(key) { + if (this._object[key] !== Object.prototype[key]) + return this._object[key]; + } + + function unset(key) { + var value = this._object[key]; + delete this._object[key]; + return value; + } + + function toObject() { + return Object.clone(this._object); + } + + + + function keys() { + return this.pluck('key'); + } + + function values() { + return this.pluck('value'); + } + + function index(value) { + var match = this.detect(function(pair) { + return pair.value === value; + }); + return match && match.key; + } + + function merge(object) { + return this.clone().update(object); + } + + function update(object) { + return new Hash(object).inject(this, function(result, pair) { + result.set(pair.key, pair.value); + return result; + }); + } function toQueryPair(key, value) { if (Object.isUndefined(value)) return key; return key + '=' + encodeURIComponent(String.interpret(value)); } - return { - initialize: function(object) { - this._object = Object.isHash(object) ? object.toObject() : Object.clone(object); - }, + function toQueryString() { + return this.inject([], function(results, pair) { + var key = encodeURIComponent(pair.key), values = pair.value; - _each: function(iterator) { - for (var key in this._object) { - var value = this._object[key], pair = [key, value]; - pair.key = key; - pair.value = value; - iterator(pair); - } - }, - - set: function(key, value) { - return this._object[key] = value; - }, - - get: function(key) { - // simulating poorly supported hasOwnProperty - if (this._object[key] !== Object.prototype[key]) - return this._object[key]; - }, - - unset: function(key) { - var value = this._object[key]; - delete this._object[key]; - return value; - }, - - toObject: function() { - return Object.clone(this._object); - }, - - keys: function() { - return this.pluck('key'); - }, - - values: function() { - return this.pluck('value'); - }, - - index: function(value) { - var match = this.detect(function(pair) { - return pair.value === value; - }); - return match && match.key; - }, - - merge: function(object) { - return this.clone().update(object); - }, - - update: function(object) { - return new Hash(object).inject(this, function(result, pair) { - result.set(pair.key, pair.value); - return result; - }); - }, - - toQueryString: function() { - return this.inject([], function(results, pair) { - var key = encodeURIComponent(pair.key), values = pair.value; - - if (values && typeof values == 'object') { - if (Object.isArray(values)) - return results.concat(values.map(toQueryPair.curry(key))); - } else results.push(toQueryPair(key, values)); - return results; - }).join('&'); - }, - - inspect: function() { - return '#'; - }, - - toJSON: function() { - return Object.toJSON(this.toObject()); - }, - - clone: function() { - return new Hash(this); - } + if (values && typeof values == 'object') { + if (Object.isArray(values)) { + var queryValues = []; + for (var i = 0, len = values.length, value; i < len; i++) { + value = values[i]; + queryValues.push(toQueryPair(key, value)); + } + return results.concat(queryValues); + } + } else results.push(toQueryPair(key, values)); + return results; + }).join('&'); } + + function inspect() { + return '#'; + } + + function clone() { + return new Hash(this); + } + + return { + initialize: initialize, + _each: _each, + set: set, + get: get, + unset: unset, + toObject: toObject, + toTemplateReplacements: toObject, + keys: keys, + values: values, + index: index, + merge: merge, + update: update, + toQueryString: toQueryString, + inspect: inspect, + toJSON: toObject, + clone: clone + }; })()); -Hash.prototype.toTemplateReplacements = Hash.prototype.toObject; Hash.from = $H; -var ObjectRange = Class.create(Enumerable, { - initialize: function(start, end, exclusive) { +Object.extend(Number.prototype, (function() { + function toColorPart() { + return this.toPaddedString(2, 16); + } + + function succ() { + return this + 1; + } + + function times(iterator, context) { + $R(0, this, true).each(iterator, context); + return this; + } + + function toPaddedString(length, radix) { + var string = this.toString(radix || 10); + return '0'.times(length - string.length) + string; + } + + function abs() { + return Math.abs(this); + } + + function round() { + return Math.round(this); + } + + function ceil() { + return Math.ceil(this); + } + + function floor() { + return Math.floor(this); + } + + return { + toColorPart: toColorPart, + succ: succ, + times: times, + toPaddedString: toPaddedString, + abs: abs, + round: round, + ceil: ceil, + floor: floor + }; +})()); + +function $R(start, end, exclusive) { + return new ObjectRange(start, end, exclusive); +} + +var ObjectRange = Class.create(Enumerable, (function() { + function initialize(start, end, exclusive) { this.start = start; this.end = end; this.exclusive = exclusive; - }, + } - _each: function(iterator) { + function _each(iterator) { var value = this.start; while (this.include(value)) { iterator(value); value = value.succ(); } - }, + } - include: function(value) { + function include(value) { if (value < this.start) return false; if (this.exclusive) return value < this.end; return value <= this.end; } -}); -var $R = function(start, end, exclusive) { - return new ObjectRange(start, end, exclusive); + return { + initialize: initialize, + _each: _each, + include: include + }; +})()); + + + +var Abstract = { }; + + +var Try = { + these: function() { + var returnValue; + + for (var i = 0, length = arguments.length; i < length; i++) { + var lambda = arguments[i]; + try { + returnValue = lambda(); + break; + } catch (e) { } + } + + return returnValue; + } }; var Ajax = { @@ -1164,7 +1465,6 @@ Ajax.Responders.register({ onCreate: function() { Ajax.activeRequestCount++ }, onComplete: function() { Ajax.activeRequestCount-- } }); - Ajax.Base = Class.create({ initialize: function(options) { this.options = { @@ -1180,13 +1480,10 @@ Ajax.Base = Class.create({ this.options.method = this.options.method.toLowerCase(); - if (Object.isString(this.options.parameters)) - this.options.parameters = this.options.parameters.toQueryParams(); - else if (Object.isHash(this.options.parameters)) + if (Object.isHash(this.options.parameters)) this.options.parameters = this.options.parameters.toObject(); } }); - Ajax.Request = Class.create(Ajax.Base, { _complete: false, @@ -1199,24 +1496,21 @@ Ajax.Request = Class.create(Ajax.Base, { request: function(url) { this.url = url; this.method = this.options.method; - var params = Object.clone(this.options.parameters); + var params = Object.isString(this.options.parameters) ? + this.options.parameters : + Object.toQueryString(this.options.parameters); if (!['get', 'post'].include(this.method)) { - // simulate other verbs over post - params['_method'] = this.method; + params += (params ? '&' : '') + "_method=" + this.method; this.method = 'post'; } - this.parameters = params; - - if (params = Object.toQueryString(params)) { - // when GET, append parameters to URL - if (this.method == 'get') - this.url += (this.url.include('?') ? '&' : '?') + params; - else if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) - params += '&_='; + if (params && this.method === 'get') { + this.url += (this.url.include('?') ? '&' : '?') + params; } + this.parameters = params.toQueryParams(); + try { var response = new Ajax.Response(this); if (this.options.onCreate) this.options.onCreate(response); @@ -1269,7 +1563,6 @@ Ajax.Request = Class.create(Ajax.Base, { headers['Connection'] = 'close'; } - // user-defined headers if (typeof this.options.requestHeaders == 'object') { var extras = this.options.requestHeaders; @@ -1286,11 +1579,12 @@ Ajax.Request = Class.create(Ajax.Base, { success: function() { var status = this.getStatus(); - return !status || (status >= 200 && status < 300); + return !status || (status >= 200 && status < 300) || status == 304; }, getStatus: function() { try { + if (this.transport.status === 1223) return 204; return this.transport.status || 0; } catch (e) { return 0 } }, @@ -1323,7 +1617,6 @@ Ajax.Request = Class.create(Ajax.Base, { } if (state == 'Complete') { - // avoid memory leak in MSIE: clean up this.transport.onreadystatechange = Prototype.emptyFunction; } }, @@ -1340,7 +1633,7 @@ Ajax.Request = Class.create(Ajax.Base, { getHeader: function(name) { try { return this.transport.getResponseHeader(name) || null; - } catch (e) { return null } + } catch (e) { return null; } }, evalResponse: function() { @@ -1360,20 +1653,27 @@ Ajax.Request = Class.create(Ajax.Base, { Ajax.Request.Events = ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete']; + + + + + + + Ajax.Response = Class.create({ initialize: function(request){ this.request = request; var transport = this.transport = request.transport, readyState = this.readyState = transport.readyState; - if((readyState > 2 && !Prototype.Browser.IE) || readyState == 4) { + if ((readyState > 2 && !Prototype.Browser.IE) || readyState == 4) { this.status = this.getStatus(); this.statusText = this.getStatusText(); this.responseText = String.interpret(transport.responseText); this.headerJSON = this._getHeaderJSON(); } - if(readyState == 4) { + if (readyState == 4) { var xml = transport.responseXML; this.responseXML = Object.isUndefined(xml) ? null : xml; this.responseJSON = this._getResponseJSON(); @@ -1381,6 +1681,7 @@ Ajax.Response = Class.create({ }, status: 0, + statusText: '', getStatus: Ajax.Request.prototype.getStatus, @@ -1510,6 +1811,8 @@ Ajax.PeriodicalUpdater = Class.create(Ajax.Base, { this.updater = new Ajax.Updater(this.container, this.url, this.options); } }); + + function $(element) { if (arguments.length > 1) { for (var i = 0, elements = [], length = arguments.length; i < length; i++) @@ -1534,10 +1837,9 @@ if (Prototype.BrowserFeatures.XPath) { /*--------------------------------------------------------------------------*/ -if (!window.Node) var Node = { }; +if (!Node) var Node = { }; if (!Node.ELEMENT_NODE) { - // DOM level 2 ECMAScript Language Binding Object.extend(Node, { ELEMENT_NODE: 1, ATTRIBUTE_NODE: 2, @@ -1554,26 +1856,63 @@ if (!Node.ELEMENT_NODE) { }); } -(function() { - var element = this.Element; - this.Element = function(tagName, attributes) { + + +(function(global) { + function shouldUseCache(tagName, attributes) { + if (tagName === 'select') return false; + if ('type' in attributes) return false; + return true; + } + + var HAS_EXTENDED_CREATE_ELEMENT_SYNTAX = (function(){ + try { + var el = document.createElement(''); + return el.tagName.toLowerCase() === 'input' && el.name === 'x'; + } + catch(err) { + return false; + } + })(); + + var element = global.Element; + + global.Element = function(tagName, attributes) { attributes = attributes || { }; tagName = tagName.toLowerCase(); var cache = Element.cache; - if (Prototype.Browser.IE && attributes.name) { + + if (HAS_EXTENDED_CREATE_ELEMENT_SYNTAX && attributes.name) { tagName = '<' + tagName + ' name="' + attributes.name + '">'; delete attributes.name; return Element.writeAttribute(document.createElement(tagName), attributes); } - if (!cache[tagName]) cache[tagName] = Element.extend(document.createElement(tagName)); - return Element.writeAttribute(cache[tagName].cloneNode(false), attributes); - }; - Object.extend(this.Element, element || { }); - if (element) this.Element.prototype = element.prototype; -}).call(window); + if (!cache[tagName]) cache[tagName] = Element.extend(document.createElement(tagName)); + + var node = shouldUseCache(tagName, attributes) ? + cache[tagName].cloneNode(false) : document.createElement(tagName); + + return Element.writeAttribute(node, attributes); + }; + + Object.extend(global.Element, element || { }); + if (element) global.Element.prototype = element.prototype; + +})(this); + +Element.idCounter = 1; Element.cache = { }; +Element._purgeElement = function(element) { + var uid = element._prototypeUID; + if (uid) { + Element.stopObserving(element); + element._prototypeUID = void 0; + delete Element.Storage[uid]; + } +} + Element.Methods = { visible: function(element) { return $(element).style.display != 'none'; @@ -1603,15 +1942,116 @@ Element.Methods = { return element; }, - update: function(element, content) { - element = $(element); - if (content && content.toElement) content = content.toElement(); - if (Object.isElement(content)) return element.update().insert(content); - content = Object.toHTML(content); - element.innerHTML = content.stripScripts(); - content.evalScripts.bind(content).defer(); - return element; - }, + update: (function(){ + + var SELECT_ELEMENT_INNERHTML_BUGGY = (function(){ + var el = document.createElement("select"), + isBuggy = true; + el.innerHTML = ""; + if (el.options && el.options[0]) { + isBuggy = el.options[0].nodeName.toUpperCase() !== "OPTION"; + } + el = null; + return isBuggy; + })(); + + var TABLE_ELEMENT_INNERHTML_BUGGY = (function(){ + try { + var el = document.createElement("table"); + if (el && el.tBodies) { + el.innerHTML = "test"; + var isBuggy = typeof el.tBodies[0] == "undefined"; + el = null; + return isBuggy; + } + } catch (e) { + return true; + } + })(); + + var LINK_ELEMENT_INNERHTML_BUGGY = (function() { + try { + var el = document.createElement('div'); + el.innerHTML = ""; + var isBuggy = (el.childNodes.length === 0); + el = null; + return isBuggy; + } catch(e) { + return true; + } + })(); + + var ANY_INNERHTML_BUGGY = SELECT_ELEMENT_INNERHTML_BUGGY || + TABLE_ELEMENT_INNERHTML_BUGGY || LINK_ELEMENT_INNERHTML_BUGGY; + + var SCRIPT_ELEMENT_REJECTS_TEXTNODE_APPENDING = (function () { + var s = document.createElement("script"), + isBuggy = false; + try { + s.appendChild(document.createTextNode("")); + isBuggy = !s.firstChild || + s.firstChild && s.firstChild.nodeType !== 3; + } catch (e) { + isBuggy = true; + } + s = null; + return isBuggy; + })(); + + + function update(element, content) { + element = $(element); + var purgeElement = Element._purgeElement; + + var descendants = element.getElementsByTagName('*'), + i = descendants.length; + while (i--) purgeElement(descendants[i]); + + if (content && content.toElement) + content = content.toElement(); + + if (Object.isElement(content)) + return element.update().insert(content); + + content = Object.toHTML(content); + + var tagName = element.tagName.toUpperCase(); + + if (tagName === 'SCRIPT' && SCRIPT_ELEMENT_REJECTS_TEXTNODE_APPENDING) { + element.text = content; + return element; + } + + if (ANY_INNERHTML_BUGGY) { + if (tagName in Element._insertionTranslations.tags) { + while (element.firstChild) { + element.removeChild(element.firstChild); + } + Element._getContentFromAnonymousElement(tagName, content.stripScripts()) + .each(function(node) { + element.appendChild(node) + }); + } else if (LINK_ELEMENT_INNERHTML_BUGGY && Object.isString(content) && content.indexOf(' -1) { + while (element.firstChild) { + element.removeChild(element.firstChild); + } + var nodes = Element._getContentFromAnonymousElement(tagName, content.stripScripts(), true); + nodes.each(function(node) { element.appendChild(node) }); + } + else { + element.innerHTML = content.stripScripts(); + } + } + else { + element.innerHTML = content.stripScripts(); + } + + content.evalScripts.bind(content).defer(); + return element; + } + + return update; + })(), replace: function(element, content) { element = $(element); @@ -1679,28 +2119,35 @@ Element.Methods = { element = $(element); var result = '<' + element.tagName.toLowerCase(); $H({'id': 'id', 'className': 'class'}).each(function(pair) { - var property = pair.first(), attribute = pair.last(); - var value = (element[property] || '').toString(); + var property = pair.first(), + attribute = pair.last(), + value = (element[property] || '').toString(); if (value) result += ' ' + attribute + '=' + value.inspect(true); }); return result + '>'; }, - recursivelyCollect: function(element, property) { + recursivelyCollect: function(element, property, maximumLength) { element = $(element); + maximumLength = maximumLength || -1; var elements = []; - while (element = element[property]) + + while (element = element[property]) { if (element.nodeType == 1) elements.push(Element.extend(element)); + if (elements.length == maximumLength) + break; + } + return elements; }, ancestors: function(element) { - return $(element).recursivelyCollect('parentNode'); + return Element.recursivelyCollect(element, 'parentNode'); }, descendants: function(element) { - return $(element).select("*"); + return Element.select(element, "*"); }, firstDescendant: function(element) { @@ -1710,78 +2157,96 @@ Element.Methods = { }, immediateDescendants: function(element) { - if (!(element = $(element).firstChild)) return []; - while (element && element.nodeType != 1) element = element.nextSibling; - if (element) return [element].concat($(element).nextSiblings()); - return []; + var results = [], child = $(element).firstChild; + while (child) { + if (child.nodeType === 1) { + results.push(Element.extend(child)); + } + child = child.nextSibling; + } + return results; }, - previousSiblings: function(element) { - return $(element).recursivelyCollect('previousSibling'); + previousSiblings: function(element, maximumLength) { + return Element.recursivelyCollect(element, 'previousSibling'); }, nextSiblings: function(element) { - return $(element).recursivelyCollect('nextSibling'); + return Element.recursivelyCollect(element, 'nextSibling'); }, siblings: function(element) { element = $(element); - return element.previousSiblings().reverse().concat(element.nextSiblings()); + return Element.previousSiblings(element).reverse() + .concat(Element.nextSiblings(element)); }, match: function(element, selector) { + element = $(element); if (Object.isString(selector)) - selector = new Selector(selector); - return selector.match($(element)); + return Prototype.Selector.match(element, selector); + return selector.match(element); }, up: function(element, expression, index) { element = $(element); if (arguments.length == 1) return $(element.parentNode); - var ancestors = element.ancestors(); + var ancestors = Element.ancestors(element); return Object.isNumber(expression) ? ancestors[expression] : - Selector.findElement(ancestors, expression, index); + Prototype.Selector.find(ancestors, expression, index); }, down: function(element, expression, index) { element = $(element); - if (arguments.length == 1) return element.firstDescendant(); - return Object.isNumber(expression) ? element.descendants()[expression] : + if (arguments.length == 1) return Element.firstDescendant(element); + return Object.isNumber(expression) ? Element.descendants(element)[expression] : Element.select(element, expression)[index || 0]; }, previous: function(element, expression, index) { element = $(element); - if (arguments.length == 1) return $(Selector.handlers.previousElementSibling(element)); - var previousSiblings = element.previousSiblings(); - return Object.isNumber(expression) ? previousSiblings[expression] : - Selector.findElement(previousSiblings, expression, index); + if (Object.isNumber(expression)) index = expression, expression = false; + if (!Object.isNumber(index)) index = 0; + + if (expression) { + return Prototype.Selector.find(element.previousSiblings(), expression, index); + } else { + return element.recursivelyCollect("previousSibling", index + 1)[index]; + } }, next: function(element, expression, index) { element = $(element); - if (arguments.length == 1) return $(Selector.handlers.nextElementSibling(element)); - var nextSiblings = element.nextSiblings(); - return Object.isNumber(expression) ? nextSiblings[expression] : - Selector.findElement(nextSiblings, expression, index); + if (Object.isNumber(expression)) index = expression, expression = false; + if (!Object.isNumber(index)) index = 0; + + if (expression) { + return Prototype.Selector.find(element.nextSiblings(), expression, index); + } else { + var maximumLength = Object.isNumber(index) ? index + 1 : 1; + return element.recursivelyCollect("nextSibling", index + 1)[index]; + } }, - select: function() { - var args = $A(arguments), element = $(args.shift()); - return Selector.findChildElements(element, args); + + select: function(element) { + element = $(element); + var expressions = Array.prototype.slice.call(arguments, 1).join(', '); + return Prototype.Selector.select(expressions, element); }, - adjacent: function() { - var args = $A(arguments), element = $(args.shift()); - return Selector.findChildElements(element.parentNode, args).without(element); + adjacent: function(element) { + element = $(element); + var expressions = Array.prototype.slice.call(arguments, 1).join(', '); + return Prototype.Selector.select(expressions, element.parentNode).without(element); }, identify: function(element) { element = $(element); - var id = element.readAttribute('id'), self = arguments.callee; + var id = Element.readAttribute(element, 'id'); if (id) return id; - do { id = 'anonymous_element_' + self.counter++ } while ($(id)); - element.writeAttribute('id', id); + do { id = 'anonymous_element_' + Element.idCounter++ } while ($(id)); + Element.writeAttribute(element, 'id', id); return id; }, @@ -1820,11 +2285,11 @@ Element.Methods = { }, getHeight: function(element) { - return $(element).getDimensions().height; + return Element.getDimensions(element).height; }, getWidth: function(element) { - return $(element).getDimensions().width; + return Element.getDimensions(element).width; }, classNames: function(element) { @@ -1840,7 +2305,7 @@ Element.Methods = { addClassName: function(element, className) { if (!(element = $(element))) return; - if (!element.hasClassName(className)) + if (!Element.hasClassName(element, className)) element.className += (element.className ? ' ' : '') + className; return element; }, @@ -1854,11 +2319,10 @@ Element.Methods = { toggleClassName: function(element, className) { if (!(element = $(element))) return; - return element[element.hasClassName(className) ? - 'removeClassName' : 'addClassName'](className); + return Element[Element.hasClassName(element, className) ? + 'removeClassName' : 'addClassName'](element, className); }, - // removes whitespace-only text node children cleanWhitespace: function(element) { element = $(element); var node = element.firstChild; @@ -1892,7 +2356,7 @@ Element.Methods = { scrollTo: function(element) { element = $(element); - var pos = element.cumulativeOffset(); + var pos = Element.cumulativeOffset(element); window.scrollTo(pos[0], pos[1]); return element; }, @@ -1938,37 +2402,12 @@ Element.Methods = { return element; }, - getDimensions: function(element) { - element = $(element); - var display = element.getStyle('display'); - if (display != 'none' && display != null) // Safari bug - return {width: element.offsetWidth, height: element.offsetHeight}; - - // All *Width and *Height properties give 0 on elements with display none, - // so enable the element temporarily - var els = element.style; - var originalVisibility = els.visibility; - var originalPosition = els.position; - var originalDisplay = els.display; - els.visibility = 'hidden'; - els.position = 'absolute'; - els.display = 'block'; - var originalWidth = element.clientWidth; - var originalHeight = element.clientHeight; - els.display = originalDisplay; - els.position = originalPosition; - els.visibility = originalVisibility; - return {width: originalWidth, height: originalHeight}; - }, - makePositioned: function(element) { element = $(element); var pos = Element.getStyle(element, 'position'); if (pos == 'static' || !pos) { element._madePositioned = true; element.style.position = 'relative'; - // Opera returns the offset relative to the positioning context, when an - // element is position relative but top and left have not been defined if (Prototype.Browser.Opera) { element.style.top = 0; element.style.left = 0; @@ -2007,117 +2446,6 @@ Element.Methods = { return element; }, - cumulativeOffset: function(element) { - var valueT = 0, valueL = 0; - do { - valueT += element.offsetTop || 0; - valueL += element.offsetLeft || 0; - element = element.offsetParent; - } while (element); - return Element._returnOffset(valueL, valueT); - }, - - positionedOffset: function(element) { - var valueT = 0, valueL = 0; - do { - valueT += element.offsetTop || 0; - valueL += element.offsetLeft || 0; - element = element.offsetParent; - if (element) { - if (element.tagName.toUpperCase() == 'BODY') break; - var p = Element.getStyle(element, 'position'); - if (p !== 'static') break; - } - } while (element); - return Element._returnOffset(valueL, valueT); - }, - - absolutize: function(element) { - element = $(element); - if (element.getStyle('position') == 'absolute') return element; - // Position.prepare(); // To be done manually by Scripty when it needs it. - - var offsets = element.positionedOffset(); - var top = offsets[1]; - var left = offsets[0]; - var width = element.clientWidth; - var height = element.clientHeight; - - element._originalLeft = left - parseFloat(element.style.left || 0); - element._originalTop = top - parseFloat(element.style.top || 0); - element._originalWidth = element.style.width; - element._originalHeight = element.style.height; - - element.style.position = 'absolute'; - element.style.top = top + 'px'; - element.style.left = left + 'px'; - element.style.width = width + 'px'; - element.style.height = height + 'px'; - return element; - }, - - relativize: function(element) { - element = $(element); - if (element.getStyle('position') == 'relative') return element; - // Position.prepare(); // To be done manually by Scripty when it needs it. - - element.style.position = 'relative'; - var top = parseFloat(element.style.top || 0) - (element._originalTop || 0); - var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0); - - element.style.top = top + 'px'; - element.style.left = left + 'px'; - element.style.height = element._originalHeight; - element.style.width = element._originalWidth; - return element; - }, - - cumulativeScrollOffset: function(element) { - var valueT = 0, valueL = 0; - do { - valueT += element.scrollTop || 0; - valueL += element.scrollLeft || 0; - element = element.parentNode; - } while (element); - return Element._returnOffset(valueL, valueT); - }, - - getOffsetParent: function(element) { - if (element.offsetParent) return $(element.offsetParent); - if (element == document.body) return $(element); - - while ((element = element.parentNode) && element != document.body) - if (Element.getStyle(element, 'position') != 'static') - return $(element); - - return $(document.body); - }, - - viewportOffset: function(forElement) { - var valueT = 0, valueL = 0; - - var element = forElement; - do { - valueT += element.offsetTop || 0; - valueL += element.offsetLeft || 0; - - // Safari fix - if (element.offsetParent == document.body && - Element.getStyle(element, 'position') == 'absolute') break; - - } while (element = element.offsetParent); - - element = forElement; - do { - if (!Prototype.Browser.Opera || (element.tagName && (element.tagName.toUpperCase() == 'BODY'))) { - valueT -= element.scrollTop || 0; - valueL -= element.scrollLeft || 0; - } - } while (element = element.parentNode); - - return Element._returnOffset(valueL, valueT); - }, - clonePosition: function(element, source) { var options = Object.extend({ setLeft: true, @@ -2128,28 +2456,21 @@ Element.Methods = { offsetLeft: 0 }, arguments[2] || { }); - // find page position of source source = $(source); - var p = source.viewportOffset(); + var p = Element.viewportOffset(source), delta = [0, 0], parent = null; - // find coordinate system to use element = $(element); - var delta = [0, 0]; - var parent = null; - // delta [0,0] will do fine with position: fixed elements, - // position:absolute needs offsetParent deltas + if (Element.getStyle(element, 'position') == 'absolute') { - parent = element.getOffsetParent(); - delta = parent.viewportOffset(); + parent = Element.getOffsetParent(element); + delta = Element.viewportOffset(parent); } - // correct by body offsets (fixes Safari) if (parent == document.body) { delta[0] -= document.body.offsetLeft; delta[1] -= document.body.offsetTop; } - // set position if (options.setLeft) element.style.left = (p[0] - delta[0] + options.offsetLeft) + 'px'; if (options.setTop) element.style.top = (p[1] - delta[1] + options.offsetTop) + 'px'; if (options.setWidth) element.style.width = source.offsetWidth + 'px'; @@ -2158,10 +2479,9 @@ Element.Methods = { } }; -Element.Methods.identify.counter = 1; - Object.extend(Element.Methods, { getElementsBySelector: Element.Methods.select, + childElements: Element.Methods.immediateDescendants }); @@ -2179,14 +2499,9 @@ if (Prototype.Browser.Opera) { Element.Methods.getStyle = Element.Methods.getStyle.wrap( function(proceed, element, style) { switch (style) { - case 'left': case 'top': case 'right': case 'bottom': - if (proceed(element, 'position') === 'static') return null; case 'height': case 'width': - // returns '0px' for hidden elements; we want it to return null if (!Element.visible(element)) return null; - // returns the border-box dimensions rather than the content-box - // dimensions, so we subtract padding and borders from the value var dim = parseInt(proceed(element, style), 10); if (dim !== element['offset' + style.capitalize()]) @@ -2219,52 +2534,6 @@ if (Prototype.Browser.Opera) { } else if (Prototype.Browser.IE) { - // IE doesn't report offsets correctly for static elements, so we change them - // to "relative" to get the values, then change them back. - Element.Methods.getOffsetParent = Element.Methods.getOffsetParent.wrap( - function(proceed, element) { - element = $(element); - // IE throws an error if element is not in document - try { element.offsetParent } - catch(e) { return $(document.body) } - var position = element.getStyle('position'); - if (position !== 'static') return proceed(element); - element.setStyle({ position: 'relative' }); - var value = proceed(element); - element.setStyle({ position: position }); - return value; - } - ); - - $w('positionedOffset viewportOffset').each(function(method) { - Element.Methods[method] = Element.Methods[method].wrap( - function(proceed, element) { - element = $(element); - try { element.offsetParent } - catch(e) { return Element._returnOffset(0,0) } - var position = element.getStyle('position'); - if (position !== 'static') return proceed(element); - // Trigger hasLayout on the offset parent so that IE6 reports - // accurate offsetTop and offsetLeft values for position: fixed. - var offsetParent = element.getOffsetParent(); - if (offsetParent && offsetParent.getStyle('position') === 'fixed') - offsetParent.setStyle({ zoom: 1 }); - element.setStyle({ position: 'relative' }); - var value = proceed(element); - element.setStyle({ position: position }); - return value; - } - ); - }); - - Element.Methods.cumulativeOffset = Element.Methods.cumulativeOffset.wrap( - function(proceed, element) { - try { element.offsetParent } - catch(e) { return Element._returnOffset(0,0) } - return proceed(element); - } - ); - Element.Methods.getStyle = function(element, style) { element = $(element); style = (style == 'float' || style == 'cssFloat') ? 'styleFloat' : style.camelize(); @@ -2306,36 +2575,90 @@ else if (Prototype.Browser.IE) { return element; }; - Element._attributeTranslations = { - read: { - names: { - 'class': 'className', - 'for': 'htmlFor' - }, - values: { - _getAttr: function(element, attribute) { - return element.getAttribute(attribute, 2); + Element._attributeTranslations = (function(){ + + var classProp = 'className', + forProp = 'for', + el = document.createElement('div'); + + el.setAttribute(classProp, 'x'); + + if (el.className !== 'x') { + el.setAttribute('class', 'x'); + if (el.className === 'x') { + classProp = 'class'; + } + } + el = null; + + el = document.createElement('label'); + el.setAttribute(forProp, 'x'); + if (el.htmlFor !== 'x') { + el.setAttribute('htmlFor', 'x'); + if (el.htmlFor === 'x') { + forProp = 'htmlFor'; + } + } + el = null; + + return { + read: { + names: { + 'class': classProp, + 'className': classProp, + 'for': forProp, + 'htmlFor': forProp }, - _getAttrNode: function(element, attribute) { - var node = element.getAttributeNode(attribute); - return node ? node.value : ""; - }, - _getEv: function(element, attribute) { - attribute = element.getAttribute(attribute); - return attribute ? attribute.toString().slice(23, -2) : null; - }, - _flag: function(element, attribute) { - return $(element).hasAttribute(attribute) ? attribute : null; - }, - style: function(element) { - return element.style.cssText.toLowerCase(); - }, - title: function(element) { - return element.title; + values: { + _getAttr: function(element, attribute) { + return element.getAttribute(attribute); + }, + _getAttr2: function(element, attribute) { + return element.getAttribute(attribute, 2); + }, + _getAttrNode: function(element, attribute) { + var node = element.getAttributeNode(attribute); + return node ? node.value : ""; + }, + _getEv: (function(){ + + var el = document.createElement('div'), f; + el.onclick = Prototype.emptyFunction; + var value = el.getAttribute('onclick'); + + if (String(value).indexOf('{') > -1) { + f = function(element, attribute) { + attribute = element.getAttribute(attribute); + if (!attribute) return null; + attribute = attribute.toString(); + attribute = attribute.split('{')[1]; + attribute = attribute.split('}')[0]; + return attribute.strip(); + }; + } + else if (value === '') { + f = function(element, attribute) { + attribute = element.getAttribute(attribute); + if (!attribute) return null; + return attribute.strip(); + }; + } + el = null; + return f; + })(), + _flag: function(element, attribute) { + return $(element).hasAttribute(attribute) ? attribute : null; + }, + style: function(element) { + return element.style.cssText.toLowerCase(); + }, + title: function(element) { + return element.title; + } } } } - }; + })(); Element._attributeTranslations.write = { names: Object.extend({ @@ -2363,8 +2686,8 @@ else if (Prototype.Browser.IE) { (function(v) { Object.extend(v, { - href: v._getAttr, - src: v._getAttr, + href: v._getAttr2, + src: v._getAttr2, type: v._getAttr, action: v._getAttrNode, disabled: v._flag, @@ -2391,6 +2714,26 @@ else if (Prototype.Browser.IE) { onchange: v._getEv }); })(Element._attributeTranslations.read.values); + + if (Prototype.BrowserFeatures.ElementExtensions) { + (function() { + function _descendants(element) { + var nodes = element.getElementsByTagName('*'), results = []; + for (var i = 0, node; node = nodes[i]; i++) + if (node.tagName !== "!") // Filter out comment nodes. + results.push(node); + return results; + } + + Element.Methods.down = function(element, expression, index) { + element = $(element); + if (arguments.length == 1) return element.firstDescendant(); + return Object.isNumber(expression) ? _descendants(element)[expression] : + Element.select(element, expression)[index || 0]; + } + })(); + } + } else if (Prototype.Browser.Gecko && /rv:1\.8\.0/.test(navigator.userAgent)) { @@ -2409,7 +2752,7 @@ else if (Prototype.Browser.WebKit) { (value < 0.00001) ? 0 : value; if (value == 1) - if(element.tagName.toUpperCase() == 'IMG' && element.width) { + if (element.tagName.toUpperCase() == 'IMG' && element.width) { element.width++; element.width--; } else try { var n = document.createTextNode(' '); @@ -2419,49 +2762,9 @@ else if (Prototype.Browser.WebKit) { return element; }; - - // Safari returns margins on body which is incorrect if the child is absolutely - // positioned. For performance reasons, redefine Element#cumulativeOffset for - // KHTML/WebKit only. - Element.Methods.cumulativeOffset = function(element) { - var valueT = 0, valueL = 0; - do { - valueT += element.offsetTop || 0; - valueL += element.offsetLeft || 0; - if (element.offsetParent == document.body) - if (Element.getStyle(element, 'position') == 'absolute') break; - - element = element.offsetParent; - } while (element); - - return Element._returnOffset(valueL, valueT); - }; } -if (Prototype.Browser.IE || Prototype.Browser.Opera) { - // IE and Opera are missing .innerHTML support for TABLE-related and SELECT elements - Element.Methods.update = function(element, content) { - element = $(element); - - if (content && content.toElement) content = content.toElement(); - if (Object.isElement(content)) return element.update().insert(content); - - content = Object.toHTML(content); - var tagName = element.tagName.toUpperCase(); - - if (tagName in Element._insertionTranslations.tags) { - $A(element.childNodes).each(function(node) { element.removeChild(node) }); - Element._getContentFromAnonymousElement(tagName, content.stripScripts()) - .each(function(node) { element.appendChild(node) }); - } - else element.innerHTML = content.stripScripts(); - - content.evalScripts.bind(content).defer(); - return element; - }; -} - -if ('outerHTML' in document.createElement('div')) { +if ('outerHTML' in document.documentElement) { Element.Methods.replace = function(element, content) { element = $(element); @@ -2475,8 +2778,8 @@ if ('outerHTML' in document.createElement('div')) { var parent = element.parentNode, tagName = parent.tagName.toUpperCase(); if (Element._insertionTranslations.tags[tagName]) { - var nextSibling = element.next(); - var fragments = Element._getContentFromAnonymousElement(tagName, content.stripScripts()); + var nextSibling = element.next(), + fragments = Element._getContentFromAnonymousElement(tagName, content.stripScripts()); parent.removeChild(element); if (nextSibling) fragments.each(function(node) { parent.insertBefore(node, nextSibling) }); @@ -2497,12 +2800,27 @@ Element._returnOffset = function(l, t) { return result; }; -Element._getContentFromAnonymousElement = function(tagName, html) { - var div = new Element('div'), t = Element._insertionTranslations.tags[tagName]; - if (t) { - div.innerHTML = t[0] + html + t[1]; - t[2].times(function() { div = div.firstChild }); - } else div.innerHTML = html; +Element._getContentFromAnonymousElement = function(tagName, html, force) { + var div = new Element('div'), + t = Element._insertionTranslations.tags[tagName]; + + var workaround = false; + if (t) workaround = true; + else if (force) { + workaround = true; + t = ['', '', 0]; + } + + if (workaround) { + div.innerHTML = ' ' + t[0] + html + t[1]; + div.removeChild(div.firstChild); + for (var i = t[2]; i--; ) { + div = div.firstChild; + } + } + else { + div.innerHTML = html; + } return $A(div.childNodes); }; @@ -2529,12 +2847,13 @@ Element._insertionTranslations = { }; (function() { - Object.extend(this.tags, { - THEAD: this.tags.TBODY, - TFOOT: this.tags.TBODY, - TH: this.tags.TD + var tags = Element._insertionTranslations.tags; + Object.extend(tags, { + THEAD: tags.TBODY, + TFOOT: tags.TBODY, + TH: tags.TD }); -}).call(Element._insertionTranslations); +})(); Element.Methods.Simulated = { hasAttribute: function(element, attribute) { @@ -2548,41 +2867,81 @@ Element.Methods.ByTag = { }; Object.extend(Element, Element.Methods); -if (!Prototype.BrowserFeatures.ElementExtensions && - document.createElement('div')['__proto__']) { - window.HTMLElement = { }; - window.HTMLElement.prototype = document.createElement('div')['__proto__']; - Prototype.BrowserFeatures.ElementExtensions = true; -} +(function(div) { + + if (!Prototype.BrowserFeatures.ElementExtensions && div['__proto__']) { + window.HTMLElement = { }; + window.HTMLElement.prototype = div['__proto__']; + Prototype.BrowserFeatures.ElementExtensions = true; + } + + div = null; + +})(document.createElement('div')); Element.extend = (function() { - if (Prototype.BrowserFeatures.SpecificElementExtensions) + + function checkDeficiency(tagName) { + if (typeof window.Element != 'undefined') { + var proto = window.Element.prototype; + if (proto) { + var id = '_' + (Math.random()+'').slice(2), + el = document.createElement(tagName); + proto[id] = 'x'; + var isBuggy = (el[id] !== 'x'); + delete proto[id]; + el = null; + return isBuggy; + } + } + return false; + } + + function extendElementWith(element, methods) { + for (var property in methods) { + var value = methods[property]; + if (Object.isFunction(value) && !(property in element)) + element[property] = value.methodize(); + } + } + + var HTMLOBJECTELEMENT_PROTOTYPE_BUGGY = checkDeficiency('object'); + + if (Prototype.BrowserFeatures.SpecificElementExtensions) { + if (HTMLOBJECTELEMENT_PROTOTYPE_BUGGY) { + return function(element) { + if (element && typeof element._extendedByPrototype == 'undefined') { + var t = element.tagName; + if (t && (/^(?:object|applet|embed)$/i.test(t))) { + extendElementWith(element, Element.Methods); + extendElementWith(element, Element.Methods.Simulated); + extendElementWith(element, Element.Methods.ByTag[t.toUpperCase()]); + } + } + return element; + } + } return Prototype.K; + } var Methods = { }, ByTag = Element.Methods.ByTag; var extend = Object.extend(function(element) { - if (!element || element._extendedByPrototype || + if (!element || typeof element._extendedByPrototype != 'undefined' || element.nodeType != 1 || element == window) return element; var methods = Object.clone(Methods), - tagName = element.tagName.toUpperCase(), property, value; + tagName = element.tagName.toUpperCase(); - // extend methods for specific tags if (ByTag[tagName]) Object.extend(methods, ByTag[tagName]); - for (property in methods) { - value = methods[property]; - if (Object.isFunction(value) && !(property in element)) - element[property] = value.methodize(); - } + extendElementWith(element, methods); element._extendedByPrototype = Prototype.emptyFunction; return element; }, { refresh: function() { - // extend methods for all tags (Safari doesn't need this) if (!Prototype.BrowserFeatures.ElementExtensions) { Object.extend(Methods, Element.Methods); Object.extend(Methods, Element.Methods.Simulated); @@ -2594,10 +2953,14 @@ Element.extend = (function() { return extend; })(); -Element.hasAttribute = function(element, attribute) { - if (element.hasAttribute) return element.hasAttribute(attribute); - return Element.Methods.Simulated.hasAttribute(element, attribute); -}; +if (document.documentElement.hasAttribute) { + Element.hasAttribute = function(element, attribute) { + return element.hasAttribute(attribute); + }; +} +else { + Element.hasAttribute = Element.Methods.Simulated.hasAttribute; +} Element.addMethods = function(methods) { var F = Prototype.BrowserFeatures, T = Element.Methods.ByTag; @@ -2609,7 +2972,8 @@ Element.addMethods = function(methods) { "FORM": Object.clone(Form.Methods), "INPUT": Object.clone(Form.Element.Methods), "SELECT": Object.clone(Form.Element.Methods), - "TEXTAREA": Object.clone(Form.Element.Methods) + "TEXTAREA": Object.clone(Form.Element.Methods), + "BUTTON": Object.clone(Form.Element.Methods) }); } @@ -2661,14 +3025,19 @@ Element.addMethods = function(methods) { klass = 'HTML' + tagName.capitalize() + 'Element'; if (window[klass]) return window[klass]; - window[klass] = { }; - window[klass].prototype = document.createElement(tagName)['__proto__']; - return window[klass]; + var element = document.createElement(tagName), + proto = element['__proto__'] || element.constructor.prototype; + + element = null; + return proto; } + var elementPrototype = window.HTMLElement ? HTMLElement.prototype : + Element.prototype; + if (F.ElementExtensions) { - copy(Element.Methods, HTMLElement.prototype); - copy(Element.Methods.Simulated, HTMLElement.prototype, true); + copy(Element.Methods, elementPrototype); + copy(Element.Methods.Simulated, elementPrototype, true); } if (F.SpecificElementExtensions) { @@ -2686,791 +3055,1954 @@ Element.addMethods = function(methods) { Element.cache = { }; }; + document.viewport = { + getDimensions: function() { - var dimensions = { }, B = Prototype.Browser; - $w('width height').each(function(d) { - var D = d.capitalize(); - if (B.WebKit && !document.evaluate) { - // Safari <3.0 needs self.innerWidth/Height - dimensions[d] = self['inner' + D]; - } else if (B.Opera && parseFloat(window.opera.version()) < 9.5) { - // Opera <9.5 needs document.body.clientWidth/Height - dimensions[d] = document.body['client' + D] - } else { - dimensions[d] = document.documentElement['client' + D]; - } - }); - return dimensions; - }, - - getWidth: function() { - return this.getDimensions().width; - }, - - getHeight: function() { - return this.getDimensions().height; + return { width: this.getWidth(), height: this.getHeight() }; }, getScrollOffsets: function() { return Element._returnOffset( window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft, - window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop); + window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop); } }; -/* Portions of the Selector class are derived from Jack Slocum's DomQuery, - * part of YUI-Ext version 0.40, distributed under the terms of an MIT-style - * license. Please see http://www.yui-ext.com/ for more information. */ -var Selector = Class.create({ - initialize: function(expression) { - this.expression = expression.strip(); +(function(viewport) { + var B = Prototype.Browser, doc = document, element, property = {}; - if (this.shouldUseSelectorsAPI()) { - this.mode = 'selectorsAPI'; - } else if (this.shouldUseXPath()) { - this.mode = 'xpath'; - this.compileXPathMatcher(); + function getRootElement() { + if (B.WebKit && !doc.evaluate) + return document; + + if (B.Opera && window.parseFloat(window.opera.version()) < 9.5) + return document.body; + + return document.documentElement; + } + + function define(D) { + if (!element) element = getRootElement(); + + property[D] = 'client' + D; + + viewport['get' + D] = function() { return element[property[D]] }; + return viewport['get' + D](); + } + + viewport.getWidth = define.curry('Width'); + + viewport.getHeight = define.curry('Height'); +})(document.viewport); + + +Element.Storage = { + UID: 1 +}; + +Element.addMethods({ + getStorage: function(element) { + if (!(element = $(element))) return; + + var uid; + if (element === window) { + uid = 0; } else { - this.mode = "normal"; - this.compileMatcher(); + if (typeof element._prototypeUID === "undefined") + element._prototypeUID = Element.Storage.UID++; + uid = element._prototypeUID; } + if (!Element.Storage[uid]) + Element.Storage[uid] = $H(); + + return Element.Storage[uid]; }, - shouldUseXPath: function() { - if (!Prototype.BrowserFeatures.XPath) return false; + store: function(element, key, value) { + if (!(element = $(element))) return; - var e = this.expression; - - // Safari 3 chokes on :*-of-type and :empty - if (Prototype.Browser.WebKit && - (e.include("-of-type") || e.include(":empty"))) - return false; - - // XPath can't do namespaced attributes, nor can it read - // the "checked" property from DOM nodes - if ((/(\[[\w-]*?:|:checked)/).test(e)) - return false; - - return true; - }, - - shouldUseSelectorsAPI: function() { - if (!Prototype.BrowserFeatures.SelectorsAPI) return false; - - if (!Selector._div) Selector._div = new Element('div'); - - // Make sure the browser treats the selector as valid. Test on an - // isolated element to minimize cost of this check. - try { - Selector._div.querySelector(this.expression); - } catch(e) { - return false; + if (arguments.length === 2) { + Element.getStorage(element).update(key); + } else { + Element.getStorage(element).set(key, value); } - return true; + return element; }, - compileMatcher: function() { - var e = this.expression, ps = Selector.patterns, h = Selector.handlers, - c = Selector.criteria, le, p, m; + retrieve: function(element, key, defaultValue) { + if (!(element = $(element))) return; + var hash = Element.getStorage(element), value = hash.get(key); - if (Selector._cache[e]) { - this.matcher = Selector._cache[e]; - return; + if (Object.isUndefined(value)) { + hash.set(key, defaultValue); + value = defaultValue; } - this.matcher = ["this.matcher = function(root) {", - "var r = root, h = Selector.handlers, c = false, n;"]; + return value; + }, - while (e && le != e && (/\S/).test(e)) { - le = e; - for (var i in ps) { - p = ps[i]; - if (m = e.match(p)) { - this.matcher.push(Object.isFunction(c[i]) ? c[i](m) : - new Template(c[i]).evaluate(m)); - e = e.replace(m[0], ''); - break; - } + clone: function(element, deep) { + if (!(element = $(element))) return; + var clone = element.cloneNode(deep); + clone._prototypeUID = void 0; + if (deep) { + var descendants = Element.select(clone, '*'), + i = descendants.length; + while (i--) { + descendants[i]._prototypeUID = void 0; } } - - this.matcher.push("return h.unique(n);\n}"); - eval(this.matcher.join('\n')); - Selector._cache[this.expression] = this.matcher; + return Element.extend(clone); }, - compileXPathMatcher: function() { - var e = this.expression, ps = Selector.patterns, - x = Selector.xpath, le, m; + purge: function(element) { + if (!(element = $(element))) return; + var purgeElement = Element._purgeElement; - if (Selector._cache[e]) { - this.xpath = Selector._cache[e]; return; - } + purgeElement(element); - this.matcher = ['.//*']; - while (e && le != e && (/\S/).test(e)) { - le = e; - for (var i in ps) { - if (m = e.match(ps[i])) { - this.matcher.push(Object.isFunction(x[i]) ? x[i](m) : - new Template(x[i]).evaluate(m)); - e = e.replace(m[0], ''); - break; - } - } - } + var descendants = element.getElementsByTagName('*'), + i = descendants.length; - this.xpath = this.matcher.join(''); - Selector._cache[this.expression] = this.xpath; - }, + while (i--) purgeElement(descendants[i]); - findElements: function(root) { - root = root || document; - var e = this.expression, results; - - switch (this.mode) { - case 'selectorsAPI': - // querySelectorAll queries document-wide, then filters to descendants - // of the context element. That's not what we want. - // Add an explicit context to the selector if necessary. - if (root !== document) { - var oldId = root.id, id = $(root).identify(); - e = "#" + id + " " + e; - } - - results = $A(root.querySelectorAll(e)).map(Element.extend); - root.id = oldId; - - return results; - case 'xpath': - return document._getElementsByXPath(this.xpath, root); - default: - return this.matcher(root); - } - }, - - match: function(element) { - this.tokens = []; - - var e = this.expression, ps = Selector.patterns, as = Selector.assertions; - var le, p, m; - - while (e && le !== e && (/\S/).test(e)) { - le = e; - for (var i in ps) { - p = ps[i]; - if (m = e.match(p)) { - // use the Selector.assertions methods unless the selector - // is too complex. - if (as[i]) { - this.tokens.push([i, Object.clone(m)]); - e = e.replace(m[0], ''); - } else { - // reluctantly do a document-wide search - // and look for a match in the array - return this.findElements(document).include(element); - } - } - } - } - - var match = true, name, matches; - for (var i = 0, token; token = this.tokens[i]; i++) { - name = token[0], matches = token[1]; - if (!Selector.assertions[name](element, matches)) { - match = false; break; - } - } - - return match; - }, - - toString: function() { - return this.expression; - }, - - inspect: function() { - return "#"; + return null; } }); -Object.extend(Selector, { - _cache: { }, +(function() { - xpath: { - descendant: "//*", - child: "/*", - adjacent: "/following-sibling::*[1]", - laterSibling: '/following-sibling::*', - tagName: function(m) { - if (m[1] == '*') return ''; - return "[local-name()='" + m[1].toLowerCase() + - "' or local-name()='" + m[1].toUpperCase() + "']"; - }, - className: "[contains(concat(' ', @class, ' '), ' #{1} ')]", - id: "[@id='#{1}']", - attrPresence: function(m) { - m[1] = m[1].toLowerCase(); - return new Template("[@#{1}]").evaluate(m); - }, - attr: function(m) { - m[1] = m[1].toLowerCase(); - m[3] = m[5] || m[6]; - return new Template(Selector.xpath.operators[m[2]]).evaluate(m); - }, - pseudo: function(m) { - var h = Selector.xpath.pseudos[m[1]]; - if (!h) return ''; - if (Object.isFunction(h)) return h(m); - return new Template(Selector.xpath.pseudos[m[1]]).evaluate(m); - }, - operators: { - '=': "[@#{1}='#{3}']", - '!=': "[@#{1}!='#{3}']", - '^=': "[starts-with(@#{1}, '#{3}')]", - '$=': "[substring(@#{1}, (string-length(@#{1}) - string-length('#{3}') + 1))='#{3}']", - '*=': "[contains(@#{1}, '#{3}')]", - '~=': "[contains(concat(' ', @#{1}, ' '), ' #{3} ')]", - '|=': "[contains(concat('-', @#{1}, '-'), '-#{3}-')]" - }, - pseudos: { - 'first-child': '[not(preceding-sibling::*)]', - 'last-child': '[not(following-sibling::*)]', - 'only-child': '[not(preceding-sibling::* or following-sibling::*)]', - 'empty': "[count(*) = 0 and (count(text()) = 0)]", - 'checked': "[@checked]", - 'disabled': "[(@disabled) and (@type!='hidden')]", - 'enabled': "[not(@disabled) and (@type!='hidden')]", - 'not': function(m) { - var e = m[6], p = Selector.patterns, - x = Selector.xpath, le, v; + function toDecimal(pctString) { + var match = pctString.match(/^(\d+)%?$/i); + if (!match) return null; + return (Number(match[1]) / 100); + } - var exclusion = []; - while (e && le != e && (/\S/).test(e)) { - le = e; - for (var i in p) { - if (m = e.match(p[i])) { - v = Object.isFunction(x[i]) ? x[i](m) : new Template(x[i]).evaluate(m); - exclusion.push("(" + v.substring(1, v.length - 1) + ")"); - e = e.replace(m[0], ''); - break; - } - } - } - return "[not(" + exclusion.join(" and ") + ")]"; - }, - 'nth-child': function(m) { - return Selector.xpath.pseudos.nth("(count(./preceding-sibling::*) + 1) ", m); - }, - 'nth-last-child': function(m) { - return Selector.xpath.pseudos.nth("(count(./following-sibling::*) + 1) ", m); - }, - 'nth-of-type': function(m) { - return Selector.xpath.pseudos.nth("position() ", m); - }, - 'nth-last-of-type': function(m) { - return Selector.xpath.pseudos.nth("(last() + 1 - position()) ", m); - }, - 'first-of-type': function(m) { - m[6] = "1"; return Selector.xpath.pseudos['nth-of-type'](m); - }, - 'last-of-type': function(m) { - m[6] = "1"; return Selector.xpath.pseudos['nth-last-of-type'](m); - }, - 'only-of-type': function(m) { - var p = Selector.xpath.pseudos; return p['first-of-type'](m) + p['last-of-type'](m); - }, - nth: function(fragment, m) { - var mm, formula = m[6], predicate; - if (formula == 'even') formula = '2n+0'; - if (formula == 'odd') formula = '2n+1'; - if (mm = formula.match(/^(\d+)$/)) // digit only - return '[' + fragment + "= " + mm[1] + ']'; - if (mm = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b - if (mm[1] == "-") mm[1] = -1; - var a = mm[1] ? Number(mm[1]) : 1; - var b = mm[2] ? Number(mm[2]) : 0; - predicate = "[((#{fragment} - #{b}) mod #{a} = 0) and " + - "((#{fragment} - #{b}) div #{a} >= 0)]"; - return new Template(predicate).evaluate({ - fragment: fragment, a: a, b: b }); - } - } + function getPixelValue(value, property, context) { + var element = null; + if (Object.isElement(value)) { + element = value; + value = element.getStyle(property); } - }, - criteria: { - tagName: 'n = h.tagName(n, r, "#{1}", c); c = false;', - className: 'n = h.className(n, r, "#{1}", c); c = false;', - id: 'n = h.id(n, r, "#{1}", c); c = false;', - attrPresence: 'n = h.attrPresence(n, r, "#{1}", c); c = false;', - attr: function(m) { - m[3] = (m[5] || m[6]); - return new Template('n = h.attr(n, r, "#{1}", "#{3}", "#{2}", c); c = false;').evaluate(m); - }, - pseudo: function(m) { - if (m[6]) m[6] = m[6].replace(/"/g, '\\"'); - return new Template('n = h.pseudo(n, "#{1}", "#{6}", r, c); c = false;').evaluate(m); - }, - descendant: 'c = "descendant";', - child: 'c = "child";', - adjacent: 'c = "adjacent";', - laterSibling: 'c = "laterSibling";' - }, - - patterns: { - // combinators must be listed first - // (and descendant needs to be last combinator) - laterSibling: /^\s*~\s*/, - child: /^\s*>\s*/, - adjacent: /^\s*\+\s*/, - descendant: /^\s/, - - // selectors follow - tagName: /^\s*(\*|[\w\-]+)(\b|$)?/, - id: /^#([\w\-\*]+)(\b|$)/, - className: /^\.([\w\-\*]+)(\b|$)/, - pseudo: -/^:((first|last|nth|nth-last|only)(-child|-of-type)|empty|checked|(en|dis)abled|not)(\((.*?)\))?(\b|$|(?=\s|[:+~>]))/, - attrPresence: /^\[((?:[\w]+:)?[\w]+)\]/, - attr: /\[((?:[\w-]*:)?[\w-]+)\s*(?:([!^$*~|]?=)\s*((['"])([^\4]*?)\4|([^'"][^\]]*?)))?\]/ - }, - - // for Selector.match and Element#match - assertions: { - tagName: function(element, matches) { - return matches[1].toUpperCase() == element.tagName.toUpperCase(); - }, - - className: function(element, matches) { - return Element.hasClassName(element, matches[1]); - }, - - id: function(element, matches) { - return element.id === matches[1]; - }, - - attrPresence: function(element, matches) { - return Element.hasAttribute(element, matches[1]); - }, - - attr: function(element, matches) { - var nodeValue = Element.readAttribute(element, matches[1]); - return nodeValue && Selector.operators[matches[2]](nodeValue, matches[5] || matches[6]); + if (value === null) { + return null; } - }, - handlers: { - // UTILITY FUNCTIONS - // joins two collections - concat: function(a, b) { - for (var i = 0, node; node = b[i]; i++) - a.push(node); - return a; - }, + if ((/^(?:-)?\d+(\.\d+)?(px)?$/i).test(value)) { + return window.parseFloat(value); + } - // marks an array of nodes for counting - mark: function(nodes) { - var _true = Prototype.emptyFunction; - for (var i = 0, node; node = nodes[i]; i++) - node._countedByPrototype = _true; - return nodes; - }, + var isPercentage = value.include('%'), isViewport = (context === document.viewport); - unmark: function(nodes) { - for (var i = 0, node; node = nodes[i]; i++) - node._countedByPrototype = undefined; - return nodes; - }, + if (/\d/.test(value) && element && element.runtimeStyle && !(isPercentage && isViewport)) { + var style = element.style.left, rStyle = element.runtimeStyle.left; + element.runtimeStyle.left = element.currentStyle.left; + element.style.left = value || 0; + value = element.style.pixelLeft; + element.style.left = style; + element.runtimeStyle.left = rStyle; - // mark each child node with its position (for nth calls) - // "ofType" flag indicates whether we're indexing for nth-of-type - // rather than nth-child - index: function(parentNode, reverse, ofType) { - parentNode._countedByPrototype = Prototype.emptyFunction; - if (reverse) { - for (var nodes = parentNode.childNodes, i = nodes.length - 1, j = 1; i >= 0; i--) { - var node = nodes[i]; - if (node.nodeType == 1 && (!ofType || node._countedByPrototype)) node.nodeIndex = j++; + return value; + } + + if (element && isPercentage) { + context = context || element.parentNode; + var decimal = toDecimal(value); + var whole = null; + var position = element.getStyle('position'); + + var isHorizontal = property.include('left') || property.include('right') || + property.include('width'); + + var isVertical = property.include('top') || property.include('bottom') || + property.include('height'); + + if (context === document.viewport) { + if (isHorizontal) { + whole = document.viewport.getWidth(); + } else if (isVertical) { + whole = document.viewport.getHeight(); } } else { - for (var i = 0, j = 1, nodes = parentNode.childNodes; node = nodes[i]; i++) - if (node.nodeType == 1 && (!ofType || node._countedByPrototype)) node.nodeIndex = j++; - } - }, - - // filters out duplicates and extends all nodes - unique: function(nodes) { - if (nodes.length == 0) return nodes; - var results = [], n; - for (var i = 0, l = nodes.length; i < l; i++) - if (!(n = nodes[i])._countedByPrototype) { - n._countedByPrototype = Prototype.emptyFunction; - results.push(Element.extend(n)); + if (isHorizontal) { + whole = $(context).measure('width'); + } else if (isVertical) { + whole = $(context).measure('height'); } - return Selector.handlers.unmark(results); - }, - - // COMBINATOR FUNCTIONS - descendant: function(nodes) { - var h = Selector.handlers; - for (var i = 0, results = [], node; node = nodes[i]; i++) - h.concat(results, node.getElementsByTagName('*')); - return results; - }, - - child: function(nodes) { - var h = Selector.handlers; - for (var i = 0, results = [], node; node = nodes[i]; i++) { - for (var j = 0, child; child = node.childNodes[j]; j++) - if (child.nodeType == 1 && child.tagName != '!') results.push(child); } - return results; - }, - adjacent: function(nodes) { - for (var i = 0, results = [], node; node = nodes[i]; i++) { - var next = this.nextElementSibling(node); - if (next) results.push(next); - } - return results; - }, - - laterSibling: function(nodes) { - var h = Selector.handlers; - for (var i = 0, results = [], node; node = nodes[i]; i++) - h.concat(results, Element.nextSiblings(node)); - return results; - }, - - nextElementSibling: function(node) { - while (node = node.nextSibling) - if (node.nodeType == 1) return node; - return null; - }, - - previousElementSibling: function(node) { - while (node = node.previousSibling) - if (node.nodeType == 1) return node; - return null; - }, - - // TOKEN FUNCTIONS - tagName: function(nodes, root, tagName, combinator) { - var uTagName = tagName.toUpperCase(); - var results = [], h = Selector.handlers; - if (nodes) { - if (combinator) { - // fastlane for ordinary descendant combinators - if (combinator == "descendant") { - for (var i = 0, node; node = nodes[i]; i++) - h.concat(results, node.getElementsByTagName(tagName)); - return results; - } else nodes = this[combinator](nodes); - if (tagName == "*") return nodes; - } - for (var i = 0, node; node = nodes[i]; i++) - if (node.tagName.toUpperCase() === uTagName) results.push(node); - return results; - } else return root.getElementsByTagName(tagName); - }, - - id: function(nodes, root, id, combinator) { - var targetNode = $(id), h = Selector.handlers; - if (!targetNode) return []; - if (!nodes && root == document) return [targetNode]; - if (nodes) { - if (combinator) { - if (combinator == 'child') { - for (var i = 0, node; node = nodes[i]; i++) - if (targetNode.parentNode == node) return [targetNode]; - } else if (combinator == 'descendant') { - for (var i = 0, node; node = nodes[i]; i++) - if (Element.descendantOf(targetNode, node)) return [targetNode]; - } else if (combinator == 'adjacent') { - for (var i = 0, node; node = nodes[i]; i++) - if (Selector.handlers.previousElementSibling(targetNode) == node) - return [targetNode]; - } else nodes = h[combinator](nodes); - } - for (var i = 0, node; node = nodes[i]; i++) - if (node == targetNode) return [targetNode]; - return []; - } - return (targetNode && Element.descendantOf(targetNode, root)) ? [targetNode] : []; - }, - - className: function(nodes, root, className, combinator) { - if (nodes && combinator) nodes = this[combinator](nodes); - return Selector.handlers.byClassName(nodes, root, className); - }, - - byClassName: function(nodes, root, className) { - if (!nodes) nodes = Selector.handlers.descendant([root]); - var needle = ' ' + className + ' '; - for (var i = 0, results = [], node, nodeClassName; node = nodes[i]; i++) { - nodeClassName = node.className; - if (nodeClassName.length == 0) continue; - if (nodeClassName == className || (' ' + nodeClassName + ' ').include(needle)) - results.push(node); - } - return results; - }, - - attrPresence: function(nodes, root, attr, combinator) { - if (!nodes) nodes = root.getElementsByTagName("*"); - if (nodes && combinator) nodes = this[combinator](nodes); - var results = []; - for (var i = 0, node; node = nodes[i]; i++) - if (Element.hasAttribute(node, attr)) results.push(node); - return results; - }, - - attr: function(nodes, root, attr, value, operator, combinator) { - if (!nodes) nodes = root.getElementsByTagName("*"); - if (nodes && combinator) nodes = this[combinator](nodes); - var handler = Selector.operators[operator], results = []; - for (var i = 0, node; node = nodes[i]; i++) { - var nodeValue = Element.readAttribute(node, attr); - if (nodeValue === null) continue; - if (handler(nodeValue, value)) results.push(node); - } - return results; - }, - - pseudo: function(nodes, name, value, root, combinator) { - if (nodes && combinator) nodes = this[combinator](nodes); - if (!nodes) nodes = root.getElementsByTagName("*"); - return Selector.pseudos[name](nodes, value, root); + return (whole === null) ? 0 : whole * decimal; } - }, - pseudos: { - 'first-child': function(nodes, value, root) { - for (var i = 0, results = [], node; node = nodes[i]; i++) { - if (Selector.handlers.previousElementSibling(node)) continue; - results.push(node); - } - return results; - }, - 'last-child': function(nodes, value, root) { - for (var i = 0, results = [], node; node = nodes[i]; i++) { - if (Selector.handlers.nextElementSibling(node)) continue; - results.push(node); - } - return results; - }, - 'only-child': function(nodes, value, root) { - var h = Selector.handlers; - for (var i = 0, results = [], node; node = nodes[i]; i++) - if (!h.previousElementSibling(node) && !h.nextElementSibling(node)) - results.push(node); - return results; - }, - 'nth-child': function(nodes, formula, root) { - return Selector.pseudos.nth(nodes, formula, root); - }, - 'nth-last-child': function(nodes, formula, root) { - return Selector.pseudos.nth(nodes, formula, root, true); - }, - 'nth-of-type': function(nodes, formula, root) { - return Selector.pseudos.nth(nodes, formula, root, false, true); - }, - 'nth-last-of-type': function(nodes, formula, root) { - return Selector.pseudos.nth(nodes, formula, root, true, true); - }, - 'first-of-type': function(nodes, formula, root) { - return Selector.pseudos.nth(nodes, "1", root, false, true); - }, - 'last-of-type': function(nodes, formula, root) { - return Selector.pseudos.nth(nodes, "1", root, true, true); - }, - 'only-of-type': function(nodes, formula, root) { - var p = Selector.pseudos; - return p['last-of-type'](p['first-of-type'](nodes, formula, root), formula, root); - }, - - // handles the an+b logic - getIndices: function(a, b, total) { - if (a == 0) return b > 0 ? [b] : []; - return $R(1, total).inject([], function(memo, i) { - if (0 == (i - b) % a && (i - b) / a >= 0) memo.push(i); - return memo; - }); - }, - - // handles nth(-last)-child, nth(-last)-of-type, and (first|last)-of-type - nth: function(nodes, formula, root, reverse, ofType) { - if (nodes.length == 0) return []; - if (formula == 'even') formula = '2n+0'; - if (formula == 'odd') formula = '2n+1'; - var h = Selector.handlers, results = [], indexed = [], m; - h.mark(nodes); - for (var i = 0, node; node = nodes[i]; i++) { - if (!node.parentNode._countedByPrototype) { - h.index(node.parentNode, reverse, ofType); - indexed.push(node.parentNode); - } - } - if (formula.match(/^\d+$/)) { // just a number - formula = Number(formula); - for (var i = 0, node; node = nodes[i]; i++) - if (node.nodeIndex == formula) results.push(node); - } else if (m = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b - if (m[1] == "-") m[1] = -1; - var a = m[1] ? Number(m[1]) : 1; - var b = m[2] ? Number(m[2]) : 0; - var indices = Selector.pseudos.getIndices(a, b, nodes.length); - for (var i = 0, node, l = indices.length; node = nodes[i]; i++) { - for (var j = 0; j < l; j++) - if (node.nodeIndex == indices[j]) results.push(node); - } - } - h.unmark(nodes); - h.unmark(indexed); - return results; - }, - - 'empty': function(nodes, value, root) { - for (var i = 0, results = [], node; node = nodes[i]; i++) { - // IE treats comments as element nodes - if (node.tagName == '!' || node.firstChild) continue; - results.push(node); - } - return results; - }, - - 'not': function(nodes, selector, root) { - var h = Selector.handlers, selectorType, m; - var exclusions = new Selector(selector).findElements(root); - h.mark(exclusions); - for (var i = 0, results = [], node; node = nodes[i]; i++) - if (!node._countedByPrototype) results.push(node); - h.unmark(exclusions); - return results; - }, - - 'enabled': function(nodes, value, root) { - for (var i = 0, results = [], node; node = nodes[i]; i++) - if (!node.disabled && (!node.type || node.type !== 'hidden')) - results.push(node); - return results; - }, - - 'disabled': function(nodes, value, root) { - for (var i = 0, results = [], node; node = nodes[i]; i++) - if (node.disabled) results.push(node); - return results; - }, - - 'checked': function(nodes, value, root) { - for (var i = 0, results = [], node; node = nodes[i]; i++) - if (node.checked) results.push(node); - return results; - } - }, - - operators: { - '=': function(nv, v) { return nv == v; }, - '!=': function(nv, v) { return nv != v; }, - '^=': function(nv, v) { return nv == v || nv && nv.startsWith(v); }, - '$=': function(nv, v) { return nv == v || nv && nv.endsWith(v); }, - '*=': function(nv, v) { return nv == v || nv && nv.include(v); }, - '$=': function(nv, v) { return nv.endsWith(v); }, - '*=': function(nv, v) { return nv.include(v); }, - '~=': function(nv, v) { return (' ' + nv + ' ').include(' ' + v + ' '); }, - '|=': function(nv, v) { return ('-' + (nv || "").toUpperCase() + - '-').include('-' + (v || "").toUpperCase() + '-'); } - }, - - split: function(expression) { - var expressions = []; - expression.scan(/(([\w#:.~>+()\s-]+|\*|\[.*?\])+)\s*(,|$)/, function(m) { - expressions.push(m[1].strip()); - }); - return expressions; - }, - - matchElements: function(elements, expression) { - var matches = $$(expression), h = Selector.handlers; - h.mark(matches); - for (var i = 0, results = [], element; element = elements[i]; i++) - if (element._countedByPrototype) results.push(element); - h.unmark(matches); - return results; - }, - - findElement: function(elements, expression, index) { - if (Object.isNumber(expression)) { - index = expression; expression = false; - } - return Selector.matchElements(elements, expression || '*')[index || 0]; - }, - - findChildElements: function(element, expressions) { - expressions = Selector.split(expressions.join(',')); - var results = [], h = Selector.handlers; - for (var i = 0, l = expressions.length, selector; i < l; i++) { - selector = new Selector(expressions[i].strip()); - h.concat(results, selector.findElements(element)); - } - return (l > 1) ? h.unique(results) : results; + return 0; } -}); -if (Prototype.Browser.IE) { - Object.extend(Selector.handlers, { - // IE returns comment nodes on getElementsByTagName("*"). - // Filter them out. - concat: function(a, b) { - for (var i = 0, node; node = b[i]; i++) - if (node.tagName !== "!") a.push(node); - return a; + function toCSSPixels(number) { + if (Object.isString(number) && number.endsWith('px')) { + return number; + } + return number + 'px'; + } + + function isDisplayed(element) { + var originalElement = element; + while (element && element.parentNode) { + var display = element.getStyle('display'); + if (display === 'none') { + return false; + } + element = $(element.parentNode); + } + return true; + } + + var hasLayout = Prototype.K; + if ('currentStyle' in document.documentElement) { + hasLayout = function(element) { + if (!element.currentStyle.hasLayout) { + element.style.zoom = 1; + } + return element; + }; + } + + function cssNameFor(key) { + if (key.include('border')) key = key + '-width'; + return key.camelize(); + } + + Element.Layout = Class.create(Hash, { + initialize: function($super, element, preCompute) { + $super(); + this.element = $(element); + + Element.Layout.PROPERTIES.each( function(property) { + this._set(property, null); + }, this); + + if (preCompute) { + this._preComputing = true; + this._begin(); + Element.Layout.PROPERTIES.each( this._compute, this ); + this._end(); + this._preComputing = false; + } }, - // IE improperly serializes _countedByPrototype in (inner|outer)HTML. - unmark: function(nodes) { - for (var i = 0, node; node = nodes[i]; i++) - node.removeAttribute('_countedByPrototype'); - return nodes; + _set: function(property, value) { + return Hash.prototype.set.call(this, property, value); + }, + + set: function(property, value) { + throw "Properties of Element.Layout are read-only."; + }, + + get: function($super, property) { + var value = $super(property); + return value === null ? this._compute(property) : value; + }, + + _begin: function() { + if (this._prepared) return; + + var element = this.element; + if (isDisplayed(element)) { + this._prepared = true; + return; + } + + var originalStyles = { + position: element.style.position || '', + width: element.style.width || '', + visibility: element.style.visibility || '', + display: element.style.display || '' + }; + + element.store('prototype_original_styles', originalStyles); + + var position = element.getStyle('position'), + width = element.getStyle('width'); + + if (width === "0px" || width === null) { + element.style.display = 'block'; + width = element.getStyle('width'); + } + + var context = (position === 'fixed') ? document.viewport : + element.parentNode; + + element.setStyle({ + position: 'absolute', + visibility: 'hidden', + display: 'block' + }); + + var positionedWidth = element.getStyle('width'); + + var newWidth; + if (width && (positionedWidth === width)) { + newWidth = getPixelValue(element, 'width', context); + } else if (position === 'absolute' || position === 'fixed') { + newWidth = getPixelValue(element, 'width', context); + } else { + var parent = element.parentNode, pLayout = $(parent).getLayout(); + + newWidth = pLayout.get('width') - + this.get('margin-left') - + this.get('border-left') - + this.get('padding-left') - + this.get('padding-right') - + this.get('border-right') - + this.get('margin-right'); + } + + element.setStyle({ width: newWidth + 'px' }); + + this._prepared = true; + }, + + _end: function() { + var element = this.element; + var originalStyles = element.retrieve('prototype_original_styles'); + element.store('prototype_original_styles', null); + element.setStyle(originalStyles); + this._prepared = false; + }, + + _compute: function(property) { + var COMPUTATIONS = Element.Layout.COMPUTATIONS; + if (!(property in COMPUTATIONS)) { + throw "Property not found."; + } + + return this._set(property, COMPUTATIONS[property].call(this, this.element)); + }, + + toObject: function() { + var args = $A(arguments); + var keys = (args.length === 0) ? Element.Layout.PROPERTIES : + args.join(' ').split(' '); + var obj = {}; + keys.each( function(key) { + if (!Element.Layout.PROPERTIES.include(key)) return; + var value = this.get(key); + if (value != null) obj[key] = value; + }, this); + return obj; + }, + + toHash: function() { + var obj = this.toObject.apply(this, arguments); + return new Hash(obj); + }, + + toCSS: function() { + var args = $A(arguments); + var keys = (args.length === 0) ? Element.Layout.PROPERTIES : + args.join(' ').split(' '); + var css = {}; + + keys.each( function(key) { + if (!Element.Layout.PROPERTIES.include(key)) return; + if (Element.Layout.COMPOSITE_PROPERTIES.include(key)) return; + + var value = this.get(key); + if (value != null) css[cssNameFor(key)] = value + 'px'; + }, this); + return css; + }, + + inspect: function() { + return "#"; } }); + + Object.extend(Element.Layout, { + PROPERTIES: $w('height width top left right bottom border-left border-right border-top border-bottom padding-left padding-right padding-top padding-bottom margin-top margin-bottom margin-left margin-right padding-box-width padding-box-height border-box-width border-box-height margin-box-width margin-box-height'), + + COMPOSITE_PROPERTIES: $w('padding-box-width padding-box-height margin-box-width margin-box-height border-box-width border-box-height'), + + COMPUTATIONS: { + 'height': function(element) { + if (!this._preComputing) this._begin(); + + var bHeight = this.get('border-box-height'); + if (bHeight <= 0) { + if (!this._preComputing) this._end(); + return 0; + } + + var bTop = this.get('border-top'), + bBottom = this.get('border-bottom'); + + var pTop = this.get('padding-top'), + pBottom = this.get('padding-bottom'); + + if (!this._preComputing) this._end(); + + return bHeight - bTop - bBottom - pTop - pBottom; + }, + + 'width': function(element) { + if (!this._preComputing) this._begin(); + + var bWidth = this.get('border-box-width'); + if (bWidth <= 0) { + if (!this._preComputing) this._end(); + return 0; + } + + var bLeft = this.get('border-left'), + bRight = this.get('border-right'); + + var pLeft = this.get('padding-left'), + pRight = this.get('padding-right'); + + if (!this._preComputing) this._end(); + + return bWidth - bLeft - bRight - pLeft - pRight; + }, + + 'padding-box-height': function(element) { + var height = this.get('height'), + pTop = this.get('padding-top'), + pBottom = this.get('padding-bottom'); + + return height + pTop + pBottom; + }, + + 'padding-box-width': function(element) { + var width = this.get('width'), + pLeft = this.get('padding-left'), + pRight = this.get('padding-right'); + + return width + pLeft + pRight; + }, + + 'border-box-height': function(element) { + if (!this._preComputing) this._begin(); + var height = element.offsetHeight; + if (!this._preComputing) this._end(); + return height; + }, + + 'border-box-width': function(element) { + if (!this._preComputing) this._begin(); + var width = element.offsetWidth; + if (!this._preComputing) this._end(); + return width; + }, + + 'margin-box-height': function(element) { + var bHeight = this.get('border-box-height'), + mTop = this.get('margin-top'), + mBottom = this.get('margin-bottom'); + + if (bHeight <= 0) return 0; + + return bHeight + mTop + mBottom; + }, + + 'margin-box-width': function(element) { + var bWidth = this.get('border-box-width'), + mLeft = this.get('margin-left'), + mRight = this.get('margin-right'); + + if (bWidth <= 0) return 0; + + return bWidth + mLeft + mRight; + }, + + 'top': function(element) { + var offset = element.positionedOffset(); + return offset.top; + }, + + 'bottom': function(element) { + var offset = element.positionedOffset(), + parent = element.getOffsetParent(), + pHeight = parent.measure('height'); + + var mHeight = this.get('border-box-height'); + + return pHeight - mHeight - offset.top; + }, + + 'left': function(element) { + var offset = element.positionedOffset(); + return offset.left; + }, + + 'right': function(element) { + var offset = element.positionedOffset(), + parent = element.getOffsetParent(), + pWidth = parent.measure('width'); + + var mWidth = this.get('border-box-width'); + + return pWidth - mWidth - offset.left; + }, + + 'padding-top': function(element) { + return getPixelValue(element, 'paddingTop'); + }, + + 'padding-bottom': function(element) { + return getPixelValue(element, 'paddingBottom'); + }, + + 'padding-left': function(element) { + return getPixelValue(element, 'paddingLeft'); + }, + + 'padding-right': function(element) { + return getPixelValue(element, 'paddingRight'); + }, + + 'border-top': function(element) { + return getPixelValue(element, 'borderTopWidth'); + }, + + 'border-bottom': function(element) { + return getPixelValue(element, 'borderBottomWidth'); + }, + + 'border-left': function(element) { + return getPixelValue(element, 'borderLeftWidth'); + }, + + 'border-right': function(element) { + return getPixelValue(element, 'borderRightWidth'); + }, + + 'margin-top': function(element) { + return getPixelValue(element, 'marginTop'); + }, + + 'margin-bottom': function(element) { + return getPixelValue(element, 'marginBottom'); + }, + + 'margin-left': function(element) { + return getPixelValue(element, 'marginLeft'); + }, + + 'margin-right': function(element) { + return getPixelValue(element, 'marginRight'); + } + } + }); + + if ('getBoundingClientRect' in document.documentElement) { + Object.extend(Element.Layout.COMPUTATIONS, { + 'right': function(element) { + var parent = hasLayout(element.getOffsetParent()); + var rect = element.getBoundingClientRect(), + pRect = parent.getBoundingClientRect(); + + return (pRect.right - rect.right).round(); + }, + + 'bottom': function(element) { + var parent = hasLayout(element.getOffsetParent()); + var rect = element.getBoundingClientRect(), + pRect = parent.getBoundingClientRect(); + + return (pRect.bottom - rect.bottom).round(); + } + }); + } + + Element.Offset = Class.create({ + initialize: function(left, top) { + this.left = left.round(); + this.top = top.round(); + + this[0] = this.left; + this[1] = this.top; + }, + + relativeTo: function(offset) { + return new Element.Offset( + this.left - offset.left, + this.top - offset.top + ); + }, + + inspect: function() { + return "#".interpolate(this); + }, + + toString: function() { + return "[#{left}, #{top}]".interpolate(this); + }, + + toArray: function() { + return [this.left, this.top]; + } + }); + + function getLayout(element, preCompute) { + return new Element.Layout(element, preCompute); + } + + function measure(element, property) { + return $(element).getLayout().get(property); + } + + function getDimensions(element) { + element = $(element); + var display = Element.getStyle(element, 'display'); + + if (display && display !== 'none') { + return { width: element.offsetWidth, height: element.offsetHeight }; + } + + var style = element.style; + var originalStyles = { + visibility: style.visibility, + position: style.position, + display: style.display + }; + + var newStyles = { + visibility: 'hidden', + display: 'block' + }; + + if (originalStyles.position !== 'fixed') + newStyles.position = 'absolute'; + + Element.setStyle(element, newStyles); + + var dimensions = { + width: element.offsetWidth, + height: element.offsetHeight + }; + + Element.setStyle(element, originalStyles); + + return dimensions; + } + + function getOffsetParent(element) { + element = $(element); + + if (isDocument(element) || isDetached(element) || isBody(element) || isHtml(element)) + return $(document.body); + + var isInline = (Element.getStyle(element, 'display') === 'inline'); + if (!isInline && element.offsetParent) return $(element.offsetParent); + + while ((element = element.parentNode) && element !== document.body) { + if (Element.getStyle(element, 'position') !== 'static') { + return isHtml(element) ? $(document.body) : $(element); + } + } + + return $(document.body); + } + + + function cumulativeOffset(element) { + element = $(element); + var valueT = 0, valueL = 0; + if (element.parentNode) { + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + element = element.offsetParent; + } while (element); + } + return new Element.Offset(valueL, valueT); + } + + function positionedOffset(element) { + element = $(element); + + var layout = element.getLayout(); + + var valueT = 0, valueL = 0; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + element = element.offsetParent; + if (element) { + if (isBody(element)) break; + var p = Element.getStyle(element, 'position'); + if (p !== 'static') break; + } + } while (element); + + valueL -= layout.get('margin-top'); + valueT -= layout.get('margin-left'); + + return new Element.Offset(valueL, valueT); + } + + function cumulativeScrollOffset(element) { + var valueT = 0, valueL = 0; + do { + valueT += element.scrollTop || 0; + valueL += element.scrollLeft || 0; + element = element.parentNode; + } while (element); + return new Element.Offset(valueL, valueT); + } + + function viewportOffset(forElement) { + element = $(element); + var valueT = 0, valueL = 0, docBody = document.body; + + var element = forElement; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + if (element.offsetParent == docBody && + Element.getStyle(element, 'position') == 'absolute') break; + } while (element = element.offsetParent); + + element = forElement; + do { + if (element != docBody) { + valueT -= element.scrollTop || 0; + valueL -= element.scrollLeft || 0; + } + } while (element = element.parentNode); + return new Element.Offset(valueL, valueT); + } + + function absolutize(element) { + element = $(element); + + if (Element.getStyle(element, 'position') === 'absolute') { + return element; + } + + var offsetParent = getOffsetParent(element); + var eOffset = element.viewportOffset(), + pOffset = offsetParent.viewportOffset(); + + var offset = eOffset.relativeTo(pOffset); + var layout = element.getLayout(); + + element.store('prototype_absolutize_original_styles', { + left: element.getStyle('left'), + top: element.getStyle('top'), + width: element.getStyle('width'), + height: element.getStyle('height') + }); + + element.setStyle({ + position: 'absolute', + top: offset.top + 'px', + left: offset.left + 'px', + width: layout.get('width') + 'px', + height: layout.get('height') + 'px' + }); + + return element; + } + + function relativize(element) { + element = $(element); + if (Element.getStyle(element, 'position') === 'relative') { + return element; + } + + var originalStyles = + element.retrieve('prototype_absolutize_original_styles'); + + if (originalStyles) element.setStyle(originalStyles); + return element; + } + + if (Prototype.Browser.IE) { + getOffsetParent = getOffsetParent.wrap( + function(proceed, element) { + element = $(element); + + if (isDocument(element) || isDetached(element) || isBody(element) || isHtml(element)) + return $(document.body); + + var position = element.getStyle('position'); + if (position !== 'static') return proceed(element); + + element.setStyle({ position: 'relative' }); + var value = proceed(element); + element.setStyle({ position: position }); + return value; + } + ); + + positionedOffset = positionedOffset.wrap(function(proceed, element) { + element = $(element); + if (!element.parentNode) return new Element.Offset(0, 0); + var position = element.getStyle('position'); + if (position !== 'static') return proceed(element); + + var offsetParent = element.getOffsetParent(); + if (offsetParent && offsetParent.getStyle('position') === 'fixed') + hasLayout(offsetParent); + + element.setStyle({ position: 'relative' }); + var value = proceed(element); + element.setStyle({ position: position }); + return value; + }); + } else if (Prototype.Browser.Webkit) { + cumulativeOffset = function(element) { + element = $(element); + var valueT = 0, valueL = 0; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + if (element.offsetParent == document.body) + if (Element.getStyle(element, 'position') == 'absolute') break; + + element = element.offsetParent; + } while (element); + + return new Element.Offset(valueL, valueT); + }; + } + + + Element.addMethods({ + getLayout: getLayout, + measure: measure, + getDimensions: getDimensions, + getOffsetParent: getOffsetParent, + cumulativeOffset: cumulativeOffset, + positionedOffset: positionedOffset, + cumulativeScrollOffset: cumulativeScrollOffset, + viewportOffset: viewportOffset, + absolutize: absolutize, + relativize: relativize + }); + + function isBody(element) { + return element.nodeName.toUpperCase() === 'BODY'; + } + + function isHtml(element) { + return element.nodeName.toUpperCase() === 'HTML'; + } + + function isDocument(element) { + return element.nodeType === Node.DOCUMENT_NODE; + } + + function isDetached(element) { + return element !== document.body && + !Element.descendantOf(element, document.body); + } + + if ('getBoundingClientRect' in document.documentElement) { + Element.addMethods({ + viewportOffset: function(element) { + element = $(element); + if (isDetached(element)) return new Element.Offset(0, 0); + + var rect = element.getBoundingClientRect(), + docEl = document.documentElement; + return new Element.Offset(rect.left - docEl.clientLeft, + rect.top - docEl.clientTop); + } + }); + } +})(); +window.$$ = function() { + var expression = $A(arguments).join(', '); + return Prototype.Selector.select(expression, document); +}; + +Prototype.Selector = (function() { + + function select() { + throw new Error('Method "Prototype.Selector.select" must be defined.'); + } + + function match() { + throw new Error('Method "Prototype.Selector.match" must be defined.'); + } + + function find(elements, expression, index) { + index = index || 0; + var match = Prototype.Selector.match, length = elements.length, matchIndex = 0, i; + + for (i = 0; i < length; i++) { + if (match(elements[i], expression) && index == matchIndex++) { + return Element.extend(elements[i]); + } + } + } + + function extendElements(elements) { + for (var i = 0, length = elements.length; i < length; i++) { + Element.extend(elements[i]); + } + return elements; + } + + + var K = Prototype.K; + + return { + select: select, + match: match, + find: find, + extendElements: (Element.extend === K) ? K : extendElements, + extendElement: Element.extend + }; +})(); +/*! + * Sizzle CSS Selector Engine - v1.0 + * Copyright 2009, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ + */ +(function(){ + +var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, + done = 0, + toString = Object.prototype.toString, + hasDuplicate = false, + baseHasDuplicate = true; + +[0, 0].sort(function(){ + baseHasDuplicate = false; + return 0; +}); + +var Sizzle = function(selector, context, results, seed) { + results = results || []; + var origContext = context = context || document; + + if ( context.nodeType !== 1 && context.nodeType !== 9 ) { + return []; + } + + if ( !selector || typeof selector !== "string" ) { + return results; + } + + var parts = [], m, set, checkSet, check, mode, extra, prune = true, contextXML = isXML(context), + soFar = selector; + + while ( (chunker.exec(""), m = chunker.exec(soFar)) !== null ) { + soFar = m[3]; + + parts.push( m[1] ); + + if ( m[2] ) { + extra = m[3]; + break; + } + } + + if ( parts.length > 1 && origPOS.exec( selector ) ) { + if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { + set = posProcess( parts[0] + parts[1], context ); + } else { + set = Expr.relative[ parts[0] ] ? + [ context ] : + Sizzle( parts.shift(), context ); + + while ( parts.length ) { + selector = parts.shift(); + + if ( Expr.relative[ selector ] ) + selector += parts.shift(); + + set = posProcess( selector, set ); + } + } + } else { + if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML && + Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) { + var ret = Sizzle.find( parts.shift(), context, contextXML ); + context = ret.expr ? Sizzle.filter( ret.expr, ret.set )[0] : ret.set[0]; + } + + if ( context ) { + var ret = seed ? + { expr: parts.pop(), set: makeArray(seed) } : + Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML ); + set = ret.expr ? Sizzle.filter( ret.expr, ret.set ) : ret.set; + + if ( parts.length > 0 ) { + checkSet = makeArray(set); + } else { + prune = false; + } + + while ( parts.length ) { + var cur = parts.pop(), pop = cur; + + if ( !Expr.relative[ cur ] ) { + cur = ""; + } else { + pop = parts.pop(); + } + + if ( pop == null ) { + pop = context; + } + + Expr.relative[ cur ]( checkSet, pop, contextXML ); + } + } else { + checkSet = parts = []; + } + } + + if ( !checkSet ) { + checkSet = set; + } + + if ( !checkSet ) { + throw "Syntax error, unrecognized expression: " + (cur || selector); + } + + if ( toString.call(checkSet) === "[object Array]" ) { + if ( !prune ) { + results.push.apply( results, checkSet ); + } else if ( context && context.nodeType === 1 ) { + for ( var i = 0; checkSet[i] != null; i++ ) { + if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && contains(context, checkSet[i])) ) { + results.push( set[i] ); + } + } + } else { + for ( var i = 0; checkSet[i] != null; i++ ) { + if ( checkSet[i] && checkSet[i].nodeType === 1 ) { + results.push( set[i] ); + } + } + } + } else { + makeArray( checkSet, results ); + } + + if ( extra ) { + Sizzle( extra, origContext, results, seed ); + Sizzle.uniqueSort( results ); + } + + return results; +}; + +Sizzle.uniqueSort = function(results){ + if ( sortOrder ) { + hasDuplicate = baseHasDuplicate; + results.sort(sortOrder); + + if ( hasDuplicate ) { + for ( var i = 1; i < results.length; i++ ) { + if ( results[i] === results[i-1] ) { + results.splice(i--, 1); + } + } + } + } + + return results; +}; + +Sizzle.matches = function(expr, set){ + return Sizzle(expr, null, null, set); +}; + +Sizzle.find = function(expr, context, isXML){ + var set, match; + + if ( !expr ) { + return []; + } + + for ( var i = 0, l = Expr.order.length; i < l; i++ ) { + var type = Expr.order[i], match; + + if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { + var left = match[1]; + match.splice(1,1); + + if ( left.substr( left.length - 1 ) !== "\\" ) { + match[1] = (match[1] || "").replace(/\\/g, ""); + set = Expr.find[ type ]( match, context, isXML ); + if ( set != null ) { + expr = expr.replace( Expr.match[ type ], "" ); + break; + } + } + } + } + + if ( !set ) { + set = context.getElementsByTagName("*"); + } + + return {set: set, expr: expr}; +}; + +Sizzle.filter = function(expr, set, inplace, not){ + var old = expr, result = [], curLoop = set, match, anyFound, + isXMLFilter = set && set[0] && isXML(set[0]); + + while ( expr && set.length ) { + for ( var type in Expr.filter ) { + if ( (match = Expr.match[ type ].exec( expr )) != null ) { + var filter = Expr.filter[ type ], found, item; + anyFound = false; + + if ( curLoop == result ) { + result = []; + } + + if ( Expr.preFilter[ type ] ) { + match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); + + if ( !match ) { + anyFound = found = true; + } else if ( match === true ) { + continue; + } + } + + if ( match ) { + for ( var i = 0; (item = curLoop[i]) != null; i++ ) { + if ( item ) { + found = filter( item, match, i, curLoop ); + var pass = not ^ !!found; + + if ( inplace && found != null ) { + if ( pass ) { + anyFound = true; + } else { + curLoop[i] = false; + } + } else if ( pass ) { + result.push( item ); + anyFound = true; + } + } + } + } + + if ( found !== undefined ) { + if ( !inplace ) { + curLoop = result; + } + + expr = expr.replace( Expr.match[ type ], "" ); + + if ( !anyFound ) { + return []; + } + + break; + } + } + } + + if ( expr == old ) { + if ( anyFound == null ) { + throw "Syntax error, unrecognized expression: " + expr; + } else { + break; + } + } + + old = expr; + } + + return curLoop; +}; + +var Expr = Sizzle.selectors = { + order: [ "ID", "NAME", "TAG" ], + match: { + ID: /#((?:[\w\u00c0-\uFFFF-]|\\.)+)/, + CLASS: /\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/, + NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/, + ATTR: /\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/, + TAG: /^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/, + CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/, + POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/, + PSEUDO: /:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/ + }, + leftMatch: {}, + attrMap: { + "class": "className", + "for": "htmlFor" + }, + attrHandle: { + href: function(elem){ + return elem.getAttribute("href"); + } + }, + relative: { + "+": function(checkSet, part, isXML){ + var isPartStr = typeof part === "string", + isTag = isPartStr && !/\W/.test(part), + isPartStrNotTag = isPartStr && !isTag; + + if ( isTag && !isXML ) { + part = part.toUpperCase(); + } + + for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { + if ( (elem = checkSet[i]) ) { + while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} + + checkSet[i] = isPartStrNotTag || elem && elem.nodeName === part ? + elem || false : + elem === part; + } + } + + if ( isPartStrNotTag ) { + Sizzle.filter( part, checkSet, true ); + } + }, + ">": function(checkSet, part, isXML){ + var isPartStr = typeof part === "string"; + + if ( isPartStr && !/\W/.test(part) ) { + part = isXML ? part : part.toUpperCase(); + + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + if ( elem ) { + var parent = elem.parentNode; + checkSet[i] = parent.nodeName === part ? parent : false; + } + } + } else { + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + if ( elem ) { + checkSet[i] = isPartStr ? + elem.parentNode : + elem.parentNode === part; + } + } + + if ( isPartStr ) { + Sizzle.filter( part, checkSet, true ); + } + } + }, + "": function(checkSet, part, isXML){ + var doneName = done++, checkFn = dirCheck; + + if ( !/\W/.test(part) ) { + var nodeCheck = part = isXML ? part : part.toUpperCase(); + checkFn = dirNodeCheck; + } + + checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML); + }, + "~": function(checkSet, part, isXML){ + var doneName = done++, checkFn = dirCheck; + + if ( typeof part === "string" && !/\W/.test(part) ) { + var nodeCheck = part = isXML ? part : part.toUpperCase(); + checkFn = dirNodeCheck; + } + + checkFn("previousSibling", part, doneName, checkSet, nodeCheck, isXML); + } + }, + find: { + ID: function(match, context, isXML){ + if ( typeof context.getElementById !== "undefined" && !isXML ) { + var m = context.getElementById(match[1]); + return m ? [m] : []; + } + }, + NAME: function(match, context, isXML){ + if ( typeof context.getElementsByName !== "undefined" ) { + var ret = [], results = context.getElementsByName(match[1]); + + for ( var i = 0, l = results.length; i < l; i++ ) { + if ( results[i].getAttribute("name") === match[1] ) { + ret.push( results[i] ); + } + } + + return ret.length === 0 ? null : ret; + } + }, + TAG: function(match, context){ + return context.getElementsByTagName(match[1]); + } + }, + preFilter: { + CLASS: function(match, curLoop, inplace, result, not, isXML){ + match = " " + match[1].replace(/\\/g, "") + " "; + + if ( isXML ) { + return match; + } + + for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { + if ( elem ) { + if ( not ^ (elem.className && (" " + elem.className + " ").indexOf(match) >= 0) ) { + if ( !inplace ) + result.push( elem ); + } else if ( inplace ) { + curLoop[i] = false; + } + } + } + + return false; + }, + ID: function(match){ + return match[1].replace(/\\/g, ""); + }, + TAG: function(match, curLoop){ + for ( var i = 0; curLoop[i] === false; i++ ){} + return curLoop[i] && isXML(curLoop[i]) ? match[1] : match[1].toUpperCase(); + }, + CHILD: function(match){ + if ( match[1] == "nth" ) { + var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec( + match[2] == "even" && "2n" || match[2] == "odd" && "2n+1" || + !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); + + match[2] = (test[1] + (test[2] || 1)) - 0; + match[3] = test[3] - 0; + } + + match[0] = done++; + + return match; + }, + ATTR: function(match, curLoop, inplace, result, not, isXML){ + var name = match[1].replace(/\\/g, ""); + + if ( !isXML && Expr.attrMap[name] ) { + match[1] = Expr.attrMap[name]; + } + + if ( match[2] === "~=" ) { + match[4] = " " + match[4] + " "; + } + + return match; + }, + PSEUDO: function(match, curLoop, inplace, result, not){ + if ( match[1] === "not" ) { + if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) { + match[3] = Sizzle(match[3], null, null, curLoop); + } else { + var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); + if ( !inplace ) { + result.push.apply( result, ret ); + } + return false; + } + } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { + return true; + } + + return match; + }, + POS: function(match){ + match.unshift( true ); + return match; + } + }, + filters: { + enabled: function(elem){ + return elem.disabled === false && elem.type !== "hidden"; + }, + disabled: function(elem){ + return elem.disabled === true; + }, + checked: function(elem){ + return elem.checked === true; + }, + selected: function(elem){ + elem.parentNode.selectedIndex; + return elem.selected === true; + }, + parent: function(elem){ + return !!elem.firstChild; + }, + empty: function(elem){ + return !elem.firstChild; + }, + has: function(elem, i, match){ + return !!Sizzle( match[3], elem ).length; + }, + header: function(elem){ + return /h\d/i.test( elem.nodeName ); + }, + text: function(elem){ + return "text" === elem.type; + }, + radio: function(elem){ + return "radio" === elem.type; + }, + checkbox: function(elem){ + return "checkbox" === elem.type; + }, + file: function(elem){ + return "file" === elem.type; + }, + password: function(elem){ + return "password" === elem.type; + }, + submit: function(elem){ + return "submit" === elem.type; + }, + image: function(elem){ + return "image" === elem.type; + }, + reset: function(elem){ + return "reset" === elem.type; + }, + button: function(elem){ + return "button" === elem.type || elem.nodeName.toUpperCase() === "BUTTON"; + }, + input: function(elem){ + return /input|select|textarea|button/i.test(elem.nodeName); + } + }, + setFilters: { + first: function(elem, i){ + return i === 0; + }, + last: function(elem, i, match, array){ + return i === array.length - 1; + }, + even: function(elem, i){ + return i % 2 === 0; + }, + odd: function(elem, i){ + return i % 2 === 1; + }, + lt: function(elem, i, match){ + return i < match[3] - 0; + }, + gt: function(elem, i, match){ + return i > match[3] - 0; + }, + nth: function(elem, i, match){ + return match[3] - 0 == i; + }, + eq: function(elem, i, match){ + return match[3] - 0 == i; + } + }, + filter: { + PSEUDO: function(elem, match, i, array){ + var name = match[1], filter = Expr.filters[ name ]; + + if ( filter ) { + return filter( elem, i, match, array ); + } else if ( name === "contains" ) { + return (elem.textContent || elem.innerText || "").indexOf(match[3]) >= 0; + } else if ( name === "not" ) { + var not = match[3]; + + for ( var i = 0, l = not.length; i < l; i++ ) { + if ( not[i] === elem ) { + return false; + } + } + + return true; + } + }, + CHILD: function(elem, match){ + var type = match[1], node = elem; + switch (type) { + case 'only': + case 'first': + while ( (node = node.previousSibling) ) { + if ( node.nodeType === 1 ) return false; + } + if ( type == 'first') return true; + node = elem; + case 'last': + while ( (node = node.nextSibling) ) { + if ( node.nodeType === 1 ) return false; + } + return true; + case 'nth': + var first = match[2], last = match[3]; + + if ( first == 1 && last == 0 ) { + return true; + } + + var doneName = match[0], + parent = elem.parentNode; + + if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) { + var count = 0; + for ( node = parent.firstChild; node; node = node.nextSibling ) { + if ( node.nodeType === 1 ) { + node.nodeIndex = ++count; + } + } + parent.sizcache = doneName; + } + + var diff = elem.nodeIndex - last; + if ( first == 0 ) { + return diff == 0; + } else { + return ( diff % first == 0 && diff / first >= 0 ); + } + } + }, + ID: function(elem, match){ + return elem.nodeType === 1 && elem.getAttribute("id") === match; + }, + TAG: function(elem, match){ + return (match === "*" && elem.nodeType === 1) || elem.nodeName === match; + }, + CLASS: function(elem, match){ + return (" " + (elem.className || elem.getAttribute("class")) + " ") + .indexOf( match ) > -1; + }, + ATTR: function(elem, match){ + var name = match[1], + result = Expr.attrHandle[ name ] ? + Expr.attrHandle[ name ]( elem ) : + elem[ name ] != null ? + elem[ name ] : + elem.getAttribute( name ), + value = result + "", + type = match[2], + check = match[4]; + + return result == null ? + type === "!=" : + type === "=" ? + value === check : + type === "*=" ? + value.indexOf(check) >= 0 : + type === "~=" ? + (" " + value + " ").indexOf(check) >= 0 : + !check ? + value && result !== false : + type === "!=" ? + value != check : + type === "^=" ? + value.indexOf(check) === 0 : + type === "$=" ? + value.substr(value.length - check.length) === check : + type === "|=" ? + value === check || value.substr(0, check.length + 1) === check + "-" : + false; + }, + POS: function(elem, match, i, array){ + var name = match[2], filter = Expr.setFilters[ name ]; + + if ( filter ) { + return filter( elem, i, match, array ); + } + } + } +}; + +var origPOS = Expr.match.POS; + +for ( var type in Expr.match ) { + Expr.match[ type ] = new RegExp( Expr.match[ type ].source + /(?![^\[]*\])(?![^\(]*\))/.source ); + Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source ); } -function $$() { - return Selector.findChildElements(document, $A(arguments)); +var makeArray = function(array, results) { + array = Array.prototype.slice.call( array, 0 ); + + if ( results ) { + results.push.apply( results, array ); + return results; + } + + return array; +}; + +try { + Array.prototype.slice.call( document.documentElement.childNodes, 0 ); + +} catch(e){ + makeArray = function(array, results) { + var ret = results || []; + + if ( toString.call(array) === "[object Array]" ) { + Array.prototype.push.apply( ret, array ); + } else { + if ( typeof array.length === "number" ) { + for ( var i = 0, l = array.length; i < l; i++ ) { + ret.push( array[i] ); + } + } else { + for ( var i = 0; array[i]; i++ ) { + ret.push( array[i] ); + } + } + } + + return ret; + }; } + +var sortOrder; + +if ( document.documentElement.compareDocumentPosition ) { + sortOrder = function( a, b ) { + if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) { + if ( a == b ) { + hasDuplicate = true; + } + return 0; + } + + var ret = a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1; + if ( ret === 0 ) { + hasDuplicate = true; + } + return ret; + }; +} else if ( "sourceIndex" in document.documentElement ) { + sortOrder = function( a, b ) { + if ( !a.sourceIndex || !b.sourceIndex ) { + if ( a == b ) { + hasDuplicate = true; + } + return 0; + } + + var ret = a.sourceIndex - b.sourceIndex; + if ( ret === 0 ) { + hasDuplicate = true; + } + return ret; + }; +} else if ( document.createRange ) { + sortOrder = function( a, b ) { + if ( !a.ownerDocument || !b.ownerDocument ) { + if ( a == b ) { + hasDuplicate = true; + } + return 0; + } + + var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange(); + aRange.setStart(a, 0); + aRange.setEnd(a, 0); + bRange.setStart(b, 0); + bRange.setEnd(b, 0); + var ret = aRange.compareBoundaryPoints(Range.START_TO_END, bRange); + if ( ret === 0 ) { + hasDuplicate = true; + } + return ret; + }; +} + +(function(){ + var form = document.createElement("div"), + id = "script" + (new Date).getTime(); + form.innerHTML = ""; + + var root = document.documentElement; + root.insertBefore( form, root.firstChild ); + + if ( !!document.getElementById( id ) ) { + Expr.find.ID = function(match, context, isXML){ + if ( typeof context.getElementById !== "undefined" && !isXML ) { + var m = context.getElementById(match[1]); + return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : []; + } + }; + + Expr.filter.ID = function(elem, match){ + var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); + return elem.nodeType === 1 && node && node.nodeValue === match; + }; + } + + root.removeChild( form ); + root = form = null; // release memory in IE +})(); + +(function(){ + + var div = document.createElement("div"); + div.appendChild( document.createComment("") ); + + if ( div.getElementsByTagName("*").length > 0 ) { + Expr.find.TAG = function(match, context){ + var results = context.getElementsByTagName(match[1]); + + if ( match[1] === "*" ) { + var tmp = []; + + for ( var i = 0; results[i]; i++ ) { + if ( results[i].nodeType === 1 ) { + tmp.push( results[i] ); + } + } + + results = tmp; + } + + return results; + }; + } + + div.innerHTML = ""; + if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && + div.firstChild.getAttribute("href") !== "#" ) { + Expr.attrHandle.href = function(elem){ + return elem.getAttribute("href", 2); + }; + } + + div = null; // release memory in IE +})(); + +if ( document.querySelectorAll ) (function(){ + var oldSizzle = Sizzle, div = document.createElement("div"); + div.innerHTML = "

    "; + + if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { + return; + } + + Sizzle = function(query, context, extra, seed){ + context = context || document; + + if ( !seed && context.nodeType === 9 && !isXML(context) ) { + try { + return makeArray( context.querySelectorAll(query), extra ); + } catch(e){} + } + + return oldSizzle(query, context, extra, seed); + }; + + for ( var prop in oldSizzle ) { + Sizzle[ prop ] = oldSizzle[ prop ]; + } + + div = null; // release memory in IE +})(); + +if ( document.getElementsByClassName && document.documentElement.getElementsByClassName ) (function(){ + var div = document.createElement("div"); + div.innerHTML = "
    "; + + if ( div.getElementsByClassName("e").length === 0 ) + return; + + div.lastChild.className = "e"; + + if ( div.getElementsByClassName("e").length === 1 ) + return; + + Expr.order.splice(1, 0, "CLASS"); + Expr.find.CLASS = function(match, context, isXML) { + if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { + return context.getElementsByClassName(match[1]); + } + }; + + div = null; // release memory in IE +})(); + +function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { + var sibDir = dir == "previousSibling" && !isXML; + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + if ( elem ) { + if ( sibDir && elem.nodeType === 1 ){ + elem.sizcache = doneName; + elem.sizset = i; + } + elem = elem[dir]; + var match = false; + + while ( elem ) { + if ( elem.sizcache === doneName ) { + match = checkSet[elem.sizset]; + break; + } + + if ( elem.nodeType === 1 && !isXML ){ + elem.sizcache = doneName; + elem.sizset = i; + } + + if ( elem.nodeName === cur ) { + match = elem; + break; + } + + elem = elem[dir]; + } + + checkSet[i] = match; + } + } +} + +function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { + var sibDir = dir == "previousSibling" && !isXML; + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + if ( elem ) { + if ( sibDir && elem.nodeType === 1 ) { + elem.sizcache = doneName; + elem.sizset = i; + } + elem = elem[dir]; + var match = false; + + while ( elem ) { + if ( elem.sizcache === doneName ) { + match = checkSet[elem.sizset]; + break; + } + + if ( elem.nodeType === 1 ) { + if ( !isXML ) { + elem.sizcache = doneName; + elem.sizset = i; + } + if ( typeof cur !== "string" ) { + if ( elem === cur ) { + match = true; + break; + } + + } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { + match = elem; + break; + } + } + + elem = elem[dir]; + } + + checkSet[i] = match; + } + } +} + +var contains = document.compareDocumentPosition ? function(a, b){ + return a.compareDocumentPosition(b) & 16; +} : function(a, b){ + return a !== b && (a.contains ? a.contains(b) : true); +}; + +var isXML = function(elem){ + return elem.nodeType === 9 && elem.documentElement.nodeName !== "HTML" || + !!elem.ownerDocument && elem.ownerDocument.documentElement.nodeName !== "HTML"; +}; + +var posProcess = function(selector, context){ + var tmpSet = [], later = "", match, + root = context.nodeType ? [context] : context; + + while ( (match = Expr.match.PSEUDO.exec( selector )) ) { + later += match[0]; + selector = selector.replace( Expr.match.PSEUDO, "" ); + } + + selector = Expr.relative[selector] ? selector + "*" : selector; + + for ( var i = 0, l = root.length; i < l; i++ ) { + Sizzle( selector, root[i], tmpSet ); + } + + return Sizzle.filter( later, tmpSet ); +}; + + +window.Sizzle = Sizzle; + +})(); + +Prototype._original_property = window.Sizzle; + +;(function(engine) { + var extendElements = Prototype.Selector.extendElements; + + function select(selector, scope) { + return extendElements(engine(selector, scope || document)); + } + + function match(element, selector) { + return engine.matches(selector, [element]).length == 1; + } + + Prototype.Selector.engine = engine; + Prototype.Selector.select = select; + Prototype.Selector.match = match; +})(Sizzle); + +window.Sizzle = Prototype._original_property; +delete Prototype._original_property; + var Form = { reset: function(form) { - $(form).reset(); + form = $(form); + form.reset(); return form; }, serializeElements: function(elements, options) { if (typeof options != 'object') options = { hash: !!options }; else if (Object.isUndefined(options.hash)) options.hash = true; - var key, value, submitted = false, submit = options.submit; + var key, value, submitted = false, submit = options.submit, accumulator, initial; - var data = elements.inject({ }, function(result, element) { + if (options.hash) { + initial = {}; + accumulator = function(result, key, value) { + if (key in result) { + if (!Object.isArray(result[key])) result[key] = [result[key]]; + result[key].push(value); + } else result[key] = value; + return result; + }; + } else { + initial = ''; + accumulator = function(result, key, value) { + return result + (result ? '&' : '') + encodeURIComponent(key) + '=' + encodeURIComponent(value); + } + } + + return elements.inject(initial, function(result, element) { if (!element.disabled && element.name) { key = element.name; value = $(element).getValue(); if (value != null && element.type != 'file' && (element.type != 'submit' || (!submitted && submit !== false && (!submit || key == submit) && (submitted = true)))) { - if (key in result) { - // a key is already present; construct an array of values - if (!Object.isArray(result[key])) result[key] = [result[key]]; - result[key].push(value); - } - else result[key] = value; + if (Object.isArray(value)){ + value.each(function(value) { + result = accumulator(result, key, value); + }); + } else { + result = accumulator(result, key, value); + } } } return result; }); - - return options.hash ? data : Object.toQueryString(data); } }; @@ -3480,13 +5012,18 @@ Form.Methods = { }, getElements: function(form) { - return $A($(form).getElementsByTagName('*')).inject([], - function(elements, child) { - if (Form.Element.Serializers[child.tagName.toLowerCase()]) - elements.push(Element.extend(child)); - return elements; - } - ); + var elements = $(form).getElementsByTagName('*'), + element, + arr = [ ], + serializers = Form.Element.Serializers; + for (var i = 0; element = elements[i]; i++) { + arr.push(element); + } + return arr.inject([], function(elements, child) { + if (serializers[child.tagName.toLowerCase()]) + elements.push(Element.extend(child)); + return elements; + }) }, getInputs: function(form, typeName, name) { @@ -3526,13 +5063,14 @@ Form.Methods = { }).sortBy(function(element) { return element.tabIndex }).first(); return firstByIndex ? firstByIndex : elements.find(function(element) { - return ['input', 'select', 'textarea'].include(element.tagName.toLowerCase()); + return /^(?:input|select|textarea)$/i.test(element.tagName); }); }, focusFirstElement: function(form) { form = $(form); - form.findFirstElement().activate(); + var element = form.findFirstElement(); + if (element) element.activate(); return form; }, @@ -3557,6 +5095,7 @@ Form.Methods = { /*--------------------------------------------------------------------------*/ + Form.Element = { focus: function(element) { $(element).focus(); @@ -3570,6 +5109,7 @@ Form.Element = { }; Form.Element.Methods = { + serialize: function(element) { element = $(element); if (!element.disabled && element.name) { @@ -3610,7 +5150,7 @@ Form.Element.Methods = { try { element.focus(); if (element.select && (element.tagName.toLowerCase() != 'input' || - !['button', 'reset', 'submit'].include(element.type))) + !(/^(?:button|reset|submit)$/i.test(element.type)))) element.select(); } catch (e) { } return element; @@ -3632,75 +5172,86 @@ Form.Element.Methods = { /*--------------------------------------------------------------------------*/ var Field = Form.Element; + var $F = Form.Element.Methods.getValue; /*--------------------------------------------------------------------------*/ -Form.Element.Serializers = { - input: function(element, value) { +Form.Element.Serializers = (function() { + function input(element, value) { switch (element.type.toLowerCase()) { case 'checkbox': case 'radio': - return Form.Element.Serializers.inputSelector(element, value); + return inputSelector(element, value); default: - return Form.Element.Serializers.textarea(element, value); + return valueSelector(element, value); } - }, + } - inputSelector: function(element, value) { - if (Object.isUndefined(value)) return element.checked ? element.value : null; + function inputSelector(element, value) { + if (Object.isUndefined(value)) + return element.checked ? element.value : null; else element.checked = !!value; - }, + } - textarea: function(element, value) { + function valueSelector(element, value) { if (Object.isUndefined(value)) return element.value; else element.value = value; - }, + } - select: function(element, value) { + function select(element, value) { if (Object.isUndefined(value)) - return this[element.type == 'select-one' ? - 'selectOne' : 'selectMany'](element); - else { - var opt, currentValue, single = !Object.isArray(value); - for (var i = 0, length = element.length; i < length; i++) { - opt = element.options[i]; - currentValue = this.optionValue(opt); - if (single) { - if (currentValue == value) { - opt.selected = true; - return; - } + return (element.type === 'select-one' ? selectOne : selectMany)(element); + + var opt, currentValue, single = !Object.isArray(value); + for (var i = 0, length = element.length; i < length; i++) { + opt = element.options[i]; + currentValue = this.optionValue(opt); + if (single) { + if (currentValue == value) { + opt.selected = true; + return; } - else opt.selected = value.include(currentValue); } + else opt.selected = value.include(currentValue); } - }, + } - selectOne: function(element) { + function selectOne(element) { var index = element.selectedIndex; - return index >= 0 ? this.optionValue(element.options[index]) : null; - }, + return index >= 0 ? optionValue(element.options[index]) : null; + } - selectMany: function(element) { + function selectMany(element) { var values, length = element.length; if (!length) return null; for (var i = 0, values = []; i < length; i++) { var opt = element.options[i]; - if (opt.selected) values.push(this.optionValue(opt)); + if (opt.selected) values.push(optionValue(opt)); } return values; - }, - - optionValue: function(opt) { - // extend element because hasAttribute may not be native - return Element.extend(opt).hasAttribute('value') ? opt.value : opt.text; } -}; + + function optionValue(opt) { + return Element.hasAttribute(opt, 'value') ? opt.value : opt.text; + } + + return { + input: input, + inputSelector: inputSelector, + textarea: valueSelector, + select: select, + selectOne: selectOne, + selectMany: selectMany, + optionValue: optionValue, + button: valueSelector + }; +})(); /*--------------------------------------------------------------------------*/ + Abstract.TimedObserver = Class.create(PeriodicalExecuter, { initialize: function($super, element, frequency, callback) { $super(callback, frequency); @@ -3782,354 +5333,527 @@ Form.EventObserver = Class.create(Abstract.EventObserver, { return Form.serialize(this.element); } }); -if (!window.Event) var Event = { }; +(function() { -Object.extend(Event, { - KEY_BACKSPACE: 8, - KEY_TAB: 9, - KEY_RETURN: 13, - KEY_ESC: 27, - KEY_LEFT: 37, - KEY_UP: 38, - KEY_RIGHT: 39, - KEY_DOWN: 40, - KEY_DELETE: 46, - KEY_HOME: 36, - KEY_END: 35, - KEY_PAGEUP: 33, - KEY_PAGEDOWN: 34, - KEY_INSERT: 45, + var Event = { + KEY_BACKSPACE: 8, + KEY_TAB: 9, + KEY_RETURN: 13, + KEY_ESC: 27, + KEY_LEFT: 37, + KEY_UP: 38, + KEY_RIGHT: 39, + KEY_DOWN: 40, + KEY_DELETE: 46, + KEY_HOME: 36, + KEY_END: 35, + KEY_PAGEUP: 33, + KEY_PAGEDOWN: 34, + KEY_INSERT: 45, - cache: { }, - - relatedTarget: function(event) { - var element; - switch(event.type) { - case 'mouseover': element = event.fromElement; break; - case 'mouseout': element = event.toElement; break; - default: return null; - } - return Element.extend(element); - } -}); - -Event.Methods = (function() { - var isButton; - - if (Prototype.Browser.IE) { - var buttonMap = { 0: 1, 1: 4, 2: 2 }; - isButton = function(event, code) { - return event.button == buttonMap[code]; - }; - - } else if (Prototype.Browser.WebKit) { - isButton = function(event, code) { - switch (code) { - case 0: return event.which == 1 && !event.metaKey; - case 1: return event.which == 1 && event.metaKey; - default: return false; - } - }; - - } else { - isButton = function(event, code) { - return event.which ? (event.which === code + 1) : (event.button === code); - }; - } - - return { - isLeftClick: function(event) { return isButton(event, 0) }, - isMiddleClick: function(event) { return isButton(event, 1) }, - isRightClick: function(event) { return isButton(event, 2) }, - - element: function(event) { - event = Event.extend(event); - - var node = event.target, - type = event.type, - currentTarget = event.currentTarget; - - if (currentTarget && currentTarget.tagName) { - // Firefox screws up the "click" event when moving between radio buttons - // via arrow keys. It also screws up the "load" and "error" events on images, - // reporting the document as the target instead of the original image. - if (type === 'load' || type === 'error' || - (type === 'click' && currentTarget.tagName.toLowerCase() === 'input' - && currentTarget.type === 'radio')) - node = currentTarget; - } - if (node.nodeType == Node.TEXT_NODE) node = node.parentNode; - return Element.extend(node); - }, - - findElement: function(event, expression) { - var element = Event.element(event); - if (!expression) return element; - var elements = [element].concat(element.ancestors()); - return Selector.findElement(elements, expression, 0); - }, - - pointer: function(event) { - var docElement = document.documentElement, - body = document.body || { scrollLeft: 0, scrollTop: 0 }; - return { - x: event.pageX || (event.clientX + - (docElement.scrollLeft || body.scrollLeft) - - (docElement.clientLeft || 0)), - y: event.pageY || (event.clientY + - (docElement.scrollTop || body.scrollTop) - - (docElement.clientTop || 0)) - }; - }, - - pointerX: function(event) { return Event.pointer(event).x }, - pointerY: function(event) { return Event.pointer(event).y }, - - stop: function(event) { - Event.extend(event); - event.preventDefault(); - event.stopPropagation(); - event.stopped = true; - } + cache: {} + }; + + var docEl = document.documentElement; + var MOUSEENTER_MOUSELEAVE_EVENTS_SUPPORTED = 'onmouseenter' in docEl + && 'onmouseleave' in docEl; + + + + var isIELegacyEvent = function(event) { return false; }; + + if (window.attachEvent) { + if (window.addEventListener) { + isIELegacyEvent = function(event) { + return !(event instanceof window.Event); + }; + } else { + isIELegacyEvent = function(event) { return true; }; + } + } + + var _isButton; + + function _isButtonForDOMEvents(event, code) { + return event.which ? (event.which === code + 1) : (event.button === code); + } + + var legacyButtonMap = { 0: 1, 1: 4, 2: 2 }; + function _isButtonForLegacyEvents(event, code) { + return event.button === legacyButtonMap[code]; + } + + function _isButtonForWebKit(event, code) { + switch (code) { + case 0: return event.which == 1 && !event.metaKey; + case 1: return event.which == 2 || (event.which == 1 && event.metaKey); + case 2: return event.which == 3; + default: return false; + } + } + + if (window.attachEvent) { + if (!window.addEventListener) { + _isButton = _isButtonForLegacyEvents; + } else { + _isButton = function(event, code) { + return isIELegacyEvent(event) ? _isButtonForLegacyEvents(event, code) : + _isButtonForDOMEvents(event, code); + } + } + } else if (Prototype.Browser.WebKit) { + _isButton = _isButtonForWebKit; + } else { + _isButton = _isButtonForDOMEvents; + } + + function isLeftClick(event) { return _isButton(event, 0) } + + function isMiddleClick(event) { return _isButton(event, 1) } + + function isRightClick(event) { return _isButton(event, 2) } + + function element(event) { + event = Event.extend(event); + + var node = event.target, type = event.type, + currentTarget = event.currentTarget; + + if (currentTarget && currentTarget.tagName) { + if (type === 'load' || type === 'error' || + (type === 'click' && currentTarget.tagName.toLowerCase() === 'input' + && currentTarget.type === 'radio')) + node = currentTarget; + } + + if (node.nodeType == Node.TEXT_NODE) + node = node.parentNode; + + return Element.extend(node); + } + + function findElement(event, expression) { + var element = Event.element(event); + + if (!expression) return element; + while (element) { + if (Object.isElement(element) && Prototype.Selector.match(element, expression)) { + return Element.extend(element); + } + element = element.parentNode; + } + } + + function pointer(event) { + return { x: pointerX(event), y: pointerY(event) }; + } + + function pointerX(event) { + var docElement = document.documentElement, + body = document.body || { scrollLeft: 0 }; + + return event.pageX || (event.clientX + + (docElement.scrollLeft || body.scrollLeft) - + (docElement.clientLeft || 0)); + } + + function pointerY(event) { + var docElement = document.documentElement, + body = document.body || { scrollTop: 0 }; + + return event.pageY || (event.clientY + + (docElement.scrollTop || body.scrollTop) - + (docElement.clientTop || 0)); + } + + + function stop(event) { + Event.extend(event); + event.preventDefault(); + event.stopPropagation(); + + event.stopped = true; + } + + + Event.Methods = { + isLeftClick: isLeftClick, + isMiddleClick: isMiddleClick, + isRightClick: isRightClick, + + element: element, + findElement: findElement, + + pointer: pointer, + pointerX: pointerX, + pointerY: pointerY, + + stop: stop }; -})(); -Event.extend = (function() { var methods = Object.keys(Event.Methods).inject({ }, function(m, name) { m[name] = Event.Methods[name].methodize(); return m; }); - if (Prototype.Browser.IE) { - Object.extend(methods, { + if (window.attachEvent) { + function _relatedTarget(event) { + var element; + switch (event.type) { + case 'mouseover': + case 'mouseenter': + element = event.fromElement; + break; + case 'mouseout': + case 'mouseleave': + element = event.toElement; + break; + default: + return null; + } + return Element.extend(element); + } + + var additionalMethods = { stopPropagation: function() { this.cancelBubble = true }, preventDefault: function() { this.returnValue = false }, - inspect: function() { return "[object Event]" } - }); + inspect: function() { return '[object Event]' } + }; - return function(event) { + Event.extend = function(event, element) { if (!event) return false; - if (event._extendedByPrototype) return event; + if (!isIELegacyEvent(event)) return event; + + if (event._extendedByPrototype) return event; event._extendedByPrototype = Prototype.emptyFunction; + var pointer = Event.pointer(event); + Object.extend(event, { - target: event.srcElement, - relatedTarget: Event.relatedTarget(event), + target: event.srcElement || element, + relatedTarget: _relatedTarget(event), pageX: pointer.x, pageY: pointer.y }); - return Object.extend(event, methods); + + Object.extend(event, methods); + Object.extend(event, additionalMethods); + + return event; }; - } else { - Event.prototype = Event.prototype || document.createEvent("HTMLEvents")['__proto__']; + Event.extend = Prototype.K; + } + + if (window.addEventListener) { + Event.prototype = window.Event.prototype || document.createEvent('HTMLEvents').__proto__; Object.extend(Event.prototype, methods); - return Prototype.K; - } -})(); - -Object.extend(Event, (function() { - var cache = Event.cache; - - function getEventID(element) { - if (element._prototypeEventID) return element._prototypeEventID[0]; - arguments.callee.id = arguments.callee.id || 1; - return element._prototypeEventID = [++arguments.callee.id]; } - function getDOMEventName(eventName) { - if (eventName && eventName.include(':')) return "dataavailable"; - return eventName; - } + function _createResponder(element, eventName, handler) { + var registry = Element.retrieve(element, 'prototype_event_registry'); - function getCacheForID(id) { - return cache[id] = cache[id] || { }; - } + if (Object.isUndefined(registry)) { + CACHE.push(element); + registry = Element.retrieve(element, 'prototype_event_registry', $H()); + } - function getWrappersForEventName(id, eventName) { - var c = getCacheForID(id); - return c[eventName] = c[eventName] || []; - } + var respondersForEvent = registry.get(eventName); + if (Object.isUndefined(respondersForEvent)) { + respondersForEvent = []; + registry.set(eventName, respondersForEvent); + } - function createWrapper(element, eventName, handler) { - var id = getEventID(element); - var c = getWrappersForEventName(id, eventName); - if (c.pluck("handler").include(handler)) return false; + if (respondersForEvent.pluck('handler').include(handler)) return false; - var wrapper = function(event) { - if (!Event || !Event.extend || - (event.eventName && event.eventName != eventName)) + var responder; + if (eventName.include(":")) { + responder = function(event) { + if (Object.isUndefined(event.eventName)) return false; - Event.extend(event); - handler.call(element, event); - }; + if (event.eventName !== eventName) + return false; - wrapper.handler = handler; - c.push(wrapper); - return wrapper; - } + Event.extend(event, element); + handler.call(element, event); + }; + } else { + if (!MOUSEENTER_MOUSELEAVE_EVENTS_SUPPORTED && + (eventName === "mouseenter" || eventName === "mouseleave")) { + if (eventName === "mouseenter" || eventName === "mouseleave") { + responder = function(event) { + Event.extend(event, element); - function findWrapper(id, eventName, handler) { - var c = getWrappersForEventName(id, eventName); - return c.find(function(wrapper) { return wrapper.handler == handler }); - } + var parent = event.relatedTarget; + while (parent && parent !== element) { + try { parent = parent.parentNode; } + catch(e) { parent = element; } + } - function destroyWrapper(id, eventName, handler) { - var c = getCacheForID(id); - if (!c[eventName]) return false; - c[eventName] = c[eventName].without(findWrapper(id, eventName, handler)); - } + if (parent === element) return; - function destroyCache() { - for (var id in cache) - for (var eventName in cache[id]) - cache[id][eventName] = null; - } - - - // Internet Explorer needs to remove event handlers on page unload - // in order to avoid memory leaks. - if (window.attachEvent) { - window.attachEvent("onunload", destroyCache); - } - - // Safari has a dummy event handler on page unload so that it won't - // use its bfcache. Safari <= 3.1 has an issue with restoring the "document" - // object when page is returned to via the back button using its bfcache. - if (Prototype.Browser.WebKit) { - window.addEventListener('unload', Prototype.emptyFunction, false); - } - - return { - observe: function(element, eventName, handler) { - element = $(element); - var name = getDOMEventName(eventName); - - var wrapper = createWrapper(element, eventName, handler); - if (!wrapper) return element; - - if (element.addEventListener) { - element.addEventListener(name, wrapper, false); + handler.call(element, event); + }; + } } else { - element.attachEvent("on" + name, wrapper); + responder = function(event) { + Event.extend(event, element); + handler.call(element, event); + }; } - - return element; - }, - - stopObserving: function(element, eventName, handler) { - element = $(element); - var id = getEventID(element), name = getDOMEventName(eventName); - - if (!handler && eventName) { - getWrappersForEventName(id, eventName).each(function(wrapper) { - element.stopObserving(eventName, wrapper.handler); - }); - return element; - - } else if (!eventName) { - Object.keys(getCacheForID(id)).each(function(eventName) { - element.stopObserving(eventName); - }); - return element; - } - - var wrapper = findWrapper(id, eventName, handler); - if (!wrapper) return element; - - if (element.removeEventListener) { - element.removeEventListener(name, wrapper, false); - } else { - element.detachEvent("on" + name, wrapper); - } - - destroyWrapper(id, eventName, handler); - - return element; - }, - - fire: function(element, eventName, memo) { - element = $(element); - if (element == document && document.createEvent && !element.dispatchEvent) - element = document.documentElement; - - var event; - if (document.createEvent) { - event = document.createEvent("HTMLEvents"); - event.initEvent("dataavailable", true, true); - } else { - event = document.createEventObject(); - event.eventType = "ondataavailable"; - } - - event.eventName = eventName; - event.memo = memo || { }; - - if (document.createEvent) { - element.dispatchEvent(event); - } else { - element.fireEvent(event.eventType, event); - } - - return Event.extend(event); } - }; -})()); -Object.extend(Event, Event.Methods); + responder.handler = handler; + respondersForEvent.push(responder); + return responder; + } -Element.addMethods({ - fire: Event.fire, - observe: Event.observe, - stopObserving: Event.stopObserving -}); + function _destroyCache() { + for (var i = 0, length = CACHE.length; i < length; i++) { + Event.stopObserving(CACHE[i]); + CACHE[i] = null; + } + } -Object.extend(document, { - fire: Element.Methods.fire.methodize(), - observe: Element.Methods.observe.methodize(), - stopObserving: Element.Methods.stopObserving.methodize(), - loaded: false -}); + var CACHE = []; + + if (Prototype.Browser.IE) + window.attachEvent('onunload', _destroyCache); + + if (Prototype.Browser.WebKit) + window.addEventListener('unload', Prototype.emptyFunction, false); + + + var _getDOMEventName = Prototype.K, + translations = { mouseenter: "mouseover", mouseleave: "mouseout" }; + + if (!MOUSEENTER_MOUSELEAVE_EVENTS_SUPPORTED) { + _getDOMEventName = function(eventName) { + return (translations[eventName] || eventName); + }; + } + + function observe(element, eventName, handler) { + element = $(element); + + var responder = _createResponder(element, eventName, handler); + + if (!responder) return element; + + if (eventName.include(':')) { + if (element.addEventListener) + element.addEventListener("dataavailable", responder, false); + else { + element.attachEvent("ondataavailable", responder); + element.attachEvent("onlosecapture", responder); + } + } else { + var actualEventName = _getDOMEventName(eventName); + + if (element.addEventListener) + element.addEventListener(actualEventName, responder, false); + else + element.attachEvent("on" + actualEventName, responder); + } + + return element; + } + + function stopObserving(element, eventName, handler) { + element = $(element); + + var registry = Element.retrieve(element, 'prototype_event_registry'); + if (!registry) return element; + + if (!eventName) { + registry.each( function(pair) { + var eventName = pair.key; + stopObserving(element, eventName); + }); + return element; + } + + var responders = registry.get(eventName); + if (!responders) return element; + + if (!handler) { + responders.each(function(r) { + stopObserving(element, eventName, r.handler); + }); + return element; + } + + var i = responders.length, responder; + while (i--) { + if (responders[i].handler === handler) { + responder = responders[i]; + break; + } + } + if (!responder) return element; + + if (eventName.include(':')) { + if (element.removeEventListener) + element.removeEventListener("dataavailable", responder, false); + else { + element.detachEvent("ondataavailable", responder); + element.detachEvent("onlosecapture", responder); + } + } else { + var actualEventName = _getDOMEventName(eventName); + if (element.removeEventListener) + element.removeEventListener(actualEventName, responder, false); + else + element.detachEvent('on' + actualEventName, responder); + } + + registry.set(eventName, responders.without(responder)); + + return element; + } + + function fire(element, eventName, memo, bubble) { + element = $(element); + + if (Object.isUndefined(bubble)) + bubble = true; + + if (element == document && document.createEvent && !element.dispatchEvent) + element = document.documentElement; + + var event; + if (document.createEvent) { + event = document.createEvent('HTMLEvents'); + event.initEvent('dataavailable', bubble, true); + } else { + event = document.createEventObject(); + event.eventType = bubble ? 'ondataavailable' : 'onlosecapture'; + } + + event.eventName = eventName; + event.memo = memo || { }; + + if (document.createEvent) + element.dispatchEvent(event); + else + element.fireEvent(event.eventType, event); + + return Event.extend(event); + } + + Event.Handler = Class.create({ + initialize: function(element, eventName, selector, callback) { + this.element = $(element); + this.eventName = eventName; + this.selector = selector; + this.callback = callback; + this.handler = this.handleEvent.bind(this); + }, + + start: function() { + Event.observe(this.element, this.eventName, this.handler); + return this; + }, + + stop: function() { + Event.stopObserving(this.element, this.eventName, this.handler); + return this; + }, + + handleEvent: function(event) { + var element = Event.findElement(event, this.selector); + if (element) this.callback.call(this.element, event, element); + } + }); + + function on(element, eventName, selector, callback) { + element = $(element); + if (Object.isFunction(selector) && Object.isUndefined(callback)) { + callback = selector, selector = null; + } + + return new Event.Handler(element, eventName, selector, callback).start(); + } + + Object.extend(Event, Event.Methods); + + Object.extend(Event, { + fire: fire, + observe: observe, + stopObserving: stopObserving, + on: on + }); + + Element.addMethods({ + fire: fire, + + observe: observe, + + stopObserving: stopObserving, + + on: on + }); + + Object.extend(document, { + fire: fire.methodize(), + + observe: observe.methodize(), + + stopObserving: stopObserving.methodize(), + + on: on.methodize(), + + loaded: false + }); + + if (window.Event) Object.extend(window.Event, Event); + else window.Event = Event; +})(); (function() { /* Support for the DOMContentLoaded event is based on work by Dan Webb, - Matthias Miller, Dean Edwards and John Resig. */ + Matthias Miller, Dean Edwards, John Resig, and Diego Perini. */ var timer; function fireContentLoadedEvent() { if (document.loaded) return; - if (timer) window.clearInterval(timer); - document.fire("dom:loaded"); + if (timer) window.clearTimeout(timer); document.loaded = true; + document.fire('dom:loaded'); + } + + function checkReadyState() { + if (document.readyState === 'complete') { + document.stopObserving('readystatechange', checkReadyState); + fireContentLoadedEvent(); + } + } + + function pollDoScroll() { + try { document.documentElement.doScroll('left'); } + catch(e) { + timer = pollDoScroll.defer(); + return; + } + fireContentLoadedEvent(); } if (document.addEventListener) { - if (Prototype.Browser.WebKit) { - timer = window.setInterval(function() { - if (/loaded|complete/.test(document.readyState)) - fireContentLoadedEvent(); - }, 0); - - Event.observe(window, "load", fireContentLoadedEvent); - - } else { - document.addEventListener("DOMContentLoaded", - fireContentLoadedEvent, false); - } - + document.addEventListener('DOMContentLoaded', fireContentLoadedEvent, false); } else { - document.write(" | - \?> - !xi - - HTML_INDICATOR = / ]/i - - IDENTIFIER = /[a-z_\x7f-\xFF][a-z0-9_\x7f-\xFF]*/i - VARIABLE = /\$#{IDENTIFIER}/ - - OPERATOR = / - \.(?!\d)=? | # dot that is not decimal point, string concatenation - && | \|\| | # logic - :: | -> | => | # scope, member, dictionary - \\(?!\n) | # namespace - \+\+ | -- | # increment, decrement - [,;?:()\[\]{}] | # simple delimiters - [-+*\/%&|^]=? | # ordinary math, binary logic, assignment shortcuts - [~$] | # whatever - =& | # reference assignment - [=!]=?=? | <> | # comparison and assignment - <<=? | >>=? | [<>]=? # comparison and shift - /x - - end - - def scan_tokens tokens, options - if string.respond_to?(:encoding) - unless string.encoding == Encoding::ASCII_8BIT - self.string = string.encode Encoding::ASCII_8BIT, - :invalid => :replace, :undef => :replace, :replace => '?' - end - end - - if check(RE::PHP_START) || # starts with #{RE::IDENTIFIER}/o) - tokens << [:open, :inline] - tokens << [match, :local_variable] - tokens << [scan(/->/), :operator] - tokens << [scan(/#{RE::IDENTIFIER}/o), :ident] - tokens << [:close, :inline] - next - elsif check(/->/) - match << scan(/->/) - kind = :error - end - elsif match = scan(/\{/) - if check(/\$/) - kind = :delimiter - states[-1] = [states.last, delimiter] - delimiter = nil - states.push :php - tokens << [:open, :inline] - else - kind = :string - end - elsif scan(/\$\{#{RE::IDENTIFIER}\}/o) - kind = :local_variable - elsif scan(/\$/) - kind = :content - end - - when :class_expected - if scan(/\s+/) - kind = :space - elsif match = scan(/#{RE::IDENTIFIER}/o) - kind = :class - states.pop - else - states.pop - next - end - - when :function_expected - if scan(/\s+/) - kind = :space - elsif scan(/&/) - kind = :operator - elsif match = scan(/#{RE::IDENTIFIER}/o) - kind = :function - states.pop - else - states.pop - next - end - - else - raise_inspect 'Unknown state!', tokens, states - end - - match ||= matched - if $CODERAY_DEBUG and not kind - raise_inspect 'Error token %p in line %d' % - [[match, kind], line], tokens, states - end - raise_inspect 'Empty token', tokens, states unless match - - tokens << [match, kind] - - end - - tokens - end - - end - -end -end diff --git a/vendor/gems/coderay-0.9.7/lib/coderay/scanners/plaintext.rb b/vendor/gems/coderay-0.9.7/lib/coderay/scanners/plaintext.rb deleted file mode 100644 index 6cbb1196..00000000 --- a/vendor/gems/coderay-0.9.7/lib/coderay/scanners/plaintext.rb +++ /dev/null @@ -1,21 +0,0 @@ -module CodeRay -module Scanners - - class Plaintext < Scanner - - register_for :plaintext, :plain - title 'Plain text' - - include Streamable - - KINDS_NOT_LOC = [:plain] - - def scan_tokens tokens, options - text = (scan_until(/\z/) || '') - tokens << [text, :plain] - end - - end - -end -end diff --git a/vendor/gems/coderay-0.9.7/lib/coderay/scanners/python.rb b/vendor/gems/coderay-0.9.7/lib/coderay/scanners/python.rb deleted file mode 100644 index 1daa79fc..00000000 --- a/vendor/gems/coderay-0.9.7/lib/coderay/scanners/python.rb +++ /dev/null @@ -1,285 +0,0 @@ -module CodeRay -module Scanners - - # Bases on pygments' PythonLexer, see - # http://dev.pocoo.org/projects/pygments/browser/pygments/lexers/agile.py. - class Python < Scanner - - include Streamable - - register_for :python - file_extension 'py' - - KEYWORDS = [ - 'and', 'as', 'assert', 'break', 'class', 'continue', 'def', - 'del', 'elif', 'else', 'except', 'finally', 'for', - 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'not', - 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield', - 'nonlocal', # new in Python 3 - ] - - OLD_KEYWORDS = [ - 'exec', 'print', # gone in Python 3 - ] - - PREDEFINED_METHODS_AND_TYPES = %w[ - __import__ abs all any apply basestring bin bool buffer - bytearray bytes callable chr classmethod cmp coerce compile - complex delattr dict dir divmod enumerate eval execfile exit - file filter float frozenset getattr globals hasattr hash hex id - input int intern isinstance issubclass iter len list locals - long map max min next object oct open ord pow property range - raw_input reduce reload repr reversed round set setattr slice - sorted staticmethod str sum super tuple type unichr unicode - vars xrange zip - ] - - PREDEFINED_EXCEPTIONS = %w[ - ArithmeticError AssertionError AttributeError - BaseException DeprecationWarning EOFError EnvironmentError - Exception FloatingPointError FutureWarning GeneratorExit IOError - ImportError ImportWarning IndentationError IndexError KeyError - KeyboardInterrupt LookupError MemoryError NameError - NotImplemented NotImplementedError OSError OverflowError - OverflowWarning PendingDeprecationWarning ReferenceError - RuntimeError RuntimeWarning StandardError StopIteration - SyntaxError SyntaxWarning SystemError SystemExit TabError - TypeError UnboundLocalError UnicodeDecodeError - UnicodeEncodeError UnicodeError UnicodeTranslateError - UnicodeWarning UserWarning ValueError Warning ZeroDivisionError - ] - - PREDEFINED_VARIABLES_AND_CONSTANTS = [ - 'False', 'True', 'None', # "keywords" since Python 3 - 'self', 'Ellipsis', 'NotImplemented', - ] - - IDENT_KIND = WordList.new(:ident). - add(KEYWORDS, :keyword). - add(OLD_KEYWORDS, :old_keyword). - add(PREDEFINED_METHODS_AND_TYPES, :predefined). - add(PREDEFINED_VARIABLES_AND_CONSTANTS, :pre_constant). - add(PREDEFINED_EXCEPTIONS, :exception) - - NAME = / [^\W\d] \w* /x - ESCAPE = / [abfnrtv\n\\'"] | x[a-fA-F0-9]{1,2} | [0-7]{1,3} /x - UNICODE_ESCAPE = / u[a-fA-F0-9]{4} | U[a-fA-F0-9]{8} | N\{[-\w ]+\} /x - - OPERATOR = / - \.\.\. | # ellipsis - \.(?!\d) | # dot but not decimal point - [,;:()\[\]{}] | # simple delimiters - \/\/=? | \*\*=? | # special math - [-+*\/%&|^]=? | # ordinary math and binary logic - [~`] | # binary complement and inspection - <<=? | >>=? | [<>=]=? | != # comparison and assignment - /x - - STRING_DELIMITER_REGEXP = Hash.new do |h, delimiter| - h[delimiter] = Regexp.union delimiter - end - - STRING_CONTENT_REGEXP = Hash.new do |h, delimiter| - h[delimiter] = / [^\\\n]+? (?= \\ | $ | #{Regexp.escape(delimiter)} ) /x - end - - DEF_NEW_STATE = WordList.new(:initial). - add(%w(def), :def_expected). - add(%w(import from), :include_expected). - add(%w(class), :class_expected) - - DESCRIPTOR = / - #{NAME} - (?: \. #{NAME} )* - | \* - /x - - def scan_tokens tokens, options - - state = :initial - string_delimiter = nil - string_raw = false - import_clause = class_name_follows = last_token_dot = false - unicode = string.respond_to?(:encoding) && string.encoding.name == 'UTF-8' - from_import_state = [] - - until eos? - - kind = nil - match = nil - - if state == :string - if scan(STRING_DELIMITER_REGEXP[string_delimiter]) - tokens << [matched, :delimiter] - tokens << [:close, :string] - state = :initial - next - elsif string_delimiter.size == 3 && scan(/\n/) - kind = :content - elsif scan(STRING_CONTENT_REGEXP[string_delimiter]) - kind = :content - elsif !string_raw && scan(/ \\ #{ESCAPE} /ox) - kind = :char - elsif scan(/ \\ #{UNICODE_ESCAPE} /ox) - kind = :char - elsif scan(/ \\ . /x) - kind = :content - elsif scan(/ \\ | $ /x) - tokens << [:close, :string] - kind = :error - state = :initial - else - raise_inspect "else case \" reached; %p not handled." % peek(1), tokens, state - end - - elsif match = scan(/ [ \t]+ | \\\n /x) - tokens << [match, :space] - next - - elsif match = scan(/\n/) - tokens << [match, :space] - state = :initial if state == :include_expected - next - - elsif match = scan(/ \# [^\n]* /mx) - tokens << [match, :comment] - next - - elsif state == :initial - - if scan(/#{OPERATOR}/o) - kind = :operator - - elsif match = scan(/(u?r?|b)?("""|"|'''|')/i) - tokens << [:open, :string] - string_delimiter = self[2] - string_raw = false - modifiers = self[1] - unless modifiers.empty? - string_raw = !!modifiers.index(?r) - tokens << [modifiers, :modifier] - match = string_delimiter - end - state = :string - kind = :delimiter - - # TODO: backticks - - elsif match = scan(unicode ? /#{NAME}/uo : /#{NAME}/o) - kind = IDENT_KIND[match] - # TODO: keyword arguments - kind = :ident if last_token_dot - if kind == :old_keyword - kind = check(/\(/) ? :ident : :keyword - elsif kind == :predefined && check(/ *=/) - kind = :ident - elsif kind == :keyword - state = DEF_NEW_STATE[match] - from_import_state << match.to_sym if state == :include_expected - end - - elsif scan(/@[a-zA-Z0-9_.]+[lL]?/) - kind = :decorator - - elsif scan(/0[xX][0-9A-Fa-f]+[lL]?/) - kind = :hex - - elsif scan(/0[bB][01]+[lL]?/) - kind = :bin - - elsif match = scan(/(?:\d*\.\d+|\d+\.\d*)(?:[eE][+-]?\d+)?|\d+[eE][+-]?\d+/) - kind = :float - if scan(/[jJ]/) - match << matched - kind = :imaginary - end - - elsif scan(/0[oO][0-7]+|0[0-7]+(?![89.eE])[lL]?/) - kind = :oct - - elsif match = scan(/\d+([lL])?/) - kind = :integer - if self[1] == nil && scan(/[jJ]/) - match << matched - kind = :imaginary - end - - else - getch - kind = :error - - end - - elsif state == :def_expected - state = :initial - if match = scan(unicode ? /#{NAME}/uo : /#{NAME}/o) - kind = :method - else - next - end - - elsif state == :class_expected - state = :initial - if match = scan(unicode ? /#{NAME}/uo : /#{NAME}/o) - kind = :class - else - next - end - - elsif state == :include_expected - if match = scan(unicode ? /#{DESCRIPTOR}/uo : /#{DESCRIPTOR}/o) - kind = :include - if match == 'as' - kind = :keyword - from_import_state << :as - elsif from_import_state.first == :from && match == 'import' - kind = :keyword - from_import_state << :import - elsif from_import_state.last == :as - # kind = match[0,1][unicode ? /[[:upper:]]/u : /[[:upper:]]/] ? :class : :method - kind = :ident - from_import_state.pop - elsif IDENT_KIND[match] == :keyword - unscan - match = nil - state = :initial - next - end - elsif match = scan(/,/) - from_import_state.pop if from_import_state.last == :as - kind = :operator - else - from_import_state = [] - state = :initial - next - end - - else - raise_inspect 'Unknown state', tokens, state - - end - - match ||= matched - if $CODERAY_DEBUG and not kind - raise_inspect 'Error token %p in line %d' % - [[match, kind], line], tokens, state - end - raise_inspect 'Empty token', tokens, state unless match - - last_token_dot = match == '.' - - tokens << [match, kind] - - end - - if state == :string - tokens << [:close, :string] - end - - tokens - end - - end - -end -end diff --git a/vendor/gems/coderay-0.9.7/lib/coderay/scanners/rhtml.rb b/vendor/gems/coderay-0.9.7/lib/coderay/scanners/rhtml.rb deleted file mode 100644 index 378d0786..00000000 --- a/vendor/gems/coderay-0.9.7/lib/coderay/scanners/rhtml.rb +++ /dev/null @@ -1,78 +0,0 @@ -module CodeRay -module Scanners - - load :html - load :ruby - - # RHTML Scanner - class RHTML < Scanner - - include Streamable - register_for :rhtml - title 'HTML ERB Template' - - KINDS_NOT_LOC = HTML::KINDS_NOT_LOC - - ERB_RUBY_BLOCK = / - <%(?!%)[=-]? - (?> - [^\-%]* # normal* - (?> # special - (?: %(?!>) | -(?!%>) ) - [^\-%]* # normal* - )* - ) - (?: -?%> )? - /x - - START_OF_ERB = / - <%(?!%) - /x - - private - - def setup - @ruby_scanner = CodeRay.scanner :ruby, :tokens => @tokens, :keep_tokens => true - @html_scanner = CodeRay.scanner :html, :tokens => @tokens, :keep_tokens => true, :keep_state => true - end - - def reset_instance - super - @html_scanner.reset - end - - def scan_tokens tokens, options - - until eos? - - if (match = scan_until(/(?=#{START_OF_ERB})/o) || scan_until(/\z/)) and not match.empty? - @html_scanner.tokenize match - - elsif match = scan(/#{ERB_RUBY_BLOCK}/o) - start_tag = match[/\A<%[-=#]?/] - end_tag = match[/-?%?>?\z/] - tokens << [:open, :inline] - tokens << [start_tag, :inline_delimiter] - code = match[start_tag.size .. -1 - end_tag.size] - if start_tag == '<%#' - tokens << [code, :comment] - else - @ruby_scanner.tokenize code - end - tokens << [end_tag, :inline_delimiter] unless end_tag.empty? - tokens << [:close, :inline] - - else - raise_inspect 'else-case reached!', tokens - end - - end - - tokens - - end - - end - -end -end diff --git a/vendor/gems/coderay-0.9.7/lib/coderay/scanners/ruby.rb b/vendor/gems/coderay-0.9.7/lib/coderay/scanners/ruby.rb deleted file mode 100644 index 3cadc64d..00000000 --- a/vendor/gems/coderay-0.9.7/lib/coderay/scanners/ruby.rb +++ /dev/null @@ -1,444 +0,0 @@ -# encoding: utf-8 -module CodeRay -module Scanners - - # This scanner is really complex, since Ruby _is_ a complex language! - # - # It tries to highlight 100% of all common code, - # and 90% of strange codes. - # - # It is optimized for HTML highlighting, and is not very useful for - # parsing or pretty printing. - # - # For now, I think it's better than the scanners in VIM or Syntax, or - # any highlighter I was able to find, except Caleb's RubyLexer. - # - # I hope it's also better than the rdoc/irb lexer. - class Ruby < Scanner - - include Streamable - - register_for :ruby - file_extension 'rb' - - helper :patterns - - if not defined? EncodingError - EncodingError = Class.new Exception - end - - private - def scan_tokens tokens, options - if string.respond_to?(:encoding) - unless string.encoding == Encoding::UTF_8 - self.string = string.encode Encoding::UTF_8, - :invalid => :replace, :undef => :replace, :replace => '?' - end - unicode = false - else - unicode = exist?(/[^\x00-\x7f]/) - end - - last_token_dot = false - value_expected = true - heredocs = nil - last_state = nil - state = :initial - depth = nil - inline_block_stack = [] - - - patterns = Patterns # avoid constant lookup - - until eos? - match = nil - kind = nil - - if state.instance_of? patterns::StringState -# {{{ - match = scan_until(state.pattern) || scan_until(/\z/) - tokens << [match, :content] unless match.empty? - break if eos? - - if state.heredoc and self[1] # end of heredoc - match = getch.to_s - match << scan_until(/$/) unless eos? - tokens << [match, :delimiter] - tokens << [:close, state.type] - state = state.next_state - next - end - - case match = getch - - when state.delim - if state.paren - state.paren_depth -= 1 - if state.paren_depth > 0 - tokens << [match, :nesting_delimiter] - next - end - end - tokens << [match, :delimiter] - if state.type == :regexp and not eos? - modifiers = scan(/#{patterns::REGEXP_MODIFIERS}/ox) - tokens << [modifiers, :modifier] unless modifiers.empty? - end - tokens << [:close, state.type] - value_expected = false - state = state.next_state - - when '\\' - if state.interpreted - if esc = scan(/ #{patterns::ESCAPE} /ox) - tokens << [match + esc, :char] - else - tokens << [match, :error] - end - else - case m = getch - when state.delim, '\\' - tokens << [match + m, :char] - when nil - tokens << [match, :error] - else - tokens << [match + m, :content] - end - end - - when '#' - case peek(1) - when '{' - inline_block_stack << [state, depth, heredocs] - value_expected = true - state = :initial - depth = 1 - tokens << [:open, :inline] - tokens << [match + getch, :inline_delimiter] - when '$', '@' - tokens << [match, :escape] - last_state = state # scan one token as normal code, then return here - state = :initial - else - raise_inspect 'else-case # reached; #%p not handled' % peek(1), tokens - end - - when state.paren - state.paren_depth += 1 - tokens << [match, :nesting_delimiter] - - when /#{patterns::REGEXP_SYMBOLS}/ox - tokens << [match, :function] - - else - raise_inspect 'else-case " reached; %p not handled, state = %p' % [match, state], tokens - - end - next -# }}} - else -# {{{ - if match = scan(/[ \t\f]+/) - kind = :space - match << scan(/\s*/) unless eos? || heredocs - value_expected = true if match.index(?\n) - tokens << [match, kind] - next - - elsif match = scan(/\\?\n/) - kind = :space - if match == "\n" - value_expected = true - state = :initial if state == :undef_comma_expected - end - if heredocs - unscan # heredoc scanning needs \n at start - state = heredocs.shift - tokens << [:open, state.type] - heredocs = nil if heredocs.empty? - next - else - match << scan(/\s*/) unless eos? - end - tokens << [match, kind] - next - - elsif bol? && match = scan(/\#!.*/) - tokens << [match, :doctype] - next - - elsif match = scan(/\#.*/) or - ( bol? and match = scan(/#{patterns::RUBYDOC_OR_DATA}/o) ) - kind = :comment - tokens << [match, kind] - next - - elsif state == :initial - - # IDENTS # - if match = scan(unicode ? /#{patterns::METHOD_NAME}/uo : - /#{patterns::METHOD_NAME}/o) - if last_token_dot - kind = if match[/^[A-Z]/] and not match?(/\(/) then :constant else :ident end - else - if value_expected != :expect_colon && scan(/:(?= )/) - tokens << [match, :key] - match = ':' - kind = :operator - else - kind = patterns::IDENT_KIND[match] - if kind == :ident - if match[/\A[A-Z]/] and not match[/[!?]$/] and not match?(/\(/) - kind = :constant - end - elsif kind == :reserved - state = patterns::DEF_NEW_STATE[match] - value_expected = :set if patterns::KEYWORDS_EXPECTING_VALUE[match] - end - end - end - value_expected = :set if check(/#{patterns::VALUE_FOLLOWS}/o) - - elsif last_token_dot and match = scan(/#{patterns::METHOD_NAME_OPERATOR}|\(/o) - kind = :ident - value_expected = :set if check(unicode ? /#{patterns::VALUE_FOLLOWS}/uo : - /#{patterns::VALUE_FOLLOWS}/o) - - # OPERATORS # - elsif not last_token_dot and match = scan(/ \.\.\.? | (?:\.|::)() | [,\(\)\[\]\{\}] | ==?=? /x) - if match !~ / [.\)\]\}] /x or match =~ /\.\.\.?/ - value_expected = :set - end - last_token_dot = :set if self[1] - kind = :operator - unless inline_block_stack.empty? - case match - when '{' - depth += 1 - when '}' - depth -= 1 - if depth == 0 # closing brace of inline block reached - state, depth, heredocs = inline_block_stack.pop - heredocs = nil if heredocs && heredocs.empty? - tokens << [match, :inline_delimiter] - kind = :inline - match = :close - end - end - end - - elsif match = scan(/ ['"] /mx) - tokens << [:open, :string] - kind = :delimiter - state = patterns::StringState.new :string, match == '"', match # important for streaming - - elsif match = scan(unicode ? /#{patterns::INSTANCE_VARIABLE}/uo : - /#{patterns::INSTANCE_VARIABLE}/o) - kind = :instance_variable - - elsif value_expected and match = scan(/\//) - tokens << [:open, :regexp] - kind = :delimiter - interpreted = true - state = patterns::StringState.new :regexp, interpreted, match - - # elsif match = scan(/[-+]?#{patterns::NUMERIC}/o) - elsif match = value_expected ? scan(/[-+]?#{patterns::NUMERIC}/o) : scan(/#{patterns::NUMERIC}/o) - kind = self[1] ? :float : :integer - - elsif match = scan(unicode ? /#{patterns::SYMBOL}/uo : - /#{patterns::SYMBOL}/o) - case delim = match[1] - when ?', ?" - tokens << [:open, :symbol] - tokens << [':', :symbol] - match = delim.chr - kind = :delimiter - state = patterns::StringState.new :symbol, delim == ?", match - else - kind = :symbol - end - - elsif match = scan(/ -[>=]? | [+!~^]=? | [*|&]{1,2}=? | >>? /x) - value_expected = :set - kind = :operator - - elsif value_expected and match = scan(unicode ? /#{patterns::HEREDOC_OPEN}/uo : - /#{patterns::HEREDOC_OPEN}/o) - indented = self[1] == '-' - quote = self[3] - delim = self[quote ? 4 : 2] - kind = patterns::QUOTE_TO_TYPE[quote] - tokens << [:open, kind] - tokens << [match, :delimiter] - match = :close - heredoc = patterns::StringState.new kind, quote != '\'', delim, (indented ? :indented : :linestart ) - heredocs ||= [] # create heredocs if empty - heredocs << heredoc - - elsif value_expected and match = scan(/#{patterns::FANCY_START_CORRECT}/o) - kind, interpreted = *patterns::FancyStringType.fetch(self[1]) do - raise_inspect 'Unknown fancy string: %%%p' % k, tokens - end - tokens << [:open, kind] - state = patterns::StringState.new kind, interpreted, self[2] - kind = :delimiter - - elsif value_expected and match = scan(unicode ? /#{patterns::CHARACTER}/uo : - /#{patterns::CHARACTER}/o) - kind = :integer - - elsif match = scan(/ [\/%]=? | <(?:<|=>?)? | [?:;] /x) - value_expected = :set - kind = :operator - - elsif match = scan(/`/) - if last_token_dot - kind = :operator - else - tokens << [:open, :shell] - kind = :delimiter - state = patterns::StringState.new :shell, true, match - end - - elsif match = scan(unicode ? /#{patterns::GLOBAL_VARIABLE}/uo : - /#{patterns::GLOBAL_VARIABLE}/o) - kind = :global_variable - - elsif match = scan(unicode ? /#{patterns::CLASS_VARIABLE}/uo : - /#{patterns::CLASS_VARIABLE}/o) - kind = :class_variable - - else - if !unicode && !string.respond_to?(:encoding) - # check for unicode - debug, $DEBUG = $DEBUG, false - begin - if check(/./mu).size > 1 - # seems like we should try again with unicode - unicode = true - end - rescue - # bad unicode char; use getch - ensure - $DEBUG = debug - end - next if unicode - end - kind = :error - match = scan(unicode ? /./mu : /./m) - - end - - elsif state == :def_expected - state = :initial - if scan(/self\./) - tokens << ['self', :pre_constant] - tokens << ['.', :operator] - end - if match = scan(unicode ? /(?>#{patterns::METHOD_NAME_EX})(?!\.|::)/uo : - /(?>#{patterns::METHOD_NAME_EX})(?!\.|::)/o) - kind = :method - else - next - end - - elsif state == :module_expected - if match = scan(/< 1 - state = this_block.first - tokens << [:close, state.type] - end - - tokens - end - - end - -end -end - -# vim:fdm=marker diff --git a/vendor/gems/coderay-0.9.7/lib/coderay/scanners/ruby/patterns.rb b/vendor/gems/coderay-0.9.7/lib/coderay/scanners/ruby/patterns.rb deleted file mode 100644 index ba3ac8a4..00000000 --- a/vendor/gems/coderay-0.9.7/lib/coderay/scanners/ruby/patterns.rb +++ /dev/null @@ -1,252 +0,0 @@ -# encoding: utf-8 -module CodeRay -module Scanners - - module Ruby::Patterns # :nodoc: - - RESERVED_WORDS = %w[ - and def end in or unless begin - defined? ensure module redo super until - BEGIN break do next rescue then - when END case else for retry - while alias class elsif if not return - undef yield - ] - - DEF_KEYWORDS = %w[ def ] - UNDEF_KEYWORDS = %w[ undef ] - ALIAS_KEYWORDS = %w[ alias ] - MODULE_KEYWORDS = %w[ class module ] - DEF_NEW_STATE = WordList.new(:initial). - add(DEF_KEYWORDS, :def_expected). - add(UNDEF_KEYWORDS, :undef_expected). - add(ALIAS_KEYWORDS, :alias_expected). - add(MODULE_KEYWORDS, :module_expected) - - PREDEFINED_CONSTANTS = %w[ - nil true false self - DATA ARGV ARGF - __FILE__ __LINE__ __ENCODING__ - ] - - IDENT_KIND = WordList.new(:ident). - add(RESERVED_WORDS, :reserved). - add(PREDEFINED_CONSTANTS, :pre_constant) - - if /\w/u === '∑' - # MRI 1.8.6, 1.8.7 - IDENT = /[^\W\d]\w*/ - else - if //.respond_to? :encoding - # MRI 1.9.1, 1.9.2 - IDENT = Regexp.new '[\p{L}\p{M}\p{Pc}\p{Sm}&&[^\x00-\x40\x5b-\x5e\x60\x7b-\x7f]][\p{L}\p{M}\p{N}\p{Pc}\p{Sm}&&[^\x00-\x2f\x3a-\x40\x5b-\x5e\x60\x7b-\x7f]]*' - else - # JRuby, Rubinius - IDENT = /[^\x00-\x40\x5b-\x5e\x60\x7b-\x7f][^\x00-\x2f\x3a-\x40\x5b-\x5e\x60\x7b-\x7f]*/ - end - end - - METHOD_NAME = / #{IDENT} [?!]? /ox - METHOD_NAME_OPERATOR = / - \*\*? # multiplication and power - | [-+~]@? # plus, minus, tilde with and without at sign - | [\/%&|^`] # division, modulo or format strings, and, or, xor, system - | \[\]=? # array getter and setter - | << | >> # append or shift left, shift right - | <=?>? | >=? # comparison, rocket operator - | ===? | =~ # simple equality, case equality, match - | ![~=@]? # negation with and without at sign, not-equal and not-match - /ox - METHOD_NAME_EX = / #{IDENT} (?:[?!]|=(?!>))? | #{METHOD_NAME_OPERATOR} /ox - INSTANCE_VARIABLE = / @ #{IDENT} /ox - CLASS_VARIABLE = / @@ #{IDENT} /ox - OBJECT_VARIABLE = / @@? #{IDENT} /ox - GLOBAL_VARIABLE = / \$ (?: #{IDENT} | [1-9]\d* | 0\w* | [~&+`'=\/,;_.<>!@$?*":\\] | -[a-zA-Z_0-9] ) /ox - PREFIX_VARIABLE = / #{GLOBAL_VARIABLE} | #{OBJECT_VARIABLE} /ox - VARIABLE = / @?@? #{IDENT} | #{GLOBAL_VARIABLE} /ox - - QUOTE_TO_TYPE = { - '`' => :shell, - '/'=> :regexp, - } - QUOTE_TO_TYPE.default = :string - - REGEXP_MODIFIERS = /[mixounse]*/ - REGEXP_SYMBOLS = /[|?*+(){}\[\].^$]/ - - DECIMAL = /\d+(?:_\d+)*/ - OCTAL = /0_?[0-7]+(?:_[0-7]+)*/ - HEXADECIMAL = /0x[0-9A-Fa-f]+(?:_[0-9A-Fa-f]+)*/ - BINARY = /0b[01]+(?:_[01]+)*/ - - EXPONENT = / [eE] [+-]? #{DECIMAL} /ox - FLOAT_SUFFIX = / #{EXPONENT} | \. #{DECIMAL} #{EXPONENT}? /ox - FLOAT_OR_INT = / #{DECIMAL} (?: #{FLOAT_SUFFIX} () )? /ox - NUMERIC = / (?: (?=0) (?: #{OCTAL} | #{HEXADECIMAL} | #{BINARY} ) | #{FLOAT_OR_INT} ) /ox - - SYMBOL = / - : - (?: - #{METHOD_NAME_EX} - | #{PREFIX_VARIABLE} - | ['"] - ) - /ox - METHOD_NAME_OR_SYMBOL = / #{METHOD_NAME_EX} | #{SYMBOL} /ox - - SIMPLE_ESCAPE = / - [abefnrstv] - | [0-7]{1,3} - | x[0-9A-Fa-f]{1,2} - | .? - /mx - - CONTROL_META_ESCAPE = / - (?: M-|C-|c ) - (?: \\ (?: M-|C-|c ) )* - (?: [^\\] | \\ #{SIMPLE_ESCAPE} )? - /mox - - ESCAPE = / - #{CONTROL_META_ESCAPE} | #{SIMPLE_ESCAPE} - /mox - - CHARACTER = / - \? - (?: - [^\s\\] - | \\ #{ESCAPE} - ) - /mox - - # NOTE: This is not completely correct, but - # nobody needs heredoc delimiters ending with \n. - # Also, delimiters starting with numbers are allowed. - # but they are more often than not a false positive. - HEREDOC_OPEN = / - << (-)? # $1 = float - (?: - ( #{IDENT} ) # $2 = delim - | - ( ["'`\/] ) # $3 = quote, type - ( [^\n]*? ) \3 # $4 = delim - ) - /mx - - RUBYDOC = / - =begin (?!\S) - .*? - (?: \Z | ^=end (?!\S) [^\n]* ) - /mx - - DATA = / - __END__$ - .*? - (?: \Z | (?=^\#CODE) ) - /mx - - # Checks for a valid value to follow. This enables - # value_expected in method calls without parentheses. - VALUE_FOLLOWS = / - (?>[ \t\f\v]+) - (?: - [%\/][^\s=] - | <<-?\S - | [-+] \d - | #{CHARACTER} - ) - /x - KEYWORDS_EXPECTING_VALUE = WordList.new.add(%w[ - and end in or unless begin - defined? ensure redo super until - break do next rescue then - when case else for retry - while elsif if not return - yield - ]) - - RUBYDOC_OR_DATA = / #{RUBYDOC} | #{DATA} /xo - - RDOC_DATA_START = / ^=begin (?!\S) | ^__END__$ /x - - FANCY_START_CORRECT = / % ( [qQwWxsr] | (?![a-zA-Z0-9]) ) ([^a-zA-Z0-9]) /mx - - FancyStringType = { - 'q' => [:string, false], - 'Q' => [:string, true], - 'r' => [:regexp, true], - 's' => [:symbol, false], - 'x' => [:shell, true] - } - FancyStringType['w'] = FancyStringType['q'] - FancyStringType['W'] = FancyStringType[''] = FancyStringType['Q'] - - class StringState < Struct.new :type, :interpreted, :delim, :heredoc, - :paren, :paren_depth, :pattern, :next_state - - CLOSING_PAREN = Hash[ *%w[ - ( ) - [ ] - < > - { } - ] ] - - CLOSING_PAREN.each { |k,v| k.freeze; v.freeze } # debug, if I try to change it with << - OPENING_PAREN = CLOSING_PAREN.invert - - STRING_PATTERN = Hash.new do |h, k| - delim, interpreted = *k - delim_pattern = Regexp.escape(delim.dup) # dup: workaround for old Ruby - if closing_paren = CLOSING_PAREN[delim] - delim_pattern = delim_pattern[0..-1] if defined? JRUBY_VERSION # JRuby fix - delim_pattern << Regexp.escape(closing_paren) - end - delim_pattern << '\\\\' unless delim == '\\' - - special_escapes = - case interpreted - when :regexp_symbols - '| ' + REGEXP_SYMBOLS.source - when :words - '| \s' - end - - h[k] = - if interpreted and not delim == '#' - / (?= [#{delim_pattern}] | \# [{$@] #{special_escapes} ) /mx - else - / (?= [#{delim_pattern}] #{special_escapes} ) /mx - end - end - - HEREDOC_PATTERN = Hash.new do |h, k| - delim, interpreted, indented = *k - delim_pattern = Regexp.escape(delim.dup) # dup: workaround for old Ruby - delim_pattern = / \n #{ '(?>[\ \t]*)' if indented } #{ Regexp.new delim_pattern } $ /x - h[k] = - if interpreted - / (?= #{delim_pattern}() | \\ | \# [{$@] ) /mx # $1 set == end of heredoc - else - / (?= #{delim_pattern}() | \\ ) /mx - end - end - - def initialize kind, interpreted, delim, heredoc = false - if heredoc - pattern = HEREDOC_PATTERN[ [delim, interpreted, heredoc == :indented] ] - delim = nil - else - pattern = STRING_PATTERN[ [delim, interpreted] ] - if paren = CLOSING_PAREN[delim] - delim, paren = paren, delim - paren_depth = 1 - end - end - super kind, interpreted, delim, heredoc, paren, paren_depth, pattern, :initial - end - end unless defined? StringState - - end - -end -end diff --git a/vendor/gems/coderay-0.9.7/lib/coderay/scanners/scheme.rb b/vendor/gems/coderay-0.9.7/lib/coderay/scanners/scheme.rb deleted file mode 100644 index ba22b80b..00000000 --- a/vendor/gems/coderay-0.9.7/lib/coderay/scanners/scheme.rb +++ /dev/null @@ -1,145 +0,0 @@ -module CodeRay - module Scanners - - # Scheme scanner for CodeRay (by closure). - # Thanks to murphy for putting CodeRay into public. - class Scheme < Scanner - - # TODO: function defs - # TODO: built-in functions - - register_for :scheme - file_extension 'scm' - - CORE_FORMS = %w[ - lambda let let* letrec syntax-case define-syntax let-syntax - letrec-syntax begin define quote if or and cond case do delay - quasiquote set! cons force call-with-current-continuation call/cc - ] - - IDENT_KIND = CaseIgnoringWordList.new(:ident). - add(CORE_FORMS, :reserved) - - #IDENTIFIER_INITIAL = /[a-z!@\$%&\*\/\:<=>\?~_\^]/i - #IDENTIFIER_SUBSEQUENT = /#{IDENTIFIER_INITIAL}|\d|\.|\+|-/ - #IDENTIFIER = /#{IDENTIFIER_INITIAL}#{IDENTIFIER_SUBSEQUENT}*|\+|-|\.{3}/ - IDENTIFIER = /[a-zA-Z!@$%&*\/:<=>?~_^][\w!@$%&*\/:<=>?~^.+\-]*|[+-]|\.\.\./ - DIGIT = /\d/ - DIGIT10 = DIGIT - DIGIT16 = /[0-9a-f]/i - DIGIT8 = /[0-7]/ - DIGIT2 = /[01]/ - RADIX16 = /\#x/i - RADIX8 = /\#o/i - RADIX2 = /\#b/i - RADIX10 = /\#d/i - EXACTNESS = /#i|#e/i - SIGN = /[\+-]?/ - EXP_MARK = /[esfdl]/i - EXP = /#{EXP_MARK}#{SIGN}#{DIGIT}+/ - SUFFIX = /#{EXP}?/ - PREFIX10 = /#{RADIX10}?#{EXACTNESS}?|#{EXACTNESS}?#{RADIX10}?/ - PREFIX16 = /#{RADIX16}#{EXACTNESS}?|#{EXACTNESS}?#{RADIX16}/ - PREFIX8 = /#{RADIX8}#{EXACTNESS}?|#{EXACTNESS}?#{RADIX8}/ - PREFIX2 = /#{RADIX2}#{EXACTNESS}?|#{EXACTNESS}?#{RADIX2}/ - UINT10 = /#{DIGIT10}+#*/ - UINT16 = /#{DIGIT16}+#*/ - UINT8 = /#{DIGIT8}+#*/ - UINT2 = /#{DIGIT2}+#*/ - DECIMAL = /#{DIGIT10}+#+\.#*#{SUFFIX}|#{DIGIT10}+\.#{DIGIT10}*#*#{SUFFIX}|\.#{DIGIT10}+#*#{SUFFIX}|#{UINT10}#{EXP}/ - UREAL10 = /#{UINT10}\/#{UINT10}|#{DECIMAL}|#{UINT10}/ - UREAL16 = /#{UINT16}\/#{UINT16}|#{UINT16}/ - UREAL8 = /#{UINT8}\/#{UINT8}|#{UINT8}/ - UREAL2 = /#{UINT2}\/#{UINT2}|#{UINT2}/ - REAL10 = /#{SIGN}#{UREAL10}/ - REAL16 = /#{SIGN}#{UREAL16}/ - REAL8 = /#{SIGN}#{UREAL8}/ - REAL2 = /#{SIGN}#{UREAL2}/ - IMAG10 = /i|#{UREAL10}i/ - IMAG16 = /i|#{UREAL16}i/ - IMAG8 = /i|#{UREAL8}i/ - IMAG2 = /i|#{UREAL2}i/ - COMPLEX10 = /#{REAL10}@#{REAL10}|#{REAL10}\+#{IMAG10}|#{REAL10}-#{IMAG10}|\+#{IMAG10}|-#{IMAG10}|#{REAL10}/ - COMPLEX16 = /#{REAL16}@#{REAL16}|#{REAL16}\+#{IMAG16}|#{REAL16}-#{IMAG16}|\+#{IMAG16}|-#{IMAG16}|#{REAL16}/ - COMPLEX8 = /#{REAL8}@#{REAL8}|#{REAL8}\+#{IMAG8}|#{REAL8}-#{IMAG8}|\+#{IMAG8}|-#{IMAG8}|#{REAL8}/ - COMPLEX2 = /#{REAL2}@#{REAL2}|#{REAL2}\+#{IMAG2}|#{REAL2}-#{IMAG2}|\+#{IMAG2}|-#{IMAG2}|#{REAL2}/ - NUM10 = /#{PREFIX10}?#{COMPLEX10}/ - NUM16 = /#{PREFIX16}#{COMPLEX16}/ - NUM8 = /#{PREFIX8}#{COMPLEX8}/ - NUM2 = /#{PREFIX2}#{COMPLEX2}/ - NUM = /#{NUM10}|#{NUM16}|#{NUM8}|#{NUM2}/ - - private - def scan_tokens tokens,options - - state = :initial - ident_kind = IDENT_KIND - - until eos? - kind = match = nil - - case state - when :initial - if scan(/ \s+ | \\\n /x) - kind = :space - elsif scan(/['\(\[\)\]]|#\(/) - kind = :operator_fat - elsif scan(/;.*/) - kind = :comment - elsif scan(/#\\(?:newline|space|.?)/) - kind = :char - elsif scan(/#[ft]/) - kind = :pre_constant - elsif scan(/#{IDENTIFIER}/o) - kind = ident_kind[matched] - elsif scan(/\./) - kind = :operator - elsif scan(/"/) - tokens << [:open, :string] - state = :string - tokens << ['"', :delimiter] - next - elsif scan(/#{NUM}/o) and not matched.empty? - kind = :integer - elsif getch - kind = :error - end - - when :string - if scan(/[^"\\]+/) or scan(/\\.?/) - kind = :content - elsif scan(/"/) - tokens << ['"', :delimiter] - tokens << [:close, :string] - state = :initial - next - else - raise_inspect "else case \" reached; %p not handled." % peek(1), - tokens, state - end - - else - raise "else case reached" - end - - match ||= matched - if $CODERAY_DEBUG and not kind - raise_inspect 'Error token %p in line %d' % - [[match, kind], line], tokens - end - raise_inspect 'Empty token', tokens, state unless match - - tokens << [match, kind] - - end # until eos - - if state == :string - tokens << [:close, :string] - end - - tokens - - end #scan_tokens - end #class - end #module scanners -end #module coderay \ No newline at end of file diff --git a/vendor/gems/coderay-0.9.7/lib/coderay/scanners/sql.rb b/vendor/gems/coderay-0.9.7/lib/coderay/scanners/sql.rb deleted file mode 100644 index 89075816..00000000 --- a/vendor/gems/coderay-0.9.7/lib/coderay/scanners/sql.rb +++ /dev/null @@ -1,162 +0,0 @@ -module CodeRay module Scanners - - # by Josh Goebel - class SQL < Scanner - - register_for :sql - - RESERVED_WORDS = %w( - create database table index trigger drop primary key set select - insert update delete replace into - on from values before and or if exists case when - then else as group order by avg where - join inner outer union engine not - like end using collate show columns begin - ) - - PREDEFINED_TYPES = %w( - char varchar enum binary text tinytext mediumtext - longtext blob tinyblob mediumblob longblob timestamp - date time datetime year double decimal float int - integer tinyint mediumint bigint smallint unsigned bit - bool boolean hex bin oct - ) - - PREDEFINED_FUNCTIONS = %w( sum cast abs pi count min max avg ) - - DIRECTIVES = %w( auto_increment unique default charset ) - - PREDEFINED_CONSTANTS = %w( null true false ) - - IDENT_KIND = CaseIgnoringWordList.new(:ident). - add(RESERVED_WORDS, :reserved). - add(PREDEFINED_TYPES, :pre_type). - add(PREDEFINED_CONSTANTS, :pre_constant). - add(PREDEFINED_FUNCTIONS, :predefined). - add(DIRECTIVES, :directive) - - ESCAPE = / [rbfntv\n\\\/'"] | x[a-fA-F0-9]{1,2} | [0-7]{1,3} | . /mx - UNICODE_ESCAPE = / u[a-fA-F0-9]{4} | U[a-fA-F0-9]{8} /x - - STRING_PREFIXES = /[xnb]|_\w+/i - - def scan_tokens tokens, options - - state = :initial - string_type = nil - string_content = '' - - until eos? - - kind = nil - match = nil - - if state == :initial - - if scan(/ \s+ | \\\n /x) - kind = :space - - elsif scan(/(?:--\s?|#).*/) - kind = :comment - - elsif scan(%r! /\* (?: .*? \*/ | .* ) !mx) - kind = :comment - - elsif scan(/ [-+*\/=<>;,!&^|()\[\]{}~%] | \.(?!\d) /x) - kind = :operator - - elsif scan(/(#{STRING_PREFIXES})?([`"'])/o) - prefix = self[1] - string_type = self[2] - tokens << [:open, :string] - tokens << [prefix, :modifier] if prefix - match = string_type - state = :string - kind = :delimiter - - elsif match = scan(/ @? [A-Za-z_][A-Za-z_0-9]* /x) - kind = match[0] == ?@ ? :variable : IDENT_KIND[match.downcase] - - elsif scan(/0[xX][0-9A-Fa-f]+/) - kind = :hex - - elsif scan(/0[0-7]+(?![89.eEfF])/) - kind = :oct - - elsif scan(/(?>\d+)(?![.eEfF])/) - kind = :integer - - elsif scan(/\d[fF]|\d*\.\d+(?:[eE][+-]?\d+)?|\d+[eE][+-]?\d+/) - kind = :float - - else - getch - kind = :error - - end - - elsif state == :string - if match = scan(/[^\\"'`]+/) - string_content << match - next - elsif match = scan(/["'`]/) - if string_type == match - if peek(1) == string_type # doubling means escape - string_content << string_type << getch - next - end - unless string_content.empty? - tokens << [string_content, :content] - string_content = '' - end - tokens << [matched, :delimiter] - tokens << [:close, :string] - state = :initial - string_type = nil - next - else - string_content << match - end - next - elsif scan(/ \\ (?: #{ESCAPE} | #{UNICODE_ESCAPE} ) /mox) - unless string_content.empty? - tokens << [string_content, :content] - string_content = '' - end - kind = :char - elsif match = scan(/ \\ . /mox) - string_content << match - next - elsif scan(/ \\ | $ /x) - unless string_content.empty? - tokens << [string_content, :content] - string_content = '' - end - kind = :error - state = :initial - else - raise "else case \" reached; %p not handled." % peek(1), tokens - end - - else - raise 'else-case reached', tokens - - end - - match ||= matched - unless kind - raise_inspect 'Error token %p in line %d' % - [[match, kind], line], tokens, state - end - raise_inspect 'Empty token', tokens unless match - - tokens << [match, kind] - - end - tokens - - end - - end - -end end \ No newline at end of file diff --git a/vendor/gems/coderay-0.9.7/lib/coderay/scanners/xml.rb b/vendor/gems/coderay-0.9.7/lib/coderay/scanners/xml.rb deleted file mode 100644 index aeabeca8..00000000 --- a/vendor/gems/coderay-0.9.7/lib/coderay/scanners/xml.rb +++ /dev/null @@ -1,17 +0,0 @@ -module CodeRay -module Scanners - - load :html - - # XML Scanner - # - # Currently this is the same scanner as Scanners::HTML. - class XML < HTML - - register_for :xml - file_extension 'xml' - - end - -end -end diff --git a/vendor/gems/coderay-0.9.7/lib/coderay/scanners/yaml.rb b/vendor/gems/coderay-0.9.7/lib/coderay/scanners/yaml.rb deleted file mode 100644 index 7903ab97..00000000 --- a/vendor/gems/coderay-0.9.7/lib/coderay/scanners/yaml.rb +++ /dev/null @@ -1,140 +0,0 @@ -module CodeRay -module Scanners - - # YAML Scanner - # - # Based on the YAML scanner from Syntax by Jamis Buck. - class YAML < Scanner - - register_for :yaml - file_extension 'yml' - - KINDS_NOT_LOC = :all - - def scan_tokens tokens, options - - value_expected = nil - state = :initial - key_indent = indent = 0 - - until eos? - - kind = nil - match = nil - key_indent = nil if bol? - - if match = scan(/ +[\t ]*/) - kind = :space - - elsif match = scan(/\n+/) - kind = :space - state = :initial if match.index(?\n) - - elsif match = scan(/#.*/) - kind = :comment - - elsif bol? and case - when match = scan(/---|\.\.\./) - tokens << [:open, :head] - tokens << [match, :head] - tokens << [:close, :head] - next - when match = scan(/%.*/) - tokens << [match, :doctype] - next - end - - elsif state == :value and case - when !check(/(?:"[^"]*")(?=: |:$)/) && scan(/"/) - tokens << [:open, :string] - tokens << [matched, :delimiter] - tokens << [matched, :content] if scan(/ [^"\\]* (?: \\. [^"\\]* )* /mx) - tokens << [matched, :delimiter] if scan(/"/) - tokens << [:close, :string] - next - when match = scan(/[|>][-+]?/) - tokens << [:open, :string] - tokens << [match, :delimiter] - string_indent = key_indent || column(pos - match.size - 1) - tokens << [matched, :content] if scan(/(?:\n+ {#{string_indent + 1}}.*)+/) - tokens << [:close, :string] - next - when match = scan(/(?![!"*&]).+?(?=$|\s+#)/) - tokens << [match, :string] - string_indent = key_indent || column(pos - match.size - 1) - tokens << [matched, :string] if scan(/(?:\n+ {#{string_indent + 1}}.*)+/) - next - end - - elsif case - when match = scan(/[-:](?= |$)/) - state = :value if state == :colon && (match == ':' || match == '-') - state = :value if state == :initial && match == '-' - kind = :operator - when match = scan(/[,{}\[\]]/) - kind = :operator - when state == :initial && match = scan(/[\w.() ]*\S(?=: |:$)/) - kind = :key - key_indent = column(pos - match.size - 1) - # tokens << [key_indent.inspect, :debug] - state = :colon - when match = scan(/(?:"[^"\n]*"|'[^'\n]*')(?=: |:$)/) - tokens << [:open, :key] - tokens << [match[0,1], :delimiter] - tokens << [match[1..-2], :content] - tokens << [match[-1,1], :delimiter] - tokens << [:close, :key] - key_indent = column(pos - match.size - 1) - # tokens << [key_indent.inspect, :debug] - state = :colon - next - when scan(/(![\w\/]+)(:([\w:]+))?/) - tokens << [self[1], :type] - if self[2] - tokens << [':', :operator] - tokens << [self[3], :class] - end - next - when scan(/&\S+/) - kind = :variable - when scan(/\*\w+/) - kind = :global_variable - when scan(/< 'at', - :attribute_name => 'an', - :attribute_name_fat => 'af', - :attribute_value => 'av', - :attribute_value_fat => 'aw', - :bin => 'bi', - :char => 'ch', - :class => 'cl', - :class_variable => 'cv', - :color => 'cr', - :comment => 'c', - :complex => 'cm', - :constant => 'co', - :content => 'k', - :decorator => 'de', - :definition => 'df', - :delimiter => 'dl', - :directive => 'di', - :doc => 'do', - :doctype => 'dt', - :doc_string => 'ds', - :entity => 'en', - :error => 'er', - :escape => 'e', - :exception => 'ex', - :float => 'fl', - :function => 'fu', - :global_variable => 'gv', - :hex => 'hx', - :imaginary => 'cm', - :important => 'im', - :include => 'ic', - :inline => 'il', - :inline_delimiter => 'idl', - :instance_variable => 'iv', - :integer => 'i', - :interpreted => 'in', - :keyword => 'kw', - :key => 'ke', - :label => 'la', - :local_variable => 'lv', - :modifier => 'mod', - :oct => 'oc', - :operator_fat => 'of', - :pre_constant => 'pc', - :pre_type => 'pt', - :predefined => 'pd', - :preprocessor => 'pp', - :pseudo_class => 'ps', - :regexp => 'rx', - :reserved => 'r', - :shell => 'sh', - :string => 's', - :symbol => 'sy', - :tag => 'ta', - :tag_fat => 'tf', - :tag_special => 'ts', - :type => 'ty', - :variable => 'v', - :value => 'vl', - :xml_text => 'xt', - - :insert => 'ins', - :delete => 'del', - :change => 'chg', - :head => 'head', - - :ident => :NO_HIGHLIGHT, # 'id' - #:operator => 'op', - :operator => :NO_HIGHLIGHT, # 'op' - :space => :NO_HIGHLIGHT, # 'sp' - :plain => :NO_HIGHLIGHT, - } - ClassOfKind[:method] = ClassOfKind[:function] - ClassOfKind[:open] = ClassOfKind[:close] = ClassOfKind[:delimiter] - ClassOfKind[:nesting_delimiter] = ClassOfKind[:delimiter] - ClassOfKind[:escape] = ClassOfKind[:delimiter] - #ClassOfKind.default = ClassOfKind[:error] or raise 'no class found for :error!' - end -end \ No newline at end of file diff --git a/vendor/gems/coderay-0.9.7/lib/coderay/tokens.rb b/vendor/gems/coderay-0.9.7/lib/coderay/tokens.rb deleted file mode 100644 index 6ac5f440..00000000 --- a/vendor/gems/coderay-0.9.7/lib/coderay/tokens.rb +++ /dev/null @@ -1,390 +0,0 @@ -module CodeRay - - # = Tokens - # - # The Tokens class represents a list of tokens returnd from - # a Scanner. - # - # A token is not a special object, just a two-element Array - # consisting of - # * the _token_ _text_ (the original source of the token in a String) or - # a _token_ _action_ (:open, :close, :begin_line, :end_line) - # * the _token_ _kind_ (a Symbol representing the type of the token) - # - # A token looks like this: - # - # ['# It looks like this', :comment] - # ['3.1415926', :float] - # ['$^', :error] - # - # Some scanners also yield sub-tokens, represented by special - # token actions, namely :open and :close. - # - # The Ruby scanner, for example, splits "a string" into: - # - # [ - # [:open, :string], - # ['"', :delimiter], - # ['a string', :content], - # ['"', :delimiter], - # [:close, :string] - # ] - # - # Tokens is the interface between Scanners and Encoders: - # The input is split and saved into a Tokens object. The Encoder - # then builds the output from this object. - # - # Thus, the syntax below becomes clear: - # - # CodeRay.scan('price = 2.59', :ruby).html - # # the Tokens object is here -------^ - # - # See how small it is? ;) - # - # Tokens gives you the power to handle pre-scanned code very easily: - # You can convert it to a webpage, a YAML file, or dump it into a gzip'ed string - # that you put in your DB. - # - # It also allows you to generate tokens directly (without using a scanner), - # to load them from a file, and still use any Encoder that CodeRay provides. - # - # Tokens' subclass TokenStream allows streaming to save memory. - class Tokens < Array - - # The Scanner instance that created the tokens. - attr_accessor :scanner - - # Whether the object is a TokenStream. - # - # Returns false. - def stream? - false - end - - # Iterates over all tokens. - # - # If a filter is given, only tokens of that kind are yielded. - def each kind_filter = nil, &block - unless kind_filter - super(&block) - else - super() do |text, kind| - next unless kind == kind_filter - yield text, kind - end - end - end - - # Iterates over all text tokens. - # Range tokens like [:open, :string] are left out. - # - # Example: - # tokens.each_text_token { |text, kind| text.replace html_escape(text) } - def each_text_token - each do |text, kind| - next unless text.is_a? ::String - yield text, kind - end - end - - # Encode the tokens using encoder. - # - # encoder can be - # * a symbol like :html oder :statistic - # * an Encoder class - # * an Encoder object - # - # options are passed to the encoder. - def encode encoder, options = {} - unless encoder.is_a? Encoders::Encoder - unless encoder.is_a? Class - encoder_class = Encoders[encoder] - end - encoder = encoder_class.new options - end - encoder.encode_tokens self, options - end - - - # Turn into a string using Encoders::Text. - # - # +options+ are passed to the encoder if given. - def to_s options = {} - encode :text, options - end - - # Redirects unknown methods to encoder calls. - # - # For example, if you call +tokens.html+, the HTML encoder - # is used to highlight the tokens. - def method_missing meth, options = {} - Encoders[meth].new(options).encode_tokens self - end - - # Returns the tokens compressed by joining consecutive - # tokens of the same kind. - # - # This can not be undone, but should yield the same output - # in most Encoders. It basically makes the output smaller. - # - # Combined with dump, it saves space for the cost of time. - # - # If the scanner is written carefully, this is not required - - # for example, consecutive //-comment lines could already be - # joined in one comment token by the Scanner. - def optimize - last_kind = last_text = nil - new = self.class.new - for text, kind in self - if text.is_a? String - if kind == last_kind - last_text << text - else - new << [last_text, last_kind] if last_kind - last_text = text - last_kind = kind - end - else - new << [last_text, last_kind] if last_kind - last_kind = last_text = nil - new << [text, kind] - end - end - new << [last_text, last_kind] if last_kind - new - end - - # Compact the object itself; see optimize. - def optimize! - replace optimize - end - - # Ensure that all :open tokens have a correspondent :close one. - # - # TODO: Test this! - def fix - tokens = self.class.new - # Check token nesting using a stack of kinds. - opened = [] - for type, kind in self - case type - when :open - opened.push [:close, kind] - when :begin_line - opened.push [:end_line, kind] - when :close, :end_line - expected = opened.pop - if [type, kind] != expected - # Unexpected :close; decide what to do based on the kind: - # - token was never opened: delete the :close (just skip it) - next unless opened.rindex expected - # - token was opened earlier: also close tokens in between - tokens << token until (token = opened.pop) == expected - end - end - tokens << [type, kind] - end - # Close remaining opened tokens - tokens << token while token = opened.pop - tokens - end - - def fix! - replace fix - end - - # TODO: Scanner#split_into_lines - # - # Makes sure that: - # - newlines are single tokens - # (which means all other token are single-line) - # - there are no open tokens at the end the line - # - # This makes it simple for encoders that work line-oriented, - # like HTML with list-style numeration. - def split_into_lines - raise NotImplementedError - end - - def split_into_lines! - replace split_into_lines - end - - # Dumps the object into a String that can be saved - # in files or databases. - # - # The dump is created with Marshal.dump; - # In addition, it is gzipped using GZip.gzip. - # - # The returned String object includes Undumping - # so it has an #undump method. See Tokens.load. - # - # You can configure the level of compression, - # but the default value 7 should be what you want - # in most cases as it is a good compromise between - # speed and compression rate. - # - # See GZip module. - def dump gzip_level = 7 - require 'coderay/helpers/gzip_simple' - dump = Marshal.dump self - dump = dump.gzip gzip_level - dump.extend Undumping - end - - # The total size of the tokens. - # Should be equal to the input size before - # scanning. - def text_size - size = 0 - each_text_token do |t, k| - size + t.size - end - size - end - - # Return all text tokens joined into a single string. - def text - map { |t, k| t if t.is_a? ::String }.join - end - - # Include this module to give an object an #undump - # method. - # - # The string returned by Tokens.dump includes Undumping. - module Undumping - # Calls Tokens.load with itself. - def undump - Tokens.load self - end - end - - # Undump the object using Marshal.load, then - # unzip it using GZip.gunzip. - # - # The result is commonly a Tokens object, but - # this is not guaranteed. - def Tokens.load dump - require 'coderay/helpers/gzip_simple' - dump = dump.gunzip - @dump = Marshal.load dump - end - - end - - - # = TokenStream - # - # The TokenStream class is a fake Array without elements. - # - # It redirects the method << to a block given at creation. - # - # This allows scanners and Encoders to use streaming (no - # tokens are saved, the input is highlighted the same time it - # is scanned) with the same code. - # - # See CodeRay.encode_stream and CodeRay.scan_stream - class TokenStream < Tokens - - # Whether the object is a TokenStream. - # - # Returns true. - def stream? - true - end - - # The Array is empty, but size counts the tokens given by <<. - attr_reader :size - - # Creates a new TokenStream that calls +block+ whenever - # its << method is called. - # - # Example: - # - # require 'coderay' - # - # token_stream = CodeRay::TokenStream.new do |text, kind| - # puts 'kind: %s, text size: %d.' % [kind, text.size] - # end - # - # token_stream << ['/\d+/', :regexp] - # #-> kind: rexpexp, text size: 5. - # - def initialize &block - raise ArgumentError, 'Block expected for streaming.' unless block - @callback = block - @size = 0 - end - - # Calls +block+ with +token+ and increments size. - # - # Returns self. - def << token - @callback.call(*token) - @size += 1 - self - end - - # This method is not implemented due to speed reasons. Use Tokens. - def text_size - raise NotImplementedError, - 'This method is not implemented due to speed reasons.' - end - - # A TokenStream cannot be dumped. Use Tokens. - def dump - raise NotImplementedError, 'A TokenStream cannot be dumped.' - end - - # A TokenStream cannot be optimized. Use Tokens. - def optimize - raise NotImplementedError, 'A TokenStream cannot be optimized.' - end - - end - -end - -if $0 == __FILE__ - $VERBOSE = true - $: << File.join(File.dirname(__FILE__), '..') - eval DATA.read, nil, $0, __LINE__ + 4 -end - -__END__ -require 'test/unit' - -class TokensTest < Test::Unit::TestCase - - def test_creation - assert CodeRay::Tokens < Array - tokens = nil - assert_nothing_raised do - tokens = CodeRay::Tokens.new - end - assert_kind_of Array, tokens - end - - def test_adding_tokens - tokens = CodeRay::Tokens.new - assert_nothing_raised do - tokens << ['string', :type] - tokens << ['()', :operator] - end - assert_equal tokens.size, 2 - end - - def test_dump_undump - tokens = CodeRay::Tokens.new - assert_nothing_raised do - tokens << ['string', :type] - tokens << ['()', :operator] - end - tokens2 = nil - assert_nothing_raised do - tokens2 = tokens.dump.undump - end - assert_equal tokens, tokens2 - end - -end \ No newline at end of file diff --git a/vendor/gems/coderay-0.9.7/test/functional/basic.rb b/vendor/gems/coderay-0.9.7/test/functional/basic.rb deleted file mode 100644 index 8ecd3d35..00000000 --- a/vendor/gems/coderay-0.9.7/test/functional/basic.rb +++ /dev/null @@ -1,122 +0,0 @@ -require 'test/unit' -require 'coderay' - -class BasicTest < Test::Unit::TestCase - - def test_version - assert_nothing_raised do - assert_match(/\A\d\.\d\.\d\z/, CodeRay::VERSION) - end - end - - RUBY_TEST_CODE = 'puts "Hello, World!"' - - RUBY_TEST_TOKENS = [ - ['puts', :ident], - [' ', :space], - [:open, :string], - ['"', :delimiter], - ['Hello, World!', :content], - ['"', :delimiter], - [:close, :string] - ] - def test_simple_scan - assert_nothing_raised do - assert_equal RUBY_TEST_TOKENS, CodeRay.scan(RUBY_TEST_CODE, :ruby).to_ary - end - end - - RUBY_TEST_HTML = 'puts "' + - 'Hello, World!"' - def test_simple_highlight - assert_nothing_raised do - assert_equal RUBY_TEST_HTML, CodeRay.scan(RUBY_TEST_CODE, :ruby).html - end - end - - def test_duo - assert_equal(RUBY_TEST_CODE, - CodeRay::Duo[:plain, :plain].highlight(RUBY_TEST_CODE)) - assert_equal(RUBY_TEST_CODE, - CodeRay::Duo[:plain => :plain].highlight(RUBY_TEST_CODE)) - end - - def test_duo_stream - assert_equal(RUBY_TEST_CODE, - CodeRay::Duo[:plain, :plain].highlight(RUBY_TEST_CODE, :stream => true)) - end - - def test_comment_filter - assert_equal <<-EXPECTED, CodeRay.scan(<<-INPUT, :ruby).comment_filter.text -#!/usr/bin/env ruby - -code - -more code - EXPECTED -#!/usr/bin/env ruby -=begin -A multi-line comment. -=end -code -# A single-line comment. -more code # and another comment, in-line. - INPUT - end - - def test_lines_of_code - assert_equal 2, CodeRay.scan(<<-INPUT, :ruby).lines_of_code -#!/usr/bin/env ruby -=begin -A multi-line comment. -=end -code -# A single-line comment. -more code # and another comment, in-line. - INPUT - rHTML = <<-RHTML - - - - - - <%= controller.controller_name.titleize %>: <%= controller.action_name %> - <%= stylesheet_link_tag 'scaffold' %> - - - -

    <%= flash[:notice] %>

    - -
    - <%= yield %> -
    - - - - RHTML - assert_equal 0, CodeRay.scan(rHTML, :html).lines_of_code - assert_equal 0, CodeRay.scan(rHTML, :php).lines_of_code - assert_equal 0, CodeRay.scan(rHTML, :yaml).lines_of_code - assert_equal 4, CodeRay.scan(rHTML, :rhtml).lines_of_code - end - - def test_rubygems_not_loaded - assert_equal nil, defined? Gem - end if ENV['check_rubygems'] && RUBY_VERSION < '1.9' - - def test_list_of_encoders - assert_kind_of(Array, CodeRay::Encoders.list) - assert CodeRay::Encoders.list.include?('count') - end - - def test_list_of_scanners - assert_kind_of(Array, CodeRay::Scanners.list) - assert CodeRay::Scanners.list.include?('plaintext') - end - - def test_scan_a_frozen_string - CodeRay.scan RUBY_VERSION, :ruby - end - -end diff --git a/vendor/gems/coderay-0.9.7/test/functional/basic.rbc b/vendor/gems/coderay-0.9.7/test/functional/basic.rbc deleted file mode 100644 index 1e114cf7..00000000 --- a/vendor/gems/coderay-0.9.7/test/functional/basic.rbc +++ /dev/null @@ -1,2022 +0,0 @@ -!RBIX -0 -x -M -1 -n -n -x -10 -__script__ -i -53 -5 -7 -0 -64 -47 -49 -1 -1 -15 -5 -7 -2 -64 -47 -49 -1 -1 -15 -99 -7 -3 -45 -4 -5 -43 -6 -43 -7 -65 -49 -8 -3 -13 -99 -12 -7 -9 -12 -7 -10 -12 -65 -12 -49 -11 -4 -15 -49 -9 -0 -15 -2 -11 -I -6 -I -0 -I -0 -I -0 -n -p -12 -s -9 -test/unit -x -7 -require -s -7 -coderay -x -9 -BasicTest -x -4 -Test -n -x -4 -Unit -x -8 -TestCase -x -10 -open_class -x -14 -__class_init__ -M -1 -n -n -x -9 -BasicTest -i -263 -5 -66 -99 -7 -0 -7 -1 -65 -67 -49 -2 -0 -49 -3 -4 -15 -65 -7 -4 -7 -5 -64 -49 -6 -2 -15 -65 -7 -7 -7 -8 -64 -7 -9 -35 -2 -7 -10 -64 -7 -11 -35 -2 -7 -12 -7 -13 -35 -2 -7 -14 -64 -7 -15 -35 -2 -7 -16 -64 -7 -17 -35 -2 -7 -14 -64 -7 -15 -35 -2 -7 -18 -7 -13 -35 -2 -35 -7 -49 -6 -2 -15 -99 -7 -19 -7 -20 -65 -67 -49 -2 -0 -49 -3 -4 -15 -65 -7 -21 -7 -22 -64 -7 -23 -64 -81 -24 -49 -6 -2 -15 -99 -7 -25 -7 -26 -65 -67 -49 -2 -0 -49 -3 -4 -15 -99 -7 -27 -7 -28 -65 -67 -49 -2 -0 -49 -3 -4 -15 -99 -7 -29 -7 -30 -65 -67 -49 -2 -0 -49 -3 -4 -15 -99 -7 -31 -7 -32 -65 -67 -49 -2 -0 -49 -3 -4 -15 -99 -7 -33 -7 -34 -65 -67 -49 -2 -0 -49 -3 -4 -15 -45 -35 -36 -7 -37 -64 -49 -38 -1 -13 -9 -202 -15 -45 -39 -40 -7 -41 -64 -84 -42 -9 -219 -99 -7 -43 -7 -44 -65 -67 -49 -2 -0 -49 -3 -4 -8 -220 -1 -15 -99 -7 -45 -7 -46 -65 -67 -49 -2 -0 -49 -3 -4 -15 -99 -7 -47 -7 -48 -65 -67 -49 -2 -0 -49 -3 -4 -15 -99 -7 -49 -7 -50 -65 -67 -49 -2 -0 -49 -3 -4 -11 -I -a -I -0 -I -0 -I -0 -n -p -51 -x -12 -test_version -M -1 -n -n -x -12 -test_version -i -8 -5 -56 -0 -47 -50 -1 -0 -11 -I -2 -I -0 -I -0 -I -0 -n -p -2 -M -1 -p -2 -x -9 -for_block -t -n -x -12 -test_version -i -29 -5 -7 -0 -13 -70 -9 -19 -15 -44 -43 -1 -7 -2 -78 -49 -3 -2 -6 -0 -45 -4 -5 -43 -6 -47 -49 -7 -2 -11 -I -5 -I -0 -I -0 -I -0 -I --2 -p -8 -n -x -6 -Regexp -s -14 -\A\d\.\d\.\d\z -x -3 -new -x -7 -CodeRay -n -x -7 -VERSION -x -12 -assert_match -p -5 -I -0 -I -7 -I -0 -I -8 -I -1d -x -55 -/Users/murphy/ruby/coderay-0.9/test/functional/basic.rb -p -0 -x -21 -assert_nothing_raised -p -5 -I -0 -I -6 -I -0 -I -7 -I -8 -x -55 -/Users/murphy/ruby/coderay-0.9/test/functional/basic.rb -p -0 -x -17 -method_visibility -x -15 -add_defn_method -x -14 -RUBY_TEST_CODE -s -20 -puts "Hello, World!" -x -9 -const_set -x -16 -RUBY_TEST_TOKENS -s -4 -puts -x -5 -ident -s -1 - -x -5 -space -x -4 -open -x -6 -string -s -1 -" -x -9 -delimiter -s -13 -Hello, World! -x -7 -content -x -5 -close -x -16 -test_simple_scan -M -1 -n -n -x -16 -test_simple_scan -i -8 -5 -56 -0 -47 -50 -1 -0 -11 -I -2 -I -0 -I -0 -I -0 -n -p -2 -M -1 -p -2 -x -9 -for_block -t -n -x -16 -test_simple_scan -i -23 -5 -45 -0 -1 -45 -2 -3 -45 -4 -5 -7 -6 -49 -7 -2 -49 -8 -0 -47 -49 -9 -2 -11 -I -6 -I -0 -I -0 -I -0 -I --2 -p -10 -x -16 -RUBY_TEST_TOKENS -n -x -7 -CodeRay -n -x -14 -RUBY_TEST_CODE -n -x -4 -ruby -x -4 -scan -x -6 -to_ary -x -12 -assert_equal -p -5 -I -0 -I -18 -I -0 -I -19 -I -17 -x -55 -/Users/murphy/ruby/coderay-0.9/test/functional/basic.rb -p -0 -x -21 -assert_nothing_raised -p -5 -I -0 -I -17 -I -0 -I -18 -I -8 -x -55 -/Users/murphy/ruby/coderay-0.9/test/functional/basic.rb -p -0 -x -14 -RUBY_TEST_HTML -s -51 -puts " -s -73 -Hello, World!" -x -1 -+ -x -21 -test_simple_highlight -M -1 -n -n -x -21 -test_simple_highlight -i -8 -5 -56 -0 -47 -50 -1 -0 -11 -I -2 -I -0 -I -0 -I -0 -n -p -2 -M -1 -p -2 -x -9 -for_block -t -n -x -21 -test_simple_highlight -i -23 -5 -45 -0 -1 -45 -2 -3 -45 -4 -5 -7 -6 -49 -7 -2 -49 -8 -0 -47 -49 -9 -2 -11 -I -6 -I -0 -I -0 -I -0 -I --2 -p -10 -x -14 -RUBY_TEST_HTML -n -x -7 -CodeRay -n -x -14 -RUBY_TEST_CODE -n -x -4 -ruby -x -4 -scan -x -4 -html -x -12 -assert_equal -p -5 -I -0 -I -20 -I -0 -I -21 -I -17 -x -55 -/Users/murphy/ruby/coderay-0.9/test/functional/basic.rb -p -0 -x -21 -assert_nothing_raised -p -5 -I -0 -I -1f -I -0 -I -20 -I -8 -x -55 -/Users/murphy/ruby/coderay-0.9/test/functional/basic.rb -p -0 -x -8 -test_duo -M -1 -n -n -x -8 -test_duo -i -66 -5 -45 -0 -1 -45 -2 -3 -43 -4 -7 -5 -7 -5 -49 -6 -2 -45 -0 -7 -49 -8 -1 -47 -49 -9 -2 -15 -5 -45 -0 -10 -45 -2 -11 -43 -4 -44 -43 -12 -79 -49 -13 -1 -13 -7 -5 -7 -5 -49 -14 -2 -15 -49 -6 -1 -45 -0 -15 -49 -8 -1 -47 -49 -9 -2 -11 -I -7 -I -0 -I -0 -I -0 -n -p -16 -x -14 -RUBY_TEST_CODE -n -x -7 -CodeRay -n -x -3 -Duo -x -5 -plain -x -2 -[] -n -x -9 -highlight -x -12 -assert_equal -n -n -x -4 -Hash -x -16 -new_from_literal -x -3 -[]= -n -p -15 -I -0 -I -25 -I -0 -I -26 -I -4 -I -27 -I -16 -I -26 -I -1b -I -28 -I -1f -I -29 -I -3d -I -28 -I -42 -x -55 -/Users/murphy/ruby/coderay-0.9/test/functional/basic.rb -p -0 -x -15 -test_duo_stream -M -1 -n -n -x -15 -test_duo_stream -i -42 -5 -45 -0 -1 -45 -2 -3 -43 -4 -7 -5 -7 -5 -49 -6 -2 -45 -0 -7 -44 -43 -8 -79 -49 -9 -1 -13 -7 -10 -2 -49 -11 -2 -15 -49 -12 -2 -47 -49 -13 -2 -11 -I -8 -I -0 -I -0 -I -0 -n -p -14 -x -14 -RUBY_TEST_CODE -n -x -7 -CodeRay -n -x -3 -Duo -x -5 -plain -x -2 -[] -n -x -4 -Hash -x -16 -new_from_literal -x -6 -stream -x -3 -[]= -x -9 -highlight -x -12 -assert_equal -p -9 -I -0 -I -2c -I -0 -I -2d -I -4 -I -2e -I -25 -I -2d -I -2a -x -55 -/Users/murphy/ruby/coderay-0.9/test/functional/basic.rb -p -0 -x -19 -test_comment_filter -M -1 -n -n -x -19 -test_comment_filter -i -26 -5 -7 -0 -64 -45 -1 -2 -7 -3 -64 -7 -4 -49 -5 -2 -49 -6 -0 -49 -7 -0 -47 -49 -8 -2 -11 -I -5 -I -0 -I -0 -I -0 -n -p -9 -s -39 -#!/usr/bin/env ruby - -code - -more code - -x -7 -CodeRay -n -s -127 -#!/usr/bin/env ruby -=begin -A multi-line comment. -=end -code -# A single-line comment. -more code # and another comment, in-line. - -x -4 -ruby -x -4 -scan -x -14 -comment_filter -x -4 -text -x -12 -assert_equal -p -5 -I -0 -I -31 -I -0 -I -32 -I -1a -x -55 -/Users/murphy/ruby/coderay-0.9/test/functional/basic.rb -p -0 -x -18 -test_lines_of_code -M -1 -n -n -x -18 -test_lines_of_code -i -108 -5 -80 -45 -0 -1 -7 -2 -64 -7 -3 -49 -4 -2 -49 -5 -0 -47 -49 -6 -2 -15 -7 -7 -64 -19 -0 -15 -5 -78 -45 -0 -8 -20 -0 -7 -9 -49 -4 -2 -49 -5 -0 -47 -49 -6 -2 -15 -5 -78 -45 -0 -10 -20 -0 -7 -11 -49 -4 -2 -49 -5 -0 -47 -49 -6 -2 -15 -5 -78 -45 -0 -12 -20 -0 -7 -13 -49 -4 -2 -49 -5 -0 -47 -49 -6 -2 -15 -5 -4 -4 -45 -0 -14 -20 -0 -7 -15 -49 -4 -2 -49 -5 -0 -47 -49 -6 -2 -11 -I -6 -I -1 -I -0 -I -0 -n -p -16 -x -7 -CodeRay -n -s -127 -#!/usr/bin/env ruby -=begin -A multi-line comment. -=end -code -# A single-line comment. -more code # and another comment, in-line. - -x -4 -ruby -x -4 -scan -x -13 -lines_of_code -x -12 -assert_equal -s -514 - - - - - - <%= controller.controller_name.titleize %>: <%= controller.action_name %> - <%= stylesheet_link_tag 'scaffold' %> - - - -

    <%= flash[:notice] %>

    - -
    - <%= yield %> -
    - - - - -n -x -4 -html -n -x -3 -php -n -x -4 -yaml -n -x -5 -rhtml -p -15 -I -0 -I -43 -I -0 -I -44 -I -15 -I -4d -I -1b -I -62 -I -2f -I -63 -I -43 -I -64 -I -57 -I -65 -I -6c -x -55 -/Users/murphy/ruby/coderay-0.9/test/functional/basic.rb -p -1 -x -5 -rHTML -x -3 -ENV -n -s -14 -check_rubygems -x -2 -[] -x -12 -RUBY_VERSION -n -s -3 -1.9 -x -1 -< -x -24 -test_rubygems_not_loaded -M -1 -n -n -x -24 -test_rubygems_not_loaded -i -34 -5 -1 -26 -93 -0 -15 -29 -17 -0 -7 -0 -98 -1 -1 -30 -8 -23 -25 -92 -0 -27 -8 -28 -15 -7 -2 -8 -29 -1 -47 -49 -3 -2 -11 -I -4 -I -0 -I -0 -I -0 -n -p -4 -x -3 -Gem -x -16 -vm_const_defined -s -8 -constant -x -12 -assert_equal -p -5 -I -0 -I -68 -I -0 -I -69 -I -22 -x -55 -/Users/murphy/ruby/coderay-0.9/test/functional/basic.rb -p -0 -x -21 -test_list_of_encoders -M -1 -n -n -x -21 -test_list_of_encoders -i -37 -5 -45 -0 -1 -45 -2 -3 -43 -4 -49 -5 -0 -47 -49 -6 -2 -15 -5 -45 -2 -7 -43 -4 -49 -5 -0 -7 -8 -64 -49 -9 -1 -47 -49 -10 -1 -11 -I -3 -I -0 -I -0 -I -0 -n -p -11 -x -5 -Array -n -x -7 -CodeRay -n -x -8 -Encoders -x -4 -list -x -14 -assert_kind_of -n -s -5 -count -x -8 -include? -x -6 -assert -p -7 -I -0 -I -6c -I -0 -I -6d -I -11 -I -6e -I -25 -x -55 -/Users/murphy/ruby/coderay-0.9/test/functional/basic.rb -p -0 -x -21 -test_list_of_scanners -M -1 -n -n -x -21 -test_list_of_scanners -i -37 -5 -45 -0 -1 -45 -2 -3 -43 -4 -49 -5 -0 -47 -49 -6 -2 -15 -5 -45 -2 -7 -43 -4 -49 -5 -0 -7 -8 -64 -49 -9 -1 -47 -49 -10 -1 -11 -I -3 -I -0 -I -0 -I -0 -n -p -11 -x -5 -Array -n -x -7 -CodeRay -n -x -8 -Scanners -x -4 -list -x -14 -assert_kind_of -n -s -9 -plaintext -x -8 -include? -x -6 -assert -p -7 -I -0 -I -71 -I -0 -I -72 -I -11 -I -73 -I -25 -x -55 -/Users/murphy/ruby/coderay-0.9/test/functional/basic.rb -p -0 -x -25 -test_scan_a_frozen_string -M -1 -n -n -x -25 -test_scan_a_frozen_string -i -12 -45 -0 -1 -45 -2 -3 -7 -4 -49 -5 -2 -11 -I -3 -I -0 -I -0 -I -0 -n -p -6 -x -7 -CodeRay -n -x -12 -RUBY_VERSION -n -x -4 -ruby -x -4 -scan -p -5 -I -0 -I -76 -I -0 -I -77 -I -c -x -55 -/Users/murphy/ruby/coderay-0.9/test/functional/basic.rb -p -0 -p -51 -I -2 -I -6 -I -10 -I -c -I -1a -I -e -I -1d -I -f -I -24 -I -10 -I -2b -I -11 -I -31 -I -12 -I -38 -I -13 -I -3f -I -14 -I -46 -I -15 -I -52 -I -17 -I -60 -I -1d -I -63 -I -1d -I -66 -I -1e -I -6f -I -1f -I -7d -I -25 -I -8b -I -2c -I -99 -I -31 -I -a7 -I -43 -I -b5 -I -6a -I -cc -I -68 -I -db -I -6a -I -dd -I -6c -I -eb -I -71 -I -f9 -I -76 -I -107 -x -55 -/Users/murphy/ruby/coderay-0.9/test/functional/basic.rb -p -0 -x -13 -attach_method -p -7 -I -0 -I -1 -I -9 -I -2 -I -12 -I -4 -I -35 -x -55 -/Users/murphy/ruby/coderay-0.9/test/functional/basic.rb -p -0 diff --git a/vendor/gems/coderay-0.9.7/test/functional/for_redcloth.rb b/vendor/gems/coderay-0.9.7/test/functional/for_redcloth.rb deleted file mode 100644 index efd05782..00000000 --- a/vendor/gems/coderay-0.9.7/test/functional/for_redcloth.rb +++ /dev/null @@ -1,77 +0,0 @@ -require 'test/unit' -$:.unshift 'lib' -require 'coderay' - -begin - require 'rubygems' unless defined? Gem - gem 'RedCloth', '>= 4.0.3' rescue nil - require 'redcloth' -rescue LoadError - warn 'RedCloth not found - skipping for_redcloth tests.' -end - -class BasicTest < Test::Unit::TestCase - - def test_for_redcloth - require 'coderay/for_redcloth' - assert_equal "

    puts "Hello, World!"

    ", - RedCloth.new('@[ruby]puts "Hello, World!"@').to_html - assert_equal <<-BLOCKCODE.chomp, -
    -
    puts "Hello, World!"
    -
    - BLOCKCODE - RedCloth.new('bc[ruby]. puts "Hello, World!"').to_html - end - - def test_for_redcloth_no_lang - require 'coderay/for_redcloth' - assert_equal "

    puts \"Hello, World!\"

    ", - RedCloth.new('@puts "Hello, World!"@').to_html - assert_equal <<-BLOCKCODE.chomp, -
    puts \"Hello, World!\"
    - BLOCKCODE - RedCloth.new('bc. puts "Hello, World!"').to_html - end - - def test_for_redcloth_style - require 'coderay/for_redcloth' - assert_equal <<-BLOCKCODE.chomp, -
    puts \"Hello, World!\"
    - BLOCKCODE - RedCloth.new('bc{color: red}. puts "Hello, World!"').to_html - end - - def test_for_redcloth_escapes - require 'coderay/for_redcloth' - assert_equal '

    >

    ', - RedCloth.new('@[ruby]>@').to_html - assert_equal <<-BLOCKCODE.chomp, -
    -
    &
    -
    - BLOCKCODE - RedCloth.new('bc[ruby]. &').to_html - end - - def test_for_redcloth_escapes2 - require 'coderay/for_redcloth' - assert_equal "

    #include <test.h>

    ", - RedCloth.new('@[c]#include @').to_html - end - - # See http://jgarber.lighthouseapp.com/projects/13054/tickets/124-code-markup-does-not-allow-brackets. - def test_for_redcloth_false_positive - require 'coderay/for_redcloth' - assert_equal '

    [project]_dff.skjd

    ', - RedCloth.new('@[project]_dff.skjd@').to_html - # false positive, but expected behavior / known issue - assert_equal "

    _dff.skjd

    ", - RedCloth.new('@[ruby]_dff.skjd@').to_html - assert_equal <<-BLOCKCODE.chomp, -
    [project]_dff.skjd
    - BLOCKCODE - RedCloth.new('bc. [project]_dff.skjd').to_html - end - -end if defined? RedCloth \ No newline at end of file diff --git a/vendor/gems/coderay-0.9.7/test/functional/for_redcloth.rbc b/vendor/gems/coderay-0.9.7/test/functional/for_redcloth.rbc deleted file mode 100644 index 09a7fc84..00000000 --- a/vendor/gems/coderay-0.9.7/test/functional/for_redcloth.rbc +++ /dev/null @@ -1,1708 +0,0 @@ -!RBIX -0 -x -M -1 -n -n -x -10 -__script__ -i -249 -5 -7 -0 -64 -47 -49 -1 -1 -15 -99 -43 -2 -7 -3 -49 -4 -1 -7 -5 -64 -49 -6 -1 -15 -5 -7 -7 -64 -47 -49 -1 -1 -15 -26 -93 -0 -15 -29 -144 -0 -26 -93 -1 -15 -29 -55 -0 -7 -8 -98 -9 -1 -30 -8 -61 -25 -92 -1 -27 -8 -66 -15 -7 -10 -8 -67 -1 -9 -72 -1 -8 -80 -5 -7 -11 -64 -47 -49 -1 -1 -15 -26 -93 -2 -15 -29 -102 -0 -5 -7 -12 -64 -7 -13 -64 -47 -49 -14 -2 -30 -8 -129 -26 -93 -3 -15 -24 -13 -45 -15 -16 -12 -49 -17 -1 -10 -119 -8 -124 -15 -1 -25 -8 -129 -15 -92 -3 -27 -34 -92 -2 -27 -15 -5 -7 -18 -64 -47 -49 -1 -1 -30 -8 -178 -26 -93 -4 -15 -24 -13 -45 -19 -20 -12 -49 -17 -1 -10 -161 -8 -173 -15 -5 -7 -21 -64 -47 -49 -22 -1 -25 -8 -178 -15 -92 -4 -27 -34 -92 -0 -27 -15 -26 -93 -5 -15 -29 -197 -0 -7 -23 -98 -9 -1 -30 -8 -203 -25 -92 -5 -27 -8 -208 -15 -7 -10 -8 -209 -1 -9 -245 -99 -7 -24 -45 -25 -26 -43 -27 -43 -28 -65 -49 -29 -3 -13 -99 -12 -7 -30 -12 -7 -31 -12 -65 -12 -49 -32 -4 -15 -49 -30 -0 -8 -246 -1 -15 -2 -11 -I -c -I -0 -I -0 -I -0 -n -p -33 -s -9 -test/unit -x -7 -require -x -7 -Globals -x -2 -$: -x -2 -[] -s -3 -lib -x -2 -<< -s -7 -coderay -x -3 -Gem -x -16 -vm_const_defined -s -8 -constant -s -8 -rubygems -s -8 -RedCloth -s -8 ->= 4.0.3 -x -3 -gem -x -13 -StandardError -n -x -3 -=== -s -8 -redcloth -x -9 -LoadError -n -s -49 -RedCloth not found - skipping for_redcloth tests. -x -4 -warn -x -8 -RedCloth -x -9 -BasicTest -x -4 -Test -n -x -4 -Unit -x -8 -TestCase -x -10 -open_class -x -14 -__class_init__ -M -1 -n -n -x -9 -BasicTest -i -86 -5 -66 -99 -7 -0 -7 -1 -65 -67 -49 -2 -0 -49 -3 -4 -15 -99 -7 -4 -7 -5 -65 -67 -49 -2 -0 -49 -3 -4 -15 -99 -7 -6 -7 -7 -65 -67 -49 -2 -0 -49 -3 -4 -15 -99 -7 -8 -7 -9 -65 -67 -49 -2 -0 -49 -3 -4 -15 -99 -7 -10 -7 -11 -65 -67 -49 -2 -0 -49 -3 -4 -15 -99 -7 -12 -7 -13 -65 -67 -49 -2 -0 -49 -3 -4 -11 -I -5 -I -0 -I -0 -I -0 -n -p -14 -x -17 -test_for_redcloth -M -1 -n -n -x -17 -test_for_redcloth -i -96 -5 -7 -0 -64 -47 -49 -1 -1 -15 -5 -7 -2 -64 -45 -3 -4 -13 -71 -5 -47 -9 -37 -47 -49 -6 -0 -13 -7 -7 -64 -47 -49 -8 -1 -15 -8 -43 -7 -7 -64 -49 -5 -1 -49 -9 -0 -47 -49 -10 -2 -15 -5 -7 -11 -64 -49 -12 -0 -45 -3 -13 -13 -71 -5 -47 -9 -82 -47 -49 -6 -0 -13 -7 -14 -64 -47 -49 -8 -1 -15 -8 -88 -7 -14 -64 -49 -5 -1 -49 -9 -0 -47 -49 -10 -2 -11 -I -5 -I -0 -I -0 -I -0 -n -p -15 -s -20 -coderay/for_redcloth -x -7 -require -s -221 -

    puts "Hello, World!"

    -x -8 -RedCloth -n -x -3 -new -x -8 -allocate -s -28 -@[ruby]puts "Hello, World!"@ -x -10 -initialize -x -7 -to_html -x -12 -assert_equal -s -252 -
    -
    puts "Hello, World!"
    -
    - -x -5 -chomp -n -s -30 -bc[ruby]. puts "Hello, World!" -p -17 -I -0 -I -f -I -0 -I -10 -I -9 -I -11 -I -d -I -12 -I -2e -I -11 -I -33 -I -13 -I -3a -I -18 -I -5b -I -13 -I -60 -x -62 -/Users/murphy/ruby/coderay-0.9/test/functional/for_redcloth.rb -p -0 -x -17 -method_visibility -x -15 -add_defn_method -x -25 -test_for_redcloth_no_lang -M -1 -n -n -x -25 -test_for_redcloth_no_lang -i -96 -5 -7 -0 -64 -47 -49 -1 -1 -15 -5 -7 -2 -64 -45 -3 -4 -13 -71 -5 -47 -9 -37 -47 -49 -6 -0 -13 -7 -7 -64 -47 -49 -8 -1 -15 -8 -43 -7 -7 -64 -49 -5 -1 -49 -9 -0 -47 -49 -10 -2 -15 -5 -7 -11 -64 -49 -12 -0 -45 -3 -13 -13 -71 -5 -47 -9 -82 -47 -49 -6 -0 -13 -7 -14 -64 -47 -49 -8 -1 -15 -8 -88 -7 -14 -64 -49 -5 -1 -49 -9 -0 -47 -49 -10 -2 -11 -I -5 -I -0 -I -0 -I -0 -n -p -15 -s -20 -coderay/for_redcloth -x -7 -require -s -40 -

    puts "Hello, World!"

    -x -8 -RedCloth -n -x -3 -new -x -8 -allocate -s -22 -@puts "Hello, World!"@ -x -10 -initialize -x -7 -to_html -x -12 -assert_equal -s -45 -
    puts "Hello, World!"
    - -x -5 -chomp -n -s -24 -bc. puts "Hello, World!" -p -17 -I -0 -I -1b -I -0 -I -1c -I -9 -I -1d -I -d -I -1e -I -2e -I -1d -I -33 -I -1f -I -3a -I -22 -I -5b -I -1f -I -60 -x -62 -/Users/murphy/ruby/coderay-0.9/test/functional/for_redcloth.rb -p -0 -x -23 -test_for_redcloth_style -M -1 -n -n -x -23 -test_for_redcloth_style -i -54 -5 -7 -0 -64 -47 -49 -1 -1 -15 -5 -7 -2 -64 -49 -3 -0 -45 -4 -5 -13 -71 -6 -47 -9 -40 -47 -49 -7 -0 -13 -7 -8 -64 -47 -49 -9 -1 -15 -8 -46 -7 -8 -64 -49 -6 -1 -49 -10 -0 -47 -49 -11 -2 -11 -I -5 -I -0 -I -0 -I -0 -n -p -12 -s -20 -coderay/for_redcloth -x -7 -require -s -85 -
    puts "Hello, World!"
    - -x -5 -chomp -x -8 -RedCloth -n -x -3 -new -x -8 -allocate -s -36 -bc{color: red}. puts "Hello, World!" -x -10 -initialize -x -7 -to_html -x -12 -assert_equal -p -11 -I -0 -I -25 -I -0 -I -26 -I -9 -I -27 -I -10 -I -2a -I -31 -I -27 -I -36 -x -62 -/Users/murphy/ruby/coderay-0.9/test/functional/for_redcloth.rb -p -0 -x -25 -test_for_redcloth_escapes -M -1 -n -n -x -25 -test_for_redcloth_escapes -i -96 -5 -7 -0 -64 -47 -49 -1 -1 -15 -5 -7 -2 -64 -45 -3 -4 -13 -71 -5 -47 -9 -37 -47 -49 -6 -0 -13 -7 -7 -64 -47 -49 -8 -1 -15 -8 -43 -7 -7 -64 -49 -5 -1 -49 -9 -0 -47 -49 -10 -2 -15 -5 -7 -11 -64 -49 -12 -0 -45 -3 -13 -13 -71 -5 -47 -9 -82 -47 -49 -6 -0 -13 -7 -14 -64 -47 -49 -8 -1 -15 -8 -88 -7 -14 -64 -49 -5 -1 -49 -9 -0 -47 -49 -10 -2 -11 -I -5 -I -0 -I -0 -I -0 -n -p -15 -s -20 -coderay/for_redcloth -x -7 -require -s -52 -

    >

    -x -8 -RedCloth -n -x -3 -new -x -8 -allocate -s -9 -@[ruby]>@ -x -10 -initialize -x -7 -to_html -x -12 -assert_equal -s -84 -
    -
    &
    -
    - -x -5 -chomp -n -s -11 -bc[ruby]. & -p -17 -I -0 -I -2d -I -0 -I -2e -I -9 -I -2f -I -d -I -30 -I -2e -I -2f -I -33 -I -31 -I -3a -I -36 -I -5b -I -31 -I -60 -x -62 -/Users/murphy/ruby/coderay-0.9/test/functional/for_redcloth.rb -p -0 -x -26 -test_for_redcloth_escapes2 -M -1 -n -n -x -26 -test_for_redcloth_escapes2 -i -51 -5 -7 -0 -64 -47 -49 -1 -1 -15 -5 -7 -2 -64 -45 -3 -4 -13 -71 -5 -47 -9 -37 -47 -49 -6 -0 -13 -7 -7 -64 -47 -49 -8 -1 -15 -8 -43 -7 -7 -64 -49 -5 -1 -49 -9 -0 -47 -49 -10 -2 -11 -I -5 -I -0 -I -0 -I -0 -n -p -11 -s -20 -coderay/for_redcloth -x -7 -require -s -149 -

    #include <test.h>

    -x -8 -RedCloth -n -x -3 -new -x -8 -allocate -s -22 -@[c]#include @ -x -10 -initialize -x -7 -to_html -x -12 -assert_equal -p -11 -I -0 -I -39 -I -0 -I -3a -I -9 -I -3b -I -d -I -3c -I -2e -I -3b -I -33 -x -62 -/Users/murphy/ruby/coderay-0.9/test/functional/for_redcloth.rb -p -0 -x -32 -test_for_redcloth_false_positive -M -1 -n -n -x -32 -test_for_redcloth_false_positive -i -138 -5 -7 -0 -64 -47 -49 -1 -1 -15 -5 -7 -2 -64 -45 -3 -4 -13 -71 -5 -47 -9 -37 -47 -49 -6 -0 -13 -7 -7 -64 -47 -49 -8 -1 -15 -8 -43 -7 -7 -64 -49 -5 -1 -49 -9 -0 -47 -49 -10 -2 -15 -5 -7 -11 -64 -45 -3 -12 -13 -71 -5 -47 -9 -79 -47 -49 -6 -0 -13 -7 -13 -64 -47 -49 -8 -1 -15 -8 -85 -7 -13 -64 -49 -5 -1 -49 -9 -0 -47 -49 -10 -2 -15 -5 -7 -14 -64 -49 -15 -0 -45 -3 -16 -13 -71 -5 -47 -9 -124 -47 -49 -6 -0 -13 -7 -17 -64 -47 -49 -8 -1 -15 -8 -130 -7 -17 -64 -49 -5 -1 -49 -9 -0 -47 -49 -10 -2 -11 -I -5 -I -0 -I -0 -I -0 -n -p -18 -s -20 -coderay/for_redcloth -x -7 -require -s -38 -

    [project]_dff.skjd

    -x -8 -RedCloth -n -x -3 -new -x -8 -allocate -s -20 -@[project]_dff.skjd@ -x -10 -initialize -x -7 -to_html -x -12 -assert_equal -s -57 -

    _dff.skjd

    -n -s -17 -@[ruby]_dff.skjd@ -s -43 -
    [project]_dff.skjd
    - -x -5 -chomp -n -s -22 -bc. [project]_dff.skjd -p -23 -I -0 -I -40 -I -0 -I -41 -I -9 -I -42 -I -d -I -43 -I -2e -I -42 -I -33 -I -45 -I -37 -I -46 -I -58 -I -45 -I -5d -I -47 -I -64 -I -4a -I -85 -I -47 -I -8a -x -62 -/Users/murphy/ruby/coderay-0.9/test/functional/for_redcloth.rb -p -0 -p -13 -I -2 -I -f -I -10 -I -1b -I -1e -I -25 -I -2c -I -2d -I -3a -I -39 -I -48 -I -40 -I -56 -x -62 -/Users/murphy/ruby/coderay-0.9/test/functional/for_redcloth.rb -p -0 -x -13 -attach_method -p -23 -I -0 -I -1 -I -9 -I -2 -I -18 -I -3 -I -21 -I -6 -I -51 -I -7 -I -85 -I -8 -I -95 -I -9 -I -a2 -I -a -I -b6 -I -4d -I -d3 -I -d -I -f5 -I -4d -I -f9 -x -62 -/Users/murphy/ruby/coderay-0.9/test/functional/for_redcloth.rb -p -0 diff --git a/vendor/gems/coderay-0.9.7/test/functional/load_plugin_scanner.rb b/vendor/gems/coderay-0.9.7/test/functional/load_plugin_scanner.rb deleted file mode 100644 index 25bbc93a..00000000 --- a/vendor/gems/coderay-0.9.7/test/functional/load_plugin_scanner.rb +++ /dev/null @@ -1,11 +0,0 @@ -require 'test/unit' -require 'coderay' - -class PluginScannerTest < Test::Unit::TestCase - - def test_load - require File.join(File.dirname(__FILE__), 'vhdl') - assert_equal 'VHDL', CodeRay.scanner(:vhdl).class.name - end - -end diff --git a/vendor/gems/coderay-0.9.7/test/functional/load_plugin_scanner.rbc b/vendor/gems/coderay-0.9.7/test/functional/load_plugin_scanner.rbc deleted file mode 100644 index ef61d340..00000000 --- a/vendor/gems/coderay-0.9.7/test/functional/load_plugin_scanner.rbc +++ /dev/null @@ -1,317 +0,0 @@ -!RBIX -0 -x -M -1 -n -n -x -10 -__script__ -i -53 -5 -7 -0 -64 -47 -49 -1 -1 -15 -5 -7 -2 -64 -47 -49 -1 -1 -15 -99 -7 -3 -45 -4 -5 -43 -6 -43 -7 -65 -49 -8 -3 -13 -99 -12 -7 -9 -12 -7 -10 -12 -65 -12 -49 -11 -4 -15 -49 -9 -0 -15 -2 -11 -I -6 -I -0 -I -0 -I -0 -n -p -12 -s -9 -test/unit -x -7 -require -s -7 -coderay -x -17 -PluginScannerTest -x -4 -Test -n -x -4 -Unit -x -8 -TestCase -x -10 -open_class -x -14 -__class_init__ -M -1 -n -n -x -17 -PluginScannerTest -i -16 -5 -66 -99 -7 -0 -7 -1 -65 -67 -49 -2 -0 -49 -3 -4 -11 -I -5 -I -0 -I -0 -I -0 -n -p -4 -x -9 -test_load -M -1 -n -n -x -9 -test_load -i -48 -5 -45 -0 -1 -45 -0 -2 -65 -49 -3 -0 -49 -4 -1 -7 -5 -64 -49 -6 -2 -47 -49 -7 -1 -15 -5 -7 -8 -64 -45 -9 -10 -7 -11 -49 -12 -1 -49 -13 -0 -49 -14 -0 -47 -49 -15 -2 -11 -I -4 -I -0 -I -0 -I -0 -n -p -16 -x -4 -File -n -n -x -11 -active_path -x -7 -dirname -s -4 -vhdl -x -4 -join -x -7 -require -s -4 -VHDL -x -7 -CodeRay -n -x -4 -vhdl -x -7 -scanner -x -5 -class -x -4 -name -x -12 -assert_equal -p -7 -I -0 -I -6 -I -0 -I -7 -I -19 -I -8 -I -30 -x -69 -/Users/murphy/ruby/coderay-0.9/test/functional/load_plugin_scanner.rb -p -0 -x -17 -method_visibility -x -15 -add_defn_method -p -3 -I -2 -I -6 -I -10 -x -69 -/Users/murphy/ruby/coderay-0.9/test/functional/load_plugin_scanner.rb -p -0 -x -13 -attach_method -p -7 -I -0 -I -1 -I -9 -I -2 -I -12 -I -4 -I -35 -x -69 -/Users/murphy/ruby/coderay-0.9/test/functional/load_plugin_scanner.rb -p -0 diff --git a/vendor/gems/coderay-0.9.7/test/functional/suite.rb b/vendor/gems/coderay-0.9.7/test/functional/suite.rb deleted file mode 100644 index 97dd330d..00000000 --- a/vendor/gems/coderay-0.9.7/test/functional/suite.rb +++ /dev/null @@ -1,12 +0,0 @@ -require 'test/unit' - -MYDIR = File.dirname(__FILE__) - -$:.unshift 'lib' -require 'coderay' -puts "Running basic CodeRay #{CodeRay::VERSION} tests..." - -suite = %w(basic load_plugin_scanner word_list) -for test_case in suite - load File.join(MYDIR, test_case + '.rb') -end diff --git a/vendor/gems/coderay-0.9.7/test/functional/suite.rbc b/vendor/gems/coderay-0.9.7/test/functional/suite.rbc deleted file mode 100644 index 977354ae..00000000 --- a/vendor/gems/coderay-0.9.7/test/functional/suite.rbc +++ /dev/null @@ -1,322 +0,0 @@ -!RBIX -0 -x -M -1 -n -n -x -10 -__script__ -i -95 -5 -7 -0 -64 -47 -49 -1 -1 -15 -65 -7 -2 -45 -3 -4 -65 -49 -5 -0 -49 -6 -1 -49 -7 -2 -15 -99 -43 -8 -7 -9 -49 -10 -1 -7 -11 -64 -49 -12 -1 -15 -5 -7 -13 -64 -47 -49 -1 -1 -15 -5 -7 -14 -45 -15 -16 -43 -17 -47 -49 -18 -0 -7 -19 -63 -3 -47 -49 -20 -1 -15 -7 -21 -64 -7 -22 -64 -7 -23 -64 -35 -3 -19 -0 -15 -20 -0 -56 -24 -50 -25 -0 -15 -2 -11 -I -6 -I -2 -I -0 -I -0 -n -p -26 -s -9 -test/unit -x -7 -require -x -5 -MYDIR -x -4 -File -n -x -11 -active_path -x -7 -dirname -x -9 -const_set -x -7 -Globals -x -2 -$: -x -2 -[] -s -3 -lib -x -2 -<< -s -7 -coderay -s -22 -Running basic CodeRay -x -7 -CodeRay -n -x -7 -VERSION -x -4 -to_s -s -9 - tests... -x -4 -puts -s -5 -basic -s -19 -load_plugin_scanner -s -9 -word_list -M -1 -p -2 -x -9 -for_block -t -n -x -9 -__block__ -i -28 -57 -22 -1 -1 -15 -5 -45 -0 -1 -45 -2 -3 -21 -1 -1 -7 -4 -64 -81 -5 -49 -6 -2 -47 -49 -7 -1 -11 -I -6 -I -0 -I -1 -I -1 -n -p -8 -x -4 -File -n -x -5 -MYDIR -n -s -3 -.rb -x -1 -+ -x -4 -join -x -4 -load -p -5 -I -0 -I -a -I -5 -I -b -I -1c -x -55 -/Users/murphy/ruby/coderay-0.9/test/functional/suite.rb -p -0 -x -4 -each -p -15 -I -0 -I -1 -I -9 -I -3 -I -1a -I -5 -I -29 -I -6 -I -32 -I -7 -I -47 -I -9 -I -55 -I -a -I -5f -x -55 -/Users/murphy/ruby/coderay-0.9/test/functional/suite.rb -p -2 -x -5 -suite -x -9 -test_case diff --git a/vendor/gems/coderay-0.9.7/test/functional/vhdl.rb b/vendor/gems/coderay-0.9.7/test/functional/vhdl.rb deleted file mode 100644 index c7e38243..00000000 --- a/vendor/gems/coderay-0.9.7/test/functional/vhdl.rb +++ /dev/null @@ -1,126 +0,0 @@ -class VHDL < CodeRay::Scanners::Scanner - - register_for :vhdl - - RESERVED_WORDS = [ - 'access','after','alias','all','assert','architecture','begin', - 'block','body','buffer','bus','case','component','configuration','constant', - 'disconnect','downto','else','elsif','end','entity','exit','file','for', - 'function','generate','generic','group','guarded','if','impure','in', - 'inertial','inout','is','label','library','linkage','literal','loop', - 'map','new','next','null','of','on','open','others','out','package', - 'port','postponed','procedure','process','pure','range','record','register', - 'reject','report','return','select','severity','signal','shared','subtype', - 'then','to','transport','type','unaffected','units','until','use','variable', - 'wait','when','while','with','note','warning','error','failure','and', - 'or','xor','not','nor', - 'array' - ] - - PREDEFINED_TYPES = [ - 'bit','bit_vector','character','boolean','integer','real','time','string', - 'severity_level','positive','natural','signed','unsigned','line','text', - 'std_logic','std_logic_vector','std_ulogic','std_ulogic_vector','qsim_state', - 'qsim_state_vector','qsim_12state','qsim_12state_vector','qsim_strength', - 'mux_bit','mux_vector','reg_bit','reg_vector','wor_bit','wor_vector' - ] - - PREDEFINED_CONSTANTS = [ - - ] - - IDENT_KIND = CodeRay::CaseIgnoringWordList.new(:ident). - add(RESERVED_WORDS, :reserved). - add(PREDEFINED_TYPES, :pre_type). - add(PREDEFINED_CONSTANTS, :pre_constant) - - ESCAPE = / [rbfntv\n\\'"] | x[a-fA-F0-9]{1,2} | [0-7]{1,3} /x - UNICODE_ESCAPE = / u[a-fA-F0-9]{4} | U[a-fA-F0-9]{8} /x - - def scan_tokens tokens, options - - state = :initial - - until eos? - - kind = nil - match = nil - - case state - - when :initial - - if scan(/ \s+ | \\\n /x) - kind = :space - - elsif scan(/-- .*/x) - kind = :comment - - elsif scan(/ [-+*\/=<>?:;,!&^|()\[\]{}~%]+ | \.(?!\d) /x) - kind = :operator - - elsif match = scan(/ [A-Za-z_][A-Za-z_0-9]* /x) - kind = IDENT_KIND[match.downcase] - - elsif match = scan(/[a-z]?"/i) - tokens << [:open, :string] - state = :string - kind = :delimiter - - elsif scan(/ L?' (?: [^\'\n\\] | \\ #{ESCAPE} )? '? /ox) - kind = :char - - elsif scan(/(?:\d+)(?![.eEfF])/) - kind = :integer - - elsif scan(/\d[fF]?|\d*\.\d+(?:[eE][+-]?\d+)?[fF]?|\d+[eE][+-]?\d+[fF]?/) - kind = :float - - else - getch - kind = :error - - end - - when :string - if scan(/[^\\\n"]+/) - kind = :content - elsif scan(/"/) - tokens << ['"', :delimiter] - tokens << [:close, :string] - state = :initial - next - elsif scan(/ \\ (?: #{ESCAPE} | #{UNICODE_ESCAPE} ) /mox) - kind = :char - elsif scan(/ \\ | $ /x) - tokens << [:close, :string] - kind = :error - state = :initial - else - raise_inspect "else case \" reached; %p not handled." % peek(1), tokens - end - - else - raise_inspect 'Unknown state', tokens - - end - - match ||= matched - if $DEBUG and not kind - raise_inspect 'Error token %p in line %d' % - [[match, kind], line], tokens - end - raise_inspect 'Empty token', tokens unless match - - tokens << [match, kind] - - end - - if state == :string - tokens << [:close, :string] - end - - tokens - end - -end diff --git a/vendor/gems/coderay-0.9.7/test/functional/vhdl.rbc b/vendor/gems/coderay-0.9.7/test/functional/vhdl.rbc deleted file mode 100644 index 80d01bf6..00000000 --- a/vendor/gems/coderay-0.9.7/test/functional/vhdl.rbc +++ /dev/null @@ -1,2334 +0,0 @@ -!RBIX -0 -x -M -1 -n -n -x -10 -__script__ -i -35 -99 -7 -0 -45 -1 -2 -43 -3 -43 -4 -65 -49 -5 -3 -13 -99 -12 -7 -6 -12 -7 -7 -12 -65 -12 -49 -8 -4 -15 -49 -6 -0 -15 -2 -11 -I -6 -I -0 -I -0 -I -0 -n -p -9 -x -4 -VHDL -x -7 -CodeRay -n -x -8 -Scanners -x -7 -Scanner -x -10 -open_class -x -14 -__class_init__ -M -1 -n -n -x -4 -VHDL -i -519 -5 -66 -5 -7 -0 -47 -49 -1 -1 -15 -65 -7 -2 -7 -3 -64 -7 -4 -64 -7 -5 -64 -7 -6 -64 -7 -7 -64 -7 -8 -64 -7 -9 -64 -7 -10 -64 -7 -11 -64 -7 -12 -64 -7 -13 -64 -7 -14 -64 -7 -15 -64 -7 -16 -64 -7 -17 -64 -7 -18 -64 -7 -19 -64 -7 -20 -64 -7 -21 -64 -7 -22 -64 -7 -23 -64 -7 -24 -64 -7 -25 -64 -7 -26 -64 -7 -27 -64 -7 -28 -64 -7 -29 -64 -7 -30 -64 -7 -31 -64 -7 -32 -64 -7 -33 -64 -7 -34 -64 -7 -35 -64 -7 -36 -64 -7 -37 -64 -7 -38 -64 -7 -39 -64 -7 -40 -64 -7 -41 -64 -7 -42 -64 -7 -43 -64 -7 -44 -64 -7 -45 -64 -7 -46 -64 -7 -47 -64 -7 -48 -64 -7 -49 -64 -7 -50 -64 -7 -51 -64 -7 -52 -64 -7 -53 -64 -7 -54 -64 -7 -55 -64 -7 -56 -64 -7 -57 -64 -7 -58 -64 -7 -59 -64 -7 -60 -64 -7 -61 -64 -7 -62 -64 -7 -63 -64 -7 -64 -64 -7 -65 -64 -7 -66 -64 -7 -67 -64 -7 -68 -64 -7 -69 -64 -7 -70 -64 -7 -71 -64 -7 -72 -64 -7 -73 -64 -7 -74 -64 -7 -75 -64 -7 -76 -64 -7 -77 -64 -7 -78 -64 -7 -79 -64 -7 -80 -64 -7 -81 -64 -7 -82 -64 -7 -83 -64 -7 -84 -64 -7 -85 -64 -7 -86 -64 -7 -87 -64 -7 -88 -64 -7 -89 -64 -7 -90 -64 -7 -91 -64 -35 -89 -49 -92 -2 -15 -65 -7 -93 -7 -94 -64 -7 -95 -64 -7 -96 -64 -7 -97 -64 -7 -98 -64 -7 -99 -64 -7 -100 -64 -7 -101 -64 -7 -102 -64 -7 -103 -64 -7 -104 -64 -7 -105 -64 -7 -106 -64 -7 -107 -64 -7 -108 -64 -7 -109 -64 -7 -110 -64 -7 -111 -64 -7 -112 -64 -7 -113 -64 -7 -114 -64 -7 -115 -64 -7 -116 -64 -7 -117 -64 -7 -118 -64 -7 -119 -64 -7 -120 -64 -7 -121 -64 -7 -122 -64 -7 -123 -64 -35 -30 -49 -92 -2 -15 -65 -7 -124 -35 -0 -49 -92 -2 -15 -65 -7 -125 -45 -126 -127 -43 -128 -13 -71 -129 -47 -9 -422 -47 -49 -130 -0 -13 -7 -131 -47 -49 -132 -1 -15 -8 -427 -7 -131 -49 -129 -1 -45 -2 -133 -7 -134 -49 -135 -2 -45 -93 -136 -7 -137 -49 -135 -2 -45 -124 -138 -7 -139 -49 -135 -2 -49 -92 -2 -15 -65 -7 -140 -7 -141 -13 -70 -9 -476 -15 -44 -43 -142 -7 -143 -80 -49 -129 -2 -6 -141 -49 -92 -2 -15 -65 -7 -144 -7 -145 -13 -70 -9 -501 -15 -44 -43 -142 -7 -146 -80 -49 -129 -2 -6 -145 -49 -92 -2 -15 -99 -7 -147 -7 -148 -65 -67 -49 -149 -0 -49 -150 -4 -11 -I -5b -I -0 -I -0 -I -0 -n -p -151 -x -4 -vhdl -x -12 -register_for -x -14 -RESERVED_WORDS -s -6 -access -s -5 -after -s -5 -alias -s -3 -all -s -6 -assert -s -12 -architecture -s -5 -begin -s -5 -block -s -4 -body -s -6 -buffer -s -3 -bus -s -4 -case -s -9 -component -s -13 -configuration -s -8 -constant -s -10 -disconnect -s -6 -downto -s -4 -else -s -5 -elsif -s -3 -end -s -6 -entity -s -4 -exit -s -4 -file -s -3 -for -s -8 -function -s -8 -generate -s -7 -generic -s -5 -group -s -7 -guarded -s -2 -if -s -6 -impure -s -2 -in -s -8 -inertial -s -5 -inout -s -2 -is -s -5 -label -s -7 -library -s -7 -linkage -s -7 -literal -s -4 -loop -s -3 -map -s -3 -new -s -4 -next -s -4 -null -s -2 -of -s -2 -on -s -4 -open -s -6 -others -s -3 -out -s -7 -package -s -4 -port -s -9 -postponed -s -9 -procedure -s -7 -process -s -4 -pure -s -5 -range -s -6 -record -s -8 -register -s -6 -reject -s -6 -report -s -6 -return -s -6 -select -s -8 -severity -s -6 -signal -s -6 -shared -s -7 -subtype -s -4 -then -s -2 -to -s -9 -transport -s -4 -type -s -10 -unaffected -s -5 -units -s -5 -until -s -3 -use -s -8 -variable -s -4 -wait -s -4 -when -s -5 -while -s -4 -with -s -4 -note -s -7 -warning -s -5 -error -s -7 -failure -s -3 -and -s -2 -or -s -3 -xor -s -3 -not -s -3 -nor -s -5 -array -x -9 -const_set -x -16 -PREDEFINED_TYPES -s -3 -bit -s -10 -bit_vector -s -9 -character -s -7 -boolean -s -7 -integer -s -4 -real -s -4 -time -s -6 -string -s -14 -severity_level -s -8 -positive -s -7 -natural -s -6 -signed -s -8 -unsigned -s -4 -line -s -4 -text -s -9 -std_logic -s -16 -std_logic_vector -s -10 -std_ulogic -s -17 -std_ulogic_vector -s -10 -qsim_state -s -17 -qsim_state_vector -s -12 -qsim_12state -s -19 -qsim_12state_vector -s -13 -qsim_strength -s -7 -mux_bit -s -10 -mux_vector -s -7 -reg_bit -s -10 -reg_vector -s -7 -wor_bit -s -10 -wor_vector -x -20 -PREDEFINED_CONSTANTS -x -10 -IDENT_KIND -x -7 -CodeRay -n -x -20 -CaseIgnoringWordList -x -3 -new -x -8 -allocate -x -5 -ident -x -10 -initialize -n -x -8 -reserved -x -3 -add -n -x -8 -pre_type -n -x -12 -pre_constant -x -6 -ESCAPE -n -x -6 -Regexp -s -49 - [rbfntv\n\\'"] | x[a-fA-F0-9]{1,2} | [0-7]{1,3} -x -14 -UNICODE_ESCAPE -n -s -35 - u[a-fA-F0-9]{4} | U[a-fA-F0-9]{8} -x -11 -scan_tokens -M -1 -n -n -x -11 -scan_tokens -i -688 -7 -0 -19 -2 -15 -5 -47 -49 -1 -0 -10 -660 -1 -19 -3 -15 -1 -19 -4 -15 -20 -2 -13 -7 -0 -12 -49 -2 -1 -9 -331 -15 -5 -7 -3 -13 -70 -9 -51 -15 -44 -43 -4 -7 -5 -80 -49 -6 -2 -6 -3 -47 -49 -7 -1 -9 -63 -7 -8 -19 -3 -8 -329 -5 -7 -9 -13 -70 -9 -82 -15 -44 -43 -4 -7 -10 -80 -49 -6 -2 -6 -9 -47 -49 -7 -1 -9 -94 -7 -11 -19 -3 -8 -329 -5 -7 -12 -13 -70 -9 -113 -15 -44 -43 -4 -7 -13 -80 -49 -6 -2 -6 -12 -47 -49 -7 -1 -9 -125 -7 -14 -19 -3 -8 -329 -5 -7 -15 -13 -70 -9 -144 -15 -44 -43 -4 -7 -16 -80 -49 -6 -2 -6 -15 -47 -49 -7 -1 -19 -4 -9 -167 -45 -17 -18 -20 -4 -49 -19 -0 -49 -20 -1 -19 -3 -8 -329 -5 -7 -21 -13 -70 -9 -186 -15 -44 -43 -4 -7 -22 -79 -49 -6 -2 -6 -21 -47 -49 -7 -1 -19 -4 -9 -217 -20 -0 -7 -23 -7 -24 -35 -2 -49 -25 -1 -15 -7 -24 -19 -2 -15 -7 -26 -19 -3 -8 -329 -5 -7 -27 -13 -70 -9 -247 -15 -44 -43 -4 -7 -28 -45 -29 -30 -47 -49 -31 -0 -7 -32 -63 -3 -80 -49 -6 -2 -6 -27 -47 -49 -7 -1 -9 -259 -7 -33 -19 -3 -8 -329 -5 -7 -34 -13 -70 -9 -278 -15 -44 -43 -4 -7 -35 -78 -49 -6 -2 -6 -34 -47 -49 -7 -1 -9 -290 -7 -36 -19 -3 -8 -329 -5 -7 -37 -13 -70 -9 -309 -15 -44 -43 -4 -7 -38 -78 -49 -6 -2 -6 -37 -47 -49 -7 -1 -9 -321 -7 -39 -19 -3 -8 -329 -5 -48 -40 -15 -7 -41 -19 -3 -8 -564 -13 -7 -24 -12 -49 -2 -1 -9 -553 -15 -5 -7 -42 -13 -70 -9 -360 -15 -44 -43 -4 -7 -43 -78 -49 -6 -2 -6 -42 -47 -49 -7 -1 -9 -372 -7 -44 -19 -3 -8 -551 -5 -7 -45 -13 -70 -9 -391 -15 -44 -43 -4 -7 -46 -78 -49 -6 -2 -6 -45 -47 -49 -7 -1 -9 -432 -20 -0 -7 -46 -64 -7 -26 -35 -2 -49 -25 -1 -15 -20 -0 -7 -47 -7 -24 -35 -2 -49 -25 -1 -15 -7 -0 -19 -2 -15 -1 -8 -656 -8 -551 -5 -7 -48 -13 -70 -9 -472 -15 -44 -43 -4 -7 -49 -45 -29 -50 -47 -49 -31 -0 -7 -51 -45 -52 -53 -47 -49 -31 -0 -7 -54 -63 -5 -4 -6 -49 -6 -2 -6 -48 -47 -49 -7 -1 -9 -484 -7 -33 -19 -3 -8 -551 -5 -7 -55 -13 -70 -9 -503 -15 -44 -43 -4 -7 -56 -80 -49 -6 -2 -6 -55 -47 -49 -7 -1 -9 -532 -20 -0 -7 -47 -7 -24 -35 -2 -49 -25 -1 -15 -7 -41 -19 -3 -15 -7 -0 -19 -2 -8 -551 -5 -7 -57 -64 -5 -79 -47 -49 -58 -1 -49 -59 -1 -20 -0 -47 -49 -60 -2 -8 -564 -15 -5 -7 -61 -64 -20 -0 -47 -49 -60 -2 -15 -20 -4 -13 -10 -576 -15 -5 -48 -62 -19 -4 -15 -99 -43 -63 -7 -64 -49 -20 -1 -13 -9 -597 -15 -20 -3 -10 -596 -2 -8 -597 -3 -9 -625 -5 -7 -65 -64 -20 -4 -20 -3 -35 -2 -5 -48 -66 -35 -2 -49 -59 -1 -20 -0 -47 -49 -60 -2 -8 -626 -1 -15 -20 -4 -9 -634 -1 -8 -644 -5 -7 -67 -64 -20 -0 -47 -49 -60 -2 -15 -20 -0 -20 -4 -20 -3 -35 -2 -49 -25 -1 -15 -68 -8 -5 -1 -15 -20 -2 -7 -24 -83 -68 -9 -683 -20 -0 -7 -47 -7 -24 -35 -2 -49 -25 -1 -8 -684 -1 -15 -20 -0 -11 -I -c -I -5 -I -2 -I -2 -n -p -69 -x -7 -initial -x -4 -eos? -x -3 -=== -n -x -6 -Regexp -s -12 - \s+ | \\\n -x -3 -new -x -4 -scan -x -5 -space -n -s -5 --- .* -x -7 -comment -n -s -42 - [-+*\/=<>?:;,!&^|()\[\]{}~%]+ | \.(?!\d) -x -8 -operator -n -s -24 - [A-Za-z_][A-Za-z_0-9]* -x -10 -IDENT_KIND -n -x -8 -downcase -x -2 -[] -n -s -7 -[a-z]?" -x -4 -open -x -6 -string -x -2 -<< -x -9 -delimiter -n -s -24 - L?' (?: [^\'\n\\] | \\ -x -6 -ESCAPE -n -x -4 -to_s -s -7 - )? '? -x -4 -char -n -s -18 -(?:\d+)(?![.eEfF]) -x -7 -integer -n -s -59 -\d[fF]?|\d*\.\d+(?:[eE][+-]?\d+)?[fF]?|\d+[eE][+-]?\d+[fF]? -x -5 -float -x -5 -getch -x -5 -error -n -s -9 -[^\\\n"]+ -x -7 -content -n -s -1 -" -x -5 -close -n -s -8 - \\ (?: -n -s -3 - | -x -14 -UNICODE_ESCAPE -n -s -3 - ) -n -s -8 - \\ | $ -s -36 -else case " reached; %p not handled. -x -4 -peek -x -1 -% -x -13 -raise_inspect -s -13 -Unknown state -x -7 -matched -x -7 -Globals -x -6 -$DEBUG -s -25 -Error token %p in line %d -x -4 -line -s -11 -Empty token -x -2 -== -p -111 -I -0 -I -28 -I -0 -I -2a -I -5 -I -2c -I -c -I -2e -I -10 -I -2f -I -14 -I -31 -I -17 -I -33 -I -20 -I -35 -I -39 -I -36 -I -3f -I -38 -I -58 -I -39 -I -5e -I -3b -I -77 -I -3c -I -7d -I -3e -I -98 -I -3f -I -a7 -I -41 -I -c2 -I -42 -I -ce -I -43 -I -d3 -I -44 -I -d9 -I -46 -I -fd -I -47 -I -103 -I -49 -I -11c -I -4a -I -122 -I -4c -I -13b -I -4d -I -141 -I -50 -I -145 -I -51 -I -14c -I -55 -I -155 -I -56 -I -16e -I -57 -I -174 -I -58 -I -18d -I -59 -I -19a -I -5a -I -1a6 -I -5b -I -1ab -I -5c -I -1b0 -I -5d -I -1de -I -5e -I -1e4 -I -5f -I -1fd -I -60 -I -209 -I -61 -I -20e -I -62 -I -214 -I -64 -I -22a -I -68 -I -235 -I -6c -I -241 -I -6d -I -257 -I -6f -I -258 -I -6e -I -25b -I -6f -I -271 -I -6d -I -273 -I -71 -I -285 -I -73 -I -296 -I -77 -I -29e -I -78 -I -2ab -I -77 -I -2ad -I -7b -I -2b0 -x -54 -/Users/murphy/ruby/coderay-0.9/test/functional/vhdl.rb -p -5 -x -6 -tokens -x -7 -options -x -5 -state -x -4 -kind -x -5 -match -x -17 -method_visibility -x -15 -add_defn_method -p -65 -I -2 -I -3 -I -a -I -5 -I -d -I -6 -I -22 -I -7 -I -3a -I -8 -I -55 -I -9 -I -6d -I -a -I -85 -I -b -I -a3 -I -c -I -bb -I -d -I -d3 -I -e -I -ee -I -f -I -109 -I -10 -I -115 -I -11 -I -11e -I -14 -I -121 -I -15 -I -139 -I -16 -I -14e -I -17 -I -15d -I -18 -I -169 -I -19 -I -181 -I -1c -I -184 -I -1e -I -18a -I -20 -I -1ab -I -21 -I -1b0 -I -20 -I -1b3 -I -22 -I -1b8 -I -20 -I -1bb -I -23 -I -1c0 -I -20 -I -1c7 -I -25 -I -1e0 -I -26 -I -1f9 -I -28 -I -207 -x -54 -/Users/murphy/ruby/coderay-0.9/test/functional/vhdl.rb -p -0 -x -13 -attach_method -p -3 -I -0 -I -1 -I -23 -x -54 -/Users/murphy/ruby/coderay-0.9/test/functional/vhdl.rb -p -0 diff --git a/vendor/gems/coderay-0.9.7/test/functional/word_list.rb b/vendor/gems/coderay-0.9.7/test/functional/word_list.rb deleted file mode 100644 index 84d6e9e7..00000000 --- a/vendor/gems/coderay-0.9.7/test/functional/word_list.rb +++ /dev/null @@ -1,79 +0,0 @@ -require 'test/unit' -require 'coderay' - -class WordListTest < Test::Unit::TestCase - - include CodeRay - - # define word arrays - RESERVED_WORDS = %w[ - asm break case continue default do else - ... - ] - - PREDEFINED_TYPES = %w[ - int long short char void - ... - ] - - PREDEFINED_CONSTANTS = %w[ - EOF NULL ... - ] - - # make a WordList - IDENT_KIND = WordList.new(:ident). - add(RESERVED_WORDS, :reserved). - add(PREDEFINED_TYPES, :pre_type). - add(PREDEFINED_CONSTANTS, :pre_constant) - - def test_word_list_example - assert_equal :pre_type, IDENT_KIND['void'] - # assert_equal :pre_constant, IDENT_KIND['...'] # not specified - end - - def test_word_list - list = WordList.new(:ident).add(['foobar'], :reserved) - assert_equal :reserved, list['foobar'] - assert_equal :ident, list['FooBar'] - end - - def test_word_list_cached - list = WordList.new(:ident, true).add(['foobar'], :reserved) - assert_equal :reserved, list['foobar'] - assert_equal :ident, list['FooBar'] - end - - def test_case_ignoring_word_list - list = CaseIgnoringWordList.new(:ident).add(['foobar'], :reserved) - assert_equal :ident, list['foo'] - assert_equal :reserved, list['foobar'] - assert_equal :reserved, list['FooBar'] - - list = CaseIgnoringWordList.new(:ident).add(['FooBar'], :reserved) - assert_equal :ident, list['foo'] - assert_equal :reserved, list['foobar'] - assert_equal :reserved, list['FooBar'] - end - - def test_case_ignoring_word_list_cached - list = CaseIgnoringWordList.new(:ident, true).add(['foobar'], :reserved) - assert_equal :ident, list['foo'] - assert_equal :reserved, list['foobar'] - assert_equal :reserved, list['FooBar'] - - list = CaseIgnoringWordList.new(:ident, true).add(['FooBar'], :reserved) - assert_equal :ident, list['foo'] - assert_equal :reserved, list['foobar'] - assert_equal :reserved, list['FooBar'] - end - - def test_dup - list = WordList.new(:ident).add(['foobar'], :reserved) - assert_equal :reserved, list['foobar'] - list2 = list.dup - list2.add(%w[foobar], :keyword) - assert_equal :keyword, list2['foobar'] - assert_equal :reserved, list['foobar'] - end - -end \ No newline at end of file diff --git a/vendor/gems/coderay-0.9.7/test/functional/word_list.rbc b/vendor/gems/coderay-0.9.7/test/functional/word_list.rbc deleted file mode 100644 index 37bcdd28..00000000 --- a/vendor/gems/coderay-0.9.7/test/functional/word_list.rbc +++ /dev/null @@ -1,1763 +0,0 @@ -!RBIX -0 -x -M -1 -n -n -x -10 -__script__ -i -53 -5 -7 -0 -64 -47 -49 -1 -1 -15 -5 -7 -2 -64 -47 -49 -1 -1 -15 -99 -7 -3 -45 -4 -5 -43 -6 -43 -7 -65 -49 -8 -3 -13 -99 -12 -7 -9 -12 -7 -10 -12 -65 -12 -49 -11 -4 -15 -49 -9 -0 -15 -2 -11 -I -6 -I -0 -I -0 -I -0 -n -p -12 -s -9 -test/unit -x -7 -require -s -7 -coderay -x -12 -WordListTest -x -4 -Test -n -x -4 -Unit -x -8 -TestCase -x -10 -open_class -x -14 -__class_init__ -M -1 -n -n -x -12 -WordListTest -i -232 -5 -66 -5 -45 -0 -1 -47 -49 -2 -1 -15 -65 -7 -3 -7 -4 -64 -7 -5 -64 -7 -6 -64 -7 -7 -64 -7 -8 -64 -7 -9 -64 -7 -10 -64 -7 -11 -64 -35 -8 -49 -12 -2 -15 -65 -7 -13 -7 -14 -64 -7 -15 -64 -7 -16 -64 -7 -17 -64 -7 -18 -64 -7 -11 -64 -35 -6 -49 -12 -2 -15 -65 -7 -19 -7 -20 -64 -7 -21 -64 -7 -11 -64 -35 -3 -49 -12 -2 -15 -65 -7 -22 -45 -23 -24 -13 -71 -25 -47 -9 -115 -47 -49 -26 -0 -13 -7 -27 -47 -49 -28 -1 -15 -8 -120 -7 -27 -49 -25 -1 -45 -3 -29 -7 -30 -49 -31 -2 -45 -13 -32 -7 -33 -49 -31 -2 -45 -19 -34 -7 -35 -49 -31 -2 -49 -12 -2 -15 -99 -7 -36 -7 -37 -65 -67 -49 -38 -0 -49 -39 -4 -15 -99 -7 -40 -7 -41 -65 -67 -49 -38 -0 -49 -39 -4 -15 -99 -7 -42 -7 -43 -65 -67 -49 -38 -0 -49 -39 -4 -15 -99 -7 -44 -7 -45 -65 -67 -49 -38 -0 -49 -39 -4 -15 -99 -7 -46 -7 -47 -65 -67 -49 -38 -0 -49 -39 -4 -15 -99 -7 -48 -7 -49 -65 -67 -49 -38 -0 -49 -39 -4 -11 -I -a -I -0 -I -0 -I -0 -n -p -50 -x -7 -CodeRay -n -x -7 -include -x -14 -RESERVED_WORDS -s -3 -asm -s -5 -break -s -4 -case -s -8 -continue -s -7 -default -s -2 -do -s -4 -else -s -3 -... -x -9 -const_set -x -16 -PREDEFINED_TYPES -s -3 -int -s -4 -long -s -5 -short -s -4 -char -s -4 -void -x -20 -PREDEFINED_CONSTANTS -s -3 -EOF -s -4 -NULL -x -10 -IDENT_KIND -x -8 -WordList -n -x -3 -new -x -8 -allocate -x -5 -ident -x -10 -initialize -n -x -8 -reserved -x -3 -add -n -x -8 -pre_type -n -x -12 -pre_constant -x -22 -test_word_list_example -M -1 -n -n -x -22 -test_word_list_example -i -17 -5 -7 -0 -45 -1 -2 -7 -3 -64 -49 -4 -1 -47 -49 -5 -2 -11 -I -4 -I -0 -I -0 -I -0 -n -p -6 -x -8 -pre_type -x -10 -IDENT_KIND -n -s -4 -void -x -2 -[] -x -12 -assert_equal -p -5 -I -0 -I -1d -I -0 -I -1e -I -11 -x -59 -/Users/murphy/ruby/coderay-0.9/test/functional/word_list.rb -p -0 -x -17 -method_visibility -x -15 -add_defn_method -x -14 -test_word_list -M -1 -n -n -x -14 -test_word_list -i -73 -45 -0 -1 -13 -71 -2 -47 -9 -23 -47 -49 -3 -0 -13 -7 -4 -47 -49 -5 -1 -15 -8 -28 -7 -4 -49 -2 -1 -7 -6 -64 -35 -1 -7 -7 -49 -8 -2 -19 -0 -15 -5 -7 -7 -20 -0 -7 -6 -64 -49 -9 -1 -47 -49 -10 -2 -15 -5 -7 -4 -20 -0 -7 -11 -64 -49 -9 -1 -47 -49 -10 -2 -11 -I -5 -I -1 -I -0 -I -0 -n -p -12 -x -8 -WordList -n -x -3 -new -x -8 -allocate -x -5 -ident -x -10 -initialize -s -6 -foobar -x -8 -reserved -x -3 -add -x -2 -[] -x -12 -assert_equal -s -6 -FooBar -p -9 -I -0 -I -22 -I -0 -I -23 -I -29 -I -24 -I -39 -I -25 -I -49 -x -59 -/Users/murphy/ruby/coderay-0.9/test/functional/word_list.rb -p -1 -x -4 -list -x -21 -test_word_list_cached -M -1 -n -n -x -21 -test_word_list_cached -i -75 -45 -0 -1 -13 -71 -2 -47 -9 -24 -47 -49 -3 -0 -13 -7 -4 -2 -47 -49 -5 -2 -15 -8 -30 -7 -4 -2 -49 -2 -2 -7 -6 -64 -35 -1 -7 -7 -49 -8 -2 -19 -0 -15 -5 -7 -7 -20 -0 -7 -6 -64 -49 -9 -1 -47 -49 -10 -2 -15 -5 -7 -4 -20 -0 -7 -11 -64 -49 -9 -1 -47 -49 -10 -2 -11 -I -5 -I -1 -I -0 -I -0 -n -p -12 -x -8 -WordList -n -x -3 -new -x -8 -allocate -x -5 -ident -x -10 -initialize -s -6 -foobar -x -8 -reserved -x -3 -add -x -2 -[] -x -12 -assert_equal -s -6 -FooBar -p -9 -I -0 -I -28 -I -0 -I -29 -I -2b -I -2a -I -3b -I -2b -I -4b -x -59 -/Users/murphy/ruby/coderay-0.9/test/functional/word_list.rb -p -1 -x -4 -list -x -28 -test_case_ignoring_word_list -M -1 -n -n -x -28 -test_case_ignoring_word_list -i -178 -45 -0 -1 -13 -71 -2 -47 -9 -23 -47 -49 -3 -0 -13 -7 -4 -47 -49 -5 -1 -15 -8 -28 -7 -4 -49 -2 -1 -7 -6 -64 -35 -1 -7 -7 -49 -8 -2 -19 -0 -15 -5 -7 -4 -20 -0 -7 -9 -64 -49 -10 -1 -47 -49 -11 -2 -15 -5 -7 -7 -20 -0 -7 -6 -64 -49 -10 -1 -47 -49 -11 -2 -15 -5 -7 -7 -20 -0 -7 -12 -64 -49 -10 -1 -47 -49 -11 -2 -15 -45 -0 -13 -13 -71 -2 -47 -9 -112 -47 -49 -3 -0 -13 -7 -4 -47 -49 -5 -1 -15 -8 -117 -7 -4 -49 -2 -1 -7 -12 -64 -35 -1 -7 -7 -49 -8 -2 -19 -0 -15 -5 -7 -4 -20 -0 -7 -9 -64 -49 -10 -1 -47 -49 -11 -2 -15 -5 -7 -7 -20 -0 -7 -6 -64 -49 -10 -1 -47 -49 -11 -2 -15 -5 -7 -7 -20 -0 -7 -12 -64 -49 -10 -1 -47 -49 -11 -2 -11 -I -5 -I -1 -I -0 -I -0 -n -p -14 -x -20 -CaseIgnoringWordList -n -x -3 -new -x -8 -allocate -x -5 -ident -x -10 -initialize -s -6 -foobar -x -8 -reserved -x -3 -add -s -3 -foo -x -2 -[] -x -12 -assert_equal -s -6 -FooBar -n -p -19 -I -0 -I -2e -I -0 -I -2f -I -29 -I -30 -I -39 -I -31 -I -49 -I -32 -I -59 -I -34 -I -82 -I -35 -I -92 -I -36 -I -a2 -I -37 -I -b2 -x -59 -/Users/murphy/ruby/coderay-0.9/test/functional/word_list.rb -p -1 -x -4 -list -x -35 -test_case_ignoring_word_list_cached -M -1 -n -n -x -35 -test_case_ignoring_word_list_cached -i -182 -45 -0 -1 -13 -71 -2 -47 -9 -24 -47 -49 -3 -0 -13 -7 -4 -2 -47 -49 -5 -2 -15 -8 -30 -7 -4 -2 -49 -2 -2 -7 -6 -64 -35 -1 -7 -7 -49 -8 -2 -19 -0 -15 -5 -7 -4 -20 -0 -7 -9 -64 -49 -10 -1 -47 -49 -11 -2 -15 -5 -7 -7 -20 -0 -7 -6 -64 -49 -10 -1 -47 -49 -11 -2 -15 -5 -7 -7 -20 -0 -7 -12 -64 -49 -10 -1 -47 -49 -11 -2 -15 -45 -0 -13 -13 -71 -2 -47 -9 -115 -47 -49 -3 -0 -13 -7 -4 -2 -47 -49 -5 -2 -15 -8 -121 -7 -4 -2 -49 -2 -2 -7 -12 -64 -35 -1 -7 -7 -49 -8 -2 -19 -0 -15 -5 -7 -4 -20 -0 -7 -9 -64 -49 -10 -1 -47 -49 -11 -2 -15 -5 -7 -7 -20 -0 -7 -6 -64 -49 -10 -1 -47 -49 -11 -2 -15 -5 -7 -7 -20 -0 -7 -12 -64 -49 -10 -1 -47 -49 -11 -2 -11 -I -5 -I -1 -I -0 -I -0 -n -p -14 -x -20 -CaseIgnoringWordList -n -x -3 -new -x -8 -allocate -x -5 -ident -x -10 -initialize -s -6 -foobar -x -8 -reserved -x -3 -add -s -3 -foo -x -2 -[] -x -12 -assert_equal -s -6 -FooBar -n -p -19 -I -0 -I -3a -I -0 -I -3b -I -2b -I -3c -I -3b -I -3d -I -4b -I -3e -I -5b -I -40 -I -86 -I -41 -I -96 -I -42 -I -a6 -I -43 -I -b6 -x -59 -/Users/murphy/ruby/coderay-0.9/test/functional/word_list.rb -p -1 -x -4 -list -x -8 -test_dup -M -1 -n -n -x -8 -test_dup -i -110 -45 -0 -1 -13 -71 -2 -47 -9 -23 -47 -49 -3 -0 -13 -7 -4 -47 -49 -5 -1 -15 -8 -28 -7 -4 -49 -2 -1 -7 -6 -64 -35 -1 -7 -7 -49 -8 -2 -19 -0 -15 -5 -7 -7 -20 -0 -7 -6 -64 -49 -9 -1 -47 -49 -10 -2 -15 -20 -0 -49 -11 -0 -19 -1 -15 -20 -1 -7 -6 -64 -35 -1 -7 -12 -49 -8 -2 -15 -5 -7 -12 -20 -1 -7 -6 -64 -49 -9 -1 -47 -49 -10 -2 -15 -5 -7 -7 -20 -0 -7 -6 -64 -49 -9 -1 -47 -49 -10 -2 -11 -I -6 -I -2 -I -0 -I -0 -n -p -13 -x -8 -WordList -n -x -3 -new -x -8 -allocate -x -5 -ident -x -10 -initialize -s -6 -foobar -x -8 -reserved -x -3 -add -x -2 -[] -x -12 -assert_equal -x -3 -dup -x -7 -keyword -p -15 -I -0 -I -46 -I -0 -I -47 -I -29 -I -48 -I -39 -I -49 -I -41 -I -4a -I -4e -I -4b -I -5e -I -4c -I -6e -x -59 -/Users/murphy/ruby/coderay-0.9/test/functional/word_list.rb -p -2 -x -4 -list -x -5 -list2 -p -45 -I -2 -I -6 -I -b -I -9 -I -e -I -a -I -23 -I -b -I -2c -I -e -I -2f -I -f -I -3e -I -10 -I -47 -I -13 -I -4a -I -14 -I -59 -I -18 -I -78 -I -19 -I -7d -I -18 -I -80 -I -1a -I -85 -I -18 -I -88 -I -1b -I -8d -I -18 -I -94 -I -1d -I -a2 -I -22 -I -b0 -I -28 -I -be -I -2e -I -cc -I -3a -I -da -I -46 -I -e8 -x -59 -/Users/murphy/ruby/coderay-0.9/test/functional/word_list.rb -p -0 -x -13 -attach_method -p -7 -I -0 -I -1 -I -9 -I -2 -I -12 -I -4 -I -35 -x -59 -/Users/murphy/ruby/coderay-0.9/test/functional/word_list.rb -p -0 diff --git a/vendor/gems/rubytree-0.5.2/.specification b/vendor/gems/rubytree-0.5.2/.specification deleted file mode 100644 index 2f5d9807..00000000 --- a/vendor/gems/rubytree-0.5.2/.specification +++ /dev/null @@ -1,80 +0,0 @@ ---- !ruby/object:Gem::Specification -name: rubytree -version: !ruby/object:Gem::Version - version: 0.5.2 -platform: ruby -authors: -- Anupam Sengupta -autorequire: tree -bindir: bin -cert_chain: [] - -date: 2007-12-20 00:00:00 -08:00 -default_executable: -dependencies: -- !ruby/object:Gem::Dependency - name: hoe - type: :runtime - version_requirement: - version_requirements: !ruby/object:Gem::Requirement - requirements: - - - ">=" - - !ruby/object:Gem::Version - version: 1.3.0 - version: -description: "Provides a generic tree data-structure with ability to store keyed node-elements in the tree. The implementation mixes in the Enumerable module. Website: http://rubytree.rubyforge.org/" -email: anupamsg@gmail.com -executables: [] - -extensions: [] - -extra_rdoc_files: -- README -- COPYING -- ChangeLog -- History.txt -files: -- COPYING -- ChangeLog -- History.txt -- Manifest.txt -- README -- Rakefile -- TODO -- lib/tree.rb -- lib/tree/binarytree.rb -- setup.rb -- test/test_binarytree.rb -- test/test_tree.rb -has_rdoc: true -homepage: http://rubytree.rubyforge.org/ -licenses: [] - -post_install_message: -rdoc_options: -- --main -- README -require_paths: -- lib -required_ruby_version: !ruby/object:Gem::Requirement - requirements: - - - ">=" - - !ruby/object:Gem::Version - version: "0" - version: -required_rubygems_version: !ruby/object:Gem::Requirement - requirements: - - - ">=" - - !ruby/object:Gem::Version - version: "0" - version: -requirements: [] - -rubyforge_project: rubytree -rubygems_version: 1.3.5 -signing_key: -specification_version: 2 -summary: Ruby implementation of the Tree data structure. -test_files: -- test/test_binarytree.rb -- test/test_tree.rb diff --git a/vendor/gems/rubytree-0.5.2/COPYING b/vendor/gems/rubytree-0.5.2/COPYING deleted file mode 100644 index 09e7768f..00000000 --- a/vendor/gems/rubytree-0.5.2/COPYING +++ /dev/null @@ -1,31 +0,0 @@ -RUBYTREE - http://rubytree.rubyforge.org -======================================== - -Copyright (c) 2006, 2007 Anupam Sengupta - -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -- Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -- Redistributions in binary form must reproduce the above copyright notice, this - list of conditions and the following disclaimer in the documentation and/or - other materials provided with the distribution. - -- Neither the name of the organization nor the names of its contributors may - be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER 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. diff --git a/vendor/gems/rubytree-0.5.2/ChangeLog b/vendor/gems/rubytree-0.5.2/ChangeLog deleted file mode 100644 index bea9d786..00000000 --- a/vendor/gems/rubytree-0.5.2/ChangeLog +++ /dev/null @@ -1,163 +0,0 @@ -2007-12-21 Anupam Sengupta - - * Rakefile: Added the rcov option to exclude rcov itself from - coverage reports. - - * lib/tree.rb: Minor comment changes. - - * test/test_tree.rb: Added the TestTree enclosing module, and - renamed tests to meet ZenTest requirements. Also added a few - missing test cases. - - * test/test_binarytree.rb: Added the TestTree enclosing Module, - and renamed the tests to meet ZenTest requirements. - -2007-12-19 Anupam Sengupta - - * README (Module): Modified the install instructions from source. - - * lib/tree.rb (Tree::TreeNode::initialize): Removed the - unnecessary self_initialize method. - (Tree::TreeNode): Removed the spurious self_initialize from the - protected list. - (Module): Updated the minor version number. - - * Rakefile: Fixed a problem with reading the Tree::VERSION for the - gem packaging, if any prior version of the gem is already installed. - -2007-12-18 Anupam Sengupta - - * lib/tree.rb: Updated the marshalling logic to correctly handle - non-string content. - (Tree::TreeNode::createDumpRep): Minor code change to use symbols - instead of string key names. - (Tree): Version number change to 0.5.0 - (Tree::TreeNode::hasContent): Minor fix to the comments. - - * test/test_tree.rb (TC_TreeTest::test_breadth_each): Updated test - cases for the marshalling logic. - -2007-11-12 Anupam Sengupta - - * test/test_binarytree.rb: Minor documentation correction. - - * lib/tree/binarytree.rb (Tree::BinaryTreeNode::isRightChild): - Minor documentation change. - -2007-10-10 Anupam Sengupta - - * README: Restructured the format. - - * Rakefile: Added Hoe related logic. If not present, the Rakefile - will default to old behavior. - -2007-10-09 Anupam Sengupta - - * Rakefile: Added setup.rb related tasks. Also added the setup.rb in the PKG_FILES list. - -2007-10-01 Anupam Sengupta - - * Rakefile: Added an optional task for rcov code coverage. - Added a dependency for rake in the Gem Specification. - - * test/test_binarytree.rb: Removed the unnecessary dependency on "Person" class. - - * test/test_tree.rb: Removed dependency on the redundant "Person" class. - (TC_TreeTest::test_comparator): Added a new test for the spaceship operator. - (TC_TreeTest::test_hasContent): Added tests for hasContent? and length methods. - -2007-08-30 Anupam Sengupta - - * test/test_tree.rb (TC_TreeTest::test_preordered_each, TC_TreeTest::test_breadth_each, TC_TreeTest::test_detached_copy): - Added new tests for the new functions added to tree.rb. - - * lib/tree.rb (Tree::TreeNode::detached_copy, Tree::TreeNode::preordered_each, Tree::TreeNode::breadth_each): - Added new functions for returning a detached copy of the node and - for performing breadth first traversal. Also added the pre-ordered - traversal function which is an alias of the existing 'each' method. - - * test/test_binarytree.rb (TC_BinaryTreeTest::test_swap_children): - Added a test case for the children swap function. - - * lib/tree/binarytree.rb (Tree::BinaryTreeNode::swap_children): - Added new function to swap the children. Other minor changes in - comments and code. - -2007-07-18 Anupam Sengupta - - * lib/tree/binarytree.rb (Tree::BinaryTreeNode::leftChild / - rightChild): Minor cosmetic change on the parameter name. - - * test/testbinarytree.rb (TC_BinaryTreeTest::test_isLeftChild): - Minor syntax correction. - - * lib/tree.rb (Tree::TreeNode::depth): Added a tree depth - computation method. - (Tree::TreeNode::breadth): Added a tree breadth method. - - * test/testtree.rb (TC_TreeTest::test_depth/test_breadth): Added a - test for the depth and breadth method. - - * lib/tree/binarytree.rb (Tree::BinaryTreeNode::is*Child): - Added tests for determining whether a node is a left or right - child. - - * test/testbinarytree.rb: Added the test cases for the binary tree - implementation. - (TC_BinaryTreeTest::test_is*Child): Added tests for right or left - childs. - - * lib/tree/binarytree.rb: Added the binary tree implementation. - -2007-07-17 Anupam Sengupta - - * lib/tree.rb (Tree::TreeNode::parentage): Renamed 'ancestors' - method to 'parentage' to avoid clobbering Module.ancestors - -2007-07-16 Anupam Sengupta - - * Rakefile: Added an optional rtags task to generate TAGS file for - Emacs. - - * lib/tree.rb (Tree::TreeNode): Added navigation methods for - siblings and children. Also added some convenience methods. - -2007-07-08 Anupam Sengupta - - * Rakefile: Added a developer target for generating rdoc for the - website. - -2007-06-24 Anupam Sengupta - - * test/testtree.rb, lib/tree.rb: Added the each_leaf traversal method. - - * README: Replaced all occurrances of LICENSE with COPYING - and lowercased all instances of the word 'RubyTree'. - - * Rakefile: Replaced all occurrances of LICENSE with COPYING - -2007-06-23 Anupam Sengupta - - * lib/tree.rb (Tree::TreeNode::isLeaf): Added a isLeaf? method. - - * test/testtree.rb (TC_TreeTest::test_removeFromParent): Added - test for isLeaf? method - - * Rakefile: Added the LICENSE and ChangeLog to the extra RDoc files. - - * lib/tree.rb: Minor updates to the comments. - - * test/testtree.rb: Added the Copyright and License header. - - * test/person.rb: Added the Copyright and License header. - - * lib/tree.rb: Added the Copyright and License header. - - * Rakefile: Added the LICENSE and Changelog to be part of the RDoc task. - - * README: Added documentation in the README, including install - instructions and an example. - - * LICENSE: Added the BSD LICENSE file. - - * Changelog: Added the Changelog file. diff --git a/vendor/gems/rubytree-0.5.2/History.txt b/vendor/gems/rubytree-0.5.2/History.txt deleted file mode 100644 index c43831c9..00000000 --- a/vendor/gems/rubytree-0.5.2/History.txt +++ /dev/null @@ -1,20 +0,0 @@ -= 0.5.2 / 2007-12-21 - -* Added more test cases and enabled ZenTest compatibility for the test case - names. - -= 0.5.1 / 2007-12-20 - -* Minor code refactoring. - -= 0.5.0 / 2007-12-18 - -* Fixed the marshalling code to correctly handle non-string content. - -= 0.4.3 / 2007-10-09 - -* Changes to the build mechanism (now uses Hoe). - -= 0.4.2 / 2007-10-01 - -* Minor code refactoring. Changes in the Rakefile. diff --git a/vendor/gems/rubytree-0.5.2/Manifest.txt b/vendor/gems/rubytree-0.5.2/Manifest.txt deleted file mode 100644 index 171ec7cc..00000000 --- a/vendor/gems/rubytree-0.5.2/Manifest.txt +++ /dev/null @@ -1,12 +0,0 @@ -COPYING -ChangeLog -History.txt -Manifest.txt -README -Rakefile -TODO -lib/tree.rb -lib/tree/binarytree.rb -setup.rb -test/test_binarytree.rb -test/test_tree.rb diff --git a/vendor/gems/rubytree-0.5.2/README b/vendor/gems/rubytree-0.5.2/README deleted file mode 100644 index db690c95..00000000 --- a/vendor/gems/rubytree-0.5.2/README +++ /dev/null @@ -1,147 +0,0 @@ - - __ _ _ - /__\_ _| |__ _ _| |_ _ __ ___ ___ - / \// | | | '_ \| | | | __| '__/ _ \/ _ \ - / _ \ |_| | |_) | |_| | |_| | | __/ __/ - \/ \_/\__,_|_.__/ \__, |\__|_| \___|\___| - |___/ - - (c) 2006, 2007 Anupam Sengupta - http://rubytree.rubyforge.org - -Rubytree is a simple implementation of the generic Tree data structure. This -implementation is node-centric, where the individual nodes on the tree are the -primary objects and drive the structure. - -== INSTALL: - -Rubytree is an open source project and is hosted at: - - http://rubytree.rubyforge.org - -Rubytree can be downloaded as a Rubygem or as a tar/zip file from: - - http://rubyforge.org/frs/?group_id=1215&release_id=8817 - -The file-name is one of: - - rubytree-.gem - The Rubygem - rubytree-.tgz - GZipped source files - rubytree-.zip - Zipped source files - -Download the appropriate file-type for your system. - -It is recommended to install Rubytree as a Ruby Gem, as this is an easy way to -keep the version updated, and keep multiple versions of the library available on -your system. - -=== Installing the Gem - -To Install the Gem, from a Terminal/CLI command prompt, issue the command: - - gem install rubytree - -This should install the gem file for Rubytree. Note that you may need to be a -super-user (root) to successfully install the gem. - -=== Installing from the tgz/zip file - -Extract the archive file (tgz or zip) and run the following command from the -top-level source directory: - - ruby ./setup.rb - -You may need administrator/super-user privileges to complete the setup using -this method. - -== DOCUMENTATION: - -The primary class for this implementation is Tree::TreeNode. See the -class documentation for an usage example. - -From a command line/terminal prompt, you can issue the following command to view -the text mode ri documentation: - - ri Tree::TreeNode - -Documentation on the web is available at: - -http://rubytree.rubyforge.org/rdoc - -== EXAMPLE: - -The following code-snippet implements this tree structure: - - +------------+ - | ROOT | - +-----+------+ - +-------------+------------+ - | | - +-------+-------+ +-------+-------+ - | CHILD 1 | | CHILD 2 | - +-------+-------+ +---------------+ - | - | - +-------+-------+ - | GRANDCHILD 1 | - +---------------+ - - require 'tree' - - myTreeRoot = Tree::TreeNode.new("ROOT", "Root Content") - - myTreeRoot << Tree::TreeNode.new("CHILD1", "Child1 Content") << Tree::TreeNode.new("GRANDCHILD1", "GrandChild1 Content") - - myTreeRoot << Tree::TreeNode.new("CHILD2", "Child2 Content") - - myTreeRoot.printTree - - child1 = myTreeRoot["CHILD1"] - - grandChild1 = myTreeRoot["CHILD1"]["GRANDCHILD1"] - - siblingsOfChild1Array = child1.siblings - - immediateChildrenArray = myTreeRoot.children - - # Process all nodes - - myTreeRoot.each { |node| node.content.reverse } - - myTreeRoot.remove!(child1) # Remove the child - -== LICENSE: - -Rubytree is licensed under BSD license. - -Copyright (c) 2006, 2007 Anupam Sengupta - -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -- Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -- Redistributions in binary form must reproduce the above copyright notice, this - list of conditions and the following disclaimer in the documentation and/or - other materials provided with the distribution. - -- Neither the name of the organization nor the names of its contributors may - be used to endorse or promote products derived from this software without - specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER 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. - - -(Document Revision: $Revision: 1.16 $ by $Author: anupamsg $) diff --git a/vendor/gems/rubytree-0.5.2/Rakefile b/vendor/gems/rubytree-0.5.2/Rakefile deleted file mode 100644 index 814fb026..00000000 --- a/vendor/gems/rubytree-0.5.2/Rakefile +++ /dev/null @@ -1,212 +0,0 @@ -# Rakefile -# -# $Revision: 1.27 $ by $Author: anupamsg $ -# $Name: $ -# -# Copyright (c) 2006, 2007 Anupam Sengupta -# -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: -# -# - Redistributions of source code must retain the above copyright notice, this -# list of conditions and the following disclaimer. -# -# - Redistributions in binary form must reproduce the above copyright notice, this -# list of conditions and the following disclaimer in the documentation and/or -# other materials provided with the distribution. -# -# - Neither the name of the organization nor the names of its contributors may -# be used to endorse or promote products derived from this software without -# specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER 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. -# - -require 'rubygems' -require 'rake/gempackagetask' - -require 'rake/clean' -require 'rake/packagetask' -require 'rake/testtask' -require 'rake/rdoctask' - -require 'fileutils' - -# General Stuff #################################################### - -$:.insert 0, File.expand_path( File.join( File.dirname(__FILE__), 'lib' ) ) -require 'tree' # To read the version information. - -PKG_NAME = "rubytree" -PKG_VERSION = Tree::VERSION -PKG_FULLNAME = PKG_NAME + "-" + PKG_VERSION -PKG_SUMMARY = "Ruby implementation of the Tree data structure." -PKG_DESCRIPTION = <<-END - Provides a generic tree data-structure with ability to - store keyed node-elements in the tree. The implementation - mixes in the Enumerable module. - - Website: http://rubytree.rubyforge.org/ - END - -PKG_FILES = FileList[ - '[A-Z]*', - '*.rb', - 'lib/**/*.rb', - 'test/**/*.rb' - ] - -# Default is to create a rubygem. -desc "Default Task" -task :default => :gem - -begin # Try loading hoe - require 'hoe' - # If Hoe is found, use it to define tasks - # ======================================= - Hoe.new(PKG_NAME, PKG_VERSION) do |p| - p.rubyforge_name = PKG_NAME - p.author = "Anupam Sengupta" - p.email = "anupamsg@gmail.com" - p.summary = PKG_SUMMARY - p.description = PKG_DESCRIPTION - p.url = "http://rubytree.rubyforge.org/" - p.changes = p.paragraphs_of('History.txt', 0..1).join("\n\n") - p.remote_rdoc_dir = 'rdoc' - p.need_tar = true - p.need_zip = true - p.test_globs = ['test/test_*.rb'] - p.spec_extras = { - :has_rdoc => true, - :platform => Gem::Platform::RUBY, - :has_rdoc => true, - :extra_rdoc_files => ['README', 'COPYING', 'ChangeLog', 'History.txt'], - :rdoc_options => ['--main', 'README'], - :autorequire => 'tree' - } - end - -rescue LoadError # If Hoe is not found - # If Hoe is not found, then use the usual Gemspec based Rake tasks - # ================================================================ - spec = Gem::Specification.new do |s| - s.name = PKG_NAME - s.version = PKG_VERSION - s.platform = Gem::Platform::RUBY - s.author = "Anupam Sengupta" - s.email = "anupamsg@gmail.com" - s.homepage = "http://rubytree.rubyforge.org/" - s.rubyforge_project = 'rubytree' - s.summary = PKG_SUMMARY - s.add_dependency('rake', '>= 0.7.2') - s.description = PKG_DESCRIPTION - s.has_rdoc = true - s.extra_rdoc_files = ['README', 'COPYING', 'ChangeLog'] - s.autorequire = "tree" - s.files = PKG_FILES.to_a - s.test_files = Dir.glob('test/test*.rb') - end - - desc "Prepares for installation" - task :prepare do - ruby "setup.rb config" - ruby "setup.rb setup" - end - - desc "Installs the package #{PKG_NAME}" - task :install => [:prepare] do - ruby "setup.rb install" - end - - Rake::GemPackageTask.new(spec) do |pkg| - pkg.need_zip = true - pkg.need_tar = true - end - - Rake::TestTask.new do |t| - t.libs << "test" - t.test_files = FileList['test/test*.rb'] - t.verbose = true - end - -end # End loading Hoerc -# ================================================================ - - -# The following tasks are loaded independently of Hoe - -# Hoe's rdoc task is ugly. -Rake::RDocTask.new(:docs) do |rd| - rd.rdoc_files.include("README", "COPYING", "ChangeLog", "lib/**/*.rb") - rd.rdoc_dir = 'doc' - rd.title = "#{PKG_FULLNAME} Documentation" - - # Use the template only if it is present, otherwise, the standard template is - # used. - template = "../allison/allison.rb" - rd.template = template if File.file?(template) - - rd.options << '--line-numbers' << '--inline-source' -end - -# Optional TAGS Task. -# Needs https://rubyforge.org/projects/rtagstask/ -begin - require 'rtagstask' - RTagsTask.new do |rd| - rd.vi = false - end -rescue LoadError -end - -# Optional RCOV Task -# Needs http://eigenclass.org/hiki/rcov -begin - require 'rcov/rcovtask' - Rcov::RcovTask.new do |t| - t.test_files = FileList['test/test*.rb'] - t.rcov_opts << "--exclude 'rcov.rb'" # rcov itself should not be profiled - # t.verbose = true # uncomment to see the executed commands - end -rescue LoadError -end - -#Rakefile,v $ -# Revision 1.21 2007/07/21 05:14:43 anupamsg -# Added a VERSION constant to the Tree module, -# and using the same in the Rakefile. -# -# Revision 1.20 2007/07/21 03:24:25 anupamsg -# Minor edits to parameter names. User visible functionality does not change. -# -# Revision 1.19 2007/07/19 02:16:01 anupamsg -# Release 0.4.0 (and minor fix in Rakefile). -# -# Revision 1.18 2007/07/18 20:15:06 anupamsg -# Added two predicate methods in BinaryTreeNode to determine whether a node -# is a left or a right node. -# -# Revision 1.17 2007/07/18 07:17:34 anupamsg -# Fixed a issue where TreeNode.ancestors was shadowing Module.ancestors. This method -# has been renamed to TreeNode.parentage. -# -# Revision 1.16 2007/07/17 05:34:03 anupamsg -# Added an optional tags Rake-task for generating the TAGS file for Emacs. -# -# Revision 1.15 2007/07/17 04:42:45 anupamsg -# Minor fixes to the Rakefile. -# -# Revision 1.14 2007/07/17 03:39:28 anupamsg -# Moved the CVS Log keyword to end of the files. -# diff --git a/vendor/gems/rubytree-0.5.2/TODO b/vendor/gems/rubytree-0.5.2/TODO deleted file mode 100644 index ae4e74c3..00000000 --- a/vendor/gems/rubytree-0.5.2/TODO +++ /dev/null @@ -1,7 +0,0 @@ -# -*- mode: outline; coding: utf-8-unix; -*- - -* Add logic in Rakefile to read the file list from Manifest.txt file. - -* Add a YAML export method to the TreeNode class. - - diff --git a/vendor/gems/rubytree-0.5.2/lib/tree.rb b/vendor/gems/rubytree-0.5.2/lib/tree.rb deleted file mode 100644 index 9b5062aa..00000000 --- a/vendor/gems/rubytree-0.5.2/lib/tree.rb +++ /dev/null @@ -1,539 +0,0 @@ -# tree.rb -# -# $Revision: 1.29 $ by $Author: anupamsg $ -# $Name: $ -# -# = tree.rb - Generic Multi-way Tree implementation -# -# Provides a generic tree data structure with ability to -# store keyed node elements in the tree. The implementation -# mixes in the Enumerable module. -# -# Author:: Anupam Sengupta (anupamsg@gmail.com) -# - -# Copyright (c) 2006, 2007 Anupam Sengupta -# -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: -# -# - Redistributions of source code must retain the above copyright notice, this -# list of conditions and the following disclaimer. -# -# - Redistributions in binary form must reproduce the above copyright notice, this -# list of conditions and the following disclaimer in the documentation and/or -# other materials provided with the distribution. -# -# - Neither the name of the organization nor the names of its contributors may -# be used to endorse or promote products derived from this software without -# specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER 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. -# - -# This module provides a TreeNode class which is the primary class for all -# nodes represented in the Tree. -# This module mixes in the Enumerable module. -module Tree - - # Rubytree Package Version - VERSION = '0.5.2' - - # == TreeNode Class Description - # - # The node class for the tree representation. the nodes are named and have a - # place-holder for the node data (i.e., the `content' of the node). The node - # names are expected to be unique. In addition, the node provides navigation - # methods to traverse the tree. - # - # The nodes can have any number of child nodes attached to it. Note that while - # this implementation does not support directed graphs, the class itself makes - # no restrictions on associating a node's CONTENT with multiple parent nodes. - # - # - # == Example - # - # The following code-snippet implements this tree structure: - # - # +------------+ - # | ROOT | - # +-----+------+ - # +-------------+------------+ - # | | - # +-------+-------+ +-------+-------+ - # | CHILD 1 | | CHILD 2 | - # +-------+-------+ +---------------+ - # | - # | - # +-------+-------+ - # | GRANDCHILD 1 | - # +---------------+ - # - # require 'tree' - # - # myTreeRoot = Tree::TreeNode.new("ROOT", "Root Content") - # - # myTreeRoot << Tree::TreeNode.new("CHILD1", "Child1 Content") << Tree::TreeNode.new("GRANDCHILD1", "GrandChild1 Content") - # - # myTreeRoot << Tree::TreeNode.new("CHILD2", "Child2 Content") - # - # myTreeRoot.printTree - # - # child1 = myTreeRoot["CHILD1"] - # - # grandChild1 = myTreeRoot["CHILD1"]["GRANDCHILD1"] - # - # siblingsOfChild1Array = child1.siblings - # - # immediateChildrenArray = myTreeRoot.children - # - # # Process all nodes - # - # myTreeRoot.each { |node| node.content.reverse } - # - # myTreeRoot.remove!(child1) # Remove the child - class TreeNode - include Enumerable - - attr_reader :content, :name, :parent - attr_writer :content - - # Constructor which expects the name of the node - # - # Name of the node is expected to be unique across the - # tree. - # - # The content can be of any type, and is defaulted to _nil_. - def initialize(name, content = nil) - raise "Node name HAS to be provided" if name == nil - @name = name - @content = content - self.setAsRoot! - - @childrenHash = Hash.new - @children = [] - end - - # Returns a copy of this node, with the parent and children links removed. - def detached_copy - Tree::TreeNode.new(@name, @content ? @content.clone : nil) - end - - # Print the string representation of this node. - def to_s - "Node Name: #{@name}" + - " Content: " + (@content || "") + - " Parent: " + (isRoot?() ? "" : @parent.name) + - " Children: #{@children.length}" + - " Total Nodes: #{size()}" - end - - # Returns an array of ancestors in reversed order (the first element is the - # immediate parent). Returns nil if this is a root node. - def parentage - return nil if isRoot? - - parentageArray = [] - prevParent = self.parent - while (prevParent) - parentageArray << prevParent - prevParent = prevParent.parent - end - - parentageArray - end - - # Protected method to set the parent node. - # This method should NOT be invoked by client code. - def parent=(parent) - @parent = parent - end - - # Convenience synonym for TreeNode#add method. This method allows a convenient - # method to add children hierarchies in the tree. - # - # E.g. root << child << grand_child - def <<(child) - add(child) - end - - # Adds the specified child node to the receiver node. The child node's - # parent is set to be the receiver. The child is added as the last child in - # the current list of children for the receiver node. - def add(child) - raise "Child already added" if @childrenHash.has_key?(child.name) - - @childrenHash[child.name] = child - @children << child - child.parent = self - return child - - end - - # Removes the specified child node from the receiver node. The removed - # children nodes are orphaned but available if an alternate reference - # exists. - # - # Returns the child node. - def remove!(child) - @childrenHash.delete(child.name) - @children.delete(child) - child.setAsRoot! unless child == nil - return child - end - - # Removes this node from its parent. If this is the root node, then does - # nothing. - def removeFromParent! - @parent.remove!(self) unless isRoot? - end - - # Removes all children from the receiver node. - def removeAll! - for child in @children - child.setAsRoot! - end - @childrenHash.clear - @children.clear - self - end - - # Indicates whether this node has any associated content. - def hasContent? - @content != nil - end - - # Protected method which sets this node as a root node. - def setAsRoot! - @parent = nil - end - - # Indicates whether this node is a root node. Note that - # orphaned children will also be reported as root nodes. - def isRoot? - @parent == nil - end - - # Indicates whether this node has any immediate child nodes. - def hasChildren? - @children.length != 0 - end - - # Indicates whether this node is a 'leaf' - i.e., one without - # any children - def isLeaf? - !hasChildren? - end - - # Returns an array of all the immediate children. If a block is given, - # yields each child node to the block. - def children - if block_given? - @children.each {|child| yield child} - else - @children - end - end - - # Returns the first child of this node. Will return nil if no children are - # present. - def firstChild - children.first - end - - # Returns the last child of this node. Will return nil if no children are - # present. - def lastChild - children.last - end - - # Returns every node (including the receiver node) from the tree to the - # specified block. The traversal is depth first and from left to right in - # pre-ordered sequence. - def each &block - yield self - children { |child| child.each(&block) } - end - - # Traverses the tree in a pre-ordered sequence. This is equivalent to - # TreeNode#each - def preordered_each &block - each(&block) - end - - # Performs breadth first traversal of the tree rooted at this node. The - # traversal in a given level is from left to right. - def breadth_each &block - node_queue = [self] # Create a queue with self as the initial entry - - # Use a queue to do breadth traversal - until node_queue.empty? - node_to_traverse = node_queue.shift - yield node_to_traverse - # Enqueue the children from left to right. - node_to_traverse.children { |child| node_queue.push child } - end - end - - # Yields all leaf nodes from this node to the specified block. May yield - # this node as well if this is a leaf node. Leaf traversal depth first and - # left to right. - def each_leaf &block - self.each { |node| yield(node) if node.isLeaf? } - end - - # Returns the requested node from the set of immediate children. - # - # If the parameter is _numeric_, then the in-sequence array of children is - # accessed (see Tree#children). If the parameter is not _numeric_, then it - # is assumed to be the *name* of the child node to be returned. - def [](name_or_index) - raise "Name_or_index needs to be provided" if name_or_index == nil - - if name_or_index.kind_of?(Integer) - @children[name_or_index] - else - @childrenHash[name_or_index] - end - end - - # Returns the total number of nodes in this tree, rooted at the receiver - # node. - def size - @children.inject(1) {|sum, node| sum + node.size} - end - - # Convenience synonym for Tree#size - def length - size() - end - - # Pretty prints the tree starting with the receiver node. - def printTree(level = 0) - - if isRoot? - print "*" - else - print "|" unless parent.isLastSibling? - print(' ' * (level - 1) * 4) - print(isLastSibling? ? "+" : "|") - print "---" - print(hasChildren? ? "+" : ">") - end - - puts " #{name}" - - children { |child| child.printTree(level + 1)} - end - - # Returns the root for this tree. Root's root is itself. - def root - root = self - root = root.parent while !root.isRoot? - root - end - - # Returns the first sibling for this node. If this is the root node, returns - # itself. - def firstSibling - if isRoot? - self - else - parent.children.first - end - end - - # Returns true if this node is the first sibling. - def isFirstSibling? - firstSibling == self - end - - # Returns the last sibling for this node. If this node is the root, returns - # itself. - def lastSibling - if isRoot? - self - else - parent.children.last - end - end - - # Returns true if his node is the last sibling - def isLastSibling? - lastSibling == self - end - - # Returns an array of siblings for this node. - # If a block is provided, yields each of the sibling - # nodes to the block. The root always has nil siblings. - def siblings - return nil if isRoot? - if block_given? - for sibling in parent.children - yield sibling if sibling != self - end - else - siblings = [] - parent.children {|sibling| siblings << sibling if sibling != self} - siblings - end - end - - # Returns true if this node is the only child of its parent - def isOnlyChild? - parent.children.size == 1 - end - - # Returns the next sibling for this node. Will return nil if no subsequent - # node is present. - def nextSibling - if myidx = parent.children.index(self) - parent.children.at(myidx + 1) - end - end - - # Returns the previous sibling for this node. Will return nil if no - # subsequent node is present. - def previousSibling - if myidx = parent.children.index(self) - parent.children.at(myidx - 1) if myidx > 0 - end - end - - # Provides a comparision operation for the nodes. Comparision - # is based on the natural character-set ordering for the - # node names. - def <=>(other) - return +1 if other == nil - self.name <=> other.name - end - - # Freezes all nodes in the tree - def freezeTree! - each {|node| node.freeze} - end - - # Creates the marshal-dump represention of the tree rooted at this node. - def marshal_dump - self.collect { |node| node.createDumpRep } - end - - # Creates a dump representation and returns the same as a hash. - def createDumpRep - { :name => @name, :parent => (isRoot? ? nil : @parent.name), :content => Marshal.dump(@content)} - end - - # Loads a marshalled dump of the tree and returns the root node of the - # reconstructed tree. See the Marshal class for additional details. - def marshal_load(dumped_tree_array) - nodes = { } - for node_hash in dumped_tree_array do - name = node_hash[:name] - parent_name = node_hash[:parent] - content = Marshal.load(node_hash[:content]) - - if parent_name then - nodes[name] = current_node = Tree::TreeNode.new(name, content) - nodes[parent_name].add current_node - else - # This is the root node, hence initialize self. - initialize(name, content) - - nodes[name] = self # Add self to the list of nodes - end - end - end - - # Returns depth of the tree from this node. A single leaf node has a - # depth of 1. - def depth - return 1 if isLeaf? - 1 + @children.collect { |child| child.depth }.max - end - - # Returns breadth of the tree at this node level. A single node has a - # breadth of 1. - def breadth - return 1 if isRoot? - parent.children.size - end - - protected :parent=, :setAsRoot!, :createDumpRep - - end -end - -# $Log: tree.rb,v $ -# Revision 1.29 2007/12/22 00:28:59 anupamsg -# Added more test cases, and enabled ZenTest compatibility. -# -# Revision 1.28 2007/12/20 03:19:33 anupamsg -# * README (Module): Modified the install instructions from source. -# (Module): Updated the minor version number. -# -# Revision 1.27 2007/12/20 03:00:03 anupamsg -# Minor code changes. Removed self_initialize from the protected methods' list. -# -# Revision 1.26 2007/12/20 02:50:04 anupamsg -# (Tree::TreeNode): Removed the spurious self_initialize from the protected list. -# -# Revision 1.25 2007/12/19 20:28:05 anupamsg -# Removed the unnecesary self_initialize method. -# -# Revision 1.24 2007/12/19 06:39:17 anupamsg -# Removed the unnecessary field and record separator constants. Also updated the -# history.txt file. -# -# Revision 1.23 2007/12/19 06:25:00 anupamsg -# (Tree::TreeNode): Minor fix to the comments. Also fixed the private/protected -# scope issue with the createDumpRep method. -# -# Revision 1.22 2007/12/19 06:22:03 anupamsg -# Updated the marshalling logic to correctly handle non-string content. This -# should fix the bug # 15614 ("When dumping with an Object as the content, you get -# a delimiter collision") -# -# Revision 1.21 2007/12/19 02:24:17 anupamsg -# Updated the marshalling logic to handle non-string contents on the nodes. -# -# Revision 1.20 2007/10/10 08:42:57 anupamsg -# Release 0.4.3 -# -# Revision 1.19 2007/08/31 01:16:27 anupamsg -# Added breadth and pre-order traversals for the tree. Also added a method -# to return the detached copy of a node from the tree. -# -# Revision 1.18 2007/07/21 05:14:44 anupamsg -# Added a VERSION constant to the Tree module, -# and using the same in the Rakefile. -# -# Revision 1.17 2007/07/21 03:24:25 anupamsg -# Minor edits to parameter names. User visible functionality does not change. -# -# Revision 1.16 2007/07/18 23:38:55 anupamsg -# Minor updates to tree.rb -# -# Revision 1.15 2007/07/18 22:11:50 anupamsg -# Added depth and breadth methods for the TreeNode. -# -# Revision 1.14 2007/07/18 19:33:27 anupamsg -# Added a new binary tree implementation. -# -# Revision 1.13 2007/07/18 07:17:34 anupamsg -# Fixed a issue where TreeNode.ancestors was shadowing Module.ancestors. This method -# has been renamed to TreeNode.parentage. -# -# Revision 1.12 2007/07/17 03:39:28 anupamsg -# Moved the CVS Log keyword to end of the files. -# diff --git a/vendor/gems/rubytree-0.5.2/lib/tree/binarytree.rb b/vendor/gems/rubytree-0.5.2/lib/tree/binarytree.rb deleted file mode 100644 index 76c36366..00000000 --- a/vendor/gems/rubytree-0.5.2/lib/tree/binarytree.rb +++ /dev/null @@ -1,131 +0,0 @@ -# binarytree.rb -# -# $Revision: 1.5 $ by $Author: anupamsg $ -# $Name: $ -# -# = binarytree.rb - Binary Tree implementation -# -# Provides a generic tree data structure with ability to -# store keyed node elements in the tree. The implementation -# mixes in the Enumerable module. -# -# Author:: Anupam Sengupta (anupamsg@gmail.com) -# - -# Copyright (c) 2007 Anupam Sengupta -# -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: -# -# - Redistributions of source code must retain the above copyright notice, this -# list of conditions and the following disclaimer. -# -# - Redistributions in binary form must reproduce the above copyright notice, this -# list of conditions and the following disclaimer in the documentation and/or -# other materials provided with the distribution. -# -# - Neither the name of the organization nor the names of its contributors may -# be used to endorse or promote products derived from this software without -# specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER 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. -# - -require 'tree' - -module Tree - - # Provides a Binary tree implementation. This tree node allows only two child - # nodes (left and right childs). It also provides direct access to the left - # and right children, including assignment to the same. - class BinaryTreeNode < TreeNode - - # Adds the specified child node to the receiver node. The child node's - # parent is set to be the receiver. The child nodes are added in the order - # of addition, i.e., the first child added becomes the left node, and the - # second child will be the second node. - # If only one child is present, then this will be the left child. - def add(child) - raise "Already has two child nodes" if @children.size == 2 - - super(child) - end - - # Returns the left child node. Note that - # left Child == first Child - def leftChild - children.first - end - - # Returns the right child node. Note that - # right child == last child unless there is only one child. - # Returns nil if the right child does not exist. - def rightChild - children[1] - end - - # Sets the left child. If a previous child existed, it is replaced. - def leftChild=(child) - @children[0] = child - @childrenHash[child.name] = child if child # Assign the name mapping - end - - # Sets the right child. If a previous child existed, it is replaced. - def rightChild=(child) - @children[1] = child - @childrenHash[child.name] = child if child # Assign the name mapping - end - - # Returns true if this is the left child of its parent. Always returns false - # if this is the root node. - def isLeftChild? - return nil if isRoot? - self == parent.leftChild - end - - # Returns true if this is the right child of its parent. Always returns false - # if this is the root node. - def isRightChild? - return nil if isRoot? - self == parent.rightChild - end - - # Swaps the left and right children with each other - def swap_children - tempChild = leftChild - self.leftChild= rightChild - self.rightChild= tempChild - end - end - -end - -# $Log: binarytree.rb,v $ -# Revision 1.5 2007/12/18 23:11:29 anupamsg -# Minor documentation changes in the binarytree class. -# -# Revision 1.4 2007/08/30 22:08:58 anupamsg -# Added a new swap_children method for Binary Tree. Also added minor -# documentation and test updates. -# -# Revision 1.3 2007/07/21 03:24:25 anupamsg -# Minor edits to parameter names. User visible functionality does not change. -# -# Revision 1.2 2007/07/18 20:15:06 anupamsg -# Added two predicate methods in BinaryTreeNode to determine whether a node -# is a left or a right node. -# -# Revision 1.1 2007/07/18 19:33:27 anupamsg -# Added a new binary tree implementation. -# diff --git a/vendor/gems/rubytree-0.5.2/setup.rb b/vendor/gems/rubytree-0.5.2/setup.rb deleted file mode 100644 index 424a5f37..00000000 --- a/vendor/gems/rubytree-0.5.2/setup.rb +++ /dev/null @@ -1,1585 +0,0 @@ -# -# setup.rb -# -# Copyright (c) 2000-2005 Minero Aoki -# -# This program is free software. -# You can distribute/modify this program under the terms of -# the GNU LGPL, Lesser General Public License version 2.1. -# - -unless Enumerable.method_defined?(:map) # Ruby 1.4.6 - module Enumerable - alias map collect - end -end - -unless File.respond_to?(:read) # Ruby 1.6 - def File.read(fname) - open(fname) {|f| - return f.read - } - end -end - -unless Errno.const_defined?(:ENOTEMPTY) # Windows? - module Errno - class ENOTEMPTY - # We do not raise this exception, implementation is not needed. - end - end -end - -def File.binread(fname) - open(fname, 'rb') {|f| - return f.read - } -end - -# for corrupted Windows' stat(2) -def File.dir?(path) - File.directory?((path[-1,1] == '/') ? path : path + '/') -end - - -class ConfigTable - - include Enumerable - - def initialize(rbconfig) - @rbconfig = rbconfig - @items = [] - @table = {} - # options - @install_prefix = nil - @config_opt = nil - @verbose = true - @no_harm = false - end - - attr_accessor :install_prefix - attr_accessor :config_opt - - attr_writer :verbose - - def verbose? - @verbose - end - - attr_writer :no_harm - - def no_harm? - @no_harm - end - - def [](key) - lookup(key).resolve(self) - end - - def []=(key, val) - lookup(key).set val - end - - def names - @items.map {|i| i.name } - end - - def each(&block) - @items.each(&block) - end - - def key?(name) - @table.key?(name) - end - - def lookup(name) - @table[name] or setup_rb_error "no such config item: #{name}" - end - - def add(item) - @items.push item - @table[item.name] = item - end - - def remove(name) - item = lookup(name) - @items.delete_if {|i| i.name == name } - @table.delete_if {|name, i| i.name == name } - item - end - - def load_script(path, inst = nil) - if File.file?(path) - MetaConfigEnvironment.new(self, inst).instance_eval File.read(path), path - end - end - - def savefile - '.config' - end - - def load_savefile - begin - File.foreach(savefile()) do |line| - k, v = *line.split(/=/, 2) - self[k] = v.strip - end - rescue Errno::ENOENT - setup_rb_error $!.message + "\n#{File.basename($0)} config first" - end - end - - def save - @items.each {|i| i.value } - File.open(savefile(), 'w') {|f| - @items.each do |i| - f.printf "%s=%s\n", i.name, i.value if i.value? and i.value - end - } - end - - def load_standard_entries - standard_entries(@rbconfig).each do |ent| - add ent - end - end - - def standard_entries(rbconfig) - c = rbconfig - - rubypath = File.join(c['bindir'], c['ruby_install_name'] + c['EXEEXT']) - - major = c['MAJOR'].to_i - minor = c['MINOR'].to_i - teeny = c['TEENY'].to_i - version = "#{major}.#{minor}" - - # ruby ver. >= 1.4.4? - newpath_p = ((major >= 2) or - ((major == 1) and - ((minor >= 5) or - ((minor == 4) and (teeny >= 4))))) - - if c['rubylibdir'] - # V > 1.6.3 - libruby = "#{c['prefix']}/lib/ruby" - librubyver = c['rubylibdir'] - librubyverarch = c['archdir'] - siteruby = c['sitedir'] - siterubyver = c['sitelibdir'] - siterubyverarch = c['sitearchdir'] - elsif newpath_p - # 1.4.4 <= V <= 1.6.3 - libruby = "#{c['prefix']}/lib/ruby" - librubyver = "#{c['prefix']}/lib/ruby/#{version}" - librubyverarch = "#{c['prefix']}/lib/ruby/#{version}/#{c['arch']}" - siteruby = c['sitedir'] - siterubyver = "$siteruby/#{version}" - siterubyverarch = "$siterubyver/#{c['arch']}" - else - # V < 1.4.4 - libruby = "#{c['prefix']}/lib/ruby" - librubyver = "#{c['prefix']}/lib/ruby/#{version}" - librubyverarch = "#{c['prefix']}/lib/ruby/#{version}/#{c['arch']}" - siteruby = "#{c['prefix']}/lib/ruby/#{version}/site_ruby" - siterubyver = siteruby - siterubyverarch = "$siterubyver/#{c['arch']}" - end - parameterize = lambda {|path| - path.sub(/\A#{Regexp.quote(c['prefix'])}/, '$prefix') - } - - if arg = c['configure_args'].split.detect {|arg| /--with-make-prog=/ =~ arg } - makeprog = arg.sub(/'/, '').split(/=/, 2)[1] - else - makeprog = 'make' - end - - [ - ExecItem.new('installdirs', 'std/site/home', - 'std: install under libruby; site: install under site_ruby; home: install under $HOME')\ - {|val, table| - case val - when 'std' - table['rbdir'] = '$librubyver' - table['sodir'] = '$librubyverarch' - when 'site' - table['rbdir'] = '$siterubyver' - table['sodir'] = '$siterubyverarch' - when 'home' - setup_rb_error '$HOME was not set' unless ENV['HOME'] - table['prefix'] = ENV['HOME'] - table['rbdir'] = '$libdir/ruby' - table['sodir'] = '$libdir/ruby' - end - }, - PathItem.new('prefix', 'path', c['prefix'], - 'path prefix of target environment'), - PathItem.new('bindir', 'path', parameterize.call(c['bindir']), - 'the directory for commands'), - PathItem.new('libdir', 'path', parameterize.call(c['libdir']), - 'the directory for libraries'), - PathItem.new('datadir', 'path', parameterize.call(c['datadir']), - 'the directory for shared data'), - PathItem.new('mandir', 'path', parameterize.call(c['mandir']), - 'the directory for man pages'), - PathItem.new('sysconfdir', 'path', parameterize.call(c['sysconfdir']), - 'the directory for system configuration files'), - PathItem.new('localstatedir', 'path', parameterize.call(c['localstatedir']), - 'the directory for local state data'), - PathItem.new('libruby', 'path', libruby, - 'the directory for ruby libraries'), - PathItem.new('librubyver', 'path', librubyver, - 'the directory for standard ruby libraries'), - PathItem.new('librubyverarch', 'path', librubyverarch, - 'the directory for standard ruby extensions'), - PathItem.new('siteruby', 'path', siteruby, - 'the directory for version-independent aux ruby libraries'), - PathItem.new('siterubyver', 'path', siterubyver, - 'the directory for aux ruby libraries'), - PathItem.new('siterubyverarch', 'path', siterubyverarch, - 'the directory for aux ruby binaries'), - PathItem.new('rbdir', 'path', '$siterubyver', - 'the directory for ruby scripts'), - PathItem.new('sodir', 'path', '$siterubyverarch', - 'the directory for ruby extentions'), - PathItem.new('rubypath', 'path', rubypath, - 'the path to set to #! line'), - ProgramItem.new('rubyprog', 'name', rubypath, - 'the ruby program using for installation'), - ProgramItem.new('makeprog', 'name', makeprog, - 'the make program to compile ruby extentions'), - SelectItem.new('shebang', 'all/ruby/never', 'ruby', - 'shebang line (#!) editing mode'), - BoolItem.new('without-ext', 'yes/no', 'no', - 'does not compile/install ruby extentions') - ] - end - private :standard_entries - - def load_multipackage_entries - multipackage_entries().each do |ent| - add ent - end - end - - def multipackage_entries - [ - PackageSelectionItem.new('with', 'name,name...', '', 'ALL', - 'package names that you want to install'), - PackageSelectionItem.new('without', 'name,name...', '', 'NONE', - 'package names that you do not want to install') - ] - end - private :multipackage_entries - - ALIASES = { - 'std-ruby' => 'librubyver', - 'stdruby' => 'librubyver', - 'rubylibdir' => 'librubyver', - 'archdir' => 'librubyverarch', - 'site-ruby-common' => 'siteruby', # For backward compatibility - 'site-ruby' => 'siterubyver', # For backward compatibility - 'bin-dir' => 'bindir', - 'bin-dir' => 'bindir', - 'rb-dir' => 'rbdir', - 'so-dir' => 'sodir', - 'data-dir' => 'datadir', - 'ruby-path' => 'rubypath', - 'ruby-prog' => 'rubyprog', - 'ruby' => 'rubyprog', - 'make-prog' => 'makeprog', - 'make' => 'makeprog' - } - - def fixup - ALIASES.each do |ali, name| - @table[ali] = @table[name] - end - @items.freeze - @table.freeze - @options_re = /\A--(#{@table.keys.join('|')})(?:=(.*))?\z/ - end - - def parse_opt(opt) - m = @options_re.match(opt) or setup_rb_error "config: unknown option #{opt}" - m.to_a[1,2] - end - - def dllext - @rbconfig['DLEXT'] - end - - def value_config?(name) - lookup(name).value? - end - - class Item - def initialize(name, template, default, desc) - @name = name.freeze - @template = template - @value = default - @default = default - @description = desc - end - - attr_reader :name - attr_reader :description - - attr_accessor :default - alias help_default default - - def help_opt - "--#{@name}=#{@template}" - end - - def value? - true - end - - def value - @value - end - - def resolve(table) - @value.gsub(%r<\$([^/]+)>) { table[$1] } - end - - def set(val) - @value = check(val) - end - - private - - def check(val) - setup_rb_error "config: --#{name} requires argument" unless val - val - end - end - - class BoolItem < Item - def config_type - 'bool' - end - - def help_opt - "--#{@name}" - end - - private - - def check(val) - return 'yes' unless val - case val - when /\Ay(es)?\z/i, /\At(rue)?\z/i then 'yes' - when /\An(o)?\z/i, /\Af(alse)\z/i then 'no' - else - setup_rb_error "config: --#{@name} accepts only yes/no for argument" - end - end - end - - class PathItem < Item - def config_type - 'path' - end - - private - - def check(path) - setup_rb_error "config: --#{@name} requires argument" unless path - path[0,1] == '$' ? path : File.expand_path(path) - end - end - - class ProgramItem < Item - def config_type - 'program' - end - end - - class SelectItem < Item - def initialize(name, selection, default, desc) - super - @ok = selection.split('/') - end - - def config_type - 'select' - end - - private - - def check(val) - unless @ok.include?(val.strip) - setup_rb_error "config: use --#{@name}=#{@template} (#{val})" - end - val.strip - end - end - - class ExecItem < Item - def initialize(name, selection, desc, &block) - super name, selection, nil, desc - @ok = selection.split('/') - @action = block - end - - def config_type - 'exec' - end - - def value? - false - end - - def resolve(table) - setup_rb_error "$#{name()} wrongly used as option value" - end - - undef set - - def evaluate(val, table) - v = val.strip.downcase - unless @ok.include?(v) - setup_rb_error "invalid option --#{@name}=#{val} (use #{@template})" - end - @action.call v, table - end - end - - class PackageSelectionItem < Item - def initialize(name, template, default, help_default, desc) - super name, template, default, desc - @help_default = help_default - end - - attr_reader :help_default - - def config_type - 'package' - end - - private - - def check(val) - unless File.dir?("packages/#{val}") - setup_rb_error "config: no such package: #{val}" - end - val - end - end - - class MetaConfigEnvironment - def initialize(config, installer) - @config = config - @installer = installer - end - - def config_names - @config.names - end - - def config?(name) - @config.key?(name) - end - - def bool_config?(name) - @config.lookup(name).config_type == 'bool' - end - - def path_config?(name) - @config.lookup(name).config_type == 'path' - end - - def value_config?(name) - @config.lookup(name).config_type != 'exec' - end - - def add_config(item) - @config.add item - end - - def add_bool_config(name, default, desc) - @config.add BoolItem.new(name, 'yes/no', default ? 'yes' : 'no', desc) - end - - def add_path_config(name, default, desc) - @config.add PathItem.new(name, 'path', default, desc) - end - - def set_config_default(name, default) - @config.lookup(name).default = default - end - - def remove_config(name) - @config.remove(name) - end - - # For only multipackage - def packages - raise '[setup.rb fatal] multi-package metaconfig API packages() called for single-package; contact application package vendor' unless @installer - @installer.packages - end - - # For only multipackage - def declare_packages(list) - raise '[setup.rb fatal] multi-package metaconfig API declare_packages() called for single-package; contact application package vendor' unless @installer - @installer.packages = list - end - end - -end # class ConfigTable - - -# This module requires: #verbose?, #no_harm? -module FileOperations - - def mkdir_p(dirname, prefix = nil) - dirname = prefix + File.expand_path(dirname) if prefix - $stderr.puts "mkdir -p #{dirname}" if verbose? - return if no_harm? - - # Does not check '/', it's too abnormal. - dirs = File.expand_path(dirname).split(%r<(?=/)>) - if /\A[a-z]:\z/i =~ dirs[0] - disk = dirs.shift - dirs[0] = disk + dirs[0] - end - dirs.each_index do |idx| - path = dirs[0..idx].join('') - Dir.mkdir path unless File.dir?(path) - end - end - - def rm_f(path) - $stderr.puts "rm -f #{path}" if verbose? - return if no_harm? - force_remove_file path - end - - def rm_rf(path) - $stderr.puts "rm -rf #{path}" if verbose? - return if no_harm? - remove_tree path - end - - def remove_tree(path) - if File.symlink?(path) - remove_file path - elsif File.dir?(path) - remove_tree0 path - else - force_remove_file path - end - end - - def remove_tree0(path) - Dir.foreach(path) do |ent| - next if ent == '.' - next if ent == '..' - entpath = "#{path}/#{ent}" - if File.symlink?(entpath) - remove_file entpath - elsif File.dir?(entpath) - remove_tree0 entpath - else - force_remove_file entpath - end - end - begin - Dir.rmdir path - rescue Errno::ENOTEMPTY - # directory may not be empty - end - end - - def move_file(src, dest) - force_remove_file dest - begin - File.rename src, dest - rescue - File.open(dest, 'wb') {|f| - f.write File.binread(src) - } - File.chmod File.stat(src).mode, dest - File.unlink src - end - end - - def force_remove_file(path) - begin - remove_file path - rescue - end - end - - def remove_file(path) - File.chmod 0777, path - File.unlink path - end - - def install(from, dest, mode, prefix = nil) - $stderr.puts "install #{from} #{dest}" if verbose? - return if no_harm? - - realdest = prefix ? prefix + File.expand_path(dest) : dest - realdest = File.join(realdest, File.basename(from)) if File.dir?(realdest) - str = File.binread(from) - if diff?(str, realdest) - verbose_off { - rm_f realdest if File.exist?(realdest) - } - File.open(realdest, 'wb') {|f| - f.write str - } - File.chmod mode, realdest - - File.open("#{objdir_root()}/InstalledFiles", 'a') {|f| - if prefix - f.puts realdest.sub(prefix, '') - else - f.puts realdest - end - } - end - end - - def diff?(new_content, path) - return true unless File.exist?(path) - new_content != File.binread(path) - end - - def command(*args) - $stderr.puts args.join(' ') if verbose? - system(*args) or raise RuntimeError, - "system(#{args.map{|a| a.inspect }.join(' ')}) failed" - end - - def ruby(*args) - command config('rubyprog'), *args - end - - def make(task = nil) - command(*[config('makeprog'), task].compact) - end - - def extdir?(dir) - File.exist?("#{dir}/MANIFEST") or File.exist?("#{dir}/extconf.rb") - end - - def files_of(dir) - Dir.open(dir) {|d| - return d.select {|ent| File.file?("#{dir}/#{ent}") } - } - end - - DIR_REJECT = %w( . .. CVS SCCS RCS CVS.adm .svn ) - - def directories_of(dir) - Dir.open(dir) {|d| - return d.select {|ent| File.dir?("#{dir}/#{ent}") } - DIR_REJECT - } - end - -end - - -# This module requires: #srcdir_root, #objdir_root, #relpath -module HookScriptAPI - - def get_config(key) - @config[key] - end - - alias config get_config - - # obsolete: use metaconfig to change configuration - def set_config(key, val) - @config[key] = val - end - - # - # srcdir/objdir (works only in the package directory) - # - - def curr_srcdir - "#{srcdir_root()}/#{relpath()}" - end - - def curr_objdir - "#{objdir_root()}/#{relpath()}" - end - - def srcfile(path) - "#{curr_srcdir()}/#{path}" - end - - def srcexist?(path) - File.exist?(srcfile(path)) - end - - def srcdirectory?(path) - File.dir?(srcfile(path)) - end - - def srcfile?(path) - File.file?(srcfile(path)) - end - - def srcentries(path = '.') - Dir.open("#{curr_srcdir()}/#{path}") {|d| - return d.to_a - %w(. ..) - } - end - - def srcfiles(path = '.') - srcentries(path).select {|fname| - File.file?(File.join(curr_srcdir(), path, fname)) - } - end - - def srcdirectories(path = '.') - srcentries(path).select {|fname| - File.dir?(File.join(curr_srcdir(), path, fname)) - } - end - -end - - -class ToplevelInstaller - - Version = '3.4.1' - Copyright = 'Copyright (c) 2000-2005 Minero Aoki' - - TASKS = [ - [ 'all', 'do config, setup, then install' ], - [ 'config', 'saves your configurations' ], - [ 'show', 'shows current configuration' ], - [ 'setup', 'compiles ruby extentions and others' ], - [ 'install', 'installs files' ], - [ 'test', 'run all tests in test/' ], - [ 'clean', "does `make clean' for each extention" ], - [ 'distclean',"does `make distclean' for each extention" ] - ] - - def ToplevelInstaller.invoke - config = ConfigTable.new(load_rbconfig()) - config.load_standard_entries - config.load_multipackage_entries if multipackage? - config.fixup - klass = (multipackage?() ? ToplevelInstallerMulti : ToplevelInstaller) - klass.new(File.dirname($0), config).invoke - end - - def ToplevelInstaller.multipackage? - File.dir?(File.dirname($0) + '/packages') - end - - def ToplevelInstaller.load_rbconfig - if arg = ARGV.detect {|arg| /\A--rbconfig=/ =~ arg } - ARGV.delete(arg) - load File.expand_path(arg.split(/=/, 2)[1]) - $".push 'rbconfig.rb' - else - require 'rbconfig' - end - ::Config::CONFIG - end - - def initialize(ardir_root, config) - @ardir = File.expand_path(ardir_root) - @config = config - # cache - @valid_task_re = nil - end - - def config(key) - @config[key] - end - - def inspect - "#<#{self.class} #{__id__()}>" - end - - def invoke - run_metaconfigs - case task = parsearg_global() - when nil, 'all' - parsearg_config - init_installers - exec_config - exec_setup - exec_install - else - case task - when 'config', 'test' - ; - when 'clean', 'distclean' - @config.load_savefile if File.exist?(@config.savefile) - else - @config.load_savefile - end - __send__ "parsearg_#{task}" - init_installers - __send__ "exec_#{task}" - end - end - - def run_metaconfigs - @config.load_script "#{@ardir}/metaconfig" - end - - def init_installers - @installer = Installer.new(@config, @ardir, File.expand_path('.')) - end - - # - # Hook Script API bases - # - - def srcdir_root - @ardir - end - - def objdir_root - '.' - end - - def relpath - '.' - end - - # - # Option Parsing - # - - def parsearg_global - while arg = ARGV.shift - case arg - when /\A\w+\z/ - setup_rb_error "invalid task: #{arg}" unless valid_task?(arg) - return arg - when '-q', '--quiet' - @config.verbose = false - when '--verbose' - @config.verbose = true - when '--help' - print_usage $stdout - exit 0 - when '--version' - puts "#{File.basename($0)} version #{Version}" - exit 0 - when '--copyright' - puts Copyright - exit 0 - else - setup_rb_error "unknown global option '#{arg}'" - end - end - nil - end - - def valid_task?(t) - valid_task_re() =~ t - end - - def valid_task_re - @valid_task_re ||= /\A(?:#{TASKS.map {|task,desc| task }.join('|')})\z/ - end - - def parsearg_no_options - unless ARGV.empty? - task = caller(0).first.slice(%r<`parsearg_(\w+)'>, 1) - setup_rb_error "#{task}: unknown options: #{ARGV.join(' ')}" - end - end - - alias parsearg_show parsearg_no_options - alias parsearg_setup parsearg_no_options - alias parsearg_test parsearg_no_options - alias parsearg_clean parsearg_no_options - alias parsearg_distclean parsearg_no_options - - def parsearg_config - evalopt = [] - set = [] - @config.config_opt = [] - while i = ARGV.shift - if /\A--?\z/ =~ i - @config.config_opt = ARGV.dup - break - end - name, value = *@config.parse_opt(i) - if @config.value_config?(name) - @config[name] = value - else - evalopt.push [name, value] - end - set.push name - end - evalopt.each do |name, value| - @config.lookup(name).evaluate value, @config - end - # Check if configuration is valid - set.each do |n| - @config[n] if @config.value_config?(n) - end - end - - def parsearg_install - @config.no_harm = false - @config.install_prefix = '' - while a = ARGV.shift - case a - when '--no-harm' - @config.no_harm = true - when /\A--prefix=/ - path = a.split(/=/, 2)[1] - path = File.expand_path(path) unless path[0,1] == '/' - @config.install_prefix = path - else - setup_rb_error "install: unknown option #{a}" - end - end - end - - def print_usage(out) - out.puts 'Typical Installation Procedure:' - out.puts " $ ruby #{File.basename $0} config" - out.puts " $ ruby #{File.basename $0} setup" - out.puts " # ruby #{File.basename $0} install (may require root privilege)" - out.puts - out.puts 'Detailed Usage:' - out.puts " ruby #{File.basename $0} " - out.puts " ruby #{File.basename $0} [] []" - - fmt = " %-24s %s\n" - out.puts - out.puts 'Global options:' - out.printf fmt, '-q,--quiet', 'suppress message outputs' - out.printf fmt, ' --verbose', 'output messages verbosely' - out.printf fmt, ' --help', 'print this message' - out.printf fmt, ' --version', 'print version and quit' - out.printf fmt, ' --copyright', 'print copyright and quit' - out.puts - out.puts 'Tasks:' - TASKS.each do |name, desc| - out.printf fmt, name, desc - end - - fmt = " %-24s %s [%s]\n" - out.puts - out.puts 'Options for CONFIG or ALL:' - @config.each do |item| - out.printf fmt, item.help_opt, item.description, item.help_default - end - out.printf fmt, '--rbconfig=path', 'rbconfig.rb to load',"running ruby's" - out.puts - out.puts 'Options for INSTALL:' - out.printf fmt, '--no-harm', 'only display what to do if given', 'off' - out.printf fmt, '--prefix=path', 'install path prefix', '' - out.puts - end - - # - # Task Handlers - # - - def exec_config - @installer.exec_config - @config.save # must be final - end - - def exec_setup - @installer.exec_setup - end - - def exec_install - @installer.exec_install - end - - def exec_test - @installer.exec_test - end - - def exec_show - @config.each do |i| - printf "%-20s %s\n", i.name, i.value if i.value? - end - end - - def exec_clean - @installer.exec_clean - end - - def exec_distclean - @installer.exec_distclean - end - -end # class ToplevelInstaller - - -class ToplevelInstallerMulti < ToplevelInstaller - - include FileOperations - - def initialize(ardir_root, config) - super - @packages = directories_of("#{@ardir}/packages") - raise 'no package exists' if @packages.empty? - @root_installer = Installer.new(@config, @ardir, File.expand_path('.')) - end - - def run_metaconfigs - @config.load_script "#{@ardir}/metaconfig", self - @packages.each do |name| - @config.load_script "#{@ardir}/packages/#{name}/metaconfig" - end - end - - attr_reader :packages - - def packages=(list) - raise 'package list is empty' if list.empty? - list.each do |name| - raise "directory packages/#{name} does not exist"\ - unless File.dir?("#{@ardir}/packages/#{name}") - end - @packages = list - end - - def init_installers - @installers = {} - @packages.each do |pack| - @installers[pack] = Installer.new(@config, - "#{@ardir}/packages/#{pack}", - "packages/#{pack}") - end - with = extract_selection(config('with')) - without = extract_selection(config('without')) - @selected = @installers.keys.select {|name| - (with.empty? or with.include?(name)) \ - and not without.include?(name) - } - end - - def extract_selection(list) - a = list.split(/,/) - a.each do |name| - setup_rb_error "no such package: #{name}" unless @installers.key?(name) - end - a - end - - def print_usage(f) - super - f.puts 'Inluded packages:' - f.puts ' ' + @packages.sort.join(' ') - f.puts - end - - # - # Task Handlers - # - - def exec_config - run_hook 'pre-config' - each_selected_installers {|inst| inst.exec_config } - run_hook 'post-config' - @config.save # must be final - end - - def exec_setup - run_hook 'pre-setup' - each_selected_installers {|inst| inst.exec_setup } - run_hook 'post-setup' - end - - def exec_install - run_hook 'pre-install' - each_selected_installers {|inst| inst.exec_install } - run_hook 'post-install' - end - - def exec_test - run_hook 'pre-test' - each_selected_installers {|inst| inst.exec_test } - run_hook 'post-test' - end - - def exec_clean - rm_f @config.savefile - run_hook 'pre-clean' - each_selected_installers {|inst| inst.exec_clean } - run_hook 'post-clean' - end - - def exec_distclean - rm_f @config.savefile - run_hook 'pre-distclean' - each_selected_installers {|inst| inst.exec_distclean } - run_hook 'post-distclean' - end - - # - # lib - # - - def each_selected_installers - Dir.mkdir 'packages' unless File.dir?('packages') - @selected.each do |pack| - $stderr.puts "Processing the package `#{pack}' ..." if verbose? - Dir.mkdir "packages/#{pack}" unless File.dir?("packages/#{pack}") - Dir.chdir "packages/#{pack}" - yield @installers[pack] - Dir.chdir '../..' - end - end - - def run_hook(id) - @root_installer.run_hook id - end - - # module FileOperations requires this - def verbose? - @config.verbose? - end - - # module FileOperations requires this - def no_harm? - @config.no_harm? - end - -end # class ToplevelInstallerMulti - - -class Installer - - FILETYPES = %w( bin lib ext data conf man ) - - include FileOperations - include HookScriptAPI - - def initialize(config, srcroot, objroot) - @config = config - @srcdir = File.expand_path(srcroot) - @objdir = File.expand_path(objroot) - @currdir = '.' - end - - def inspect - "#<#{self.class} #{File.basename(@srcdir)}>" - end - - def noop(rel) - end - - # - # Hook Script API base methods - # - - def srcdir_root - @srcdir - end - - def objdir_root - @objdir - end - - def relpath - @currdir - end - - # - # Config Access - # - - # module FileOperations requires this - def verbose? - @config.verbose? - end - - # module FileOperations requires this - def no_harm? - @config.no_harm? - end - - def verbose_off - begin - save, @config.verbose = @config.verbose?, false - yield - ensure - @config.verbose = save - end - end - - # - # TASK config - # - - def exec_config - exec_task_traverse 'config' - end - - alias config_dir_bin noop - alias config_dir_lib noop - - def config_dir_ext(rel) - extconf if extdir?(curr_srcdir()) - end - - alias config_dir_data noop - alias config_dir_conf noop - alias config_dir_man noop - - def extconf - ruby "#{curr_srcdir()}/extconf.rb", *@config.config_opt - end - - # - # TASK setup - # - - def exec_setup - exec_task_traverse 'setup' - end - - def setup_dir_bin(rel) - files_of(curr_srcdir()).each do |fname| - update_shebang_line "#{curr_srcdir()}/#{fname}" - end - end - - alias setup_dir_lib noop - - def setup_dir_ext(rel) - make if extdir?(curr_srcdir()) - end - - alias setup_dir_data noop - alias setup_dir_conf noop - alias setup_dir_man noop - - def update_shebang_line(path) - return if no_harm? - return if config('shebang') == 'never' - old = Shebang.load(path) - if old - $stderr.puts "warning: #{path}: Shebang line includes too many args. It is not portable and your program may not work." if old.args.size > 1 - new = new_shebang(old) - return if new.to_s == old.to_s - else - return unless config('shebang') == 'all' - new = Shebang.new(config('rubypath')) - end - $stderr.puts "updating shebang: #{File.basename(path)}" if verbose? - open_atomic_writer(path) {|output| - File.open(path, 'rb') {|f| - f.gets if old # discard - output.puts new.to_s - output.print f.read - } - } - end - - def new_shebang(old) - if /\Aruby/ =~ File.basename(old.cmd) - Shebang.new(config('rubypath'), old.args) - elsif File.basename(old.cmd) == 'env' and old.args.first == 'ruby' - Shebang.new(config('rubypath'), old.args[1..-1]) - else - return old unless config('shebang') == 'all' - Shebang.new(config('rubypath')) - end - end - - def open_atomic_writer(path, &block) - tmpfile = File.basename(path) + '.tmp' - begin - File.open(tmpfile, 'wb', &block) - File.rename tmpfile, File.basename(path) - ensure - File.unlink tmpfile if File.exist?(tmpfile) - end - end - - class Shebang - def Shebang.load(path) - line = nil - File.open(path) {|f| - line = f.gets - } - return nil unless /\A#!/ =~ line - parse(line) - end - - def Shebang.parse(line) - cmd, *args = *line.strip.sub(/\A\#!/, '').split(' ') - new(cmd, args) - end - - def initialize(cmd, args = []) - @cmd = cmd - @args = args - end - - attr_reader :cmd - attr_reader :args - - def to_s - "#! #{@cmd}" + (@args.empty? ? '' : " #{@args.join(' ')}") - end - end - - # - # TASK install - # - - def exec_install - rm_f 'InstalledFiles' - exec_task_traverse 'install' - end - - def install_dir_bin(rel) - install_files targetfiles(), "#{config('bindir')}/#{rel}", 0755 - end - - def install_dir_lib(rel) - install_files libfiles(), "#{config('rbdir')}/#{rel}", 0644 - end - - def install_dir_ext(rel) - return unless extdir?(curr_srcdir()) - install_files rubyextentions('.'), - "#{config('sodir')}/#{File.dirname(rel)}", - 0555 - end - - def install_dir_data(rel) - install_files targetfiles(), "#{config('datadir')}/#{rel}", 0644 - end - - def install_dir_conf(rel) - # FIXME: should not remove current config files - # (rename previous file to .old/.org) - install_files targetfiles(), "#{config('sysconfdir')}/#{rel}", 0644 - end - - def install_dir_man(rel) - install_files targetfiles(), "#{config('mandir')}/#{rel}", 0644 - end - - def install_files(list, dest, mode) - mkdir_p dest, @config.install_prefix - list.each do |fname| - install fname, dest, mode, @config.install_prefix - end - end - - def libfiles - glob_reject(%w(*.y *.output), targetfiles()) - end - - def rubyextentions(dir) - ents = glob_select("*.#{@config.dllext}", targetfiles()) - if ents.empty? - setup_rb_error "no ruby extention exists: 'ruby #{$0} setup' first" - end - ents - end - - def targetfiles - mapdir(existfiles() - hookfiles()) - end - - def mapdir(ents) - ents.map {|ent| - if File.exist?(ent) - then ent # objdir - else "#{curr_srcdir()}/#{ent}" # srcdir - end - } - end - - # picked up many entries from cvs-1.11.1/src/ignore.c - JUNK_FILES = %w( - core RCSLOG tags TAGS .make.state - .nse_depinfo #* .#* cvslog.* ,* .del-* *.olb - *~ *.old *.bak *.BAK *.orig *.rej _$* *$ - - *.org *.in .* - ) - - def existfiles - glob_reject(JUNK_FILES, (files_of(curr_srcdir()) | files_of('.'))) - end - - def hookfiles - %w( pre-%s post-%s pre-%s.rb post-%s.rb ).map {|fmt| - %w( config setup install clean ).map {|t| sprintf(fmt, t) } - }.flatten - end - - def glob_select(pat, ents) - re = globs2re([pat]) - ents.select {|ent| re =~ ent } - end - - def glob_reject(pats, ents) - re = globs2re(pats) - ents.reject {|ent| re =~ ent } - end - - GLOB2REGEX = { - '.' => '\.', - '$' => '\$', - '#' => '\#', - '*' => '.*' - } - - def globs2re(pats) - /\A(?:#{ - pats.map {|pat| pat.gsub(/[\.\$\#\*]/) {|ch| GLOB2REGEX[ch] } }.join('|') - })\z/ - end - - # - # TASK test - # - - TESTDIR = 'test' - - def exec_test - unless File.directory?('test') - $stderr.puts 'no test in this package' if verbose? - return - end - $stderr.puts 'Running tests...' if verbose? - begin - require 'test/unit' - rescue LoadError - setup_rb_error 'test/unit cannot loaded. You need Ruby 1.8 or later to invoke this task.' - end - runner = Test::Unit::AutoRunner.new(true) - runner.to_run << TESTDIR - runner.run - end - - # - # TASK clean - # - - def exec_clean - exec_task_traverse 'clean' - rm_f @config.savefile - rm_f 'InstalledFiles' - end - - alias clean_dir_bin noop - alias clean_dir_lib noop - alias clean_dir_data noop - alias clean_dir_conf noop - alias clean_dir_man noop - - def clean_dir_ext(rel) - return unless extdir?(curr_srcdir()) - make 'clean' if File.file?('Makefile') - end - - # - # TASK distclean - # - - def exec_distclean - exec_task_traverse 'distclean' - rm_f @config.savefile - rm_f 'InstalledFiles' - end - - alias distclean_dir_bin noop - alias distclean_dir_lib noop - - def distclean_dir_ext(rel) - return unless extdir?(curr_srcdir()) - make 'distclean' if File.file?('Makefile') - end - - alias distclean_dir_data noop - alias distclean_dir_conf noop - alias distclean_dir_man noop - - # - # Traversing - # - - def exec_task_traverse(task) - run_hook "pre-#{task}" - FILETYPES.each do |type| - if type == 'ext' and config('without-ext') == 'yes' - $stderr.puts 'skipping ext/* by user option' if verbose? - next - end - traverse task, type, "#{task}_dir_#{type}" - end - run_hook "post-#{task}" - end - - def traverse(task, rel, mid) - dive_into(rel) { - run_hook "pre-#{task}" - __send__ mid, rel.sub(%r[\A.*?(?:/|\z)], '') - directories_of(curr_srcdir()).each do |d| - traverse task, "#{rel}/#{d}", mid - end - run_hook "post-#{task}" - } - end - - def dive_into(rel) - return unless File.dir?("#{@srcdir}/#{rel}") - - dir = File.basename(rel) - Dir.mkdir dir unless File.dir?(dir) - prevdir = Dir.pwd - Dir.chdir dir - $stderr.puts '---> ' + rel if verbose? - @currdir = rel - yield - Dir.chdir prevdir - $stderr.puts '<--- ' + rel if verbose? - @currdir = File.dirname(rel) - end - - def run_hook(id) - path = [ "#{curr_srcdir()}/#{id}", - "#{curr_srcdir()}/#{id}.rb" ].detect {|cand| File.file?(cand) } - return unless path - begin - instance_eval File.read(path), path, 1 - rescue - raise if $DEBUG - setup_rb_error "hook #{path} failed:\n" + $!.message - end - end - -end # class Installer - - -class SetupError < StandardError; end - -def setup_rb_error(msg) - raise SetupError, msg -end - -if $0 == __FILE__ - begin - ToplevelInstaller.invoke - rescue SetupError - raise if $DEBUG - $stderr.puts $!.message - $stderr.puts "Try 'ruby #{$0} --help' for detailed usage." - exit 1 - end -end diff --git a/vendor/gems/rubytree-0.5.2/test/test_binarytree.rb b/vendor/gems/rubytree-0.5.2/test/test_binarytree.rb deleted file mode 100644 index 8d866456..00000000 --- a/vendor/gems/rubytree-0.5.2/test/test_binarytree.rb +++ /dev/null @@ -1,204 +0,0 @@ -#!/usr/bin/env ruby - -# test_binarytree.rb -# -# $Revision: 1.5 $ by $Author: anupamsg $ -# $Name: $ -# -# Copyright (c) 2006, 2007 Anupam Sengupta -# -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: -# -# - Redistributions of source code must retain the above copyright notice, this -# list of conditions and the following disclaimer. -# -# - Redistributions in binary form must reproduce the above copyright notice, this -# list of conditions and the following disclaimer in the documentation and/or -# other materials provided with the distribution. -# -# - Neither the name of the organization nor the names of its contributors may -# be used to endorse or promote products derived from this software without -# specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER 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. -# - -require 'test/unit' -require 'tree/binarytree' - -module TestTree - # Test class for the Tree node. - class TestBinaryTreeNode < Test::Unit::TestCase - - def setup - @root = Tree::BinaryTreeNode.new("ROOT", "Root Node") - - @left_child1 = Tree::BinaryTreeNode.new("A Child at Left", "Child Node @ left") - @right_child1 = Tree::BinaryTreeNode.new("B Child at Right", "Child Node @ right") - - end - - def teardown - @root.remove!(@left_child1) - @root.remove!(@right_child1) - @root = nil - end - - def test_initialize - assert_not_nil(@root, "Binary tree's Root should have been created") - end - - def test_add - @root.add @left_child1 - assert_same(@left_child1, @root.leftChild, "The left node should be left_child1") - assert_same(@left_child1, @root.firstChild, "The first node should be left_child1") - - @root.add @right_child1 - assert_same(@right_child1, @root.rightChild, "The right node should be right_child1") - assert_same(@right_child1, @root.lastChild, "The first node should be right_child1") - - assert_raise RuntimeError do - @root.add Tree::BinaryTreeNode.new("The third child!") - end - - assert_raise RuntimeError do - @root << Tree::BinaryTreeNode.new("The third child!") - end - end - - def test_leftChild - @root << @left_child1 - @root << @right_child1 - assert_same(@left_child1, @root.leftChild, "The left child should be 'left_child1") - assert_not_same(@right_child1, @root.leftChild, "The right_child1 is not the left child") - end - - def test_rightChild - @root << @left_child1 - @root << @right_child1 - assert_same(@right_child1, @root.rightChild, "The right child should be 'right_child1") - assert_not_same(@left_child1, @root.rightChild, "The left_child1 is not the left child") - end - - def test_leftChild_equals - @root << @left_child1 - @root << @right_child1 - assert_same(@left_child1, @root.leftChild, "The left child should be 'left_child1") - - @root.leftChild = Tree::BinaryTreeNode.new("New Left Child") - assert_equal("New Left Child", @root.leftChild.name, "The left child should now be the new child") - assert_equal("B Child at Right", @root.lastChild.name, "The last child should now be the right child") - - # Now set the left child as nil, and retest - @root.leftChild = nil - assert_nil(@root.leftChild, "The left child should now be nil") - assert_nil(@root.firstChild, "The first child is now nil") - assert_equal("B Child at Right", @root.lastChild.name, "The last child should now be the right child") - end - - def test_rightChild_equals - @root << @left_child1 - @root << @right_child1 - assert_same(@right_child1, @root.rightChild, "The right child should be 'right_child1") - - @root.rightChild = Tree::BinaryTreeNode.new("New Right Child") - assert_equal("New Right Child", @root.rightChild.name, "The right child should now be the new child") - assert_equal("A Child at Left", @root.firstChild.name, "The first child should now be the left child") - assert_equal("New Right Child", @root.lastChild.name, "The last child should now be the right child") - - # Now set the right child as nil, and retest - @root.rightChild = nil - assert_nil(@root.rightChild, "The right child should now be nil") - assert_equal("A Child at Left", @root.firstChild.name, "The first child should now be the left child") - assert_nil(@root.lastChild, "The first child is now nil") - end - - def test_isLeftChild_eh - @root << @left_child1 - @root << @right_child1 - - assert(@left_child1.isLeftChild?, "left_child1 should be the left child") - assert(!@right_child1.isLeftChild?, "left_child1 should be the left child") - - # Now set the right child as nil, and retest - @root.rightChild = nil - assert(@left_child1.isLeftChild?, "left_child1 should be the left child") - - assert(!@root.isLeftChild?, "Root is neither left child nor right") - end - - def test_isRightChild_eh - @root << @left_child1 - @root << @right_child1 - - assert(@right_child1.isRightChild?, "right_child1 should be the right child") - assert(!@left_child1.isRightChild?, "right_child1 should be the right child") - - # Now set the left child as nil, and retest - @root.leftChild = nil - assert(@right_child1.isRightChild?, "right_child1 should be the right child") - assert(!@root.isRightChild?, "Root is neither left child nor right") - end - - def test_swap_children - @root << @left_child1 - @root << @right_child1 - - assert(@right_child1.isRightChild?, "right_child1 should be the right child") - assert(!@left_child1.isRightChild?, "right_child1 should be the right child") - - @root.swap_children - - assert(@right_child1.isLeftChild?, "right_child1 should now be the left child") - assert(@left_child1.isRightChild?, "left_child1 should now be the right child") - assert_equal(@right_child1, @root.firstChild, "right_child1 should now be the first child") - assert_equal(@left_child1, @root.lastChild, "left_child1 should now be the last child") - assert_equal(@right_child1, @root[0], "right_child1 should now be the first child") - assert_equal(@left_child1, @root[1], "left_child1 should now be the last child") - end - end -end - -# $Log: test_binarytree.rb,v $ -# Revision 1.5 2007/12/22 00:28:59 anupamsg -# Added more test cases, and enabled ZenTest compatibility. -# -# Revision 1.4 2007/12/18 23:11:29 anupamsg -# Minor documentation changes in the binarytree class. -# -# Revision 1.3 2007/10/02 03:07:30 anupamsg -# * Rakefile: Added an optional task for rcov code coverage. -# -# * test/test_binarytree.rb: Removed the unnecessary dependency on "Person" class. -# -# * test/test_tree.rb: Removed dependency on the redundant "Person" class. -# -# Revision 1.2 2007/08/30 22:06:13 anupamsg -# Added a new swap_children method for the Binary Tree class. -# Also made minor documentation updates and test additions. -# -# Revision 1.1 2007/07/21 04:52:37 anupamsg -# Renamed the test files. -# -# Revision 1.4 2007/07/19 02:03:57 anupamsg -# Minor syntax correction. -# -# Revision 1.3 2007/07/19 02:02:12 anupamsg -# Removed useless files (including rdoc, which should be generated for each release. -# -# Revision 1.2 2007/07/18 20:15:06 anupamsg -# Added two predicate methods in BinaryTreeNode to determine whether a node -# is a left or a right node. -# diff --git a/vendor/gems/rubytree-0.5.2/test/test_tree.rb b/vendor/gems/rubytree-0.5.2/test/test_tree.rb deleted file mode 100644 index d1aa1211..00000000 --- a/vendor/gems/rubytree-0.5.2/test/test_tree.rb +++ /dev/null @@ -1,718 +0,0 @@ -#!/usr/bin/env ruby - -# testtree.rb -# -# $Revision: 1.6 $ by $Author: anupamsg $ -# $Name: $ -# -# Copyright (c) 2006, 2007 Anupam Sengupta -# -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: -# -# - Redistributions of source code must retain the above copyright notice, this -# list of conditions and the following disclaimer. -# -# - Redistributions in binary form must reproduce the above copyright notice, this -# list of conditions and the following disclaimer in the documentation and/or -# other materials provided with the distribution. -# -# - Neither the name of the organization nor the names of its contributors may -# be used to endorse or promote products derived from this software without -# specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER 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. -# - -require 'test/unit' -require 'tree' - -module TestTree - # Test class for the Tree node. - class TestTreeNode < Test::Unit::TestCase - - Person = Struct::new(:First, :last) - - def setup - @root = Tree::TreeNode.new("ROOT", "Root Node") - - @child1 = Tree::TreeNode.new("Child1", "Child Node 1") - @child2 = Tree::TreeNode.new("Child2", "Child Node 2") - @child3 = Tree::TreeNode.new("Child3", "Child Node 3") - @child4 = Tree::TreeNode.new("Child31", "Grand Child 1") - - end - - # Create this structure for the tests - # - # +----------+ - # | ROOT | - # +-+--------+ - # | - # | +---------------+ - # +----+ CHILD1 | - # | +---------------+ - # | - # | +---------------+ - # +----+ CHILD2 | - # | +---------------+ - # | - # | +---------------+ +------------------+ - # +----+ CHILD3 +---+ CHILD4 | - # +---------------+ +------------------+ - # - def loadChildren - @root << @child1 - @root << @child2 - @root << @child3 << @child4 - end - - def teardown - @root = nil - end - - def test_root_setup - assert_not_nil(@root, "Root cannot be nil") - assert_nil(@root.parent, "Parent of root node should be nil") - assert_not_nil(@root.name, "Name should not be nil") - assert_equal("ROOT", @root.name, "Name should be 'ROOT'") - assert_equal("Root Node", @root.content, "Content should be 'Root Node'") - assert(@root.isRoot?, "Should identify as root") - assert(!@root.hasChildren?, "Cannot have any children") - assert(@root.hasContent?, "This root should have content") - assert_equal(1, @root.size, "Number of nodes should be one") - assert_nil(@root.siblings, "Root cannot have any children") - - assert_raise(RuntimeError) { Tree::TreeNode.new(nil) } - end - - def test_root - loadChildren - - assert_same(@root, @root.root, "Root's root is self") - assert_same(@root, @child1.root, "Root should be ROOT") - assert_same(@root, @child4.root, "Root should be ROOT") - end - - def test_hasContent_eh - aNode = Tree::TreeNode.new("A Node") - assert_nil(aNode.content, "The node should not have content") - assert(!aNode.hasContent?, "The node should not have content") - - aNode.content = "Something" - assert_not_nil(aNode.content, "The node should now have content") - assert(aNode.hasContent?, "The node should now have content") - end - - def test_length - loadChildren - assert_equal(@root.size, @root.length, "Length and size methods should return the same result") - end - - def test_spaceship # Test the <=> operator. - firstNode = Tree::TreeNode.new(1) - secondNode = Tree::TreeNode.new(2) - - assert_equal(firstNode <=> nil, +1) - assert_equal(firstNode <=> secondNode, -1) - - secondNode = Tree::TreeNode.new(1) - assert_equal(firstNode <=> secondNode, 0) - - firstNode = Tree::TreeNode.new("ABC") - secondNode = Tree::TreeNode.new("XYZ") - - assert_equal(firstNode <=> nil, +1) - assert_equal(firstNode <=> secondNode, -1) - - secondNode = Tree::TreeNode.new("ABC") - assert_equal(firstNode <=> secondNode, 0) - end - - def test_to_s - aNode = Tree::TreeNode.new("A Node", "Some Content") - - expectedString = "Node Name: A Node Content: Some Content Parent: Children: 0 Total Nodes: 1" - - assert_equal(expectedString, aNode.to_s, "The string representation should be same") - end - - def test_firstSibling - loadChildren - - assert_same(@root, @root.firstSibling, "Root's first sibling is itself") - assert_same(@child1, @child1.firstSibling, "Child1's first sibling is itself") - assert_same(@child1, @child2.firstSibling, "Child2's first sibling should be child1") - assert_same(@child1, @child3.firstSibling, "Child3's first sibling should be child1") - assert_not_same(@child1, @child4.firstSibling, "Child4's first sibling is itself") - end - - def test_isFirstSibling_eh - loadChildren - - assert(@root.isFirstSibling?, "Root's first sibling is itself") - assert( @child1.isFirstSibling?, "Child1's first sibling is itself") - assert(!@child2.isFirstSibling?, "Child2 is not the first sibling") - assert(!@child3.isFirstSibling?, "Child3 is not the first sibling") - assert( @child4.isFirstSibling?, "Child4's first sibling is itself") - end - - def test_isLastSibling_eh - loadChildren - - assert(@root.isLastSibling?, "Root's last sibling is itself") - assert(!@child1.isLastSibling?, "Child1 is not the last sibling") - assert(!@child2.isLastSibling?, "Child2 is not the last sibling") - assert( @child3.isLastSibling?, "Child3's last sibling is itself") - assert( @child4.isLastSibling?, "Child4's last sibling is itself") - end - - def test_lastSibling - loadChildren - - assert_same(@root, @root.lastSibling, "Root's last sibling is itself") - assert_same(@child3, @child1.lastSibling, "Child1's last sibling should be child3") - assert_same(@child3, @child2.lastSibling, "Child2's last sibling should be child3") - assert_same(@child3, @child3.lastSibling, "Child3's last sibling should be itself") - assert_not_same(@child3, @child4.lastSibling, "Child4's last sibling is itself") - end - - def test_siblings - loadChildren - - siblings = [] - @child1.siblings { |sibling| siblings << sibling} - assert_equal(2, siblings.length, "Should have two siblings") - assert(siblings.include?(@child2), "Should have 2nd child as sibling") - assert(siblings.include?(@child3), "Should have 3rd child as sibling") - - siblings.clear - siblings = @child1.siblings - assert_equal(2, siblings.length, "Should have two siblings") - - siblings.clear - @child4.siblings {|sibling| siblings << sibling} - assert(siblings.empty?, "Should not have any children") - - end - - def test_isOnlyChild_eh - loadChildren - - assert(!@child1.isOnlyChild?, "Child1 is not the only child") - assert(!@child2.isOnlyChild?, "Child2 is not the only child") - assert(!@child3.isOnlyChild?, "Child3 is not the only child") - assert( @child4.isOnlyChild?, "Child4 is not the only child") - end - - def test_nextSibling - loadChildren - - assert_equal(@child2, @child1.nextSibling, "Child1's next sibling is Child2") - assert_equal(@child3, @child2.nextSibling, "Child2's next sibling is Child3") - assert_nil(@child3.nextSibling, "Child3 does not have a next sibling") - assert_nil(@child4.nextSibling, "Child4 does not have a next sibling") - end - - def test_previousSibling - loadChildren - - assert_nil(@child1.previousSibling, "Child1 does not have previous sibling") - assert_equal(@child1, @child2.previousSibling, "Child2's previous sibling is Child1") - assert_equal(@child2, @child3.previousSibling, "Child3's previous sibling is Child2") - assert_nil(@child4.previousSibling, "Child4 does not have a previous sibling") - end - - def test_add - assert(!@root.hasChildren?, "Should not have any children") - - @root.add(@child1) - - @root << @child2 - - assert(@root.hasChildren?, "Should have children") - assert_equal(3, @root.size, "Should have three nodes") - - @root << @child3 << @child4 - - assert_equal(5, @root.size, "Should have five nodes") - assert_equal(2, @child3.size, "Should have two nodes") - - assert_raise(RuntimeError) { @root.add(Tree::TreeNode.new(@child1.name)) } - - end - - def test_remove_bang - @root << @child1 - @root << @child2 - - assert(@root.hasChildren?, "Should have children") - assert_equal(3, @root.size, "Should have three nodes") - - @root.remove!(@child1) - assert_equal(2, @root.size, "Should have two nodes") - @root.remove!(@child2) - - assert(!@root.hasChildren?, "Should have no children") - assert_equal(1, @root.size, "Should have one node") - - @root << @child1 - @root << @child2 - - assert(@root.hasChildren?, "Should have children") - assert_equal(3, @root.size, "Should have three nodes") - - @root.removeAll! - - assert(!@root.hasChildren?, "Should have no children") - assert_equal(1, @root.size, "Should have one node") - - end - - def test_removeAll_bang - loadChildren - assert(@root.hasChildren?, "Should have children") - @root.removeAll! - - assert(!@root.hasChildren?, "Should have no children") - assert_equal(1, @root.size, "Should have one node") - end - - def test_removeFromParent_bang - loadChildren - assert(@root.hasChildren?, "Should have children") - assert(!@root.isLeaf?, "Root is not a leaf here") - - child1 = @root[0] - assert_not_nil(child1, "Child 1 should exist") - assert_same(@root, child1.root, "Child 1's root should be ROOT") - assert(@root.include?(child1), "root should have child1") - child1.removeFromParent! - assert_same(child1, child1.root, "Child 1's root should be self") - assert(!@root.include?(child1), "root should not have child1") - - child1.removeFromParent! - assert_same(child1, child1.root, "Child 1's root should still be self") - end - - def test_children - loadChildren - - assert(@root.hasChildren?, "Should have children") - assert_equal(5, @root.size, "Should have four nodes") - assert(@child3.hasChildren?, "Should have children") - assert(!@child3.isLeaf?, "Should not be a leaf") - - children = [] - for child in @root.children - children << child - end - - assert_equal(3, children.length, "Should have three direct children") - assert(!children.include?(@root), "Should not have root") - assert(children.include?(@child1), "Should have child 1") - assert(children.include?(@child2), "Should have child 2") - assert(children.include?(@child3), "Should have child 3") - assert(!children.include?(@child4), "Should not have child 4") - - children.clear - children = @root.children - assert_equal(3, children.length, "Should have three children") - - end - - def test_firstChild - loadChildren - - assert_equal(@child1, @root.firstChild, "Root's first child is Child1") - assert_nil(@child1.firstChild, "Child1 does not have any children") - assert_equal(@child4, @child3.firstChild, "Child3's first child is Child4") - - end - - def test_lastChild - loadChildren - - assert_equal(@child3, @root.lastChild, "Root's last child is Child3") - assert_nil(@child1.lastChild, "Child1 does not have any children") - assert_equal(@child4, @child3.lastChild, "Child3's last child is Child4") - - end - - def test_find - loadChildren - foundNode = @root.find { |node| node == @child2} - assert_same(@child2, foundNode, "The node should be Child 2") - - foundNode = @root.find { |node| node == @child4} - assert_same(@child4, foundNode, "The node should be Child 4") - - foundNode = @root.find { |node| node.name == "Child31" } - assert_same(@child4, foundNode, "The node should be Child 4") - foundNode = @root.find { |node| node.name == "NOT PRESENT" } - assert_nil(foundNode, "The node should not be found") - end - - def test_parentage - loadChildren - - assert_nil(@root.parentage, "Root does not have any parentage") - assert_equal([@root], @child1.parentage, "Child1 has Root as its parent") - assert_equal([@child3, @root], @child4.parentage, "Child4 has Child3 and Root as ancestors") - end - - def test_each - loadChildren - assert(@root.hasChildren?, "Should have children") - assert_equal(5, @root.size, "Should have five nodes") - assert(@child3.hasChildren?, "Should have children") - - nodes = [] - @root.each { |node| nodes << node } - - assert_equal(5, nodes.length, "Should have FIVE NODES") - assert(nodes.include?(@root), "Should have root") - assert(nodes.include?(@child1), "Should have child 1") - assert(nodes.include?(@child2), "Should have child 2") - assert(nodes.include?(@child3), "Should have child 3") - assert(nodes.include?(@child4), "Should have child 4") - end - - def test_each_leaf - loadChildren - - nodes = [] - @root.each_leaf { |node| nodes << node } - - assert_equal(3, nodes.length, "Should have THREE LEAF NODES") - assert(!nodes.include?(@root), "Should not have root") - assert(nodes.include?(@child1), "Should have child 1") - assert(nodes.include?(@child2), "Should have child 2") - assert(!nodes.include?(@child3), "Should not have child 3") - assert(nodes.include?(@child4), "Should have child 4") - end - - def test_parent - loadChildren - assert_nil(@root.parent, "Root's parent should be nil") - assert_equal(@root, @child1.parent, "Parent should be root") - assert_equal(@root, @child3.parent, "Parent should be root") - assert_equal(@child3, @child4.parent, "Parent should be child3") - assert_equal(@root, @child4.parent.parent, "Parent should be root") - end - - def test_indexed_access - loadChildren - assert_equal(@child1, @root[0], "Should be the first child") - assert_equal(@child4, @root[2][0], "Should be the grandchild") - assert_nil(@root["TEST"], "Should be nil") - assert_raise(RuntimeError) { @root[nil] } - end - - def test_printTree - loadChildren - #puts - #@root.printTree - end - - # Tests the binary dumping mechanism with an Object content node - def test_marshal_dump - # Setup Test Data - test_root = Tree::TreeNode.new("ROOT", "Root Node") - test_content = {"KEY1" => "Value1", "KEY2" => "Value2" } - test_child = Tree::TreeNode.new("Child", test_content) - test_content2 = ["AValue1", "AValue2", "AValue3"] - test_grand_child = Tree::TreeNode.new("Grand Child 1", test_content2) - test_root << test_child << test_grand_child - - # Perform the test operation - data = Marshal.dump(test_root) # Marshal - new_root = Marshal.load(data) # And unmarshal - - # Test the root node - assert_equal(test_root.name, new_root.name, "Must identify as ROOT") - assert_equal(test_root.content, new_root.content, "Must have root's content") - assert(new_root.isRoot?, "Must be the ROOT node") - assert(new_root.hasChildren?, "Must have a child node") - - # Test the child node - new_child = new_root[test_child.name] - assert_equal(test_child.name, new_child.name, "Must have child 1") - assert(new_child.hasContent?, "Child must have content") - assert(new_child.isOnlyChild?, "Child must be the only child") - - new_child_content = new_child.content - assert_equal(Hash, new_child_content.class, "Class of child's content should be a hash") - assert_equal(test_child.content.size, new_child_content.size, "The content should have same size") - - # Test the grand-child node - new_grand_child = new_child[test_grand_child.name] - assert_equal(test_grand_child.name, new_grand_child.name, "Must have grand child") - assert(new_grand_child.hasContent?, "Grand-child must have content") - assert(new_grand_child.isOnlyChild?, "Grand-child must be the only child") - - new_grand_child_content = new_grand_child.content - assert_equal(Array, new_grand_child_content.class, "Class of grand-child's content should be an Array") - assert_equal(test_grand_child.content.size, new_grand_child_content.size, "The content should have same size") - end - - # marshal_load and marshal_dump are symmetric methods - # This alias is for satisfying ZenTest - alias test_marshal_load test_marshal_dump - - # Test the collect method from the mixed-in Enumerable functionality. - def test_collect - loadChildren - collectArray = @root.collect do |node| - node.content = "abc" - node - end - collectArray.each {|node| assert_equal("abc", node.content, "Should be 'abc'")} - end - - # Test freezing the tree - def test_freezeTree_bang - loadChildren - @root.content = "ABC" - assert_equal("ABC", @root.content, "Content should be 'ABC'") - @root.freezeTree! - assert_raise(TypeError) {@root.content = "123"} - assert_raise(TypeError) {@root[0].content = "123"} - end - - # Test whether the content is accesible - def test_content - pers = Person::new("John", "Doe") - @root.content = pers - assert_same(pers, @root.content, "Content should be the same") - end - - # Test the depth computation algorithm - def test_depth - assert_equal(1, @root.depth, "A single node's depth is 1") - - @root << @child1 - assert_equal(2, @root.depth, "This should be of depth 2") - - @root << @child2 - assert_equal(2, @root.depth, "This should be of depth 2") - - @child2 << @child3 - assert_equal(3, @root.depth, "This should be of depth 3") - assert_equal(2, @child2.depth, "This should be of depth 2") - - @child3 << @child4 - assert_equal(4, @root.depth, "This should be of depth 4") - end - - # Test the breadth computation algorithm - def test_breadth - assert_equal(1, @root.breadth, "A single node's breadth is 1") - - @root << @child1 - assert_equal(1, @root.breadth, "This should be of breadth 1") - - @root << @child2 - assert_equal(2, @child1.breadth, "This should be of breadth 2") - assert_equal(2, @child2.breadth, "This should be of breadth 2") - - @root << @child3 - assert_equal(3, @child1.breadth, "This should be of breadth 3") - assert_equal(3, @child2.breadth, "This should be of breadth 3") - - @child3 << @child4 - assert_equal(1, @child4.breadth, "This should be of breadth 1") - end - - # Test the breadth for each - def test_breadth_each - j = Tree::TreeNode.new("j") - f = Tree::TreeNode.new("f") - k = Tree::TreeNode.new("k") - a = Tree::TreeNode.new("a") - d = Tree::TreeNode.new("d") - h = Tree::TreeNode.new("h") - z = Tree::TreeNode.new("z") - - # The expected order of response - expected_array = [j, - f, k, - a, h, z, - d] - - # Create the following Tree - # j <-- level 0 (Root) - # / \ - # f k <-- level 1 - # / \ \ - # a h z <-- level 2 - # \ - # d <-- level 3 - j << f << a << d - f << h - j << k << z - - # Create the response - result_array = Array.new - j.breadth_each { |node| result_array << node.detached_copy } - - expected_array.each_index do |i| - assert_equal(expected_array[i].name, result_array[i].name) # Match only the names. - end - end - - - def test_preordered_each - j = Tree::TreeNode.new("j") - f = Tree::TreeNode.new("f") - k = Tree::TreeNode.new("k") - a = Tree::TreeNode.new("a") - d = Tree::TreeNode.new("d") - h = Tree::TreeNode.new("h") - z = Tree::TreeNode.new("z") - - # The expected order of response - expected_array = [j, f, a, d, h, k, z] - - # Create the following Tree - # j <-- level 0 (Root) - # / \ - # f k <-- level 1 - # / \ \ - # a h z <-- level 2 - # \ - # d <-- level 3 - j << f << a << d - f << h - j << k << z - - result_array = [] - j.preordered_each { |node| result_array << node.detached_copy} - - expected_array.each_index do |i| - # Match only the names. - assert_equal(expected_array[i].name, result_array[i].name) - end - end - - def test_detached_copy - loadChildren - - assert(@root.hasChildren?, "The root should have children") - copy_of_root = @root.detached_copy - assert(!copy_of_root.hasChildren?, "The copy should not have children") - assert_equal(@root.name, copy_of_root.name, "The names should be equal") - - # Try the same test with a child node - assert(!@child3.isRoot?, "Child 3 is not a root") - assert(@child3.hasChildren?, "Child 3 has children") - copy_of_child3 = @child3.detached_copy - assert(copy_of_child3.isRoot?, "Child 3's copy is a root") - assert(!copy_of_child3.hasChildren?, "Child 3's copy does not have children") - end - - def test_hasChildren_eh - loadChildren - assert(@root.hasChildren?, "The Root node MUST have children") - end - - def test_isLeaf_eh - loadChildren - assert(!@child3.isLeaf?, "Child 3 is not a leaf node") - assert(@child4.isLeaf?, "Child 4 is a leaf node") - end - - def test_isRoot_eh - loadChildren - assert(@root.isRoot?, "The ROOT node must respond as the root node") - end - - def test_content_equals - @root.content = nil - assert_nil(@root.content, "Root's content should be nil") - @root.content = "ABCD" - assert_equal("ABCD", @root.content, "Root's content should now be 'ABCD'") - end - - def test_size - assert_equal(1, @root.size, "Root's size should be 1") - loadChildren - assert_equal(5, @root.size, "Root's size should be 5") - assert_equal(2, @child3.size, "Child 3's size should be 2") - end - - def test_lt2 # Test the << method - @root << @child1 - @root << @child2 - @root << @child3 << @child4 - assert_not_nil(@root['Child1'], "Child 1 should have been added to Root") - assert_not_nil(@root['Child2'], "Child 2 should have been added to Root") - assert_not_nil(@root['Child3'], "Child 3 should have been added to Root") - assert_not_nil(@child3['Child31'], "Child 31 should have been added to Child3") - end - - def test_index # Test the [] method - assert_raise(RuntimeError) {@root[nil]} - - @root << @child1 - @root << @child2 - assert_equal(@child1.name, @root['Child1'].name, "Child 1 should be returned") - assert_equal(@child1.name, @root[0].name, "Child 1 should be returned") - assert_equal(@child2.name, @root['Child2'].name, "Child 2 should be returned") - assert_equal(@child2.name, @root[1].name, "Child 2 should be returned") - - assert_nil(@root['Some Random Name'], "Should return nil") - assert_nil(@root[99], "Should return nil") - end - end -end - -__END__ - -# $Log: test_tree.rb,v $ -# Revision 1.6 2007/12/22 00:28:59 anupamsg -# Added more test cases, and enabled ZenTest compatibility. -# -# Revision 1.5 2007/12/19 02:24:18 anupamsg -# Updated the marshalling logic to handle non-string contents on the nodes. -# -# Revision 1.4 2007/10/02 03:38:11 anupamsg -# Removed dependency on the redundant "Person" class. -# (TC_TreeTest::test_comparator): Added a new test for the spaceship operator. -# (TC_TreeTest::test_hasContent): Added tests for hasContent? and length methods. -# -# Revision 1.3 2007/10/02 03:07:30 anupamsg -# * Rakefile: Added an optional task for rcov code coverage. -# -# * test/test_binarytree.rb: Removed the unnecessary dependency on "Person" class. -# -# * test/test_tree.rb: Removed dependency on the redundant "Person" class. -# -# Revision 1.2 2007/08/31 01:16:28 anupamsg -# Added breadth and pre-order traversals for the tree. Also added a method -# to return the detached copy of a node from the tree. -# -# Revision 1.1 2007/07/21 04:52:38 anupamsg -# Renamed the test files. -# -# Revision 1.13 2007/07/18 22:11:50 anupamsg -# Added depth and breadth methods for the TreeNode. -# -# Revision 1.12 2007/07/18 07:17:34 anupamsg -# Fixed a issue where TreeNode.ancestors was shadowing Module.ancestors. This method -# has been renamed to TreeNode.parentage. -# -# Revision 1.11 2007/07/17 03:39:29 anupamsg -# Moved the CVS Log keyword to end of the files. -# diff --git a/vendor/plugins/acts_as_activity_provider/lib/acts_as_activity_provider.rb b/vendor/plugins/acts_as_activity_provider/lib/acts_as_activity_provider.rb index bbbf5814..bf3364af 100644 --- a/vendor/plugins/acts_as_activity_provider/lib/acts_as_activity_provider.rb +++ b/vendor/plugins/acts_as_activity_provider/lib/acts_as_activity_provider.rb @@ -68,12 +68,12 @@ module Redmine scope_options[:conditions] = cond.conditions if options[:limit] # id and creation time should be in same order in most cases - scope_options[:order] = "#{table_name}.id DESC" + scope_options[:order] = "#{journal_class.table_name}.id DESC" scope_options[:limit] = options[:limit] end - - with_scope(:find => scope_options) do - find(:all, provider_options[:find_options].dup) + + journal_class.with_scope(:find => scope_options) do + journal_class.find(:all, provider_options[:find_options].dup) end end end diff --git a/vendor/plugins/acts_as_customizable/lib/acts_as_customizable.rb b/vendor/plugins/acts_as_customizable/lib/acts_as_customizable.rb index 9ed9fe37..10ba1234 100644 --- a/vendor/plugins/acts_as_customizable/lib/acts_as_customizable.rb +++ b/vendor/plugins/acts_as_customizable/lib/acts_as_customizable.rb @@ -1,5 +1,5 @@ -# redMine - project management software -# Copyright (C) 2006-2008 Jean-Philippe Lang +# Redmine - project management software +# Copyright (C) 2006-2011 Jean-Philippe Lang # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -71,10 +71,11 @@ module Redmine custom_field_values.each do |custom_value| custom_value.value = values[custom_value.custom_field_id.to_s] if values.has_key?(custom_value.custom_field_id.to_s) end if values.is_a?(Hash) + self.custom_values = custom_field_values end def custom_field_values - @custom_field_values ||= available_custom_fields.collect { |x| custom_values.detect { |v| v.custom_field == x } || custom_values.build(:custom_field => x, :value => nil) } + @custom_field_values ||= available_custom_fields.collect { |x| custom_values.detect { |v| v.custom_field == x } || custom_values.build(:customized => self, :custom_field => x, :value => nil) } end def visible_custom_field_values diff --git a/vendor/plugins/acts_as_journalized/.gitignore b/vendor/plugins/acts_as_journalized/.gitignore new file mode 100644 index 00000000..460367e9 --- /dev/null +++ b/vendor/plugins/acts_as_journalized/.gitignore @@ -0,0 +1,22 @@ +## MAC OS +.DS_Store + +## TEXTMATE +*.tmproj +tmtags + +## EMACS +*~ +\#* +.\#* + +## VIM +*.swp + +## PROJECT::GENERAL +coverage +rdoc +pkg + +## PROJECT::SPECIFIC +*.db diff --git a/vendor/plugins/acts_as_journalized/GPL.txt b/vendor/plugins/acts_as_journalized/GPL.txt new file mode 100644 index 00000000..d511905c --- /dev/null +++ b/vendor/plugins/acts_as_journalized/GPL.txt @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, 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 or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +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 give any other recipients of the Program a copy of this License +along with the Program. + +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 Program or any portion +of it, thus forming a work based on the Program, 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) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +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 Program, 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 Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) 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; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, 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 executable. However, as a +special exception, the source code 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. + +If distribution of executable or 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 counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program 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. + + 5. 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 Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program 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 to +this License. + + 7. 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 Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program 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 Program. + +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. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program 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. + + 9. The Free Software Foundation may publish revised and/or new versions +of the 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 Program +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 Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, 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 + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "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 PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. 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 PROGRAM 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 PROGRAM (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 PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + 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 of the License, 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. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/vendor/plugins/acts_as_journalized/LICENSE b/vendor/plugins/acts_as_journalized/LICENSE new file mode 100644 index 00000000..9a6cbf09 --- /dev/null +++ b/vendor/plugins/acts_as_journalized/LICENSE @@ -0,0 +1,87 @@ +"Acts_as_journalized" is a Redmine core plugin derived from the vestal_versions +Ruby on Rails plugin. The parts are under different copyright and license conditions +noted below. + +The overall license terms applying to "Acts_as_journalized" as in +this distribution are the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 of +the License, 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. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + + +For the individual files, the following copyrights and licenses apply: + +app/controllers/** +app/views/** +app/helpers/** +app/models/journal_observer.rb + Copyright (C) 2006-2008 Jean-Philippe Lang + + 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 + of the License, 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. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + +lib/acts_as_journalized.rb +lib/journal_formatter.rb +lib/redmine/acts/journalized/permissions.rb +lib/redmine/acts/journalized/save_hooks.rb +lib/redmine/acts/journalized/format_hooks.rb +lib/redmine/acts/journalized/deprecated.rb + Copyright (c) 2010 Finn GmbH + + 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 + of the License, 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. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + +All remaining files are: + Copyright (c) 2009 Steve Richert + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/vendor/plugins/acts_as_journalized/README.rdoc b/vendor/plugins/acts_as_journalized/README.rdoc new file mode 100644 index 00000000..b7d0440a --- /dev/null +++ b/vendor/plugins/acts_as_journalized/README.rdoc @@ -0,0 +1,3 @@ +acts as journalized + +A redmine core plugin for unification of journals, events and activities in redmine diff --git a/vendor/plugins/acts_as_journalized/REVISION b/vendor/plugins/acts_as_journalized/REVISION new file mode 100644 index 00000000..a7286ae3 --- /dev/null +++ b/vendor/plugins/acts_as_journalized/REVISION @@ -0,0 +1 @@ +67a8c4bee0a06420f1ba64eb9906a15d63bf5ac5 https://github.com/edavis10/acts_as_journalized diff --git a/vendor/plugins/acts_as_journalized/init.rb b/vendor/plugins/acts_as_journalized/init.rb new file mode 100644 index 00000000..560552c0 --- /dev/null +++ b/vendor/plugins/acts_as_journalized/init.rb @@ -0,0 +1,17 @@ +$LOAD_PATH.unshift File.expand_path("../lib/", __FILE__) + +require "acts_as_journalized" +ActiveRecord::Base.send(:include, Redmine::Acts::Journalized) + +require 'dispatcher' +Dispatcher.to_prepare do + # Model + require_dependency "journal" + + # this is for compatibility with current trunk + # once the plugin is part of the core, this will not be needed + # patches should then be ported onto the core + # require_dependency File.dirname(__FILE__) + '/lib/acts_as_journalized/journal_patch' + # require_dependency File.dirname(__FILE__) + '/lib/acts_as_journalized/journal_observer_patch' + # require_dependency File.dirname(__FILE__) + '/lib/acts_as_journalized/activity_fetcher_patch' +end diff --git a/vendor/plugins/acts_as_journalized/lib/acts_as_journalized.rb b/vendor/plugins/acts_as_journalized/lib/acts_as_journalized.rb new file mode 100644 index 00000000..024f6dfe --- /dev/null +++ b/vendor/plugins/acts_as_journalized/lib/acts_as_journalized.rb @@ -0,0 +1,183 @@ +# This file is part of the acts_as_journalized plugin for the redMine +# project management software +# +# Copyright (C) 2010 Finn GmbH, http://finn.de +# +# 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 journal 2 +# of the License, or (at your option) any later journal. +# +# 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. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + +Dir[File.expand_path("../redmine/acts/journalized/*.rb", __FILE__)].each{|f| require f } +require_dependency File.expand_path('lib/ar_condition', Rails.root) + +module Redmine + module Acts + module Journalized + + def self.included(base) + base.extend ClassMethods + base.extend Versioned + end + + module ClassMethods + + def plural_name + self.name.underscore.pluralize + end + + # A model might provide as many activity_types as it wishes. + # Activities are just different search options for the event a model provides + def acts_as_activity(options = {}) + activity_hash = journalized_activity_hash(options) + type = activity_hash[:type] + acts_as_activity_provider activity_hash + unless Redmine::Activity.providers[type].include? self.name + Redmine::Activity.register type.to_sym, :class_name => self.name + end + end + + # This call will add an activity and, if neccessary, start the journaling and + # add an event callback on the model. + # Versioning and acting as an Event may only be applied once. + # To apply more than on activity, use acts_as_activity + def acts_as_journalized(options = {}, &block) + activity_hash, event_hash, journal_hash = split_option_hashes(options) + + acts_as_activity(activity_hash) + + return if journaled? + + include Options + include Changes + include Creation + include Users + include Reversion + include Reset + include Reload + include Permissions + include SaveHooks + include FormatHooks + + # FIXME: When the transition to the new API is complete, remove me + include Deprecated + + journal_class.acts_as_event journalized_event_hash(event_hash) + + (journal_hash[:except] ||= []) << self.primary_key << inheritance_column << + :updated_on << :updated_at << :lock_version << :lft << :rgt + prepare_journaled_options(journal_hash) + has_many :journals, journal_hash.merge({:class_name => journal_class.name, + :foreign_key => "journaled_id"}), &block + end + + def journal_class + journal_class_name = "#{name.gsub("::", "_")}Journal" + if Object.const_defined?(journal_class_name) + Object.const_get(journal_class_name) + else + Object.const_set(journal_class_name, Class.new(Journal)).tap do |c| + # Run after the inherited hook to associate with the parent record. + # This eager loads the associated project (for permissions) if possible + if project_assoc = reflect_on_association(:project).try(:name) + include_option = ", :include => :#{project_assoc.to_s}" + end + c.class_eval("belongs_to :journaled, :class_name => '#{name}' #{include_option}") + c.class_eval("belongs_to :#{name.gsub("::", "_").underscore}, + :foreign_key => 'journaled_id' #{include_option}") + end + end + end + + private + # Splits an option has into three hashes: + ## => [{ options prefixed with "activity_" }, { options prefixed with "event_" }, { other options }] + def split_option_hashes(options) + activity_hash = {} + event_hash = {} + journal_hash = {} + + options.each_pair do |k, v| + case + when k.to_s =~ /^activity_(.+)$/ + activity_hash[$1.to_sym] = v + when k.to_s =~ /^event_(.+)$/ + event_hash[$1.to_sym] = v + else + journal_hash[k.to_sym] = v + end + end + [activity_hash, event_hash, journal_hash] + end + + # Merges the passed activity_hash with the options we require for + # acts_as_journalized to work, as follows: + # # type is the supplied or the pluralized class name + # # timestamp is supplied or the journal's created_at + # # author_key will always be the journal's author + # # + # # find_options are merged as follows: + # # # select statement is enriched with the journal fields + # # # journal association is added to the includes + # # # if a project is associated with the model, this is added to the includes + # # # the find conditions are extended to only choose journals which have the proper activity_type + # => a valid activity hash + def journalized_activity_hash(options) + options.tap do |h| + h[:type] ||= plural_name + h[:timestamp] ||= "#{journal_class.table_name}.created_at" + h[:author_key] ||= "#{journal_class.table_name}.user_id" + + h[:find_options] ||= {} # in case it is nil + h[:find_options] = {}.tap do |opts| + cond = ARCondition.new + cond.add(["#{journal_class.table_name}.activity_type = ?", h[:type]]) + cond.add(h[:find_options][:conditions]) if h[:find_options][:conditions] + opts[:conditions] = cond.conditions + + include_opts = [] + include_opts << :project if reflect_on_association(:project) + if h[:find_options][:include] + include_opts += case h[:find_options][:include] + when Array then h[:find_options][:include] + else [h[:find_options][:include]] + end + end + include_opts.uniq! + opts[:include] = [:journaled => include_opts] + + #opts[:joins] = h[:find_options][:joins] if h[:find_options][:joins] + end + end + end + + # Merges the event hashes defaults with the options provided by the user + # The defaults take their details from the journal + def journalized_event_hash(options) + unless options.has_key? :url + options[:url] = Proc.new do |journal| + { :controller => plural_name, + :action => 'show', + :id => journal.journaled_id, + :anchor => ("note-#{journal.anchor}" unless journal.initial?) } + end + end + options[:type] ||= self.name.underscore.dasherize # Make sure the name of the journalized model and not the name of the journal is used for events + options[:author] ||= :user + { :description => :notes }.reverse_merge options + end + end + + end + end +end diff --git a/vendor/plugins/acts_as_journalized/lib/journal_deprecated.rb b/vendor/plugins/acts_as_journalized/lib/journal_deprecated.rb new file mode 100644 index 00000000..b66b4159 --- /dev/null +++ b/vendor/plugins/acts_as_journalized/lib/journal_deprecated.rb @@ -0,0 +1,49 @@ +# This file is part of the acts_as_journalized plugin for the redMine +# project management software +# +# Copyright (C) 2010 Finn GmbH, http://finn.de +# +# 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 journal 2 +# of the License, or (at your option) any later journal. +# +# 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. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +# This module holds the formatting methods that each journal has. +# It provides the hooks to apply different formatting to the details +# of a specific journal. +module JournalDeprecated + unloadable + # Old timestamps. created_at is what t.timestamps creates in recent Rails journals + def created_on + created_at + end + + # Old naming + def journalized + journaled + end + + # Old naming + def journalized= obj + journaled = obj + end + + + # Shortcut from more issue-specific journals + def attachments + journalized.respond_to?(:attachments) ? journalized.attachments : nil + end + + # deprecate :created_on => "use #created_at" + # deprecate :journalized => "use journaled" + # deprecate :attachments => "implement it yourself" +end diff --git a/vendor/plugins/acts_as_journalized/lib/journal_formatter.rb b/vendor/plugins/acts_as_journalized/lib/journal_formatter.rb new file mode 100644 index 00000000..10246185 --- /dev/null +++ b/vendor/plugins/acts_as_journalized/lib/journal_formatter.rb @@ -0,0 +1,190 @@ +# This file is part of the acts_as_journalized plugin for the redMine +# project management software +# +# Copyright (C) 2010 Finn GmbH, http://finn.de +# +# 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 journal 2 +# of the License, or (at your option) any later journal. +# +# 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. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +# This module holds the formatting methods that each journal has. +# It provides the hooks to apply different formatting to the details +# of a specific journal. +module JournalFormatter + unloadable + mattr_accessor :formatters, :registered_fields + include ApplicationHelper + include CustomFieldsHelper + include ActionView::Helpers::TagHelper + include ActionView::Helpers::UrlHelper + extend Redmine::I18n + + def self.register(hash) + if hash[:class] + klazz = hash.delete(:class) + registered_fields[klazz] ||= {} + registered_fields[klazz].merge!(hash) + else + formatters.merge(hash) + end + end + + # TODO: Document Formatters (can take up to three params, value, journaled, field ...) + def self.default_formatters + { :plaintext => (Proc.new {|v,*| v.try(:to_s) }), + :datetime => (Proc.new {|v,*| format_date(v.to_date) }), + :named_association => (Proc.new do |value, journaled, field| + association = journaled.class.reflect_on_association(field.to_sym) + if association + record = association.class_name.constantize.find_by_id(value.to_i) + record.name if record + end + end), + :fraction => (Proc.new {|v,*| "%0.02f" % v.to_f }), + :decimal => (Proc.new {|v,*| v.to_i.to_s }), + :id => (Proc.new {|v,*| "##{v}" }) } + end + + self.formatters = default_formatters + self.registered_fields = {} + + def format_attribute_detail(key, values, no_html=false) + field = key.to_s.gsub(/\_id$/, "") + label = l(("field_" + field).to_sym) + + if format = JournalFormatter.registered_fields[self.class.name.to_sym][key] + formatter = JournalFormatter.formatters[format] + old_value = formatter.call(values.first, journaled, field) if values.first + value = formatter.call(values.last, journaled, field) if values.last + [label, old_value, value] + else + return nil + end + end + + def format_custom_value_detail(custom_field, values, no_html) + label = custom_field.name + old_value = format_value(values.first, custom_field.field_format) if values.first + value = format_value(values.last, custom_field.field_format) if values.last + + [label, old_value, value] + end + + def format_attachment_detail(key, values, no_html) + label = l(:label_attachment) + old_value = values.first + value = values.last + + [label, old_value, value] + end + + def format_html_attachment_detail(key, value) + if !value.blank? && a = Attachment.find_by_id(key.to_i) + # Link to the attachment if it has not been removed + # FIXME: this is broken => link_to_attachment(a) + a.filename + else + content_tag("i", h(value)) if value.present? + end + end + + def format_html_detail(label, old_value, value) + label = content_tag('strong', label) + old_value = content_tag("i", h(old_value)) if old_value && !old_value.blank? + old_value = content_tag("strike", old_value) if old_value and value.blank? + value = content_tag("i", h(value)) if value.present? + value ||= "" + [label, old_value, value] + end + + def property(detail) + key = prop_key(detail) + if key.start_with? "custom_values" + :custom_field + elsif key.start_with? "attachments" + :attachment + elsif journaled.class.columns.collect(&:name).include? key + :attribute + end + end + + def prop_key(detail) + if detail.respond_to? :to_ary + detail.first + else + detail + end + end + + def values(detail) + key = prop_key(detail) + if detail != key + detail.last + else + details[key.to_s] + end + end + + def old_value(detail) + values(detail).first + end + + def value(detail) + values(detail).last + end + + def render_detail(detail, no_html=false) + if detail.respond_to? :to_ary + key = detail.first + values = detail.last + else + key = detail + values = details[key.to_s] + end + + case property(detail) + when :attribute + attr_detail = format_attribute_detail(key, values, no_html) + when :custom_field + custom_field = CustomField.find_by_id(key.sub("custom_values", "").to_i) + cv_detail = format_custom_value_detail(custom_field, values, no_html) + when :attachment + attachment_detail = format_attachment_detail(key.sub("attachments", ""), values, no_html) + end + + label, old_value, value = attr_detail || cv_detail || attachment_detail + Redmine::Hook.call_hook :helper_issues_show_detail_after_setting, {:detail => detail, + :label => label, :value => value, :old_value => old_value } + return nil unless label || old_value || value # print nothing if there are no values + label, old_value, value = [label, old_value, value].collect(&:to_s) + + unless no_html + label, old_value, value = *format_html_detail(label, old_value, value) + value = format_html_attachment_detail(key.sub("attachments", ""), value) if attachment_detail + end + + unless value.blank? + if attr_detail || cv_detail + unless old_value.blank? + l(:text_journal_changed, :label => label, :old => old_value, :new => value) + else + l(:text_journal_set_to, :label => label, :value => value) + end + elsif attachment_detail + l(:text_journal_added, :label => label, :value => value) + end + else + l(:text_journal_deleted, :label => label, :old => old_value) + end + end +end diff --git a/vendor/plugins/acts_as_journalized/lib/redmine/acts/journalized/changes.rb b/vendor/plugins/acts_as_journalized/lib/redmine/acts/journalized/changes.rb new file mode 100644 index 00000000..66d155e5 --- /dev/null +++ b/vendor/plugins/acts_as_journalized/lib/redmine/acts/journalized/changes.rb @@ -0,0 +1,162 @@ +# This file included as part of the acts_as_journalized plugin for +# the redMine project management 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 journal 2 +# of the License, or (at your option) any later journal. +# +# 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. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# The original copyright and license conditions are: +# Copyright (c) 2009 Steve Richert +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +module Redmine::Acts::Journalized + # Provides the ability to manipulate hashes in the specific format that ActiveRecord gives to + # dirty attribute changes: string keys and unique, two-element array values. + module Changes + def self.included(base) # :nodoc: + Hash.send(:include, HashMethods) + + base.class_eval do + include InstanceMethods + + after_save :merge_journal_changes + end + end + + # Methods available to journaled ActiveRecord::Base instances in order to manage changes used + # for journal creation. + module InstanceMethods + # Collects an array of changes from a record's journals between the given range and compiles + # them into one summary hash of changes. The +from+ and +to+ arguments can each be either a + # version number, a symbol representing an association proxy method, a string representing a + # journal tag or a journal object itself. + def changes_between(from, to) + from_number, to_number = journals.journal_at(from), journals.journal_at(to) + return {} if from_number == to_number + chain = journals.between(from_number, to_number).reject(&:initial?) + return {} if chain.empty? + + backward = from_number > to_number + backward ? chain.pop : chain.shift unless from_number == 1 || to_number == 1 + + chain.inject({}) do |changes, journal| + changes.append_changes!(backward ? journal.changes.reverse_changes : journal.changes) + end + end + + private + # Before a new journal is created, the newly-changed attributes are appended onto a hash + # of previously-changed attributes. Typically the previous changes will be empty, except in + # the case that a control block is used where journals are to be merged. See + # VestalVersions::Control for more information. + def merge_journal_changes + journal_changes.append_changes!(incremental_journal_changes) + end + + # Stores the cumulative changes that are eventually used for journal creation. + def journal_changes + @journal_changes ||= {} + end + + # Stores the incremental changes that are appended to the cumulative changes before journal + # creation. Incremental changes are reset when the record is saved because they represent + # a subset of the dirty attribute changes, which are reset upon save. + def incremental_journal_changes + changed.inject({}) { |h, attr| h[attr] = attribute_change(attr); h }.slice(*journaled_columns) + end + + # Simply resets the cumulative changes after journal creation. + def reset_journal_changes + @journal_changes = nil + end + end + + # Instance methods included into Hash for dealing with manipulation of hashes in the specific + # format of ActiveRecord::Base#changes. + module HashMethods + # When called on a hash of changes and given a second hash of changes as an argument, + # +append_changes+ will run the second hash on top of the first, updating the last element + # of each array value with its own, or creating its own key/value pair for missing keys. + # Resulting non-unique array values are removed. + # + # == Example + # + # first = { + # "first_name" => ["Steve", "Stephen"], + # "age" => [25, 26] + # } + # second = { + # "first_name" => ["Stephen", "Steve"], + # "last_name" => ["Richert", "Jobs"], + # "age" => [26, 54] + # } + # first.append_changes(second) + # # => { + # "last_name" => ["Richert", "Jobs"], + # "age" => [25, 54] + # } + def append_changes(changes) + changes.inject(self) do |new_changes, (attribute, change)| + new_change = [new_changes.fetch(attribute, change).first, change.last] + new_changes.merge(attribute => new_change) + end.reject do |attribute, change| + change.first == change.last + end + end + + # Destructively appends a given hash of changes onto an existing hash of changes. + def append_changes!(changes) + replace(append_changes(changes)) + end + + # Appends the existing hash of changes onto a given hash of changes. Relates to the + # +append_changes+ method in the same way that Hash#reverse_merge relates to + # Hash#merge. + def prepend_changes(changes) + changes.append_changes(self) + end + + # Destructively prepends a given hash of changes onto an existing hash of changes. + def prepend_changes!(changes) + replace(prepend_changes(changes)) + end + + # Reverses the array values of a hash of changes. Useful for rejournal both backward and + # forward through a record's history of changes. + def reverse_changes + inject({}){|nc,(a,c)| nc.merge!(a => c.reverse) } + end + + # Destructively reverses the array values of a hash of changes. + def reverse_changes! + replace(reverse_changes) + end + end + end +end diff --git a/vendor/plugins/acts_as_journalized/lib/redmine/acts/journalized/configuration.rb b/vendor/plugins/acts_as_journalized/lib/redmine/acts/journalized/configuration.rb new file mode 100644 index 00000000..0c4db2be --- /dev/null +++ b/vendor/plugins/acts_as_journalized/lib/redmine/acts/journalized/configuration.rb @@ -0,0 +1,77 @@ +# This file included as part of the acts_as_journalized plugin for +# the redMine project management 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 +# of the License, 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. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# The original copyright and license conditions are: +# Copyright (c) 2009 Steve Richert +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +module Redmine::Acts::Journalized + # Allows for easy application-wide configuration of options passed into the +journaled+ method. + module Configuration + # The VestalVersions module is extended by VestalVersions::Configuration, allowing the + # +configure method+ to be used as follows in a Rails initializer: + # + # VestalVersions.configure do |config| + # config.class_name = "MyCustomVersion" + # config.dependent = :destroy + # end + # + # Each variable assignment in the +configure+ block corresponds directly with the options + # available to the +journaled+ method. Assigning common options in an initializer can keep your + # models tidy. + # + # If an option is given in both an initializer and in the options passed to +journaled+, the + # value given in the model itself will take precedence. + def configure + yield Configuration + end + + class << self + # Simply stores a hash of options given to the +configure+ block. + def options + @options ||= {} + end + + # If given a setter method name, will assign the first argument to the +options+ hash with + # the method name (sans "=") as the key. If given a getter method name, will attempt to + # a value from the +options+ hash for that key. If the key doesn't exist, defers to +super+. + def method_missing(symbol, *args) + if (method = symbol.to_s).sub!(/\=$/, '') + options[method.to_sym] = args.first + else + options.fetch(method.to_sym, super) + end + end + end + end +end diff --git a/vendor/plugins/acts_as_journalized/lib/redmine/acts/journalized/creation.rb b/vendor/plugins/acts_as_journalized/lib/redmine/acts/journalized/creation.rb new file mode 100644 index 00000000..3a5493bc --- /dev/null +++ b/vendor/plugins/acts_as_journalized/lib/redmine/acts/journalized/creation.rb @@ -0,0 +1,127 @@ +# This file included as part of the acts_as_journalized plugin for +# the redMine project management 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 +# of the License, 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. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# The original copyright and license conditions are: +# Copyright (c) 2009 Steve Richert +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +module Redmine::Acts::Journalized + # Adds the functionality necessary to control journal creation on a journaled instance of + # ActiveRecord::Base. + module Creation + def self.included(base) # :nodoc: + base.class_eval do + extend ClassMethods + include InstanceMethods + + after_save :create_journal, :if => :create_journal? + + class << self + alias_method_chain :prepare_journaled_options, :creation + end + end + end + + # Class methods added to ActiveRecord::Base to facilitate the creation of new journals. + module ClassMethods + # Overrides the basal +prepare_journaled_options+ method defined in VestalVersions::Options + # to extract the :only and :except options into +vestal_journals_options+. + def prepare_journaled_options_with_creation(options) + result = prepare_journaled_options_without_creation(options) + + self.vestal_journals_options[:only] = Array(options.delete(:only)).map(&:to_s).uniq if options[:only] + self.vestal_journals_options[:except] = Array(options.delete(:except)).map(&:to_s).uniq if options[:except] + + result + end + end + + # Instance methods that determine whether to save a journal and actually perform the save. + module InstanceMethods + private + # Returns whether a new journal should be created upon updating the parent record. + # A new journal will be created if + # a) attributes have changed + # b) no previous journal exists + # c) journal notes were added + # d) the parent record is already saved + def create_journal? + update_journal + (journal_changes.present? or journal_notes.present? or journals.empty?) and !new_record? + end + + # Creates a new journal upon updating the parent record. + # "update_journal" has been called in "update_journal?" at this point (to get a hold on association changes) + # It must not be called again here. + def create_journal + journals << self.class.journal_class.create(journal_attributes) + reset_journal_changes + reset_journal + true + rescue Exception => e # FIXME: What to do? This likely means that the parent record is invalid! + p e + p e.message + p e.backtrace + false + end + + # Returns an array of column names that should be included in the changes of created + # journals. If vestal_journals_options[:only] is specified, only those columns + # will be journaled. Otherwise, if vestal_journals_options[:except] is specified, + # all columns will be journaled other than those specified. Without either option, the + # default is to journal all columns. At any rate, the four "automagic" timestamp columns + # maintained by Rails are never journaled. + def journaled_columns + case + when vestal_journals_options[:only] then self.class.column_names & vestal_journals_options[:only] + when vestal_journals_options[:except] then self.class.column_names - vestal_journals_options[:except] + else self.class.column_names + end - %w(created_at updated_at) + end + + # Returns the activity type. Should be overridden in the journalized class to offer + # multiple types + def activity_type + self.class.name.underscore.pluralize + end + + # Specifies the attributes used during journal creation. This is separated into its own + # method so that it can be overridden by the VestalVersions::Users feature. + def journal_attributes + attributes = { :journaled_id => self.id, :activity_type => activity_type, + :changes => journal_changes, :version => last_version + 1, + :notes => journal_notes, :user_id => (journal_user.try(:id) || User.current.try(:id)) } + end + end + end +end diff --git a/vendor/plugins/acts_as_journalized/lib/redmine/acts/journalized/deprecated.rb b/vendor/plugins/acts_as_journalized/lib/redmine/acts/journalized/deprecated.rb new file mode 100644 index 00000000..8dc9a7b5 --- /dev/null +++ b/vendor/plugins/acts_as_journalized/lib/redmine/acts/journalized/deprecated.rb @@ -0,0 +1,68 @@ +# This file is part of the acts_as_journalized plugin for the redMine +# project management software +# +# Copyright (C) 2010 Finn GmbH, http://finn.de +# +# 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 +# of the License, 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. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +# These hooks make sure journals are properly created and updated with Redmine user detail, +# notes and associated custom fields + +module Redmine::Acts::Journalized + module Deprecated + # Old mailer API + def recipients + notified = project.notified_users + notified.reject! {|user| !visible?(user)} + notified.collect(&:mail) + end + + def current_journal + last_journal + end + + # FIXME: When the new API is settled, remove me + Redmine::Acts::Event::InstanceMethods.instance_methods(false).each do |m| + if m.to_s.start_with? "event_" + class_eval(<<-RUBY, __FILE__, __LINE__) + def #{m} + if last_journal.nil? + begin + journals << self.class.journal_class.create(journal_attributes) + reset_journal_changes + reset_journal + true + rescue Exception => e # FIXME: What to do? This likely means that the parent record is invalid! + p e + p e.message + p e.backtrace + false + end + journals.reload + end + return last_journal.#{m} + end + RUBY + end + end + + def event_url(options = {}) + last_journal.event_url(options) + end + + # deprecate :recipients => "use #last_journal.recipients" + # deprecate :current_journal => "use #last_journal" + end +end diff --git a/vendor/plugins/acts_as_journalized/lib/redmine/acts/journalized/format_hooks.rb b/vendor/plugins/acts_as_journalized/lib/redmine/acts/journalized/format_hooks.rb new file mode 100644 index 00000000..b5d1ee1f --- /dev/null +++ b/vendor/plugins/acts_as_journalized/lib/redmine/acts/journalized/format_hooks.rb @@ -0,0 +1,42 @@ +# This file is part of the acts_as_journalized plugin for the redMine +# project management software +# +# Copyright (C) 2010 Finn GmbH, http://finn.de +# +# 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 +# of the License, 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. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +module Redmine::Acts::Journalized + module FormatHooks + def self.included(base) + base.extend ClassMethods + end + + module ClassMethods + # Shortcut to register a formatter for a number of fields + def register_on_journal_formatter(formatter, *field_names) + formatter = formatter.to_sym + field_names.collect(&:to_s).each do |field| + JournalFormatter.register :class => self.journal_class.name.to_sym, field => formatter + end + end + + # Shortcut to register a new proc as a named formatter. Overwrites + # existing formatters with the same name + def register_journal_formatter(formatter) + JournalFormatter.register formatter.to_sym => Proc.new + end + end + end +end diff --git a/vendor/plugins/acts_as_journalized/lib/redmine/acts/journalized/options.rb b/vendor/plugins/acts_as_journalized/lib/redmine/acts/journalized/options.rb new file mode 100644 index 00000000..324cb22c --- /dev/null +++ b/vendor/plugins/acts_as_journalized/lib/redmine/acts/journalized/options.rb @@ -0,0 +1,81 @@ +# This file included as part of the acts_as_journalized plugin for +# the redMine project management 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 +# of the License, 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. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# The original copyright and license conditions are: +# Copyright (c) 2009 Steve Richert +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +module Redmine::Acts::Journalized + # Provides +journaled+ options conjournal and cleanup. + module Options + def self.included(base) # :nodoc: + base.class_eval do + extend ClassMethods + end + end + + # Class methods that provide preparation of options passed to the +journaled+ method. + module ClassMethods + # The +prepare_journaled_options+ method has three purposes: + # 1. Populate the provided options with default values where needed + # 2. Prepare options for use with the +has_many+ association + # 3. Save user-configurable options in a class-level variable + # + # Options are given priority in the following order: + # 1. Those passed directly to the +journaled+ method + # 2. Those specified in an initializer +configure+ block + # 3. Default values specified in +prepare_journaled_options+ + # + # The method is overridden in feature modules that require specific options outside the + # standard +has_many+ associations. + def prepare_journaled_options(options) + options.symbolize_keys! + options.reverse_merge!(Configuration.options) + options.reverse_merge!( + :class_name => 'Journal', + :dependent => :delete_all + ) + options.reverse_merge!( + :order => "#{options[:class_name].constantize.table_name}.version ASC" + ) + + class_inheritable_accessor :vestal_journals_options + self.vestal_journals_options = options.dup + + options.merge!( + :extend => Array(options[:extend]).unshift(Versions) + ) + end + end + end +end diff --git a/app/models/journal_detail.rb b/vendor/plugins/acts_as_journalized/lib/redmine/acts/journalized/permissions.rb similarity index 50% rename from app/models/journal_detail.rb rename to vendor/plugins/acts_as_journalized/lib/redmine/acts/journalized/permissions.rb index 58239006..df5b35f8 100644 --- a/app/models/journal_detail.rb +++ b/vendor/plugins/acts_as_journalized/lib/redmine/acts/journalized/permissions.rb @@ -1,25 +1,36 @@ -# redMine - project management software -# Copyright (C) 2006 Jean-Philippe Lang +# This file is part of the acts_as_journalized plugin for the redMine +# project management software +# +# Copyright (C) 2010 Finn GmbH, http://finn.de # # 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 # of the License, 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. -# +# # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -class JournalDetail < ActiveRecord::Base - belongs_to :journal - - def before_save - self.value = value[0..254] if value && value.is_a?(String) - self.old_value = old_value[0..254] if old_value && old_value.is_a?(String) +module Redmine::Acts::Journalized + module Permissions + # Default implementation of journal editing permission + # Is overridden if defined in the journalized model directly + def journal_editable_by?(user) + return true if user.admin? + if respond_to? :editable_by? + editable_by? user + else + permission = :"edit_#{self.class.to_s.pluralize.downcase}" + p = @project || (project if respond_to? :project) + options = { :global => p.present? } + user.allowed_to? permission, p, options + end + end end end diff --git a/vendor/plugins/acts_as_journalized/lib/redmine/acts/journalized/reload.rb b/vendor/plugins/acts_as_journalized/lib/redmine/acts/journalized/reload.rb new file mode 100644 index 00000000..292e823f --- /dev/null +++ b/vendor/plugins/acts_as_journalized/lib/redmine/acts/journalized/reload.rb @@ -0,0 +1,60 @@ +# This file included as part of the acts_as_journalized plugin for +# the redMine project management 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 +# of the License, 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. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# The original copyright and license conditions are: +# Copyright (c) 2009 Steve Richert +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +module Redmine::Acts::Journalized + # Ties into the existing ActiveRecord::Base#reload method to ensure that journal information + # is properly reset. + module Reload + def self.included(base) # :nodoc: + base.class_eval do + include InstanceMethods + + alias_method_chain :reload, :journals + end + end + + # Adds instance methods into ActiveRecord::Base to tap into the +reload+ method. + module InstanceMethods + # Overrides ActiveRecord::Base#reload, resetting the instance-variable-cached journal number + # before performing the original +reload+ method. + def reload_with_journals(*args) + reset_journal + reload_without_journals(*args) + end + end + end +end diff --git a/vendor/plugins/acts_as_journalized/lib/redmine/acts/journalized/reset.rb b/vendor/plugins/acts_as_journalized/lib/redmine/acts/journalized/reset.rb new file mode 100644 index 00000000..342a0437 --- /dev/null +++ b/vendor/plugins/acts_as_journalized/lib/redmine/acts/journalized/reset.rb @@ -0,0 +1,65 @@ +# This file included as part of the acts_as_journalized plugin for +# the redMine project management 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 +# of the License, 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. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# The original copyright and license conditions are: +# Copyright (c) 2009 Steve Richert +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +module Redmine::Acts::Journalized + # Adds the ability to "reset" (or hard revert) a journaled ActiveRecord::Base instance. + module Reset + def self.included(base) # :nodoc: + base.class_eval do + include InstanceMethods + end + end + + # Adds the instance methods required to reset an object to a previous journal. + module InstanceMethods + # Similar to +revert_to!+, the +reset_to!+ method reverts an object to a previous journal, + # only instead of creating a new record in the journal history, +reset_to!+ deletes all of + # the journal history that occurs after the journal reverted to. + # + # The action taken on each journal record after the point of rejournal is determined by the + # :dependent option given to the +journaled+ method. See the +journaled+ method + # documentation for more details. + def reset_to!(value) + if saved = skip_journal{ revert_to!(value) } + journals.send(:delete_records, journals.after(value)) + reset_journal + end + saved + end + end + end +end diff --git a/vendor/plugins/acts_as_journalized/lib/redmine/acts/journalized/reversion.rb b/vendor/plugins/acts_as_journalized/lib/redmine/acts/journalized/reversion.rb new file mode 100644 index 00000000..1add4796 --- /dev/null +++ b/vendor/plugins/acts_as_journalized/lib/redmine/acts/journalized/reversion.rb @@ -0,0 +1,110 @@ +# This file included as part of the acts_as_journalized plugin for +# the redMine project management 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 +# of the License, 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. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# The original copyright and license conditions are: +# Copyright (c) 2009 Steve Richert +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +module Redmine::Acts::Journalized + # Enables versioned ActiveRecord::Base instances to revert to a previously saved version. + module Reversion + def self.included(base) # :nodoc: + base.class_eval do + include InstanceMethods + end + end + + # Provides the base instance methods required to revert a journaled instance. + module InstanceMethods + # Returns the current version number for the versioned object. + def version + @version ||= last_version + end + + def last_journal + journals.last + end + + # Accepts a value corresponding to a specific journal record, builds a history of changes + # between that journal and the current journal, and then iterates over that history updating + # the object's attributes until the it's reverted to its prior state. + # + # The single argument should adhere to one of the formats as documented in the +at+ method of + # VestalVersions::Versions. + # + # After the object is reverted to the target journal, it is not saved. In order to save the + # object after the rejournal, use the +revert_to!+ method. + # + # The journal number of the object will reflect whatever journal has been reverted to, and + # the return value of the +revert_to+ method is also the target journal number. + def revert_to(value) + to_number = journals.journal_at(value) + + changes_between(journal, to_number).each do |attribute, change| + write_attribute(attribute, change.last) + end + + reset_journal(to_number) + end + + # Behaves similarly to the +revert_to+ method except that it automatically saves the record + # after the rejournal. The return value is the success of the save. + def revert_to!(value) + revert_to(value) + reset_journal if saved = save + saved + end + + # Returns a boolean specifying whether the object has been reverted to a previous journal or + # if the object represents the latest journal in the journal history. + def reverted? + version != last_version + end + + private + # Returns the number of the last created journal in the object's journal history. + # + # If no associated journals exist, the object is considered at version 0. + def last_version + @last_version ||= journals.maximum(:version) || 0 + end + + # Clears the cached version number instance variables so that they can be recalculated. + # Useful after a new version is created. + def reset_journal(version = nil) + @last_version = nil if version.nil? + @version = version + end + end + end +end diff --git a/vendor/plugins/acts_as_journalized/lib/redmine/acts/journalized/save_hooks.rb b/vendor/plugins/acts_as_journalized/lib/redmine/acts/journalized/save_hooks.rb new file mode 100644 index 00000000..61e13986 --- /dev/null +++ b/vendor/plugins/acts_as_journalized/lib/redmine/acts/journalized/save_hooks.rb @@ -0,0 +1,115 @@ +# This file is part of the acts_as_journalized plugin for the redMine +# project management software +# +# Copyright (C) 2010 Finn GmbH, http://finn.de +# +# 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 +# of the License, 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. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +# These hooks make sure journals are properly created and updated with Redmine user detail, +# notes and associated custom fields +module Redmine::Acts::Journalized + module SaveHooks + def self.included(base) + base.extend ClassMethods + + base.class_eval do + before_save :init_journal + after_save :reset_instance_variables + + attr_reader :journal_notes, :journal_user + end + end + + # Saves the current custom values, notes and journal to include them in the next journal + # Called before save + def init_journal(user = User.current, notes = "") + @journal_notes ||= notes + @journal_user ||= user + @associations_before_save ||= {} + + @associations = {} + save_possible_association :custom_values, :key => :custom_field_id, :value => :value + save_possible_association :attachments, :key => :id, :value => :filename + + @current_journal ||= last_journal + end + + # Saves the notes and custom value changes in the last Journal + # Called before create_journal + def update_journal + unless (@associations || {}).empty? + changed_associations = {} + changed_associations.merge!(possibly_updated_association :custom_values) + changed_associations.merge!(possibly_updated_association :attachments) + end + + unless changed_associations.blank? + update_extended_journal_contents(changed_associations) + end + end + + def reset_instance_variables + if last_journal != @current_journal + if last_journal.user != @journal_user + last_journal.update_attribute(:user_id, @journal_user.id) + end + end + @associations_before_save = @current_journal = @journal_notes = @journal_user = nil + end + + def save_possible_association(method, options) + @associations[method] = options + if self.respond_to? method + @associations_before_save[method] ||= send(method).inject({}) do |hash, cv| + hash[cv.send(options[:key])] = cv.send(options[:value]) + hash + end + end + end + + def possibly_updated_association(method) + if @associations_before_save[method] + # Has custom values from init_journal_notes + return changed_associations(method, @associations_before_save[method]) + end + {} + end + + # Saves the notes and changed custom values to the journal + # Creates a new journal, if no immediate attributes were changed + def update_extended_journal_contents(changed_associations) + journal_changes.merge!(changed_associations) + end + + def changed_associations(method, previous) + send(method).reload # Make sure the associations are reloaded + send(method).inject({}) do |hash, c| + key = c.send(@associations[method][:key]) + new_value = c.send(@associations[method][:value]) + + if previous[key].blank? && new_value.blank? + # The key was empty before, don't add a blank value + elsif previous[key] != new_value + # The key's value changed + hash["#{method}#{key}"] = [previous[key], new_value] + end + hash + end + end + + module ClassMethods + end + end +end diff --git a/vendor/plugins/acts_as_journalized/lib/redmine/acts/journalized/users.rb b/vendor/plugins/acts_as_journalized/lib/redmine/acts/journalized/users.rb new file mode 100644 index 00000000..affa925c --- /dev/null +++ b/vendor/plugins/acts_as_journalized/lib/redmine/acts/journalized/users.rb @@ -0,0 +1,86 @@ +# This file included as part of the acts_as_journalized plugin for +# the redMine project management 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 +# of the License, 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. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# The original copyright and license conditions are: +# Copyright (c) 2009 Steve Richert +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +module Redmine::Acts::Journalized + # Provides a way for information to be associated with specific journals as to who was + # responsible for the associated update to the parent. + module Users + def self.included(base) # :nodoc: + Journal.send(:include, JournalMethods) + + base.class_eval do + include InstanceMethods + + attr_accessor :updated_by + alias_method_chain :journal_attributes, :user + end + end + + # Methods added to journaled ActiveRecord::Base instances to enable journaling with additional + # user information. + module InstanceMethods + private + # Overrides the +journal_attributes+ method to include user information passed into the + # parent object, by way of a +updated_by+ attr_accessor. + def journal_attributes_with_user + journal_attributes_without_user.merge(:user_id => updated_by.try(:id) || User.current.try(:id)) + end + end + + # Instance methods added to Redmine::Acts::Journalized::Journal to accomodate incoming + # user information. + module JournalMethods + def self.included(base) # :nodoc: + base.class_eval do + belongs_to :user + + alias_method_chain :user=, :name + end + end + + # Overrides the +user=+ method created by the polymorphic +belongs_to+ user association. + # Based on the class of the object given, either the +user+ association columns or the + # +user_name+ string column is populated. + def user_with_name=(value) + case value + when ActiveRecord::Base then self.user_without_name = value + else self.user = User.find_by_login(value) + end + end + end + end +end diff --git a/vendor/plugins/acts_as_journalized/lib/redmine/acts/journalized/versioned.rb b/vendor/plugins/acts_as_journalized/lib/redmine/acts/journalized/versioned.rb new file mode 100644 index 00000000..757bf322 --- /dev/null +++ b/vendor/plugins/acts_as_journalized/lib/redmine/acts/journalized/versioned.rb @@ -0,0 +1,67 @@ +# This file included as part of the acts_as_journalized plugin for +# the redMine project management 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 +# of the License, 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. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# The original copyright and license conditions are: +# Copyright (c) 2009 Steve Richert +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +module Redmine::Acts::Journalized + # Simply adds a flag to determine whether a model class if journaled. + module Versioned + def self.extended(base) # :nodoc: + base.class_eval do + class << self + alias_method_chain :acts_as_journalized, :flag + end + end + end + + # Overrides the +journaled+ method to first define the +journaled?+ class method before + # deferring to the original +journaled+. + def acts_as_journalized_with_flag(*args) + acts_as_journalized_without_flag(*args) + + class << self + def journaled? + true + end + end + end + + # For all ActiveRecord::Base models that do not call the +journaled+ method, the +journaled?+ + # method will return false. + def journaled? + false + end + end +end diff --git a/vendor/plugins/acts_as_journalized/lib/redmine/acts/journalized/versions.rb b/vendor/plugins/acts_as_journalized/lib/redmine/acts/journalized/versions.rb new file mode 100644 index 00000000..abc23495 --- /dev/null +++ b/vendor/plugins/acts_as_journalized/lib/redmine/acts/journalized/versions.rb @@ -0,0 +1,111 @@ +# This file included as part of the acts_as_journalized plugin for +# the redMine project management 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 +# of the License, 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. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# The original copyright and license conditions are: +# Copyright (c) 2009 Steve Richert +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +module Redmine::Acts::Journalized + # An extension module for the +has_many+ association with journals. + module Versions + # Returns all journals between (and including) the two given arguments. See documentation for + # the +at+ extension method for what arguments are valid. If either of the given arguments is + # invalid, an empty array is returned. + # + # The +between+ method preserves returns an array of journal records, preserving the order + # given by the arguments. If the +from+ value represents a journal before that of the +to+ + # value, the array will be ordered from earliest to latest. The reverse is also true. + def between(from, to) + from_number, to_number = journal_at(from), journal_at(to) + return [] if from_number.nil? || to_number.nil? + + condition = (from_number == to_number) ? to_number : Range.new(*[from_number, to_number].sort) + all( + :conditions => {:version => condition}, + :order => "#{aliased_table_name}.version #{(from_number > to_number) ? 'DESC' : 'ASC'}" + ) + end + + # Returns all journal records created before the journal associated with the given value. + def before(value) + return [] if (version = journal_at(value)).nil? + all(:conditions => "#{aliased_table_name}.version < #{version}") + end + + # Returns all journal records created after the journal associated with the given value. + # + # This is useful for dissociating records during use of the +reset_to!+ method. + def after(value) + return [] if (version = journal_at(value)).nil? + all(:conditions => "#{aliased_table_name}.version > #{version}") + end + + # Returns a single journal associated with the given value. The following formats are valid: + # * A Date or Time object: When given, +to_time+ is called on the value and the last journal + # record in the history created before (or at) that time is returned. + # * A Numeric object: Typically a positive integer, these values correspond to journal numbers + # and the associated journal record is found by a journal number equal to the given value + # rounded down to the nearest integer. + # * A String: A string value represents a journal tag and the associated journal is searched + # for by a matching tag value. *Note:* Be careful with string representations of numbers. + # * A Symbol: Symbols represent association class methods on the +has_many+ journals + # association. While all of the built-in association methods require arguments, additional + # extension modules can be defined using the :extend option on the +journaled+ + # method. See the +journaled+ documentation for more information. + # * A Version object: If a journal object is passed to the +at+ method, it is simply returned + # untouched. + def at(value) + case value + when Date, Time then last(:conditions => ["#{aliased_table_name}.created_at <= ?", value.to_time]) + when Numeric then find_by_version(value.floor) + when Symbol then respond_to?(value) ? send(value) : nil + when Journal then value + end + end + + # Returns the journal number associated with the given value. In many cases, this involves + # simply passing the value to the +at+ method and then returning the subsequent journal number. + # Hoever, for Numeric values, the journal number can be returned directly and for Date/Time + # values, a default value of 1 is given to ensure that times prior to the first journal + # still return a valid journal number (useful for rejournal). + def journal_at(value) + case value + when Date, Time then (v = at(value)) ? v.version : 1 + when Numeric then value.floor + when Symbol then (v = at(value)) ? v.version : nil + when String then nil + when Journal then value.version + end + end + end +end \ No newline at end of file diff --git a/vendor/plugins/acts_as_journalized/test/changes_test.rb b/vendor/plugins/acts_as_journalized/test/changes_test.rb new file mode 100644 index 00000000..e4b86775 --- /dev/null +++ b/vendor/plugins/acts_as_journalized/test/changes_test.rb @@ -0,0 +1,169 @@ +require File.join(File.dirname(__FILE__), 'test_helper') + +class ChangesTest < Test::Unit::TestCase + context "A journal's changes" do + setup do + @user = User.create(:name => 'Steve Richert') + @user.update_attribute(:last_name, 'Jobs') + @changes = @user.journals.last.changes + end + + should 'be a hash' do + assert_kind_of Hash, @changes + end + + should 'not be empty' do + assert !@changes.empty? + end + + should 'have string keys' do + @changes.keys.each do |key| + assert_kind_of String, key + end + end + + should 'have array values' do + @changes.values.each do |value| + assert_kind_of Array, value + end + end + + should 'have two-element values' do + @changes.values.each do |value| + assert_equal 2, value.size + end + end + + should 'have unique-element values' do + @changes.values.each do |value| + assert_equal value.uniq, value + end + end + + should "equal the model's changes" do + @user.first_name = 'Stephen' + model_changes = @user.changes + @user.save + changes = @user.journals.last.changes + assert_equal model_changes, changes + end + end + + context 'A hash of changes' do + setup do + @changes = {'first_name' => ['Steve', 'Stephen']} + @other = {'first_name' => ['Catie', 'Catherine']} + end + + should 'properly append other changes' do + expected = {'first_name' => ['Steve', 'Catherine']} + changes = @changes.append_changes(@other) + assert_equal expected, changes + @changes.append_changes!(@other) + assert_equal expected, @changes + end + + should 'properly prepend other changes' do + expected = {'first_name' => ['Catie', 'Stephen']} + changes = @changes.prepend_changes(@other) + assert_equal expected, changes + @changes.prepend_changes!(@other) + assert_equal expected, @changes + end + + should 'be reversible' do + expected = {'first_name' => ['Stephen', 'Steve']} + changes = @changes.reverse_changes + assert_equal expected, changes + @changes.reverse_changes! + assert_equal expected, @changes + end + end + + context 'The changes between two journals' do + setup do + name = 'Steve Richert' + @user = User.create(:name => name) # 1 + @user.update_attribute(:last_name, 'Jobs') # 2 + @user.update_attribute(:first_name, 'Stephen') # 3 + @user.update_attribute(:last_name, 'Richert') # 4 + @user.update_attribute(:name, name) # 5 + @version = @user.version + end + + should 'be a hash' do + 1.upto(@version) do |i| + 1.upto(@version) do |j| + changes = @user.changes_between(i, j) + assert_kind_of Hash, changes + end + end + end + + should 'have string keys' do + 1.upto(@version) do |i| + 1.upto(@version) do |j| + changes = @user.changes_between(i, j) + changes.keys.each do |key| + assert_kind_of String, key + end + end + end + end + + should 'have array values' do + 1.upto(@version) do |i| + 1.upto(@version) do |j| + changes = @user.changes_between(i, j) + changes.values.each do |value| + assert_kind_of Array, value + end + end + end + end + + should 'have two-element values' do + 1.upto(@version) do |i| + 1.upto(@version) do |j| + changes = @user.changes_between(i, j) + changes.values.each do |value| + assert_equal 2, value.size + end + end + end + end + + should 'have unique-element values' do + 1.upto(@version) do |i| + 1.upto(@version) do |j| + changes = @user.changes_between(i, j) + changes.values.each do |value| + assert_equal value.uniq, value + end + end + end + end + + should 'be empty between identical versions' do + assert @user.changes_between(1, @version).empty? + assert @user.changes_between(@version, 1).empty? + end + + should 'be should reverse with direction' do + 1.upto(@version) do |i| + i.upto(@version) do |j| + up = @user.changes_between(i, j) + down = @user.changes_between(j, i) + assert_equal up, down.reverse_changes + end + end + end + + should 'be empty with invalid arguments' do + 1.upto(@version) do |i| + assert @user.changes_between(i, nil) + assert @user.changes_between(nil, i) + end + end + end +end diff --git a/vendor/plugins/acts_as_journalized/test/conditions_test.rb b/vendor/plugins/acts_as_journalized/test/conditions_test.rb new file mode 100644 index 00000000..6600cb03 --- /dev/null +++ b/vendor/plugins/acts_as_journalized/test/conditions_test.rb @@ -0,0 +1,137 @@ +require File.join(File.dirname(__FILE__), 'test_helper') + +class ConditionsTest < Test::Unit::TestCase + context 'Converted :if conditions' do + setup do + User.class_eval do + def true; true; end + end + end + + should 'be an array' do + assert_kind_of Array, User.vestal_journals_options[:if] + User.prepare_journaled_options(:if => :true) + assert_kind_of Array, User.vestal_journals_options[:if] + end + + should 'have proc values' do + User.prepare_journaled_options(:if => :true) + assert User.vestal_journals_options[:if].all?{|i| i.is_a?(Proc) } + end + + teardown do + User.prepare_journaled_options(:if => []) + end + end + + context 'Converted :unless conditions' do + setup do + User.class_eval do + def true; true; end + end + end + + should 'be an array' do + assert_kind_of Array, User.vestal_journals_options[:unless] + User.prepare_journaled_options(:unless => :true) + assert_kind_of Array, User.vestal_journals_options[:unless] + end + + should 'have proc values' do + User.prepare_journaled_options(:unless => :true) + assert User.vestal_journals_options[:unless].all?{|i| i.is_a?(Proc) } + end + + teardown do + User.prepare_journaled_options(:unless => []) + end + end + + context 'A new journal' do + setup do + User.class_eval do + def true; true; end + def false; false; end + end + + @user = User.create(:name => 'Steve Richert') + @count = @user.journals.count + end + + context 'with :if conditions' do + context 'that pass' do + setup do + User.prepare_journaled_options(:if => [:true]) + @user.update_attribute(:last_name, 'Jobs') + end + + should 'be created' do + assert_equal @count + 1, @user.journals.count + end + end + + context 'that fail' do + setup do + User.prepare_journaled_options(:if => [:false]) + @user.update_attribute(:last_name, 'Jobs') + end + + should 'not be created' do + assert_equal @count, @user.journals.count + end + end + end + + context 'with :unless conditions' do + context 'that pass' do + setup do + User.prepare_journaled_options(:unless => [:true]) + @user.update_attribute(:last_name, 'Jobs') + end + + should 'not be created' do + assert_equal @count, @user.journals.count + end + end + + context 'that fail' do + setup do + User.prepare_journaled_options(:unless => [:false]) + @user.update_attribute(:last_name, 'Jobs') + end + + should 'not be created' do + assert_equal @count + 1, @user.journals.count + end + end + end + + context 'with :if and :unless conditions' do + context 'that pass' do + setup do + User.prepare_journaled_options(:if => [:true], :unless => [:true]) + @user.update_attribute(:last_name, 'Jobs') + end + + should 'not be created' do + assert_equal @count, @user.journals.count + end + end + + context 'that fail' do + setup do + User.prepare_journaled_options(:if => [:false], :unless => [:false]) + @user.update_attribute(:last_name, 'Jobs') + end + + should 'not be created' do + assert_equal @count, @user.journals.count + end + end + end + + teardown do + User.prepare_journaled_options(:if => [], :unless => []) + end + end +end diff --git a/vendor/plugins/acts_as_journalized/test/configuration_test.rb b/vendor/plugins/acts_as_journalized/test/configuration_test.rb new file mode 100644 index 00000000..18f77103 --- /dev/null +++ b/vendor/plugins/acts_as_journalized/test/configuration_test.rb @@ -0,0 +1,39 @@ +require File.join(File.dirname(__FILE__), 'test_helper') + +class ConfigurationTest < Test::Unit::TestCase + context 'Global configuration options' do + setup do + module Extension; end + + @options = { + 'class_name' => 'CustomVersion', + :extend => Extension, + :as => :parent + } + + VestalVersions.configure do |config| + @options.each do |key, value| + config.send("#{key}=", value) + end + end + + @configuration = VestalVersions::Configuration.options + end + + should 'should be a hash' do + assert_kind_of Hash, @configuration + end + + should 'have symbol keys' do + assert @configuration.keys.all?{|k| k.is_a?(Symbol) } + end + + should 'store values identical to those given' do + assert_equal @options.symbolize_keys, @configuration + end + + teardown do + VestalVersions::Configuration.options.clear + end + end +end diff --git a/vendor/plugins/acts_as_journalized/test/control_test.rb b/vendor/plugins/acts_as_journalized/test/control_test.rb new file mode 100644 index 00000000..d032fa5b --- /dev/null +++ b/vendor/plugins/acts_as_journalized/test/control_test.rb @@ -0,0 +1,152 @@ +require File.join(File.dirname(__FILE__), 'test_helper') + +class ControlTest < Test::Unit::TestCase + context 'Within a skip_journal block,' do + setup do + @user = User.create(:name => 'Steve Richert') + @count = @user.journals.count + end + + context 'a model update' do + setup do + @user.skip_journal do + @user.update_attribute(:last_name, 'Jobs') + end + end + + should 'not create a journal' do + assert_equal @count, @user.journals.count + end + end + + context 'multiple model updates' do + setup do + @user.skip_journal do + @user.update_attribute(:first_name, 'Stephen') + @user.update_attribute(:last_name, 'Jobs') + @user.update_attribute(:first_name, 'Steve') + end + end + + should 'not create a journal' do + assert_equal @count, @user.journals.count + end + end + end + + context 'Within a merge_journal block,' do + setup do + @user = User.create(:name => 'Steve Richert') + @count = @user.journals.count + end + + context 'a model update' do + setup do + @user.merge_journal do + @user.update_attribute(:last_name, 'Jobs') + end + end + + should 'create a journal' do + assert_equal @count + 1, @user.journals.count + end + end + + context 'multiple model updates' do + setup do + @user.merge_journal do + @user.update_attribute(:first_name, 'Stephen') + @user.update_attribute(:last_name, 'Jobs') + @user.update_attribute(:first_name, 'Steve') + end + end + + should 'create a journal' do + assert_equal @count + 1, @user.journals.count + end + end + end + + context 'Within a append_journal block' do + context '(when no journals exist),' do + setup do + @user = User.create(:name => 'Steve Richert') + @count = @user.journals.count + end + + context 'a model update' do + setup do + @user.append_journal do + @user.update_attribute(:last_name, 'Jobs') + end + end + + should 'create a journal' do + assert_equal @count + 1, @user.journals.count + end + end + + context 'multiple model updates' do + setup do + @user.append_journal do + @user.update_attribute(:first_name, 'Stephen') + @user.update_attribute(:last_name, 'Jobs') + @user.update_attribute(:first_name, 'Steve') + end + end + + should 'create a journal' do + assert_equal @count + 1, @user.journals.count + end + end + end + + context '(when journals exist),' do + setup do + @user = User.create(:name => 'Steve Richert') + @user.update_attribute(:last_name, 'Jobs') + @user.update_attribute(:last_name, 'Richert') + @last_journal = @user.journals.last + @count = @user.journals.count + end + + context 'a model update' do + setup do + @user.append_journal do + @user.update_attribute(:last_name, 'Jobs') + end + end + + should 'not create a journal' do + assert_equal @count, @user.journals.count + end + + should 'update the last journal' do + last_journal = @user.journals(true).last + assert_equal @last_journal.id, last_journal.id + assert_not_equal @last_journal.attributes, last_journal.attributes + end + end + + context 'multiple model updates' do + setup do + @user.append_journal do + @user.update_attribute(:first_name, 'Stephen') + @user.update_attribute(:last_name, 'Jobs') + @user.update_attribute(:first_name, 'Steve') + end + end + + should 'not create a journal' do + assert_equal @count, @user.journals.count + end + + should 'update the last journal' do + last_journal = @user.journals(true).last + assert_equal @last_journal.id, last_journal.id + assert_not_equal @last_journal.attributes, last_journal.attributes + end + end + end + end +end diff --git a/vendor/plugins/acts_as_journalized/test/creation_test.rb b/vendor/plugins/acts_as_journalized/test/creation_test.rb new file mode 100644 index 00000000..03508099 --- /dev/null +++ b/vendor/plugins/acts_as_journalized/test/creation_test.rb @@ -0,0 +1,110 @@ +require File.join(File.dirname(__FILE__), 'test_helper') + +class CreationTest < Test::Unit::TestCase + context 'The number of journals' do + setup do + @name = 'Steve Richert' + @user = User.create(:name => @name) + @count = @user.journals.count + end + + should 'initially equal zero' do + assert_equal 0, @count + end + + should 'not increase when no changes are made in an update' do + @user.update_attribute(:name, @name) + assert_equal @count, @user.journals.count + end + + should 'not increase when no changes are made before a save' do + @user.save + assert_equal @count, @user.journals.count + end + + context 'after an update' do + setup do + @user.update_attribute(:last_name, 'Jobs') + end + + should 'increase by one' do + assert_equal @count + 1, @user.journals.count + end + end + + context 'after multiple updates' do + setup do + @user.update_attribute(:last_name, 'Jobs') + @user.update_attribute(:last_name, 'Richert') + end + + should 'increase multiple times' do + assert_operator @count + 1, :<, @user.journals.count + end + end + end + + context "A created journal's changes" do + setup do + @user = User.create(:name => 'Steve Richert') + @user.update_attribute(:last_name, 'Jobs') + end + + should 'not contain Rails timestamps' do + %w(created_at created_on updated_at updated_on).each do |timestamp| + assert_does_not_contain @user.journals.last.changes.keys, timestamp + end + end + + context '(with :only options)' do + setup do + @only = %w(first_name) + User.prepare_journaled_options(:only => @only) + @user.update_attribute(:name, 'Steven Tyler') + end + + should 'only contain the specified columns' do + assert_equal @only, @user.journals.last.changes.keys + end + + teardown do + User.prepare_journaled_options(:only => nil) + end + end + + context '(with :except options)' do + setup do + @except = %w(first_name) + User.prepare_journaled_options(:except => @except) + @user.update_attribute(:name, 'Steven Tyler') + end + + should 'not contain the specified columns' do + @except.each do |column| + assert_does_not_contain @user.journals.last.changes.keys, column + end + end + + teardown do + User.prepare_journaled_options(:except => nil) + end + end + + context '(with both :only and :except options)' do + setup do + @only = %w(first_name) + @except = @only + User.prepare_journaled_options(:only => @only, :except => @except) + @user.update_attribute(:name, 'Steven Tyler') + end + + should 'respect only the :only options' do + assert_equal @only, @user.journals.last.changes.keys + end + + teardown do + User.prepare_journaled_options(:only => nil, :except => nil) + end + end + end +end diff --git a/vendor/plugins/acts_as_journalized/test/options_test.rb b/vendor/plugins/acts_as_journalized/test/options_test.rb new file mode 100644 index 00000000..1386b8b7 --- /dev/null +++ b/vendor/plugins/acts_as_journalized/test/options_test.rb @@ -0,0 +1,52 @@ +require File.join(File.dirname(__FILE__), 'test_helper') + +class OptionsTest < Test::Unit::TestCase + context 'Configuration options' do + setup do + @options = {:dependent => :destroy} + @configuration = {:class_name => 'MyCustomVersion'} + + VestalVersions::Configuration.options.clear + @configuration.each{|k,v| VestalVersions::Configuration.send("#{k}=", v) } + + @prepared_options = User.prepare_journaled_options(@options.dup) + end + + should 'have symbolized keys' do + assert User.vestal_journals_options.keys.all?{|k| k.is_a?(Symbol) } + end + + should 'combine class-level and global configuration options' do + combined_keys = (@options.keys + @configuration.keys).map(&:to_sym).uniq + combined_options = @configuration.symbolize_keys.merge(@options.symbolize_keys) + assert_equal @prepared_options.slice(*combined_keys), combined_options + end + + teardown do + VestalVersions::Configuration.options.clear + User.prepare_journaled_options({}) + end + end + + context 'Given no options, configuration options' do + setup do + @prepared_options = User.prepare_journaled_options({}) + end + + should 'default to "VestalVersions::Version" for :class_name' do + assert_equal 'VestalVersions::Version', @prepared_options[:class_name] + end + + should 'default to :delete_all for :dependent' do + assert_equal :delete_all, @prepared_options[:dependent] + end + + should 'force the :as option value to :journaled' do + assert_equal :journaled, @prepared_options[:as] + end + + should 'default to [VestalVersions::Versions] for :extend' do + assert_equal [VestalVersions::Versions], @prepared_options[:extend] + end + end +end diff --git a/vendor/plugins/acts_as_journalized/test/reload_test.rb b/vendor/plugins/acts_as_journalized/test/reload_test.rb new file mode 100644 index 00000000..91b4f67b --- /dev/null +++ b/vendor/plugins/acts_as_journalized/test/reload_test.rb @@ -0,0 +1,19 @@ +require File.join(File.dirname(__FILE__), 'test_helper') + +class ReloadTest < Test::Unit::TestCase + context 'Reloading a reverted model' do + setup do + @user = User.create(:name => 'Steve Richert') + first_version = @user.version + @user.update_attribute(:last_name, 'Jobs') + @last_version = @user.version + @user.revert_to(first_version) + end + + should 'reset the journal number to the most recent journal' do + assert_not_equal @last_journal, @user.journal + @user.reload + assert_equal @last_journal, @user.journal + end + end +end diff --git a/vendor/plugins/acts_as_journalized/test/reset_test.rb b/vendor/plugins/acts_as_journalized/test/reset_test.rb new file mode 100644 index 00000000..1ecdbbd0 --- /dev/null +++ b/vendor/plugins/acts_as_journalized/test/reset_test.rb @@ -0,0 +1,112 @@ +require File.join(File.dirname(__FILE__), 'test_helper') + +class ResetTest < Test::Unit::TestCase + context 'Resetting a model' do + setup do + @original_dependent = User.reflect_on_association(:journals).options[:dependent] + @user, @journals = User.new, [] + @names = ['Steve Richert', 'Stephen Richert', 'Stephen Jobs', 'Steve Jobs'] + @names.each do |name| + @user.update_attribute(:name, name) + @journals << @user.journal + end + end + + should "properly revert the model's attributes" do + @journals.reverse.each_with_index do |journal, i| + @user.reset_to!(journal) + assert_equal @names.reverse[i], @user.name + end + end + + should 'dissociate all journals after the target' do + @journals.reverse.each do |journal| + @user.reset_to!(journal) + assert_equal 0, @user.journals(true).after(journal).count + end + end + + context 'with the :dependent option as :delete_all' do + setup do + User.reflect_on_association(:journals).options[:dependent] = :delete_all + end + + should 'delete all journals after the target journal' do + @journals.reverse.each do |journal| + later_journals = @user.journals.after(journal) + @user.reset_to!(journal) + later_journals.each do |later_journal| + assert_raise ActiveRecord::RecordNotFound do + later_journal.reload + end + end + end + end + + should 'not destroy all journals after the target journal' do + VestalVersions::Version.any_instance.stubs(:destroy).raises(RuntimeError) + @journals.reverse.each do |journal| + assert_nothing_raised do + @user.reset_to!(journal) + end + end + end + end + + context 'with the :dependent option as :destroy' do + setup do + User.reflect_on_association(:journals).options[:dependent] = :destroy + end + + should 'delete all journals after the target journal' do + @journals.reverse.each do |journal| + later_journals = @user.journals.after(journal) + @user.reset_to!(journal) + later_journals.each do |later_journal| + assert_raise ActiveRecord::RecordNotFound do + later_journal.reload + end + end + end + end + + should 'destroy all journals after the target journal' do + VestalVersions::Version.any_instance.stubs(:destroy).raises(RuntimeError) + @journals.reverse.each do |journal| + later_journals = @user.journals.after(journal) + if later_journals.empty? + assert_nothing_raised do + @user.reset_to!(journal) + end + else + assert_raise RuntimeError do + @user.reset_to!(journal) + end + end + end + end + end + + context 'with the :dependent option as :nullify' do + setup do + User.reflect_on_association(:journals).options[:dependent] = :nullify + end + + should 'leave all journals after the target journal' do + @journals.reverse.each do |journal| + later_journals = @user.journals.after(journal) + @user.reset_to!(journal) + later_journals.each do |later_journal| + assert_nothing_raised do + later_journal.reload + end + end + end + end + end + + teardown do + User.reflect_on_association(:journals).options[:dependent] = @original_dependent + end + end +end diff --git a/vendor/plugins/acts_as_journalized/test/reversion_test.rb b/vendor/plugins/acts_as_journalized/test/reversion_test.rb new file mode 100644 index 00000000..02420896 --- /dev/null +++ b/vendor/plugins/acts_as_journalized/test/reversion_test.rb @@ -0,0 +1,68 @@ +require File.join(File.dirname(__FILE__), 'test_helper') + +class RejournalTest < Test::Unit::TestCase + context 'A model rejournal' do + setup do + @user, @attributes, @times = User.new, {}, {} + names = ['Steve Richert', 'Stephen Richert', 'Stephen Jobs', 'Steve Jobs'] + time = names.size.hours.ago + names.each do |name| + @user.update_attribute(:name, name) + @attributes[@user.journal] = @user.attributes + time += 1.hour + if last_journal = @user.journals.last + last_journal.update_attribute(:created_at, time) + end + @times[@user.journal] = time + end + @user.reload.journals.reload + @first_journal, @last_journal = @attributes.keys.min, @attributes.keys.max + end + + should 'return the new journal number' do + new_journal = @user.revert_to(@first_journal) + assert_equal @first_journal, new_journal + end + + should 'change the journal number when saved' do + current_journal = @user.journal + @user.revert_to!(@first_journal) + assert_not_equal current_journal, @user.journal + end + + should 'do nothing for a invalid argument' do + current_journal = @user.journal + [nil, :bogus, 'bogus', (1..2)].each do |invalid| + @user.revert_to(invalid) + assert_equal current_journal, @user.journal + end + end + + should 'be able to target a journal number' do + @user.revert_to(1) + assert 1, @user.journal + end + + should 'be able to target a date and time' do + @times.each do |journal, time| + @user.revert_to(time + 1.second) + assert_equal journal, @user.journal + end + end + + should 'be able to target a journal object' do + @user.journals.each do |journal| + @user.revert_to(journal) + assert_equal journal.number, @user.journal + end + end + + should "correctly roll back the model's attributes" do + timestamps = %w(created_at created_on updated_at updated_on) + @attributes.each do |journal, attributes| + @user.revert_to!(journal) + assert_equal attributes.except(*timestamps), @user.attributes.except(*timestamps) + end + end + end +end diff --git a/vendor/plugins/acts_as_journalized/test/schema.rb b/vendor/plugins/acts_as_journalized/test/schema.rb new file mode 100644 index 00000000..4fa9935d --- /dev/null +++ b/vendor/plugins/acts_as_journalized/test/schema.rb @@ -0,0 +1,43 @@ +ActiveRecord::Base.establish_connection( + :adapter => defined?(RUBY_ENGINE) && RUBY_ENGINE == 'jruby' ? 'jdbcsqlite3' : 'sqlite3', + :database => File.join(File.dirname(__FILE__), 'test.db') +) + +class CreateSchema < ActiveRecord::Migration + def self.up + create_table :users, :force => true do |t| + t.string :first_name + t.string :last_name + t.timestamps + end + + create_table :journals, :force => true do |t| + t.belongs_to :journaled, :polymorphic => true + t.belongs_to :user, :polymorphic => true + t.string :user_name + t.text :changes + t.integer :number + t.string :tag + t.timestamps + end + end +end + +CreateSchema.suppress_messages do + CreateSchema.migrate(:up) +end + +class User < ActiveRecord::Base + journaled + + def name + [first_name, last_name].compact.join(' ') + end + + def name=(names) + self[:first_name], self[:last_name] = names.split(' ', 2) + end +end + +class MyCustomVersion < VestalVersions::Version +end diff --git a/vendor/plugins/acts_as_journalized/test/tagging_test.rb b/vendor/plugins/acts_as_journalized/test/tagging_test.rb new file mode 100644 index 00000000..fb3a526d --- /dev/null +++ b/vendor/plugins/acts_as_journalized/test/tagging_test.rb @@ -0,0 +1,39 @@ +require File.join(File.dirname(__FILE__), 'test_helper') + +class TaggingTest < Test::Unit::TestCase + context 'Tagging a journal' do + setup do + @user = User.create(:name => 'Steve Richert') + @user.update_attribute(:last_name, 'Jobs') + end + + should "update the journal record's tag column" do + tag_name = 'TAG' + last_journal = @user.journals.last + assert_not_equal tag_name, last_journal.tag + @user.tag_journal(tag_name) + assert_equal tag_name, last_journal.reload.tag + end + + should 'create a journal record for an initial journal' do + @user.revert_to(1) + assert_nil @user.journals.at(1) + @user.tag_journal('TAG') + assert_not_nil @user.journals.at(1) + end + end + + context 'A tagged journal' do + setup do + user = User.create(:name => 'Steve Richert') + user.update_attribute(:last_name, 'Jobs') + user.tag_journal('TAG') + @journal = user.journals.last + end + + should 'return true for the "tagged?" method' do + assert @journal.respond_to?(:tagged?) + assert_equal true, @journal.tagged? + end + end +end diff --git a/vendor/plugins/acts_as_journalized/test/test_helper.rb b/vendor/plugins/acts_as_journalized/test/test_helper.rb new file mode 100644 index 00000000..87e5209d --- /dev/null +++ b/vendor/plugins/acts_as_journalized/test/test_helper.rb @@ -0,0 +1,11 @@ +$: << File.join(File.dirname(__FILE__), '..', 'lib') +$: << File.dirname(__FILE__) + +require 'rubygems' +require 'test/unit' +require 'active_record' +require 'shoulda' +require 'mocha' +require 'vestal_versions' +require 'schema' +begin; require 'redgreen'; rescue LoadError; end diff --git a/vendor/plugins/acts_as_journalized/test/users_test.rb b/vendor/plugins/acts_as_journalized/test/users_test.rb new file mode 100644 index 00000000..ae29bc81 --- /dev/null +++ b/vendor/plugins/acts_as_journalized/test/users_test.rb @@ -0,0 +1,25 @@ +require 'test_helper' + +class UsersTest < Test::Unit::TestCase + context 'The user responsible for an update' do + setup do + @updated_by = User.create(:name => 'Steve Jobs') + @user = User.create(:name => 'Steve Richert') + end + + should 'default to nil' do + @user.update_attributes(:first_name => 'Stephen') + assert_nil @user.journals.last.user + end + + should 'accept and return an ActiveRecord user' do + @user.update_attributes(:first_name => 'Stephen', :updated_by => @updated_by) + assert_equal @updated_by, @user.journals.last.user + end + + should 'accept and return a string user name' do + @user.update_attributes(:first_name => 'Stephen', :updated_by => @updated_by.name) + assert_equal @updated_by.name, @user.journals.last.user + end + end +end diff --git a/vendor/plugins/acts_as_journalized/test/version_test.rb b/vendor/plugins/acts_as_journalized/test/version_test.rb new file mode 100644 index 00000000..7d005196 --- /dev/null +++ b/vendor/plugins/acts_as_journalized/test/version_test.rb @@ -0,0 +1,43 @@ +require File.join(File.dirname(__FILE__), 'test_helper') + +class VersionTest < Test::Unit::TestCase + context 'Versions' do + setup do + @user = User.create(:name => 'Stephen Richert') + @user.update_attribute(:name, 'Steve Jobs') + @user.update_attribute(:last_name, 'Richert') + @first_journal, @last_journal = @user.journals.first, @user.journals.last + end + + should 'be comparable to another journal based on journal number' do + assert @first_journal == @first_journal + assert @last_journal == @last_journal + assert @first_journal != @last_journal + assert @last_journal != @first_journal + assert @first_journal < @last_journal + assert @last_journal > @first_journal + assert @first_journal <= @last_journal + assert @last_journal >= @first_journal + end + + should "not equal a separate model's journal with the same number" do + user = User.create(:name => 'Stephen Richert') + user.update_attribute(:name, 'Steve Jobs') + user.update_attribute(:last_name, 'Richert') + first_journal, last_journal = user.journals.first, user.journals.last + assert_not_equal @first_journal, first_journal + assert_not_equal @last_journal, last_journal + end + + should 'default to ordering by number when finding through association' do + order = @user.journals.send(:scope, :find)[:order] + assert_equal 'journals.number ASC', order + end + + should 'return true for the "initial?" method when the journal number is 1' do + journal = @user.journals.build(:number => 1) + assert_equal 1, journal.number + assert_equal true, journal.initial? + end + end +end diff --git a/vendor/plugins/acts_as_journalized/test/versioned_test.rb b/vendor/plugins/acts_as_journalized/test/versioned_test.rb new file mode 100644 index 00000000..dca8a4f3 --- /dev/null +++ b/vendor/plugins/acts_as_journalized/test/versioned_test.rb @@ -0,0 +1,18 @@ +require File.join(File.dirname(__FILE__), 'test_helper') + +class VersionedTest < Test::Unit::TestCase + context 'ActiveRecord models' do + should 'respond to the "journaled?" method' do + assert ActiveRecord::Base.respond_to?(:journaled?) + assert User.respond_to?(:journaled?) + end + + should 'return true for the "journaled?" method if the model is journaled' do + assert_equal true, User.journaled? + end + + should 'return false for the "journaled?" method if the model is not journaled' do + assert_equal false, ActiveRecord::Base.journaled? + end + end +end diff --git a/vendor/plugins/acts_as_journalized/test/versions_test.rb b/vendor/plugins/acts_as_journalized/test/versions_test.rb new file mode 100644 index 00000000..ff0dbeef --- /dev/null +++ b/vendor/plugins/acts_as_journalized/test/versions_test.rb @@ -0,0 +1,172 @@ +require File.join(File.dirname(__FILE__), 'test_helper') + +class VersionsTest < Test::Unit::TestCase + context 'A collection of associated journals' do + setup do + @user, @times = User.new, {} + names = ['Steve Richert', 'Stephen Richert', 'Stephen Jobs', 'Steve Jobs'] + time = names.size.hours.ago + names.each do |name| + @user.update_attribute(:name, name) + @user.tag_journal(@user.journal.to_s) + time += 1.hour + @user.journals.last.update_attribute(:created_at, time) + @times[@user.journal] = time + end + end + + should 'be searchable between two valid journal values' do + @times.keys.each do |number| + @times.values.each do |time| + assert_kind_of Array, @user.journals.between(number, number) + assert_kind_of Array, @user.journals.between(number, time) + assert_kind_of Array, @user.journals.between(time, number) + assert_kind_of Array, @user.journals.between(time, time) + assert !@user.journals.between(number, number).empty? + assert !@user.journals.between(number, time).empty? + assert !@user.journals.between(time, number).empty? + assert !@user.journals.between(time, time).empty? + end + end + end + + should 'return an empty array when searching between a valid and an invalid journal value' do + @times.each do |number, time| + assert_equal [], @user.journals.between(number, nil) + assert_equal [], @user.journals.between(time, nil) + assert_equal [], @user.journals.between(nil, number) + assert_equal [], @user.journals.between(nil, time) + end + end + + should 'return an empty array when searching between two invalid journal values' do + assert_equal [], @user.journals.between(nil, nil) + end + + should 'be searchable before a valid journal value' do + @times.sort.each_with_index do |(number, time), i| + assert_equal i, @user.journals.before(number).size + assert_equal i, @user.journals.before(time).size + end + end + + should 'return an empty array when searching before an invalid journal value' do + assert_equal [], @user.journals.before(nil) + end + + should 'be searchable after a valid journal value' do + @times.sort.reverse.each_with_index do |(number, time), i| + assert_equal i, @user.journals.after(number).size + assert_equal i, @user.journals.after(time).size + end + end + + should 'return an empty array when searching after an invalid journal value' do + assert_equal [], @user.journals.after(nil) + end + + should 'be fetchable by journal number' do + @times.keys.each do |number| + assert_kind_of VestalVersions::Version, @user.journals.at(number) + assert_equal number, @user.journals.at(number).number + end + end + + should 'be fetchable by tag' do + @times.keys.map{|n| [n, n.to_s] }.each do |number, tag| + assert_kind_of VestalVersions::Version, @user.journals.at(tag) + assert_equal number, @user.journals.at(tag).number + end + end + + should "be fetchable by the exact time of a journal's creation" do + @times.each do |number, time| + assert_kind_of VestalVersions::Version, @user.journals.at(time) + assert_equal number, @user.journals.at(time).number + end + end + + should "be fetchable by any time after the model's creation" do + @times.each do |number, time| + assert_kind_of VestalVersions::Version, @user.journals.at(time + 30.minutes) + assert_equal number, @user.journals.at(time + 30.minutes).number + end + end + + should "return nil when fetching a time before the model's creation" do + creation = @times.values.min + assert_nil @user.journals.at(creation - 1.second) + end + + should 'be fetchable by an association extension method' do + assert_kind_of VestalVersions::Version, @user.journals.at(:first) + assert_kind_of VestalVersions::Version, @user.journals.at(:last) + assert_equal @times.keys.min, @user.journals.at(:first).number + assert_equal @times.keys.max, @user.journals.at(:last).number + end + + should 'be fetchable by a journal object' do + @times.keys.each do |number| + journal = @user.journals.at(number) + assert_kind_of VestalVersions::Version, journal + assert_kind_of VestalVersions::Version, @user.journals.at(journal) + assert_equal number, @user.journals.at(journal).number + end + end + + should 'return nil when fetching an invalid journal value' do + assert_nil @user.journals.at(nil) + end + + should 'provide a journal number for any given numeric journal value' do + @times.keys.each do |number| + assert_kind_of Fixnum, @user.journals.number_at(number) + assert_kind_of Fixnum, @user.journals.number_at(number + 0.5) + assert_equal @user.journals.number_at(number), @user.journals.number_at(number + 0.5) + end + end + + should 'provide a journal number for a valid tag' do + @times.keys.map{|n| [n, n.to_s] }.each do |number, tag| + assert_kind_of Fixnum, @user.journals.number_at(tag) + assert_equal number, @user.journals.number_at(tag) + end + end + + should 'return nil when providing a journal number for an invalid tag' do + assert_nil @user.journals.number_at('INVALID') + end + + should 'provide a journal number of a journal corresponding to an association extension method' do + assert_kind_of VestalVersions::Version, @user.journals.at(:first) + assert_kind_of VestalVersions::Version, @user.journals.at(:last) + assert_equal @times.keys.min, @user.journals.number_at(:first) + assert_equal @times.keys.max, @user.journals.number_at(:last) + end + + should 'return nil when providing a journal number for an invalid association extension method' do + assert_nil @user.journals.number_at(:INVALID) + end + + should "provide a journal number for any time after the model's creation" do + @times.each do |number, time| + assert_kind_of Fixnum, @user.journals.number_at(time + 30.minutes) + assert_equal number, @user.journals.number_at(time + 30.minutes) + end + end + + should "provide a journal number of 1 for a time before the model's creation" do + creation = @times.values.min + assert_equal 1, @user.journals.number_at(creation - 1.second) + end + + should 'provide a journal number for a given journal object' do + @times.keys.each do |number| + journal = @user.journals.at(number) + assert_kind_of VestalVersions::Version, journal + assert_kind_of Fixnum, @user.journals.number_at(journal) + assert_equal number, @user.journals.number_at(journal) + end + end + end +end diff --git a/vendor/plugins/acts_as_versioned/CHANGELOG b/vendor/plugins/acts_as_versioned/CHANGELOG deleted file mode 100644 index a5d339cc..00000000 --- a/vendor/plugins/acts_as_versioned/CHANGELOG +++ /dev/null @@ -1,74 +0,0 @@ -*SVN* (version numbers are overrated) - -* (5 Oct 2006) Allow customization of #versions association options [Dan Peterson] - -*0.5.1* - -* (8 Aug 2006) Versioned models now belong to the unversioned model. @article_version.article.class => Article [Aslak Hellesoy] - -*0.5* # do versions even matter for plugins? - -* (21 Apr 2006) Added without_locking and without_revision methods. - - Foo.without_revision do - @foo.update_attributes ... - end - -*0.4* - -* (28 March 2006) Rename non_versioned_fields to non_versioned_columns (old one is kept for compatibility). -* (28 March 2006) Made explicit documentation note that string column names are required for non_versioned_columns. - -*0.3.1* - -* (7 Jan 2006) explicitly set :foreign_key option for the versioned model's belongs_to assocation for STI [Caged] -* (7 Jan 2006) added tests to prove has_many :through joins work - -*0.3* - -* (2 Jan 2006) added ability to share a mixin with versioned class -* (2 Jan 2006) changed the dynamic version model to MyModel::Version - -*0.2.4* - -* (27 Nov 2005) added note about possible destructive behavior of if_changed? [Michael Schuerig] - -*0.2.3* - -* (12 Nov 2005) fixed bug with old behavior of #blank? [Michael Schuerig] -* (12 Nov 2005) updated tests to use ActiveRecord Schema - -*0.2.2* - -* (3 Nov 2005) added documentation note to #acts_as_versioned [Martin Jul] - -*0.2.1* - -* (6 Oct 2005) renamed dirty? to changed? to keep it uniform. it was aliased to keep it backwards compatible. - -*0.2* - -* (6 Oct 2005) added find_versions and find_version class methods. - -* (6 Oct 2005) removed transaction from create_versioned_table(). - this way you can specify your own transaction around a group of operations. - -* (30 Sep 2005) fixed bug where find_versions() would order by 'version' twice. (found by Joe Clark) - -* (26 Sep 2005) added :sequence_name option to acts_as_versioned to set the sequence name on the versioned model - -*0.1.3* (18 Sep 2005) - -* First RubyForge release - -*0.1.2* - -* check if module is already included when acts_as_versioned is called - -*0.1.1* - -* Adding tests and rdocs - -*0.1* - -* Initial transfer from Rails ticket: http://dev.rubyonrails.com/ticket/1974 \ No newline at end of file diff --git a/vendor/plugins/acts_as_versioned/MIT-LICENSE b/vendor/plugins/acts_as_versioned/MIT-LICENSE deleted file mode 100644 index 5851fdae..00000000 --- a/vendor/plugins/acts_as_versioned/MIT-LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -Copyright (c) 2005 Rick Olson - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/vendor/plugins/acts_as_versioned/README b/vendor/plugins/acts_as_versioned/README deleted file mode 100644 index 8961f052..00000000 --- a/vendor/plugins/acts_as_versioned/README +++ /dev/null @@ -1,28 +0,0 @@ -= acts_as_versioned - -This library adds simple versioning to an ActiveRecord module. ActiveRecord is required. - -== Resources - -Install - -* gem install acts_as_versioned - -Rubyforge project - -* http://rubyforge.org/projects/ar-versioned - -RDocs - -* http://ar-versioned.rubyforge.org - -Subversion - -* http://techno-weenie.net/svn/projects/acts_as_versioned - -Collaboa - -* http://collaboa.techno-weenie.net/repository/browse/acts_as_versioned - -Special thanks to Dreamer on ##rubyonrails for help in early testing. His ServerSideWiki (http://serversidewiki.com) -was the first project to use acts_as_versioned in the wild. \ No newline at end of file diff --git a/vendor/plugins/acts_as_versioned/RUNNING_UNIT_TESTS b/vendor/plugins/acts_as_versioned/RUNNING_UNIT_TESTS deleted file mode 100644 index a6e55b84..00000000 --- a/vendor/plugins/acts_as_versioned/RUNNING_UNIT_TESTS +++ /dev/null @@ -1,41 +0,0 @@ -== Creating the test database - -The default name for the test databases is "activerecord_versioned". If you -want to use another database name then be sure to update the connection -adapter setups you want to test with in test/connections//connection.rb. -When you have the database online, you can import the fixture tables with -the test/fixtures/db_definitions/*.sql files. - -Make sure that you create database objects with the same user that you specified in i -connection.rb otherwise (on Postgres, at least) tests for default values will fail. - -== Running with Rake - -The easiest way to run the unit tests is through Rake. The default task runs -the entire test suite for all the adapters. You can also run the suite on just -one adapter by using the tasks test_mysql_ruby, test_ruby_mysql, test_sqlite, -or test_postresql. For more information, checkout the full array of rake tasks with "rake -T" - -Rake can be found at http://rake.rubyforge.org - -== Running by hand - -Unit tests are located in test directory. If you only want to run a single test suite, -or don't want to bother with Rake, you can do so with something like: - - cd test; ruby -I "connections/native_mysql" base_test.rb - -That'll run the base suite using the MySQL-Ruby adapter. Change the adapter -and test suite name as needed. - -== Faster tests - -If you are using a database that supports transactions, you can set the -"AR_TX_FIXTURES" environment variable to "yes" to use transactional fixtures. -This gives a very large speed boost. With rake: - - rake AR_TX_FIXTURES=yes - -Or, by hand: - - AR_TX_FIXTURES=yes ruby -I connections/native_sqlite3 base_test.rb diff --git a/vendor/plugins/acts_as_versioned/Rakefile b/vendor/plugins/acts_as_versioned/Rakefile deleted file mode 100644 index 5bccb5d8..00000000 --- a/vendor/plugins/acts_as_versioned/Rakefile +++ /dev/null @@ -1,182 +0,0 @@ -require 'rubygems' - -Gem::manage_gems - -require 'rake/rdoctask' -require 'rake/packagetask' -require 'rake/gempackagetask' -require 'rake/testtask' -require 'rake/contrib/rubyforgepublisher' - -PKG_NAME = 'acts_as_versioned' -PKG_VERSION = '0.3.1' -PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}" -PROD_HOST = "technoweenie@bidwell.textdrive.com" -RUBY_FORGE_PROJECT = 'ar-versioned' -RUBY_FORGE_USER = 'technoweenie' - -desc 'Default: run unit tests.' -task :default => :test - -desc 'Test the calculations plugin.' -Rake::TestTask.new(:test) do |t| - t.libs << 'lib' - t.pattern = 'test/**/*_test.rb' - t.verbose = true -end - -desc 'Generate documentation for the calculations plugin.' -Rake::RDocTask.new(:rdoc) do |rdoc| - rdoc.rdoc_dir = 'rdoc' - rdoc.title = "#{PKG_NAME} -- Simple versioning with active record models" - rdoc.options << '--line-numbers --inline-source' - rdoc.rdoc_files.include('README', 'CHANGELOG', 'RUNNING_UNIT_TESTS') - rdoc.rdoc_files.include('lib/**/*.rb') -end - -spec = Gem::Specification.new do |s| - s.name = PKG_NAME - s.version = PKG_VERSION - s.platform = Gem::Platform::RUBY - s.summary = "Simple versioning with active record models" - s.files = FileList["{lib,test}/**/*"].to_a + %w(README MIT-LICENSE CHANGELOG RUNNING_UNIT_TESTS) - s.files.delete "acts_as_versioned_plugin.sqlite.db" - s.files.delete "acts_as_versioned_plugin.sqlite3.db" - s.files.delete "test/debug.log" - s.require_path = 'lib' - s.autorequire = 'acts_as_versioned' - s.has_rdoc = true - s.test_files = Dir['test/**/*_test.rb'] - s.add_dependency 'activerecord', '>= 1.10.1' - s.add_dependency 'activesupport', '>= 1.1.1' - s.author = "Rick Olson" - s.email = "technoweenie@gmail.com" - s.homepage = "http://techno-weenie.net" -end - -Rake::GemPackageTask.new(spec) do |pkg| - pkg.need_tar = true -end - -desc "Publish the API documentation" -task :pdoc => [:rdoc] do - Rake::RubyForgePublisher.new(RUBY_FORGE_PROJECT, RUBY_FORGE_USER).upload -end - -desc 'Publish the gem and API docs' -task :publish => [:pdoc, :rubyforge_upload] - -desc "Publish the release files to RubyForge." -task :rubyforge_upload => :package do - files = %w(gem tgz).map { |ext| "pkg/#{PKG_FILE_NAME}.#{ext}" } - - if RUBY_FORGE_PROJECT then - require 'net/http' - require 'open-uri' - - project_uri = "http://rubyforge.org/projects/#{RUBY_FORGE_PROJECT}/" - project_data = open(project_uri) { |data| data.read } - group_id = project_data[/[?&]group_id=(\d+)/, 1] - raise "Couldn't get group id" unless group_id - - # This echos password to shell which is a bit sucky - if ENV["RUBY_FORGE_PASSWORD"] - password = ENV["RUBY_FORGE_PASSWORD"] - else - print "#{RUBY_FORGE_USER}@rubyforge.org's password: " - password = STDIN.gets.chomp - end - - login_response = Net::HTTP.start("rubyforge.org", 80) do |http| - data = [ - "login=1", - "form_loginname=#{RUBY_FORGE_USER}", - "form_pw=#{password}" - ].join("&") - http.post("/account/login.php", data) - end - - cookie = login_response["set-cookie"] - raise "Login failed" unless cookie - headers = { "Cookie" => cookie } - - release_uri = "http://rubyforge.org/frs/admin/?group_id=#{group_id}" - release_data = open(release_uri, headers) { |data| data.read } - package_id = release_data[/[?&]package_id=(\d+)/, 1] - raise "Couldn't get package id" unless package_id - - first_file = true - release_id = "" - - files.each do |filename| - basename = File.basename(filename) - file_ext = File.extname(filename) - file_data = File.open(filename, "rb") { |file| file.read } - - puts "Releasing #{basename}..." - - release_response = Net::HTTP.start("rubyforge.org", 80) do |http| - release_date = Time.now.strftime("%Y-%m-%d %H:%M") - type_map = { - ".zip" => "3000", - ".tgz" => "3110", - ".gz" => "3110", - ".gem" => "1400" - }; type_map.default = "9999" - type = type_map[file_ext] - boundary = "rubyqMY6QN9bp6e4kS21H4y0zxcvoor" - - query_hash = if first_file then - { - "group_id" => group_id, - "package_id" => package_id, - "release_name" => PKG_FILE_NAME, - "release_date" => release_date, - "type_id" => type, - "processor_id" => "8000", # Any - "release_notes" => "", - "release_changes" => "", - "preformatted" => "1", - "submit" => "1" - } - else - { - "group_id" => group_id, - "release_id" => release_id, - "package_id" => package_id, - "step2" => "1", - "type_id" => type, - "processor_id" => "8000", # Any - "submit" => "Add This File" - } - end - - query = "?" + query_hash.map do |(name, value)| - [name, URI.encode(value)].join("=") - end.join("&") - - data = [ - "--" + boundary, - "Content-Disposition: form-data; name=\"userfile\"; filename=\"#{basename}\"", - "Content-Type: application/octet-stream", - "Content-Transfer-Encoding: binary", - "", file_data, "" - ].join("\x0D\x0A") - - release_headers = headers.merge( - "Content-Type" => "multipart/form-data; boundary=#{boundary}" - ) - - target = first_file ? "/frs/admin/qrs.php" : "/frs/admin/editrelease.php" - http.post(target + query, data, release_headers) - end - - if first_file then - release_id = release_response.body[/release_id=(\d+)/, 1] - raise("Couldn't get release id") unless release_id - end - - first_file = false - end - end -end \ No newline at end of file diff --git a/vendor/plugins/acts_as_versioned/init.rb b/vendor/plugins/acts_as_versioned/init.rb deleted file mode 100644 index 5937bbc7..00000000 --- a/vendor/plugins/acts_as_versioned/init.rb +++ /dev/null @@ -1 +0,0 @@ -require 'acts_as_versioned' \ No newline at end of file diff --git a/vendor/plugins/acts_as_versioned/lib/acts_as_versioned.rb b/vendor/plugins/acts_as_versioned/lib/acts_as_versioned.rb deleted file mode 100644 index bba10c43..00000000 --- a/vendor/plugins/acts_as_versioned/lib/acts_as_versioned.rb +++ /dev/null @@ -1,564 +0,0 @@ -# Copyright (c) 2005 Rick Olson -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be -# included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -module ActiveRecord #:nodoc: - module Acts #:nodoc: - # Specify this act if you want to save a copy of the row in a versioned table. This assumes there is a - # versioned table ready and that your model has a version field. This works with optimistic locking if the lock_version - # column is present as well. - # - # The class for the versioned model is derived the first time it is seen. Therefore, if you change your database schema you have to restart - # your container for the changes to be reflected. In development mode this usually means restarting WEBrick. - # - # class Page < ActiveRecord::Base - # # assumes pages_versions table - # acts_as_versioned - # end - # - # Example: - # - # page = Page.create(:title => 'hello world!') - # page.version # => 1 - # - # page.title = 'hello world' - # page.save - # page.version # => 2 - # page.versions.size # => 2 - # - # page.revert_to(1) # using version number - # page.title # => 'hello world!' - # - # page.revert_to(page.versions.last) # using versioned instance - # page.title # => 'hello world' - # - # page.versions.earliest # efficient query to find the first version - # page.versions.latest # efficient query to find the most recently created version - # - # - # Simple Queries to page between versions - # - # page.versions.before(version) - # page.versions.after(version) - # - # Access the previous/next versions from the versioned model itself - # - # version = page.versions.latest - # version.previous # go back one version - # version.next # go forward one version - # - # See ActiveRecord::Acts::Versioned::ClassMethods#acts_as_versioned for configuration options - module Versioned - CALLBACKS = [:set_new_version, :save_version_on_create, :save_version?, :clear_altered_attributes] - def self.included(base) # :nodoc: - base.extend ClassMethods - end - - module ClassMethods - # == Configuration options - # - # * class_name - versioned model class name (default: PageVersion in the above example) - # * table_name - versioned model table name (default: page_versions in the above example) - # * foreign_key - foreign key used to relate the versioned model to the original model (default: page_id in the above example) - # * inheritance_column - name of the column to save the model's inheritance_column value for STI. (default: versioned_type) - # * version_column - name of the column in the model that keeps the version number (default: version) - # * sequence_name - name of the custom sequence to be used by the versioned model. - # * limit - number of revisions to keep, defaults to unlimited - # * if - symbol of method to check before saving a new version. If this method returns false, a new version is not saved. - # For finer control, pass either a Proc or modify Model#version_condition_met? - # - # acts_as_versioned :if => Proc.new { |auction| !auction.expired? } - # - # or... - # - # class Auction - # def version_condition_met? # totally bypasses the :if option - # !expired? - # end - # end - # - # * if_changed - Simple way of specifying attributes that are required to be changed before saving a model. This takes - # either a symbol or array of symbols. WARNING - This will attempt to overwrite any attribute setters you may have. - # Use this instead if you want to write your own attribute setters (and ignore if_changed): - # - # def name=(new_name) - # write_changed_attribute :name, new_name - # end - # - # * extend - Lets you specify a module to be mixed in both the original and versioned models. You can also just pass a block - # to create an anonymous mixin: - # - # class Auction - # acts_as_versioned do - # def started? - # !started_at.nil? - # end - # end - # end - # - # or... - # - # module AuctionExtension - # def started? - # !started_at.nil? - # end - # end - # class Auction - # acts_as_versioned :extend => AuctionExtension - # end - # - # Example code: - # - # @auction = Auction.find(1) - # @auction.started? - # @auction.versions.first.started? - # - # == Database Schema - # - # The model that you're versioning needs to have a 'version' attribute. The model is versioned - # into a table called #{model}_versions where the model name is singlular. The _versions table should - # contain all the fields you want versioned, the same version column, and a #{model}_id foreign key field. - # - # A lock_version field is also accepted if your model uses Optimistic Locking. If your table uses Single Table inheritance, - # then that field is reflected in the versioned model as 'versioned_type' by default. - # - # Acts_as_versioned comes prepared with the ActiveRecord::Acts::Versioned::ActMethods::ClassMethods#create_versioned_table - # method, perfect for a migration. It will also create the version column if the main model does not already have it. - # - # class AddVersions < ActiveRecord::Migration - # def self.up - # # create_versioned_table takes the same options hash - # # that create_table does - # Post.create_versioned_table - # end - # - # def self.down - # Post.drop_versioned_table - # end - # end - # - # == Changing What Fields Are Versioned - # - # By default, acts_as_versioned will version all but these fields: - # - # [self.primary_key, inheritance_column, 'version', 'lock_version', versioned_inheritance_column] - # - # You can add or change those by modifying #non_versioned_columns. Note that this takes strings and not symbols. - # - # class Post < ActiveRecord::Base - # acts_as_versioned - # self.non_versioned_columns << 'comments_count' - # end - # - def acts_as_versioned(options = {}, &extension) - # don't allow multiple calls - return if self.included_modules.include?(ActiveRecord::Acts::Versioned::ActMethods) - - send :include, ActiveRecord::Acts::Versioned::ActMethods - - cattr_accessor :versioned_class_name, :versioned_foreign_key, :versioned_table_name, :versioned_inheritance_column, - :version_column, :max_version_limit, :track_altered_attributes, :version_condition, :version_sequence_name, :non_versioned_columns, - :version_association_options - - # legacy - alias_method :non_versioned_fields, :non_versioned_columns - alias_method :non_versioned_fields=, :non_versioned_columns= - - class << self - alias_method :non_versioned_fields, :non_versioned_columns - alias_method :non_versioned_fields=, :non_versioned_columns= - end - - send :attr_accessor, :altered_attributes - - self.versioned_class_name = options[:class_name] || "Version" - self.versioned_foreign_key = options[:foreign_key] || self.to_s.foreign_key - self.versioned_table_name = options[:table_name] || "#{table_name_prefix}#{base_class.name.demodulize.underscore}_versions#{table_name_suffix}" - self.versioned_inheritance_column = options[:inheritance_column] || "versioned_#{inheritance_column}" - self.version_column = options[:version_column] || 'version' - self.version_sequence_name = options[:sequence_name] - self.max_version_limit = options[:limit].to_i - self.version_condition = options[:if] || true - self.non_versioned_columns = [self.primary_key, inheritance_column, 'version', 'lock_version', versioned_inheritance_column] - self.version_association_options = { - :class_name => "#{self.to_s}::#{versioned_class_name}", - :foreign_key => versioned_foreign_key, - :dependent => :delete_all - }.merge(options[:association_options] || {}) - - if block_given? - extension_module_name = "#{versioned_class_name}Extension" - silence_warnings do - self.const_set(extension_module_name, Module.new(&extension)) - end - - options[:extend] = self.const_get(extension_module_name) - end - - class_eval do - has_many :versions, version_association_options do - # finds earliest version of this record - def earliest - @earliest ||= find(:first, :order => 'version') - end - - # find latest version of this record - def latest - @latest ||= find(:first, :order => 'version desc') - end - end - before_save :set_new_version - after_create :save_version_on_create - after_update :save_version - after_save :clear_old_versions - after_save :clear_altered_attributes - - unless options[:if_changed].nil? - self.track_altered_attributes = true - options[:if_changed] = [options[:if_changed]] unless options[:if_changed].is_a?(Array) - options[:if_changed].each do |attr_name| - define_method("#{attr_name}=") do |value| - write_changed_attribute attr_name, value - end - end - end - - include options[:extend] if options[:extend].is_a?(Module) - end - - # create the dynamic versioned model - const_set(versioned_class_name, Class.new(ActiveRecord::Base)).class_eval do - def self.reloadable? ; false ; end - # find first version before the given version - def self.before(version) - find :first, :order => 'version desc', - :conditions => ["#{original_class.versioned_foreign_key} = ? and version < ?", version.send(original_class.versioned_foreign_key), version.version] - end - - # find first version after the given version. - def self.after(version) - find :first, :order => 'version', - :conditions => ["#{original_class.versioned_foreign_key} = ? and version > ?", version.send(original_class.versioned_foreign_key), version.version] - end - - def previous - self.class.before(self) - end - - def next - self.class.after(self) - end - - def versions_count - page.version - end - end - - versioned_class.cattr_accessor :original_class - versioned_class.original_class = self - versioned_class.set_table_name versioned_table_name - versioned_class.belongs_to self.to_s.demodulize.underscore.to_sym, - :class_name => "::#{self.to_s}", - :foreign_key => versioned_foreign_key - versioned_class.send :include, options[:extend] if options[:extend].is_a?(Module) - versioned_class.set_sequence_name version_sequence_name if version_sequence_name - end - end - - module ActMethods - def self.included(base) # :nodoc: - base.extend ClassMethods - end - - # Finds a specific version of this record - def find_version(version = nil) - self.class.find_version(id, version) - end - - # Saves a version of the model if applicable - def save_version - save_version_on_create if save_version? - end - - # Saves a version of the model in the versioned table. This is called in the after_save callback by default - def save_version_on_create - rev = self.class.versioned_class.new - self.clone_versioned_model(self, rev) - rev.version = send(self.class.version_column) - rev.send("#{self.class.versioned_foreign_key}=", self.id) - rev.save - end - - # Clears old revisions if a limit is set with the :limit option in acts_as_versioned. - # Override this method to set your own criteria for clearing old versions. - def clear_old_versions - return if self.class.max_version_limit == 0 - excess_baggage = send(self.class.version_column).to_i - self.class.max_version_limit - if excess_baggage > 0 - sql = "DELETE FROM #{self.class.versioned_table_name} WHERE version <= #{excess_baggage} AND #{self.class.versioned_foreign_key} = #{self.id}" - self.class.versioned_class.connection.execute sql - end - end - - def versions_count - version - end - - # Reverts a model to a given version. Takes either a version number or an instance of the versioned model - def revert_to(version) - if version.is_a?(self.class.versioned_class) - return false unless version.send(self.class.versioned_foreign_key) == self.id and !version.new_record? - else - return false unless version = versions.find_by_version(version) - end - self.clone_versioned_model(version, self) - self.send("#{self.class.version_column}=", version.version) - true - end - - # Reverts a model to a given version and saves the model. - # Takes either a version number or an instance of the versioned model - def revert_to!(version) - revert_to(version) ? save_without_revision : false - end - - # Temporarily turns off Optimistic Locking while saving. Used when reverting so that a new version is not created. - def save_without_revision - save_without_revision! - true - rescue - false - end - - def save_without_revision! - without_locking do - without_revision do - save! - end - end - end - - # Returns an array of attribute keys that are versioned. See non_versioned_columns - def versioned_attributes - self.attributes.keys.select { |k| !self.class.non_versioned_columns.include?(k) } - end - - # If called with no parameters, gets whether the current model has changed and needs to be versioned. - # If called with a single parameter, gets whether the parameter has changed. - def changed?(attr_name = nil) - attr_name.nil? ? - (!self.class.track_altered_attributes || (altered_attributes && altered_attributes.length > 0)) : - (altered_attributes && altered_attributes.include?(attr_name.to_s)) - end - - # keep old dirty? method - alias_method :dirty?, :changed? - - # Clones a model. Used when saving a new version or reverting a model's version. - def clone_versioned_model(orig_model, new_model) - self.versioned_attributes.each do |key| - new_model.send("#{key}=", orig_model.send(key)) if orig_model.has_attribute?(key) - end - - if orig_model.is_a?(self.class.versioned_class) - new_model[new_model.class.inheritance_column] = orig_model[self.class.versioned_inheritance_column] - elsif new_model.is_a?(self.class.versioned_class) - new_model[self.class.versioned_inheritance_column] = orig_model[orig_model.class.inheritance_column] - end - end - - # Checks whether a new version shall be saved or not. Calls version_condition_met? and changed?. - def save_version? - version_condition_met? && changed? - end - - # Checks condition set in the :if option to check whether a revision should be created or not. Override this for - # custom version condition checking. - def version_condition_met? - case - when version_condition.is_a?(Symbol) - send(version_condition) - when version_condition.respond_to?(:call) && (version_condition.arity == 1 || version_condition.arity == -1) - version_condition.call(self) - else - version_condition - end - end - - # Executes the block with the versioning callbacks disabled. - # - # @foo.without_revision do - # @foo.save - # end - # - def without_revision(&block) - self.class.without_revision(&block) - end - - # Turns off optimistic locking for the duration of the block - # - # @foo.without_locking do - # @foo.save - # end - # - def without_locking(&block) - self.class.without_locking(&block) - end - - def empty_callback() end #:nodoc: - - protected - # sets the new version before saving, unless you're using optimistic locking. In that case, let it take care of the version. - def set_new_version - self.send("#{self.class.version_column}=", self.next_version) if new_record? || (!locking_enabled? && save_version?) - end - - # Gets the next available version for the current record, or 1 for a new record - def next_version - return 1 if new_record? - (versions.calculate(:max, :version) || 0) + 1 - end - - # clears current changed attributes. Called after save. - def clear_altered_attributes - self.altered_attributes = [] - end - - def write_changed_attribute(attr_name, attr_value) - # Convert to db type for comparison. Avoids failing Float<=>String comparisons. - attr_value_for_db = self.class.columns_hash[attr_name.to_s].type_cast(attr_value) - (self.altered_attributes ||= []) << attr_name.to_s unless self.changed?(attr_name) || self.send(attr_name) == attr_value_for_db - write_attribute(attr_name, attr_value_for_db) - end - - module ClassMethods - # Finds a specific version of a specific row of this model - def find_version(id, version = nil) - return find(id) unless version - - conditions = ["#{versioned_foreign_key} = ? AND version = ?", id, version] - options = { :conditions => conditions, :limit => 1 } - - if result = find_versions(id, options).first - result - else - raise RecordNotFound, "Couldn't find #{name} with ID=#{id} and VERSION=#{version}" - end - end - - # Finds versions of a specific model. Takes an options hash like find - def find_versions(id, options = {}) - versioned_class.find :all, { - :conditions => ["#{versioned_foreign_key} = ?", id], - :order => 'version' }.merge(options) - end - - # Returns an array of columns that are versioned. See non_versioned_columns - def versioned_columns - self.columns.select { |c| !non_versioned_columns.include?(c.name) } - end - - # Returns an instance of the dynamic versioned model - def versioned_class - const_get versioned_class_name - end - - # Rake migration task to create the versioned table using options passed to acts_as_versioned - def create_versioned_table(create_table_options = {}) - # create version column in main table if it does not exist - if !self.content_columns.find { |c| %w(version lock_version).include? c.name } - self.connection.add_column table_name, :version, :integer - end - - self.connection.create_table(versioned_table_name, create_table_options) do |t| - t.column versioned_foreign_key, :integer - t.column :version, :integer - end - - updated_col = nil - self.versioned_columns.each do |col| - updated_col = col if !updated_col && %(updated_at updated_on).include?(col.name) - self.connection.add_column versioned_table_name, col.name, col.type, - :limit => col.limit, - :default => col.default, - :scale => col.scale, - :precision => col.precision - end - - if type_col = self.columns_hash[inheritance_column] - self.connection.add_column versioned_table_name, versioned_inheritance_column, type_col.type, - :limit => type_col.limit, - :default => type_col.default, - :scale => type_col.scale, - :precision => type_col.precision - end - - if updated_col.nil? - self.connection.add_column versioned_table_name, :updated_at, :timestamp - end - end - - # Rake migration task to drop the versioned table - def drop_versioned_table - self.connection.drop_table versioned_table_name - end - - # Executes the block with the versioning callbacks disabled. - # - # Foo.without_revision do - # @foo.save - # end - # - def without_revision(&block) - class_eval do - CALLBACKS.each do |attr_name| - alias_method "orig_#{attr_name}".to_sym, attr_name - alias_method attr_name, :empty_callback - end - end - block.call - ensure - class_eval do - CALLBACKS.each do |attr_name| - alias_method attr_name, "orig_#{attr_name}".to_sym - end - end - end - - # Turns off optimistic locking for the duration of the block - # - # Foo.without_locking do - # @foo.save - # end - # - def without_locking(&block) - current = ActiveRecord::Base.lock_optimistically - ActiveRecord::Base.lock_optimistically = false if current - result = block.call - ActiveRecord::Base.lock_optimistically = true if current - result - end - end - end - end - end -end - -ActiveRecord::Base.send :include, ActiveRecord::Acts::Versioned \ No newline at end of file diff --git a/vendor/plugins/acts_as_versioned/test/abstract_unit.rb b/vendor/plugins/acts_as_versioned/test/abstract_unit.rb deleted file mode 100644 index 86f50620..00000000 --- a/vendor/plugins/acts_as_versioned/test/abstract_unit.rb +++ /dev/null @@ -1,41 +0,0 @@ -$:.unshift(File.dirname(__FILE__) + '/../../../rails/activesupport/lib') -$:.unshift(File.dirname(__FILE__) + '/../../../rails/activerecord/lib') -$:.unshift(File.dirname(__FILE__) + '/../lib') -require 'test/unit' -begin - require 'active_support' - require 'active_record' - require 'active_record/fixtures' -rescue LoadError - require 'rubygems' - retry -end -require 'acts_as_versioned' - -config = YAML::load(IO.read(File.dirname(__FILE__) + '/database.yml')) -ActiveRecord::Base.logger = Logger.new(File.dirname(__FILE__) + "/debug.log") -ActiveRecord::Base.configurations = {'test' => config[ENV['DB'] || 'sqlite3']} -ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations['test']) - -load(File.dirname(__FILE__) + "/schema.rb") - -# set up custom sequence on widget_versions for DBs that support sequences -if ENV['DB'] == 'postgresql' - ActiveRecord::Base.connection.execute "DROP SEQUENCE widgets_seq;" rescue nil - ActiveRecord::Base.connection.remove_column :widget_versions, :id - ActiveRecord::Base.connection.execute "CREATE SEQUENCE widgets_seq START 101;" - ActiveRecord::Base.connection.execute "ALTER TABLE widget_versions ADD COLUMN id INTEGER PRIMARY KEY DEFAULT nextval('widgets_seq');" -end - -Test::Unit::TestCase.fixture_path = File.dirname(__FILE__) + "/fixtures/" -$:.unshift(Test::Unit::TestCase.fixture_path) - -class Test::Unit::TestCase #:nodoc: - # Turn off transactional fixtures if you're working with MyISAM tables in MySQL - self.use_transactional_fixtures = true - - # Instantiated fixtures are slow, but give you @david where you otherwise would need people(:david) - self.use_instantiated_fixtures = false - - # Add more helper methods to be used by all tests here... -end \ No newline at end of file diff --git a/vendor/plugins/acts_as_versioned/test/database.yml b/vendor/plugins/acts_as_versioned/test/database.yml deleted file mode 100644 index 506e6bd3..00000000 --- a/vendor/plugins/acts_as_versioned/test/database.yml +++ /dev/null @@ -1,18 +0,0 @@ -sqlite: - :adapter: sqlite - :dbfile: acts_as_versioned_plugin.sqlite.db -sqlite3: - :adapter: sqlite3 - :dbfile: acts_as_versioned_plugin.sqlite3.db -postgresql: - :adapter: postgresql - :username: postgres - :password: postgres - :database: acts_as_versioned_plugin_test - :min_messages: ERROR -mysql: - :adapter: mysql - :host: localhost - :username: rails - :password: - :database: acts_as_versioned_plugin_test \ No newline at end of file diff --git a/vendor/plugins/acts_as_versioned/test/fixtures/authors.yml b/vendor/plugins/acts_as_versioned/test/fixtures/authors.yml deleted file mode 100644 index bd7a5aed..00000000 --- a/vendor/plugins/acts_as_versioned/test/fixtures/authors.yml +++ /dev/null @@ -1,6 +0,0 @@ -caged: - id: 1 - name: caged -mly: - id: 2 - name: mly \ No newline at end of file diff --git a/vendor/plugins/acts_as_versioned/test/fixtures/landmark.rb b/vendor/plugins/acts_as_versioned/test/fixtures/landmark.rb deleted file mode 100644 index cb9b9305..00000000 --- a/vendor/plugins/acts_as_versioned/test/fixtures/landmark.rb +++ /dev/null @@ -1,3 +0,0 @@ -class Landmark < ActiveRecord::Base - acts_as_versioned :if_changed => [ :name, :longitude, :latitude ] -end diff --git a/vendor/plugins/acts_as_versioned/test/fixtures/landmark_versions.yml b/vendor/plugins/acts_as_versioned/test/fixtures/landmark_versions.yml deleted file mode 100644 index 2dbd54ed..00000000 --- a/vendor/plugins/acts_as_versioned/test/fixtures/landmark_versions.yml +++ /dev/null @@ -1,7 +0,0 @@ -washington: - id: 1 - landmark_id: 1 - version: 1 - name: Washington, D.C. - latitude: 38.895 - longitude: -77.036667 diff --git a/vendor/plugins/acts_as_versioned/test/fixtures/landmarks.yml b/vendor/plugins/acts_as_versioned/test/fixtures/landmarks.yml deleted file mode 100644 index 46d96176..00000000 --- a/vendor/plugins/acts_as_versioned/test/fixtures/landmarks.yml +++ /dev/null @@ -1,6 +0,0 @@ -washington: - id: 1 - name: Washington, D.C. - latitude: 38.895 - longitude: -77.036667 - version: 1 diff --git a/vendor/plugins/acts_as_versioned/test/fixtures/locked_pages.yml b/vendor/plugins/acts_as_versioned/test/fixtures/locked_pages.yml deleted file mode 100644 index 318e776c..00000000 --- a/vendor/plugins/acts_as_versioned/test/fixtures/locked_pages.yml +++ /dev/null @@ -1,10 +0,0 @@ -welcome: - id: 1 - title: Welcome to the weblog - lock_version: 24 - type: LockedPage -thinking: - id: 2 - title: So I was thinking - lock_version: 24 - type: SpecialLockedPage diff --git a/vendor/plugins/acts_as_versioned/test/fixtures/locked_pages_revisions.yml b/vendor/plugins/acts_as_versioned/test/fixtures/locked_pages_revisions.yml deleted file mode 100644 index 5c978e62..00000000 --- a/vendor/plugins/acts_as_versioned/test/fixtures/locked_pages_revisions.yml +++ /dev/null @@ -1,27 +0,0 @@ -welcome_1: - id: 1 - page_id: 1 - title: Welcome to the weblg - version: 23 - version_type: LockedPage - -welcome_2: - id: 2 - page_id: 1 - title: Welcome to the weblog - version: 24 - version_type: LockedPage - -thinking_1: - id: 3 - page_id: 2 - title: So I was thinking!!! - version: 23 - version_type: SpecialLockedPage - -thinking_2: - id: 4 - page_id: 2 - title: So I was thinking - version: 24 - version_type: SpecialLockedPage diff --git a/vendor/plugins/acts_as_versioned/test/fixtures/migrations/1_add_versioned_tables.rb b/vendor/plugins/acts_as_versioned/test/fixtures/migrations/1_add_versioned_tables.rb deleted file mode 100644 index 9512b5e8..00000000 --- a/vendor/plugins/acts_as_versioned/test/fixtures/migrations/1_add_versioned_tables.rb +++ /dev/null @@ -1,13 +0,0 @@ -class AddVersionedTables < ActiveRecord::Migration - def self.up - create_table("things") do |t| - t.column :title, :text - end - Thing.create_versioned_table - end - - def self.down - Thing.drop_versioned_table - drop_table "things" rescue nil - end -end \ No newline at end of file diff --git a/vendor/plugins/acts_as_versioned/test/fixtures/page.rb b/vendor/plugins/acts_as_versioned/test/fixtures/page.rb deleted file mode 100644 index f133e351..00000000 --- a/vendor/plugins/acts_as_versioned/test/fixtures/page.rb +++ /dev/null @@ -1,43 +0,0 @@ -class Page < ActiveRecord::Base - belongs_to :author - has_many :authors, :through => :versions, :order => 'name' - belongs_to :revisor, :class_name => 'Author' - has_many :revisors, :class_name => 'Author', :through => :versions, :order => 'name' - acts_as_versioned :if => :feeling_good? do - def self.included(base) - base.cattr_accessor :feeling_good - base.feeling_good = true - base.belongs_to :author - base.belongs_to :revisor, :class_name => 'Author' - end - - def feeling_good? - @@feeling_good == true - end - end -end - -module LockedPageExtension - def hello_world - 'hello_world' - end -end - -class LockedPage < ActiveRecord::Base - acts_as_versioned \ - :inheritance_column => :version_type, - :foreign_key => :page_id, - :table_name => :locked_pages_revisions, - :class_name => 'LockedPageRevision', - :version_column => :lock_version, - :limit => 2, - :if_changed => :title, - :extend => LockedPageExtension -end - -class SpecialLockedPage < LockedPage -end - -class Author < ActiveRecord::Base - has_many :pages -end \ No newline at end of file diff --git a/vendor/plugins/acts_as_versioned/test/fixtures/page_versions.yml b/vendor/plugins/acts_as_versioned/test/fixtures/page_versions.yml deleted file mode 100644 index ef565fa4..00000000 --- a/vendor/plugins/acts_as_versioned/test/fixtures/page_versions.yml +++ /dev/null @@ -1,16 +0,0 @@ -welcome_2: - id: 1 - page_id: 1 - title: Welcome to the weblog - body: Such a lovely day - version: 24 - author_id: 1 - revisor_id: 1 -welcome_1: - id: 2 - page_id: 1 - title: Welcome to the weblg - body: Such a lovely day - version: 23 - author_id: 2 - revisor_id: 2 diff --git a/vendor/plugins/acts_as_versioned/test/fixtures/pages.yml b/vendor/plugins/acts_as_versioned/test/fixtures/pages.yml deleted file mode 100644 index 07ac51f9..00000000 --- a/vendor/plugins/acts_as_versioned/test/fixtures/pages.yml +++ /dev/null @@ -1,7 +0,0 @@ -welcome: - id: 1 - title: Welcome to the weblog - body: Such a lovely day - version: 24 - author_id: 1 - revisor_id: 1 \ No newline at end of file diff --git a/vendor/plugins/acts_as_versioned/test/fixtures/widget.rb b/vendor/plugins/acts_as_versioned/test/fixtures/widget.rb deleted file mode 100644 index 086ac2b4..00000000 --- a/vendor/plugins/acts_as_versioned/test/fixtures/widget.rb +++ /dev/null @@ -1,6 +0,0 @@ -class Widget < ActiveRecord::Base - acts_as_versioned :sequence_name => 'widgets_seq', :association_options => { - :dependent => :nullify, :order => 'version desc' - } - non_versioned_columns << 'foo' -end \ No newline at end of file diff --git a/vendor/plugins/acts_as_versioned/test/migration_test.rb b/vendor/plugins/acts_as_versioned/test/migration_test.rb deleted file mode 100644 index 4ead4a8f..00000000 --- a/vendor/plugins/acts_as_versioned/test/migration_test.rb +++ /dev/null @@ -1,46 +0,0 @@ -require File.join(File.dirname(__FILE__), 'abstract_unit') - -if ActiveRecord::Base.connection.supports_migrations? - class Thing < ActiveRecord::Base - attr_accessor :version - acts_as_versioned - end - - class MigrationTest < Test::Unit::TestCase - self.use_transactional_fixtures = false - def teardown - if ActiveRecord::Base.connection.respond_to?(:initialize_schema_information) - ActiveRecord::Base.connection.initialize_schema_information - ActiveRecord::Base.connection.update "UPDATE schema_info SET version = 0" - else - ActiveRecord::Base.connection.initialize_schema_migrations_table - ActiveRecord::Base.connection.assume_migrated_upto_version(0) - end - - Thing.connection.drop_table "things" rescue nil - Thing.connection.drop_table "thing_versions" rescue nil - Thing.reset_column_information - end - - def test_versioned_migration - assert_raises(ActiveRecord::StatementInvalid) { Thing.create :title => 'blah blah' } - # take 'er up - ActiveRecord::Migrator.up(File.dirname(__FILE__) + '/fixtures/migrations/') - t = Thing.create :title => 'blah blah', :price => 123.45, :type => 'Thing' - assert_equal 1, t.versions.size - - # check that the price column has remembered its value correctly - assert_equal t.price, t.versions.first.price - assert_equal t.title, t.versions.first.title - assert_equal t[:type], t.versions.first[:type] - - # make sure that the precision of the price column has been preserved - assert_equal 7, Thing::Version.columns.find{|c| c.name == "price"}.precision - assert_equal 2, Thing::Version.columns.find{|c| c.name == "price"}.scale - - # now lets take 'er back down - ActiveRecord::Migrator.down(File.dirname(__FILE__) + '/fixtures/migrations/') - assert_raises(ActiveRecord::StatementInvalid) { Thing.create :title => 'blah blah' } - end - end -end diff --git a/vendor/plugins/acts_as_versioned/test/schema.rb b/vendor/plugins/acts_as_versioned/test/schema.rb deleted file mode 100644 index 7d5153d0..00000000 --- a/vendor/plugins/acts_as_versioned/test/schema.rb +++ /dev/null @@ -1,68 +0,0 @@ -ActiveRecord::Schema.define(:version => 0) do - create_table :pages, :force => true do |t| - t.column :version, :integer - t.column :title, :string, :limit => 255 - t.column :body, :text - t.column :updated_on, :datetime - t.column :author_id, :integer - t.column :revisor_id, :integer - end - - create_table :page_versions, :force => true do |t| - t.column :page_id, :integer - t.column :version, :integer - t.column :title, :string, :limit => 255 - t.column :body, :text - t.column :updated_on, :datetime - t.column :author_id, :integer - t.column :revisor_id, :integer - end - - create_table :authors, :force => true do |t| - t.column :page_id, :integer - t.column :name, :string - end - - create_table :locked_pages, :force => true do |t| - t.column :lock_version, :integer - t.column :title, :string, :limit => 255 - t.column :type, :string, :limit => 255 - end - - create_table :locked_pages_revisions, :force => true do |t| - t.column :page_id, :integer - t.column :version, :integer - t.column :title, :string, :limit => 255 - t.column :version_type, :string, :limit => 255 - t.column :updated_at, :datetime - end - - create_table :widgets, :force => true do |t| - t.column :name, :string, :limit => 50 - t.column :foo, :string - t.column :version, :integer - t.column :updated_at, :datetime - end - - create_table :widget_versions, :force => true do |t| - t.column :widget_id, :integer - t.column :name, :string, :limit => 50 - t.column :version, :integer - t.column :updated_at, :datetime - end - - create_table :landmarks, :force => true do |t| - t.column :name, :string - t.column :latitude, :float - t.column :longitude, :float - t.column :version, :integer - end - - create_table :landmark_versions, :force => true do |t| - t.column :landmark_id, :integer - t.column :name, :string - t.column :latitude, :float - t.column :longitude, :float - t.column :version, :integer - end -end diff --git a/vendor/plugins/acts_as_versioned/test/versioned_test.rb b/vendor/plugins/acts_as_versioned/test/versioned_test.rb deleted file mode 100644 index a7bc2082..00000000 --- a/vendor/plugins/acts_as_versioned/test/versioned_test.rb +++ /dev/null @@ -1,347 +0,0 @@ -require File.join(File.dirname(__FILE__), 'abstract_unit') -require File.join(File.dirname(__FILE__), 'fixtures/page') -require File.join(File.dirname(__FILE__), 'fixtures/widget') - -class VersionedTest < Test::Unit::TestCase - fixtures :pages, :page_versions, :locked_pages, :locked_pages_revisions, :authors, :landmarks, :landmark_versions - set_fixture_class :page_versions => Page::Version - - def test_saves_versioned_copy - p = Page.create! :title => 'first title', :body => 'first body' - assert !p.new_record? - assert_equal 1, p.versions.size - assert_equal 1, p.version - assert_instance_of Page.versioned_class, p.versions.first - end - - def test_saves_without_revision - p = pages(:welcome) - old_versions = p.versions.count - - p.save_without_revision - - p.without_revision do - p.update_attributes :title => 'changed' - end - - assert_equal old_versions, p.versions.count - end - - def test_rollback_with_version_number - p = pages(:welcome) - assert_equal 24, p.version - assert_equal 'Welcome to the weblog', p.title - - assert p.revert_to!(p.versions.first.version), "Couldn't revert to 23" - assert_equal 23, p.version - assert_equal 'Welcome to the weblg', p.title - end - - def test_versioned_class_name - assert_equal 'Version', Page.versioned_class_name - assert_equal 'LockedPageRevision', LockedPage.versioned_class_name - end - - def test_versioned_class - assert_equal Page::Version, Page.versioned_class - assert_equal LockedPage::LockedPageRevision, LockedPage.versioned_class - end - - def test_special_methods - assert_nothing_raised { pages(:welcome).feeling_good? } - assert_nothing_raised { pages(:welcome).versions.first.feeling_good? } - assert_nothing_raised { locked_pages(:welcome).hello_world } - assert_nothing_raised { locked_pages(:welcome).versions.first.hello_world } - end - - def test_rollback_with_version_class - p = pages(:welcome) - assert_equal 24, p.version - assert_equal 'Welcome to the weblog', p.title - - assert p.revert_to!(p.versions.first), "Couldn't revert to 23" - assert_equal 23, p.version - assert_equal 'Welcome to the weblg', p.title - end - - def test_rollback_fails_with_invalid_revision - p = locked_pages(:welcome) - assert !p.revert_to!(locked_pages(:thinking)) - end - - def test_saves_versioned_copy_with_options - p = LockedPage.create! :title => 'first title' - assert !p.new_record? - assert_equal 1, p.versions.size - assert_instance_of LockedPage.versioned_class, p.versions.first - end - - def test_rollback_with_version_number_with_options - p = locked_pages(:welcome) - assert_equal 'Welcome to the weblog', p.title - assert_equal 'LockedPage', p.versions.first.version_type - - assert p.revert_to!(p.versions.first.version), "Couldn't revert to 23" - assert_equal 'Welcome to the weblg', p.title - assert_equal 'LockedPage', p.versions.first.version_type - end - - def test_rollback_with_version_class_with_options - p = locked_pages(:welcome) - assert_equal 'Welcome to the weblog', p.title - assert_equal 'LockedPage', p.versions.first.version_type - - assert p.revert_to!(p.versions.first), "Couldn't revert to 1" - assert_equal 'Welcome to the weblg', p.title - assert_equal 'LockedPage', p.versions.first.version_type - end - - def test_saves_versioned_copy_with_sti - p = SpecialLockedPage.create! :title => 'first title' - assert !p.new_record? - assert_equal 1, p.versions.size - assert_instance_of LockedPage.versioned_class, p.versions.first - assert_equal 'SpecialLockedPage', p.versions.first.version_type - end - - def test_rollback_with_version_number_with_sti - p = locked_pages(:thinking) - assert_equal 'So I was thinking', p.title - - assert p.revert_to!(p.versions.first.version), "Couldn't revert to 1" - assert_equal 'So I was thinking!!!', p.title - assert_equal 'SpecialLockedPage', p.versions.first.version_type - end - - def test_lock_version_works_with_versioning - p = locked_pages(:thinking) - p2 = LockedPage.find(p.id) - - p.title = 'fresh title' - p.save - assert_equal 2, p.versions.size # limit! - - assert_raises(ActiveRecord::StaleObjectError) do - p2.title = 'stale title' - p2.save - end - end - - def test_version_if_condition - p = Page.create! :title => "title" - assert_equal 1, p.version - - Page.feeling_good = false - p.save - assert_equal 1, p.version - Page.feeling_good = true - end - - def test_version_if_condition2 - # set new if condition - Page.class_eval do - def new_feeling_good() title[0..0] == 'a'; end - alias_method :old_feeling_good, :feeling_good? - alias_method :feeling_good?, :new_feeling_good - end - - p = Page.create! :title => "title" - assert_equal 1, p.version # version does not increment - assert_equal 1, p.versions(true).size - - p.update_attributes(:title => 'new title') - assert_equal 1, p.version # version does not increment - assert_equal 1, p.versions(true).size - - p.update_attributes(:title => 'a title') - assert_equal 2, p.version - assert_equal 2, p.versions(true).size - - # reset original if condition - Page.class_eval { alias_method :feeling_good?, :old_feeling_good } - end - - def test_version_if_condition_with_block - # set new if condition - old_condition = Page.version_condition - Page.version_condition = Proc.new { |page| page.title[0..0] == 'b' } - - p = Page.create! :title => "title" - assert_equal 1, p.version # version does not increment - assert_equal 1, p.versions(true).size - - p.update_attributes(:title => 'a title') - assert_equal 1, p.version # version does not increment - assert_equal 1, p.versions(true).size - - p.update_attributes(:title => 'b title') - assert_equal 2, p.version - assert_equal 2, p.versions(true).size - - # reset original if condition - Page.version_condition = old_condition - end - - def test_version_no_limit - p = Page.create! :title => "title", :body => 'first body' - p.save - p.save - 5.times do |i| - assert_page_title p, i - end - end - - def test_version_max_limit - p = LockedPage.create! :title => "title" - p.update_attributes(:title => "title1") - p.update_attributes(:title => "title2") - 5.times do |i| - assert_page_title p, i, :lock_version - assert p.versions(true).size <= 2, "locked version can only store 2 versions" - end - end - - def test_track_altered_attributes_default_value - assert !Page.track_altered_attributes - assert LockedPage.track_altered_attributes - assert SpecialLockedPage.track_altered_attributes - end - - def test_version_order - assert_equal 23, pages(:welcome).versions.first.version - assert_equal 24, pages(:welcome).versions.last.version - end - - def test_track_altered_attributes - p = LockedPage.create! :title => "title" - assert_equal 1, p.lock_version - assert_equal 1, p.versions(true).size - - p.title = 'title' - assert !p.save_version? - p.save - assert_equal 2, p.lock_version # still increments version because of optimistic locking - assert_equal 1, p.versions(true).size - - p.title = 'updated title' - assert p.save_version? - p.save - assert_equal 3, p.lock_version - assert_equal 1, p.versions(true).size # version 1 deleted - - p.title = 'updated title!' - assert p.save_version? - p.save - assert_equal 4, p.lock_version - assert_equal 2, p.versions(true).size # version 1 deleted - end - - def assert_page_title(p, i, version_field = :version) - p.title = "title#{i}" - p.save - assert_equal "title#{i}", p.title - assert_equal (i+4), p.send(version_field) - end - - def test_find_versions - assert_equal 2, locked_pages(:welcome).versions.size - assert_equal 1, locked_pages(:welcome).versions.find(:all, :conditions => ['title LIKE ?', '%weblog%']).length - assert_equal 2, locked_pages(:welcome).versions.find(:all, :conditions => ['title LIKE ?', '%web%']).length - assert_equal 0, locked_pages(:thinking).versions.find(:all, :conditions => ['title LIKE ?', '%web%']).length - assert_equal 2, locked_pages(:welcome).versions.length - end - - def test_find_version - assert_equal page_versions(:welcome_1), Page.find_version(pages(:welcome).id, 23) - assert_equal page_versions(:welcome_2), Page.find_version(pages(:welcome).id, 24) - assert_equal pages(:welcome), Page.find_version(pages(:welcome).id) - - assert_equal page_versions(:welcome_1), pages(:welcome).find_version(23) - assert_equal page_versions(:welcome_2), pages(:welcome).find_version(24) - assert_equal pages(:welcome), pages(:welcome).find_version - - assert_raise(ActiveRecord::RecordNotFound) { Page.find_version(pages(:welcome).id, 1) } - assert_raise(ActiveRecord::RecordNotFound) { Page.find_version(0, 23) } - end - - def test_with_sequence - assert_equal 'widgets_seq', Widget.versioned_class.sequence_name - 3.times { Widget.create! :name => 'new widget' } - assert_equal 3, Widget.count - assert_equal 3, Widget.versioned_class.count - end - - def test_has_many_through - assert_equal [authors(:caged), authors(:mly)], pages(:welcome).authors - end - - def test_has_many_through_with_custom_association - assert_equal [authors(:caged), authors(:mly)], pages(:welcome).revisors - end - - def test_referential_integrity - pages(:welcome).destroy - assert_equal 0, Page.count - assert_equal 0, Page::Version.count - end - - def test_association_options - association = Page.reflect_on_association(:versions) - options = association.options - assert_equal :delete_all, options[:dependent] - assert_equal 'version', options[:order] - - association = Widget.reflect_on_association(:versions) - options = association.options - assert_equal :nullify, options[:dependent] - assert_equal 'version desc', options[:order] - assert_equal 'widget_id', options[:foreign_key] - - widget = Widget.create! :name => 'new widget' - assert_equal 1, Widget.count - assert_equal 1, Widget.versioned_class.count - widget.destroy - assert_equal 0, Widget.count - assert_equal 1, Widget.versioned_class.count - end - - def test_versioned_records_should_belong_to_parent - page = pages(:welcome) - page_version = page.versions.last - assert_equal page, page_version.page - end - - def test_unaltered_attributes - landmarks(:washington).attributes = landmarks(:washington).attributes.except("id") - assert !landmarks(:washington).changed? - end - - def test_unchanged_string_attributes - landmarks(:washington).attributes = landmarks(:washington).attributes.except("id").inject({}) { |params, (key, value)| params.update(key => value.to_s) } - assert !landmarks(:washington).changed? - end - - def test_should_find_earliest_version - assert_equal page_versions(:welcome_1), pages(:welcome).versions.earliest - end - - def test_should_find_latest_version - assert_equal page_versions(:welcome_2), pages(:welcome).versions.latest - end - - def test_should_find_previous_version - assert_equal page_versions(:welcome_1), page_versions(:welcome_2).previous - assert_equal page_versions(:welcome_1), pages(:welcome).versions.before(page_versions(:welcome_2)) - end - - def test_should_find_next_version - assert_equal page_versions(:welcome_2), page_versions(:welcome_1).next - assert_equal page_versions(:welcome_2), pages(:welcome).versions.after(page_versions(:welcome_1)) - end - - def test_should_find_version_count - assert_equal 24, pages(:welcome).versions_count - assert_equal 24, page_versions(:welcome_1).versions_count - assert_equal 24, page_versions(:welcome_2).versions_count - end -end \ No newline at end of file diff --git a/vendor/plugins/acts_as_watchable/lib/acts_as_watchable.rb b/vendor/plugins/acts_as_watchable/lib/acts_as_watchable.rb index e026a6dd..61196d9a 100644 --- a/vendor/plugins/acts_as_watchable/lib/acts_as_watchable.rb +++ b/vendor/plugins/acts_as_watchable/lib/acts_as_watchable.rb @@ -58,7 +58,8 @@ module Redmine # Returns an array of watchers' email addresses def watcher_recipients notified = watcher_users.active - + notified.reject! {|user| user.mail_notification == 'none'} + if respond_to?(:visible?) notified.reject! {|user| !visible?(user)} end diff --git a/vendor/plugins/awesome_nested_set/lib/awesome_nested_set.rb b/vendor/plugins/awesome_nested_set/lib/awesome_nested_set.rb index fc5278d6..b1e5ae1e 100644 --- a/vendor/plugins/awesome_nested_set/lib/awesome_nested_set.rb +++ b/vendor/plugins/awesome_nested_set/lib/awesome_nested_set.rb @@ -444,11 +444,12 @@ module CollectiveIdea #:nodoc: # Prunes a branch off of the tree, shifting all of the elements on the right # back to the left so the counts still work. def prune_from_tree - return if right.nil? || left.nil? || !self.class.exists?(id) + return if right.nil? || left.nil? || leaf? || !self.class.exists?(id) delete_method = acts_as_nested_set_options[:dependent] == :destroy ? :destroy_all : :delete_all + # TODO: should destroy children (not descendants) when deleted_method is :destroy_all self.class.base_class.transaction do reload_nested_set nested_set_scope.send(delete_method, @@ -466,6 +467,9 @@ module CollectiveIdea #:nodoc: ["#{quoted_right_column_name} >= ?", right] ) end + + # Reload is needed because children may have updated their parent (self) during deletion. + reload end # reload left, right, and parent diff --git a/vendor/plugins/engines/tasks/engines.rake b/vendor/plugins/engines/lib/tasks/engines.rake similarity index 100% rename from vendor/plugins/engines/tasks/engines.rake rename to vendor/plugins/engines/lib/tasks/engines.rake diff --git a/vendor/plugins/open_id_authentication/tasks/open_id_authentication_tasks.rake b/vendor/plugins/open_id_authentication/lib/tasks/open_id_authentication_tasks.rake similarity index 100% rename from vendor/plugins/open_id_authentication/tasks/open_id_authentication_tasks.rake rename to vendor/plugins/open_id_authentication/lib/tasks/open_id_authentication_tasks.rake diff --git a/vendor/plugins/rfpdf/CHANGELOG b/vendor/plugins/rfpdf/CHANGELOG index 6822b836..5f1081b5 100644 --- a/vendor/plugins/rfpdf/CHANGELOG +++ b/vendor/plugins/rfpdf/CHANGELOG @@ -11,3 +11,4 @@ * Added :filename option in this hash If you're using the same settings for @options_for_rfpdf often, you might want to put your assignment in a before_filter (perhaps overriding :filename, etc in your actions). +1.15 2009-11-20 Rails 2.* support - Thanks to Prawnto plugin for showing the way to the new TemplateHandler \ No newline at end of file diff --git a/vendor/plugins/rfpdf/README b/vendor/plugins/rfpdf/README index 9db19075..8ecfe164 100644 --- a/vendor/plugins/rfpdf/README +++ b/vendor/plugins/rfpdf/README @@ -1,99 +1,45 @@ +FWIW - I am migrating my apps to Prawn and Prawnto + = RFPDF Template Plugin A template plugin allowing the inclusion of ERB-enabled RFPDF template files. -== Example .rb method Usage +== +== +== TCPDF Version (The New or UTF8 Version) +== +== -In the controller, something like: +If you are using HTML, it is recommended you install: - def mypdf - pdf = FPDF.new() +gem install -r htmlentities - # - # Chinese - # - pdf.extend(PDF_Chinese) - pdf.AddPage - pdf.AddBig5Font - pdf.SetFont('Big5','',18) - pdf.Write(5, '²{®É®ð·Å 18 C Àã«× 83 %') - icBig5 = Iconv.new('Big5', 'UTF-8') - pdf.Write(15, icBig5.iconv("宋体 should be working")) - send_data pdf.Output, :filename => "something.pdf", :type => "application/pdf" - end +TCPDF Documentation located at: -== Example .rfdf Usage +http://phpdocs.moodle.org/com-tecnick-tcpdf/TCPDF.html -In the controller, something like: - - def mypdf - @options_for_rfpdf ||= {} - @options_for_rfpdf[:file_name] = "nice_looking.pdf" - end - -In the layout (make sure this is the only item in the layout): -<%= @content_for_layout %> - -In the view (mypdf.rfpdf): +Example of simple use in .rhtml: <% - pdf = FPDF.new() - # - # Chinese - # - pdf.extend(PDF_Chinese) - pdf.AddPage - pdf.AddBig5Font - pdf.SetFont('Big5','',18) - pdf.Write(5, '²{®É®ð·Å 18 C Àã«× 83 %') - icBig5 = Iconv.new('Big5', 'UTF-8') - pdf.Write(15, icBig5.iconv("宋体 should be working")) + @pdf = TCPDF.new() + @pdf.SetMargins(15, 27, 15); + @pdf.AddPage(); + text_options = {:font => "freeserif"} + @pdf.draw_text(15, 10, "text", {:font_size => 12, :font => "freeserif"}) +%><%=@pdf.Output()%> - # - # Japanese - # - pdf.extend(PDF_Japanese) - pdf.AddSJISFont(); - pdf.AddPage(); - pdf.SetFont('SJIS','',18); - pdf.Write(5,'9ÉñåéÇÃåˆäJÉeÉXÉgÇåoǃPHP 3.0ÇÕ1998îN6åéÇ…åˆéÆÇ…ÉäÉäÅ[ÉXÇ≥ÇÍNjǵÇΩÅB'); - icSJIS = Iconv.new('SJIS', 'UTF-8') - pdf.Write(15, icSJIS.iconv("これはテキストである should be working")) +See the following files for sample of useage: - # - # Korean - # - pdf.extend(PDF_Korean) - pdf.AddUHCFont(); - pdf.AddPage(); - pdf.SetFont('UHC','',18); - pdf.Write(5,'PHP 3.0Àº 1998³â 6¿ù¿¡ °ø½ÄÀûÀ¸·Î ¸±¸®ÁîµÇ¾ú´Ù. °ø°³ÀûÀÎ Å×½ºÆ® ÀÌÈľà 9°³¿ù¸¸À̾ú´Ù.'); - icUHC = Iconv.new('UHC', 'UTF-8') - pdf.Write(15, icUHC.iconv("이것은 원본 이다")) +test_unicode.rfpdf +utf8test.txt +logo_example.png - # - # English - # - pdf.AddPage(); - pdf.SetFont('Arial', '', 10) - pdf.Write(5, "should be working") -%> -<%= pdf.Output() %> - - -== Configuring +FPDF users can migrate to TCPDF by changing the following from: -You can configure Rfpdf by using an @options_for_rfpdf hash in your controllers. + pdf = FPDF.new -Here are a few options: +to: -:filename (default: action_name.pdf) - Filename of PDF to generate + pdf = TCPDF.new -Note: If you're using the same settings for @options_for_rfpdf often, you might want to -put your assignment in a before_filter (perhaps overriding :filename, etc in your actions). - -== Problems - -Layouts and partials are currently not supported; just need -to wrap the PDF generation differently. +ENJOY! \ No newline at end of file diff --git a/vendor/plugins/rfpdf/init.rb b/vendor/plugins/rfpdf/init.rb index 339bacfd..196e6490 100644 --- a/vendor/plugins/rfpdf/init.rb +++ b/vendor/plugins/rfpdf/init.rb @@ -1,9 +1,11 @@ +begin + require('htmlentities') +rescue LoadError + # This gem is not required - just nice to have. +end +require('cgi') require 'rfpdf' -begin - ActionView::Template::register_template_handler 'rfpdf', RFPDF::View -rescue NameError - # Rails < 2.1 - RFPDF::View.backward_compatibility_mode = true - ActionView::Base::register_template_handler 'rfpdf', RFPDF::View -end +# Mime::Type.register "application/pdf", :pdf +ActionView::Template::register_template_handler 'rfpdf', RFPDF::TemplateHandlers::Base + diff --git a/vendor/plugins/rfpdf/lib/barcode/barcode.rb b/vendor/plugins/rfpdf/lib/barcode/barcode.rb new file mode 100755 index 00000000..bb579811 --- /dev/null +++ b/vendor/plugins/rfpdf/lib/barcode/barcode.rb @@ -0,0 +1,448 @@ + +#============================================================+ +# File name : barcode.rb +# Begin : 2002-07-31 +# Last Update : 2005-01-02 +# Author : Karim Mribti [barcode@mribti.com] +# Version : 1.1 [0.0.8a (original code)] +# License : GNU LGPL (Lesser General Public License) 2.1 +# http://www.gnu.org/copyleft/lesser.txt +# Source Code : http://www.mribti.com/barcode/ +# +# Description : Generic Barcode Render Class for PHP using +# the GD graphics library. +# +# NOTE: +# This version contains changes by Nicola Asuni: +# - porting to Ruby +# - code style and formatting +# - automatic php documentation in PhpDocumentor Style +# (www.phpdoc.org) +# - minor bug fixing +# - $mCharSet and $mChars variables were added here +#============================================================+ + +# +# Barcode Render Class for PHP using the GD graphics library. +# @author Karim Mribti, Nicola Asuni +# @name BarcodeObject +# @package com.tecnick.tcpdf +# @@version 0.0.8a 2001-04-01 (original code) +# @since 2001-03-25 +# @license http://www.gnu.org/copyleft/lesser.html LGPL +# + +# Styles +# Global + +# +# option: generate barcode border +# +define("BCS_BORDER", 1); + +# +# option: use transparent background +# +define("BCS_TRANSPARENT", 2); + +# +# option: center barcode +# +define("BCS_ALIGN_CENTER", 4); + +# +# option: align left +# +define("BCS_ALIGN_LEFT", 8); + +# +# option: align right +# +define("BCS_ALIGN_RIGHT", 16); + +# +# option: generate JPEG image +# +define("BCS_IMAGE_JPEG", 32); + +# +# option: generate PNG image +# +define("BCS_IMAGE_PNG", 64); + +# +# option: draw text +# +define("BCS_DRAW_TEXT", 128); + +# +# option: stretch text +# +define("BCS_STRETCH_TEXT", 256); + +# +# option: reverse color +# +define("BCS_REVERSE_COLOR", 512); + +# +# option: draw check +# (only for I25 code) +# +define("BCS_I25_DRAW_CHECK", 2048); + +# +# set default background color +# +define("BCD_DEFAULT_BACKGROUND_COLOR", 0xFFFFFF); + +# +# set default foreground color +# +define("BCD_DEFAULT_FOREGROUND_COLOR", 0x000000); + +# +# set default style options +# +define("BCD_DEFAULT_STYLE", BCS_BORDER | BCS_ALIGN_CENTER | BCS_IMAGE_PNG); + +# +# set default width +# +define("BCD_DEFAULT_WIDTH", 460); + +# +# set default height +# +define("BCD_DEFAULT_HEIGHT", 120); + +# +# set default font +# +define("BCD_DEFAULT_FONT", 5); + +# +# st default horizontal resolution +# +define("BCD_DEFAULT_XRES", 2); + +# Margins + +# +# set default margin +# +define("BCD_DEFAULT_MAR_Y1", 0); + +# +# set default margin +# +define("BCD_DEFAULT_MAR_Y2", 0); + +# +# set default text offset +# +define("BCD_DEFAULT_TEXT_OFFSET", 2); + +# For the I25 Only + +# +# narrow bar option +# (only for I25 code) +# +define("BCD_I25_NARROW_BAR", 1); + +# +# wide bar option +# (only for I25 code) +# +define("BCD_I25_WIDE_BAR", 2); + +# For the C39 Only + +# +# narrow bar option +# (only for c39 code) +# +define("BCD_C39_NARROW_BAR", 1); + +# +# wide bar option +# (only for c39 code) +# +define("BCD_C39_WIDE_BAR", 2); + +# For Code 128 + +# +# set type 1 bar +# (only for c128 code) +# +define("BCD_C128_BAR_1", 1); + +# +# set type 2 bar +# (only for c128 code) +# +define("BCD_C128_BAR_2", 2); + +# +# set type 3 bar +# (only for c128 code) +# +define("BCD_C128_BAR_3", 3); + +# +# set type 4 bar +# (only for c128 code) +# +define("BCD_C128_BAR_4", 4); + +# +# Barcode Render Class for PHP using the GD graphics library. +# @author Karim Mribti, Nicola Asuni +# @name BarcodeObject +# @package com.tecnick.tcpdf +# @@version 0.0.8a 2001-04-01 (original code) +# @since 2001-03-25 +# @license http://www.gnu.org/copyleft/lesser.html LGPL +# +class BarcodeObject { + # + # @var Image width in pixels. + # @access protected + # + protected $mWidth; + + # + # @var Image height in pixels. + # @access protected + # + protected $mHeight; + + # + # @var Numeric code for Barcode style. + # @access protected + # + protected $mStyle; + + # + # @var Background color. + # @access protected + # + protected $mBgcolor; + + # + # @var Brush color. + # @access protected + # + protected $mBrush; + + # + # @var Image object. + # @access protected + # + protected $mImg; + + # + # @var Numeric code for character font. + # @access protected + # + protected $mFont; + + # + # @var Error message. + # @access protected + # + protected $mError; + + # + # @var Character Set. + # @access protected + # + protected $mCharSet; + + # + # @var Allowed symbols. + # @access protected + # + protected $mChars; + + # + # Class Constructor. + # @param int $Width Image width in pixels. + # @param int $Height Image height in pixels. + # @param int $Style Barcode style. + # + def __construct($Width=BCD_DEFAULT_WIDTH, $Height=BCD_DEFAULT_HEIGHT, $Style=BCD_DEFAULT_STYLE) + @mWidth = $Width; + @mHeight = $Height; + @mStyle = $Style; + @mFont = BCD_DEFAULT_FONT; + @mImg = ImageCreate(@mWidth, @mHeight); + $dbColor = @mStyle & BCS_REVERSE_COLOR ? BCD_DEFAULT_FOREGROUND_COLOR : BCD_DEFAULT_BACKGROUND_COLOR; + $dfColor = @mStyle & BCS_REVERSE_COLOR ? BCD_DEFAULT_BACKGROUND_COLOR : BCD_DEFAULT_FOREGROUND_COLOR; + @mBgcolor = ImageColorAllocate(@mImg, ($dbColor & 0xFF0000) >> 16, + ($dbColor & 0x00FF00) >> 8, $dbColor & 0x0000FF); + @mBrush = ImageColorAllocate(@mImg, ($dfColor & 0xFF0000) >> 16, + ($dfColor & 0x00FF00) >> 8, $dfColor & 0x0000FF); + if (!(@mStyle & BCS_TRANSPARENT)) + ImageFill(@mImg, @mWidth, @mHeight, @mBgcolor); + end + end + + # + # Class Destructor. + # Destroy image object. + # + def __destructor() + @DestroyObject(); + end + + # + # Returns the image object. + # @return object image. + # @author Nicola Asuni + # @since 1.5.2 + # + def getImage() + return @mImg; + end + + # + # Abstract method used to draw the barcode image. + # @param int $xres Horizontal resolution. + # + def DrawObject($xres) { + # there is not implementation neded, is simply the asbsract function.# + return false; + end + + # + # Draws the barcode border. + # @access protected + # + protected function DrawBorder() + ImageRectangle(@mImg, 0, 0, @mWidth-1, @mHeight-1, @mBrush); + end + + # + # Draws the alphanumeric code. + # @param int $Font Font type. + # @param int $xPos Horiziontal position. + # @param int $yPos Vertical position. + # @param int $Char Alphanumeric code to write. + # @access protected + # + protected function DrawChar($Font, $xPos, $yPos, $Char) + ImageString(@mImg,$Font,$xPos,$yPos,$Char,@mBrush); + end + + # + # Draws a character string. + # @param int $Font Font type. + # @param int $xPos Horiziontal position. + # @param int $yPos Vertical position. + # @param int $Char string to write. + # @access protected + # + protected function DrawText($Font, $xPos, $yPos, $Char) + ImageString(@mImg,$Font,$xPos,$yPos,$Char,@mBrush); + end + + # + # Draws a single barcode bar. + # @param int $xPos Horiziontal position. + # @param int $yPos Vertical position. + # @param int $xSize Horizontal size. + # @param int $xSize Vertical size. + # @return bool trur in case of success, false otherwise. + # @access protected + # + protected function DrawSingleBar($xPos, $yPos, $xSize, $ySize) + if ($xPos>=0 && $xPos<=@mWidth && ($xPos+$xSize)<=@mWidth && + $yPos>=0 && $yPos<=@mHeight && ($yPos+$ySize)<=@mHeight) + for ($i=0;$i<$xSize;$i++) + ImageLine(@mImg, $xPos+$i, $yPos, $xPos+$i, $yPos+$ySize, @mBrush); + end + return true; + end + return false; + end + + # + # Returns the current error message. + # @return string error message. + # + def GetError() + return @mError; + end + + # + # Returns the font height. + # @param int $font font type. + # @return int font height. + # + def GetFontHeight($font) + return ImageFontHeight($font); + end + + # + # Returns the font width. + # @param int $font font type. + # @return int font width. + # + def GetFontWidth($font) + return ImageFontWidth($font); + end + + # + # Set font type. + # @param int $font font type. + # + def SetFont($font) + @mFont = $font; + end + + # + # Returns barcode style. + # @return int barcode style. + # + def GetStyle() + return @mStyle; + end + + # + # Set barcode style. + # @param int $Style barcode style. + # + def SetStyle ($Style) + @mStyle = $Style; + end + + # + # Flush the barcode image. + # + def FlushObject() + if ((@mStyle & BCS_BORDER)) + @DrawBorder(); + end + if (@mStyle & BCS_IMAGE_PNG) + Header("Content-Type: image/png"); + ImagePng(@mImg); + elsif (@mStyle & BCS_IMAGE_JPEG) + Header("Content-Type: image/jpeg"); + ImageJpeg(@mImg); + end + end + + # + # Destroy the barcode image. + # + def DestroyObject() + ImageDestroy(@mImg); + end +} + +#============================================================+ +# END OF FILE +#============================================================+ diff --git a/vendor/plugins/rfpdf/lib/barcode/c128aobject.rb b/vendor/plugins/rfpdf/lib/barcode/c128aobject.rb new file mode 100755 index 00000000..c9543759 --- /dev/null +++ b/vendor/plugins/rfpdf/lib/barcode/c128aobject.rb @@ -0,0 +1,393 @@ + +#============================================================+ +# File name : c128aobject.rb +# Begin : 2002-07-31 +# Last Update : 2004-12-29 +# Author : Karim Mribti [barcode@mribti.com] +# Version : 0.0.8a 2001-04-01 (original code) +# License : GNU LGPL (Lesser General Public License) 2.1 +# http://www.gnu.org/copyleft/lesser.txt +# Source Code : http://www.mribti.com/barcode/ +# +# Description : Code 128-A Barcode Render Class for PHP using +# the GD graphics library. +# Code 128-A is a continuous, multilevel and +# include all upper case alphanumeric characters +# and ASCII control characters. +# +# NOTE: +# This version contains changes by Nicola Asuni: +# - porting to Ruby +# - code style and formatting +# - automatic php documentation in PhpDocumentor Style +# (www.phpdoc.org) +# - minor bug fixing +#============================================================+ + +# +# Code 128-A Barcode Render Class for PHP using the GD graphics library.
    +# Code 128-A is a continuous, multilevel and include all upper case alphanumeric characters and ASCII control characters. +# @author Karim Mribti, Nicola Asuni +# @name BarcodeObject +# @package com.tecnick.tcpdf +# @@version 0.0.8a 2001-04-01 (original code) +# @since 2001-03-25 +# @license http://www.gnu.org/copyleft/lesser.html LGPL +# + +# +# Code 128-A Barcode Render Class for PHP using the GD graphics library.
    +# Code 128-A is a continuous, multilevel and include all upper case alphanumeric characters and ASCII control characters. +# @author Karim Mribti, Nicola Asuni +# @name BarcodeObject +# @package com.tecnick.tcpdf +# @@version 0.0.8a 2001-04-01 (original code) +# @since 2001-03-25 +# @license http://www.gnu.org/copyleft/lesser.html LGPL +# +class C128AObject extends BarcodeObject { + + # + # Class Constructor. + # @param int $Width Image width in pixels. + # @param int $Height Image height in pixels. + # @param int $Style Barcode style. + # @param int $Value value to print on barcode. + # + def __construct($Width, $Height, $Style, $Value) + parent::__construct($Width, $Height, $Style); + @mValue = $Value; + @mChars = " !\"#$%&'()*+�-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_"; + @mCharSet = array ( + "212222", # 00# + "222122", # 01# + "222221", # 02# + "121223", # 03# + "121322", # 04# + "131222", # 05# + "122213", # 06# + "122312", # 07# + "132212", # 08# + "221213", # 09# + "221312", # 10# + "231212", # 11# + "112232", # 12# + "122132", # 13# + "122231", # 14# + "113222", # 15# + "123122", # 16# + "123221", # 17# + "223211", # 18# + "221132", # 19# + "221231", # 20# + "213212", # 21# + "223112", # 22# + "312131", # 23# + "311222", # 24# + "321122", # 25# + "321221", # 26# + "312212", # 27# + "322112", # 28# + "322211", # 29# + "212123", # 30# + "212321", # 31# + "232121", # 32# + "111323", # 33# + "131123", # 34# + "131321", # 35# + "112313", # 36# + "132113", # 37# + "132311", # 38# + "211313", # 39# + "231113", # 40# + "231311", # 41# + "112133", # 42# + "112331", # 43# + "132131", # 44# + "113123", # 45# + "113321", # 46# + "133121", # 47# + "313121", # 48# + "211331", # 49# + "231131", # 50# + "213113", # 51# + "213311", # 52# + "213131", # 53# + "311123", # 54# + "311321", # 55# + "331121", # 56# + "312113", # 57# + "312311", # 58# + "332111", # 59# + "314111", # 60# + "221411", # 61# + "431111", # 62# + "111224", # 63# + "111422", # 64# + "121124", # 65# + "121421", # 66# + "141122", # 67# + "141221", # 68# + "112214", # 69# + "112412", # 70# + "122114", # 71# + "122411", # 72# + "142112", # 73# + "142211", # 74# + "241211", # 75# + "221114", # 76# + "413111", # 77# + "241112", # 78# + "134111", # 79# + "111242", # 80# + "121142", # 81# + "121241", # 82# + "114212", # 83# + "124112", # 84# + "124211", # 85# + "411212", # 86# + "421112", # 87# + "421211", # 88# + "212141", # 89# + "214121", # 90# + "412121", # 91# + "111143", # 92# + "111341", # 93# + "131141", # 94# + "114113", # 95# + "114311", # 96# + "411113", # 97# + "411311", # 98# + "113141", # 99# + "114131", # 100# + "311141", # 101# + "411131" # 102# + ); + end + + # + # Returns the character index. + # @param char $char character. + # @return int character index or -1 in case of error. + # @access private + # + def GetCharIndex($char) + for ($i=0;$i<64;$i++) + if (@mChars[$i] == $char) + return $i; + end + end + return -1; + end + + # + # Returns the bar size. + # @param int $xres Horizontal resolution. + # @param char $char Character. + # @return int barcode size. + # @access private + # + def GetBarSize($xres, $char) + switch ($char) + case '1' + $cVal = BCD_C128_BAR_1; + + case '2' + $cVal = BCD_C128_BAR_2; + + case '3' + $cVal = BCD_C128_BAR_3; + + case '4' + $cVal = BCD_C128_BAR_4; + + default + $cVal = 0; + end + end + return $cVal# $xres; + end + + # + # Returns barcode size. + # @param int $xres Horizontal resolution. + # @return barcode size. + # @access private + # + def GetSize($xres) + $len = @mValue.length; + + if ($len == 0) { + @mError = "Null value"; + return false; + end + $ret = 0; + for ($i=0;$i<$len;$i++) + if (($id = GetCharIndex(@mValue[$i])) == -1) + @mError = "C128A not include the char '".@mValue[$i]."'"; + return false; + else + $cset = @mCharSet[$id]; + $ret += GetBarSize($xres, $cset[0]); + $ret += GetBarSize($xres, $cset[1]); + $ret += GetBarSize($xres, $cset[2]); + $ret += GetBarSize($xres, $cset[3]); + $ret += GetBarSize($xres, $cset[4]); + $ret += GetBarSize($xres, $cset[5]); + end + end + + # length of Check character# + $cset = GetCheckCharValue(); + $CheckSize = 0; + for ($i=0;$i<6;$i++) + $CheckSize += GetBarSize($cset[$i], $xres); + end + $StartSize = 2*BCD_C128_BAR_2*$xres + 3*BCD_C128_BAR_1*$xres + BCD_C128_BAR_4*$xres; + $StopSize = 2*BCD_C128_BAR_2*$xres + 3*BCD_C128_BAR_1*$xres + 2*BCD_C128_BAR_3*$xres; + return $StartSize + $ret + $CheckSize + $StopSize; + end + + # + # Returns the check-char value. + # @return string. + # @access private + # + def GetCheckCharValue() + $len = @mValue.length; + $sum = 103; # 'A' type; + for ($i=0;$i<$len;$i++) + $sum += GetCharIndex(@mValue[$i])# ($i+1); + end + $check = $sum % 103; + return @mCharSet[$check]; + end + + # + # Draws the start code. + # @param int $DrawPos Drawing position. + # @param int $yPos Vertical position. + # @param int $ySize Vertical size. + # @param int $xres Horizontal resolution. + # @return int drawing position. + # @access private + # + def DrawStart($DrawPos, $yPos, $ySize, $xres) + # Start code is '211412'# + @DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, GetBarSize('2', $xres) , $ySize); + $DrawPos += GetBarSize('2', $xres); + $DrawPos += GetBarSize('1', $xres); + @DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, GetBarSize('1', $xres) , $ySize); + $DrawPos += GetBarSize('1', $xres); + $DrawPos += GetBarSize('4', $xres); + @DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, GetBarSize('1', $xres) , $ySize); + $DrawPos += GetBarSize('1', $xres); + $DrawPos += GetBarSize('2', $xres); + return $DrawPos; + end + + # + # Draws the stop code. + # @param int $DrawPos Drawing position. + # @param int $yPos Vertical position. + # @param int $ySize Vertical size. + # @param int $xres Horizontal resolution. + # @return int drawing position. + # @access private + # + def DrawStop($DrawPos, $yPos, $ySize, $xres) + # Stop code is '2331112'# + @DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, GetBarSize('2', $xres) , $ySize); + $DrawPos += GetBarSize('2', $xres); + $DrawPos += GetBarSize('3', $xres); + @DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, GetBarSize('3', $xres) , $ySize); + $DrawPos += GetBarSize('3', $xres); + $DrawPos += GetBarSize('1', $xres); + @DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, GetBarSize('1', $xres) , $ySize); + $DrawPos += GetBarSize('1', $xres); + $DrawPos += GetBarSize('1', $xres); + @DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, GetBarSize('2', $xres) , $ySize); + $DrawPos += GetBarSize('2', $xres); + return $DrawPos; + end + + # + # Draws the check-char code. + # @param int $DrawPos Drawing position. + # @param int $yPos Vertical position. + # @param int $ySize Vertical size. + # @param int $xres Horizontal resolution. + # @return int drawing position. + # @access private + # + def DrawCheckChar($DrawPos, $yPos, $ySize, $xres) + $cset = GetCheckCharValue(); + @DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, GetBarSize($cset[0], $xres) , $ySize); + $DrawPos += GetBarSize($cset[0], $xres); + $DrawPos += GetBarSize($cset[1], $xres); + @DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, GetBarSize($cset[2], $xres) , $ySize); + $DrawPos += GetBarSize($cset[2], $xres); + $DrawPos += GetBarSize($cset[3], $xres); + @DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, GetBarSize($cset[4], $xres) , $ySize); + $DrawPos += GetBarSize($cset[4], $xres); + $DrawPos += GetBarSize($cset[5], $xres); + return $DrawPos; + end + + # + # Draws the barcode object. + # @param int $xres Horizontal resolution. + # @return bool true in case of success. + # + def DrawObject($xres) + $len = @mValue.length; + if (($size = GetSize($xres))==0) + return false; + end + + if (@mStyle & BCS_ALIGN_CENTER) $sPos = (integer)((@mWidth - $size ) / 2); + elsif (@mStyle & BCS_ALIGN_RIGHT) $sPos = @mWidth - $size; + else $sPos = 0; + + # Total height of bar code -Bars only-# + if (@mStyle & BCS_DRAW_TEXT) $ysize = @mHeight - BCD_DEFAULT_MAR_Y1 - BCD_DEFAULT_MAR_Y2 - GetFontHeight(@mFont); + else $ysize = @mHeight - BCD_DEFAULT_MAR_Y1 - BCD_DEFAULT_MAR_Y2; + + # Draw text# + if (@mStyle & BCS_DRAW_TEXT) + if (@mStyle & BCS_STRETCH_TEXT) + for ($i=0;$i<$len;$i++) + @DrawChar(@mFont, $sPos+(2*BCD_C128_BAR_2*$xres + 3*BCD_C128_BAR_1*$xres + BCD_C128_BAR_4*$xres)+($size/$len)*$i, + $ysize + BCD_DEFAULT_MAR_Y1 + BCD_DEFAULT_TEXT_OFFSET, @mValue[$i]); + else# Center# + $text_width = GetFontWidth(@mFont)# @mValue.length; + @DrawText(@mFont, $sPos+(($size-$text_width)/2)+(2*BCD_C128_BAR_2*$xres + 3*BCD_C128_BAR_1*$xres + BCD_C128_BAR_4*$xres), + $ysize + BCD_DEFAULT_MAR_Y1 + BCD_DEFAULT_TEXT_OFFSET, @mValue); + end + end + + $cPos = 0; + $DrawPos = @DrawStart($sPos, BCD_DEFAULT_MAR_Y1 , $ysize, $xres); + do { + $c = GetCharIndex(@mValue[$cPos]); + $cset = @mCharSet[$c]; + @DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, GetBarSize($cset[0], $xres) , $ysize); + $DrawPos += GetBarSize($cset[0], $xres); + $DrawPos += GetBarSize($cset[1], $xres); + @DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, GetBarSize($cset[2], $xres) , $ysize); + $DrawPos += GetBarSize($cset[2], $xres); + $DrawPos += GetBarSize($cset[3], $xres); + @DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, GetBarSize($cset[4], $xres) , $ysize); + $DrawPos += GetBarSize($cset[4], $xres); + $DrawPos += GetBarSize($cset[5], $xres); + $cPos += 1; + end while ($cPos<$len); + $DrawPos = @DrawCheckChar($DrawPos, BCD_DEFAULT_MAR_Y1 , $ysize, $xres); + $DrawPos = @DrawStop($DrawPos, BCD_DEFAULT_MAR_Y1 , $ysize, $xres); + return true; + end +} + +#============================================================+ +# END OF FILE +#============================================================+ diff --git a/vendor/plugins/rfpdf/lib/barcode/c128bobject.rb b/vendor/plugins/rfpdf/lib/barcode/c128bobject.rb new file mode 100755 index 00000000..49063975 --- /dev/null +++ b/vendor/plugins/rfpdf/lib/barcode/c128bobject.rb @@ -0,0 +1,393 @@ + +#============================================================+ +# File name : c128bobject.rb +# Begin : 2002-07-31 +# Last Update : 2004-12-29 +# Author : Karim Mribti [barcode@mribti.com] +# Version : 0.0.8a 2001-04-01 (original code) +# License : GNU LGPL (Lesser General Public License) 2.1 +# http://www.gnu.org/copyleft/lesser.txt +# Source Code : http://www.mribti.com/barcode/ +# +# Description : Code 128-B Barcode Render Class for PHP using +# the GD graphics library. +# Code 128-B is a continuous, multilevel and full +# ASCII code. +# +# NOTE: +# This version contains changes by Nicola Asuni: +# - porting to Ruby +# - code style and formatting +# - automatic php documentation in PhpDocumentor Style +# (www.phpdoc.org) +# - minor bug fixing +#============================================================+ + +# +# Code 128-B Barcode Render Class for PHP using the GD graphics library.
    +# Code 128-B is a continuous, multilevel and full ASCII code. +# @author Karim Mribti, Nicola Asuni +# @name BarcodeObject +# @package com.tecnick.tcpdf +# @@version 0.0.8a 2001-04-01 (original code) +# @since 2001-03-25 +# @license http://www.gnu.org/copyleft/lesser.html LGPL +# + +# +# Code 128-B Barcode Render Class for PHP using the GD graphics library.
    +# Code 128-B is a continuous, multilevel and full ASCII code. +# @author Karim Mribti, Nicola Asuni +# @name BarcodeObject +# @package com.tecnick.tcpdf +# @@version 0.0.8a 2001-04-01 (original code) +# @since 2001-03-25 +# @license http://www.gnu.org/copyleft/lesser.html LGPL +# +class C128BObject extends BarcodeObject { + + # + # Class Constructor. + # @param int $Width Image width in pixels. + # @param int $Height Image height in pixels. + # @param int $Style Barcode style. + # @param int $Value value to print on barcode. + # + def __construct($Width, $Height, $Style, $Value) + parent::__construct($Width, $Height, $Style); + @mValue = $Value; + @mChars = " !\"#$%&'()*+�-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{ }~"; + @mCharSet = array ( + "212222", # 00# + "222122", # 01# + "222221", # 02# + "121223", # 03# + "121322", # 04# + "131222", # 05# + "122213", # 06# + "122312", # 07# + "132212", # 08# + "221213", # 09# + "221312", # 10# + "231212", # 11# + "112232", # 12# + "122132", # 13# + "122231", # 14# + "113222", # 15# + "123122", # 16# + "123221", # 17# + "223211", # 18# + "221132", # 19# + "221231", # 20# + "213212", # 21# + "223112", # 22# + "312131", # 23# + "311222", # 24# + "321122", # 25# + "321221", # 26# + "312212", # 27# + "322112", # 28# + "322211", # 29# + "212123", # 30# + "212321", # 31# + "232121", # 32# + "111323", # 33# + "131123", # 34# + "131321", # 35# + "112313", # 36# + "132113", # 37# + "132311", # 38# + "211313", # 39# + "231113", # 40# + "231311", # 41# + "112133", # 42# + "112331", # 43# + "132131", # 44# + "113123", # 45# + "113321", # 46# + "133121", # 47# + "313121", # 48# + "211331", # 49# + "231131", # 50# + "213113", # 51# + "213311", # 52# + "213131", # 53# + "311123", # 54# + "311321", # 55# + "331121", # 56# + "312113", # 57# + "312311", # 58# + "332111", # 59# + "314111", # 60# + "221411", # 61# + "431111", # 62# + "111224", # 63# + "111422", # 64# + "121124", # 65# + "121421", # 66# + "141122", # 67# + "141221", # 68# + "112214", # 69# + "112412", # 70# + "122114", # 71# + "122411", # 72# + "142112", # 73# + "142211", # 74# + "241211", # 75# + "221114", # 76# + "413111", # 77# + "241112", # 78# + "134111", # 79# + "111242", # 80# + "121142", # 81# + "121241", # 82# + "114212", # 83# + "124112", # 84# + "124211", # 85# + "411212", # 86# + "421112", # 87# + "421211", # 88# + "212141", # 89# + "214121", # 90# + "412121", # 91# + "111143", # 92# + "111341", # 93# + "131141", # 94# + "114113", # 95# + "114311", # 96# + "411113", # 97# + "411311", # 98# + "113141", # 99# + "114131", # 100# + "311141", # 101# + "411131" # 102# + ); + end + + # + # Returns the character index. + # @param char $char character. + # @return int character index or -1 in case of error. + # @access private + # + def GetCharIndex($char) + for ($i=0;$i<95;$i++) + if (@mChars[$i] == $char) + return $i; + end + end + return -1; + end + + # + # Returns the bar size. + # @param int $xres Horizontal resolution. + # @param char $char Character. + # @return int barcode size. + # @access private + # + def GetBarSize($xres, $char) + switch ($char) + case '1' + $cVal = BCD_C128_BAR_1; + + case '2' + $cVal = BCD_C128_BAR_2; + + case '3' + $cVal = BCD_C128_BAR_3; + + case '4' + $cVal = BCD_C128_BAR_4; + + default + $cVal = 0; + end + end + return $cVal# $xres; + end + + # + # Returns barcode size. + # @param int $xres Horizontal resolution. + # @return barcode size. + # @access private + # + def GetSize($xres) + $len = @mValue.length; + + if ($len == 0) { + @mError = "Null value"; + return false; + end + $ret = 0; + for ($i=0;$i<$len;$i++) + if (($id = GetCharIndex(@mValue[$i])) == -1) + @mError = "C128B not include the char '".@mValue[$i]."'"; + return false; + else + $cset = @mCharSet[$id]; + $ret += GetBarSize($xres, $cset[0]); + $ret += GetBarSize($xres, $cset[1]); + $ret += GetBarSize($xres, $cset[2]); + $ret += GetBarSize($xres, $cset[3]); + $ret += GetBarSize($xres, $cset[4]); + $ret += GetBarSize($xres, $cset[5]); + end + end + # length of Check character# + $cset = GetCheckCharValue(); + $CheckSize = 0; + for ($i=0;$i<6;$i++) + $CheckSize += GetBarSize($cset[$i], $xres); + end + + $StartSize = 2*BCD_C128_BAR_2*$xres + 3*BCD_C128_BAR_1*$xres + BCD_C128_BAR_4*$xres; + $StopSize = 2*BCD_C128_BAR_2*$xres + 3*BCD_C128_BAR_1*$xres + 2*BCD_C128_BAR_3*$xres; + + return $StartSize + $ret + $CheckSize + $StopSize; + end + + # + # Returns the check-char value. + # @return string. + # @access private + # + def GetCheckCharValue() + $len = @mValue.length; + $sum = 104; # 'B' type; + for ($i=0;$i<$len;$i++) + $sum += GetCharIndex(@mValue[$i])# ($i+1); + end + $check = $sum % 103; + return @mCharSet[$check]; + end + + # + # Draws the start code. + # @param int $DrawPos Drawing position. + # @param int $yPos Vertical position. + # @param int $ySize Vertical size. + # @param int $xres Horizontal resolution. + # @return int drawing position. + # @access private + # + def DrawStart($DrawPos, $yPos, $ySize, $xres) + # Start code is '211214'# + @DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, GetBarSize('2', $xres), $ySize); + $DrawPos += GetBarSize('2', $xres); + $DrawPos += GetBarSize('1', $xres); + @DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, GetBarSize('1', $xres), $ySize); + $DrawPos += GetBarSize('1', $xres); + $DrawPos += GetBarSize('2', $xres); + @DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, GetBarSize('1', $xres), $ySize); + $DrawPos += GetBarSize('1', $xres); + $DrawPos += GetBarSize('4', $xres); + return $DrawPos; + end + + # + # Draws the stop code. + # @param int $DrawPos Drawing position. + # @param int $yPos Vertical position. + # @param int $ySize Vertical size. + # @param int $xres Horizontal resolution. + # @return int drawing position. + # @access private + # + def DrawStop($DrawPos, $yPos, $ySize, $xres) + # Stop code is '2331112'# + @DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, GetBarSize('2', $xres) , $ySize); + $DrawPos += GetBarSize('2', $xres); + $DrawPos += GetBarSize('3', $xres); + @DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, GetBarSize('3', $xres) , $ySize); + $DrawPos += GetBarSize('3', $xres); + $DrawPos += GetBarSize('1', $xres); + @DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, GetBarSize('1', $xres) , $ySize); + $DrawPos += GetBarSize('1', $xres); + $DrawPos += GetBarSize('1', $xres); + @DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, GetBarSize('2', $xres) , $ySize); + $DrawPos += GetBarSize('2', $xres); + return $DrawPos; + end + + # + # Draws the check-char code. + # @param int $DrawPos Drawing position. + # @param int $yPos Vertical position. + # @param int $ySize Vertical size. + # @param int $xres Horizontal resolution. + # @return int drawing position. + # @access private + # + def DrawCheckChar($DrawPos, $yPos, $ySize, $xres) + $cset = GetCheckCharValue(); + @DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, GetBarSize($cset[0], $xres) , $ySize); + $DrawPos += GetBarSize($cset[0], $xres); + $DrawPos += GetBarSize($cset[1], $xres); + @DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, GetBarSize($cset[2], $xres) , $ySize); + $DrawPos += GetBarSize($cset[2], $xres); + $DrawPos += GetBarSize($cset[3], $xres); + @DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, GetBarSize($cset[4], $xres) , $ySize); + $DrawPos += GetBarSize($cset[4], $xres); + $DrawPos += GetBarSize($cset[5], $xres); + return $DrawPos; + end + + # + # Draws the barcode object. + # @param int $xres Horizontal resolution. + # @return bool true in case of success. + # + def DrawObject($xres) + $len = @mValue.length; + if (($size = GetSize($xres))==0) + return false; + end + + if (@mStyle & BCS_ALIGN_CENTER) $sPos = (integer)((@mWidth - $size ) / 2); + elsif (@mStyle & BCS_ALIGN_RIGHT) $sPos = @mWidth - $size; + else $sPos = 0; + + # Total height of bar code -Bars only-# + if (@mStyle & BCS_DRAW_TEXT) $ysize = @mHeight - BCD_DEFAULT_MAR_Y1 - BCD_DEFAULT_MAR_Y2 - GetFontHeight(@mFont); + else $ysize = @mHeight - BCD_DEFAULT_MAR_Y1 - BCD_DEFAULT_MAR_Y2; + + # Draw text# + if (@mStyle & BCS_DRAW_TEXT) + if (@mStyle & BCS_STRETCH_TEXT) + for ($i=0;$i<$len;$i++) + @DrawChar(@mFont, $sPos+(2*BCD_C128_BAR_2*$xres + 3*BCD_C128_BAR_1*$xres + BCD_C128_BAR_4*$xres)+($size/$len)*$i, + $ysize + BCD_DEFAULT_MAR_Y1 + BCD_DEFAULT_TEXT_OFFSET, @mValue[$i]); + else# Center# + $text_width = GetFontWidth(@mFont)# @mValue.length; + @DrawText(@mFont, $sPos+(($size-$text_width)/2)+(2*BCD_C128_BAR_2*$xres + 3*BCD_C128_BAR_1*$xres + BCD_C128_BAR_4*$xres), + $ysize + BCD_DEFAULT_MAR_Y1 + BCD_DEFAULT_TEXT_OFFSET, @mValue); + end + end + + $cPos = 0; + $DrawPos = @DrawStart($sPos, BCD_DEFAULT_MAR_Y1 , $ysize, $xres); + do { + $c = GetCharIndex(@mValue[$cPos]); + $cset = @mCharSet[$c]; + @DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, GetBarSize($cset[0], $xres) , $ysize); + $DrawPos += GetBarSize($cset[0], $xres); + $DrawPos += GetBarSize($cset[1], $xres); + @DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, GetBarSize($cset[2], $xres) , $ysize); + $DrawPos += GetBarSize($cset[2], $xres); + $DrawPos += GetBarSize($cset[3], $xres); + @DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, GetBarSize($cset[4], $xres) , $ysize); + $DrawPos += GetBarSize($cset[4], $xres); + $DrawPos += GetBarSize($cset[5], $xres); + $cPos += 1; + end while ($cPos<$len); + $DrawPos = @DrawCheckChar($DrawPos, BCD_DEFAULT_MAR_Y1 , $ysize, $xres); + $DrawPos = @DrawStop($DrawPos, BCD_DEFAULT_MAR_Y1 , $ysize, $xres); + return true; + end +} + +#============================================================+ +# END OF FILE +#============================================================+ diff --git a/vendor/plugins/rfpdf/lib/barcode/c128cobject.rb b/vendor/plugins/rfpdf/lib/barcode/c128cobject.rb new file mode 100755 index 00000000..90766f38 --- /dev/null +++ b/vendor/plugins/rfpdf/lib/barcode/c128cobject.rb @@ -0,0 +1,414 @@ + +#============================================================+ +# File name : c128cobject.rb +# Begin : 2002-07-31 +# Last Update : 2004-12-29 +# Author : Karim Mribti [barcode@mribti.com] +# : Sam Michaels [swampgas@swampgas.org] +# : Nicola Asuni [info@tecnick.com] +# Version : 0.0.8a 2001-04-01 (original code) +# License : GNU LGPL (Lesser General Public License) 2.1 +# http://www.gnu.org/copyleft/lesser.txt +# Source Code : http://www.mribti.com/barcode/ +# +# Description : Code 128-C Barcode Render Class for PHP using +# the GD graphics library. +# Code 128-C is numeric only and provides the +# most efficiency. +# +# NOTE: +# This version contains changes by Nicola Asuni: +# - porting to Ruby +# - code style and formatting +# - automatic php documentation in PhpDocumentor Style +# (www.phpdoc.org) +# - minor bug fixing +#============================================================+ + +# +# Code 128-C Barcode Render Class for PHP using the GD graphics library.
    +# Code 128-C is numeric only and provides the most efficiency. +# @author Karim Mribti, Nicola Asuni +# @name BarcodeObject +# @package com.tecnick.tcpdf +# @@version 0.0.8a 2001-04-01 (original code) +# @since 2001-03-25 +# @license http://www.gnu.org/copyleft/lesser.html LGPL +# + +# +# Code 128-C Barcode Render Class for PHP using the GD graphics library.
    +# Code 128-C is numeric only and provides the most efficiency. +# @author Karim Mribti, Nicola Asuni +# @name BarcodeObject +# @package com.tecnick.tcpdf +# @@version 0.0.8a 2001-04-01 (original code) +# @since 2001-03-25 +# @license http://www.gnu.org/copyleft/lesser.html LGPL +# +class C128CObject extends BarcodeObject { + + # + # Class Constructor. + # @param int $Width Image width in pixels. + # @param int $Height Image height in pixels. + # @param int $Style Barcode style. + # @param int $Value value to print on barcode. + # + def __construct($Width, $Height, $Style, $Value) + parent::__construct($Width, $Height, $Style); + @mValue = $Value; + @mChars = array ( + "00", "01", "02", "03", "04", "05", "06", "07", "08", "09", + "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", + "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", + "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", + "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", + "50", "51", "52", "53", "54", "55", "56", "57", "58", "59", + "60", "61", "62", "63", "64", "65", "66", "67", "68", "69", + "70", "71", "72", "73", "74", "75", "76", "77", "78", "79", + "80", "81", "82", "83", "84", "85", "86", "87", "88", "89", + "90", "91", "92", "93", "94", "95", "96", "97", "98", "99", + ); + @mCharSet = array ( + "212222", # 00# + "222122", # 01# + "222221", # 02# + "121223", # 03# + "121322", # 04# + "131222", # 05# + "122213", # 06# + "122312", # 07# + "132212", # 08# + "221213", # 09# + "221312", # 10# + "231212", # 11# + "112232", # 12# + "122132", # 13# + "122231", # 14# + "113222", # 15# + "123122", # 16# + "123221", # 17# + "223211", # 18# + "221132", # 19# + "221231", # 20# + "213212", # 21# + "223112", # 22# + "312131", # 23# + "311222", # 24# + "321122", # 25# + "321221", # 26# + "312212", # 27# + "322112", # 28# + "322211", # 29# + "212123", # 30# + "212321", # 31# + "232121", # 32# + "111323", # 33# + "131123", # 34# + "131321", # 35# + "112313", # 36# + "132113", # 37# + "132311", # 38# + "211313", # 39# + "231113", # 40# + "231311", # 41# + "112133", # 42# + "112331", # 43# + "132131", # 44# + "113123", # 45# + "113321", # 46# + "133121", # 47# + "313121", # 48# + "211331", # 49# + "231131", # 50# + "213113", # 51# + "213311", # 52# + "213131", # 53# + "311123", # 54# + "311321", # 55# + "331121", # 56# + "312113", # 57# + "312311", # 58# + "332111", # 59# + "314111", # 60# + "221411", # 61# + "431111", # 62# + "111224", # 63# + "111422", # 64# + "121124", # 65# + "121421", # 66# + "141122", # 67# + "141221", # 68# + "112214", # 69# + "112412", # 70# + "122114", # 71# + "122411", # 72# + "142112", # 73# + "142211", # 74# + "241211", # 75# + "221114", # 76# + "413111", # 77# + "241112", # 78# + "134111", # 79# + "111242", # 80# + "121142", # 81# + "121241", # 82# + "114212", # 83# + "124112", # 84# + "124211", # 85# + "411212", # 86# + "421112", # 87# + "421211", # 88# + "212141", # 89# + "214121", # 90# + "412121", # 91# + "111143", # 92# + "111341", # 93# + "131141", # 94# + "114113", # 95# + "114311", # 96# + "411113", # 97# + "411311", # 98# + "113141", # 99# + ); + end + + # + # Returns the character index. + # @param char $char character. + # @return int character index or -1 in case of error. + # @access private + # + def GetCharIndex($char) + for ($i=0;$i<100;$i++) + if (@mChars[$i] == $char) + return $i; + end + end + return -1; + end + + # + # Returns the bar size. + # @param int $xres Horizontal resolution. + # @param char $char Character. + # @return int barcode size. + # @access private + # + def GetBarSize($xres, $char) + switch ($char) + case '1' + $cVal = BCD_C128_BAR_1; + + case '2' + $cVal = BCD_C128_BAR_2; + + case '3' + $cVal = BCD_C128_BAR_3; + + case '4' + $cVal = BCD_C128_BAR_4; + + default + $cVal = 0; + end + end + return $cVal# $xres; + end + + # + # Returns barcode size. + # @param int $xres Horizontal resolution. + # @return barcode size. + # @access private + # + def GetSize($xres) + $len = @mValue.length; + + if ($len == 0) { + @mError = "Null value"; + return false; + end + $ret = 0; + + for ($i=0;$i<$len;$i++) + if ((@mValue[$i][0] < 48) || (@mValue[$i][0] > 57)) + @mError = "Code-128C is numeric only"; + return false; + end + end + + if (($len%2) != 0) + @mError = "The length of barcode value must be even. You must pad the number with zeros."; + return false; + end + + for ($i=0;$i<$len;$i+=2) + $id = GetCharIndex(@mValue[$i].@mValue[$i+1]); + $cset = @mCharSet[$id]; + $ret += GetBarSize($xres, $cset[0]); + $ret += GetBarSize($xres, $cset[1]); + $ret += GetBarSize($xres, $cset[2]); + $ret += GetBarSize($xres, $cset[3]); + $ret += GetBarSize($xres, $cset[4]); + $ret += GetBarSize($xres, $cset[5]); + end + # length of Check character# + $cset = GetCheckCharValue(); + $CheckSize = 0; + for ($i=0;$i<6;$i++) + $CheckSize += GetBarSize($cset[$i], $xres); + end + + $StartSize = 2*BCD_C128_BAR_2*$xres + 3*BCD_C128_BAR_1*$xres + BCD_C128_BAR_4*$xres; + $StopSize = 2*BCD_C128_BAR_2*$xres + 3*BCD_C128_BAR_1*$xres + 2*BCD_C128_BAR_3*$xres; + return $StartSize + $ret + $CheckSize + $StopSize; + end + + # + # Returns the check-char value. + # @return string. + # @access private + # + def GetCheckCharValue() + $len = @mValue.length; + $sum = 105; # 'C' type; + $m = 0; + for ($i=0;$i<$len;$i+=2) + $m += 1; + $sum += GetCharIndex(@mValue[$i].@mValue[$i+1])# $m; + end + $check = $sum % 103; + return @mCharSet[$check]; + end + + # + # Draws the start code. + # @param int $DrawPos Drawing position. + # @param int $yPos Vertical position. + # @param int $ySize Vertical size. + # @param int $xres Horizontal resolution. + # @return int drawing position. + # @access private + # + def DrawStart($DrawPos, $yPos, $ySize, $xres) + # Start code is '211232'# + @DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, GetBarSize('2', $xres) , $ySize); + $DrawPos += GetBarSize('2', $xres); + $DrawPos += GetBarSize('1', $xres); + @DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, GetBarSize('1', $xres) , $ySize); + $DrawPos += GetBarSize('1', $xres); + $DrawPos += GetBarSize('2', $xres); + @DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, GetBarSize('3', $xres) , $ySize); + $DrawPos += GetBarSize('3', $xres); + $DrawPos += GetBarSize('2', $xres); + return $DrawPos; + end + + # + # Draws the stop code. + # @param int $DrawPos Drawing position. + # @param int $yPos Vertical position. + # @param int $ySize Vertical size. + # @param int $xres Horizontal resolution. + # @return int drawing position. + # @access private + # + def DrawStop($DrawPos, $yPos, $ySize, $xres) + # Stop code is '2331112'# + @DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, GetBarSize('2', $xres) , $ySize); + $DrawPos += GetBarSize('2', $xres); + $DrawPos += GetBarSize('3', $xres); + @DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, GetBarSize('3', $xres) , $ySize); + $DrawPos += GetBarSize('3', $xres); + $DrawPos += GetBarSize('1', $xres); + @DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, GetBarSize('1', $xres) , $ySize); + $DrawPos += GetBarSize('1', $xres); + $DrawPos += GetBarSize('1', $xres); + @DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, GetBarSize('2', $xres) , $ySize); + $DrawPos += GetBarSize('2', $xres); + return $DrawPos; + end + + # + # Draws the check-char code. + # @param int $DrawPos Drawing position. + # @param int $yPos Vertical position. + # @param int $ySize Vertical size. + # @param int $xres Horizontal resolution. + # @return int drawing position. + # @access private + # + def DrawCheckChar($DrawPos, $yPos, $ySize, $xres) + $cset = GetCheckCharValue(); + @DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, GetBarSize($cset[0], $xres) , $ySize); + $DrawPos += GetBarSize($cset[0], $xres); + $DrawPos += GetBarSize($cset[1], $xres); + @DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, GetBarSize($cset[2], $xres) , $ySize); + $DrawPos += GetBarSize($cset[2], $xres); + $DrawPos += GetBarSize($cset[3], $xres); + @DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, GetBarSize($cset[4], $xres) , $ySize); + $DrawPos += GetBarSize($cset[4], $xres); + $DrawPos += GetBarSize($cset[5], $xres); + return $DrawPos; + end + + # + # Draws the barcode object. + # @param int $xres Horizontal resolution. + # @return bool true in case of success. + # + def DrawObject($xres) + $len = @mValue.length; + if (($size = GetSize($xres))==0) + return false; + end + + if (@mStyle & BCS_ALIGN_CENTER) $sPos = (integer)((@mWidth - $size ) / 2); + elsif (@mStyle & BCS_ALIGN_RIGHT) $sPos = @mWidth - $size; + else $sPos = 0; + + # Total height of bar code -Bars only-# + if (@mStyle & BCS_DRAW_TEXT) $ysize = @mHeight - BCD_DEFAULT_MAR_Y1 - BCD_DEFAULT_MAR_Y2 - GetFontHeight(@mFont); + else $ysize = @mHeight - BCD_DEFAULT_MAR_Y1 - BCD_DEFAULT_MAR_Y2; + + # Draw text# + if (@mStyle & BCS_DRAW_TEXT) + if (@mStyle & BCS_STRETCH_TEXT) + for ($i=0;$i<$len;$i++) + @DrawChar(@mFont, $sPos+(2*BCD_C128_BAR_2*$xres + 3*BCD_C128_BAR_1*$xres + BCD_C128_BAR_4*$xres)+($size/$len)*$i, + $ysize + BCD_DEFAULT_MAR_Y1 + BCD_DEFAULT_TEXT_OFFSET, @mValue[$i]); + else# Center# + $text_width = GetFontWidth(@mFont) * @mValue.length; + @DrawText(@mFont, $sPos+(($size-$text_width)/2)+(2*BCD_C128_BAR_2*$xres + 3*BCD_C128_BAR_1*$xres + BCD_C128_BAR_4*$xres), + $ysize + BCD_DEFAULT_MAR_Y1 + BCD_DEFAULT_TEXT_OFFSET, @mValue); + end + end + + $cPos = 0; + $DrawPos = @DrawStart($sPos, BCD_DEFAULT_MAR_Y1 , $ysize, $xres); + do { + $c = GetCharIndex(@mValue[$cPos].@mValue[$cPos+1]); + $cset = @mCharSet[$c]; + @DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, GetBarSize($cset[0], $xres) , $ysize); + $DrawPos += GetBarSize($cset[0], $xres); + $DrawPos += GetBarSize($cset[1], $xres); + @DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, GetBarSize($cset[2], $xres) , $ysize); + $DrawPos += GetBarSize($cset[2], $xres); + $DrawPos += GetBarSize($cset[3], $xres); + @DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, GetBarSize($cset[4], $xres) , $ysize); + $DrawPos += GetBarSize($cset[4], $xres); + $DrawPos += GetBarSize($cset[5], $xres); + $cPos += 2; + end while ($cPos<$len); + $DrawPos = @DrawCheckChar($DrawPos, BCD_DEFAULT_MAR_Y1 , $ysize, $xres); + $DrawPos = @DrawStop($DrawPos, BCD_DEFAULT_MAR_Y1 , $ysize, $xres); + return true; + end +} + +#============================================================+ +# END OF FILE +#============================================================+ + diff --git a/vendor/plugins/rfpdf/lib/barcode/c39object.rb b/vendor/plugins/rfpdf/lib/barcode/c39object.rb new file mode 100755 index 00000000..efed6940 --- /dev/null +++ b/vendor/plugins/rfpdf/lib/barcode/c39object.rb @@ -0,0 +1,281 @@ + +#============================================================+ +# File name : c39object.rb +# Begin : 2002-07-31 +# Last Update : 2004-12-29 +# Author : Karim Mribti [barcode@mribti.com] +# : Nicola Asuni [info@tecnick.com] +# Version : 0.0.8a 2001-04-01 (original code) +# License : GNU LGPL (Lesser General Public License) 2.1 +# http://www.gnu.org/copyleft/lesser.txt +# Source Code : http://www.mribti.com/barcode/ +# +# Description : Code 39 Barcode Render Class for PHP using +# the GD graphics library. +# Code 39 is an alphanumeric bar code that can +# encode decimal number, case alphabet and some +# special symbols. +# +# NOTE: +# This version contains changes by Nicola Asuni: +# - porting to Ruby +# - code style and formatting +# - automatic php documentation in PhpDocumentor Style +# (www.phpdoc.org) +# - minor bug fixing +#============================================================+ + +# +# Code 39 Barcode Render Class.
    +# Code 39 is an alphanumeric bar code that can encode decimal number, case alphabet and some special symbols. +# @author Karim Mribti, Nicola Asuni +# @name BarcodeObject +# @package com.tecnick.tcpdf +# @@version 0.0.8a 2001-04-01 (original code) +# @since 2001-03-25 +# @license http://www.gnu.org/copyleft/lesser.html LGPL +# + +# +# Code 39 Barcode Render Class.
    +# Code 39 is an alphanumeric bar code that can encode decimal number, case alphabet and some special symbols. +# @author Karim Mribti, Nicola Asuni +# @name BarcodeObject +# @package com.tecnick.tcpdf +# @@version 0.0.8a 2001-04-01 (original code) +# @since 2001-03-25 +# @license http://www.gnu.org/copyleft/lesser.html LGPL +# +class C39Object extends BarcodeObject { + + # + # Class Constructor. + # @param int $Width Image width in pixels. + # @param int $Height Image height in pixels. + # @param int $Style Barcode style. + # @param int $Value value to print on barcode. + # + def __construct($Width, $Height, $Style, $Value) + parent::__construct($Width, $Height, $Style); + @mValue = $Value; + @mChars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-.#$/+%"; + @mCharSet = array ( + # 0 # "000110100", + # 1 # "100100001", + # 2 # "001100001", + # 3 # "101100000", + # 4 # "000110001", + # 5 # "100110000", + # 6 # "001110000", + # 7 # "000100101", + # 8 # "100100100", + # 9 # "001100100", + # A # "100001001", + # B # "001001001", + # C # "101001000", + # D # "000011001", + # E # "100011000", + # F # "001011000", + # G # "000001101", + # H # "100001100", + # I # "001001100", + # J # "000011100", + # K # "100000011", + # L # "001000011", + # M # "101000010", + # N # "000010011", + # O # "100010010", + # P # "001010010", + # Q # "000000111", + # R # "100000110", + # S # "001000110", + # T # "000010110", + # U # "110000001", + # V # "011000001", + # W # "111000000", + # X # "010010001", + # Y # "110010000", + # Z # "011010000", + # - # "010000101", + # . # "110000100", + # SP# "011000100", + /*# # "010010100", + # $ # "010101000", + # / # "010100010", + # + # "010001010", + # % # "000101010" + ); + end + + # + # Returns the character index. + # @param char $char character. + # @return int character index or -1 in case of error. + # @access private + # + def GetCharIndex($char) + for ($i=0;$i<44;$i++) + if (@mChars[$i] == $char) + return $i; + end + end + return -1; + end + + # + # Returns barcode size. + # @param int $xres Horizontal resolution. + # @return barcode size. + # @access private + # + def GetSize($xres) + $len = @mValue.length; + + if ($len == 0) { + @mError = "Null value"; + return false; + end + + for ($i=0;$i<$len;$i++) + if (GetCharIndex(@mValue[$i]) == -1 || @mValue[$i] == '*') + # The asterisk is only used as a start and stop code# + @mError = "C39 not include the char '".@mValue[$i]."'"; + return false; + end + end + + # Start, Stop is 010010100 == '*' # + $StartSize = BCD_C39_NARROW_BAR# $xres# 6 + BCD_C39_WIDE_BAR# $xres# 3; + $StopSize = BCD_C39_NARROW_BAR# $xres# 6 + BCD_C39_WIDE_BAR# $xres# 3; + $CharSize = BCD_C39_NARROW_BAR# $xres# 6 + BCD_C39_WIDE_BAR# $xres# 3; # Same for all chars# + + return $CharSize# $len + $StartSize + $StopSize + # Space between chars# BCD_C39_NARROW_BAR# $xres# ($len-1); + end + + # + # Draws the start code. + # @param int $DrawPos Drawing position. + # @param int $yPos Vertical position. + # @param int $ySize Vertical size. + # @param int $xres Horizontal resolution. + # @return int drawing position. + # @access private + # + def DrawStart($DrawPos, $yPos, $ySize, $xres) + # Start code is '*'# + $narrow = BCD_C39_NARROW_BAR# $xres; + $wide = BCD_C39_WIDE_BAR# $xres; + @DrawSingleBar($DrawPos, $yPos, $narrow , $ySize); + $DrawPos += $narrow; + $DrawPos += $wide; + @DrawSingleBar($DrawPos, $yPos, $narrow , $ySize); + $DrawPos += $narrow; + $DrawPos += $narrow; + @DrawSingleBar($DrawPos, $yPos, $wide , $ySize); + $DrawPos += $wide; + $DrawPos += $narrow; + @DrawSingleBar($DrawPos, $yPos, $wide , $ySize); + $DrawPos += $wide; + $DrawPos += $narrow; + @DrawSingleBar($DrawPos, $yPos, $narrow, $ySize); + $DrawPos += $narrow; + $DrawPos += $narrow; # Space between chars# + return $DrawPos; + end + + # + # Draws the stop code. + # @param int $DrawPos Drawing position. + # @param int $yPos Vertical position. + # @param int $ySize Vertical size. + # @param int $xres Horizontal resolution. + # @return int drawing position. + # @access private + # + def DrawStop($DrawPos, $yPos, $ySize, $xres) + # Stop code is '*'# + $narrow = BCD_C39_NARROW_BAR# $xres; + $wide = BCD_C39_WIDE_BAR# $xres; + @DrawSingleBar($DrawPos, $yPos, $narrow , $ySize); + $DrawPos += $narrow; + $DrawPos += $wide; + @DrawSingleBar($DrawPos, $yPos, $narrow , $ySize); + $DrawPos += $narrow; + $DrawPos += $narrow; + @DrawSingleBar($DrawPos, $yPos, $wide , $ySize); + $DrawPos += $wide; + $DrawPos += $narrow; + @DrawSingleBar($DrawPos, $yPos, $wide , $ySize); + $DrawPos += $wide; + $DrawPos += $narrow; + @DrawSingleBar($DrawPos, $yPos, $narrow, $ySize); + $DrawPos += $narrow; + return $DrawPos; + end + + # + # Draws the barcode object. + # @param int $xres Horizontal resolution. + # @return bool true in case of success. + # + def DrawObject($xres) + $len = @mValue.length; + + $narrow = BCD_C39_NARROW_BAR# $xres; + $wide = BCD_C39_WIDE_BAR# $xres; + + if (($size = GetSize($xres))==0) + return false; + end + + $cPos = 0; + if (@mStyle & BCS_ALIGN_CENTER) $sPos = (integer)((@mWidth - $size ) / 2); + elsif (@mStyle & BCS_ALIGN_RIGHT) $sPos = @mWidth - $size; + else $sPos = 0; + + # Total height of bar code -Bars only-# + if (@mStyle & BCS_DRAW_TEXT) $ysize = @mHeight - BCD_DEFAULT_MAR_Y1 - BCD_DEFAULT_MAR_Y2 - GetFontHeight(@mFont); + else $ysize = @mHeight - BCD_DEFAULT_MAR_Y1 - BCD_DEFAULT_MAR_Y2; + + # Draw text# + if (@mStyle & BCS_DRAW_TEXT) + if (@mStyle & BCS_STRETCH_TEXT) + for ($i=0;$i<$len;$i++) + @DrawChar(@mFont, $sPos+($narrow*6+$wide*3)+($size/$len)*$i, + $ysize + BCD_DEFAULT_MAR_Y1 + BCD_DEFAULT_TEXT_OFFSET, @mValue[$i]); + else# Center# + $text_width = GetFontWidth(@mFont)# @mValue.length; + @DrawText(@mFont, $sPos+(($size-$text_width)/2)+($narrow*6+$wide*3), + $ysize + BCD_DEFAULT_MAR_Y1 + BCD_DEFAULT_TEXT_OFFSET, @mValue); + end + end + + $DrawPos = @DrawStart($sPos, BCD_DEFAULT_MAR_Y1 , $ysize, $xres); + do { + $c = GetCharIndex(@mValue[$cPos]); + $cset = @mCharSet[$c]; + @DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, ($cset[0] == '0') ? $narrow : $wide , $ysize); + $DrawPos += ($cset[0] == '0') ? $narrow : $wide; + $DrawPos += ($cset[1] == '0') ? $narrow : $wide; + @DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, ($cset[2] == '0') ? $narrow : $wide , $ysize); + $DrawPos += ($cset[2] == '0') ? $narrow : $wide; + $DrawPos += ($cset[3] == '0') ? $narrow : $wide; + @DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, ($cset[4] == '0') ? $narrow : $wide , $ysize); + $DrawPos += ($cset[4] == '0') ? $narrow : $wide; + $DrawPos += ($cset[5] == '0') ? $narrow : $wide; + @DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, ($cset[6] == '0') ? $narrow : $wide , $ysize); + $DrawPos += ($cset[6] == '0') ? $narrow : $wide; + $DrawPos += ($cset[7] == '0') ? $narrow : $wide; + @DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, ($cset[8] == '0') ? $narrow : $wide , $ysize); + $DrawPos += ($cset[8] == '0') ? $narrow : $wide; + $DrawPos += $narrow; # Space between chars# + $cPos += 1; + end while ($cPos<$len); + $DrawPos = @DrawStop($DrawPos, BCD_DEFAULT_MAR_Y1 , $ysize, $xres); + return true; + end +} + +#============================================================+ +# END OF FILE +#============================================================+ diff --git a/vendor/plugins/rfpdf/lib/barcode/i25object.rb b/vendor/plugins/rfpdf/lib/barcode/i25object.rb new file mode 100755 index 00000000..7bdb7588 --- /dev/null +++ b/vendor/plugins/rfpdf/lib/barcode/i25object.rb @@ -0,0 +1,216 @@ + +#============================================================+ +# File name : i25aobject.rb +# Begin : 2002-07-31 +# Last Update : 2004-12-29 +# Author : Karim Mribti [barcode@mribti.com] +# : Nicola Asuni [info@tecnick.com] +# Version : 0.0.8a 2001-04-01 (original code) +# License : GNU LGPL (Lesser General Public License) 2.1 +# http://www.gnu.org/copyleft/lesser.txt +# Source Code : http://www.mribti.com/barcode/ +# +# Description : I25 Barcode Render Class for PHP using +# the GD graphics library. +# Interleaved 2 of 5 is a numeric only bar code +# with a optional check number. +# +# NOTE: +# This version contains changes by Nicola Asuni: +# - porting to Ruby +# - code style and formatting +# - automatic php documentation in PhpDocumentor Style +# (www.phpdoc.org) +# - minor bug fixing +#============================================================+ + +# +# I25 Barcode Render Class for PHP using the GD graphics library. 57)) + @mError = "I25 is numeric only"; + return false; + end + end + + if (($len%2) != 0) + @mError = "The length of barcode value must be even"; + return false; + end + $StartSize = BCD_I25_NARROW_BAR# 4 # $xres; + $StopSize = BCD_I25_WIDE_BAR# $xres + 2# BCD_I25_NARROW_BAR# $xres; + $cPos = 0; + $sPos = 0; + do { + $c1 = @mValue[$cPos]; + $c2 = @mValue[$cPos+1]; + $cset1 = @mCharSet[$c1]; + $cset2 = @mCharSet[$c2]; + + for ($i=0;$i<5;$i++) + $type1 = ($cset1[$i]==0) ? (BCD_I25_NARROW_BAR # $xres) : (BCD_I25_WIDE_BAR# $xres); + $type2 = ($cset2[$i]==0) ? (BCD_I25_NARROW_BAR # $xres) : (BCD_I25_WIDE_BAR# $xres); + $sPos += ($type1 + $type2); + end + $cPos+=2; + end while ($cPos<$len); + + return $sPos + $StartSize + $StopSize; + end + + # + # Draws the start code. + # @param int $DrawPos Drawing position. + # @param int $yPos Vertical position. + # @param int $ySize Vertical size. + # @param int $xres Horizontal resolution. + # @return int drawing position. + # @access private + # + def DrawStart($DrawPos, $yPos, $ySize, $xres) + # Start code is "0000"# + @DrawSingleBar($DrawPos, $yPos, BCD_I25_NARROW_BAR # $xres , $ySize); + $DrawPos += BCD_I25_NARROW_BAR # $xres; + $DrawPos += BCD_I25_NARROW_BAR # $xres; + @DrawSingleBar($DrawPos, $yPos, BCD_I25_NARROW_BAR # $xres , $ySize); + $DrawPos += BCD_I25_NARROW_BAR # $xres; + $DrawPos += BCD_I25_NARROW_BAR # $xres; + return $DrawPos; + end + + # + # Draws the stop code. + # @param int $DrawPos Drawing position. + # @param int $yPos Vertical position. + # @param int $ySize Vertical size. + # @param int $xres Horizontal resolution. + # @return int drawing position. + # @access private + # + def DrawStop($DrawPos, $yPos, $ySize, $xres) + # Stop code is "100"# + @DrawSingleBar($DrawPos, $yPos, BCD_I25_WIDE_BAR# $xres , $ySize); + $DrawPos += BCD_I25_WIDE_BAR # $xres; + $DrawPos += BCD_I25_NARROW_BAR # $xres; + @DrawSingleBar($DrawPos, $yPos, BCD_I25_NARROW_BAR # $xres , $ySize); + $DrawPos += BCD_I25_NARROW_BAR # $xres; + return $DrawPos; + end + + # + # Draws the barcode object. + # @param int $xres Horizontal resolution. + # @return bool true in case of success. + # + def DrawObject($xres) + $len = @mValue.length; + + if (($size = GetSize($xres))==0) + return false; + end + + $cPos = 0; + + if (@mStyle & BCS_DRAW_TEXT) $ysize = @mHeight - BCD_DEFAULT_MAR_Y1 - BCD_DEFAULT_MAR_Y2 - GetFontHeight(@mFont); + else $ysize = @mHeight - BCD_DEFAULT_MAR_Y1 - BCD_DEFAULT_MAR_Y2; + + if (@mStyle & BCS_ALIGN_CENTER) $sPos = (integer)((@mWidth - $size ) / 2); + elsif (@mStyle & BCS_ALIGN_RIGHT) $sPos = @mWidth - $size; + else $sPos = 0; + + if (@mStyle & BCS_DRAW_TEXT) + if (@mStyle & BCS_STRETCH_TEXT) + # Stretch# + for ($i=0;$i<$len;$i++) + @DrawChar(@mFont, $sPos+BCD_I25_NARROW_BAR*4*$xres+($size/$len)*$i, + $ysize + BCD_DEFAULT_MAR_Y1 + BCD_DEFAULT_TEXT_OFFSET , @mValue[$i]); + end + endelse# Center# + $text_width = GetFontWidth(@mFont) * @mValue.length; + @DrawText(@mFont, $sPos+(($size-$text_width)/2)+(BCD_I25_NARROW_BAR*4*$xres), + $ysize + BCD_DEFAULT_MAR_Y1 + BCD_DEFAULT_TEXT_OFFSET, @mValue); + end + end + + $sPos = @DrawStart($sPos, BCD_DEFAULT_MAR_Y1, $ysize, $xres); + do { + $c1 = @mValue[$cPos]; + $c2 = @mValue[$cPos+1]; + $cset1 = @mCharSet[$c1]; + $cset2 = @mCharSet[$c2]; + + for ($i=0;$i<5;$i++) + $type1 = ($cset1[$i]==0) ? (BCD_I25_NARROW_BAR# $xres) : (BCD_I25_WIDE_BAR# $xres); + $type2 = ($cset2[$i]==0) ? (BCD_I25_NARROW_BAR# $xres) : (BCD_I25_WIDE_BAR# $xres); + @DrawSingleBar($sPos, BCD_DEFAULT_MAR_Y1, $type1 , $ysize); + $sPos += ($type1 + $type2); + end + $cPos+=2; + end while ($cPos<$len); + $sPos = @DrawStop($sPos, BCD_DEFAULT_MAR_Y1, $ysize, $xres); + return true; + end +} + +#============================================================+ +# END OF FILE +#============================================================+ diff --git a/vendor/plugins/rfpdf/lib/barcode/image.rb b/vendor/plugins/rfpdf/lib/barcode/image.rb new file mode 100755 index 00000000..a95b84aa --- /dev/null +++ b/vendor/plugins/rfpdf/lib/barcode/image.rb @@ -0,0 +1,87 @@ + +#============================================================+ +# File name : image.rb +# Begin : 2002-07-31 +# Last Update : 2005-01-08 +# Author : Karim Mribti [barcode@mribti.com] +# : Nicola Asuni [info@tecnick.com] +# Version : 0.0.8a 2001-04-01 (original code) +# License : GNU LGPL (Lesser General Public License) 2.1 +# http://www.gnu.org/copyleft/lesser.txt +# Source Code : http://www.mribti.com/barcode/ +# +# Description : Barcode Image Rendering. +# +# NOTE: +# This version contains changes by Nicola Asuni: +# - porting to Ruby +# - code style and formatting +# - automatic php documentation in PhpDocumentor Style +# (www.phpdoc.org) +# - minor bug fixing +#============================================================+ + +# +# Barcode Image Rendering. +# @author Karim Mribti, Nicola Asuni +# @name BarcodeObject +# @package com.tecnick.tcpdf +# @@version 0.0.8a 2001-04-01 (original code) +# @since 2001-03-25 +# @license http://www.gnu.org/copyleft/lesser.html LGPL +# + +# +# +# + +require("../../shared/barcode/barcode.rb"); +require("../../shared/barcode/i25object.rb"); +require("../../shared/barcode/c39object.rb"); +require("../../shared/barcode/c128aobject.rb"); +require("../../shared/barcode/c128bobject.rb"); +require("../../shared/barcode/c128cobject.rb"); + +if (!$_REQUEST['style'].nil?) $_REQUEST['style'] = BCD_DEFAULT_STYLE; +if (!$_REQUEST['width'].nil?) $_REQUEST['width'] = BCD_DEFAULT_WIDTH; +if (!$_REQUEST['height'].nil?) $_REQUEST['height'] = BCD_DEFAULT_HEIGHT; +if (!$_REQUEST['xres'].nil?) $_REQUEST['xres'] = BCD_DEFAULT_XRES; +if (!$_REQUEST['font'].nil?) $_REQUEST['font'] = BCD_DEFAULT_FONT; +if (!$_REQUEST['type'].nil?) $_REQUEST['type'] = "C39"; +if (!$_REQUEST['code'].nil?) $_REQUEST['code'] = ""; + +switch ($_REQUEST['type'].upcase) + case "I25" + $obj = new I25Object($_REQUEST['width'], $_REQUEST['height'], $_REQUEST['style'], $_REQUEST['code']); + break; + end + case "C128A" + $obj = new C128AObject($_REQUEST['width'], $_REQUEST['height'], $_REQUEST['style'], $_REQUEST['code']); + break; + end + case "C128B" + $obj = new C128BObject($_REQUEST['width'], $_REQUEST['height'], $_REQUEST['style'], $_REQUEST['code']); + break; + end + case "C128C" + $obj = new C128CObject($_REQUEST['width'], $_REQUEST['height'], $_REQUEST['style'], $_REQUEST['code']); + break; + end + case "C39": + default + $obj = new C39Object($_REQUEST['width'], $_REQUEST['height'], $_REQUEST['style'], $_REQUEST['code']); + break; + end +} + +if ($obj) + $obj->SetFont($_REQUEST['font']); + $obj->DrawObject($_REQUEST['xres']); + $obj->FlushObject(); + $obj->DestroyObject(); + unset($obj); # clean# +} + +#============================================================+ +# END OF FILE +#============================================================+ diff --git a/vendor/gems/coderay-0.9.7/LICENSE b/vendor/plugins/rfpdf/lib/barcode/lesser.txt old mode 100644 new mode 100755 similarity index 97% rename from vendor/gems/coderay-0.9.7/LICENSE rename to vendor/plugins/rfpdf/lib/barcode/lesser.txt index c00103de..8e028171 --- a/vendor/gems/coderay-0.9.7/LICENSE +++ b/vendor/plugins/rfpdf/lib/barcode/lesser.txt @@ -1,504 +1,504 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - , 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! - - + 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. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/vendor/plugins/rfpdf/lib/config/lang/eng.rb b/vendor/plugins/rfpdf/lib/config/lang/eng.rb new file mode 100755 index 00000000..23158117 --- /dev/null +++ b/vendor/plugins/rfpdf/lib/config/lang/eng.rb @@ -0,0 +1,48 @@ +#============================================================+ +# File name : eng.rb +# Begin : 2004-03-03 +# Last Update : 2005-03-19 +# +# Description : Language module for TCPDF +# (contains translated texts) +# +# +# Author: Nicola Asuni +# +# (c) Copyright: +# Tecnick.com S.r.l. +# Via Ugo Foscolo n.19 +# 09045 Quartu Sant'Elena (CA) +# ITALY +# www.tecnick.com +# info@tecnick.com +#============================================================+ + +# +# TCPDF language file (contains translated texts). +# @package com.tecnick.tcpdf +# @abstract TCPDF language file. +# @author Nicola Asuni +# @copyright 2004 Tecnick.com S.r.l (www.tecnick.com) Via Ugo Foscolo n.19 - 09045 Quartu Sant'Elena (CA) - ITALY - www.tecnick.com - info@tecnick.com +# @link http://tcpdf.sourceforge.net +# @license http://www.gnu.org/copyleft/lesser.html LGPL +# @since 2004-03-03 +# + +# ENGLISH + +@l = [] + +# PAGE META DESCRIPTORS -------------------------------------- + +@l['a_meta_charset'] = "UTF-8"; +@l['a_meta_dir'] = "ltr"; +@l['a_meta_language'] = "en"; + +# TRANSLATIONS -------------------------------------- +@l['w_page'] = "page"; + +#============================================================+ +# END OF FILE +#============================================================+ + diff --git a/vendor/plugins/rfpdf/lib/core/image_science.rb b/vendor/plugins/rfpdf/lib/core/image_science.rb new file mode 100644 index 00000000..8b006da8 --- /dev/null +++ b/vendor/plugins/rfpdf/lib/core/image_science.rb @@ -0,0 +1,64 @@ +# The MIT License +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +# This implements native php methods used by tcpdf, which have had to be +# reimplemented within Ruby. + +module RFPDF + + # http://uk2.php.net/getimagesize + def getimagesize(filename) + out = Hash.new + out[2] = ImageScience.image_type(filename) + + image = ImageScience.with_image(filename) do |img| + out[0] = image.width + out[1] = image.height + + # These are actually meant to return integer values But I couldn't seem to find anything saying what those values are. + # So for now they return strings. The only place that uses this at the moment is the parsejpeg method, so I've changed that too. + case out[2] + when "GIF" + out['mime'] = "image/gif" + when "JPEG" + out['mime'] = "image/jpeg" + when "PNG" + out['mime'] = "image/png" + when "WBMP" + out['mime'] = "image/vnd.wap.wbmp" + when "XPM" + out['mime'] = "image/x-xpixmap" + end + out[3] = "height=\"#{image.height}\" width=\"#{image.width}\"" + + if image.colorspace == "CMYK" || image.colorspace == "RGBA" + out['channels'] = 4 + elsif image.colorspace == "RGB" + out['channels'] = 3 + end + + out['bits'] = image.depth + out['bits'] /= out['channels'] if out['channels'] + end + + out + end + +end \ No newline at end of file diff --git a/vendor/plugins/rfpdf/lib/rfpdf/rfpdf.rb b/vendor/plugins/rfpdf/lib/core/rfpdf.rb similarity index 50% rename from vendor/plugins/rfpdf/lib/rfpdf/rfpdf.rb rename to vendor/plugins/rfpdf/lib/core/rfpdf.rb index 5ad88290..2c8b7527 100644 --- a/vendor/plugins/rfpdf/lib/rfpdf/rfpdf.rb +++ b/vendor/plugins/rfpdf/lib/core/rfpdf.rb @@ -1,9 +1,39 @@ -module RFPDF +module Core::RFPDF COLOR_PALETTE = { - :black => [0x00, 0x00, 0x00], - :white => [0xff, 0xff, 0xff], + :black => [0x00, 0x00, 0x00], + :white => [0xff, 0xff, 0xff], }.freeze + # Draw a circle at (mid_x, mid_y) with radius. + # + # Options are: + # * :border - Draw a border, 0 = no, 1 = yes? Default value is 1. + # * :border_color - Default value is COLOR_PALETTE[:black]. + # * :border_width - Default value is 0.5. + # * :fill - Fill the box, 0 = no, 1 = yes? Default value is 1. + # * :fill_color - Default value is nothing or COLOR_PALETTE[:white]. + # * :fill_colorspace - Default value is :rgb or ''. + # + # Example: + # + # draw_circle(x, y, radius, :border_color => ReportHelper::COLOR_PALETTE[:dark_blue], :border_width => 1) + # + def draw_circle(mid_x, mid_y, radius, options = {}) + options[:border] ||= 1 + options[:border_color] ||= Core::RFPDF::COLOR_PALETTE[:black] + options[:border_width] ||= 0.5 + options[:fill] ||= 1 + options[:fill_color] ||= Core::RFPDF::COLOR_PALETTE[:white] + options[:fill_colorspace] ||= :rgb + SetLineWidth(options[:border_width]) + set_draw_color_a(options[:border_color]) + set_fill_color_a(options[:fill_color], options[:colorspace]) + fd = "" + fd = "D" if options[:border] == 1 + fd += "F" if options[:fill] == 1 + Circle(mid_x, mid_y, radius, fd) + end + # Draw a line from (x1, y1) to (x2, y2). # # Options are: @@ -15,9 +45,9 @@ module RFPDF # draw_line(x1, y1, x1, y1+h, :line_color => ReportHelper::COLOR_PALETTE[:dark_blue], :line_width => 1) # def draw_line(x1, y1, x2, y2, options = {}) - options[:line_color] ||= COLOR_PALETTE[:black] + options[:line_color] ||= Core::RFPDF::COLOR_PALETTE[:black] options[:line_width] ||= 0.5 - set_draw_color(options[:line_color]) + set_draw_color_a(options[:line_color]) SetLineWidth(options[:line_width]) Line(x1, y1, x2, y2) end @@ -28,28 +58,31 @@ module RFPDF # * :font_color - Default value is COLOR_PALETTE[:black]. # * :font_size - Default value is 10. # * :font_style - Default value is nothing or ''. + # * :colorspace - Default value is :rgb or ''. # # Example: # # draw_text(x, y, header_left, :font_size => 10) # def draw_text(x, y, text, options = {}) - options[:font_color] ||= COLOR_PALETTE[:black] + options[:font_color] ||= Core::RFPDF::COLOR_PALETTE[:black] + options[:font] ||= default_font options[:font_size] ||= 10 options[:font_style] ||= '' - set_text_color(options[:font_color]) - SetFont('Arial', options[:font_style], options[:font_size]) + set_text_color_a(options[:font_color], options[:colorspace]) + SetFont(options[:font], options[:font_style], options[:font_size]) SetXY(x, y) Write(options[:font_size] + 4, text) end - # Draw a block of text at (x, y) bounded by left_margin and right_margin. Both + # Draw a block of text at (x, y) bounded by left_margin and right_margin_from_right_edge. Both # margins are measured from their corresponding edge. # # Options are: # * :font_color - Default value is COLOR_PALETTE[:black]. # * :font_size - Default value is 10. # * :font_style - Default value is nothing or ''. + # * :colorspace - Default value is :rgb or ''. # # Example: # @@ -58,15 +91,16 @@ module RFPDF # :font_size => 12, # :font_style => 'I') # - def draw_text_block(x, y, text, left_margin, right_margin, options = {}) - options[:font_color] ||= COLOR_PALETTE[:black] + def draw_text_block(x, y, text, left_margin, right_margin_from_right_edge, options = {}) + options[:font] ||= default_font + options[:font_color] ||= Core::RFPDF::COLOR_PALETTE[:black] options[:font_size] ||= 10 options[:font_style] ||= '' - set_text_color(options[:font_color]) - SetFont('Arial', options[:font_style], options[:font_size]) + set_text_color_a(options[:font_color], options[:colorspace]) + SetFont(options[:font], options[:font_style], options[:font_size]) SetXY(x, y) SetLeftMargin(left_margin) - SetRightMargin(right_margin) + SetRightMargin(right_margin_from_right_edge) Write(options[:font_size] + 4, text) SetMargins(0,0,0) end @@ -79,6 +113,7 @@ module RFPDF # * :border_width - Default value is 0.5. # * :fill - Fill the box, 0 = no, 1 = yes? Default value is 1. # * :fill_color - Default value is nothing or COLOR_PALETTE[:white]. + # * :fill_colorspace - Default value is :rgb or ''. # # Example: # @@ -86,13 +121,14 @@ module RFPDF # def draw_box(x, y, w, h, options = {}) options[:border] ||= 1 - options[:border_color] ||= COLOR_PALETTE[:black] + options[:border_color] ||= Core::RFPDF::COLOR_PALETTE[:black] options[:border_width] ||= 0.5 options[:fill] ||= 1 - options[:fill_color] ||= COLOR_PALETTE[:white] + options[:fill_color] ||= Core::RFPDF::COLOR_PALETTE[:white] + options[:fill_colorspace] ||= :rgb SetLineWidth(options[:border_width]) - set_draw_color(options[:border_color]) - set_fill_color(options[:fill_color]) + set_draw_color_a(options[:border_color]) + set_fill_color_a(options[:fill_color], options[:fill_colorspace]) fd = "" fd = "D" if options[:border] == 1 fd += "F" if options[:fill] == 1 @@ -112,7 +148,9 @@ module RFPDF # * :font_size - Default value is nothing or 8. # * :font_style - 'B' = bold, 'I' = italic, 'U' = underline. Default value is nothing ''. # * :padding - Default value is nothing or 2. + # * :x_padding - Default value is nothing. # * :valign - 'M' = middle, 'T' = top, 'B' = bottom. Default value is nothing or 'M'. + # * :colorspace - Default value is :rgb or ''. # # Example: # @@ -127,36 +165,50 @@ module RFPDF def draw_text_box(x, y, w, h, text, options = {}) options[:align] ||= 'C' options[:border] ||= 0 - options[:border_color] ||= COLOR_PALETTE[:black] + options[:border_color] ||= Core::RFPDF::COLOR_PALETTE[:black] options[:border_width] ||= 0.5 options[:fill] ||= 1 - options[:fill_color] ||= COLOR_PALETTE[:white] - options[:font_color] ||= COLOR_PALETTE[:black] + options[:fill_color] ||= Core::RFPDF::COLOR_PALETTE[:white] + options[:font] ||= default_font + options[:font_color] ||= Core::RFPDF::COLOR_PALETTE[:black] options[:font_size] ||= 8 options[:font_line_spacing] ||= options[:font_size] * 0.3 options[:font_style] ||= '' options[:padding] ||= 2 + options[:x_padding] ||= 0 options[:valign] ||= "M" if options[:fill] == 1 or options[:border] == 1 draw_box(x, y, w, h, options) end SetMargins(0,0,0) - set_text_color(options[:font_color]) + set_text_color_a(options[:font_color], options[:colorspace]) font_size = options[:font_size] - SetFont('Arial', options[:font_style], font_size) + SetFont(options[:font], options[:font_style], font_size) font_size += options[:font_line_spacing] case options[:valign] - when "B" + when "B", "bottom" y -= options[:padding] - text = "\n" + text if text["\n"].nil? - when "T" + when "T", "top" y += options[:padding] end + case options[:align] + when "L", "left" + x += options[:x_padding] + w -= options[:x_padding] + w -= options[:x_padding] + when "R", "right" + x += options[:x_padding] + w -= options[:x_padding] + w -= options[:x_padding] + end SetXY(x, y) - if GetStringWidth(text) > w or not text["\n"].nil? or options[:valign] == "T" - font_size += options[:font_size] * 0.1 - #TODO 2006-07-21 Level=1 - this is assuming a 2 line text - SetXY(x, y + ((h - (font_size * 2)) / 2)) if options[:valign] == "M" + if GetStringWidth(text) < w or not text["\n"].nil? and (options[:valign] == "T" || options[:valign] == "top") + text = text + "\n" + end + if GetStringWidth(text) > w or not text["\n"].nil? or (options[:valign] == "B" || options[:valign] == "bottom") + font_size += options[:font_size] * 0.1 + # TODO 2006-07-21 Level=1 - this is assuming a 2 line text + SetXY(x, y + ((h - (font_size * 2)) / 2)) if (options[:valign] == "M" || options[:valign] == "middle") MultiCell(w, font_size, text, 0, options[:align]) else Cell(w, h, text, 0, 0, options[:align]) @@ -169,6 +221,7 @@ module RFPDF # * :font_color - Default value is COLOR_PALETTE[:black]. # * :font_size - Default value is 18. # * :font_style - Default value is nothing or ''. + # * :colorspace - Default value is :rgb or ''. # # Example: # @@ -177,11 +230,12 @@ module RFPDF # :font_color => ReportHelper::COLOR_PALETTE[:dark_blue]) # def draw_title(x, y, title, options = {}) - options[:font_color] ||= COLOR_PALETTE[:black] + options[:font_color] ||= Core::RFPDF::COLOR_PALETTE[:black] + options[:font] ||= default_font options[:font_size] ||= 18 options[:font_style] ||= '' - set_text_color(options[:font_color]) - SetFont('Arial', options[:font_style], options[:font_size]) + set_text_color_a(options[:font_color], options[:colorspace]) + SetFont(options[:font], options[:font_style], options[:font_size]) SetXY(x, y) Write(options[:font_size] + 2, title) end @@ -190,9 +244,9 @@ module RFPDF # # Example: # - # set_draw_color(ReportHelper::COLOR_PALETTE[:dark_blue]) + # set_draw_color_a(ReportHelper::COLOR_PALETTE[:dark_blue]) # - def set_draw_color(color = COLOR_PALETTE[:black]) + def set_draw_color_a(color = Core::RFPDF::COLOR_PALETTE[:black]) SetDrawColor(color[0], color[1], color[2]) end @@ -200,20 +254,28 @@ module RFPDF # # Example: # - # set_fill_color(ReportHelper::COLOR_PALETTE[:dark_blue]) + # set_fill_color_a(ReportHelper::COLOR_PALETTE[:dark_blue]) # - def set_fill_color(color = COLOR_PALETTE[:white]) - SetFillColor(color[0], color[1], color[2]) + def set_fill_color_a(color = Core::RFPDF::COLOR_PALETTE[:white], colorspace = :rgb) + if colorspace == :cmyk + SetCmykFillColor(color[0], color[1], color[2], color[3]) + else + SetFillColor(color[0], color[1], color[2]) + end end # Set the text color. Default value is COLOR_PALETTE[:white]. # # Example: # - # set_text_color(ReportHelper::COLOR_PALETTE[:dark_blue]) + # set_text_color_a(ReportHelper::COLOR_PALETTE[:dark_blue]) # - def set_text_color(color = COLOR_PALETTE[:black]) - SetTextColor(color[0], color[1], color[2]) + def set_text_color_a(color = Core::RFPDF::COLOR_PALETTE[:black], colorspace = :rgb) + if colorspace == :cmyk + SetCmykTextColor(color[0], color[1], color[2], color[3]) + else + SetTextColor(color[0], color[1], color[2]) + end end # Write a string containing html characters. Default value is COLOR_PALETTE[:white]. @@ -223,124 +285,14 @@ module RFPDF # # Example: # - # write_html(html, :height => 12) + # write_html_with_options(html, :height => 12) # - def write_html(html, options = {}) + #FIXME 2007-08-07 (EJM) Level=0 - This needs to call the TCPDF version. + def write_html_with_options(html, options = {}) + options[:fill] ||= 0 options[:height] ||= 20 - #HTML parser - @href = nil - @style = {} - html.gsub!("\n",' ') - re = %r{ ( | - < (?: - [^<>"] + - | - " (?: \\. | [^\\"]+ ) * " - ) * - > - ) }xm - - html.split(re).each do |value| - if "<" == value[0,1] - #Tag - if (value[1, 1] == '/') - close_tag(value[2..-2], options) - else - tag = value[1..-2] - open_tag(tag, options) - end - else - #Text - if @href - put_link(@href,value) - else - Write(options[:height], value) - end - end - end - end - - def open_tag(tag, options = {}) #:nodoc: - #Opening tag - tag = tag.to_s.upcase - set_style(tag, true) if tag == 'B' or tag == 'I' or tag == 'U' - @href = options['HREF'] if tag == 'A' - Ln(options[:height]) if tag == 'BR' - end - - def close_tag(tag, options = {}) #:nodoc: - #Closing tag - tag = tag.to_s.upcase - set_style(tag, false) if tag == 'B' or tag == 'I' or tag == 'U' - @href = '' if $tag == 'A' - end - - def set_style(tag, enable = true) #:nodoc: - #Modify style and select corresponding font - style = "" - @style[tag] = enable - ['B','I','U'].each do |s| - style += s if not @style[s].nil? and @style[s] - end - SetFont('', style) - end - - def put_link(url, txt) #:nodoc: - #Put a hyperlink - SetTextColor(0,0,255) - set_style('U',true) - Write(5, txt, url) - set_style('U',false) - SetTextColor(0) + options[:new_line_after] ||= false + write_html(html, options[:new_line_after], options[:fill], options[:height]) + return end -end - -# class FPDF -# alias_method :set_margins , :SetMargins -# alias_method :set_left_margin , :SetLeftMargin -# alias_method :set_top_margin , :SetTopMargin -# alias_method :set_right_margin , :SetRightMargin -# alias_method :set_auto_pagebreak , :SetAutoPageBreak -# alias_method :set_display_mode , :SetDisplayMode -# alias_method :set_compression , :SetCompression -# alias_method :set_title , :SetTitle -# alias_method :set_subject , :SetSubject -# alias_method :set_author , :SetAuthor -# alias_method :set_keywords , :SetKeywords -# alias_method :set_creator , :SetCreator -# alias_method :set_draw_color , :SetDrawColor -# alias_method :set_fill_color , :SetFillColor -# alias_method :set_text_color , :SetTextColor -# alias_method :set_line_width , :SetLineWidth -# alias_method :set_font , :SetFont -# alias_method :set_font_size , :SetFontSize -# alias_method :set_link , :SetLink -# alias_method :set_y , :SetY -# alias_method :set_xy , :SetXY -# alias_method :get_string_width , :GetStringWidth -# alias_method :get_x , :GetX -# alias_method :set_x , :SetX -# alias_method :get_y , :GetY -# alias_method :accept_pagev_break , :AcceptPageBreak -# alias_method :add_font , :AddFont -# alias_method :add_link , :AddLink -# alias_method :add_page , :AddPage -# alias_method :alias_nb_pages , :AliasNbPages -# alias_method :cell , :Cell -# alias_method :close , :Close -# alias_method :error , :Error -# alias_method :footer , :Footer -# alias_method :header , :Header -# alias_method :image , :Image -# alias_method :line , :Line -# alias_method :link , :Link -# alias_method :ln , :Ln -# alias_method :multi_cell , :MultiCell -# alias_method :open , :Open -# alias_method :Open , :open -# alias_method :output , :Output -# alias_method :page_no , :PageNo -# alias_method :rect , :Rect -# alias_method :text , :Text -# alias_method :write , :Write -# end +end \ No newline at end of file diff --git a/vendor/plugins/rfpdf/lib/core/rmagick.rb b/vendor/plugins/rfpdf/lib/core/rmagick.rb new file mode 100644 index 00000000..e8f5e141 --- /dev/null +++ b/vendor/plugins/rfpdf/lib/core/rmagick.rb @@ -0,0 +1,64 @@ +# The MIT License +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +# This implements native php methods used by tcpdf, which have had to be +# reimplemented within Ruby. + +module RFPDF + + # http://uk2.php.net/getimagesize + def getimagesize(filename) + image = Magick::ImageList.new(filename) + + out = Hash.new + out[0] = image.columns + out[1] = image.rows + + # These are actually meant to return integer values But I couldn't seem to find anything saying what those values are. + # So for now they return strings. The only place that uses this at the moment is the parsejpeg method, so I've changed that too. + case image.mime_type + when "image/gif" + out[2] = "GIF" + when "image/jpeg" + out[2] = "JPEG" + when "image/png" + out[2] = "PNG" + when " image/vnd.wap.wbmp" + out[2] = "WBMP" + when "image/x-xpixmap" + out[2] = "XPM" + end + out[3] = "height=\"#{image.rows}\" width=\"#{image.columns}\"" + out['mime'] = image.mime_type + + # This needs work to cover more situations + # I can't see how to just list the number of channels with ImageMagick / rmagick + if image.colorspace.to_s == "CMYKColorspace" + out['channels'] = 4 + elsif image.colorspace.to_s == "RGBColorspace" + out['channels'] = 3 + end + + out['bits'] = image.channel_depth + + out + end + +end \ No newline at end of file diff --git a/vendor/plugins/rfpdf/lib/fonts/.noencode b/vendor/plugins/rfpdf/lib/fonts/.noencode new file mode 100755 index 00000000..e69de29b diff --git a/vendor/plugins/rfpdf/lib/fonts/FreeMono.ctg.z b/vendor/plugins/rfpdf/lib/fonts/FreeMono.ctg.z new file mode 100755 index 00000000..07f15d5c Binary files /dev/null and b/vendor/plugins/rfpdf/lib/fonts/FreeMono.ctg.z differ diff --git a/vendor/plugins/rfpdf/lib/fonts/FreeMono.z b/vendor/plugins/rfpdf/lib/fonts/FreeMono.z new file mode 100755 index 00000000..08ff94d7 Binary files /dev/null and b/vendor/plugins/rfpdf/lib/fonts/FreeMono.z differ diff --git a/vendor/plugins/rfpdf/lib/fonts/FreeMonoBold.ctg.z b/vendor/plugins/rfpdf/lib/fonts/FreeMonoBold.ctg.z new file mode 100755 index 00000000..529813d5 Binary files /dev/null and b/vendor/plugins/rfpdf/lib/fonts/FreeMonoBold.ctg.z differ diff --git a/vendor/plugins/rfpdf/lib/fonts/FreeMonoBold.z b/vendor/plugins/rfpdf/lib/fonts/FreeMonoBold.z new file mode 100755 index 00000000..6a42eebd Binary files /dev/null and b/vendor/plugins/rfpdf/lib/fonts/FreeMonoBold.z differ diff --git a/vendor/plugins/rfpdf/lib/fonts/FreeMonoBoldOblique.ctg.z b/vendor/plugins/rfpdf/lib/fonts/FreeMonoBoldOblique.ctg.z new file mode 100755 index 00000000..f8b2d722 Binary files /dev/null and b/vendor/plugins/rfpdf/lib/fonts/FreeMonoBoldOblique.ctg.z differ diff --git a/vendor/plugins/rfpdf/lib/fonts/FreeMonoBoldOblique.z b/vendor/plugins/rfpdf/lib/fonts/FreeMonoBoldOblique.z new file mode 100755 index 00000000..ceb97771 Binary files /dev/null and b/vendor/plugins/rfpdf/lib/fonts/FreeMonoBoldOblique.z differ diff --git a/vendor/plugins/rfpdf/lib/fonts/FreeMonoOblique.ctg.z b/vendor/plugins/rfpdf/lib/fonts/FreeMonoOblique.ctg.z new file mode 100755 index 00000000..d9d3189c Binary files /dev/null and b/vendor/plugins/rfpdf/lib/fonts/FreeMonoOblique.ctg.z differ diff --git a/vendor/plugins/rfpdf/lib/fonts/FreeMonoOblique.z b/vendor/plugins/rfpdf/lib/fonts/FreeMonoOblique.z new file mode 100755 index 00000000..dc879ea2 Binary files /dev/null and b/vendor/plugins/rfpdf/lib/fonts/FreeMonoOblique.z differ diff --git a/vendor/plugins/rfpdf/lib/fonts/FreeSans.ctg.z b/vendor/plugins/rfpdf/lib/fonts/FreeSans.ctg.z new file mode 100755 index 00000000..8b70df1c Binary files /dev/null and b/vendor/plugins/rfpdf/lib/fonts/FreeSans.ctg.z differ diff --git a/vendor/plugins/rfpdf/lib/fonts/FreeSans.z b/vendor/plugins/rfpdf/lib/fonts/FreeSans.z new file mode 100755 index 00000000..b7fffac8 Binary files /dev/null and b/vendor/plugins/rfpdf/lib/fonts/FreeSans.z differ diff --git a/vendor/plugins/rfpdf/lib/fonts/FreeSansBold.ctg.z b/vendor/plugins/rfpdf/lib/fonts/FreeSansBold.ctg.z new file mode 100755 index 00000000..f8d288a0 Binary files /dev/null and b/vendor/plugins/rfpdf/lib/fonts/FreeSansBold.ctg.z differ diff --git a/vendor/plugins/rfpdf/lib/fonts/FreeSansBold.z b/vendor/plugins/rfpdf/lib/fonts/FreeSansBold.z new file mode 100755 index 00000000..312eab60 Binary files /dev/null and b/vendor/plugins/rfpdf/lib/fonts/FreeSansBold.z differ diff --git a/vendor/plugins/rfpdf/lib/fonts/FreeSansBoldOblique.ctg.z b/vendor/plugins/rfpdf/lib/fonts/FreeSansBoldOblique.ctg.z new file mode 100755 index 00000000..b843f234 Binary files /dev/null and b/vendor/plugins/rfpdf/lib/fonts/FreeSansBoldOblique.ctg.z differ diff --git a/vendor/plugins/rfpdf/lib/fonts/FreeSansBoldOblique.z b/vendor/plugins/rfpdf/lib/fonts/FreeSansBoldOblique.z new file mode 100755 index 00000000..f9131c33 Binary files /dev/null and b/vendor/plugins/rfpdf/lib/fonts/FreeSansBoldOblique.z differ diff --git a/vendor/plugins/rfpdf/lib/fonts/FreeSansOblique.ctg.z b/vendor/plugins/rfpdf/lib/fonts/FreeSansOblique.ctg.z new file mode 100755 index 00000000..35f90ff2 Binary files /dev/null and b/vendor/plugins/rfpdf/lib/fonts/FreeSansOblique.ctg.z differ diff --git a/vendor/plugins/rfpdf/lib/fonts/FreeSansOblique.z b/vendor/plugins/rfpdf/lib/fonts/FreeSansOblique.z new file mode 100755 index 00000000..c55489e2 Binary files /dev/null and b/vendor/plugins/rfpdf/lib/fonts/FreeSansOblique.z differ diff --git a/vendor/plugins/rfpdf/lib/fonts/README.z b/vendor/plugins/rfpdf/lib/fonts/README.z new file mode 100755 index 00000000..e3a3ce9a --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/README.z @@ -0,0 +1,2 @@ +This folder contains fonts descriptions for TCPDF. +Please read the documentation on subfolders for copyright, license and other information. \ No newline at end of file diff --git a/vendor/plugins/rfpdf/lib/fonts/courier.rb b/vendor/plugins/rfpdf/lib/fonts/courier.rb new file mode 100755 index 00000000..fc398e8b --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/courier.rb @@ -0,0 +1,25 @@ +TCPDFFontDescriptor.define('courier') do |font| + font[:cw] = {} + 0.upto(255) do |i| + font[:cw][i]=600 + end +end +TCPDFFontDescriptor.define('courierb') do |font| + font[:cw] = {} + 0.upto(255) do |i| + font[:cw][i]=600 + end +end +TCPDFFontDescriptor.define('courierbi') do |font| + font[:cw] = {} + 0.upto(255) do |i| + font[:cw][i]=600 + end +end +TCPDFFontDescriptor.define('courieri') do |font| + font[:cw] = {} + 0.upto(255) do |i| + font[:cw][i]=600 + end +end + diff --git a/vendor/plugins/rfpdf/lib/fonts/dejavu-ttf-2.15/AUTHORS b/vendor/plugins/rfpdf/lib/fonts/dejavu-ttf-2.15/AUTHORS new file mode 100755 index 00000000..3c84aa2c --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/dejavu-ttf-2.15/AUTHORS @@ -0,0 +1,38 @@ +Adrian Schroeter +Andrey Valentinovich Panov +Ben Laenen +Bhikkhu Pesala +Clayborne Arevalo +Dafydd Harries +Danilo Segan +Davide Viti +David Jez +David Lawrence Ramsey +Denis Jacquerye +Dwayne Bailey +Eugeniy Meshcheryakov +Gee Fung Sit +Heikki Lindroos +James Cloos +James Crippen +John Karp +Keenan Pepper +Lars Naesbye Christensen +Mashrab Kuvatov +Mederic Boquien +Michael Everson +Misu Moldovan +Nguyen Thai Ngoc Duy +Ognyan Kulev +Ondrej Koala Vacha +Peter Cernak +Remy Oudompheng +Roozbeh Pournader +Sander Vesik +Stepan Roh +Tavmjong Bah +Tim May +Valentin Stoykov +Vasek Stodulka + +$Id: AUTHORS 1491 2007-01-12 20:40:12Z ben_laenen $ diff --git a/vendor/plugins/rfpdf/lib/fonts/dejavu-ttf-2.15/BUGS b/vendor/plugins/rfpdf/lib/fonts/dejavu-ttf-2.15/BUGS new file mode 100755 index 00000000..1be10b82 --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/dejavu-ttf-2.15/BUGS @@ -0,0 +1,3 @@ +See http://dejavu.sourceforge.net/wiki/index.rb/Bugs + +$Id: BUGS 80 2004-11-13 13:12:02Z src $ diff --git a/vendor/plugins/rfpdf/lib/fonts/dejavu-ttf-2.15/LICENSE b/vendor/plugins/rfpdf/lib/fonts/dejavu-ttf-2.15/LICENSE new file mode 100755 index 00000000..635e609c --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/dejavu-ttf-2.15/LICENSE @@ -0,0 +1,98 @@ +Fonts are (c) Bitstream (see below). DejaVu changes are in public domain. Glyphs imported from Arev fonts are (c) Tavmjung Bah (see below) + +Bitstream Vera Fonts Copyright +------------------------------ + +Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is +a trademark of Bitstream, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of the fonts accompanying this license ("Fonts") and associated +documentation files (the "Font Software"), to reproduce and distribute the +Font Software, including without limitation the rights to use, copy, merge, +publish, distribute, and/or sell copies of the Font Software, and to permit +persons to whom the Font Software is furnished to do so, subject to the +following conditions: + +The above copyright and trademark notices and this permission notice shall +be included in all copies of one or more of the Font Software typefaces. + +The Font Software may be modified, altered, or added to, and in particular +the designs of glyphs or characters in the Fonts may be modified and +additional glyphs or characters may be added to the Fonts, only if the fonts +are renamed to names not containing either the words "Bitstream" or the word +"Vera". + +This License becomes null and void to the extent applicable to Fonts or Font +Software that has been modified and is distributed under the "Bitstream +Vera" names. + +The Font Software may be sold as part of a larger software package but no +copy of one or more of the Font Software typefaces may be sold by itself. + +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, +TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME +FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING +ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE +FONT SOFTWARE. + +Except as contained in this notice, the names of Gnome, the Gnome +Foundation, and Bitstream Inc., shall not be used in advertising or +otherwise to promote the sale, use or other dealings in this Font Software +without prior written authorization from the Gnome Foundation or Bitstream +Inc., respectively. For further information, contact: fonts at gnome dot +org. + +Arev Fonts Copyright +------------------------------ + +Copyright (c) 2006 by Tavmjong Bah. All Rights Reserved. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of the fonts accompanying this license ("Fonts") and +associated documentation files (the "Font Software"), to reproduce +and distribute the modifications to the Bitstream Vera Font Software, +including without limitation the rights to use, copy, merge, publish, +distribute, and/or sell copies of the Font Software, and to permit +persons to whom the Font Software is furnished to do so, subject to +the following conditions: + +The above copyright and trademark notices and this permission notice +shall be included in all copies of one or more of the Font Software +typefaces. + +The Font Software may be modified, altered, or added to, and in +particular the designs of glyphs or characters in the Fonts may be +modified and additional glyphs or characters may be added to the +Fonts, only if the fonts are renamed to names not containing either +the words "Tavmjong Bah" or the word "Arev". + +This License becomes null and void to the extent applicable to Fonts +or Font Software that has been modified and is distributed under the +"Tavmjong Bah Arev" names. + +The Font Software may be sold as part of a larger software package but +no copy of one or more of the Font Software typefaces may be sold by +itself. + +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL +TAVMJONG BAH BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. + +Except as contained in this notice, the name of Tavmjong Bah shall not +be used in advertising or otherwise to promote the sale, use or other +dealings in this Font Software without prior written authorization +from Tavmjong Bah. For further information, contact: tavmjong @ free +. fr. + +$Id: LICENSE 778 2006-04-20 18:14:24Z moyogo $ diff --git a/vendor/plugins/rfpdf/lib/fonts/dejavu-ttf-2.15/NEWS b/vendor/plugins/rfpdf/lib/fonts/dejavu-ttf-2.15/NEWS new file mode 100755 index 00000000..ce76669b --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/dejavu-ttf-2.15/NEWS @@ -0,0 +1,789 @@ +Changes from 2.14 to 2.15 + +- improved hinting in Sans Oblique to deal with some spacing and inconsistency + issues (by Ben Laenen) +- added anchors to Mono Book, and added GPOS rules for combining diacritics to + show up as zero width glyphs (by Ben Laenen) +- removed U+F21C (PUA), it was copy of U+2C64 from Latin Extended C (by Eugeniy + Meshcheryakov) +- added U+27E6-U+27E7 to Sans (by Gee Fung Sit) +- added U+1407, U+1409, U+140C-U+141B, U+141D-U+1425, U+1427-U+142E, + U+1435-U+1438, U+143A-U+1449, U+1452, U+1454, U+1457-U+1465, U+1467-U+146A, + U+1471, U+1474-U+1482, U+1484-U+1488, U+148F, U+1492, U+14A0, U+14A2, U+14A9, + U+14AC-U+14BA, U+14BC, U+14BD, U+14C6, U+14C9-U+14CF, U+14D1, U+14D2, U+14D9, + U+14DC-U+14E9, U+14EC, U+14F3, U+14F6-U+1504, U+1506, U+1507, U+1510-U+1525, + U+152C, U+152F-U+153D, U+1540, U+1541, U+154E, U+154F, U+1552, U+155B, U+155C, + U+1568, U+1569, U+1574-U+157B, U+157D, U+15A7-U+15AE, U+1646, U+1647 (by + Eugeniy Meshcheryakov) +- fixed several contours to not intersect, use horizontal or vertical tangents, + use integer coordinates, etc in Sans Book (by Denis Jacquerye) +- added U+0496-U+0497 in Serif (by Andrey V. Panov) + +Changes from 2.13 to 2.14 + +- added Philippine peso glyph U+20B1 (by Clayborne Arevalo) +- made U+2012 have the same width as digits, according to Unicode 5.0, + page 206 (by Roozbeh Pournader) +- made all of the "above" combining characters remove the dot of "i", + "j", etc (Soft_Dotted characters), according to Unicode 5.0, + page 228 (by Roozbeh Pournader) +- made U+012F, U+03F3, U+0456, U+0458, U+1E2D, and U+1ECB (all fonts + except Mono), U+0249, U+2148, and U+2149 (Sans and Sans Condensed), + U+0268 (Sans ExtraLight, Serif and Serif Condensed), and U+029D (Serif + and Serif Condensed) respect the Soft_Dotted property (by Roozbeh + Pournader) +- added U+223E, U+223F, U+2240, U+22C2, U+22C3 to Sans (by Rémy Oudompheng) +- added U+203D to Serif (by Gee Fung Sit) +- added zero-width glyphs for U+2061-U+2063 to Sans and Serif (by Gee + Fung Sit) +- changed isolated forms of Arabic waw (U+0648, U+0624 and U+06C6) (bug #9432) + (by Ben Laenen) +- added Lao consonants U+0E81, U+0E82, U+0E84, U+0E87, U+0E88, U+0E8A, + U+0E8D, U+0E94-0E97, U+0E99-0E9F, U+0EA1-0EA3, U+0EA5, U+0EA7, U+0EAA, + U+0EAB, U+0EAD-0EAF to Sans Mono (by Rémy Oudompheng) +- added U+0200-U+0217, U+0226-U+0229, U+02F3, U+1E00-U+1E07, + U+1E0A-U+1E0B, U+1E18-U+1E1F, U+1E22-U+1E23, U+1E28-U+1E2D, + U+1E3A-U+1E3B, U+1E40, U+1E48-U+1E49, U+1E56, U+1E58-U+1E59, + U+1E5E-U+1E5F, U+1E60, U+1E68-U+1E6B, U+1E6E-U+1E6F, U+1E72-U+1E77, + U+1E86-U+1E8B, U+1E92-U+1E96, U+1EA0-U+1EA1, U+1EF4-U+1EF5 to Mono + (by Ben Laenen) +- renamed uppercase variants of diacritics (macron, breve, double grave, + double acute, inverted breve, dot above) to "uni03XX.case" in Mono + (by Ben Laenen) +- moved uppercase variants of diacritics up in Mono so they properly + vertically align on capitals (by Ben Laenen) +- precomposed glyphs with macron, breve, double grave, double acute, + inverted breve, dot above, macron below, breve below, inverted breve + below, dot below, cedilla, caron below, circumflex below, diaeresis + below, tilde below now reference to combining diacritics instead of + space modifiers in Mono (by Ben Laenen) +- made ring below (U+0325), and half rings below (U+031C and U+0339) + smaller in Mono (by Ben Laenen) +- added U+205F to all fonts (by Roozbeh Pournader) +- added U+035E-U+035F to Sans (by Roozbeh Pournader) +- added empty glyphs for U+034F, U+202A-U+202E, U+2060, U+206A-206F, + U+FE00-U+FE0F to non-Mono fonts (by Roozbeh Pournader) +- added U+2101, U+2107-U+2108, U+210B, U+210C, U+2110, U+2112, U+211B, + U+211F, U+2123, U+2125, U+2128-U+2129, U+212C-U+212D, U+212F, + U+2130-U+2131, U+2133, U+2136-U+213A, U+2141-U+2144, U+2B00-U+2B11, + U+2B20-U+2B23 to Sans (by John Karp) +- reshaped omega (U+03C9) in Mono (by Ben Laenen) +- added U+2205, U+22C6, U+2300-U+2301, U+2303-U+2306, U+230C-U+230F, + U+2312-U+2315, U+231C-U+231F, U+2335, U+2337-U+233E, U+2341-U+2344, + U+2347-U+2348, U+234B-U+234D, U+2349-U+2350, U+2352-U+2354, + U+2357-U+2359, U+235A-U+235C, U+235E-U+2360, U+2363-U+2365, + U+2368-U+2369, U+236B-U+2370, U+2373-U+237A, U+2380-U+2383, + U+2388-U+238B, U+2395 in Mono (by Ben Laenen) + +Changes from 2.12 to 2.13 + +- adjusted U+0198B, U+01B3-U+01B4 in Sans, hinted U+01B4 in Sans Book + (by Denis Jacquerye) +- added U+27F0-U+27FF, U+2906-U+2907, U+290A-U+290B, U+2940-U+2941 to Sans + (by Denis Jacquerye) +- added U+01E6-U+01E9, U+01EE-U+01EF, U+01F4-U+01F5, U+01FC-U+01FF, + U+021E-U+021F, U+0245, U+02BD, U+02C9, U+1E9B, U+2045-U+2046, U+2213, U+22C5, + U+22EF to Sans Mono (by Roozbeh Pournader) +- added U+04FA-U+04FD to Sans (by Michael Everson) +- removed U+2329 and U+232A because of their CJK properties, added U+27E8 + and U+27E9 in their stead, fixing part of bug #9038 (by Roozbeh Pournader) +- corrected and improvised U+0466-U+0469, U+046E-U+0471, U+047C-U+047D, U+0482, + U+0484-U+0486, U+0492-U+0493, U+04B0-U+04B1, U+050C-U+050D, and U+204A + in Sans (by Michael Everson) +- added instructions for U+0402, U+0409, U+040A, U+040B, U+044D, U+040F, + U+0452, U+0459-U+045B, U+045F to Sans Book (by Eugeniy Meshcheryakov) +- made italic shape for U+431, U+432, U+437, U+43B, U+43C, U+43D, U+444, U+447, + U+44D, U+44F, U+459, U+45A in SerifOblique and SerifBoldOblique + (by Andrey V. Panov) +- modified U+024C to match glyph in Unicode chart, fixing bug #9039 + (by Denis Jacquerye) +- made some canonically equivalent characters share the same glyph: + U+02B9 = U+0374, U+0343 = U+0313, and U+0387 = U+00B7 also adjusting U+02BA + to look like double U+02B9, fixing parts of bug #9038 (by Roozbeh Pournader) +- changed shapes for U+0478 and U+0479 in Sans to those in the Unicode charts, + based on a recent decision by Unicode Technical Committee to only use + the digraph form (by Michael Everson) +- adjusted width of NBSP U+00A0 and NNBSP U+202F, fixing bug #8401 + (by Denis Jacquerye) +- fixed several contours to not intersect, use horizontal or vertical tangents, + use integer coordinates, etc (by Roozbeh Pournader and Denis Jacquerye) +- added U+1402, U+1430, U+144D, U+146C, U+148A, U+14A4, U+14C1, U+14D4, U+14EE, + U+1527, U+1545, U+157E, U+158E, U+15AF to Sans (by Eugeniy Meshcheryakov) +- enlarged width of U+459 and U+45A in Serif (by Andrey V. Panov) +- made traditional shape for U+452, U+45B (by Andrey V. Panov) +- added euro sign U+20AC to Sans ExtraLight, making fontconfig recognize + the font as supporting English (by Denis Jacquerye) + +Changes from 2.11 to 2.12 + +- added U+0180 to Serif (by Denis Jacquerye) +- improved and/or hinted Armenian letters U+0542, U+0546, U+0562, + U+0563, U+0564, U+0577, U+0582 in Sans (by Ben Laenen) +- added U+4FE-U+4FF, U+512-U+513, U+2114, U+214E, U+26B2 to Sans + (by Gee Fung Sit) +- adjusted U+0496-U+0497, U+049A-U+04A1 in Sans to match U+0416, + U+041A, U+0436 and U+043A (by Gee Fung Sit) +- Mathematical Operators in Sans: changed U+22C0-U+22C1 to match + other n-ary operators, adjusted U+2203-U+2204, changed U+2220 in + Sans to match the style of U+2221 (by Gee Fung Sit) +- added U+1401, U+1403-U+1406, U+140A, U+140B, U+1426, U+142F, + U+1431-U+1434, U+1438, U+1439, U+1449, U+144A, U+144C, + U+144E-U+1451, U+1455, U+1456, U+1466, U+146B, U+146D-U+1470, + U+1472, U+1473, U+1483, U+1489, U+148B-U+148E, U+1490, U+1491, + U+14A1, U+14A3, U+14A5-U+14A8, U+14AA, U+14AB, U+14BB, U+14C0, + U+14C2-U+14C5, U+14C7, U+14C8, U+14D0, U+14D3, U+14D5-U+14D8, + U+14DA, U+14DB, U+14EA, U+14ED, U+14EF-U+14F2, U+14F4, U+14F5, + U+1405, U+1526, U+1528-U+152B, U+152D, U+152E, U+153E, + U+1542-U+1544, U+1546-U+154D, U+1550, U+1553, U+1555-U+155A, + U+1567, U+156A, U+157C, U+157F-U+1585, U+158A-U+158D, + U+158F-U+1596, U+15A0-U+15A6, U+15DE, U+15E1, U+166E-U+1676 to + Sans (by Eugeniy Meshcheryakov) +- re-enabled Latin ligatures fi, ffi, fl, ffl and ff in Sans + (by Ben Laenen) +- made italic shape for U+436, U+44A, U+44B, U+44C, U+44E, U+45F, + U+463 in SerifOblique and SerifBoldOblique (by Andrey V. Panov) +- fixed sub- and superscript metrics in Condensed Sans (bug #8848) + (by Ben Laenen) +- added U+474, U+475 in Serif (by Andrey V. Panov) +- hinted Greek glyphs U+03B7, U+30B8, U+03B9, U+03C1, U+03C3, + U+03C6 in Mono Book (by Ben Laenen) + +Changes from 2.10 to 2.11 + +- added instructions for Hebrew glyphs (Sans Book, by Eugeniy + Meshcheryakov) +- changed U+01A6 (Latin Yr) after bug #8212, in Sans, Serif and + Sans Mono fonts (by Denis Jacquerye). +- removed instruction for U+2600-U+26A1 (by Mederic Boquien) +- added U+202F and set width of U+00A0 (nobreakingspace) to the + same as U+0020, space (by Denis Jacquerye). +- added and improved instructions for various Cyrillic letters + (by Eugeniy Meshcheryakov) +- Changed U+416, U+42F, U+427 (non-Bold), U+436, U+447 (non-Bold), + U+44F, U+437 (Bold), corrected U+40F, U+414, U+424, U+426, U+429, + U+434, U+438 (Bold), U+446, U+449, U+44D (non-Bold), U+45F in + Sans Mono (by Andrey V. Panov) +- made small corrections to Cyrillic, most appreciable to U+409, + U+413, U+41B, U+427 and U+433, U+434, U+43B, U+447, U+459 + (upright fonts) to Serif (by Andrey V. Panov) +- adjusted bearings of U+410, U+416, U+41A, U+42F, U+436, U+43A, + U+443, U+44F in Serif (by Andrey V. Panov) +- enlarged width of U+44A, U+44B, U+44C, U+463 in Serif + (by Andrey V. Panov) +- added ligature "iacute" as "afii10103" (U+456) "acutecomb" in + Serif (by Andrey V. Panov) +- made italic shape to U+446, U+448, U+449 in Serif (by Andrey V. + Panov) +- added "afii10831" (U+F6C7), "afii10832" (U+F6C8) in Serif (by + Andrey V. Panov) +- new minimum version of fontforge is 20061014 (by Ben Laenen) + +Changes from 2.9 to 2.10: + +- added U+0242, U+024A-U+024B, U+024E-U+024F, U+037C-U+037D, U+0E3F, + U+1D2C-U+1D2E, U+1D30-U+1D42, U+1D5D-U+1D6A, U+1D78, U+1DB8, + U+2090-U+2094, U+20D0-U+20D1, U+2C60-U+2C66, U+2C6B-U+2C6C, U+2C74 and + U+FB29 to Sans (by Gee Fung Sit) +- added Lao glyphs : U+0E81-0E82, U+E084, U+0E87-0E88, U+0E8A, U+0E8D, + U+0E94-0E97, U+0E99-0E9F, U+0EA1-0EA3, U+0EA5, U+0EA7, U+0EAA-0EAB, + U+0EAD-0EB9, U+0EBB-0EBD, U+0EC0-0EC4, U+0EC6, U+0EC8-0ECD, U+0EDC-0EDD + (by Rémy Oudompheng) +- fixed U+0193 not showing in Windows (bug #7897) (by Ben Laenen) +- changes to U+222B-222D in Sans Mono (by Rémy Oudompheng) +- ported the three remaining currency symbols from Arev (U+20B0, + U+20B2-U+20B3), and replaced one (U+20AF) in Sans (by Lars Naesbye + Christensen) +- corrected U+20A5 in Sans (by Gee Fung Sit) +- merged Double-Struck Letters from Arev: U+2102, U+210D, U+2115, + U+2119-U+211A, U+2124, U+213C-U+2140 (by Gee Fung Sit) +- added U+2308-U+230B and U+2329-U+232A to Sans Mono and Serif faces, + fixed incorrect direction of U+2329 in Sans faces, and improved + U+2308-U+230B in Sans faces per Ben Laenen's suggestions (by David + Lawrence Ramsey) +- added U+06D5 and final form of it (needed for Kurdish) (by Ben Laenen) +- added two special glyphs U+F000 and U+F001 in Sans Book that show the + current ppem size (horizontal and vertical) (by Ben Laenen) +- added U+2318 and U+2325 to Sans Mono faces, based on the Sans versions + (by David Lawrence Ramsey) +- added U+2B14-U+2B1A to all faces except Sans ExtraLight (by David + Lawrence Ramsey) +- respaced all Geometric Shapes characters in Serif faces to match those + in Sans faces again, respaced U+23CF in Sans, Sans ExtraLight, and + Serif faces to match U+25A0 (or Sans in Sans ExtraLight's case) again, + and respaced U+2B12-U+2B13 in Sans and Serif faces to match U+25A1 + again (by David Lawrence Ramsey) +- corrected width of Modifier Small Letters U+1D43-1D5B in Sans Oblique + and U+1D9B-U+1DBF in Sans Oblique and Sans Bold Oblique (by Gee Fung Sit) +- added a bunch of glyphs to Sans ExtraLight (see SVN for details) (by + Gee Fung Sit) +- adjusted Cyrillic descenders in Sans ExtraLight to sync with Sans (by + Gee Fung Sit) +- added U+0242, U+0245 to Serif (by Gee Fung Sit) +- replaced the SHPIX routines which gave them bad spacing at certain + sizes in FreeType for A, V, Z, v and z in Sans Bold (by Ben Laenen) + +Changes from 2.8 to 2.9: + +- DejaVuSansExtraLight.sfd: changed family name from "DejaVu Sans" to + "DejaVu Sans Light" (in case we add a Light weight variant), so legacy + apps that understand only 4 styles are happy. (by Denis Jacquerye) +- added Name ID 16, aka preferred family name, and Name ID 17, aka + preferred style name, so contemporary apps that understand more that 4 + styles can use big fonts families "DejaVu Sans" and "DejaVu Serif". For + those, Extralight and Condensed are just styles not different families. + (by Denis Jacquerye) +- added U+22B6-22BD, U+22C0-22C1, U+22D6-22D7 to Sans. (by Remy Oudompheng) +- added U+037B, U+2184, U+2C67-U+2C6A and U+2C75-U+2C77 to Sans (by Gee + Fung Sit) +- adjusted asteriskmath (U+2217) for consistency with other mathematical + operators in Sans (by Ben Laenen) +- hinted some Armenian capitals in Sans Book (by Ben Laenen) +- added U+0246 - U+0249 (by Ben Laenen) +- BUGFIX : swapped U+224E and U+224F, in Sans, Sans Condensed and Sans Mono + (by Remy Oudompheng) +- adjusted U+20B5 (by Mederic Boquien) +- swapped U+21DA and U+21DB which were in wrong order (by Heikki Lindroos) +- added U+222E-2233, U+239B-23AD, U+2A00-2A02, U+2A0F-2A1C to Sans (by Remy + Oudompheng) +- added U+239B-23AD to Mono (by Remy Oudompheng) +- added U+2024-2025 to Serif (by Mederic Boquien) +- added U+222C-222D, U+2A0C-2A0E to Serif (by Remy Oudompheng) +- added U+2190-21FF to Mono (by Heikki Lindroos) +- added Hebrew glyphs - U+05B0-U+05BD, U+05BF-U+05C3, U+05C6, U+05C7, + U+05D0-U+05EA, U+05F0-U+05F2, U+FB1F, U+FB20, U+FB2A-U+FB36, + U+FB38-U+FB3C, U+FB3E, U+FB40, U+FB41, U+FB43, U+FB44, U+FB46-U+FB4E (by + Gee Fung Sit and Eugeniy Meshcheryakov) +- adjustments for Cyrillic in Sans (by Andrey V. Panov) +- made italic shape for U+0434, U+0456, U+0457 in SerifOblique and Serif + Bold Oblique (by Andrey V. Panov) + +Changes from 2.7 to 2.8: + +- fixed instructions for U+0423, U+0427, U+0447, U+0448 in Serif, so they + look good at large sizes too (by Eugeniy Meshcheryakov) +- added U+FB00 and U+FB03 to U+FB06 to Serif typefaces (by Heikki Lindroos) +- added U+26B0-U+26B1, U+2701-U+2704, U+2706-U+2709, U+270C-U+2727, U+2729 + to U+274B, U+274D, U+274F to U+2752, U+2756, U+2758-U+275E, U+2761 to + U+2775 (by Heikki Lindroos) +- added and improved instructions for Cyrillic letters in Mono and Serif + (Book, by Eugeniy Meshcheryakov) +- rotated U+26B0 (was too small in mono) (by Gee Fung Sit) +- adjusted U+1EDA-U+1EDD, U+1EE8-U+1EEB, capitals using capital specific + accent and moved diacritics to match position on U+00F2 (ograve), etc. + (by Denis Jacquerye) +- added U+20D6, U+20D7 to Sans (by Gee Fung Sit) +- made Armenian ligatures discretionary since the Firefox ligature problem + still isn't fixed (by Ben Laenen) +- moved Armenian hyphen U+058A to a higher position (bug #7436) (by Ben + Laenen) +- hinted Greek glyphs in Sans Bold (by Ben Laenen) +- enabled Arabic lam-alif ligatures when diacritics are used (by Ben Laenen) + +Changes from 2.6 to 2.7: + +- added glyphs needed for Kurdish: U+0695, U+06B5, U+06C6, U+06CE and their + init/medi/fina forms in Sans (by Ben Laenen) +- added U+02CD, U+01F8 - U+01F9, U+1E3E - U+1E3F, U+1E30 - U+1E35, U+1EBC - + U+1EBD, U+1EF8 - U+1EF9 (includes glyphs needed for Yoruba, Maori, Guarani + and Twi) (by Ben Laenen) +- added U+22C8-22CC, U+29CE-29D5, U+2A7D-2AA0, U+2AAE-2ABA, U+2AF9-2AFA to + Sans (by Remy Oudompheng) +- adjusted diacritics on Vietnamese, Pinyin and other characters: + U+01A0-U+01A1, U+01AF-U+01B0, U+01D5-U+01DC, U+01DE-01E1, U+01FA-U+01FB + U+022A-U+022D, U+0230-U+0231, U+1E14-U+1E17, U+1E4C-U+1E53, U+1E78-U+1E7B, + U+1EA4-U+1EF1 in Sans (Book, Bold and Oblique) (by Denis Jacquerye) +- added basic arrows U+2190-U+2193 in Serif, which completes MES-1 compliance + for Serif (by Ben Laenen) +- added U+01E4, U+01E5, U+01FA, U+01FB, U+02BD, U+02C9 and U+02EE to Serif + (by Ben Laenen) +- fixed U+0209 in Serif Bold Oblique (by Ben Laenen) +- adjusted Box Drawing block characters U+2500-257F in Mono to fit character + cell, shifting them up by 416 (Denis Jacquerye) +- redid U+0194 in Sans (by Ben Laenen) +- added U+2217-2218, U+2295-22A1 to Mono (by Remy Oudompheng) +- added U+0462 to Serif (by Andrey V. Panov) +- added U+226C, U+228C-228E, U+2293-2294, U+22F2-22FF to Sans (by Remy + Oudompheng) +- adjusted U+2208-220D in Sans (by Remy Oudompheng) +- improved some Cyrillic glyphs in Mono (by Andrey V. Panov), rewritten + instructions for changed glyphs (by Eugeniy Meshcheryakov) +- added U+1E0E-1E0F, U+1E8E-1E8F to Mono fonts (by Denis Jacquerye). (bug + #7166) +- renamed 'Dotabove' to 'Dotaccent' in Mono Sans Oblique to match other fonts + (by Denis Jacquerye). +- added U+200B-U+200F in Sans faces and Serif faces, U+200B and U+200C were + in Sans already (by Lars Naesbye Christensen) +- added U+2601-U+262F, U+263D, U+263E, U+2648-U+265F, U+2668, U+2670-U+268B, + U+2690-U+269C, U+26A0, U+26A1, U+2794, U+2798-U+27AF, U+27B1-U+27BE to Mono + (by Heikki Lindroos) +- replaced the references with unshifted ones for both κ U+03BA and к U+043A + in Mono Book (by Denis Jacquerye) +- fixing glyph for U+04ED in Mono Book, consisted only of dieresis (by Andrey + V. Panov). + +Changes from 2.5 to 2.6: + +- redid U+2032 - U+2037, U+2057 based on Arev in Sans (by Gee Fung Sit) +- added U+0195, corrected U+039E, U+204B in Sans ExtraLight (by Gee Fung Sit) +- added instructions for some Cyrillic letters in Sans Bold (by Eugeniy + Meshcheryakov) +- added vulgar fractions U+2153-U+215F for Serif, made with references (by + Lars Naesbye Christensen) +- added U+228F-2292, U+2299-22AF, U+22B2-22B5, U+22CD, U+22D8-22ED to Sans + (by Remy Oudompheng) +- added U+2208-220D, U+2238-223D, U+2278-2281, U+228A-228B, U+228F-2292, + U+22CD, U+22DA-22E9 to Mono (by Remy Oudompheng) +- fixed misplaced dot in U+2250 in Mono (by Remy Oudompheng) +- added instructions for some Cyrillic letters in Mono Book and Bold(by + Eugeniy Meshcheryakov) +- minor changes to U+2241, U+2261-2263, U+22A4, U+22A5 in Sans (by Remy + Oudompheng) +- added hinting instructions to lowercase Armenian glyphs in Sans Book (by + Ben Laenen) +- changed U+2208, U+220B to match U+2209 and U+220C in Sans Bold (by Remy + Oudompheng) +- added Braille patterns U+2800-U+28FF to Sans (by Mederic Boquien) +- added instructions for some Cyrillic letters in Serif Book (by Eugeniy + Meshcheryakov) +- renamed BoldOblique fonts to Bold Oblique in TTF Name as originally in + Bitstream Vera fonts (by Denis Jacquerye) +- added hinting instructions to some Latin-B Extended and IPA characters in + Sans Book (by Denis Jacquerye and Ben Laenen) +- adjusted bearings, replaced diacritics, hinted hook and horn for + Vietnamese in Sans Book (by Denis Jacquerye) +- made FAX, TM, TEL, etc. discritionary ligatures in Sans and Serif fonts + (by Denis Jacquerye) +- removed ligatures of precomposed characters in Sans and Serif fonts (by + Denis Jacquerye) +- added U+F208, U+F20A, U+F215-F217, U+F21A-F21B, U+F25F in PUA (from SIL's + PUA, probably in Unicode 5.0): U+0243, U+0244, U+0245, U+024C, U+024D, + U+2C64, (U+2C6D), (U+2C71) +- modified some glyphs in Serif Oblique to make them more italic (by Denis + Jacquerye) + +Changes from 2.4 to 2.5: + +- fixed excessive kerning bug that occurs with Pango (by Denis Jacquerye) +- added U+20AF to Sans and Serif (by Lars Naesbye Christensen) +- regenerated Condensed faces (by Ben Laenen) +- added U+035C-U+035D to Sans, fixed U+0361 (by Denis Jacquerye) +- integrated 255 characters from Arev fonts: Latin Extended-B, Spacing + Modifiers, Combining Diacritical Marks, Cyrillic, Cyrillic supplement, + General Punctuation, Letterlike Symbols, Arrows, Mathematical Operators, + Miscellaneous Technical, Dingbats, Alphabetic Presentation Forms (by Denis + Jacquerye) +- added basic Cyrillic and basic Greek to Sans ExtraLight (by Denis Jacquerye) +- added U+0498, U+049A, U+04AA, U+04AB, U+04AF to Serif (by Eugeniy + Meshcheryakov) +- added U+0494, U+0495, U+0498, U+0499, U+04AA, U+04AB, U+04C3, U+04C4, + U+04C7, U+04C8 to Mono (by Eugeniy Meshcheryakov) +- adjusted weight of U+0256, U+0257, U+0260, U+0272, U+0273, U+0277, U+029B, + U+02A0 and modifed U+028B and U+027A in Mono (by Denis Jacquerye) +- added U+2000-200A to Mono (by Denis Jacquerye) +- added vulgar fractions U+2153 - U+215F to Mono (by Gee Fung Sit) +- adapted metrics of Arabic glyphs so they stay above cut-off height in Sans + (by Ben Laenen) +- fixed mkmk anchors for Arabic diacritics so they stack properly in Sans (by + Ben Laenen) +- fixed weight of lowercase upsilon in Sans Bold, make small adjustment to + lowercase omega in Sans (by Ben Laenen) +- added U+210E (by Mederic Boquien) +- unslanted U+2201, U+221B and U+221C in Sans Oblique (by Mederic Boquien) +- added several mathematical relation symbols to Sans and Mono (U+2241-224C, + U+2250-2255, U+2260-2269, U+226E-2277, U+2282-2287) modified U+223C to match + other tildes, and U+2282-2284 to have the same shape. (by Remy Oudompheng) +- made U+2234-U+2237 refer to U+2219 instead of U+00B7 in Sans (by Mederic + Boquien) +- added U+2238-223B, U+226A-226B, U+2278-2281, U+2288-228B to Sans (by Remy + Oudompheng) +- unslanted and changed reference of U+22C5 from U+00B7 to U+2219 in Sans (by + Mederic Boquien) +- added U+224D-225F, U+226D, U+22C6 to Sans and unslanted U+2219 in Sans + Oblique. (by Remy Oudompheng) +- added U+224D-225F, U+226D to Mono, shifted U+2266-2269 higher upwards and + unslanted U+2219 in Oblique. (by Remy Oudompheng) +- merged Coptic glyphs from Arev 0.2 (by Lars Naesbye Christensen) +- fixed and adjusted various Cyrillic glyphs in Serif (by Andrey V. Panov) +- made fi, fl... ligatures discretionary ligatures (by Ben Laenen) + +Changes from 2.3 to 2.4: + +- added U+04A2, U+04A3, U+04AC - U+04AF, U+04BA, U+04BB, U+04C0 - + U+04C2, U+04CB, U+04CD, U+04D8 - U+04DF, U+04E2 - U+04E5, U+04E8 - U+04F5, + U+04F6 - U+04F9 to Mono (by Eugeniy Meshcheryakov) +- added U+048C, U+048D, U+0494, U+0495, U+049E - U+04A7, U+04AC - + U+04AE, U+04B4- U+04B7, U+04BA, U+04BB, U+04C0 - U+04C4, U+04C7, U+04C8, + U+04CB, U+04CC, U+04D8 - U+04DF, U+04E2 - U+04E5, U+04EC - U+04F9 to Serif + (by Eugeniy Meshcheryakov) +- added U+2134 to Sans (by Gee Fung Sit) +- added U+2080 - U+2089 to all faces (by Gee Fung Sit) +- several minor corrections to Sans (by Gee Fung Sit) +- major corrections to Sans Condensed (by Gee Fung Sit) +- corrected Superscripts and Subscripts in Sans (by Gee Fung Sit) +- corrected anchors of U+0316-U+0319 (by Denis Jacquerye) +- Verajja integrated (by Stepan Roh) +- copied U+2328, U+2600, U+2639-U+263C, U+263F-U+2647, U+2660-U+2667, + and U+2669-U+266F from Sans to Serif, and copied scaled-down versions of + them to Sans Mono (by David Lawrence Ramsey) +- added U+20B4 to all faces (by Eugeniy Meshcheryakov) +- added more minor positional adjustments to U+2638 in all faces to + match the other miscellaneous symbols in Verajja, and rescale it in Sans + Mono so that it looks better (by David Lawrence Ramsey) +- added U+2242, U+2243 and U+22A4 (by Mederic Boquien) +- corrected U+2245 in Sans (by Mederic Boquien) +- added U+0221, U+0234-0236 (by Denis Jacquerye) +- added in Arabic block to Sans: U+060C, U+0615, U+061B, U+061F, U+0621 +- U+063A, U+0640 - U+0655, U+0660 - U+066F, U+0679 - U+0687, U+0698, U+06A1, + U+06A9, U+06AF, U+06BA, U+06BF, U+06CC, U+06F0 - U+06F9 (by Ben Laenen) +- added in Arabic Presentation Forms A to Sans: U+FB52 - U+FB81, U+FB8A +- U+FB95, U+FB9E - U+FB9F, U+FBE8 - U+FBE9, U+FBFC - U+FBFF (by Ben Laenen) +- added complete Arabic Presentation Forms B to Sans: U+FE70 - U+FE74, + U+FE76 - U+FEFC, U+FEFF (by Ben Laenen) +- added complete Greek Extended block to Mono (by Ben Laenen) +- modified Greek capitals with tonos in Mono (by Ben Laenen) +- added U+01C4-01CC, U+01D5, U+01DE, U+01E0-U+01E1, U+01E6-U+01E9, + U+01EE-U+01F5, U+01F8-U+0217, U+021E-U+021F, U+0226-U+022A, U+022C to Serif + (by Denis Jacquerye) +- adjusted U+043B and U+044F in Serif (by Denis Jacquerye) +- added U+2000-U+200A (by Denis Jacquerye) +- added U+1E00-U+1E0B, U+1E0E-U+1E11, U+1E14-U+1E1C, U+1E1E-U+1E23, + U+1E26-U+1E2D, U+1E30-U+1E35, U+1E3A-U+1E3B, U+1E3E-U+1E40, U+1E48-U+1E49, + U+1E50-U+1E56, U+1E58-U+1E59, U+1E5E-U+1E60, U+1E68-U+1E6B, U+1E6E-U+1E6F, + U+1E72-U+1E7D, U+1E86-U+1E9B, U+1EA0-U+1EA3, U+1EAC-U+1EB7, U+1EBA-U+1EBD, + U+1EC6-U+1ECF, U+1ED8-U+1ED9, U+1EE6-U+1EE7, U+1EF4-U+1EF9 to Serif (by + Denis Jacquerye) +- added U+048E, U+048F, U+049C-U+049F, U+04B8, U+04B9, U+04BC-U+04BF, + U+04C3, U+04C4 to Sans (by Eugeniy Meshcheryakov) +- added DejaVu Sans Extra Light (by Denis Jacquerye) +- Adjusted underline position for (hopefully) improved legibility in + Sans, Serif, Mono (Tim May) +- added auto-generated DejaVu LGC (by Stepan Roh) + +Changes from 2.2 to 2.3: + +- fixed bug U+042B and U+044B behave badly in Sans Bold or Oblique (by + Keenan Pepper) +- added and improved TrueType instructions and related settings (by + Keenan Pepper) +- added U+04D0-U+04D7, U+04E6, U+04E7 to Mono (by Eugeniy Meshcheryakov) +- added U+048A - U+048D, U+0498, U+0499, U+04AA, U+04AB, U+04B0, U+04B1, + U+04C0, U+04C9, U+04CA, U+04CE, U+04CD, U+04DA, U+04DB, U+04DE, U+04DF, + U+04E2 - U+04E5, U+04EC - U+04F8, U+04F9 to Sans (by Eugeniy Meshcheryakov) +- added U+04E0, U+04E1 to all faces (by Eugeniy Meshcheryakov) +- added Greek Extended to Sans and Serif: U+1F00-U+1F15, U+1F18-U+1F1D, + U+1F20-U+1F45, U+1F48-U+1F4D, U+1F50-U+1F57, U+1F59, U+1F5B, U+1F5D, + U+1F5F-U+1F7D, U+1F80-U+1FB4, U+1FB6-U+1FC4, U+1FC6-U+1FD3, U+1FD6-U+1FDB, + U+1FDD-U+1FEF, U+1FF2-U+1FF4, U+1FF6-U+1FFE (by Ben Laenen) +- added Greek variant letterforms, archaic letters and symbols to Mono: + U+03D0-U+03E1, U+03F0-U+03FF (by Ben Laenen) +- added Armenian block and Armenian ligatures to Sans (U+0531 - U+0556, + U+0559 - U+055F, U+0561 - U+0587, U+0589 - U+058A, U+FB13 - U+FB17) (by Ben + Laenen) +- redid some Greek characters in Sans and Mono to make them look better + and to correct some errors (by Ben Laenen) +- added U+27E0 to all faces (by David Lawrence Ramsey) +- added underscore (U+005F) consistency fixes: extended the Sans Mono + and Sans Mono Oblique underscores to touch both horizontal edges, and + reduced the height of the Sans Bold Oblique underscore to match the Sans + Bold underscore (by David Lawrence Ramsey) +- added underscore (U+005F) derivatives and consistency fixes for them: + made U+0332 a reference to underscore at Denis Jacquerye's suggestion; made + U+0333 two references to underscore; made U+033F two references to U+203E; + added U+2017 as two references to underscore, and made U+0333 a reference to + it; and added U+203E as a reference to underscore, and made U+0305 a + reference to it (by David Lawrence Ramsey) +- added U+201B, U+2220, U+2320-U+2321, U+23AE, U+23CF, all remaining + Geometric Shapes glyphs (U+25A0-U+25C9, U+25CB-U+25D7, U+25D9-U+25E5, + U+25E7-U+25FF), and U+2B12-U+2B13 to all faces (by David Lawrence Ramsey) +- added minor positional adjustments to U+2638 in all faces (by David + Lawrence Ramsey) +- added U+201F to Sans Mono and Serif faces (by David Lawrence Ramsey) +- added U+01B7, U+01F6, U+0464 - U+0465, U+2160 - U+2180, U+2183, + U+220A, U+220D, U+2329, U+232A, U+2422, U+27E8 - U+27EB, U+2680 - U+2685 to + Sans (by Gee Fung Sit ???) +- added U+2116 to Sans and Serif (by Gee Fung Sit) +- changed florin sign U+0192 in Sans (by Gee Fung Sit) +- added anchor points to some glyphs (by Denis Jacquerye) +- adjusted height of IPA superscripts U+02B0-02B8, U+02C0-02C1, + U+02E0-02E4, U+207F to match with height of U+00B2 (by Denis Jacquerye) +- added U+0184-U+0185, U+019C, U+019F, U+01A0-U+01A3, U+01A6, U+01AA, + U+01AF-U+01B0, U+01B2-U+01B4, U+01B7-U+01B8, U+01BC-U+01BC, U+0224-U+0225, + U+023A-U+0240, U+1D16-U+1D17, U+1D1D-U+1D1E, U+1D43-U+1D5B, U+1D7B, + U+1D85,U+1D9B-1DB7, U+1DB9-U+1DBF, U+20A6 to all fonts (by Denis Jacquerye) +- added added U+0182, U+018B, U+018E, U+01A0-U+01A1, U+01B1, U+01B9, + U+01C0-U+01C3, U+0238-U+0239, U+1D02, U+1D08-U+1D09, U+1D14, U+1D1F, U+1D77 + to Serif and Mono (by Denis Jacquerye) +- added U+0181, U+0183, U+0187-U+0188, U+018A-U+018F, U+0191, U+0193, + U+0195-U+019B, U+019D-U+019E, U+01A4-U+01A5, U+01AC-U+01AE, U+01B5-U+01B6, + U+01B9, U+01BB, U+01F6 to Serif (by Denis Jacquerye) +- added U+0181, U+0187-U+0188, U+018A, U+018D, U+018F, U+0191, U+0193, + U+0195-U+019F, U+01A4-01A5, U+01AC-01AD, U+01B5-U+01B6, U+1BB, U+01F6, + U+01D7-U+01DC, U+0238-U+0239, U+0241 to Mono (by Denis Jacquerye) +- added to Mono and Serif (by Denis Jacquerye) + +Changes from 2.1 to 2.2: + +- reworked the vertical orientation of the Blocks Elements characters + in all faces to remove their overly large descenders, in order to fix + problems with e.g. terminal emulators (by David Lawrence Ramsey) +- copied bullet in Sans faces to Serif faces for consistency (by David + Lawrence Ramsey) +- added U+2023, U+25D8, U+25E6, and U+29EB to all faces (by David + Lawrence Ramsey) +- added U+1EB8, U+1EB9, U+1ECA - U+1ECD, U+1EE4, U+1EE5 (by Tim May) +- added U+01DD, U+02BE, U+02BF, U+02D3 to all, changed U+02D2 in + non-Condensed and U+1EE5 in Serif (by Tim May) +- fixed U+01CE, replacing wrong circumflex by caron (by Denis Jacquerye) +- added anchor points to some glyphs (by Denis Jacquerye) +- added U+20B5 (by Denis Jacquerye) +- added U+0181 - U+0183, U+0187, U+0188, U+018A - U+018D, U+0191, + U+0193, U+0195 - U+019B, U+019D, U+019E, U+01A4, U+01A7 - U+01A9, U+01AB - + U+01AE, U+01B1, U+01B5, U+01B6, U+01BB, U+01C0 - U+01C3, U+01F1 - U+01F3, + U+0238, U+0239, U+1D02, U+1D08, U+1D09, U+1D14, U+1D1F, U+1D77, U+2103, + U+2126, U+2127, U+212A, U+212B, U+2132, U+214B, U+2210, U+2217, U+2218, + U+2A0C - U+2A0E, U+FB00, U+FB03 and U+FB04 to Sans (by Gee Fung Sit) +- added U+01A9, U+01C3 and U+2126 to Mono and Serif (by Gee Fung Sit) +- adjusted bearings of U+028B in Sans (by Gee Fung Sit) +- added U+018F, U+0494-U+0497, U+04A0-U+04A7, U+04AC-U+04AF, + U+04B4-U+04B7, U+04BA-U+04BB, U+04C1-U+04C2, U+04C5-U+04C8, U+04CB-U+04CC, + U+04D0-U+04D9, U+04DC-U+04DD, U+04E6-U+04EB to Sans (by Eugeniy + Meshcheryakov) +- replaced with references U+0391-U+0393, U+0395-U+0397, U+0399, U+039A, + U+039C, U+039D, U+039F-U+03A1, U+03A4, U+03A5, U+03A7, U+03BF, U+03DC, + U+0405, U+0406, U+0408, U+0410, U+0412, U+0415, U+0417, U+041A, + U+041C-U+041E, U+0420-U+0422, U+0425, U+0430, U+0435, U+043E, U+0440, + U+0441, U+0443, U+0445, U+0455-U+0458 in Serif and Mono (by Eugeniy + Meshcheryakov) +- added U+04D0-U+04D7, U+04E6-U+04EB to Serif (by Eugeniy Meshcheryakov) +- added U+212A and U+212B to the rest of the faces (by Lars Naesbye + Christensen) +- added U+2318 and U+2325 to Sans and Serif (by Lars Naesbye Christensen) +- added and improved TrueType instructions and related settings (by + Keenan Pepper) +- completed basic Greek alphabet: added U+0374-U+0375, U+037A, U+037E, + U+0384-U+038A, U+038C, U+038E-U+0390, U+03AC-U+03BF, U+03C1-U+03CE (by Ben + Laenen) +- added U+2070 and U+2074-U+2079 (by Mederic Boquien) + +Changes from 2.0 to 2.1: + +**# Be aware that names of some TTF files changed since version 2.0.#** + +- added U+0323, U+1E0C, U+1E0D, U+1E24, U+1E25, U+1E36 - U+1E39, U+1E42, + U+1E43, U+1E46, U+1E47, U+1E5A - U+1E5D, U+1E62, U+1E63, U+1E6C, U+1E6D, + U+1E7E, U+1E7F (by Tim May) +- fixed bug where GNOME applications used Mono Bold Oblique instead of + Mono Oblique (by Keenan Pepper) +- added and improved TrueType instructions and related settings (by + Keenan Pepper) +- added U+1E41, U+1E57, U+1E61 (by Sander Vesik) +- added U+0189, U+0309, U+0313, U+0314, U+031A, U+031B, U+0327, U+0328, + U+032B, U+0333, U+033C (by Denis Jacquerye) +- adjusted and fixed U+0186, U+0254, U+0291, U+0316 - U+0319, U+031C - + U+0320, U+0323 - U+0326, U+0329 - U+032A, U+032C - U+0332, U+0339 - U+033B, + U+033E, U+033F (by Denis Jacquerye) +- fixed U+1E12, U+1E3C, U+1E4A, U+1E70 to have normal below diacritics + (by Denis Jacquerye) +- fixed U+1E82, U+1E84 and U+1EF2 to have uppercase above diacritics (by + Denis Jacquerye) +- added anchor points to some glyphs (by Denis Jacquerye) +- dropped "-Roman" from font names - affects both internal TTF names and + names of generated files (by Stepan Roh) +- attempt to fix bug Vertical spacing too big for Mono by exchanging + LineGap and OS2TypoLinegap values (proofed by Stefan Rank) +- added Greek capitals U+0391 - U+03A1, U+03A3 - U+03A9, U+03AA, U+03AB + in Mono (by Ben Laenen) +- added the per ten thousand sign U+2031 (by Mederic Boquien) +- added U+2207, U+221D, U+221F, U+2227 - U+222A, and U+2261 (by David + Lawrence Ramsey) +- new logo (by Gee Fung Sit) +- added U+0180, U+018E, U+201F, U+2024, U+2025, U+203D, U+2200, U+2203, + U+2213, U+222C, U+222D, U+2263 to Sans (by Gee Fung Sit) + +Changes from 1.15 to 2.0: + +- "Italized" basic glyphs in all Serif Oblique and their Condensed faces + (by David Jez) +- added and improved TrueType instructions and related settings (by Keenan + Pepper) +- added anchor points to some glyphs (by Denis Jacquerye) +- many new spacing and combining accents (by Denis Jacquerye) +- smart substitutions for transforming i and j to dottless form and for + using uppercase diacritics (by Denis Jacquerye) +- fixed remaining erroneously slanted characters in Serif Oblique faces (by + David Lawrence Ramsey) +- copied bullet in Sans faces to Sans Oblique faces for consistency (by + David Lawrence Ramsey) +- added U+203C and U+2047-U+2049 (by David Lawrence Ramsey) +- added Greek glyphs to Serif (by Ben Laenen, Condensed merge by David Jez) +- fixed bug LTR glyphs behaving like RTL (by Ben Laenen) +- fixed wrong glyph directions (by David Jez) +- fixed repositioned accents in Condensed faces (by David Jez) + +Changes from 1.14 to 1.15: + +- added and improved TrueType instructions and related settings (by Keenan + Pepper) +- fixed U+2302, U+2319 (by David Lawrence Ramsey) +- fixed yet another monospace bug (by Stepan Roh) +- fixed potential "too big ascender/descender" bug (by Stepan Roh) +- fixed U+026E and U+028E (by Denis Jacquerye) +- added U+0186, U+0190, U+0300 - U+0304, U+0306 - U+0308, U+030A - U+030C, + U+0321, U+0322 (by Denis Jacquerye) +- added rest of Block Elements: U+2591 - U+2593 (by David Lawrence Ramsey) +- added U+2311, U+237D and U+2638 (by David Lawrence Ramsey) +- added U+01CD - U+01D4 (by Denis Jacquerye) +- fixed accents of U+00F2 - U+00F6 by replacing them with references in Mono + Bold (by David Jez) +- added U+0490, U+0491 (by Eugeniy Meshcheryakov) +- added hints to U+0404 and U+0454 in Sans (by Eugeniy Meshcheryakov) +- completed Greek glyphs from U+0370 to U+03CF in Serif (by Ben Laenen) +- fixed shape of U+0255 in Sans Bold and Sans Bold Oblique (by Denis + Jacquerye) + +Changes from 1.13 to 1.14: + +- fixed bug where Mono faces were not recognized as fixed pitch in Windows + by correcting Venda glyphs (by David Jez) +- added and improved TrueType instructions (by Keenan Pepper) +- added 6 Uzbekian glyphs (by Mashrab Kuvatov) +- added Greek glyphs to Sans and Serif, changed pi and omega to fit in (by + Ben Laenen) +- added IPA and related superscript glyphs (by Denis Jacquerye) +- fixed buggy Venda glyphs (by David Lawrence Ramsey and Stepan Roh) +- added U+2302, U+2310, U+2319 (by David Lawrence Ramsey) +- fixed slanted U+00AC in Serif Oblique faces (by David Lawrence Ramsey) +- added 29 glyphs from Block Elements (by David Lawrence Ramsey) + +Changes from 1.12 to 1.13: + +- removed all stems (PS hints) (requested by David Jez) +- added U+01D6, U+01DF, U+022B, U+022D and U+0231 (by Sander Vesik) +- added 10 Venda glyphs (by Dwayne Bailey) +- fixed bug when fonts had no name on Microsoft Windows (by Stepan Roh) +- updated 'missing' glyph U+FFFD (by David Jez) +- set TTF flag fsType to 'Installable Embedding' (= unrestricted usage) + (idea by C. Tiffany) + +Changes from 1.11 to 1.12: + +- added long s (by James Cloos) +- prettier comma accent in gcommaaccent (by David Jez) +- added Hbar, hbar, kgreenlandic, napostrophe, Eng, eng, Tbar, tbar, + afii57929 (by David Jez) +- changed Iogonek, iogonek, IJ, ij to look better (by David Jez) +- glyph uni0237 renamed to dotlessj (requested by David Jez) +- fixed accents for dcaron, lcaron, tcaron, Uogonek, uogonek in Serif (by + David Jez) +- added U+2500 - U+257F box drawing glyphs to Sans Mono (by David Jez) +- fixed accents in Wcircumflex, Ycircumflex and Zdotaccent (by David Jez) +- extra kerning for F (by Sander Vesik) +- added 'missing' glyph U+FFFD (by David Jez) + +Changes from 1.10 to 1.11: + +- kerning updates (by Sander Vesik) +- added Iogonek, iogonek, IJ, ij, Uogonek, uogonek (from SuSE standard fonts + by Adrian Schroeter, SuSE AG) +- added Gcommaaccent, gcommaaccent, Kcommaaccent, kcommaaccent, + Lcommaaccent, lcommaaccent, Ncommaaccent, ncommaaccent, Rcommaaccent, + rcommaaccent (by Stepan Roh) + +Changes from 1.9 to 1.10: + +- added U+022E, U+022F (by Sander Vesik) +- kerning updates for DejaVu Sans (by Sander Vesik) +- fixed too wide cyrillic glyphs in DejaVu Sans Mono (by Valentin Stoykov) +- fixed ligatures bug in Mono (by Stepan Roh) + +Changes from 1.8 to 1.9: + +- integrated Arev Cyrillics (by Danilo Segan) +- added U+01EA, U+01EB, U+01EC, U+01ED (by Sander Vesik) + +Changes from 1.7 to 1.8: + +- fixed accents in Serif Oblique and Serif Bold Oblique (by Stepan Roh) + +Changes from 1.6 to 1.7: + +- added automatically generated Condensed typefaces (by Stepan Roh) + +Changes from 1.5 to 1.6: + +- monospace bug fixed (by Stepan Roh) +- incorrect Bitstream foundry assigned by fontconfig and KDE Font Installer +fixed (by Stepan Roh) +- added automatically generated Oblique version of Serif typefaces (by +Stepan Roh) +- corrected cyrillic D and d (by Danilo Segan and David Jez) +- fixed accents position in Oblique version of Serif typefaces (by Danilo +Segan and Sander Vesik) +- fixed incorrect computation of OS2Win# fields (by Stepan Roh) +- added visiblespace U+2423 (by David Jez) +- fixed 'line height' bug by fixing ascender and descender values (by David +Jez and Stepan Roh) +- fixed part of 'worse than Vera' bug (by Peter Cernak) +- smaller comma accent U+0326 (by David Jez) + +Changes from 1.4 to 1.5: + +- added Cyrillics (96 characters) and Dcroat to the rest of typefaces (by +Danilo Segan) +- fixed bugs in some Cyrillic characters, some of them reported by Sander +Vesik (by Danilo Segan) +- added U+0100, U+0101, U+0112, U+0113, U+012A, U+012B, U+014C, U+014D, +U+016A, U+016B, U+01E2, U+01E3, U+0232 and U+0233 (by Sander Vesik) +- added Romanian characters (by Misu Moldovan) +- added U+0108, U+0109, U+010A, U+010B, U+0114, U+0115, U+0116, U+0117, +U+011C, U+011D, U+0120, U+0121, U+0124, U+0125, U+0128, U+0129, U+012C, +U+012D, U+0134, U+0135, U+014E, U+014F, U+0150, U+0151, U+015C, U+015D, +U+0168, U+0169, U+016C, U+016D, U+0170, U+0171 and U+0237 (by James +Crippen) +- added U+02BB, U+2010, U+2011, U+2012 and U+2015 (by Stepan Roh) + +Changes from 1.3 to 1.4: + +- added Polish characters (Aogonek, aogonek, Eogonek, eogonek, Nacute, +nacute, Sacute, sacute, Zacute, zacute, Zdotaccent, zdotaccent) (by Stepan +Roh) + +Changes from 1.2 to 1.3: + +- added Cyrillics (96 characters) and Dcroat to Sans typefaces (by Danilo +Segan from his BePa fonts) + +Changes from 1.1 to 1.2: + +- added Ldot, ldot, Wcircumflex, wcircumflex, Ycircumflex, ycircumflex, + Wgrave, wgrave, Wacute, wacute, Wdieresis, wdieresis, Ygrave and ygrave + (from The Olwen Font Family 0.2 by Dafydd Harries) + +Changes from 1.0 to 1.1: + +- added Lacute, lacute, Lcaron, lcaron, Racute and racute (by Peter Cernak) + +Changes from 0.9.4 to 1.0: + +- none, just changed version and updated README + +Changes from 0.9.3 to 0.9.4: + +- fixed TTF generation (kerning tables were missing) + +Changes from 0.9.2 to 0.9.3: + +- kerning of added characters +- proper caron shape for dcaron in Mono (by Ondrej Koala Vacha) +- minor visual changes + +Changes from 0.9.1 to 0.9.2: + +- internal bugged version + +Changes from 0.9 to 0.9.1: + +- proper caron shape for dcaron and tcaron +- minor visual changes + +$Id: NEWS 1587 2007-02-18 16:20:38Z ben_laenen $ diff --git a/vendor/plugins/rfpdf/lib/fonts/dejavu-ttf-2.15/README b/vendor/plugins/rfpdf/lib/fonts/dejavu-ttf-2.15/README new file mode 100755 index 00000000..4e6af7f6 --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/dejavu-ttf-2.15/README @@ -0,0 +1,59 @@ +DejaVu fonts 2.15 (c)2004-2007 DejaVu fonts team +----------------------------------------------- + +The DejaVu fonts are a font family based on the Bitstream Vera Fonts +(http://gnome.org/fonts/). Its purpose is to provide a wider range of +characters (see status.txt for more information) while maintaining the +original look and feel. + +DejaVu fonts are based on Bitstream Vera fonts version 1.10. + +Available fonts (Sans = sans serif, Mono = monospaced): + +DejaVu Sans Mono +DejaVu Sans Mono Bold +DejaVu Sans Mono Bold Oblique +DejaVu Sans Mono Oblique +DejaVu Sans +DejaVu Sans Bold +DejaVu Sans Bold Oblique +DejaVu Sans Oblique +DejaVu Sans ExtraLight (experimental) +DejaVu Serif +DejaVu Serif Bold +DejaVu Serif Bold Oblique (experimental) +DejaVu Serif Oblique (experimental) +DejaVu Sans Condensed (experimental) +DejaVu Sans Condensed Bold (experimental) +DejaVu Sans Condensed Bold Oblique (experimental) +DejaVu Sans Condensed Oblique (experimental) +DejaVu Serif Condensed (experimental) +DejaVu Serif Condensed Bold (experimental) +DejaVu Serif Condensed Bold Oblique (experimental) +DejaVu Serif Condensed Oblique (experimental) + +All fonts are also available as derivative called DejaVu LGC with support +only for Latin, Greek and Cyrillic scripts. + +For license information see LICENSE. What's new is described in NEWS. Known +bugs are in BUGS. All authors are mentioned in AUTHORS. + +Fonts are published in source form as SFD files (Spline Font Database from +FontForge - http://fontforge.sf.net/) and in compiled form as TTF files +(TrueType fonts). + +For more information go to http://dejavu.sourceforge.net/. + +Characters from Arev fonts, Copyright (c) 2006 by Tavmjong Bah: +--------------------------- +U+01ba, U+01bf, U+01f7, U+021c, U+021d, U+0220, U+0222, U+0223, +U+02b9, U+02ba, U+02bd, U+02c2, U+02c3, U+02c4, U+02c5, U+02d4, +U+02d5, U+02d7, U+02ec, U+02ed, U+02ee, U+0346-034e, U+0360, U+0362, +U+03e2-03ef, U+0460-0463, U+0466-0486, U+0488-0489, U+04a8-04a9, +U+0500-050f, U+2055-205e, U+20B0, U+20B2-20B3, U+2102, U+210D, U+210f, +U+2111, U+2113, U+2115, U+2118-U+211A, U+211c-211d, U+2124,U+2135, +U+213C-U+2140, U+2295-2298, U+2308-230b, U+26A2-U+26B1, U+2701-2704, +U+2706-2709, U+270c-274b, U+2758-275a, U+2761-2775, U+2780-2794, +U+2798-27af, U+27b1-27be, U+fb05-fb06 + +$Id: README 1587 2007-02-18 16:20:38Z ben_laenen $ diff --git a/vendor/plugins/rfpdf/lib/fonts/dejavu-ttf-2.15/langcover.txt b/vendor/plugins/rfpdf/lib/fonts/dejavu-ttf-2.15/langcover.txt new file mode 100755 index 00000000..e823fd10 --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/dejavu-ttf-2.15/langcover.txt @@ -0,0 +1,187 @@ +This is the language coverage file for DejaVu fonts +($Id: langcover.txt 1586 2007-02-18 16:07:32Z ben_laenen $) + + Sans Serif Sans Mono +aa Afar 100% (62/62) 100% (62/62) 100% (62/62) +ab Abkhazia 100% (90/90) 93% (84/90) 84% (76/90) +af Afrikaans 100% (69/69) 100% (69/69) 100% (69/69) +am Amharic (0/264) (0/264) (0/264) +ar Arabic 100% (125/125) (0/125) (0/125) +ast Asturian 100% (72/72) 100% (72/72) 100% (72/72) +ava Avaric 100% (67/67) 100% (67/67) 100% (67/67) +ay Aymara 100% (60/60) 100% (60/60) 100% (60/60) +az Azerbaijani 100% (148/148) 97% (144/148) 97% (144/148) +az-ir Azerbaijani in Iran 100% (130/130) (0/130) (0/130) +ba Bashkir 100% (82/82) 100% (82/82) 97% (80/82) +bam Bambara 100% (60/60) 100% (60/60) 100% (60/60) +be Byelorussian 100% (68/68) 100% (68/68) 100% (68/68) +bg Bulgarian 100% (60/60) 100% (60/60) 100% (60/60) +bh Bihari (Devanagari script) (0/68) (0/68) (0/68) +bho Bhojpuri (Devanagari script) (0/68) (0/68) (0/68) +bi Bislama 100% (58/58) 100% (58/58) 100% (58/58) +bin Edo or Bini 100% (78/78) 100% (78/78) 100% (78/78) +bn Bengali (0/89) (0/89) (0/89) +bo Tibetan (0/95) (0/95) (0/95) +br Breton 100% (64/64) 100% (64/64) 100% (64/64) +bs Bosnian 100% (62/62) 100% (62/62) 100% (62/62) +bua Buriat (Buryat) 100% (70/70) 100% (70/70) 100% (70/70) +ca Catalan 100% (74/74) 100% (74/74) 100% (74/74) +ce Chechen 100% (67/67) 100% (67/67) 100% (67/67) +ch Chamorro 100% (58/58) 100% (58/58) 100% (58/58) +chm Mari (Lower Cheremis / Upper Cheremis) 100% (76/76) 100% (76/76) 97% (74/76) +chr Cherokee (0/85) (0/85) (0/85) +co Corsican 100% (84/84) 100% (84/84) 100% (84/84) +cs Czech 100% (82/82) 100% (82/82) 100% (82/82) +cu Old Church Slavonic 100% (103/103) 80% (83/103) 74% (77/103) +cv Chuvash 100% (74/74) 100% (74/74) 100% (74/74) +cy Welsh 100% (78/78) 100% (78/78) 100% (78/78) +da Danish 100% (70/70) 100% (70/70) 100% (70/70) +de German 100% (59/59) 100% (59/59) 100% (59/59) +dz Dzongkha (0/95) (0/95) (0/95) +el Greek 100% (69/69) 100% (69/69) 100% (69/69) +en English 100% (72/72) 100% (72/72) 100% (72/72) +eo Esperanto 100% (64/64) 100% (64/64) 100% (64/64) +es Spanish 100% (66/66) 100% (66/66) 100% (66/66) +et Estonian 100% (64/64) 100% (64/64) 100% (64/64) +eu Basque 100% (56/56) 100% (56/56) 100% (56/56) +fa Persian 100% (129/129) (0/129) (0/129) +fi Finnish 100% (62/62) 100% (62/62) 100% (62/62) +fj Fijian 100% (52/52) 100% (52/52) 100% (52/52) +fo Faroese 100% (68/68) 100% (68/68) 100% (68/68) +fr French 100% (84/84) 100% (84/84) 100% (84/84) +ful Fulah (Fula) 100% (62/62) 100% (62/62) 100% (62/62) +fur Friulian 100% (66/66) 100% (66/66) 100% (66/66) +fy Frisian 100% (75/75) 100% (75/75) 100% (75/75) +ga Irish 100% (80/80) 100% (80/80) 100% (80/80) +gd Scots Gaelic 100% (70/70) 100% (70/70) 100% (70/70) +gez Ethiopic (Geez) (0/218) (0/218) (0/218) +gl Galician 100% (66/66) 100% (66/66) 100% (66/66) +gn Guarani 100% (70/70) 100% (70/70) 100% (70/70) +gu Gujarati (0/78) (0/78) (0/78) +gv Manx Gaelic 100% (54/54) 100% (54/54) 100% (54/54) +ha Hausa 100% (60/60) 100% (60/60) 100% (60/60) +haw Hawaiian 100% (63/63) 100% (63/63) 100% (63/63) +he Hebrew 100% (27/27) (0/27) (0/27) +hi Hindi (Devanagari script) (0/68) (0/68) (0/68) +ho Hiri Motu 100% (52/52) 100% (52/52) 100% (52/52) +hr Croatian 100% (62/62) 100% (62/62) 100% (62/62) +hu Hungarian 100% (70/70) 100% (70/70) 100% (70/70) +hy Armenian 100% (77/77) (0/77) (0/77) +ia Interlingua 100% (52/52) 100% (52/52) 100% (52/52) +ibo Igbo 100% (58/58) 100% (58/58) 100% (58/58) +id Indonesian 100% (54/54) 100% (54/54) 100% (54/54) +ie Interlingue 100% (52/52) 100% (52/52) 100% (52/52) +ik Inupiaq (Inupiak, Eskimo) 100% (68/68) 100% (68/68) 100% (68/68) +io Ido 100% (52/52) 100% (52/52) 100% (52/52) +is Icelandic 100% (70/70) 100% (70/70) 100% (70/70) +it Italian 100% (72/72) 100% (72/72) 100% (72/72) +iu Inuktitut 100% (161/161) (0/161) (0/161) +ja Japanese (0/6538) (0/6538) (0/6538) +ka Georgian (0/34) (0/34) (0/34) +kaa Kara-Kalpak (Karakalpak) 100% (78/78) 100% (78/78) 100% (78/78) +ki Kikuyu 100% (56/56) 100% (56/56) 100% (56/56) +kk Kazakh 100% (77/77) 100% (77/77) 100% (77/77) +kl Greenlandic 100% (81/81) 100% (81/81) 100% (81/81) +km Khmer (0/70) (0/70) (0/70) +kn Kannada (0/80) (0/80) (0/80) +ko Korean (0/2443) (0/2443) (0/2443) +kok Kokani (Devanagari script) (0/68) (0/68) (0/68) +ks Kashmiri (Devanagari script) (0/68) (0/68) (0/68) +ku Kurdish 100% (64/64) 100% (64/64) 100% (64/64) +ku-ir Kurdish in Iran 100% (32/32) (0/32) (0/32) +kum Kumyk 100% (66/66) 100% (66/66) 100% (66/66) +kv Komi (Komi-Permyak/Komi-Siryan) 100% (70/70) 100% (70/70) 100% (70/70) +kw Cornish 100% (64/64) 100% (64/64) 100% (64/64) +ky Kirgiz 100% (70/70) 100% (70/70) 100% (70/70) +la Latin 100% (68/68) 100% (68/68) 100% (68/68) +lb Luxembourgish (Letzeburgesch) 100% (75/75) 100% (75/75) 100% (75/75) +lez Lezghian (Lezgian) 100% (67/67) 100% (67/67) 100% (67/67) +lo Lao 84% (55/65) (0/65) 43% (28/65) +lt Lithuanian 100% (70/70) 100% (70/70) 100% (70/70) +lv Latvian 100% (78/78) 100% (78/78) 100% (78/78) +mg Malagasy 100% (56/56) 100% (56/56) 100% (56/56) +mh Marshallese 100% (62/62) 100% (62/62) 100% (62/62) +mi Maori 100% (64/64) 100% (64/64) 100% (64/64) +mk Macedonian 100% (42/42) 100% (42/42) 100% (42/42) +ml Malayalam (0/78) (0/78) (0/78) +mn Mongolian (0/130) (0/130) (0/130) +mo Moldavian 100% (128/128) 100% (128/128) 100% (128/128) +mr Marathi (Devanagari script) (0/68) (0/68) (0/68) +mt Maltese 100% (72/72) 100% (72/72) 100% (72/72) +my Burmese (Myanmar) (0/48) (0/48) (0/48) +nb Norwegian Bokmal 100% (70/70) 100% (70/70) 100% (70/70) +nds Low Saxon 100% (59/59) 100% (59/59) 100% (59/59) +ne Nepali (Devanagari script) (0/68) (0/68) (0/68) +nl Dutch 100% (82/82) 100% (82/82) 100% (82/82) +nn Norwegian Nynorsk 100% (76/76) 100% (76/76) 100% (76/76) +no Norwegian (Bokmal) 100% (70/70) 100% (70/70) 100% (70/70) +ny Chichewa 100% (54/54) 100% (54/54) 100% (54/54) +oc Occitan 100% (70/70) 100% (70/70) 100% (70/70) +om Oromo or Galla 100% (52/52) 100% (52/52) 100% (52/52) +or Oriya (0/79) (0/79) (0/79) +os Ossetic 100% (66/66) 100% (66/66) 100% (66/66) +pa Punjabi (Gurumukhi script) (0/63) (0/63) (0/63) +pl Polish 100% (70/70) 100% (70/70) 100% (70/70) +ps-af Pashto in Afghanistan 83% (41/49) (0/49) (0/49) +ps-pk Pashto in Pakistan 81% (40/49) (0/49) (0/49) +pt Portuguese 100% (82/82) 100% (82/82) 100% (82/82) +rm Rhaeto-Romance (Romansch) 100% (66/66) 100% (66/66) 100% (66/66) +ro Romanian 100% (62/62) 100% (62/62) 100% (62/62) +ru Russian 100% (66/66) 100% (66/66) 100% (66/66) +sa Sanskrit (Devanagari script) (0/68) (0/68) (0/68) +sah Yakut 100% (76/76) 100% (76/76) 97% (74/76) +sco Scots 100% (56/56) 96% (54/56) 96% (54/56) +se North Sami 100% (66/66) 100% (66/66) 100% (66/66) +sel Selkup (Ostyak-Samoyed) 100% (66/66) 100% (66/66) 100% (66/66) +sh Serbo-Croatian 100% (76/76) 100% (76/76) 100% (76/76) +si Sinhala (Sinhalese) (0/77) (0/77) (0/77) +sk Slovak 100% (86/86) 100% (86/86) 100% (86/86) +sl Slovenian 100% (62/62) 100% (62/62) 100% (62/62) +sm Samoan 100% (53/53) 100% (53/53) 100% (53/53) +sma South Sami 100% (60/60) 100% (60/60) 100% (60/60) +smj Lule Sami 100% (60/60) 100% (60/60) 100% (60/60) +smn Inari Sami 100% (68/68) 100% (68/68) 100% (68/68) +sms Skolt Sami 100% (80/80) 100% (80/80) 97% (78/80) +so Somali 100% (52/52) 100% (52/52) 100% (52/52) +sq Albanian 100% (56/56) 100% (56/56) 100% (56/56) +sr Serbian 100% (76/76) 100% (76/76) 100% (76/76) +sv Swedish 100% (68/68) 100% (68/68) 100% (68/68) +sw Swahili 100% (52/52) 100% (52/52) 100% (52/52) +syr Syriac (0/45) (0/45) (0/45) +ta Tamil (0/48) (0/48) (0/48) +te Telugu (0/80) (0/80) (0/80) +tg Tajik 100% (78/78) 100% (78/78) 97% (76/78) +th Thai 1% (1/87) (0/87) (0/87) +ti-er Eritrean Tigrinya (0/256) (0/256) (0/256) +ti-et Ethiopian Tigrinya (0/282) (0/282) (0/282) +tig Tigre (0/221) (0/221) (0/221) +tk Turkmen 100% (74/74) 100% (74/74) 97% (72/74) +tl Tagalog (0/19) (0/19) (0/19) +tn Tswana 100% (56/56) 100% (56/56) 100% (56/56) +to Tonga 100% (53/53) 100% (53/53) 100% (53/53) +tr Turkish 100% (70/70) 100% (70/70) 100% (70/70) +ts Tsonga 100% (52/52) 100% (52/52) 100% (52/52) +tt Tatar 100% (76/76) 100% (76/76) 97% (74/76) +tw Twi 100% (73/73) 100% (73/73) 100% (73/73) +tyv Tuvinian 100% (70/70) 100% (70/70) 100% (70/70) +ug Uighur 100% (125/125) (0/125) (0/125) +uk Ukrainian 100% (72/72) 100% (72/72) 100% (72/72) +ur Urdu 94% (137/145) (0/145) (0/145) +uz Uzbek 100% (68/68) 100% (68/68) 100% (68/68) +ven Venda 100% (62/62) 100% (62/62) 100% (62/62) +vi Vietnamese 100% (194/194) 77% (150/194) 62% (122/194) +vo Volapuk 100% (54/54) 100% (54/54) 100% (54/54) +vot Votic 100% (62/62) 100% (62/62) 100% (62/62) +wa Walloon 100% (70/70) 100% (70/70) 100% (70/70) +wen Sorbian languages (lower and upper) 100% (76/76) 100% (76/76) 100% (76/76) +wo Wolof 100% (66/66) 100% (66/66) 100% (66/66) +xh Xhosa 100% (52/52) 100% (52/52) 100% (52/52) +yap Yapese 100% (58/58) 100% (58/58) 100% (58/58) +yi Yiddish 100% (27/27) (0/27) (0/27) +yo Yoruba 100% (119/119) 100% (119/119) 100% (119/119) +zh-cn Chinese (simplified) 0% (2/6765) 0% (2/6765) 0% (2/6765) +zh-hk Chinese Hong Kong Supplementary Character Set (0/2213) (0/2213) (0/2213) +zh-mo Chinese in Macau (0/13063) (0/13063) (0/13063) +zh-sg Chinese in Singapore 0% (2/6765) 0% (2/6765) 0% (2/6765) +zh-tw Chinese (traditional) (0/13063) (0/13063) (0/13063) +zu Zulu 100% (52/52) 100% (52/52) 100% (52/52) diff --git a/vendor/plugins/rfpdf/lib/fonts/dejavu-ttf-2.15/status.txt b/vendor/plugins/rfpdf/lib/fonts/dejavu-ttf-2.15/status.txt new file mode 100755 index 00000000..e5de9570 --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/dejavu-ttf-2.15/status.txt @@ -0,0 +1,4641 @@ +This is the status file for DejaVu fonts +($Id: status.txt 1586 2007-02-18 16:07:32Z ben_laenen $) + +original = present in original Bitstream Vera 1.10 + = added in DejaVu fonts + +U+0020 space original +U+0021 exclam original +U+0022 quotedbl original +U+0023 numbersign original +U+0024 dollar original +U+0025 percent original +U+0026 ampersand original +U+0027 quotesingle original +U+0028 parenleft original +U+0029 parenright original +U+002a asterisk original +U+002b plus original +U+002c comma original +U+002d hyphen original +U+002e period original +U+002f slash original +U+0030 zero original +U+0031 one original +U+0032 two original +U+0033 three original +U+0034 four original +U+0035 five original +U+0036 six original +U+0037 seven original +U+0038 eight original +U+0039 nine original +U+003a colon original +U+003b semicolon original +U+003c less original +U+003d equal original +U+003e greater original +U+003f question original +U+0040 at original +U+0041 A original +U+0042 B original +U+0043 C original +U+0044 D original +U+0045 E original +U+0046 F original +U+0047 G original +U+0048 H original +U+0049 I original +U+004a J original +U+004b K original +U+004c L original +U+004d M original +U+004e N original +U+004f O original +U+0050 P original +U+0051 Q original +U+0052 R original +U+0053 S original +U+0054 T original +U+0055 U original +U+0056 V original +U+0057 W original +U+0058 X original +U+0059 Y original +U+005a Z original +U+005b bracketleft original +U+005c backslash original +U+005d bracketright original +U+005e asciicircum original +U+005f underscore original +U+0060 grave original +U+0061 a original +U+0062 b original +U+0063 c original +U+0064 d original +U+0065 e original +U+0066 f original +U+0067 g original +U+0068 h original +U+0069 i original +U+006a j original +U+006b k original +U+006c l original +U+006d m original +U+006e n original +U+006f o original +U+0070 p original +U+0071 q original +U+0072 r original +U+0073 s original +U+0074 t original +U+0075 u original +U+0076 v original +U+0077 w original +U+0078 x original +U+0079 y original +U+007a z original +U+007b braceleft original +U+007c bar original +U+007d braceright original +U+007e asciitilde original +U+00a0 nonbreakingspace original +U+00a1 exclamdown original +U+00a2 cent original +U+00a3 sterling original +U+00a4 currency original +U+00a5 yen original +U+00a6 brokenbar original +U+00a7 section original +U+00a8 dieresis original +U+00a9 copyright original +U+00aa ordfeminine original +U+00ab guillemotleft original +U+00ac logicalnot original +U+00ad sfthyphen original +U+00ae registered original +U+00af macron original +U+00b0 degree original +U+00b1 plusminus original +U+00b2 twosuperior original +U+00b3 threesuperior original +U+00b4 acute original +U+00b5 mu original +U+00b6 paragraph original +U+00b7 periodcentered original +U+00b8 cedilla original +U+00b9 onesuperior original +U+00ba ordmasculine original +U+00bb guillemotright original +U+00bc onequarter original +U+00bd onehalf original +U+00be threequarters original +U+00bf questiondown original +U+00c0 Agrave original +U+00c1 Aacute original +U+00c2 Acircumflex original +U+00c3 Atilde original +U+00c4 Adieresis original +U+00c5 Aring original +U+00c6 AE original +U+00c7 Ccedilla original +U+00c8 Egrave original +U+00c9 Eacute original +U+00ca Ecircumflex original +U+00cb Edieresis original +U+00cc Igrave original +U+00cd Iacute original +U+00ce Icircumflex original +U+00cf Idieresis original +U+00d0 Eth original +U+00d1 Ntilde original +U+00d2 Ograve original +U+00d3 Oacute original +U+00d4 Ocircumflex original +U+00d5 Otilde original +U+00d6 Odieresis original +U+00d7 multiply original +U+00d8 Oslash original +U+00d9 Ugrave original +U+00da Uacute original +U+00db Ucircumflex original +U+00dc Udieresis original +U+00dd Yacute original +U+00de Thorn original +U+00df germandbls original +U+00e0 agrave original +U+00e1 aacute original +U+00e2 acircumflex original +U+00e3 atilde original +U+00e4 adieresis original +U+00e5 aring original +U+00e6 ae original +U+00e7 ccedilla original +U+00e8 egrave original +U+00e9 eacute original +U+00ea ecircumflex original +U+00eb edieresis original +U+00ec igrave original +U+00ed iacute original +U+00ee icircumflex original +U+00ef idieresis original +U+00f0 eth original +U+00f1 ntilde original +U+00f2 ograve original +U+00f3 oacute original +U+00f4 ocircumflex original +U+00f5 otilde original +U+00f6 odieresis original +U+00f7 divide original +U+00f8 oslash original +U+00f9 ugrave original +U+00fa uacute original +U+00fb ucircumflex original +U+00fc udieresis original +U+00fd yacute original +U+00fe thorn original +U+00ff ydieresis original +U+0100 Amacron 1.5 +U+0101 amacron 1.5 +U+0102 Abreve 1.5 +U+0103 abreve 1.5 +U+0104 Aogonek 1.4 +U+0105 aogonek 1.4 +U+0106 Cacute original +U+0107 cacute original +U+0108 Ccircumflex 1.5 +U+0109 ccircumflex 1.5 +U+010a Cdotaccent 1.5 +U+010b cdotaccent 1.5 +U+010c Ccaron original +U+010d ccaron original +U+010e Dcaron 1.0 +U+010f dcaron 1.0 +U+0110 Dcroat 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.4 (Sans ExtraLight) +U+0111 dcroat original +U+0112 Emacron 1.5 +U+0113 emacron 1.5 +U+0114 Ebreve 1.5 +U+0115 ebreve 1.5 +U+0116 Edotaccent 1.5 +U+0117 edotaccent 1.5 +U+0118 Eogonek 1.4 +U+0119 eogonek 1.4 +U+011a Ecaron 1.0 +U+011b ecaron 1.0 +U+011c Gcircumflex 1.5 +U+011d gcircumflex 1.5 +U+011e Gbreve original +U+011f gbreve original +U+0120 Gdotaccent 1.5 +U+0121 gdotaccent 1.5 +U+0122 Gcommaaccent 1.11 +U+0123 gcommaaccent 1.11 +U+0124 Hcircumflex 1.5 +U+0125 hcircumflex 1.5 +U+0126 Hbar 1.12 +U+0127 hbar 1.12 +U+0128 Itilde 1.5 +U+0129 itilde 1.5 +U+012a Imacron 1.5 +U+012b imacron 1.5 +U+012c Ibreve 1.5 +U+012d ibreve 1.5 +U+012e Iogonek 1.11 +U+012f iogonek 1.11 +U+0130 Idotaccent original +U+0131 dotlessi original +U+0132 IJ 1.11 +U+0133 ij 1.11 +U+0134 Jcircumflex 1.5 +U+0135 jcircumflex 1.5 +U+0136 Kcommaaccent 1.11 +U+0137 kcommaaccent 1.11 +U+0138 kgreenlandic 1.12 +U+0139 Lacute 1.1 +U+013a lacute 1.1 +U+013b Lcommaaccent 1.11 +U+013c lcommaaccent 1.11 +U+013d Lcaron 1.1 +U+013e lcaron 1.1 +U+013f Ldot 1.2 +U+0140 ldot 1.2 +U+0141 Lslash original +U+0142 lslash original +U+0143 Nacute 1.4 +U+0144 nacute 1.4 +U+0145 Ncommaaccent 1.11 +U+0146 ncommaaccent 1.11 +U+0147 Ncaron 1.0 +U+0148 ncaron 1.0 +U+0149 napostrophe 1.12 +U+014a Eng 1.12 +U+014b eng 1.12 +U+014c Omacron 1.5 +U+014d omacron 1.5 +U+014e Obreve 1.5 +U+014f obreve 1.5 +U+0150 Ohungarumlaut 1.5 +U+0151 ohungarumlaut 1.5 +U+0152 OE original +U+0153 oe original +U+0154 Racute 1.1 +U+0155 racute 1.1 +U+0156 Rcommaaccent 1.11 +U+0157 rcommaaccent 1.11 +U+0158 Rcaron 1.0 +U+0159 rcaron 1.0 +U+015a Sacute 1.4 +U+015b sacute 1.4 +U+015c Scircumflex 1.5 +U+015d scircumflex 1.5 +U+015e Scedilla original +U+015f scedilla original +U+0160 Scaron original +U+0161 scaron original +U+0162 Tcommaaccent 1.5 +U+0163 tcommaaccent 1.5 +U+0164 Tcaron 1.0 +U+0165 tcaron 1.0 +U+0166 Tbar 1.12 +U+0167 tbar 1.12 +U+0168 Utilde 1.5 +U+0169 utilde 1.5 +U+016a Umacron 1.5 +U+016b umacron 1.5 +U+016c Ubreve 1.5 +U+016d ubreve 1.5 +U+016e Uring 1.0 +U+016f uring 1.0 +U+0170 Uhungarumlaut 1.5 +U+0171 uhungarumlaut 1.5 +U+0172 Uogonek 1.11 +U+0173 uogonek 1.11 +U+0174 Wcircumflex 1.2 +U+0175 wcircumflex 1.2 +U+0176 Ycircumflex 1.2 +U+0177 ycircumflex 1.2 +U+0178 Ydieresis original +U+0179 Zacute 1.4 +U+017a zacute 1.4 +U+017b Zdotaccent 1.4 +U+017c zdotaccent 1.4 +U+017d Zcaron original +U+017e zcaron original +U+017f longs 1.12 +U+0180 uni0180 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.12 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+0181 uni0181 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight) +U+0182 uni0182 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight) +U+0183 uni0183 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight) +U+0184 uni0184 2.3 +U+0185 uni0185 2.3 +U+0186 uni0186 1.15 +U+0187 uni0187 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight) +U+0188 uni0188 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight) +U+0189 uni0189 2.1 +U+018a uni018A 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight) +U+018b uni018B 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight) +U+018c uni018C 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight) +U+018d uni018D 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans ExtraLight) +U+018e uni018E 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight) +U+018f uni018F 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight) +U+0190 uni0190 1.15 +U+0191 uni0191 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight) +U+0192 florin original +U+0193 uni0193 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight) +U+0194 uni0194 1.14 +U+0195 uni0195 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.6 (Sans ExtraLight) +U+0196 uni0196 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight) +U+0197 uni0197 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight) +U+0198 uni0198 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight) +U+0199 uni0199 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight) +U+019a uni019A 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight) +U+019b uni019B 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+019c uni019C 2.3 +U+019d uni019D 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight) +U+019e uni019E 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight) +U+019f uni019F 2.3 +U+01a0 Ohorn 2.3 +U+01a1 ohorn 2.3 +U+01a2 uni01A2 2.3 +U+01a3 uni01A3 2.3 +U+01a4 uni01A4 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight) +U+01a5 uni01A5 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight) +U+01a6 uni01A6 2.3 +U+01a7 uni01A7 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight) +U+01a8 uni01A8 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight) +U+01a9 uni01A9 2.2 +U+01aa uni01AA 2.3 +U+01ab uni01AB 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight) +U+01ac uni01AC 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight) +U+01ad uni01AD 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight) +U+01ae uni01AE 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight) +U+01af Uhorn 2.3 +U+01b0 uhorn 2.3 +U+01b1 uni01B1 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight) +U+01b2 uni01B2 2.3 +U+01b3 uni01B3 2.3 +U+01b4 uni01B4 2.3 +U+01b5 uni01B5 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight) +U+01b6 uni01B6 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight) +U+01b7 uni01B7 2.3 +U+01b8 uni01B8 2.3 +U+01b9 uni01B9 2.3 +U+01ba uni01BA 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+01bb uni01BB 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+01bc uni01BC 2.3 +U+01bd uni01BD 2.3 +U+01be uni01BE 2.3 +U+01bf uni01BF 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+01c0 uni01C0 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight) +U+01c1 uni01C1 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight) +U+01c2 uni01C2 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight) +U+01c3 uni01C3 2.2 +U+01c4 uni01C4 1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+01c5 uni01C5 1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+01c6 uni01C6 1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+01c7 uni01C7 1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+01c8 uni01C8 1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+01c9 uni01C9 1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+01ca uni01CA 1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+01cb uni01CB 1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+01cc uni01CC 1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+01cd uni01CD 1.15 +U+01ce uni01CE 1.15 +U+01cf uni01CF 1.15 +U+01d0 uni01D0 1.15 +U+01d1 uni01D1 1.15 +U+01d2 uni01D2 1.15 +U+01d3 uni01D3 1.15 +U+01d4 uni01D4 1.15 +U+01d5 uni01D5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+01d6 uni01D6 1.13 +U+01d7 uni01D7 2.3 +U+01d8 uni01D8 2.3 +U+01d9 uni01D9 2.3 +U+01da uni01DA 2.3 +U+01db uni01DB 2.3 +U+01dc uni01DC 2.3 +U+01dd uni01DD 2.2 +U+01de uni01DE 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+01df uni01DF 1.13 +U+01e0 uni01E0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+01e1 uni01E1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+01e2 uni01E2 1.5 +U+01e3 uni01E3 1.5 +U+01e4 uni01E4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+01e5 uni01E5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+01e6 Gcaron 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+01e7 gcaron 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+01e8 uni01E8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+01e9 uni01E9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+01ea uni01EA 1.9 +U+01eb uni01EB 1.9 +U+01ec uni01EC 1.9 +U+01ed uni01ED 1.9 +U+01ee uni01EE 2.4 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+01ef uni01EF 2.4 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+01f0 uni01F0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.13 (Sans Mono) +U+01f1 uni01F1 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+01f2 uni01F2 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+01f3 uni01F3 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+01f4 uni01F4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+01f5 uni01F5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+01f6 uni01F6 2.3 +U+01f7 uni01F7 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+01f8 uni01F8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+01f9 uni01F9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+01fa Aringacute 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+01fb aringacute 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+01fc AEacute 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+01fd aeacute 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+01fe Oslashacute 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+01ff oslashacute 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0200 uni0200 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0201 uni0201 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0202 uni0202 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0203 uni0203 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0204 uni0204 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0205 uni0205 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0206 uni0206 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0207 uni0207 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0208 uni0208 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0209 uni0209 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+020a uni020A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+020b uni020B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+020c uni020C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+020d uni020D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+020e uni020E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+020f uni020F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0210 uni0210 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0211 uni0211 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0212 uni0212 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0213 uni0213 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0214 uni0214 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0215 uni0215 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0216 uni0216 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0217 uni0217 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0218 Scommaaccent 1.5 +U+0219 scommaaccent 1.5 +U+021a uni021A 1.5 +U+021b uni021B 1.5 +U+021c uni021C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+021d uni021D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+021e uni021E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+021f uni021F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0220 uni0220 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0221 uni0221 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+0222 uni0222 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0223 uni0223 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0224 uni0224 2.3 +U+0225 uni0225 2.3 +U+0226 uni0226 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0227 uni0227 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0228 uni0228 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0229 uni0229 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+022a uni022A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+022b uni022B 1.13 +U+022c uni022C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+022d uni022D 1.13 +U+022e uni022E 1.10 +U+022f uni022F 1.10 +U+0230 uni0230 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans ExtraLight) +U+0231 uni0231 1.13 +U+0232 uni0232 1.5 +U+0233 uni0233 1.5 +U+0234 uni0234 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+0235 uni0235 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+0236 uni0236 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+0237 dotlessj 1.5 +U+0238 uni0238 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.10 (Sans ExtraLight) +U+0239 uni0239 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.10 (Sans ExtraLight) +U+023a uni023A 2.3 +U+023b uni023B 2.3 +U+023c uni023C 2.3 +U+023d uni023D 2.3 +U+023e uni023E 2.3 +U+023f uni023F 2.3 +U+0240 uni0240 2.3 +U+0241 uni0241 2.3 +U+0242 uni0242 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) +U+0243 uni0243 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0244 uni0244 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0245 uni0245 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Oblique, Serif Oblique) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0246 uni0246 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0247 uni0247 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0248 uni0248 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0249 uni0249 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+024a uni024A 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+024b uni024B 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+024c uni024C 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+024d uni024D 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+024e uni024E 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+024f uni024F 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+0250 uni0250 1.14 +U+0251 uni0251 1.14 +U+0252 uni0252 1.14 +U+0253 uni0253 1.14 +U+0254 uni0254 1.14 +U+0255 uni0255 1.14 +U+0256 uni0256 1.14 +U+0257 uni0257 1.14 +U+0258 uni0258 1.14 +U+0259 uni0259 1.14 +U+025a uni025A 1.14 +U+025b uni025B 1.14 +U+025c uni025C 1.14 +U+025d uni025D 1.14 +U+025e uni025E 1.14 +U+025f uni025F 1.14 +U+0260 uni0260 1.14 +U+0261 uni0261 1.14 +U+0262 uni0262 1.14 +U+0263 uni0263 1.14 +U+0264 uni0264 1.14 +U+0265 uni0265 1.14 +U+0266 uni0266 1.14 +U+0267 uni0267 1.14 +U+0268 uni0268 1.14 +U+0269 uni0269 1.14 +U+026a uni026A 1.14 +U+026b uni026B 1.14 +U+026c uni026C 1.14 +U+026d uni026D 1.14 +U+026e uni026E 1.14 +U+026f uni026F 1.14 +U+0270 uni0270 1.14 +U+0271 uni0271 1.14 +U+0272 uni0272 1.14 +U+0273 uni0273 1.14 +U+0274 uni0274 1.14 +U+0275 uni0275 1.14 +U+0276 uni0276 1.14 +U+0277 uni0277 1.14 +U+0278 uni0278 1.14 +U+0279 uni0279 1.14 +U+027a uni027A 1.14 +U+027b uni027B 1.14 +U+027c uni027C 1.14 +U+027d uni027D 1.14 +U+027e uni027E 1.14 +U+027f uni027F 1.14 +U+0280 uni0280 1.14 +U+0281 uni0281 1.14 +U+0282 uni0282 1.14 +U+0283 uni0283 1.14 +U+0284 uni0284 1.14 +U+0285 uni0285 1.14 +U+0286 uni0286 1.14 +U+0287 uni0287 1.14 +U+0288 uni0288 1.14 +U+0289 uni0289 1.14 +U+028a uni028A 1.14 +U+028b uni028B 1.14 +U+028c uni028C 1.14 +U+028d uni028D 1.14 +U+028e uni028E 1.14 +U+028f uni028F 1.14 +U+0290 uni0290 1.14 +U+0291 uni0291 1.14 +U+0292 uni0292 1.14 +U+0293 uni0293 1.14 +U+0294 uni0294 1.14 +U+0295 uni0295 1.14 +U+0296 uni0296 1.14 +U+0297 uni0297 1.14 +U+0298 uni0298 1.14 +U+0299 uni0299 1.14 +U+029a uni029A 1.14 +U+029b uni029B 1.14 +U+029c uni029C 1.14 +U+029d uni029D 1.14 +U+029e uni029E 1.14 +U+029f uni029F 1.14 +U+02a0 uni02A0 1.14 +U+02a1 uni02A1 1.14 +U+02a2 uni02A2 1.14 +U+02a3 uni02A3 1.14 +U+02a4 uni02A4 1.14 +U+02a5 uni02A5 1.14 +U+02a6 uni02A6 1.14 +U+02a7 uni02A7 1.14 +U+02a8 uni02A8 1.14 +U+02a9 uni02A9 1.14 +U+02aa uni02AA 1.14 +U+02ab uni02AB 1.14 +U+02ac uni02AC 1.14 +U+02ad uni02AD 1.14 +U+02ae uni02AE 1.14 +U+02af uni02AF 1.14 +U+02b0 uni02B0 1.14 +U+02b1 uni02B1 1.14 +U+02b2 uni02B2 1.14 +U+02b3 uni02B3 1.14 +U+02b4 uni02B4 1.14 +U+02b5 uni02B5 1.14 +U+02b6 uni02B6 1.14 +U+02b7 uni02B7 1.14 +U+02b8 uni02B8 1.14 +U+02b9 uni02B9 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+02ba uni02BA 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+02bb uni02BB 1.5 +U+02bc afii57929 1.12 +U+02bd afii64937 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+02be uni02BE 2.2 +U+02bf uni02BF 2.2 +U+02c0 uni02C0 1.14 +U+02c1 uni02C1 1.14 +U+02c2 uni02C2 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+02c3 uni02C3 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+02c4 uni02C4 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+02c5 uni02C5 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+02c6 circumflex original +U+02c7 caron original +U+02c8 uni02C8 2.0 +U+02c9 uni02C9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+02ca uni02CA 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+02cb uni02CB 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+02cc uni02CC 2.0 +U+02cd uni02CD 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+02ce uni02CE 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+02cf uni02CF 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+02d0 uni02D0 1.14 +U+02d1 uni02D1 1.14 +U+02d2 uni02D2 2.0 +U+02d3 uni02D3 2.2 +U+02d4 uni02D4 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+02d5 uni02D5 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+02d6 uni02D6 2.0 +U+02d7 uni02D7 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+02d8 breve original +U+02d9 dotaccent original +U+02da ring original +U+02db ogonek original +U+02dc tilde original +U+02dd hungarumlaut original +U+02de uni02DE 2.0 +U+02df uni02DF 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+02e0 uni02E0 1.14 +U+02e1 uni02E1 1.14 +U+02e2 uni02E2 1.14 +U+02e3 uni02E3 1.14 +U+02e4 uni02E4 1.14 +U+02e5 uni02E5 2.0 +U+02e6 uni02E6 2.0 +U+02e7 uni02E7 2.0 +U+02e8 uni02E8 2.0 +U+02e9 uni02E9 2.0 +U+02ec uni02EC 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+02ed uni02ED 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+02ee uni02EE 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+02f3 uni02F3 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+02f7 uni02F7 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+0300 gravecomb 1.15 +U+0301 acutecomb 1.15 +U+0302 uni0302 1.15 +U+0303 tildecomb 1.15 +U+0304 uni0304 1.15 +U+0305 uni0305 2.0 +U+0306 uni0306 1.15 +U+0307 uni0307 1.15 +U+0308 uni0308 1.15 +U+0309 hookabovecomb 2.1 +U+030a uni030A 1.15 +U+030b uni030B 1.15 +U+030c uni030C 1.15 +U+030d uni030D 2.0 +U+030e uni030E 2.0 +U+030f uni030F 2.0 +U+0310 uni0310 2.0 +U+0311 uni0311 2.0 +U+0312 uni0312 1.11 +U+0313 uni0313 2.1 +U+0314 uni0314 2.1 +U+0315 uni0315 2.0 +U+0316 uni0316 2.0 +U+0317 uni0317 2.0 +U+0318 uni0318 2.0 +U+0319 uni0319 2.0 +U+031a uni031A 2.1 +U+031b uni031B 2.1 +U+031c uni031C 2.0 +U+031d uni031D 2.0 +U+031e uni031E 2.0 +U+031f uni031F 2.0 +U+0320 uni0320 2.0 +U+0321 uni0321 1.15 +U+0322 uni0322 1.15 +U+0323 dotbelowcomb 2.1 +U+0324 uni0324 2.0 +U+0325 uni0325 2.0 +U+0326 uni0326 1.5 +U+0327 uni0327 2.1 +U+0328 uni0328 2.1 +U+0329 uni0329 2.0 +U+032a uni032A 2.0 +U+032b uni032B 2.1 +U+032c uni032C 2.0 +U+032d uni032D 2.0 +U+032e uni032E 2.0 +U+032f uni032F 2.0 +U+0330 uni0330 2.0 +U+0331 uni0331 2.0 +U+0332 uni0332 2.0 +U+0333 uni0333 2.1 +U+0334 uni0334 2.3 +U+0335 uni0335 2.3 +U+0336 uni0336 2.3 +U+0337 uni0337 2.3 +U+0338 uni0338 2.3 +U+0339 uni0339 2.0 +U+033a uni033A 2.0 +U+033b uni033B 2.0 +U+033c uni033C 2.1 +U+033d uni033D 2.0 +U+033e uni033E 2.1 +U+033f uni033F 2.1 +U+0340 uni0340 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0341 uni0341 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0342 uni0342 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0343 uni0343 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+0344 uni0344 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0345 uni0345 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0346 uni0346 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0347 uni0347 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0348 uni0348 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0349 uni0349 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+034a uni034A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+034b uni034B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+034c uni034C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+034d uni034D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+034e uni034E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+034f uni034F 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+0351 uni0351 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0352 uni0352 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique) +U+0353 uni0353 2.5 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0357 uni0357 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0358 uni0358 2.3 +U+035c uni035C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+035d uni035D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+035e uni035E 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+035f uni035F 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0360 uni0360 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0361 uni0361 2.0 +U+0362 uni0362 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0374 uni0374 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+0375 uni0375 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+037a uni037A 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+037b uni037B 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) +U+037c uni037C 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans ExtraLight, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+037d uni037D 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans ExtraLight, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+037e uni037E 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+0384 tonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+0385 dieresistonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+0386 Alphatonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+0387 anoteleia 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+0388 Epsilontonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+0389 Etatonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+038a Iotatonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+038c Omicrontonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+038e Upsilontonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+038f Omegatonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+0390 iotadieresistonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+0391 Alpha 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+0392 Beta 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+0393 Gamma 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+0394 uni0394 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+0395 Epsilon 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+0396 Zeta 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+0397 Eta 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+0398 Theta 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+0399 Iota 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+039a Kappa 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+039b Lambda 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+039c Mu 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+039d Nu 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+039e Xi 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+039f Omicron 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+03a0 Pi 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+03a1 Rho 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+03a3 Sigma 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+03a4 Tau 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+03a5 Upsilon 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+03a6 Phi 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+03a7 Chi 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+03a8 Psi 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+03a9 Omega original +U+03aa Iotadieresis 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+03ab Upsilondieresis 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+03ac alphatonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+03ad epsilontonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+03ae etatonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+03af iotatonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+03b0 upsilondieresistonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+03b1 alpha 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+03b2 beta 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+03b3 gamma 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+03b4 delta 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+03b5 epsilon 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+03b6 zeta 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+03b7 eta 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+03b8 theta 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+03b9 iota 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+03ba kappa 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+03bb lambda 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+03bc uni03BC 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+03bd nu 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+03be xi 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+03bf omicron 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+03c0 pi original +U+03c1 rho 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+03c2 sigma1 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+03c3 sigma 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+03c4 tau 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+03c5 upsilon 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+03c6 phi 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+03c7 chi 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+03c8 psi 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+03c9 omega 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+03ca iotadieresis 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+03cb upsilondieresis 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+03cc omicrontonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+03cd upsilontonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+03ce omegatonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+03d0 uni03D0 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+03d1 theta1 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+03d2 Upsilon1 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+03d3 uni03D3 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+03d4 uni03D4 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+03d5 phi1 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+03d6 omega1 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+03d7 uni03D7 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+03d8 uni03D8 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+03d9 uni03D9 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+03da uni03DA 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+03db uni03DB 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+03dc uni03DC 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+03dd uni03DD 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+03de uni03DE 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+03df uni03DF 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+03e0 uni03E0 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+03e1 uni03E1 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+03e2 uni03E2 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+03e3 uni03E3 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+03e4 uni03E4 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+03e5 uni03E5 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+03e6 uni03E6 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+03e7 uni03E7 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+03e8 uni03E8 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+03e9 uni03E9 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+03ea uni03EA 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+03eb uni03EB 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+03ec uni03EC 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+03ed uni03ED 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+03ee uni03EE 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+03ef uni03EF 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+03f0 uni03F0 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+03f1 uni03F1 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+03f2 uni03F2 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+03f3 uni03F3 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+03f4 uni03F4 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+03f5 uni03F5 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+03f6 uni03F6 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+03f7 uni03F7 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+03f8 uni03F8 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+03f9 uni03F9 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+03fa uni03FA 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+03fb uni03FB 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+03fc uni03FC 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+03fd uni03FD 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+03fe uni03FE 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+03ff uni03FF 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+0400 uni0400 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.4 (Sans ExtraLight) +U+0401 afii10023 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.4 (Sans ExtraLight) +U+0402 afii10051 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.5 (Sans ExtraLight) +U+0403 afii10052 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.4 (Sans ExtraLight) +U+0404 afii10053 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.4 (Sans ExtraLight) +U+0405 afii10054 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.4 (Sans ExtraLight) +U+0406 afii10055 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.4 (Sans ExtraLight) +U+0407 afii10056 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.4 (Sans ExtraLight) +U+0408 afii10057 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.4 (Sans ExtraLight) +U+0409 afii10058 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.5 (Sans ExtraLight) +U+040a afii10059 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.5 (Sans ExtraLight) +U+040b afii10060 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.5 (Sans ExtraLight) +U+040c afii10061 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.4 (Sans ExtraLight) +U+040d uni040D 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.4 (Sans ExtraLight) +U+040e afii10062 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.5 (Sans ExtraLight) +U+040f afii10145 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.5 (Sans ExtraLight) +U+0410 afii10017 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.4 (Sans ExtraLight) +U+0411 afii10018 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.4 (Sans ExtraLight) +U+0412 afii10019 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.4 (Sans ExtraLight) +U+0413 afii10020 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.4 (Sans ExtraLight) +U+0414 afii10021 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.5 (Sans ExtraLight) +U+0415 afii10022 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.4 (Sans ExtraLight) +U+0416 afii10024 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.4 (Sans ExtraLight) +U+0417 afii10025 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.4 (Sans ExtraLight) +U+0418 afii10026 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.4 (Sans ExtraLight) +U+0419 afii10027 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.4 (Sans ExtraLight) +U+041a afii10028 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.4 (Sans ExtraLight) +U+041b afii10029 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.5 (Sans ExtraLight) +U+041c afii10030 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.4 (Sans ExtraLight) +U+041d afii10031 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.4 (Sans ExtraLight) +U+041e afii10032 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.4 (Sans ExtraLight) +U+041f afii10033 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.4 (Sans ExtraLight) +U+0420 afii10034 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.4 (Sans ExtraLight) +U+0421 afii10035 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.4 (Sans ExtraLight) +U+0422 afii10036 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.4 (Sans ExtraLight) +U+0423 afii10037 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.5 (Sans ExtraLight) +U+0424 afii10038 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.5 (Sans ExtraLight) +U+0425 afii10039 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.4 (Sans ExtraLight) +U+0426 afii10040 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.5 (Sans ExtraLight) +U+0427 afii10041 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.5 (Sans ExtraLight) +U+0428 afii10042 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.5 (Sans ExtraLight) +U+0429 afii10043 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.5 (Sans ExtraLight) +U+042a afii10044 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.4 (Sans ExtraLight) +U+042b afii10045 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.4 (Sans ExtraLight) +U+042c afii10046 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.4 (Sans ExtraLight) +U+042d afii10047 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.4 (Sans ExtraLight) +U+042e afii10048 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.5 (Sans ExtraLight) +U+042f afii10049 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.4 (Sans ExtraLight) +U+0430 afii10065 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.4 (Sans ExtraLight) +U+0431 afii10066 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.5 (Sans ExtraLight) +U+0432 afii10067 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.4 (Sans ExtraLight) +U+0433 afii10068 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.4 (Sans ExtraLight) +U+0434 afii10069 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.5 (Sans ExtraLight) +U+0435 afii10070 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.4 (Sans ExtraLight) +U+0436 afii10072 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.4 (Sans ExtraLight) +U+0437 afii10073 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.4 (Sans ExtraLight) +U+0438 afii10074 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.4 (Sans ExtraLight) +U+0439 afii10075 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.4 (Sans ExtraLight) +U+043a afii10076 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.4 (Sans ExtraLight) +U+043b afii10077 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.5 (Sans ExtraLight) +U+043c afii10078 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.5 (Sans ExtraLight) +U+043d afii10079 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.4 (Sans ExtraLight) +U+043e afii10080 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.4 (Sans ExtraLight) +U+043f afii10081 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.4 (Sans ExtraLight) +U+0440 afii10082 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.4 (Sans ExtraLight) +U+0441 afii10083 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.4 (Sans ExtraLight) +U+0442 afii10084 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.4 (Sans ExtraLight) +U+0443 afii10085 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.4 (Sans ExtraLight) +U+0444 afii10086 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.5 (Sans ExtraLight) +U+0445 afii10087 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.4 (Sans ExtraLight) +U+0446 afii10088 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.5 (Sans ExtraLight) +U+0447 afii10089 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.5 (Sans ExtraLight) +U+0448 afii10090 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.5 (Sans ExtraLight) +U+0449 afii10091 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.5 (Sans ExtraLight) +U+044a afii10092 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.5 (Sans ExtraLight) +U+044b afii10093 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.5 (Sans ExtraLight) +U+044c afii10094 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.5 (Sans ExtraLight) +U+044d afii10095 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.4 (Sans ExtraLight) +U+044e afii10096 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.5 (Sans ExtraLight) +U+044f afii10097 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.4 (Sans ExtraLight) +U+0450 uni0450 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.4 (Sans ExtraLight) +U+0451 afii10071 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.4 (Sans ExtraLight) +U+0452 afii10099 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.5 (Sans ExtraLight) +U+0453 afii10100 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.4 (Sans ExtraLight) +U+0454 afii10101 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.4 (Sans ExtraLight) +U+0455 afii10102 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.4 (Sans ExtraLight) +U+0456 afii10103 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.4 (Sans ExtraLight) +U+0457 afii10104 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.4 (Sans ExtraLight) +U+0458 afii10105 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.4 (Sans ExtraLight) +U+0459 afii10106 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.5 (Sans ExtraLight) +U+045a afii10107 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.5 (Sans ExtraLight) +U+045b afii10108 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.5 (Sans ExtraLight) +U+045c afii10109 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.4 (Sans ExtraLight) +U+045d uni045D 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.4 (Sans ExtraLight) +U+045e afii10110 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.4 (Sans ExtraLight) +U+045f afii10193 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Oblique, Serif Oblique) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) 2.5 (Sans ExtraLight) +U+0460 uni0460 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0461 uni0461 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) +U+0462 afii10146 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+0463 afii10194 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+0464 uni0464 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+0465 uni0465 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+0466 uni0466 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0467 uni0467 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0468 uni0468 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0469 uni0469 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+046a uni046A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+046b uni046B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+046c uni046C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+046d uni046D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+046e uni046E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+046f uni046F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0470 uni0470 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) +U+0471 uni0471 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) +U+0472 afii10147 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.10 (Sans ExtraLight) +U+0473 afii10195 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+0474 afii10148 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.12 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+0475 afii10196 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.12 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+0476 uni0476 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0477 uni0477 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0478 uni0478 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0479 uni0479 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+047a uni047A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+047b uni047B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+047c uni047C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+047d uni047D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+047e uni047E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+047f uni047F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0480 uni0480 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0481 uni0481 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0482 uni0482 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0483 uni0483 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0484 uni0484 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0485 uni0485 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0486 uni0486 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0487 uni0487 2.9 (Sans, Sans Condensed) +U+0488 uni0488 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0489 uni0489 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+048a uni048A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+048b uni048B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+048c uni048C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+048d uni048D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+048e uni048E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+048f uni048F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0490 afii10050 1.15 +U+0491 afii10098 1.15 +U+0492 uni0492 1.14 +U+0493 uni0493 1.14 +U+0494 uni0494 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0495 uni0495 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0496 uni0496 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.15 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+0497 uni0497 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.15 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+0498 uni0498 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+0499 uni0499 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+049a uni049A 1.14 +U+049b uni049B 1.14 +U+049c uni049C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+049d uni049D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+049e uni049E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+049f uni049F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+04a0 uni04A0 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+04a1 uni04A1 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+04a2 uni04A2 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+04a3 uni04A3 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+04a4 uni04A4 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.10 (Sans ExtraLight) +U+04a5 uni04A5 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.10 (Sans ExtraLight) +U+04a6 uni04A6 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+04a7 uni04A7 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+04a8 uni04A8 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+04a9 uni04A9 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+04aa uni04AA 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+04ab uni04AB 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+04ac uni04AC 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+04ad uni04AD 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+04ae uni04AE 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+04af uni04AF 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+04b0 uni04B0 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+04b1 uni04B1 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+04b2 uni04B2 1.14 +U+04b3 uni04B3 1.14 +U+04b4 uni04B4 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.10 (Sans ExtraLight) +U+04b5 uni04B5 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.10 (Sans ExtraLight) +U+04b6 uni04B6 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+04b7 uni04B7 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+04b8 uni04B8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+04b9 uni04B9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+04ba uni04BA 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans ExtraLight) +U+04bb uni04BB 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+04bc uni04BC 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+04bd uni04BD 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+04be uni04BE 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+04bf uni04BF 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+04c0 uni04C0 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+04c1 uni04C1 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans ExtraLight) +U+04c2 uni04C2 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans ExtraLight) +U+04c3 uni04C3 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+04c4 uni04C4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+04c5 uni04C5 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+04c6 uni04C6 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+04c7 uni04C7 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+04c8 uni04C8 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+04c9 uni04C9 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+04ca uni04CA 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+04cb uni04CB 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+04cc uni04CC 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+04cd uni04CD 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+04ce uni04CE 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+04cf uni04CF 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+04d0 uni04D0 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+04d1 uni04D1 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+04d2 uni04D2 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+04d3 uni04D3 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+04d4 uni04D4 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+04d5 uni04D5 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+04d6 uni04D6 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+04d7 uni04D7 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+04d8 uni04D8 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+04d9 afii10846 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+04da uni04DA 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+04db uni04DB 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+04dc uni04DC 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans ExtraLight) +U+04dd uni04DD 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans ExtraLight) +U+04de uni04DE 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+04df uni04DF 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+04e0 uni04E0 2.3 +U+04e1 uni04E1 2.3 +U+04e2 uni04E2 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+04e3 uni04E3 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+04e4 uni04E4 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+04e5 uni04E5 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+04e6 uni04E6 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+04e7 uni04E7 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+04e8 uni04E8 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+04e9 uni04E9 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+04ea uni04EA 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+04eb uni04EB 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+04ec uni04EC 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans ExtraLight) +U+04ed uni04ED 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans ExtraLight) +U+04ee uni04EE 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans ExtraLight) +U+04ef uni04EF 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+04f0 uni04F0 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans ExtraLight) +U+04f1 uni04F1 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+04f2 uni04F2 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans ExtraLight) +U+04f3 uni04F3 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+04f4 uni04F4 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans ExtraLight) +U+04f5 uni04F5 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans ExtraLight) +U+04f6 uni04F6 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+04f7 uni04F7 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+04f8 uni04F8 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+04f9 uni04F9 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans ExtraLight) +U+04fa uni04FA 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+04fb uni04FB 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+04fc uni04FC 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+04fd uni04FD 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+04fe uni04FE 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+04ff uni04FF 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0500 uni0500 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0501 uni0501 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0502 uni0502 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0503 uni0503 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0504 uni0504 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0505 uni0505 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0506 uni0506 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0507 uni0507 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0508 uni0508 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0509 uni0509 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+050a uni050A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+050b uni050B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+050c uni050C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+050d uni050D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+050e uni050E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+050f uni050F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0510 uni0510 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0511 uni0511 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0512 uni0512 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0513 uni0513 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0531 uni0531 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0532 uni0532 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0533 uni0533 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0534 uni0534 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0535 uni0535 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0536 uni0536 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0537 uni0537 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0538 uni0538 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0539 uni0539 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+053a uni053A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+053b uni053B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+053c uni053C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+053d uni053D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+053e uni053E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+053f uni053F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0540 uni0540 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0541 uni0541 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0542 uni0542 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0543 uni0543 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0544 uni0544 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0545 uni0545 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0546 uni0546 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0547 uni0547 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0548 uni0548 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+0549 uni0549 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+054a uni054A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+054b uni054B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+054c uni054C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+054d uni054D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) +U+054e uni054E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+054f uni054F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) +U+0550 uni0550 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0551 uni0551 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0552 uni0552 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0553 uni0553 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+0554 uni0554 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0555 uni0555 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) +U+0556 uni0556 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0559 uni0559 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+055a uni055A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) +U+055b uni055B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+055c uni055C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+055d uni055D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) +U+055e uni055E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+055f uni055F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0561 uni0561 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+0562 uni0562 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0563 uni0563 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0564 uni0564 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0565 uni0565 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0566 uni0566 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0567 uni0567 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0568 uni0568 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0569 uni0569 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+056a uni056A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+056b uni056B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+056c uni056C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+056d uni056D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) +U+056e uni056E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+056f uni056F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) +U+0570 uni0570 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) +U+0571 uni0571 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0572 uni0572 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0573 uni0573 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0574 uni0574 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0575 uni0575 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) +U+0576 uni0576 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0577 uni0577 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0578 uni0578 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) +U+0579 uni0579 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+057a uni057A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+057b uni057B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+057c uni057C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+057d uni057D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) +U+057e uni057E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+057f uni057F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) +U+0580 uni0580 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) +U+0581 uni0581 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) +U+0582 uni0582 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0583 uni0583 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) +U+0584 uni0584 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0585 uni0585 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) +U+0586 uni0586 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0587 uni0587 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0589 uni0589 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) +U+058a uni058A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05b0 afii57799 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05b1 afii57801 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05b2 afii57800 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05b3 afii57802 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05b4 afii57793 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05b5 afii57794 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05b6 afii57795 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05b7 afii57798 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05b8 afii57797 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05b9 afii57806 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05bb afii57796 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05bc afii57807 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05bd afii57839 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05be afii57645 2.9 (Sans Condensed Oblique, Sans Oblique) +U+05bf afii57841 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05c0 afii57842 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05c1 afii57804 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05c2 afii57803 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05c3 afii57658 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05c6 uni05C6 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05c7 uni05C7 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05d0 afii57664 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05d1 afii57665 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05d2 afii57666 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05d3 afii57667 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05d4 afii57668 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05d5 afii57669 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05d6 afii57670 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05d7 afii57671 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05d8 afii57672 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05d9 afii57673 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05da afii57674 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05db afii57675 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05dc afii57676 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05dd afii57677 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05de afii57678 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05df afii57679 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05e0 afii57680 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05e1 afii57681 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05e2 afii57682 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05e3 afii57683 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05e4 afii57684 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05e5 afii57685 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05e6 afii57686 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05e7 afii57687 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05e8 afii57688 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05e9 afii57689 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05ea afii57690 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05f0 afii57716 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05f1 afii57717 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05f2 afii57718 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+060c afii57388 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0615 uni0615 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+061b afii57403 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+061f afii57407 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0621 afii57409 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0622 afii57410 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0623 afii57411 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0624 afii57412 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0625 afii57413 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0626 afii57414 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0627 afii57415 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0628 afii57416 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0629 afii57417 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+062a afii57418 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+062b afii57419 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+062c afii57420 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+062d afii57421 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+062e afii57422 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+062f afii57423 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0630 afii57424 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0631 afii57425 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0632 afii57426 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0633 afii57427 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0634 afii57428 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0635 afii57429 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0636 afii57430 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0637 afii57431 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0638 afii57432 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0639 afii57433 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+063a afii57434 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0640 afii57440 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0641 afii57441 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0642 afii57442 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0643 afii57443 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0644 afii57444 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0645 afii57445 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0646 afii57446 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0647 afii57470 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0648 afii57448 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0649 afii57449 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+064a afii57450 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+064b afii57451 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+064c afii57452 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+064d afii57453 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+064e afii57454 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+064f afii57455 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0650 afii57456 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0651 afii57457 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0652 afii57458 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0653 uni0653 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0654 uni0654 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0655 uni0655 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+065a uni065A 2.7 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0660 afii57392 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0661 afii57393 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0662 afii57394 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0663 afii57395 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0664 afii57396 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0665 afii57397 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0666 afii57398 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0667 afii57399 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0668 afii57400 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0669 afii57401 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+066a afii57381 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+066b uni066B 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+066c uni066C 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+066d afii63167 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+066e uni066E 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+066f uni066F 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0674 uni0674 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans ExtraLight) +U+0679 afii57511 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+067a uni067A 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+067b uni067B 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+067c uni067C 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+067d uni067D 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+067e afii57506 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+067f uni067F 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0680 uni0680 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0681 uni0681 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0682 uni0682 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0683 uni0683 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0684 uni0684 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0685 uni0685 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0686 afii57507 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0687 uni0687 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0691 afii57513 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0692 uni0692 2.7 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0695 uni0695 2.7 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0698 afii57508 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+06a1 uni06A1 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+06a4 afii57505 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+06a6 uni06A6 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+06a9 uni06A9 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+06af afii57509 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+06b5 uni06B5 2.7 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+06ba afii57514 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+06bf uni06BF 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+06c6 uni06C6 2.7 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+06cc uni06CC 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+06ce uni06CE 2.7 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+06d5 uni06D5 2.10 (Sans, Sans Bold) 2.11 (Sans Condensed, Sans Condensed Bold) +U+06f0 uni06F0 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+06f1 uni06F1 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+06f2 uni06F2 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+06f3 uni06F3 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+06f4 uni06F4 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+06f5 uni06F5 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+06f6 uni06F6 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+06f7 uni06F7 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+06f8 uni06F8 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+06f9 uni06F9 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0e3f uni0E3F 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+0e81 uni0E81 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0e82 uni0E82 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0e84 uni0E84 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0e87 uni0E87 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0e88 uni0E88 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0e8a uni0E8A 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0e8d uni0E8D 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0e94 uni0E94 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0e95 uni0E95 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0e96 uni0E96 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0e97 uni0E97 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0e99 uni0E99 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0e9a uni0E9A 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0e9b uni0E9B 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0e9c uni0E9C 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0e9d uni0E9D 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0e9e uni0E9E 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0e9f uni0E9F 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0ea1 uni0EA1 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0ea2 uni0EA2 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0ea3 uni0EA3 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0ea5 uni0EA5 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0ea7 uni0EA7 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0eaa uni0EAA 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0eab uni0EAB 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0ead uni0EAD 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0eae uni0EAE 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0eaf uni0EAF 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0eb0 uni0EB0 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+0eb1 uni0EB1 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+0eb2 uni0EB2 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+0eb3 uni0EB3 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+0eb4 uni0EB4 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+0eb5 uni0EB5 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+0eb6 uni0EB6 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+0eb7 uni0EB7 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+0eb8 uni0EB8 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+0eb9 uni0EB9 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+0ebb uni0EBB 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+0ebc uni0EBC 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+0ebd uni0EBD 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+0ec0 uni0EC0 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+0ec1 uni0EC1 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+0ec2 uni0EC2 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+0ec3 uni0EC3 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+0ec4 uni0EC4 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+0ec6 uni0EC6 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+0ec8 uni0EC8 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+0ec9 uni0EC9 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+0eca uni0ECA 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+0ecb uni0ECB 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+0ecc uni0ECC 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+0ecd uni0ECD 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+0edc uni0EDC 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+0edd uni0EDD 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+1401 uni1401 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1402 uni1402 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1403 uni1403 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1404 uni1404 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1405 uni1405 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1406 uni1406 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1407 uni1407 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1409 uni1409 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+140a uni140A 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+140b uni140B 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+140c uni140C 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+140d uni140D 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+140e uni140E 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+140f uni140F 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1410 uni1410 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1411 uni1411 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1412 uni1412 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1413 uni1413 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1414 uni1414 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1415 uni1415 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1416 uni1416 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1417 uni1417 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1418 uni1418 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1419 uni1419 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+141a uni141A 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+141b uni141B 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+141d uni141D 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+141e uni141E 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+141f uni141F 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1420 uni1420 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1421 uni1421 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1422 uni1422 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1423 uni1423 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1424 uni1424 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1425 uni1425 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1426 uni1426 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1427 uni1427 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1428 uni1428 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1429 uni1429 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+142a uni142A 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+142b uni142B 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+142c uni142C 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+142d uni142D 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+142e uni142E 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+142f uni142F 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1430 uni1430 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1431 uni1431 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1432 uni1432 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1433 uni1433 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1434 uni1434 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1435 uni1435 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1437 uni1437 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1438 uni1438 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1439 uni1439 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+143a uni143A 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+143b uni143B 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+143c uni143C 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+143d uni143D 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+143e uni143E 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+143f uni143F 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1440 uni1440 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1441 uni1441 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1442 uni1442 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1443 uni1443 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1444 uni1444 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1445 uni1445 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1446 uni1446 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1447 uni1447 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1448 uni1448 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1449 uni1449 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+144a uni144A 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+144c uni144C 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+144d uni144D 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+144e uni144E 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+144f uni144F 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1450 uni1450 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1451 uni1451 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1452 uni1452 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1454 uni1454 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1455 uni1455 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1456 uni1456 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1457 uni1457 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1458 uni1458 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1459 uni1459 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+145a uni145A 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+145b uni145B 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+145c uni145C 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+145d uni145D 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+145e uni145E 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+145f uni145F 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1460 uni1460 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1461 uni1461 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1462 uni1462 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1463 uni1463 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1464 uni1464 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1465 uni1465 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1466 uni1466 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1467 uni1467 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1468 uni1468 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1469 uni1469 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+146a uni146A 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+146b uni146B 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+146c uni146C 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+146d uni146D 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+146e uni146E 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+146f uni146F 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1470 uni1470 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1471 uni1471 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1472 uni1472 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1473 uni1473 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1474 uni1474 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1475 uni1475 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1476 uni1476 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1477 uni1477 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1478 uni1478 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1479 uni1479 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+147a uni147A 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+147b uni147B 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+147c uni147C 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+147d uni147D 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+147e uni147E 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+147f uni147F 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1480 uni1480 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1481 uni1481 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1482 uni1482 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1483 uni1483 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1484 uni1484 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1485 uni1485 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1486 uni1486 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1487 uni1487 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1488 uni1488 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1489 uni1489 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+148a uni148A 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+148b uni148B 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+148c uni148C 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+148d uni148D 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+148e uni148E 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+148f uni148F 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1490 uni1490 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1491 uni1491 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1492 uni1492 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1493 uni1493 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1494 uni1494 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1495 uni1495 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1496 uni1496 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1497 uni1497 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1498 uni1498 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1499 uni1499 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+149a uni149A 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+149b uni149B 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+149c uni149C 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+149d uni149D 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+149e uni149E 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+149f uni149F 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14a0 uni14A0 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14a1 uni14A1 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14a2 uni14A2 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14a3 uni14A3 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14a4 uni14A4 2.13 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Condensed Oblique, Sans Oblique) 2.15 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+14a5 uni14A5 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14a6 uni14A6 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14a7 uni14A7 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14a8 uni14A8 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14a9 uni14A9 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14aa uni14AA 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14ab uni14AB 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14ac uni14AC 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14ad uni14AD 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14ae uni14AE 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14af uni14AF 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14b0 uni14B0 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14b1 uni14B1 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14b2 uni14B2 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14b3 uni14B3 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14b4 uni14B4 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14b5 uni14B5 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14b6 uni14B6 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14b7 uni14B7 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14b8 uni14B8 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14b9 uni14B9 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14ba uni14BA 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14bb uni14BB 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14bc uni14BC 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14bd uni14BD 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14c0 uni14C0 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14c1 uni14C1 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14c2 uni14C2 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14c3 uni14C3 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14c4 uni14C4 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14c5 uni14C5 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14c6 uni14C6 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14c7 uni14C7 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14c8 uni14C8 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14c9 uni14C9 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14ca uni14CA 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14cb uni14CB 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14cc uni14CC 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14cd uni14CD 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14ce uni14CE 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14cf uni14CF 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14d0 uni14D0 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14d1 uni14D1 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14d2 uni14D2 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14d3 uni14D3 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14d4 uni14D4 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14d5 uni14D5 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14d6 uni14D6 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14d7 uni14D7 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14d8 uni14D8 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14d9 uni14D9 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14da uni14DA 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14db uni14DB 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14dc uni14DC 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14dd uni14DD 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14de uni14DE 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14df uni14DF 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14e0 uni14E0 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14e1 uni14E1 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14e2 uni14E2 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14e3 uni14E3 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14e4 uni14E4 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14e5 uni14E5 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14e6 uni14E6 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14e7 uni14E7 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14e8 uni14E8 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14e9 uni14E9 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14ea uni14EA 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14ec uni14EC 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14ed uni14ED 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14ee uni14EE 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14ef uni14EF 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14f0 uni14F0 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14f1 uni14F1 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14f2 uni14F2 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14f3 uni14F3 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14f4 uni14F4 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14f5 uni14F5 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14f6 uni14F6 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14f7 uni14F7 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14f8 uni14F8 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14f9 uni14F9 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14fa uni14FA 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14fb uni14FB 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14fc uni14FC 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14fd uni14FD 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14fe uni14FE 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14ff uni14FF 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1500 uni1500 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1501 uni1501 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1502 uni1502 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1503 uni1503 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1504 uni1504 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1505 uni1505 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1506 uni1506 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1507 uni1507 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1510 uni1510 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1511 uni1511 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1512 uni1512 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1513 uni1513 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1514 uni1514 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1515 uni1515 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1516 uni1516 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1517 uni1517 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1518 uni1518 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1519 uni1519 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+151a uni151A 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+151b uni151B 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+151c uni151C 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+151d uni151D 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+151e uni151E 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+151f uni151F 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1520 uni1520 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1521 uni1521 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1522 uni1522 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1523 uni1523 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1524 uni1524 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1525 uni1525 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1526 uni1526 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1527 uni1527 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1528 uni1528 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1529 uni1529 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+152a uni152A 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+152b uni152B 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+152c uni152C 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+152d uni152D 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+152e uni152E 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+152f uni152F 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1530 uni1530 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1531 uni1531 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1532 uni1532 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1533 uni1533 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1534 uni1534 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1535 uni1535 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1536 uni1536 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1537 uni1537 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1538 uni1538 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1539 uni1539 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+153a uni153A 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+153b uni153B 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+153c uni153C 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+153d uni153D 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+153e uni153E 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1540 uni1540 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1541 uni1541 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1542 uni1542 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1543 uni1543 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1544 uni1544 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1545 uni1545 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1546 uni1546 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1547 uni1547 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1548 uni1548 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1549 uni1549 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+154a uni154A 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+154b uni154B 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+154c uni154C 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+154d uni154D 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+154e uni154E 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+154f uni154F 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1550 uni1550 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1552 uni1552 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1553 uni1553 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1554 uni1554 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1555 uni1555 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1556 uni1556 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1557 uni1557 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1558 uni1558 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1559 uni1559 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+155a uni155A 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+155b uni155B 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+155c uni155C 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+155d uni155D 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+155e uni155E 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+155f uni155F 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1560 uni1560 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1561 uni1561 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1562 uni1562 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1563 uni1563 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1564 uni1564 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1565 uni1565 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1566 uni1566 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1567 uni1567 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1568 uni1568 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1569 uni1569 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+156a uni156A 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1574 uni1574 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1575 uni1575 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1576 uni1576 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1577 uni1577 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1578 uni1578 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1579 uni1579 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+157a uni157A 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+157b uni157B 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+157c uni157C 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+157d uni157D 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+157e uni157E 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+157f uni157F 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1580 uni1580 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1581 uni1581 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1582 uni1582 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1583 uni1583 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1584 uni1584 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1585 uni1585 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+158a uni158A 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+158b uni158B 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+158c uni158C 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+158d uni158D 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+158e uni158E 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+158f uni158F 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1590 uni1590 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1591 uni1591 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1592 uni1592 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1593 uni1593 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1594 uni1594 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1595 uni1595 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1596 uni1596 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+15a0 uni15A0 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+15a1 uni15A1 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+15a2 uni15A2 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+15a3 uni15A3 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+15a4 uni15A4 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+15a5 uni15A5 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+15a6 uni15A6 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+15a7 uni15A7 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+15a8 uni15A8 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+15a9 uni15A9 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+15aa uni15AA 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+15ab uni15AB 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+15ac uni15AC 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+15ad uni15AD 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+15ae uni15AE 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+15af uni15AF 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+15de uni15DE 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+15e1 uni15E1 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1646 uni1646 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1647 uni1647 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+166e uni166E 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+166f uni166F 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1670 uni1670 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1671 uni1671 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1672 uni1672 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1673 uni1673 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1674 uni1674 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1675 uni1675 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1676 uni1676 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d00 uni1D00 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d01 uni1D01 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d02 uni1D02 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight) +U+1d03 uni1D03 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d04 uni1D04 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) +U+1d05 uni1D05 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d06 uni1D06 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d07 uni1D07 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d08 uni1D08 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+1d09 uni1D09 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight) +U+1d0a uni1D0A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d0b uni1D0B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) +U+1d0c uni1D0C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d0d uni1D0D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) +U+1d0e uni1D0E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) +U+1d0f uni1D0F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) +U+1d10 uni1D10 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) +U+1d11 uni1D11 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) +U+1d12 uni1D12 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) +U+1d13 uni1D13 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) +U+1d14 uni1D14 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight) +U+1d16 uni1D16 2.3 +U+1d17 uni1D17 2.3 +U+1d18 uni1D18 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d19 uni1D19 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d1a uni1D1A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d1b uni1D1B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d1c uni1D1C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d1d uni1D1D 2.3 +U+1d1e uni1D1E 2.3 +U+1d1f uni1D1F 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+1d20 uni1D20 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) +U+1d21 uni1D21 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) +U+1d22 uni1D22 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) +U+1d23 uni1D23 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d26 uni1D26 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) +U+1d27 uni1D27 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) +U+1d28 uni1D28 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) +U+1d29 uni1D29 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d2a uni1D2A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d2b uni1D2B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d2c uni1D2C 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+1d2d uni1D2D 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+1d2e uni1D2E 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+1d30 uni1D30 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+1d31 uni1D31 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+1d32 uni1D32 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+1d33 uni1D33 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+1d34 uni1D34 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+1d35 uni1D35 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+1d36 uni1D36 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+1d37 uni1D37 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+1d38 uni1D38 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+1d39 uni1D39 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+1d3a uni1D3A 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+1d3b uni1D3B 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+1d3c uni1D3C 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+1d3d uni1D3D 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+1d3e uni1D3E 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+1d3f uni1D3F 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+1d40 uni1D40 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+1d41 uni1D41 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+1d42 uni1D42 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+1d43 uni1D43 2.3 +U+1d44 uni1D44 2.3 +U+1d45 uni1D45 2.3 +U+1d46 uni1D46 2.3 +U+1d47 uni1D47 2.3 +U+1d48 uni1D48 2.3 +U+1d49 uni1D49 2.3 +U+1d4a uni1D4A 2.3 +U+1d4b uni1D4B 2.3 +U+1d4c uni1D4C 2.3 +U+1d4d uni1D4D 2.3 +U+1d4e uni1D4E 2.3 +U+1d4f uni1D4F 2.3 +U+1d50 uni1D50 2.3 +U+1d51 uni1D51 2.3 +U+1d52 uni1D52 2.3 +U+1d53 uni1D53 2.3 +U+1d54 uni1D54 2.3 +U+1d55 uni1D55 2.3 +U+1d56 uni1D56 2.3 +U+1d57 uni1D57 2.3 +U+1d58 uni1D58 2.3 +U+1d59 uni1D59 2.3 +U+1d5a uni1D5A 2.3 +U+1d5b uni1D5B 2.3 +U+1d5c uni1D5C 2.10 (Sans Oblique) 2.11 (Sans Condensed Oblique) +U+1d5d uni1D5D 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+1d5e uni1D5E 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+1d5f uni1D5F 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+1d60 uni1D60 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+1d61 uni1D61 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+1d62 uni1D62 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+1d63 uni1D63 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+1d64 uni1D64 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+1d65 uni1D65 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+1d66 uni1D66 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+1d67 uni1D67 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+1d68 uni1D68 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+1d69 uni1D69 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+1d6a uni1D6A 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+1d77 uni1D77 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight) +U+1d78 uni1D78 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+1d7b uni1D7B 2.3 +U+1d85 uni1D85 2.3 +U+1d9b uni1D9B 2.3 +U+1d9c uni1D9C 2.3 +U+1d9d uni1D9D 2.3 +U+1d9e uni1D9E 2.3 +U+1d9f uni1D9F 2.3 +U+1da0 uni1DA0 2.3 +U+1da1 uni1DA1 2.3 +U+1da2 uni1DA2 2.3 +U+1da3 uni1DA3 2.3 +U+1da4 uni1DA4 2.3 +U+1da5 uni1DA5 2.3 +U+1da6 uni1DA6 2.3 +U+1da7 uni1DA7 2.3 +U+1da8 uni1DA8 2.3 +U+1da9 uni1DA9 2.3 +U+1daa uni1DAA 2.3 +U+1dab uni1DAB 2.3 +U+1dac uni1DAC 2.3 +U+1dad uni1DAD 2.3 +U+1dae uni1DAE 2.3 +U+1daf uni1DAF 2.3 +U+1db0 uni1DB0 2.3 +U+1db1 uni1DB1 2.3 +U+1db2 uni1DB2 2.3 +U+1db3 uni1DB3 2.3 +U+1db4 uni1DB4 2.3 +U+1db5 uni1DB5 2.3 +U+1db6 uni1DB6 2.3 +U+1db7 uni1DB7 2.3 +U+1db8 uni1DB8 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+1db9 uni1DB9 2.3 +U+1dba uni1DBA 2.3 +U+1dbb uni1DBB 2.3 +U+1dbc uni1DBC 2.3 +U+1dbd uni1DBD 2.3 +U+1dbe uni1DBE 2.3 +U+1dbf uni1DBF 2.3 +U+1dc4 uni1DC4 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1dc5 uni1DC5 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1dc6 uni1DC6 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1dc7 uni1DC7 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1dc8 uni1DC8 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1dc9 uni1DC9 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1e00 uni1E00 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e01 uni1E01 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e02 uni1E02 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e03 uni1E03 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e04 uni1E04 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e05 uni1E05 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e06 uni1E06 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e07 uni1E07 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e08 uni1E08 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+1e09 uni1E09 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+1e0a uni1E0A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e0b uni1E0B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e0c uni1E0C 2.1 +U+1e0d uni1E0D 2.1 +U+1e0e uni1E0E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e0f uni1E0F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e10 uni1E10 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+1e11 uni1E11 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+1e12 uni1E12 1.13 +U+1e13 uni1E13 1.13 +U+1e14 uni1E14 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans ExtraLight) +U+1e15 uni1E15 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans ExtraLight) +U+1e16 uni1E16 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans ExtraLight) +U+1e17 uni1E17 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans ExtraLight) +U+1e18 uni1E18 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e19 uni1E19 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e1a uni1E1A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e1b uni1E1B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e1c uni1E1C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e1d uni1E1D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e1e uni1E1E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e1f uni1E1F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e20 uni1E20 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e21 uni1E21 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e22 uni1E22 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e23 uni1E23 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e24 uni1E24 2.1 +U+1e25 uni1E25 2.1 +U+1e26 uni1E26 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+1e27 uni1E27 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+1e28 uni1E28 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e29 uni1E29 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e2a uni1E2A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e2b uni1E2B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e2c uni1E2C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e2d uni1E2D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e2e uni1E2E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1e2f uni1E2F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1e30 uni1E30 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e31 uni1E31 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e32 uni1E32 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e33 uni1E33 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e34 uni1E34 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e35 uni1E35 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e36 uni1E36 2.1 +U+1e37 uni1E37 2.1 +U+1e38 uni1E38 2.1 +U+1e39 uni1E39 2.1 +U+1e3a uni1E3A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e3b uni1E3B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e3c uni1E3C 1.13 +U+1e3d uni1E3D 1.13 +U+1e3e uni1E3E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e3f uni1E3F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e40 uni1E40 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e41 uni1E41 2.1 +U+1e42 uni1E42 2.1 +U+1e43 uni1E43 2.1 +U+1e44 uni1E44 1.13 +U+1e45 uni1E45 1.13 +U+1e46 uni1E46 2.1 +U+1e47 uni1E47 2.1 +U+1e48 uni1E48 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e49 uni1E49 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e4a uni1E4A 1.13 +U+1e4b uni1E4B 1.13 +U+1e4c uni1E4C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1e4d uni1E4D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1e4e uni1E4E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1e4f uni1E4F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1e50 uni1E50 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans ExtraLight) +U+1e51 uni1E51 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans ExtraLight) +U+1e52 uni1E52 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans ExtraLight) +U+1e53 uni1E53 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans ExtraLight) +U+1e54 uni1E54 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+1e55 uni1E55 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+1e56 uni1E56 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e57 uni1E57 2.1 +U+1e58 uni1E58 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e59 uni1E59 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e5a uni1E5A 2.1 +U+1e5b uni1E5B 2.1 +U+1e5c uni1E5C 2.1 +U+1e5d uni1E5D 2.1 +U+1e5e uni1E5E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e5f uni1E5F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e60 uni1E60 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e61 uni1E61 2.1 +U+1e62 uni1E62 2.1 +U+1e63 uni1E63 2.1 +U+1e64 uni1E64 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1e65 uni1E65 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1e66 uni1E66 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1e67 uni1E67 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1e68 uni1E68 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e69 uni1E69 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e6a uni1E6A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e6b uni1E6B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e6c uni1E6C 2.1 +U+1e6d uni1E6D 2.1 +U+1e6e uni1E6E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e6f uni1E6F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e70 uni1E70 1.13 +U+1e71 uni1E71 1.13 +U+1e72 uni1E72 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e73 uni1E73 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e74 uni1E74 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e75 uni1E75 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e76 uni1E76 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e77 uni1E77 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e78 uni1E78 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans ExtraLight) +U+1e79 uni1E79 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans ExtraLight) +U+1e7a uni1E7A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans ExtraLight) +U+1e7b uni1E7B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans ExtraLight) +U+1e7c uni1E7C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+1e7d uni1E7D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+1e7e uni1E7E 2.1 +U+1e7f uni1E7F 2.1 +U+1e80 Wgrave 1.2 +U+1e81 wgrave 1.2 +U+1e82 Wacute 1.2 +U+1e83 wacute 1.2 +U+1e84 Wdieresis 1.2 +U+1e85 wdieresis 1.2 +U+1e86 uni1E86 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e87 uni1E87 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e88 uni1E88 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e89 uni1E89 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e8a uni1E8A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e8b uni1E8B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e8c uni1E8C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+1e8d uni1E8D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+1e8e uni1E8E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e8f uni1E8F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e90 uni1E90 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+1e91 uni1E91 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+1e92 uni1E92 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e93 uni1E93 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e94 uni1E94 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e95 uni1E95 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e96 uni1E96 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e97 uni1E97 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+1e98 uni1E98 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+1e99 uni1E99 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+1e9a uni1E9A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.10 (Sans ExtraLight) +U+1e9b uni1E9B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1ea0 uni1EA0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1ea1 uni1EA1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1ea2 uni1EA2 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans ExtraLight) +U+1ea3 uni1EA3 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans ExtraLight) +U+1ea4 uni1EA4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1ea5 uni1EA5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1ea6 uni1EA6 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1ea7 uni1EA7 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1ea8 uni1EA8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1ea9 uni1EA9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1eaa uni1EAA 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1eab uni1EAB 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1eac uni1EAC 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+1ead uni1EAD 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+1eae uni1EAE 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans ExtraLight) +U+1eaf uni1EAF 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans ExtraLight) +U+1eb0 uni1EB0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans ExtraLight) +U+1eb1 uni1EB1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans ExtraLight) +U+1eb2 uni1EB2 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans ExtraLight) +U+1eb3 uni1EB3 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans ExtraLight) +U+1eb4 uni1EB4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans ExtraLight) +U+1eb5 uni1EB5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans ExtraLight) +U+1eb6 uni1EB6 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+1eb7 uni1EB7 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+1eb8 uni1EB8 2.2 +U+1eb9 uni1EB9 2.2 +U+1eba uni1EBA 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans ExtraLight) +U+1ebb uni1EBB 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans ExtraLight) +U+1ebc uni1EBC 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1ebd uni1EBD 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1ebe uni1EBE 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1ebf uni1EBF 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1ec0 uni1EC0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1ec1 uni1EC1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1ec2 uni1EC2 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1ec3 uni1EC3 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1ec4 uni1EC4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1ec5 uni1EC5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1ec6 uni1EC6 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+1ec7 uni1EC7 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+1ec8 uni1EC8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans ExtraLight) +U+1ec9 uni1EC9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans ExtraLight) +U+1eca uni1ECA 2.2 +U+1ecb uni1ECB 2.2 +U+1ecc uni1ECC 2.2 +U+1ecd uni1ECD 2.2 +U+1ece uni1ECE 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans ExtraLight) +U+1ecf uni1ECF 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans ExtraLight) +U+1ed0 uni1ED0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1ed1 uni1ED1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1ed2 uni1ED2 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1ed3 uni1ED3 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1ed4 uni1ED4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1ed5 uni1ED5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1ed6 uni1ED6 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1ed7 uni1ED7 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1ed8 uni1ED8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+1ed9 uni1ED9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+1eda uni1EDA 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1edb uni1EDB 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1edc uni1EDC 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1edd uni1EDD 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1ede uni1EDE 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1edf uni1EDF 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1ee0 uni1EE0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1ee1 uni1EE1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1ee2 uni1EE2 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1ee3 uni1EE3 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1ee4 uni1EE4 2.2 +U+1ee5 uni1EE5 2.2 +U+1ee6 uni1EE6 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans ExtraLight) +U+1ee7 uni1EE7 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans ExtraLight) +U+1ee8 uni1EE8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1ee9 uni1EE9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1eea uni1EEA 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1eeb uni1EEB 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1eec uni1EEC 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1eed uni1EED 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1eee uni1EEE 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1eef uni1EEF 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1ef0 uni1EF0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1ef1 uni1EF1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1ef2 Ygrave 1.2 +U+1ef3 ygrave 1.2 +U+1ef4 uni1EF4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1ef5 uni1EF5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1ef6 uni1EF6 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans ExtraLight) +U+1ef7 uni1EF7 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans ExtraLight) +U+1ef8 uni1EF8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1ef9 uni1EF9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1f00 uni1F00 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f01 uni1F01 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f02 uni1F02 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f03 uni1F03 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f04 uni1F04 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f05 uni1F05 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f06 uni1F06 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f07 uni1F07 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f08 uni1F08 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f09 uni1F09 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f0a uni1F0A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f0b uni1F0B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f0c uni1F0C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f0d uni1F0D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f0e uni1F0E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f0f uni1F0F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f10 uni1F10 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f11 uni1F11 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f12 uni1F12 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f13 uni1F13 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f14 uni1F14 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f15 uni1F15 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f18 uni1F18 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f19 uni1F19 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f1a uni1F1A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f1b uni1F1B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f1c uni1F1C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f1d uni1F1D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f20 uni1F20 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f21 uni1F21 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f22 uni1F22 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f23 uni1F23 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f24 uni1F24 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f25 uni1F25 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f26 uni1F26 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f27 uni1F27 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f28 uni1F28 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f29 uni1F29 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f2a uni1F2A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f2b uni1F2B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f2c uni1F2C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f2d uni1F2D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f2e uni1F2E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f2f uni1F2F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f30 uni1F30 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f31 uni1F31 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f32 uni1F32 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f33 uni1F33 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f34 uni1F34 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f35 uni1F35 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f36 uni1F36 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f37 uni1F37 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f38 uni1F38 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f39 uni1F39 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f3a uni1F3A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f3b uni1F3B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f3c uni1F3C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f3d uni1F3D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f3e uni1F3E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f3f uni1F3F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f40 uni1F40 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f41 uni1F41 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f42 uni1F42 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f43 uni1F43 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f44 uni1F44 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f45 uni1F45 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f48 uni1F48 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f49 uni1F49 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f4a uni1F4A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f4b uni1F4B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f4c uni1F4C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f4d uni1F4D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f50 uni1F50 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f51 uni1F51 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f52 uni1F52 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f53 uni1F53 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f54 uni1F54 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f55 uni1F55 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f56 uni1F56 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f57 uni1F57 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f59 uni1F59 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f5b uni1F5B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f5d uni1F5D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f5f uni1F5F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f60 uni1F60 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f61 uni1F61 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f62 uni1F62 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f63 uni1F63 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f64 uni1F64 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f65 uni1F65 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f66 uni1F66 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f67 uni1F67 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f68 uni1F68 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f69 uni1F69 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f6a uni1F6A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f6b uni1F6B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f6c uni1F6C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f6d uni1F6D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f6e uni1F6E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f6f uni1F6F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f70 uni1F70 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1f71 uni1F71 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1f72 uni1F72 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1f73 uni1F73 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1f74 uni1F74 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1f75 uni1F75 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1f76 uni1F76 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f77 uni1F77 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f78 uni1F78 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1f79 uni1F79 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1f7a uni1F7A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f7b uni1F7B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f7c uni1F7C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f7d uni1F7D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f80 uni1F80 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f81 uni1F81 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f82 uni1F82 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f83 uni1F83 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f84 uni1F84 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f85 uni1F85 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f86 uni1F86 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f87 uni1F87 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f88 uni1F88 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f89 uni1F89 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f8a uni1F8A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f8b uni1F8B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f8c uni1F8C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f8d uni1F8D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f8e uni1F8E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f8f uni1F8F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f90 uni1F90 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f91 uni1F91 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f92 uni1F92 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f93 uni1F93 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f94 uni1F94 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f95 uni1F95 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f96 uni1F96 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f97 uni1F97 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f98 uni1F98 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f99 uni1F99 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f9a uni1F9A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f9b uni1F9B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f9c uni1F9C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f9d uni1F9D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f9e uni1F9E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1f9f uni1F9F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1fa0 uni1FA0 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1fa1 uni1FA1 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1fa2 uni1FA2 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1fa3 uni1FA3 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1fa4 uni1FA4 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1fa5 uni1FA5 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1fa6 uni1FA6 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1fa7 uni1FA7 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1fa8 uni1FA8 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1fa9 uni1FA9 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1faa uni1FAA 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1fab uni1FAB 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1fac uni1FAC 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1fad uni1FAD 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1fae uni1FAE 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1faf uni1FAF 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1fb0 uni1FB0 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1fb1 uni1FB1 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1fb2 uni1FB2 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1fb3 uni1FB3 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1fb4 uni1FB4 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1fb6 uni1FB6 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1fb7 uni1FB7 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1fb8 uni1FB8 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1fb9 uni1FB9 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1fba uni1FBA 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1fbb uni1FBB 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1fbc uni1FBC 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1fbd uni1FBD 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1fbe uni1FBE 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1fbf uni1FBF 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1fc0 uni1FC0 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1fc1 uni1FC1 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1fc2 uni1FC2 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1fc3 uni1FC3 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1fc4 uni1FC4 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1fc6 uni1FC6 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1fc7 uni1FC7 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1fc8 uni1FC8 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1fc9 uni1FC9 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1fca uni1FCA 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1fcb uni1FCB 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1fcc uni1FCC 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.10 (Sans ExtraLight) +U+1fcd uni1FCD 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1fce uni1FCE 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1fcf uni1FCF 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1fd0 uni1FD0 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1fd1 uni1FD1 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1fd2 uni1FD2 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1fd3 uni1FD3 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1fd6 uni1FD6 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1fd7 uni1FD7 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1fd8 uni1FD8 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1fd9 uni1FD9 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1fda uni1FDA 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1fdb uni1FDB 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1fdd uni1FDD 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1fde uni1FDE 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1fdf uni1FDF 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1fe0 uni1FE0 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1fe1 uni1FE1 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1fe2 uni1FE2 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1fe3 uni1FE3 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1fe4 uni1FE4 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1fe5 uni1FE5 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1fe6 uni1FE6 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1fe7 uni1FE7 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1fe8 uni1FE8 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1fe9 uni1FE9 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1fea uni1FEA 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1feb uni1FEB 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1fec uni1FEC 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1fed uni1FED 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1fee uni1FEE 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1fef uni1FEF 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1ff2 uni1FF2 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1ff3 uni1FF3 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1ff4 uni1FF4 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1ff6 uni1FF6 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1ff7 uni1FF7 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1ff8 uni1FF8 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1ff9 uni1FF9 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1ffa uni1FFA 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1ffb uni1FFB 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.10 (Sans ExtraLight) +U+1ffc uni1FFC 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+1ffd uni1FFD 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1ffe uni1FFE 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+2000 uni2000 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2001 uni2001 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2002 uni2002 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2003 uni2003 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2004 uni2004 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2005 uni2005 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2006 uni2006 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2007 uni2007 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2008 uni2008 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2009 uni2009 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+200a uni200A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+200b uni200B 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Oblique) 2.8 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) +U+200c afii61664 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Oblique) 2.8 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) +U+200d afii301 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Oblique) 2.8 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) +U+200e afii299 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Oblique) 2.8 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) +U+200f afii300 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Oblique) 2.8 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) +U+2010 uni2010 1.5 +U+2011 uni2011 1.5 +U+2012 figuredash 1.5 +U+2013 endash original +U+2014 emdash original +U+2015 afii00208 1.5 +U+2016 uni2016 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2017 underscoredbl 2.3 +U+2018 quoteleft original +U+2019 quoteright original +U+201a quotesinglbase original +U+201b quotereversed 2.3 +U+201c quotedblleft original +U+201d quotedblright original +U+201e quotedblbase original +U+201f uni201F 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight) +U+2020 dagger original +U+2021 daggerdbl original +U+2022 bullet original +U+2023 uni2023 2.2 +U+2024 onedotenleader 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.9 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+2025 twodotenleader 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.9 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+2026 ellipsis original +U+2027 uni2027 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+202a uni202A 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+202b uni202B 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+202c afii61573 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+202d afii61574 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+202e afii61575 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+202f uni202F 2.11 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2030 perthousand original +U+2031 uni2031 2.1 +U+2032 minute 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2033 second 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2034 uni2034 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2035 uni2035 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2036 uni2036 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2037 uni2037 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2038 uni2038 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2039 guilsinglleft original +U+203a guilsinglright original +U+203b uni203B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+203c exclamdbl 2.0 +U+203d uni203D 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.11 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.14 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+203e uni203E 2.3 +U+203f uni203F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2040 uni2040 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2041 uni2041 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2042 uni2042 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2043 uni2043 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2044 fraction 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2045 uni2045 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2046 uni2046 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2047 uni2047 2.0 +U+2048 uni2048 2.0 +U+2049 uni2049 2.0 +U+204a uni204A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+204b uni204B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+204c uni204C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+204d uni204D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+204e uni204E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+204f uni204F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2050 uni2050 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2051 uni2051 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2052 uni2052 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2053 uni2053 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2054 uni2054 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2055 uni2055 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2056 uni2056 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2057 uni2057 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2058 uni2058 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2059 uni2059 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+205a uni205A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+205b uni205B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+205c uni205C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+205d uni205D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+205e uni205E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+205f uni205F 2.14 +U+2060 uni2060 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+2061 uni2061 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+2062 uni2062 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+2063 uni2063 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+206a uni206A 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+206b uni206B 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+206c uni206C 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+206d uni206D 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+206e uni206E 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+206f uni206F 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+2070 uni2070 2.2 +U+2071 uni2071 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2074 uni2074 2.2 +U+2075 uni2075 2.2 +U+2076 uni2076 2.2 +U+2077 uni2077 2.2 +U+2078 uni2078 2.2 +U+2079 uni2079 2.2 +U+207a uni207A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+207b uni207B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+207c uni207C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+207d uni207D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+207e uni207E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+207f uni207F 1.14 +U+2080 uni2080 2.4 +U+2081 uni2081 2.4 +U+2082 uni2082 2.4 +U+2083 uni2083 2.4 +U+2084 uni2084 2.4 +U+2085 uni2085 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+2086 uni2086 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+2087 uni2087 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+2088 uni2088 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+2089 uni2089 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+208a uni208A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+208b uni208B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+208c uni208C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+208d uni208D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+208e uni208E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2090 uni2090 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+2091 uni2091 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+2092 uni2092 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+2093 uni2093 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+2094 uni2094 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+20a0 uni20A0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+20a1 colonmonetary 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+20a2 uni20A2 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+20a3 franc 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+20a4 lira 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+20a5 uni20A5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+20a6 uni20A6 2.3 +U+20a7 peseta 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+20a8 uni20A8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+20a9 uni20A9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+20aa afii57636 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+20ab dong 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+20ac Euro original +U+20ad uni20AD 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+20ae uni20AE 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+20af uni20AF 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+20b0 uni20B0 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+20b1 uni20B1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.14 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+20b2 uni20B2 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+20b3 uni20B3 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+20b4 uni20B4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+20b5 uni20B5 2.2 +U+20d0 uni20D0 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+20d1 uni20D1 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+20d6 uni20D6 2.8 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+20d7 uni20D7 2.8 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2100 uni2100 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2101 uni2101 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2102 uni2102 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+2103 uni2103 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) +U+2104 uni2104 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2105 afii61248 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2106 uni2106 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2107 uni2107 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2108 uni2108 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2109 uni2109 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+210b uni210B 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+210c uni210C 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+210d uni210D 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+210e uni210E 2.5 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+210f uni210F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2110 uni2110 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2111 Ifraktur 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2112 uni2112 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2113 afii61289 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2114 uni2114 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2115 uni2115 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+2116 afii61352 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2117 uni2117 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2118 weierstrass 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2119 uni2119 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+211a uni211A 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+211b uni211B 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+211c Rfraktur 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+211d uni211D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+211e prescription 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+211f uni211F 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2120 uni2120 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2121 uni2121 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2122 trademark original +U+2123 uni2123 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2124 uni2124 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+2125 uni2125 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2126 uni2126 2.2 +U+2127 uni2127 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) +U+2128 uni2128 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2129 uni2129 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+212a uni212A 2.2 +U+212b uni212B 2.2 +U+212c uni212C 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+212d uni212D 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+212e estimated 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+212f uni212F 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2130 uni2130 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2131 uni2131 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2132 uni2132 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) +U+2133 uni2133 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2134 uni2134 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2135 aleph 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2136 uni2136 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2137 uni2137 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2138 uni2138 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2139 uni2139 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+213a uni213A 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+213b uni213B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+213c uni213C 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+213d uni213D 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+213e uni213E 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+213f uni213F 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+2140 uni2140 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+2141 uni2141 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2142 uni2142 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2143 uni2143 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2144 uni2144 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2145 uni2145 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+2146 uni2146 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+2147 uni2147 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+2148 uni2148 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+2149 uni2149 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+214b uni214B 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) +U+214e uni214E 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2153 onethird 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+2154 twothirds 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+2155 uni2155 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+2156 uni2156 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+2157 uni2157 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+2158 uni2158 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+2159 uni2159 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+215a uni215A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+215b oneeighth 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+215c threeeighths 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+215d fiveeighths 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+215e seveneighths 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+215f uni215F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+2160 uni2160 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) +U+2161 uni2161 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) +U+2162 uni2162 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) +U+2163 uni2163 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) +U+2164 uni2164 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) +U+2165 uni2165 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) +U+2166 uni2166 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) +U+2167 uni2167 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) +U+2168 uni2168 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) +U+2169 uni2169 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) +U+216a uni216A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) +U+216b uni216B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) +U+216c uni216C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) +U+216d uni216D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) +U+216e uni216E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) +U+216f uni216F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) +U+2170 uni2170 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) +U+2171 uni2171 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) +U+2172 uni2172 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) +U+2173 uni2173 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) +U+2174 uni2174 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) +U+2175 uni2175 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) +U+2176 uni2176 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) +U+2177 uni2177 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) +U+2178 uni2178 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) +U+2179 uni2179 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) +U+217a uni217A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) +U+217b uni217B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) +U+217c uni217C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) +U+217d uni217D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) +U+217e uni217E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) +U+217f uni217F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) +U+2180 uni2180 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) +U+2181 uni2181 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2182 uni2182 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2183 uni2183 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) +U+2184 uni2184 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) +U+2190 arrowleft 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2191 arrowup 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2192 arrowright 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2193 arrowdown 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2194 arrowboth 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2195 arrowupdn 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2196 uni2196 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2197 uni2197 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2198 uni2198 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2199 uni2199 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+219a uni219A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+219b uni219B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+219c uni219C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+219d uni219D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+219e uni219E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+219f uni219F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21a0 uni21A0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21a1 uni21A1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21a2 uni21A2 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21a3 uni21A3 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21a4 uni21A4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21a5 uni21A5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21a6 uni21A6 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21a7 uni21A7 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21a8 arrowupdnbse 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21a9 uni21A9 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21aa uni21AA 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21ab uni21AB 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21ac uni21AC 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21ad uni21AD 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21ae uni21AE 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21af uni21AF 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21b0 uni21B0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21b1 uni21B1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21b2 uni21B2 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21b3 uni21B3 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21b4 uni21B4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21b5 carriagereturn 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21b6 uni21B6 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21b7 uni21B7 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21b8 uni21B8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21b9 uni21B9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21ba uni21BA 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21bb uni21BB 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21bc uni21BC 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21bd uni21BD 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21be uni21BE 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21bf uni21BF 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21c0 uni21C0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21c1 uni21C1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21c2 uni21C2 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21c3 uni21C3 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21c4 uni21C4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21c5 uni21C5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21c6 uni21C6 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21c7 uni21C7 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21c8 uni21C8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21c9 uni21C9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21ca uni21CA 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21cb uni21CB 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21cc uni21CC 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21cd uni21CD 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21ce uni21CE 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21cf uni21CF 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21d0 arrowdblleft 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21d1 arrowdblup 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21d2 arrowdblright 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21d3 arrowdbldown 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21d4 arrowdblboth 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21d5 uni21D5 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21d6 uni21D6 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21d7 uni21D7 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21d8 uni21D8 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21d9 uni21D9 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21da uni21DA 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21db uni21DB 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21dc uni21DC 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21dd uni21DD 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21de uni21DE 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21df uni21DF 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21e0 uni21E0 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21e1 uni21E1 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21e2 uni21E2 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21e3 uni21E3 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21e4 uni21E4 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21e5 uni21E5 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21e6 uni21E6 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21e7 uni21E7 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21e8 uni21E8 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21e9 uni21E9 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21ea uni21EA 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21eb uni21EB 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21ec uni21EC 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21ed uni21ED 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21ee uni21EE 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21ef uni21EF 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21f0 uni21F0 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21f1 uni21F1 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21f2 uni21F2 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21f3 uni21F3 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21f4 uni21F4 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21f5 uni21F5 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21f6 uni21F6 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21f7 uni21F7 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21f8 uni21F8 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21f9 uni21F9 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21fa uni21FA 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21fb uni21FB 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21fc uni21FC 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21fd uni21FD 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21fe uni21FE 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+21ff uni21FF 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2200 universal 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) +U+2201 uni2201 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2202 partialdiff original +U+2203 existential 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) +U+2204 uni2204 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2205 emptyset 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2206 Delta original +U+2207 gradient 2.1 +U+2208 element 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2209 notelement 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+220a uni220A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+220b suchthat 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+220c uni220C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+220d uni220D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+220e uni220E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+220f product original +U+2210 uni2210 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2211 summation original +U+2212 minus original +U+2213 uni2213 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2214 uni2214 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2215 fraction original +U+2216 uni2216 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2217 asteriskmath 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2218 uni2218 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2219 periodcentered original +U+221a radical original +U+221b uni221B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+221c uni221C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+221d proportional 2.1 +U+221e infinity original +U+221f orthogonal 2.1 +U+2220 angle 2.3 +U+2221 uni2221 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2222 uni2222 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2223 uni2223 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2224 uni2224 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2225 uni2225 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2226 uni2226 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2227 logicaland 2.1 +U+2228 logicalor 2.1 +U+2229 intersection 2.1 +U+222a union 2.1 +U+222b integral original +U+222c uni222C 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+222d uni222D 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+222e uni222E 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+222f uni222F 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2230 uni2230 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2231 uni2231 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2232 uni2232 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2233 uni2233 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2234 therefore 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2235 uni2235 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2236 uni2236 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2237 uni2237 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2238 uni2238 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2239 uni2239 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+223a uni223A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+223b uni223B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+223c similar 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+223d uni223D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+223e uni223E 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+223f uni223F 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2240 uni2240 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2241 uni2241 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2242 uni2242 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+2243 uni2243 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+2244 uni2244 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2245 congruent 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2246 uni2246 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2247 uni2247 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2248 approxequal original +U+2249 uni2249 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+224a uni224A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+224b uni224B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+224c uni224C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+224d uni224D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+224e uni224E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+224f uni224F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2250 uni2250 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2251 uni2251 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2252 uni2252 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2253 uni2253 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2254 uni2254 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2255 uni2255 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2256 uni2256 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2257 uni2257 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2258 uni2258 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2259 uni2259 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+225a uni225A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+225b uni225B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+225c uni225C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+225d uni225D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+225e uni225E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+225f uni225F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2260 notequal original +U+2261 equivalence 2.1 +U+2262 uni2262 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2263 uni2263 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2264 lessequal original +U+2265 greaterequal original +U+2266 uni2266 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2267 uni2267 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2268 uni2268 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2269 uni2269 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+226a uni226A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+226b uni226B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+226c uni226C 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+226d uni226D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+226e uni226E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+226f uni226F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2270 uni2270 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2271 uni2271 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2272 uni2272 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2273 uni2273 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2274 uni2274 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2275 uni2275 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2276 uni2276 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2277 uni2277 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2278 uni2278 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2279 uni2279 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+227a uni227A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+227b uni227B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+227c uni227C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+227d uni227D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+227e uni227E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+227f uni227F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2280 uni2280 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2281 uni2281 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2282 propersubset 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2283 propersuperset 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2284 notsubset 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2285 uni2285 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2286 reflexsubset 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2287 reflexsuperset 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2288 uni2288 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2289 uni2289 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+228a uni228A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+228b uni228B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+228c uni228C 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+228d uni228D 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+228e uni228E 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+228f uni228F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2290 uni2290 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2291 uni2291 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2292 uni2292 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2293 uni2293 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2294 uni2294 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2295 circleplus 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2296 uni2296 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2297 circlemultiply 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2298 uni2298 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2299 uni2299 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+229a uni229A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+229b uni229B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+229c uni229C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+229d uni229D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+229e uni229E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+229f uni229F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+22a0 uni22A0 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+22a1 uni22A1 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+22a2 uni22A2 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22a3 uni22A3 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22a4 uni22A4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22a5 perpendicular 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22a6 uni22A6 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22a7 uni22A7 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22a8 uni22A8 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22a9 uni22A9 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22aa uni22AA 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22ab uni22AB 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22ac uni22AC 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22ad uni22AD 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22ae uni22AE 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22af uni22AF 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22b2 uni22B2 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22b3 uni22B3 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22b4 uni22B4 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22b5 uni22B5 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22b6 uni22B6 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22b7 uni22B7 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22b8 uni22B8 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22b9 uni22B9 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22ba uni22BA 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22bb uni22BB 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22bc uni22BC 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22bd uni22BD 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22c0 uni22C0 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22c1 uni22C1 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22c2 uni22C2 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22c3 uni22C3 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22c4 uni22C4 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22c5 dotmath 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+22c6 uni22C6 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+22c8 uni22C8 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22c9 uni22C9 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22ca uni22CA 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22cb uni22CB 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22cc uni22CC 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22cd uni22CD 2.6 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.7 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+22d6 uni22D6 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22d7 uni22D7 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22d8 uni22D8 2.6 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+22d9 uni22D9 2.6 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+22da uni22DA 2.6 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.7 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+22db uni22DB 2.6 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.7 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+22dc uni22DC 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+22dd uni22DD 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+22de uni22DE 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+22df uni22DF 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+22e0 uni22E0 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+22e1 uni22E1 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+22e2 uni22E2 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+22e3 uni22E3 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+22e4 uni22E4 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+22e5 uni22E5 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+22e6 uni22E6 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+22e7 uni22E7 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+22e8 uni22E8 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+22e9 uni22E9 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+22ea uni22EA 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22eb uni22EB 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22ec uni22EC 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22ed uni22ED 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22ef uni22EF 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+22f2 uni22F2 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22f3 uni22F3 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22f4 uni22F4 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22f5 uni22F5 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22f6 uni22F6 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22f7 uni22F7 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22f8 uni22F8 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22f9 uni22F9 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22fa uni22FA 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22fb uni22FB 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22fc uni22FC 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22fd uni22FD 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22fe uni22FE 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22ff uni22FF 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2300 uni2300 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2301 uni2301 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2302 house 1.14 +U+2303 uni2303 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2304 uni2304 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2305 uni2305 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2306 uni2306 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2308 uni2308 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Oblique) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) +U+2309 uni2309 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Oblique) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) +U+230a uni230A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Oblique) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) +U+230b uni230B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Oblique) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) +U+230c uni230C 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+230d uni230D 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+230e uni230E 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+230f uni230F 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2310 revlogicalnot 1.14 +U+2311 uni2311 1.15 +U+2312 uni2312 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2313 uni2313 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2314 uni2314 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2315 uni2315 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2318 uni2318 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2319 uni2319 1.14 +U+231c uni231C 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+231d uni231D 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+231e uni231E 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+231f uni231F 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2320 integraltp 2.3 +U+2321 integralbt 2.3 +U+2325 uni2325 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2326 uni2326 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2327 uni2327 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2328 uni2328 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+2329 angleleft 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Oblique) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) +U+232a angleright 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Oblique) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) +U+232b uni232B 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2335 uni2335 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2337 uni2337 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2338 uni2338 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2339 uni2339 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+233a uni233A 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+233b uni233B 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+233c uni233C 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+233d uni233D 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+233e uni233E 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2341 uni2341 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2342 uni2342 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2343 uni2343 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2344 uni2344 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2347 uni2347 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2348 uni2348 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2349 uni2349 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+234b uni234B 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+234c uni234C 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+234d uni234D 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2350 uni2350 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2352 uni2352 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2353 uni2353 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2354 uni2354 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2357 uni2357 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2358 uni2358 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2359 uni2359 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+235a uni235A 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+235b uni235B 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+235c uni235C 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+235e uni235E 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+235f uni235F 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2360 uni2360 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2363 uni2363 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2364 uni2364 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2365 uni2365 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2368 uni2368 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2369 uni2369 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+236b uni236B 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+236c uni236C 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+236d uni236D 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+236e uni236E 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+236f uni236F 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2370 uni2370 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2373 uni2373 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2374 uni2374 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2375 uni2375 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2376 uni2376 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2377 uni2377 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2378 uni2378 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2379 uni2379 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+237a uni237A 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+237d uni237D 1.15 +U+2380 uni2380 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2381 uni2381 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2382 uni2382 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2383 uni2383 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2388 uni2388 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2389 uni2389 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+238a uni238A 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+238b uni238B 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2395 uni2395 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+239b uni239B 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+239c uni239C 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+239d uni239D 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+239e uni239E 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+239f uni239F 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+23a0 uni23A0 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+23a1 uni23A1 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+23a2 uni23A2 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+23a3 uni23A3 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+23a4 uni23A4 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+23a5 uni23A5 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+23a6 uni23A6 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+23a7 uni23A7 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+23a8 uni23A8 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+23a9 uni23A9 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+23aa uni23AA 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+23ab uni23AB 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+23ac uni23AC 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+23ad uni23AD 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+23ae uni23AE 2.3 +U+23ce uni23CE 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+23cf uni23CF 2.3 +U+2422 uni2422 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2423 uni2423 1.6 +U+2460 uni2460 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2461 uni2461 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2462 uni2462 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2463 uni2463 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2464 uni2464 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2465 uni2465 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2466 uni2466 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2467 uni2467 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2468 uni2468 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2469 uni2469 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2500 SF100000 1.12 (Sans Mono, Sans Mono Oblique) +U+2501 uni2501 1.12 (Sans Mono, Sans Mono Oblique) +U+2502 SF110000 1.12 (Sans Mono, Sans Mono Oblique) +U+2503 uni2503 1.12 (Sans Mono, Sans Mono Oblique) +U+2504 uni2504 1.12 (Sans Mono, Sans Mono Oblique) +U+2505 uni2505 1.12 (Sans Mono, Sans Mono Oblique) +U+2506 uni2506 1.12 (Sans Mono, Sans Mono Oblique) +U+2507 uni2507 1.12 (Sans Mono, Sans Mono Oblique) +U+2508 uni2508 1.12 (Sans Mono, Sans Mono Oblique) +U+2509 uni2509 1.12 (Sans Mono, Sans Mono Oblique) +U+250a uni250A 1.12 (Sans Mono, Sans Mono Oblique) +U+250b uni250B 1.12 (Sans Mono, Sans Mono Oblique) +U+250c SF010000 1.12 (Sans Mono, Sans Mono Oblique) +U+250d uni250D 1.12 (Sans Mono, Sans Mono Oblique) +U+250e uni250E 1.12 (Sans Mono, Sans Mono Oblique) +U+250f uni250F 1.12 (Sans Mono, Sans Mono Oblique) +U+2510 SF030000 1.12 (Sans Mono, Sans Mono Oblique) +U+2511 uni2511 1.12 (Sans Mono, Sans Mono Oblique) +U+2512 uni2512 1.12 (Sans Mono, Sans Mono Oblique) +U+2513 uni2513 1.12 (Sans Mono, Sans Mono Oblique) +U+2514 SF020000 1.12 (Sans Mono, Sans Mono Oblique) +U+2515 uni2515 1.12 (Sans Mono, Sans Mono Oblique) +U+2516 uni2516 1.12 (Sans Mono, Sans Mono Oblique) +U+2517 uni2517 1.12 (Sans Mono, Sans Mono Oblique) +U+2518 SF040000 1.12 (Sans Mono, Sans Mono Oblique) +U+2519 uni2519 1.12 (Sans Mono, Sans Mono Oblique) +U+251a uni251A 1.12 (Sans Mono, Sans Mono Oblique) +U+251b uni251B 1.12 (Sans Mono, Sans Mono Oblique) +U+251c SF080000 1.12 (Sans Mono, Sans Mono Oblique) +U+251d uni251D 1.12 (Sans Mono, Sans Mono Oblique) +U+251e uni251E 1.12 (Sans Mono, Sans Mono Oblique) +U+251f uni251F 1.12 (Sans Mono, Sans Mono Oblique) +U+2520 uni2520 1.12 (Sans Mono, Sans Mono Oblique) +U+2521 uni2521 1.12 (Sans Mono, Sans Mono Oblique) +U+2522 uni2522 1.12 (Sans Mono, Sans Mono Oblique) +U+2523 uni2523 1.12 (Sans Mono, Sans Mono Oblique) +U+2524 SF090000 1.12 (Sans Mono, Sans Mono Oblique) +U+2525 uni2525 1.12 (Sans Mono, Sans Mono Oblique) +U+2526 uni2526 1.12 (Sans Mono, Sans Mono Oblique) +U+2527 uni2527 1.12 (Sans Mono, Sans Mono Oblique) +U+2528 uni2528 1.12 (Sans Mono, Sans Mono Oblique) +U+2529 uni2529 1.12 (Sans Mono, Sans Mono Oblique) +U+252a uni252A 1.12 (Sans Mono, Sans Mono Oblique) +U+252b uni252B 1.12 (Sans Mono, Sans Mono Oblique) +U+252c SF060000 1.12 (Sans Mono, Sans Mono Oblique) +U+252d uni252D 1.12 (Sans Mono, Sans Mono Oblique) +U+252e uni252E 1.12 (Sans Mono, Sans Mono Oblique) +U+252f uni252F 1.12 (Sans Mono, Sans Mono Oblique) +U+2530 uni2530 1.12 (Sans Mono, Sans Mono Oblique) +U+2531 uni2531 1.12 (Sans Mono, Sans Mono Oblique) +U+2532 uni2532 1.12 (Sans Mono, Sans Mono Oblique) +U+2533 uni2533 1.12 (Sans Mono, Sans Mono Oblique) +U+2534 SF070000 1.12 (Sans Mono, Sans Mono Oblique) +U+2535 uni2535 1.12 (Sans Mono, Sans Mono Oblique) +U+2536 uni2536 1.12 (Sans Mono, Sans Mono Oblique) +U+2537 uni2537 1.12 (Sans Mono, Sans Mono Oblique) +U+2538 uni2538 1.12 (Sans Mono, Sans Mono Oblique) +U+2539 uni2539 1.12 (Sans Mono, Sans Mono Oblique) +U+253a uni253A 1.12 (Sans Mono, Sans Mono Oblique) +U+253b uni253B 1.12 (Sans Mono, Sans Mono Oblique) +U+253c SF050000 1.12 (Sans Mono, Sans Mono Oblique) +U+253d uni253D 1.12 (Sans Mono, Sans Mono Oblique) +U+253e uni253E 1.12 (Sans Mono, Sans Mono Oblique) +U+253f uni253F 1.12 (Sans Mono, Sans Mono Oblique) +U+2540 uni2540 1.12 (Sans Mono, Sans Mono Oblique) +U+2541 uni2541 1.12 (Sans Mono, Sans Mono Oblique) +U+2542 uni2542 1.12 (Sans Mono, Sans Mono Oblique) +U+2543 uni2543 1.12 (Sans Mono, Sans Mono Oblique) +U+2544 uni2544 1.12 (Sans Mono, Sans Mono Oblique) +U+2545 uni2545 1.12 (Sans Mono, Sans Mono Oblique) +U+2546 uni2546 1.12 (Sans Mono, Sans Mono Oblique) +U+2547 uni2547 1.12 (Sans Mono, Sans Mono Oblique) +U+2548 uni2548 1.12 (Sans Mono, Sans Mono Oblique) +U+2549 uni2549 1.12 (Sans Mono, Sans Mono Oblique) +U+254a uni254A 1.12 (Sans Mono, Sans Mono Oblique) +U+254b uni254B 1.12 (Sans Mono, Sans Mono Oblique) +U+254c uni254C 1.12 (Sans Mono, Sans Mono Oblique) +U+254d uni254D 1.12 (Sans Mono, Sans Mono Oblique) +U+254e uni254E 1.12 (Sans Mono, Sans Mono Oblique) +U+254f uni254F 1.12 (Sans Mono, Sans Mono Oblique) +U+2550 SF430000 1.12 (Sans Mono, Sans Mono Oblique) +U+2551 SF240000 1.12 (Sans Mono, Sans Mono Oblique) +U+2552 SF510000 1.12 (Sans Mono, Sans Mono Oblique) +U+2553 SF520000 1.12 (Sans Mono, Sans Mono Oblique) +U+2554 SF390000 1.12 (Sans Mono, Sans Mono Oblique) +U+2555 SF220000 1.12 (Sans Mono, Sans Mono Oblique) +U+2556 SF210000 1.12 (Sans Mono, Sans Mono Oblique) +U+2557 SF250000 1.12 (Sans Mono, Sans Mono Oblique) +U+2558 SF500000 1.12 (Sans Mono, Sans Mono Oblique) +U+2559 SF490000 1.12 (Sans Mono, Sans Mono Oblique) +U+255a SF380000 1.12 (Sans Mono, Sans Mono Oblique) +U+255b SF280000 1.12 (Sans Mono, Sans Mono Oblique) +U+255c SF270000 1.12 (Sans Mono, Sans Mono Oblique) +U+255d SF260000 1.12 (Sans Mono, Sans Mono Oblique) +U+255e SF360000 1.12 (Sans Mono, Sans Mono Oblique) +U+255f SF370000 1.12 (Sans Mono, Sans Mono Oblique) +U+2560 SF420000 1.12 (Sans Mono, Sans Mono Oblique) +U+2561 SF190000 1.12 (Sans Mono, Sans Mono Oblique) +U+2562 SF200000 1.12 (Sans Mono, Sans Mono Oblique) +U+2563 SF230000 1.12 (Sans Mono, Sans Mono Oblique) +U+2564 SF470000 1.12 (Sans Mono, Sans Mono Oblique) +U+2565 SF480000 1.12 (Sans Mono, Sans Mono Oblique) +U+2566 SF410000 1.12 (Sans Mono, Sans Mono Oblique) +U+2567 SF450000 1.12 (Sans Mono, Sans Mono Oblique) +U+2568 SF460000 1.12 (Sans Mono, Sans Mono Oblique) +U+2569 SF400000 1.12 (Sans Mono, Sans Mono Oblique) +U+256a SF540000 1.12 (Sans Mono, Sans Mono Oblique) +U+256b SF530000 1.12 (Sans Mono, Sans Mono Oblique) +U+256c SF440000 1.12 (Sans Mono, Sans Mono Oblique) +U+256d uni256D 1.12 (Sans Mono, Sans Mono Oblique) +U+256e uni256E 1.12 (Sans Mono, Sans Mono Oblique) +U+256f uni256F 1.12 (Sans Mono, Sans Mono Oblique) +U+2570 uni2570 1.12 (Sans Mono, Sans Mono Oblique) +U+2571 uni2571 1.12 (Sans Mono, Sans Mono Oblique) +U+2572 uni2572 1.12 (Sans Mono, Sans Mono Oblique) +U+2573 uni2573 1.12 (Sans Mono, Sans Mono Oblique) +U+2574 uni2574 1.12 (Sans Mono, Sans Mono Oblique) +U+2575 uni2575 1.12 (Sans Mono, Sans Mono Oblique) +U+2576 uni2576 1.12 (Sans Mono, Sans Mono Oblique) +U+2577 uni2577 1.12 (Sans Mono, Sans Mono Oblique) +U+2578 uni2578 1.12 (Sans Mono, Sans Mono Oblique) +U+2579 uni2579 1.12 (Sans Mono, Sans Mono Oblique) +U+257a uni257A 1.12 (Sans Mono, Sans Mono Oblique) +U+257b uni257B 1.12 (Sans Mono, Sans Mono Oblique) +U+257c uni257C 1.12 (Sans Mono, Sans Mono Oblique) +U+257d uni257D 1.12 (Sans Mono, Sans Mono Oblique) +U+257e uni257E 1.12 (Sans Mono, Sans Mono Oblique) +U+257f uni257F 1.12 (Sans Mono, Sans Mono Oblique) +U+2580 upblock 1.14 +U+2581 uni2581 1.14 +U+2582 uni2582 1.14 +U+2583 uni2583 1.14 +U+2584 dnblock 1.14 +U+2585 uni2585 1.14 +U+2586 uni2586 1.14 +U+2587 uni2587 1.14 +U+2588 block 1.14 +U+2589 uni2589 1.14 +U+258a uni258A 1.14 +U+258b uni258B 1.14 +U+258c lfblock 1.14 +U+258d uni258D 1.14 +U+258e uni258E 1.14 +U+258f uni258F 1.14 +U+2590 rtblock 1.14 +U+2591 ltshade 1.15 +U+2592 shade 1.15 +U+2593 dkshade 1.15 +U+2594 uni2594 1.14 +U+2595 uni2595 1.14 +U+2596 uni2596 1.14 +U+2597 uni2597 1.14 +U+2598 uni2598 1.14 +U+2599 uni2599 1.14 +U+259a uni259A 1.14 +U+259b uni259B 1.14 +U+259c uni259C 1.14 +U+259d uni259D 1.14 +U+259e uni259E 1.14 +U+259f uni259F 1.14 +U+25a0 filledbox 2.3 +U+25a1 H22073 2.3 +U+25a2 uni25A2 2.3 +U+25a3 uni25A3 2.3 +U+25a4 uni25A4 2.3 +U+25a5 uni25A5 2.3 +U+25a6 uni25A6 2.3 +U+25a7 uni25A7 2.3 +U+25a8 uni25A8 2.3 +U+25a9 uni25A9 2.3 +U+25aa H18543 2.3 +U+25ab H18551 2.3 +U+25ac filledrect 2.3 +U+25ad uni25AD 2.3 +U+25ae uni25AE 2.3 +U+25af uni25AF 2.3 +U+25b0 uni25B0 2.3 +U+25b1 uni25B1 2.3 +U+25b2 triagup 2.3 +U+25b3 uni25B3 2.3 +U+25b4 uni25B4 2.3 +U+25b5 uni25B5 2.3 +U+25b6 uni25B6 2.3 +U+25b7 uni25B7 2.3 +U+25b8 uni25B8 2.3 +U+25b9 uni25B9 2.3 +U+25ba triagrt 2.3 +U+25bb uni25BB 2.3 +U+25bc triagdn 2.3 +U+25bd uni25BD 2.3 +U+25be uni25BE 2.3 +U+25bf uni25BF 2.3 +U+25c0 uni25C0 2.3 +U+25c1 uni25C1 2.3 +U+25c2 uni25C2 2.3 +U+25c3 uni25C3 2.3 +U+25c4 triaglf 2.3 +U+25c5 uni25C5 2.3 +U+25c6 uni25C6 2.3 +U+25c7 uni25C7 2.3 +U+25c8 uni25C8 2.3 +U+25c9 uni25C9 2.3 +U+25ca lozenge original +U+25cb circle 2.3 +U+25cc uni25CC 2.3 +U+25cd uni25CD 2.3 +U+25ce uni25CE 2.3 +U+25cf H18533 2.3 +U+25d0 uni25D0 2.3 +U+25d1 uni25D1 2.3 +U+25d2 uni25D2 2.3 +U+25d3 uni25D3 2.3 +U+25d4 uni25D4 2.3 +U+25d5 uni25D5 2.3 +U+25d6 uni25D6 2.3 +U+25d7 uni25D7 2.3 +U+25d8 invbullet 2.2 +U+25d9 invcircle 2.3 +U+25da uni25DA 2.3 +U+25db uni25DB 2.3 +U+25dc uni25DC 2.3 +U+25dd uni25DD 2.3 +U+25de uni25DE 2.3 +U+25df uni25DF 2.3 +U+25e0 uni25E0 2.3 +U+25e1 uni25E1 2.3 +U+25e2 uni25E2 2.3 +U+25e3 uni25E3 2.3 +U+25e4 uni25E4 2.3 +U+25e5 uni25E5 2.3 +U+25e6 openbullet 2.2 +U+25e7 uni25E7 2.3 +U+25e8 uni25E8 2.3 +U+25e9 uni25E9 2.3 +U+25ea uni25EA 2.3 +U+25eb uni25EB 2.3 +U+25ec uni25EC 2.3 +U+25ed uni25ED 2.3 +U+25ee uni25EE 2.3 +U+25ef uni25EF 2.3 +U+25f0 uni25F0 2.3 +U+25f1 uni25F1 2.3 +U+25f2 uni25F2 2.3 +U+25f3 uni25F3 2.3 +U+25f4 uni25F4 2.3 +U+25f5 uni25F5 2.3 +U+25f6 uni25F6 2.3 +U+25f7 uni25F7 2.3 +U+25f8 uni25F8 2.3 +U+25f9 uni25F9 2.3 +U+25fa uni25FA 2.3 +U+25fb uni25FB 2.3 +U+25fc uni25FC 2.3 +U+25fd uni25FD 2.3 +U+25fe uni25FE 2.3 +U+25ff uni25FF 2.3 +U+2600 uni2600 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+2601 uni2601 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2602 uni2602 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2603 uni2603 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2604 uni2604 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2605 uni2605 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2606 uni2606 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2607 uni2607 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2608 uni2608 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2609 uni2609 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+260a uni260A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+260b uni260B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+260c uni260C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+260d uni260D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+260e uni260E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+260f uni260F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2610 uni2610 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2611 uni2611 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2612 uni2612 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2613 uni2613 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2614 uni2614 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2615 uni2615 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2616 uni2616 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2617 uni2617 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2618 uni2618 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2619 uni2619 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+261a uni261A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+261b uni261B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+261c uni261C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+261d uni261D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+261e uni261E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+261f uni261F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2620 uni2620 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2621 uni2621 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2622 uni2622 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2623 uni2623 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2624 uni2624 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2625 uni2625 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2626 uni2626 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2627 uni2627 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2628 uni2628 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2629 uni2629 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+262a uni262A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+262b uni262B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+262c uni262C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+262d uni262D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+262e uni262E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+262f uni262F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2630 uni2630 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2631 uni2631 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2632 uni2632 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2633 uni2633 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2634 uni2634 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2635 uni2635 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2636 uni2636 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2637 uni2637 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2638 uni2638 1.15 +U+2639 uni2639 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+263a smileface 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+263b invsmileface 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+263c sun 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+263d uni263D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+263e uni263E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+263f uni263F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+2640 female 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+2641 uni2641 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+2642 male 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+2643 uni2643 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+2644 uni2644 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+2645 uni2645 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+2646 uni2646 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+2647 uni2647 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+2648 uni2648 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2649 uni2649 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+264a uni264A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+264b uni264B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+264c uni264C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+264d uni264D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+264e uni264E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+264f uni264F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2650 uni2650 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2651 uni2651 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2652 uni2652 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2653 uni2653 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2654 uni2654 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2655 uni2655 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2656 uni2656 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2657 uni2657 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2658 uni2658 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2659 uni2659 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+265a uni265A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+265b uni265B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+265c uni265C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+265d uni265D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+265e uni265E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+265f uni265F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2660 spade 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+2661 uni2661 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+2662 uni2662 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+2663 club 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+2664 uni2664 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+2665 heart 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+2666 diamond 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+2667 uni2667 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+2668 uni2668 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2669 uni2669 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+266a musicalnote 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+266b musicalnotedbl 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+266c uni266C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+266d uni266D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+266e uni266E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+266f uni266F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+2670 uni2670 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2671 uni2671 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2672 uni2672 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2673 uni2673 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2674 uni2674 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2675 uni2675 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2676 uni2676 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2677 uni2677 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2678 uni2678 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2679 uni2679 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+267a uni267A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+267b uni267B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+267c uni267C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+267d uni267D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+267e uni267E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+267f uni267F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2680 uni2680 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold) +U+2681 uni2681 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold) +U+2682 uni2682 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold) +U+2683 uni2683 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold) +U+2684 uni2684 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold) +U+2685 uni2685 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold) +U+2686 uni2686 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2687 uni2687 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2688 uni2688 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2689 uni2689 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+268a uni268A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+268b uni268B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+268c uni268C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+268d uni268D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+268e uni268E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+268f uni268F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2690 uni2690 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2691 uni2691 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2692 uni2692 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2693 uni2693 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2694 uni2694 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2695 uni2695 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2696 uni2696 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2697 uni2697 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2698 uni2698 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2699 uni2699 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+269a uni269A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+269b uni269B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+269c uni269C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+26a0 uni26A0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+26a1 uni26A1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+26a2 uni26A2 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+26a3 uni26A3 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+26a4 uni26A4 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+26a5 uni26A5 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+26a6 uni26A6 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+26a7 uni26A7 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+26a8 uni26A8 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+26a9 uni26A9 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+26aa uni26AA 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+26ab uni26AB 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+26ac uni26AC 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+26ad uni26AD 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+26ae uni26AE 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+26af uni26AF 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+26b0 uni26B0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+26b1 uni26B1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+26b2 uni26B2 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2701 uni2701 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2702 uni2702 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2703 uni2703 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2704 uni2704 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2706 uni2706 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2707 uni2707 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2708 uni2708 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2709 uni2709 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+270c uni270C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+270d uni270D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+270e uni270E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+270f uni270F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2710 uni2710 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2711 uni2711 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2712 uni2712 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2713 uni2713 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2714 uni2714 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2715 uni2715 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2716 uni2716 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2717 uni2717 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2718 uni2718 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2719 uni2719 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+271a uni271A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+271b uni271B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+271c uni271C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+271d uni271D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+271e uni271E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+271f uni271F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2720 uni2720 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2721 uni2721 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2722 uni2722 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2723 uni2723 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2724 uni2724 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2725 uni2725 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2726 uni2726 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2727 uni2727 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2729 uni2729 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+272a uni272A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+272b uni272B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+272c uni272C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+272d uni272D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+272e uni272E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+272f uni272F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2730 uni2730 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2731 uni2731 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2732 uni2732 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2733 uni2733 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2734 uni2734 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2735 uni2735 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2736 uni2736 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2737 uni2737 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2738 uni2738 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2739 uni2739 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+273a uni273A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+273b uni273B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+273c uni273C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+273d uni273D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+273e uni273E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+273f uni273F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2740 uni2740 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2741 uni2741 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2742 uni2742 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2743 uni2743 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2744 uni2744 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2745 uni2745 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2746 uni2746 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2747 uni2747 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2748 uni2748 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2749 uni2749 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+274a uni274A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+274b uni274B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+274d uni274D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+274f uni274F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2750 uni2750 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2751 uni2751 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2752 uni2752 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2756 uni2756 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2758 uni2758 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2759 uni2759 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+275a uni275A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+275b uni275B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+275c uni275C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+275d uni275D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+275e uni275E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2761 uni2761 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2762 uni2762 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2763 uni2763 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2764 uni2764 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2765 uni2765 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2766 uni2766 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2767 uni2767 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2768 uni2768 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2769 uni2769 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+276a uni276A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+276b uni276B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+276c uni276C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+276d uni276D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+276e uni276E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+276f uni276F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2770 uni2770 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2771 uni2771 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2772 uni2772 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2773 uni2773 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2774 uni2774 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2775 uni2775 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2776 uni2776 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2777 uni2777 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2778 uni2778 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2779 uni2779 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+277a uni277A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+277b uni277B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+277c uni277C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+277d uni277D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+277e uni277E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+277f uni277F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2780 uni2780 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2781 uni2781 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2782 uni2782 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2783 uni2783 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2784 uni2784 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2785 uni2785 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2786 uni2786 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2787 uni2787 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2788 uni2788 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2789 uni2789 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+278a uni278A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+278b uni278B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+278c uni278C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+278d uni278D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+278e uni278E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+278f uni278F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2790 uni2790 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2791 uni2791 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2792 uni2792 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2793 uni2793 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2794 uni2794 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2798 uni2798 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2799 uni2799 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+279a uni279A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+279b uni279B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+279c uni279C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+279d uni279D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+279e uni279E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+279f uni279F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+27a0 uni27A0 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+27a1 uni27A1 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+27a2 uni27A2 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+27a3 uni27A3 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+27a4 uni27A4 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+27a5 uni27A5 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+27a6 uni27A6 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+27a7 uni27A7 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+27a8 uni27A8 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+27a9 uni27A9 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+27aa uni27AA 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+27ab uni27AB 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+27ac uni27AC 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+27ad uni27AD 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+27ae uni27AE 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+27af uni27AF 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+27b1 uni27B1 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+27b2 uni27B2 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+27b3 uni27B3 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+27b4 uni27B4 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+27b5 uni27B5 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+27b6 uni27B6 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+27b7 uni27B7 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+27b8 uni27B8 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+27b9 uni27B9 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+27ba uni27BA 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+27bb uni27BB 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+27bc uni27BC 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+27bd uni27BD 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+27be uni27BE 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+27bf uni27BF 2.7 (Sans Mono Bold) +U+27e0 uni27E0 2.3 +U+27e6 uni27E6 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+27e7 uni27E7 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+27e8 uni27E8 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+27e9 uni27E9 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+27ea uni27EA 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+27eb uni27EB 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+27f0 uni27F0 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+27f1 uni27F1 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+27f2 uni27F2 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+27f3 uni27F3 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+27f4 uni27F4 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+27f5 uni27F5 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+27f6 uni27F6 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+27f7 uni27F7 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+27f8 uni27F8 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+27f9 uni27F9 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+27fa uni27FA 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+27fb uni27FB 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+27fc uni27FC 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+27fd uni27FD 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+27fe uni27FE 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+27ff uni27FF 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2800 uni2800 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2801 uni2801 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2802 uni2802 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2803 uni2803 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2804 uni2804 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2805 uni2805 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2806 uni2806 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2807 uni2807 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2808 uni2808 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2809 uni2809 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+280a uni280A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+280b uni280B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+280c uni280C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+280d uni280D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+280e uni280E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+280f uni280F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2810 uni2810 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2811 uni2811 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2812 uni2812 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2813 uni2813 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2814 uni2814 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2815 uni2815 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2816 uni2816 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2817 uni2817 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2818 uni2818 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2819 uni2819 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+281a uni281A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+281b uni281B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+281c uni281C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+281d uni281D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+281e uni281E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+281f uni281F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2820 uni2820 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2821 uni2821 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2822 uni2822 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2823 uni2823 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2824 uni2824 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2825 uni2825 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2826 uni2826 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2827 uni2827 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2828 uni2828 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2829 uni2829 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+282a uni282A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+282b uni282B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+282c uni282C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+282d uni282D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+282e uni282E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+282f uni282F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2830 uni2830 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2831 uni2831 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2832 uni2832 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2833 uni2833 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2834 uni2834 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2835 uni2835 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2836 uni2836 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2837 uni2837 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2838 uni2838 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2839 uni2839 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+283a uni283A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+283b uni283B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+283c uni283C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+283d uni283D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+283e uni283E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+283f uni283F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2840 uni2840 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2841 uni2841 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2842 uni2842 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2843 uni2843 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2844 uni2844 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2845 uni2845 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2846 uni2846 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2847 uni2847 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2848 uni2848 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2849 uni2849 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+284a uni284A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+284b uni284B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+284c uni284C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+284d uni284D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+284e uni284E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+284f uni284F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2850 uni2850 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2851 uni2851 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2852 uni2852 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2853 uni2853 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2854 uni2854 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2855 uni2855 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2856 uni2856 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2857 uni2857 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2858 uni2858 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2859 uni2859 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+285a uni285A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+285b uni285B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+285c uni285C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+285d uni285D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+285e uni285E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+285f uni285F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2860 uni2860 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2861 uni2861 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2862 uni2862 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2863 uni2863 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2864 uni2864 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2865 uni2865 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2866 uni2866 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2867 uni2867 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2868 uni2868 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2869 uni2869 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+286a uni286A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+286b uni286B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+286c uni286C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+286d uni286D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+286e uni286E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+286f uni286F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2870 uni2870 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2871 uni2871 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2872 uni2872 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2873 uni2873 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2874 uni2874 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2875 uni2875 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2876 uni2876 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2877 uni2877 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2878 uni2878 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2879 uni2879 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+287a uni287A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+287b uni287B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+287c uni287C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+287d uni287D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+287e uni287E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+287f uni287F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2880 uni2880 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2881 uni2881 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2882 uni2882 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2883 uni2883 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2884 uni2884 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2885 uni2885 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2886 uni2886 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2887 uni2887 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2888 uni2888 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2889 uni2889 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+288a uni288A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+288b uni288B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+288c uni288C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+288d uni288D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+288e uni288E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+288f uni288F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2890 uni2890 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2891 uni2891 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2892 uni2892 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2893 uni2893 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2894 uni2894 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2895 uni2895 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2896 uni2896 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2897 uni2897 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2898 uni2898 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2899 uni2899 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+289a uni289A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+289b uni289B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+289c uni289C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+289d uni289D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+289e uni289E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+289f uni289F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28a0 uni28A0 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28a1 uni28A1 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28a2 uni28A2 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28a3 uni28A3 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28a4 uni28A4 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28a5 uni28A5 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28a6 uni28A6 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28a7 uni28A7 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28a8 uni28A8 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28a9 uni28A9 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28aa uni28AA 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28ab uni28AB 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28ac uni28AC 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28ad uni28AD 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28ae uni28AE 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28af uni28AF 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28b0 uni28B0 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28b1 uni28B1 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28b2 uni28B2 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28b3 uni28B3 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28b4 uni28B4 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28b5 uni28B5 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28b6 uni28B6 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28b7 uni28B7 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28b8 uni28B8 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28b9 uni28B9 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28ba uni28BA 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28bb uni28BB 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28bc uni28BC 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28bd uni28BD 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28be uni28BE 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28bf uni28BF 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28c0 uni28C0 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28c1 uni28C1 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28c2 uni28C2 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28c3 uni28C3 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28c4 uni28C4 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28c5 uni28C5 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28c6 uni28C6 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28c7 uni28C7 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28c8 uni28C8 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28c9 uni28C9 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28ca uni28CA 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28cb uni28CB 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28cc uni28CC 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28cd uni28CD 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28ce uni28CE 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28cf uni28CF 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28d0 uni28D0 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28d1 uni28D1 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28d2 uni28D2 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28d3 uni28D3 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28d4 uni28D4 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28d5 uni28D5 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28d6 uni28D6 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28d7 uni28D7 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28d8 uni28D8 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28d9 uni28D9 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28da uni28DA 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28db uni28DB 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28dc uni28DC 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28dd uni28DD 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28de uni28DE 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28df uni28DF 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28e0 uni28E0 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28e1 uni28E1 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28e2 uni28E2 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28e3 uni28E3 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28e4 uni28E4 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28e5 uni28E5 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28e6 uni28E6 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28e7 uni28E7 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28e8 uni28E8 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28e9 uni28E9 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28ea uni28EA 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28eb uni28EB 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28ec uni28EC 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28ed uni28ED 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28ee uni28EE 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28ef uni28EF 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28f0 uni28F0 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28f1 uni28F1 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28f2 uni28F2 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28f3 uni28F3 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28f4 uni28F4 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28f5 uni28F5 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28f6 uni28F6 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28f7 uni28F7 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28f8 uni28F8 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28f9 uni28F9 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28fa uni28FA 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28fb uni28FB 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28fc uni28FC 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28fd uni28FD 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28fe uni28FE 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+28ff uni28FF 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2906 uni2906 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2907 uni2907 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+290a uni290A 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+290b uni290B 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2940 uni2940 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2941 uni2941 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+29ce uni29CE 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+29cf uni29CF 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+29d0 uni29D0 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+29d1 uni29D1 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+29d2 uni29D2 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+29d3 uni29D3 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+29d4 uni29D4 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+29d5 uni29D5 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+29eb uni29EB 2.2 +U+2a00 uni2A00 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a01 uni2A01 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a02 uni2A02 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a0c uni2A0C 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+2a0d uni2A0D 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+2a0e uni2A0E 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+2a0f uni2A0F 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a10 uni2A10 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a11 uni2A11 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a12 uni2A12 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a13 uni2A13 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a14 uni2A14 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a15 uni2A15 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a16 uni2A16 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a17 uni2A17 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a18 uni2A18 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a19 uni2A19 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a1a uni2A1A 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a1b uni2A1B 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a1c uni2A1C 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a7d uni2A7D 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a7e uni2A7E 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a7f uni2A7F 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a80 uni2A80 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a81 uni2A81 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a82 uni2A82 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a83 uni2A83 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a84 uni2A84 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a85 uni2A85 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a86 uni2A86 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a87 uni2A87 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a88 uni2A88 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a89 uni2A89 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a8a uni2A8A 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a8b uni2A8B 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a8c uni2A8C 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a8d uni2A8D 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a8e uni2A8E 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a8f uni2A8F 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a90 uni2A90 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a91 uni2A91 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a92 uni2A92 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a93 uni2A93 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a94 uni2A94 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a95 uni2A95 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a96 uni2A96 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a97 uni2A97 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a98 uni2A98 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a99 uni2A99 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a9a uni2A9A 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a9b uni2A9B 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a9c uni2A9C 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a9d uni2A9D 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a9e uni2A9E 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a9f uni2A9F 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2aa0 uni2AA0 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2aae uni2AAE 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2aaf uni2AAF 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2ab0 uni2AB0 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2ab1 uni2AB1 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2ab2 uni2AB2 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2ab3 uni2AB3 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2ab4 uni2AB4 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2ab5 uni2AB5 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2ab6 uni2AB6 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2ab7 uni2AB7 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2ab8 uni2AB8 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2ab9 uni2AB9 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2aba uni2ABA 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2af9 uni2AF9 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2afa uni2AFA 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2b00 uni2B00 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2b01 uni2B01 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2b02 uni2B02 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2b03 uni2B03 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2b04 uni2B04 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2b05 uni2B05 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2b06 uni2B06 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2b07 uni2B07 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2b08 uni2B08 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2b09 uni2B09 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2b0a uni2B0A 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2b0b uni2B0B 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2b0c uni2B0C 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2b0d uni2B0D 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2b0e uni2B0E 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2b0f uni2B0F 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2b10 uni2B10 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2b11 uni2B11 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2b12 uni2B12 2.3 +U+2b13 uni2B13 2.3 +U+2b14 uni2B14 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) +U+2b15 uni2B15 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) +U+2b16 uni2B16 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) +U+2b17 uni2B17 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) +U+2b18 uni2B18 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) +U+2b19 uni2B19 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) +U+2b1a uni2B1A 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique) +U+2b20 uni2B20 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2b21 uni2B21 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2b22 uni2B22 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2b23 uni2B23 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2c60 uni2C60 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+2c61 uni2C61 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+2c62 uni2C62 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+2c63 uni2C63 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+2c64 uni2C64 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+2c65 uni2C65 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+2c66 uni2C66 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+2c67 uni2C67 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2c68 uni2C68 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2c69 uni2C69 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2c6a uni2C6A 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2c6b uni2C6B 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+2c6c uni2C6C 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+2c74 uni2C74 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+2c75 uni2C75 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2c76 uni2C76 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2c77 uni2C77 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+e000 uniE000 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+e001 uniE001 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+e002 uniE002 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+e003 uniE003 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+e004 uniE004 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+e005 uniE005 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+e006 uniE006 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+e007 uniE007 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+e008 uniE008 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+e009 uniE009 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+e00a uniE00A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+e00b uniE00B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+e00c uniE00C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+e00d uniE00D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+e00e uniE00E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+e00f uniE00F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+e010 uniE010 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+e011 uniE011 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+e012 uniE012 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+e013 uniE013 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+e014 uniE014 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+e015 uniE015 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+e016 uniE016 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+e017 uniE017 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+e018 uniE018 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+e019 uniE019 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+e01a uniE01A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+e01b uniE01B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+e01c uniE01C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+e01d uniE01D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+f000 uniF000 2.10 (Sans) 2.11 (Sans Condensed) +U+f001 uniF001 2.10 (Sans) 2.11 (Sans Condensed) +U+f208 uniF208 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+f20a uniF20A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+f215 uniF215 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+f216 uniF216 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+f217 uniF217 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+f21a uniF21A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+f21b uniF21B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+f25f uniF25F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+f5c5 afii10064 2.9 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+f6c4 afii10063 2.10 (Serif Bold Oblique, Serif Oblique) 2.11 (Serif Condensed Bold Oblique, Serif Condensed Oblique) +U+f6c5 afii10064 2.5 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.9 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Condensed Oblique, Sans Oblique) +U+f6c6 afii10192 2.5 (Serif Bold Oblique, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+f6c7 afii10831 2.11 (Serif Bold Oblique, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+f6c8 afii10832 2.11 (Serif Bold Oblique, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+f6d1 cyrBreve 2.5 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+f6d4 cyrbreve 2.5 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+fb00 uniFB00 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.8 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+fb01 fi original +U+fb02 fl original +U+fb03 uniFB03 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.8 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+fb04 uniFB04 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.8 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+fb05 uniFB05 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+fb06 uniFB06 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+fb13 uniFB13 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb14 uniFB14 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb15 uniFB15 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb16 uniFB16 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb17 uniFB17 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb1d uniFB1D 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb1f uniFB1F 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb20 uniFB20 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb29 uniFB29 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans ExtraLight, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+fb2a uniFB2A 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb2b uniFB2B 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb2c uniFB2C 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb2d uniFB2D 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb2e uniFB2E 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb2f uniFB2F 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb30 uniFB30 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb31 uniFB31 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb32 uniFB32 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb33 uniFB33 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb34 uniFB34 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb35 uniFB35 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb36 uniFB36 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb37 uniFB37 2.11 (Sans Condensed Oblique, Sans Oblique) +U+fb38 uniFB38 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb39 uniFB39 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb3a uniFB3A 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb3b uniFB3B 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb3c uniFB3C 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb3e uniFB3E 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb40 uniFB40 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb41 uniFB41 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb43 uniFB43 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb44 uniFB44 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb46 uniFB46 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb47 uniFB47 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb48 uniFB48 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb49 uniFB49 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb4a uniFB4A 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb4b uniFB4B 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb4c uniFB4C 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb4d uniFB4D 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb4e uniFB4E 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb52 uniFB52 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb53 uniFB53 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb54 uniFB54 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb55 uniFB55 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb56 uniFB56 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb57 uniFB57 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb58 uniFB58 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb59 uniFB59 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb5a uniFB5A 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb5b uniFB5B 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb5c uniFB5C 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb5d uniFB5D 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb5e uniFB5E 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb5f uniFB5F 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb60 uniFB60 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb61 uniFB61 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb62 uniFB62 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb63 uniFB63 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb64 uniFB64 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb65 uniFB65 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb66 uniFB66 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb67 uniFB67 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb68 uniFB68 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb69 uniFB69 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb6a uniFB6A 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb6b uniFB6B 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb6c uniFB6C 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb6d uniFB6D 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb6e uniFB6E 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb6f uniFB6F 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb70 uniFB70 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb71 uniFB71 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb72 uniFB72 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb73 uniFB73 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb74 uniFB74 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb75 uniFB75 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb76 uniFB76 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb77 uniFB77 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb78 uniFB78 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb79 uniFB79 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb7a uniFB7A 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb7b uniFB7B 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb7c uniFB7C 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb7d uniFB7D 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb7e uniFB7E 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb7f uniFB7F 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb80 uniFB80 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb81 uniFB81 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb8a uniFB8A 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb8b uniFB8B 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb8c uniFB8C 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb8d uniFB8D 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb8e uniFB8E 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb8f uniFB8F 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb90 uniFB90 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb91 uniFB91 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb92 uniFB92 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb93 uniFB93 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb94 uniFB94 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb95 uniFB95 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb9e uniFB9E 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb9f uniFB9F 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fbd9 uniFBD9 2.7 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fbda uniFBDA 2.7 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fbe8 uniFBE8 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fbe9 uniFBE9 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fbfc uniFBFC 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fbfd uniFBFD 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fbfe uniFBFE 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fbff uniFBFF 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fe00 uniFE00 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+fe01 uniFE01 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+fe02 uniFE02 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+fe03 uniFE03 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+fe04 uniFE04 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+fe05 uniFE05 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+fe06 uniFE06 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+fe07 uniFE07 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+fe08 uniFE08 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+fe09 uniFE09 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+fe0a uniFE0A 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+fe0b uniFE0B 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+fe0c uniFE0C 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+fe0d uniFE0D 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+fe0e uniFE0E 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+fe0f uniFE0F 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Oblique, Serif Condensed Oblique, Serif Oblique) +U+fe70 uniFE70 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fe71 uniFE71 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fe72 uniFE72 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fe73 uniFE73 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fe74 uniFE74 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fe76 uniFE76 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fe77 uniFE77 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fe78 uniFE78 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fe79 uniFE79 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fe7a uniFE7A 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fe7b uniFE7B 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fe7c uniFE7C 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fe7d uniFE7D 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fe7e uniFE7E 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fe7f uniFE7F 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fe80 uniFE80 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fe81 uniFE81 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fe82 uniFE82 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fe83 uniFE83 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fe84 uniFE84 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fe85 uniFE85 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fe86 uniFE86 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fe87 uniFE87 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fe88 uniFE88 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fe89 uniFE89 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fe8a uniFE8A 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fe8b uniFE8B 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fe8c uniFE8C 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fe8d uniFE8D 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fe8e uniFE8E 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fe8f uniFE8F 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fe90 uniFE90 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fe91 uniFE91 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fe92 uniFE92 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fe93 uniFE93 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fe94 uniFE94 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fe95 uniFE95 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fe96 uniFE96 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fe97 uniFE97 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fe98 uniFE98 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fe99 uniFE99 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fe9a uniFE9A 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fe9b uniFE9B 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fe9c uniFE9C 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fe9d uniFE9D 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fe9e uniFE9E 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fe9f uniFE9F 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fea0 uniFEA0 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fea1 uniFEA1 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fea2 uniFEA2 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fea3 uniFEA3 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fea4 uniFEA4 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fea5 uniFEA5 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fea6 uniFEA6 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fea7 uniFEA7 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fea8 uniFEA8 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fea9 uniFEA9 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+feaa uniFEAA 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+feab uniFEAB 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+feac uniFEAC 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fead uniFEAD 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+feae uniFEAE 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+feaf uniFEAF 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+feb0 uniFEB0 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+feb1 uniFEB1 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+feb2 uniFEB2 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+feb3 uniFEB3 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+feb4 uniFEB4 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+feb5 uniFEB5 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+feb6 uniFEB6 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+feb7 uniFEB7 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+feb8 uniFEB8 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+feb9 uniFEB9 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+feba uniFEBA 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+febb uniFEBB 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+febc uniFEBC 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+febd uniFEBD 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+febe uniFEBE 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+febf uniFEBF 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fec0 uniFEC0 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fec1 uniFEC1 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fec2 uniFEC2 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fec3 uniFEC3 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fec4 uniFEC4 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fec5 uniFEC5 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fec6 uniFEC6 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fec7 uniFEC7 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fec8 uniFEC8 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fec9 uniFEC9 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+feca uniFECA 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fecb uniFECB 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fecc uniFECC 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fecd uniFECD 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fece uniFECE 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fecf uniFECF 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fed0 uniFED0 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fed1 uniFED1 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fed2 uniFED2 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fed3 uniFED3 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fed4 uniFED4 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fed5 uniFED5 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fed6 uniFED6 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fed7 uniFED7 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fed8 uniFED8 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fed9 uniFED9 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+feda uniFEDA 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fedb uniFEDB 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fedc uniFEDC 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fedd uniFEDD 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fede uniFEDE 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fedf uniFEDF 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fee0 uniFEE0 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fee1 uniFEE1 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fee2 uniFEE2 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fee3 uniFEE3 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fee4 uniFEE4 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fee5 uniFEE5 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fee6 uniFEE6 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fee7 uniFEE7 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fee8 uniFEE8 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fee9 uniFEE9 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+feea uniFEEA 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+feeb uniFEEB 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+feec uniFEEC 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+feed uniFEED 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+feee uniFEEE 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+feef uniFEEF 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fef0 uniFEF0 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fef1 uniFEF1 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fef2 uniFEF2 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fef3 uniFEF3 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fef4 uniFEF4 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fef5 uniFEF5 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fef6 uniFEF6 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fef7 uniFEF7 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fef8 uniFEF8 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fef9 uniFEF9 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fefa uniFEFA 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fefb uniFEFB 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fefc uniFEFC 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+feff uniFEFF 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fffd uniFFFD 1.12 diff --git a/vendor/plugins/rfpdf/lib/fonts/dejavu-ttf-2.15/unicover.txt b/vendor/plugins/rfpdf/lib/fonts/dejavu-ttf-2.15/unicover.txt new file mode 100755 index 00000000..8c2d5c94 --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/dejavu-ttf-2.15/unicover.txt @@ -0,0 +1,160 @@ +This is the Unicode coverage file for DejaVu fonts +($Id: unicover.txt 1586 2007-02-18 16:07:32Z ben_laenen $) + +Control and similar characters are discounted from totals. + + Sans Serif Sans Mono +U+0000 Basic Latin 100% (95/95) 100% (95/95) 100% (95/95) +U+0080 Latin-1 Supplement 100% (96/96) 100% (96/96) 100% (96/96) +U+0100 Latin Extended-A 100% (128/128) 100% (128/128) 100% (128/128) +U+0180 Latin Extended-B 100% (208/208) 90% (188/208) 78% (163/208) +U+0250 IPA Extensions 100% (96/96) 100% (96/96) 100% (96/96) +U+02b0 Spacing Modifier Letters 78% (63/80) 56% (45/80) 57% (46/80) +U+0300 Combining Diacritical Marks 82% (92/112) 60% (68/112) 59% (67/112) +U+0370 Greek and Coptic 100% (127/127) 86% (110/127) 86% (110/127) +U+0400 Cyrillic 100% (255/255) 75% (192/255) 66% (170/255) +U+0500 Cyrillic Supplement 100% (20/20) (0/20) (0/20) +U+0530 Armenian 100% (86/86) (0/86) (0/86) +U+0590 Hebrew 57% (50/87) (0/87) (0/87) +U+0600 Arabic 47% (111/235) (0/235) (0/235) +U+0700 Syriac (0/77) (0/77) (0/77) +U+0750 Arabic Supplement (0/30) (0/30) (0/30) +U+0780 Thaana (0/50) (0/50) (0/50) +U+07c0 NKo (0/59) (0/59) (0/59) +U+0900 Devanagari (0/111) (0/111) (0/111) +U+0980 Bengali (0/91) (0/91) (0/91) +U+0a00 Gurmukhi (0/77) (0/77) (0/77) +U+0a80 Gujarati (0/83) (0/83) (0/83) +U+0b00 Oriya (0/81) (0/81) (0/81) +U+0b80 Tamil (0/71) (0/71) (0/71) +U+0c00 Telugu (0/80) (0/80) (0/80) +U+0c80 Kannada (0/86) (0/86) (0/86) +U+0d00 Malayalam (0/78) (0/78) (0/78) +U+0d80 Sinhala (0/80) (0/80) (0/80) +U+0e00 Thai 1% (1/87) (0/87) (0/87) +U+0e80 Lao 84% (55/65) (0/65) 43% (28/65) +U+0f00 Tibetan (0/195) (0/195) (0/195) +U+1000 Myanmar (0/78) (0/78) (0/78) +U+10a0 Georgian (0/83) (0/83) (0/83) +U+1100 Hangul Jamo (0/240) (0/240) (0/240) +U+1200 Ethiopic (0/356) (0/356) (0/356) +U+1380 Ethiopic Supplement (0/26) (0/26) (0/26) +U+13a0 Cherokee (0/85) (0/85) (0/85) +U+1400 Unified Canadian Aboriginal Syllabics 64% (404/630) (0/630) (0/630) +U+1680 Ogham (0/29) (0/29) (0/29) +U+16a0 Runic (0/81) (0/81) (0/81) +U+1700 Tagalog (0/20) (0/20) (0/20) +U+1720 Hanunoo (0/23) (0/23) (0/23) +U+1740 Buhid (0/20) (0/20) (0/20) +U+1760 Tagbanwa (0/18) (0/18) (0/18) +U+1780 Khmer (0/114) (0/114) (0/114) +U+1800 Mongolian (0/155) (0/155) (0/155) +U+1900 Limbu (0/66) (0/66) (0/66) +U+1950 Tai Le (0/35) (0/35) (0/35) +U+1980 New Tai Lue (0/80) (0/80) (0/80) +U+19e0 Khmer Symbols (0/32) (0/32) (0/32) +U+1a00 Buginese (0/30) (0/30) (0/30) +U+1b00 Balinese (0/121) (0/121) (0/121) +U+1d00 Phonetic Extensions 82% (105/128) 28% (36/128) 28% (36/128) +U+1d80 Phonetic Extensions Supplement 59% (38/64) 57% (37/64) 57% (37/64) +U+1dc0 Combining Diacritical Marks Supplement 46% (6/13) (0/13) (0/13) +U+1e00 Latin Extended Additional 100% (246/246) 77% (190/246) 54% (134/246) +U+1f00 Greek Extended 100% (233/233) 100% (233/233) 100% (233/233) +U+2000 General Punctuation 98% (104/106) 61% (65/106) 42% (45/106) +U+2070 Superscripts and Subscripts 100% (34/34) 52% (18/34) 52% (18/34) +U+20a0 Currency Symbols 100% (22/22) 27% (6/22) 22% (5/22) +U+20d0 Combining Diacritical Marks for Symbols 12% (4/32) (0/32) (0/32) +U+2100 Letterlike Symbols 94% (75/79) 7% (6/79) 7% (6/79) +U+2150 Number Forms 100% (50/50) 26% (13/50) 26% (13/50) +U+2190 Arrows 100% (112/112) 3% (4/112) 100% (112/112) +U+2200 Mathematical Operators 93% (239/256) 10% (27/256) 56% (145/256) +U+2300 Miscellaneous Technical 15% (37/232) 6% (16/232) 50% (117/232) +U+2400 Control Pictures 5% (2/39) 2% (1/39) 2% (1/39) +U+2440 Optical Character Recognition (0/11) (0/11) (0/11) +U+2460 Enclosed Alphanumerics 6% (10/160) (0/160) (0/160) +U+2500 Box Drawing (0/128) (0/128) 100% (128/128) +U+2580 Block Elements 100% (32/32) 100% (32/32) 100% (32/32) +U+25a0 Geometric Shapes 100% (96/96) 100% (96/96) 100% (96/96) +U+2600 Miscellaneous Symbols 100% (176/176) 17% (30/176) 84% (149/176) +U+2700 Dingbats 100% (174/174) (0/174) 82% (144/174) +U+27c0 Miscellaneous Mathematical Symbols-A 17% (7/39) 7% (3/39) 7% (3/39) +U+27f0 Supplemental Arrows-A 100% (16/16) (0/16) (0/16) +U+2800 Braille Patterns 100% (256/256) (0/256) (0/256) +U+2900 Supplemental Arrows-B 4% (6/128) (0/128) (0/128) +U+2980 Miscellaneous Mathematical Symbols-B 7% (9/128) 0% (1/128) 0% (1/128) +U+2a00 Supplemental Mathematical Operators 27% (71/256) 1% (3/256) (0/256) +U+2b00 Miscellaneous Symbols and Arrows 100% (31/31) 29% (9/31) 29% (9/31) +U+2c00 Glagolitic (0/94) (0/94) (0/94) +U+2c60 Latin Extended-C 100% (17/17) (0/17) (0/17) +U+2c80 Coptic (0/114) (0/114) (0/114) +U+2d00 Georgian Supplement (0/38) (0/38) (0/38) +U+2d30 Tifinagh (0/55) (0/55) (0/55) +U+2d80 Ethiopic Extended (0/79) (0/79) (0/79) +U+2e00 Supplemental Punctuation (0/26) (0/26) (0/26) +U+2e80 CJK Radicals Supplement (0/115) (0/115) (0/115) +U+2f00 Kangxi Radicals (0/214) (0/214) (0/214) +U+2ff0 Ideographic Description Characters (0/12) (0/12) (0/12) +U+3000 CJK Symbols and Punctuation (0/64) (0/64) (0/64) +U+3040 Hiragana (0/93) (0/93) (0/93) +U+30a0 Katakana (0/96) (0/96) (0/96) +U+3100 Bopomofo (0/40) (0/40) (0/40) +U+3130 Hangul Compatibility Jamo (0/94) (0/94) (0/94) +U+3190 Kanbun (0/16) (0/16) (0/16) +U+31a0 Bopomofo Extended (0/24) (0/24) (0/24) +U+31c0 CJK Strokes (0/16) (0/16) (0/16) +U+31f0 Katakana Phonetic Extensions (0/16) (0/16) (0/16) +U+3200 Enclosed CJK Letters and Months (0/242) (0/242) (0/242) +U+3300 CJK Compatibility (0/256) (0/256) (0/256) +U+3400 CJK Unified Ideographs Extension A (0/0) (0/0) (0/0) +U+4dc0 Yijing Hexagram Symbols (0/64) (0/64) (0/64) +U+4e00 CJK Unified Ideographs (0/0) (0/0) (0/0) +U+a000 Yi Syllables (0/1165) (0/1165) (0/1165) +U+a490 Yi Radicals (0/55) (0/55) (0/55) +U+a700 Modifier Tone Letters (0/27) (0/27) (0/27) +U+a720 Latin Extended-D (0/2) (0/2) (0/2) +U+a800 Syloti Nagri (0/44) (0/44) (0/44) +U+a840 Phags-pa (0/56) (0/56) (0/56) +U+ac00 Hangul Syllables (0/0) (0/0) (0/0) +U+d800 High Surrogates (0/0) (0/0) (0/0) +U+db80 High Private Use Surrogates (0/0) (0/0) (0/0) +U+dc00 Low Surrogates (0/0) (0/0) (0/0) +U+e000 Private Use Area (0/0) (0/0) (0/0) +U+f900 CJK Compatibility Ideographs (0/467) (0/467) (0/467) +U+fb00 Alphabetic Presentation Forms 82% (48/58) 12% (7/58) 3% (2/58) +U+fb50 Arabic Presentation Forms-A 11% (70/595) (0/595) (0/595) +U+fe00 Variation Selectors 100% (16/16) 100% (16/16) (0/16) +U+fe10 Vertical Forms (0/10) (0/10) (0/10) +U+fe20 Combining Half Marks (0/4) (0/4) (0/4) +U+fe30 CJK Compatibility Forms (0/32) (0/32) (0/32) +U+fe50 Small Form Variants (0/26) (0/26) (0/26) +U+fe70 Arabic Presentation Forms-B 100% (141/141) (0/141) (0/141) +U+ff00 Halfwidth and Fullwidth Forms (0/225) (0/225) (0/225) +U+fff0 Specials 20% (1/5) 20% (1/5) 20% (1/5) +U+10000 Linear B Syllabary (0/88) (0/88) (0/88) +U+10080 Linear B Ideograms (0/123) (0/123) (0/123) +U+10100 Aegean Numbers (0/57) (0/57) (0/57) +U+10140 Ancient Greek Numbers (0/75) (0/75) (0/75) +U+10300 Old Italic (0/35) (0/35) (0/35) +U+10330 Gothic (0/27) (0/27) (0/27) +U+10380 Ugaritic (0/31) (0/31) (0/31) +U+103a0 Old Persian (0/50) (0/50) (0/50) +U+10400 Deseret (0/80) (0/80) (0/80) +U+10450 Shavian (0/48) (0/48) (0/48) +U+10480 Osmanya (0/40) (0/40) (0/40) +U+10800 Cypriot Syllabary (0/55) (0/55) (0/55) +U+10900 Phoenician (0/27) (0/27) (0/27) +U+10a00 Kharoshthi (0/65) (0/65) (0/65) +U+12000 Cuneiform (0/879) (0/879) (0/879) +U+12400 Cuneiform Numbers and Punctuation (0/103) (0/103) (0/103) +U+1d000 Byzantine Musical Symbols (0/246) (0/246) (0/246) +U+1d100 Musical Symbols (0/219) (0/219) (0/219) +U+1d200 Ancient Greek Musical Notation (0/70) (0/70) (0/70) +U+1d300 Tai Xuan Jing Symbols (0/87) (0/87) (0/87) +U+1d360 Counting Rod Numerals (0/18) (0/18) (0/18) +U+1d400 Mathematical Alphanumeric Symbols (0/996) (0/996) (0/996) +U+20000 CJK Unified Ideographs Extension B (0/0) (0/0) (0/0) +U+2f800 CJK Compatibility Ideographs Supplement (0/542) (0/542) (0/542) +U+e0000 Tags (0/98) (0/98) (0/98) +U+e0100 Variation Selectors Supplement (0/240) (0/240) (0/240) +U+f0000 Supplementary Private Use Area-A (0/0) (0/0) (0/0) +U+100000 Supplementary Private Use Area-B (0/0) (0/0) (0/0) diff --git a/vendor/plugins/rfpdf/lib/fonts/freefont/AUTHORS b/vendor/plugins/rfpdf/lib/fonts/freefont/AUTHORS new file mode 100755 index 00000000..e10fa42c --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/freefont/AUTHORS @@ -0,0 +1,143 @@ +-*-text-*- +$Id: AUTHORS,v 1.5 2003/10/08 12:22:24 peterlin Exp $ + +The free UCS scalable font collection is being maintained by Primo +Peterlin . The folowing list +cites the other contributors that contributed to particular ISO 10646 +blocks. + +# URW++ Design & Development GmbH + + Basic Latin (U+0041-U+007A) + Latin-1 Supplement (U+00C0-U+00FF) (most) + Latin Extended-A (U+0100-U+017F) + Spacing Modifier Letters (U+02B0-U+02FF) + Mathematical Operators (U+2200-U+22FF) (parts) + Block Elements (U+2580-U+259F) + Dingbats (U+2700-U+27BF) + +# Yannis Haralambous and John + Plaice + + Latin Extended-B (U+0180-U+024F) + IPA Extensions (U+0250-U+02AF) + Greek (U+0370-U+03FF) + Armenian (U+0530-U+058F) + Hebrew (U+0590-U+05FF) + Arabic (U+0600-U+06FF) + Currency Symbols (U+20A0-U+20CF) + Arabic Presentation Forms-A (U+FB50-U+FDFF) + Arabic Presentation Forms-B (U+FE70-U+FEFF) + +# Young U. Ryu + + Arrows (U+2190-U+21FF) + Mathematical Symbols (U+2200-U+22FF) + +# Valek Filippov + + Cyrillic (U+0400-U+04FF) + +# Wadalab Kanji Comittee + + Hiragana (U+3040-U+309F) + Katakana (U+30A0-U+30FF) + +# Angelo Haritsis + + Greek (U+0370-U+03FF) + +# Yannis Haralambous and Virach Sornlertlamvanich + + Thai (U+0E00-U+0E7F) + +# Shaheed R. Haque + + Bengali (U+0980-U+09FF) + +# Sam Stepanyan + + Armenian (U+0530-U+058F) + +# Mohamed Ishan + + Thaana (U+0780-U+07BF) + +# Sushant Kumar Dash + + Oriya (U+0B00-U+0B7F) + +# Harsh Kumar + + Devanagari (U+0900-U+097F) + Bengali (U+0980-U+09FF) + Gurmukhi (U+0A00-U+0A7F) + Gujarati (U+0A80-U+0AFF) + +# Prasad A. Chodavarapu + + Telugu (U+0C00-U+0C7F) + +# Frans Velthuis and Anshuman Pandey + + + Devanagari (U+0900-U+097F) + +# Hardip Singh Pannu + + Gurmukhi (U+0A00-U+0A7F) + +# Jeroen Hellingman + + Oriya (U+0B00-U+0B7F) + Malayalam (U+0D00-U+0D7F) + +# Thomas Ridgeway + + Tamil (U+0B80-U+0BFF) + +# Berhanu Beyene <1beyene AT informatik.uni-hamburg.de>, + Prof. Dr. Manfred Kudlek , Olaf + Kummer , and Jochen Metzinger < + + Ethiopic (U+1200-U+137F) + +# Maxim Iorsh + + Hebrew (U+0590-U+05FF) + + +# Vyacheslav Dikonov + + Syriac (U+0700-U+074A) + Braille (U+2800-U+28FF) + +# M.S. Sridhar + + Devanagari (U+0900-U+097F) + Bengali (U+0980-U+09FF) + Gurmukhi (U+0A00-U+0A7F) + Gujarati (U+0A80-U+0AFF) + Oriya (U+0B00-U+0B7F) + Tamil (U+0B80-U+0BFF) + Telugu (U+0C00-U+0C7F) + Kannada (U+0C80-U+0CFF) + Malayalam (U+0D00-U+0D7F) + +# DMS Electronics, The Sri Lanka Tipitaka Project, and Noah Levitt + + + Sinhala (U+0D80-U+0DFF) + +# Dan Shurovich Chirkov + + Cyrillic (U+0400-U+04FF) + +# Abbas Izad + + Arabic (U+0600-U+06FF) + Arabic Presentation Forms-A (U+FB50-U+FDFF) + Arabic Presentation Forms-B (U+FE70-U+FEFF) + +Please see the CREDITS file for details on who contributed particular +subsets of the glyphs in font files. diff --git a/vendor/plugins/rfpdf/lib/fonts/freefont/CREDITS b/vendor/plugins/rfpdf/lib/fonts/freefont/CREDITS new file mode 100755 index 00000000..4fb088b6 --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/freefont/CREDITS @@ -0,0 +1,389 @@ +-*-text-*- +$Id: CREDITS,v 1.4 2003/03/27 08:40:03 peterlin Exp $ + +This file lists the contributors and contributions to the free UCS +scalable font project. + + +# URW++ Design & Development GmbH + +URW++ donated a set of 35 core PostScript Type 1 fonts to the +Ghostscript project , to be available +under the terms of GNU General Public License (GPL). + + Basic Latin (U+0041-U+007A) + Latin-1 Supplement (U+00C0-U+00FF) + Latin Extended-A (U+0100-U+017F) + Spacing Modifier Letters (U+02B0-U+02FF) + Mathematical Operators (U+2200-U+22FF) + Block Elements (U+2580-U+259F) + Dingbats (U+2700-U+27BF) + + +# Yannis Haralambous and John + Plaice + +Yannis Haralambous and John Plaice are the authors of Omega +typesetting system, . Omega is an +extension of TeX. Its first release, aims primarily at improving TeX's +multilingual abilities. In Omega all characters and pointers into +data-structures are 16-bit wide, instead of 8-bit, thereby eliminating +many of the trivial limitations of TeX. Omega also allows multiple +input and output character sets, and uses programmable filters to +translate from one encoding to another, to perform contextual +analysis, etc. Internally, Omega uses the universal 16-bit Unicode +standard character set, based on ISO-10646. These improvements not +only make it a lot easier for TeX users to cope with multiple or +complex languages, like Arabic, Indic, Khmer, Chinese, Japanese or +Korean, in one document, but will also form the basis for future +developments in other areas, such as native color support and +hypertext features. ... Fonts for UT1 (omlgc family) and UT2 (omah +family) are under development: these fonts are in PostScript format +and visually close to Times and Helvetica font families. (from the +Omega WWW site). Omega fonts are available subject to GPL +. + + Latin Extended-B (U+0180-U+024F) + IPA Extensions (U+0250-U+02AF) + Greek (U+0370-U+03FF) + Armenian (U+0530-U+058F) + Hebrew (U+0590-U+05FF) + Arabic (U+0600-U+06FF) + Currency Symbols (U+20A0-U+20CF) + Arabic Presentation Forms-A (U+FB50-U+FDFF) + Arabic Presentation Forms-B (U+FE70-U+FEFF) + + +# Valek Filippov + +Valek Filippov added Cyrillic glyphs and composite Latin Extended A to +the whole set of the abovementioned URW set of 35 PostScript core +fonts, . The fonts are available under +GPL. + + Latin Extended-A (U+0100-U+017F) + Cyrillic (U+0400-U+04FF) + + +# Wadalab Kanji Comittee + +Between April 1990 and March 1992, Wadalab Kanji Comittee put together +a series of scalable font files with Japanese scripts, in four forms: +Sai Micho, Chu Mincho, Cho Kaku and Saimaru. The font files are +written in custom file format, while tools for conversion into +Metafont and PostScript Type 1 are also supplied. The Wadalab Kanji +Comittee has later been dismissed, and the resulting files can be now +found on the FTP server of the Depertment of Mathematical Engineering +and Information Physics, Faculty of Engineering, University of Tokyo +. + + Hiragana (U+3040-U+309F) + Katakana (U+30A0-U+30FF) + + +# Young U. Ryu + +Young Ryu is the author of Txfonts, a set of mathematical symbols +designed to accompany text typeset in Times or its variants. In the +documentation, Young adresses the design of mathematical symbols: "The +Adobe Times fonts are thicker than the CM fonts. Designing math fonts +for Times based on the rule thickness of Times = , , + , / , < , +etc. would result in too thick math symbols, in my opinion. In the TX +fonts, these glyphs are thinner than those of original Times +fonts. That is, the rule thickness of these glyphs is around 85% of +that of the Times fonts, but still thicker than that of the CM fonts." +TX fonts are are distributed under the GNU public license +(GPL). Pointers to their location are available on +. + + Arrows (U+2190-U+21FF) + Mathematical Symbols (U+2200-U+22FF) + + +# Angelo Haritsis + +Angelo Haritsis has compiled a set of Greek Type 1 fonts, available on +. +The glyphs from this source has been used to compose Greek glyphs in +FreeSans and FreeMono. + +Angelo's licence says: "You can enjoy free use of these fonts for +educational or commercial purposes. All derived works should include +this paragraph. If you want to change something please let me have +your changes (via email) so that they can go into the next +version. You can also send comments etc to the above address." + + Greek (U+0370-U+03FF) + + +# Yannis Haralambous and Virach Sornlertlamvanich + +In 1999, Yannis Haralambous and Virach Sornlertlamvanich made a set of +glyphs covering the Thai national standard NF3, in both upright and +slanted shape. The collection of glyphs have been made part of GNU +intlfonts 1.2 package and is available on + under GPL. + + Thai (U+0E00-U+0E7F) + + +# Shaheed R. Haque + +Shaheed Haque has developed a basic set of basic Bengali glyphs +(without ligatures), using ISO10646 encoding. They are available under +the XFree86 license at . + +Copyright (C) 2001 S.R.Haque . All Rights Reserved. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL S.R.HAQUE 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. + +Except as contained in this notice, the name of S.R.Haque shall not be +used in advertising or otherwise to promote the sale, use or other +dealings in this Software without prior written authorization from +S.R.Haque. + + Bengali (U+0980-U+09FF) + + +# Sam Stepanyan + +Sam Stepanyan created a set of Armenian sans serif glyphs visually +compatible with Helvetica or Arial. Available on +. On +2002-01-24, Sam writes: "Arial Armenian font is free for +non-commercial use, so it is OK to use under GPL license." + + Armenian (U+0530-U+058F) + + +# Mohamed Ishan + +Mohamed Ishan has started a Thaana Unicode Project + and among other things created a +couple of Thaana fonts, available under FDL or BDF license. + + Thaana (U+0780-U+07BF) + + +# Sushant Kumar Dash (*) + +Sushant Dash has created a font in his mother tongue, Oriya. As he +states on his web page : +"Please feel free to foreword this mail to your Oriya friends. No +copyright law is applied for this font. It is totally free!!! Feel +free to modify this using any font editing tools. This is designed for +people like me, who are away from Orissa and want to write letters +home using Computers, but suffer due to unavailability of Oriya +fonts.(Or the cost of the available packages are too much)." + + Oriya (U+0B00-U+0B7F) + + +# Harsh Kumar + +Harsh Kumar has started BharatBhasha - +an effort to provide "FREE software, Tutorial, Source Codes +etc. available for working in Hindi, Marathi, Gujarati, Gurmukhi and +Bangla. You can type text, write Web pages or develop Indian Languages +Applications on Windows and on Linux. We also offer FREE help to +users, enthusiasts and software developers for their work in Indian +languages." + + Devanagari (U+0900-U+097F) + Bengali (U+0980-U+09FF) + Gurmukhi (U+0A00-U+0A7F) + Gujarati (U+0A80-U+0AFF) + + +# Prasad A. Chodavarapu + +Prasad A. Chodavarapu created Tikkana, a Telugu font available in Type +1 and TrueType format on . +Tikkana exceeds the Unicode Telugu range with some composite glyphs. +Available under the GNU General Public License. + + Telugu (U+0C00-U+0C7F) + + +# Frans Velthuis and Anshuman Pandey + + +In 1991, Frans Velthuis from the Groningen University, The +Netherlands, released a Devanagari font as Metafont source, available +under the terms of GNU GPL. Later, Anshuman Pandey from the Washington +University, Seattle, USA, took over the maintenance of font. Fonts can +be found on CTAN, . I +converted the font to Type 1 format using Pter Szab's TeXtrace +program and removed some +redundant control points with PfaEdit. + + Devanagari (U+0900-U+097F) + + +# Hardip Singh Pannu + +In 1991, Hardip Singh Pannu has created a free Gurmukhi TrueType font, +available as regular, bold, oblique and bold oblique form. Its license +says "Please remember that these fonts are copyrighted (by me) and are +for non-profit use only." + + Gurmukhi (U+0A00-U+0A7F) + + +# Jeroen Hellingman + +Jeroen Hellingman created a set of Malayalam metafonts in 1994, and a +set of Oriya metafonts in 1996. Malayalam fonts were created as +uniform stroke only, while Oriya metafonts exist in both uniform and +modulated stroke. From private communication: "It is my intention to +release the fonts under GPL, but not all copies around have this +notice on them." Metafonts can be found on CTAN, + and +. + + Oriya (U+0B00-U+0B7F) + Malayalam (U+0D00-U+0D7F) + + +# Thomas Ridgeway <> (*) + +Thomas Ridgeway, then at the Humanities And Arts Computing Center, +Washington University, Seattle, USA, (now defunct), created a Tamil +metafont in 1990. Anshuman Pandey from the same university took over +the maintenance of font. Fonts can be found at CTAN, +. + + Tamil (U+0B80-U+0BFF) + + +# Berhanu Beyene <1beyene AT informatik.uni-hamburg.de>, + Prof. Dr. Manfred Kudlek , Olaf + Kummer , and Jochen Metzinger < + +Beyene, Kudlek, Kummer and Metzinger from the Theoretical Foundations +of Computer Science, University of Hamburg, prepared a set of Ethiopic +metafonts, found on +. They also +maintain home page on the Ethiopic font project, +, +and can be reached at . The current +version of fonts is 0.7 (1998), and they are released under GNU GPL. I +converted the fonts to Type 1 format using Pter Szab's TeXtrace +program and removed some +redundant control points with PfaEdit. + + Ethiopic (U+1200-U+137F) + + +# Maxim Iorsh + +In 2002, Maxim Iorsh started the Culmus project, aiming at providing +Hebrew-speaking Linux and Unix community with a basic collection of +Hebrew fonts for X Windows. The fonts are visually compatible with +URW++ Century Schoolbook L, URW++ Nimbus Sans L and URW++ Nimbus Mono +L families, respectively, and are released under GNU GPL license. See +also . + + Hebrew (U+0590-U+05FF) + + +# Vyacheslav Dikonov + +Vyacheslav Dikonov made a braille unicode font that could be merged +with the UCS fonts to fill the 2800-28FF range completely. (uniform +scaling is possible to adapt it to any cell size). He also contributed +a free syriac font, whose glyphs (about half of them) are borrowed +from the "Carlo Ator" font freely downloadable from +. Vyacheslav also filled in a few missing +spots in the U+2000-U+27FF area, e.g. the box drawing section, sets of +subscript and superscript digits and capital Roman numbers. + + Syriac (U+0700-U+074A) + Box Drawing (U+2500-U+257F) + Braille (U+2800-U+28FF) + + +# M.S. Sridhar + +M/S Cyberscape Multimedia Limited, Mumbai, developers of Akruti +Software for Indian Languages (http://www.akruti.com/), have released +a set of TTF fonts for nine Indian scripts (Devanagari, Gujarati, +Telugu, Tamil, Malayalam, Kannada, Bengali, Oriya, and Gurumukhi) +under the GNU General Public License (GPL). You can download the fonts +from the Free Software Foundation of India WWW site +(http://www.gnu.org.in/software/software.html#akruti) or from the +Akruti website. + +For any further information or assistance regarding these fonts, +please contact mssridhar AT vsnl.com. + + Devanagari (U+0900-U+097F) + Bengali (U+0980-U+09FF) + Gurmukhi (U+0A00-U+0A7F) + Gujarati (U+0A80-U+0AFF) + Oriya (U+0B00-U+0B7F) + Tamil (U+0B80-U+0BFF) + Telugu (U+0C00-U+0C7F) + Kannada (U+0C80-U+0CFF) + Malayalam (U+0D00-U+0D7F) + + +# DMS Electronics, The Sri Lanka Tipitaka Project, and Noah Levitt + + +Noah Levitt found out that the Sinhalese fonts available on the site + are released under GNU GPL, or, +precisely, "Public Domain under GNU Licence + Produced by DMS +Electronics for The Sri Lanka Tipitaka Project" (taken from the font +comment), and took the effort of recoding the font to Unicode. + + Sinhala (U+0D80-U+0DFF) + + +# Daniel Shurovich Chirkov + +Dan Chirkov updated the FreeSerif font with the missing Cyrillic +glyphs needed for conformance to Unicode 3.2. The effort is part of +the Slavjanskij package for Mac OS X, +. + + Cyrillic (U+0400-U+04FF) + + +# Primo Peterlin + +Primo Peterlin filled in missing glyphs here and there (e.g. Latin +Extended-B and IPA Extensions ranges in the FreeMono familiy), and +created the following UCS blocks: + + Latin Extended-B (U+0180-U+024F) + IPA Extensions (U+0250-U+02AF) + Arrows (U+2190-U+21FF) + Box Drawing (U+2500-U+257F) + Block Elements (U+2580-U+259F) + Geometrical Shapes (U+25A0-U+25FF) + + +Notes: + +*: The glyph collection looks license-compatible, but its author has + not yet replied and agreed on his/her work being used in part of + this glyph collection. diff --git a/vendor/plugins/rfpdf/lib/fonts/freefont/ChangeLog b/vendor/plugins/rfpdf/lib/fonts/freefont/ChangeLog new file mode 100755 index 00000000..a04f78b3 --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/freefont/ChangeLog @@ -0,0 +1,630 @@ +2003-10-08 Primoz Peterlin + + # FreeMonoOblique.sfd, FreeSerifBoldItalic.sfd, + FreeSerifItalic.sfd - applied Josef Segur's corrections from + Oct. 5. + +2003-10-02 Primoz Peterlin + + # sfd/FreeSerif.sfd - Abbas Izad's contributed Arabic/Farsi + characters added. + + # sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, + sfd/FreeMonoBoldOblique.sfd, sfd/FreeSans.sfd, + sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, + sfd/FreeSansBoldOblique.sfd, sfd/FreeSerif.sfd, + sfd/FreeSerifItalic.sfd, sfd/FreeSerifBold.sfd, + sfd/FreeSerifBoldItalic.sfd - Combining characters (U+0300 - + U+036F) moved left, so that they have negative horizontal values + and zero advance width. + +2003-09-15 Primoz Peterlin + + # sfd/FreeSerifBold.sfd, sfd/FreeSerifItalic.sfd - Started working + on super- and subscripts. + +2003-09-12 Primoz Peterlin + + # sfd/FreeSans.sfd, sfd/FreeSerif.sfd - Added some missing + Hiragana and Katakana characters. + + # sfd/FreeSansBold.sfd - Cleared background characters in Latin + Extended-A. Added some automatically constructed characters in + Latin Extended-B. Started with superscripts and subscripts. + + # sfd/FreeSans.sfd - Subscript numerals (U+2080-U+2089) completed. + +2003-05-19 Primoz Peterlin + + # sfd/FreeSerif.sfd - Thai characters po pla and bo baimai + swapped; Thai character fongman corrected; all courtesy Theppitak + Karoonboonyanan. + +2003-05-17 Panayotis Katsaloulis + + # sfd/FreeSerif.sfd, sfd/FreeSerifItalic.sfd, + sfd/FreeSerifBold.sfd, sfd/FreeSerifBoldItalic.sfd - Full support + of all ancient greek glyphs + +2003-05-15 Primoz Peterlin + + # tools/KerningNumerals.pl - A Perl script for moving kerning + information from ASCII numerals (U+0030...) to characters in the + Adobe corporate use area (U+F6xx). + + # sfd/FreeSansBold.sfd, sfd/FreeSansOblique.sfd, + sfd/FreeSansBoldOblique.sfd - Created kerned numerals in the Adobe + corporate use area (U+F6xx) and moved kerning information from + ASCII numerals to the kerned numerals. + +2003-05-14 Primoz Peterlin + + # sfd/FreeSans.sfd - First approximation of super- and subscript + numerals and vulgar fractions. + + # sfd/FreeSerif.sfd - Super- and subscript numerals complete, + vulgar fractions completed and redone as references rather than + outlines. + +2003-05-12 Primoz Peterlin + + # sfd/FreeSerif.sfd - Clean-up of the Cyrillic letters added on + March 27; super- and subscripts, vulgar fractions. + +2003-05-09 Primoz Peterlin + + # sfd/FreeMonoBold.sfd - Added a couple of characters to + the Latin Extended-B area and the IPA extensions area. + +2003-05-08 Primoz Peterlin + + # sfd/FreeSerifBoldItalic.sfd - Added a couple of characters to + the Latin Extended-B area. + + # sfd/FreeSerif.sfd, sfd/FreeSerifItalic.sfd, + sfd/FreeSerifBold.sfd, sfd/FreeSerifBoldItalic.sfd - ASCII + numerals now monospaced; kerned numerals moved to Adobe corporate + use area + (U+F6xx). + +2003-05-07 Primoz Peterlin + + # sfd/FreeSerif.sfd - Roman numerals now more complete. + + # sfd/FreeSansOblique.sfd, sfd/FreeSansBoldOblique.sfd - Accented + characters added in the Latin Extended-B area. + + # sfd/FreeSans.sfd - Greek accents added in the Greek Extended + area, characters added in the Latin Extended-B area, Roman + numerals added. + + # sfd/FreeMonoOblique.sfd - Kerning pairs removed (what were they + doing in a monospaced font, anyway?). + + # sfd/FreeMonoBoldOblique.sfd - Additions in Latin Extended-B and + Basic Greek. + + # sfd/FreeMono.sfd, sfd/FreeMonoBold.sfd, sfd/FreeMonoOblique.sfd, + sfd/FreeMonoBoldOblique.sfd, sfd/FreeSans.sfd, + sfd/FreeSansBold.sfd, sfd/FreeSansOblique.sfd, + sfd/FreeSansBoldOblique.sfd - Major cleanup (fixed widths, open + paths, path directions (clockwise/counter-clockwise), points + rounded to integer values; outlines simplified etc.) + +2003-05-06 Primoz Peterlin + + # tools/OS2UnicodeRange - A simple script to display OS/2 Unicode + range table in TrueType fonts. + + # sfd/FreeSans.sfd, sfd/FreeSansBold.sfd - ASCII numerals now + monospaced; kerned numerals moved to Adobe corporate use area + (U+F6xx). FreeSans is done, FreeSansBold half-way. + + # sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, + sfd/FreeMonoBoldOblique.sfd, sfd/FreeSans.sfd, + sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, + sfd/FreeSansBoldOblique.sfd, sfd/FreeSerif.sfd, + sfd/FreeSerifItalic.sfd, sfd/FreeSerifBold.sfd, + sfd/FreeSerifBoldItalic.sfd - Added 2003 in copyright info. + +2003-03-27 Primoz Peterlin + + # sfd/FreeSerif.sfd - Cyrillic and Cyrillic Supplement blocks + brought to conformance with Unicode 3.2, courtesy Daniel Shurovich + Chirkov. + +2003-03-19 Primoz Peterlin + + # sfd/FreeSans.sfd, sfd/FreeSansOblique.sfd - somewhat wider + germandbls (U+00DF), due to complaints by Walter Schmidt. + +2003-03-18 Primoz Peterlin + + # sfd/FreeSans.sfd - Added Sinhala glyphs from the Tipitaka + project , recoded to Unicode by Noah Levitt. + +2003-02-19 Primoz Peterlin + + # sfd/FreeSans.sfd - Minor changes on mathematical operators. + +2003-02-18 Primoz Peterlin + + # sfd/FreeMono.sfd - minor cleanup of glyph backgrounds; changed + integral signs (U+222B - U+2230) + +2003-02-05 Primoz Peterlin + + # sfd/FreeSans.sfd - added a couple of glyphs in the IPA and + African Latin ranges. + +2003-01-30 Primoz Peterlin + + # sfd/FreeSans.sfd, sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, + sfd/FreeSansBoldOblique.sfd, sfd/FreeMonoBold.sfd, + sfd/FreeMonoBoldOblique.sfd - Corrected Maltese Hbar (U+0126) + and/or hbar (U+0127). + +2003-01-28 Primoz Peterlin + + # sfd/FreeSerifItalic.sfd - Corrected Maltese hbar (U+0127). + +2002-12-18 Primoz Peterlin + + # tools/ConvertFont - PfaEdit script for converting SFD files to + TrueType fonts. + + # sfd/FreeSans.sfd - Added Tamil and Kannada glyphs from the + Akruti Indic fonts. + +2002-12-17 Primoz Peterlin + + # sfd/FreeSans.sfd - Added Devanagari and Gujarati glyphs from the + Akruti Indic fonts. + + # www/index.html - Added information on Rogier van Dalen's tools. + + # AUTHORS - Added M.S. Sridhar. + + # CREDITS - Correct spelling of Culmus project. Added M.S. Sridhar. + +2002-12-06 Primoz Peterlin + + # sfd/FreeMono.sfd - Added Braille glyphs, courtesy Vyacheslav + Dikonov. + + # sfd/FreeSans.sfd - Added Unicode Syriac glyphs, courtesy + Vyacheslav Dikonov. + +2002-10-11 Primoz Peterlin + + # www/index.html - Added information on the availability of the + Debian GNU/Linux package. + + # sfd/FreeSerif.sfd, sfd/FreeSans.sfd - added some kern pairs + beyond Latin-1 area. + + # sfd/FreeSerif.sfd, sfd/FreeSerifItalic.sfd, + sfd/FreeSerifBold.sfd, sfd/FreeSerifBoldItalic.sfd - re-introduced + all the emtpy glyph slots (changes from Sep 23 made PfaEdit + crash). + +2002-09-23 Primoz Peterlin + + # sfd/FreeSerif.sfd, sfd/FreeSerifItalic.sfd, + sfd/FreeSerifBold.sfd, sfd/FreeSerifBoldItalic.sfd - imported + kerning information from the URW++ AFM files + +2002-09-11 Primoz Peterlin + + # sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, + sfd/FreeMonoOblique.sfd - updated Hebrew parts to comply with + Culmus v0.6. + + # sfd/FreeSans.sfd, sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, + sfd/FreeSansOblique.sfd - Added Danilo Segan's Serbian Cyrillic + glyphs; updated Hebrew parts to comply with Culmus v0.6. + +2002-09-09 Primoz Peterlin + + # sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, + sfd/FreeMonoOblique.sfd, sfd/FreeSans.sfd, + sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, + sfd/FreeSansOblique.sfd - Updated Cyrillic part to match + Filippov's 1.0.7pre14 + + # sfd/FreeSansOblique.sfd - added Sam Stepanyan's Armenian glyphs + from FreeSans (skewed for 12 degrees). + +2002-09-06 Primoz Peterlin + + # sfd/FreeSans.sfd, sfd/FreeSansOblique.sfd, + sfd/FreeSansBold.sfd, sfd/FreeSansOblique.sfd - Added Maxim + Iorsh's Hebrew characters. + +2002-08-29 Primoz Peterlin + + # sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, + sfd/FreeMonoBold.sfd, sfd/FreeMonoOblique.sfd - Added Maxim + Iorsh's Hebrew characters. + + # AUTHORS, CREDITS - Added Maxim Iorsh as author. + +2002-08-28 Primoz Peterlin + + # www/index.html - Added information of Microsoft's withdrawal of + freely available Unicode TrueType fonts + + # www/resources.html - Added link to Maxim Iorsh's Culmus project. + +2002-07-26 Primoz Peterlin + + # sfd/FreeMono.sfd - Added a couple of characters (Arrows area). + +2002-06-11 Primoz Peterlin + + # sfd/FreeMono.sfd - Applied Michalis Kabrianis's patch concerning + perispomeni in Greek politoniko. + +2002-05-23 Primoz Peterlin + + # sfd/FreeMono.sfd - Applied Michalis Kabrianis's patch concerning + psili in Greek politoniko. Also added two working variants of + chars in the IPA range. + +2002-05-15 Primoz Peterlin + + # sfd/FreeSans.sfd, sfd/FreeSansBold.sfd, sfd/FreeSerif.sfd, + sfd/FreeSerifBold.sfd - Deleted explicit ".notdef" character with + no contours. + +2002-05-14 Primoz Peterlin + + # sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, + sfd/FreeMonoBoldOblique.sfd, sfd/FreeSans.sfd, + sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, + sfd/FreeSansBoldOblique.sfd, sfd/FreeSerif.sfd, + sfd/FreeSerifItalic.sfd, sfd/FreeSerifBold.sfd, + sfd/FreeSerifBoldItalic.sfd - The new version of PfaEdit saves + correctly formed Panose and LineGap lines. + + # sfd/FreeSansBoldOblique.sfd - Filled-in the missing TTFWidth and + TTFWeight values. + +2002-05-09 Primoz Peterlin + + # sfd/FreeSans.sfd - Added diacritics to the Spacing Modifier + Letters and Combining Diacritical Marks areas. Added composed + glyphs to the Latin Extended-B area. + +2002-05-07 Primoz Peterlin + + # sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, + sfd/FreeMonoBoldOblique.sfd, sfd/FreeSans.sfd, + sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, + sfd/FreeSansBoldOblique.sfd, sfd/FreeSerif.sfd, + sfd/FreeSerifItalic.sfd, sfd/FreeSerifBold.sfd, + sfd/FreeSerifBoldItalic.sfd - Updated Panose information with data + provided by Josef W. Segur. Updated TTF headers with English and + Slovenian text. + +2002-04-30 Primoz Peterlin + + # sfd/FreeMonoBold.sfd - Working on Greek small letters. Several + minor changes (lower carons etc.) + +2002-04-29 Primoz Peterlin + + # FreeMonoBoldOblique.sfd - Started adding Greek. + + # sfd/FreeMonoBold.sfd - Added glyphs in the Geometrical Shapes + and Miscellaneous Symbols area. Harmonizing Greek with Latin. Done + with capitals. + + # sfd/FreeMono.sfd - Deleted the explicit .notdef character. Added + one glyph to the Geometrical Shapes area, which is now completed; + added three glyphs to the Miscellaneous Symbols area. Harmonizing + Greek with Latin. Done with the capitals. + +2002-04-26 Primoz Peterlin + + # sfd/FreeSans.sfd - Adjusted accent positions on several glyphs + in the Latin Extended-A area. + +2002-04-25 Primoz Peterlin + + # sfd/FreeMonoBold.sfd - Box Drawing area completed. Added a + couple of glyphs in the Geometrical Shapes area. + + # sfd/FreeMono.sfd - Small corrections in the Box Drawing area. + +2002-04-24 Primoz Peterlin + + # sfd/FreeMono.sfd - Box Drawing area completed. + +2002-04-23 Primoz Peterlin + + # tools/WGL4.lst - corrected. + + # sfd/FreeMono.sfd, sfd/FreeMonoBold.sfd - Working on Box Drawing + area. + +2002-04-22 Primoz Peterlin + + # sfd/FreeMono.sfd, sfd/FreeMonoBold.sfd - Working on Latin + Extended-B and Greek. + +2002-04-19 Primoz Peterlin + + # sfd/FreeSerif.sfd - Somewhat cleaner chess figures. + + # tools/MES-2.txt, tools/MES-2.lst - Corrected list (it is not + 203C-203E, it is 203C and 203E). + + # sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, + sfd/FreeMonoBoldOblique.sfd, sfd/FreeSans.sfd, + sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, + sfd/FreeSansBoldOblique.sfd, sfd/FreeSerif.sfd, + sfd/FreeSerifItalic.sfd, sfd/FreeSerifBold.sfd, + sfd/FreeSerifBoldItalic.sfd - Changed "Family Name" from Free to + FreeSerif, FreeSans and FreeMono, as appropriate. Changed Font + Modifiers from MonoBold etc. to Bold, Italic, Oblique, BoldOblique + and BoldItalic. + +2002-04-18 Primoz Peterlin + + # sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, + sfd/FreeMonoBoldOblique.sfd - Corrected metrics; now all character + widths are set to 600. + +2002-04-17 Primoz Peterlin + + # sfd/FreeSerif.sfd - Corrected glyphs in the Box Drawing area and + Block Elements area, which should extend through the ascender#and + descender# height. + + # sfd/FreeMonoBold.sfd - Continued working on harmonizing Greek + letters with Latin and Cyrillic. + + # sfd/FreeMonoBold.sfd - Added some box drawing characters. + +2002-04-16 Primoz Peterlin + + # www/design-notes.html - Updated notes on stroke width for + symbols in Free Mono Bold. + + # sfd/FreeMono.sfd - Added a handful of characters in the + Miscellaneous Symbols area. + + # sfd/FreeMonoBoldOblique.sfd - Added subscripts, superscripts and + vulgar fractions. + + # sfd/FreeMonoBold.sfd - Started harmonizing Greek letters with + Latin and Cyrillic. + + # sfd/FreeMonoBold.sfd - Added subscripts, superscripts and vulgar + fractions. + +2002-04-15 Primoz Peterlin + + # www/design-notes.html - Updated notes on super-/subscripts in + Free Mono Bold. Separate subsections for Free Mono regular and + Free Mono Bold. + +2002-04-12 Primoz Peterlin + + # sfd/FreeSerif.sfd - Added Ethiopian glyphs, converted from the + Metafont sources from TGI, Universitt Hamburg (authors Berhanu + Beyene, Prof. Dr. Manfred Kudlek, Olaf Kummer, and Jochen + Metzinger) using Szabo's TeXtrace and retouched using + PfaEdit. Ethiopian metafonts are released under GNU GPL, + . + + # sfd/FreeMonoBold.sfd - Added 40 characters, mostly in the Latin + Extended-B and IPA Extensions areas. + +2002-04-11 Primoz Peterlin + + # sfd/FreeMono.sfd - Added a handful of characters in the Latin + Extended-B, IPA Extensions, Currency Symbols and Miscellaneous + Symbols areas. + +2002-04-09 Primoz Peterlin + + # sfd/FreeMono.sfd - Correcting accent positioning in the Extended + Greek area; adding a couple of characters here and there. Still 20 + characters short of MES-2 conformance. + +2002-04-08 Primoz Peterlin + + # sfd/FreeMono.sfd - Added some characters in the Arrows area; + more or less completed Extended Greek area (accents still need to + be fine-tuned). + +2002-04-05 Primoz Peterlin + + # sfd/FreeMono.sfd - Modern non-Russian Cyrilic mostly completed. + + # sfd/FreeMonoOblique.sfd - Synchronized with FreeMono. + + # sfd/FreeSerif.sfd - Added Thomas Ridgeway's Tamil characters + (converted from Metafont and edited somehwat). + +2002-04-04 Primoz Peterlin + + # sfd/FreeMonoOblique.sfd - Armenian letters added. + + # sfd/FreeMonoBold.sfd - Serbian Cyrillic letters dje, tshe, lje + and nje corrected. + + # sfd/FreeMono.sfd - Serbian Cyrillic letters dje and tshe + corrected. Some other non-Russian Cyrillic letters modified and + "welded together". + +2002-04-03 Primoz Peterlin + + # sfd/FreeMono.sfd - Added more or less complete Armenian + area. The glyphs are a tidied-up version based on the Armenian + Courier on the . Now we have + 1673 characters. + +2002-03-28 Primoz Peterlin + + # sfd/FreeMono.sfd - Added some mathematical symbols. + +2002-03-26 Primoz Peterlin + + # sfd/FreeSans.sfd - took H.S. Pannu's Gurmukhi from FreeSerif. It + actually fits to FreeSans much better. It seems I'll have to look + for another Gurmukhi font with modulated stroke for FreeSerif. + + # sfd/FreeSerifItalic.sfd - replaced existing Hebrew glyphs by + those from FreeSerif (slanted for 15.5 degrees). + + # sfd/FreeSerif.sfd - Added dotted Hebrew letters. Changed barred H. + + # sfd/FreeMono.sfd - Completed vulgar fractions; minor changes in + Greek; added some mathematical operators. + + # sfd/FreeMonoBold.sfd - added 12 characters to Latin Extended-B + and IPA Extensions areas (total 984). + +2002-03-25 Primoz Peterlin + + # sfd/FreeMonoBold.sfd - started adding Latin Extended-B and IPA + Extensions. + + # sfd/FreeMono.sfd - Minor cosmetic changes; cleaning up Greek + (removing redundant control points), added some non-European + Cyrillic glyphs as a test. + +2002-03-22 Primoz Peterlin + + # sfd/FreeMono.sfd - Some minor modifications; letters in Latin + Extended-B area "welded" together. + +2002-03-20 Primoz Peterlin + + # www/index.html - finally linked the resources and design notes + pages. + + # www/design-notes.html - added scaling information for super- and + subscript numerals in FreeMono. + +2002-03-19 Primoz Peterlin + + # sfd/FreeMono.sfd - the Latin Extended-B and IPA Extension area + characters moved from FreeMono and skewed for 12 degrees. + +2002-03-18 Primoz Peterlin + + # sfd/FreeMono.sfd - added a dozen or two of new characters, in + particular in the Latin Extended-B and IPA Extension area. + +2002-03-15 Primoz Peterlin + + # sfd/FreeMono.sfd - added a dozen of two of new characters, in + particular in the IPA Extension area. + + # www/design-notes.html - Corrected data for x-height in FreeMono; + information on constructing small caps. + +2002-03-14 Primoz Peterlin + + # sfd/FreeMono.sfd - added three smiley characters to the + Miscallaneous Symbols area. + +2002-03-10 Primoz Peterlin + + # sfd/FreeSerif.sfd - Anshuman Pandey has only converted Gurmukhi + from TrueType to Metafont; the original author of Gurkmukhi font + is Hardip Singh Pannu . + Got the permission from him to include the Gurmukhi glyph set. + +2002-03-08 Primoz Peterlin + + # sfd/FreeSerif.sfd - Added some more glyphs in the Mathematical + Symbols area to a total number of 3374. + +2002-03-06 Primoz Peterlin + + # sfd/FreeSerif.sfd - Added a basic Gurmukhi set. + + # www/design-notes.html - started a page on design notes + + # sfd/FreeMono.sfd - realized that glyphs in the Box Drawing area + and Block Elements area should extend through the ascender#and + descender# height, and corrected it. + + # sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd - added some musical + glyphs, linking "no-break space" to space, "soft hyphen" to + hyphen-minus etc. + +2002-03-05 Primoz Peterlin + + # tools/WGL4.lst - Added Windows Glyph List 4.0 + + # tools/LigatureList.pl - Wrote a Perl script, which lists the + GSUB list (ligature list) of a OpenType font. + + # sfd/FreeSerifBold.sfd, sfd/FreeSerifBoldItalic.sfd, + sfd/FreeSerifItalic.sfd - auxilliary Hebrew glyphs added. They are + too light compared with Latin and will be substituted with better + ones. + +2002-03-04 Primoz Peterlin + + # sfd/FreeSerif.sfd - Added some more glyphs to the Mathematical + Operators area (page 0x22). + + # sfd/FreeSerif.sfd - Incomplete and fragmentary support for + Devanagari, originating from Harsh Kumar's Shusha fonts was + replaced by Frans Velthuis' Devanagari metafont, now maintained by + Anshuman Pandey and available under + GPL. Until I figure out how to provide glyph substitution table in + OpenType, only the Unicode part is there. + +2002-02-28 Primoz Peterlin + + # ChangeLog file created + + # sfd/FreeSerif.sfd - Added some Telugu glyphs to page 0x0C, + courtesy Prasad A. Chodavarapu + + # sfd/FreeSerif.sfd - Added some glyphs to the Miscellaneous + Symbols page (0x26). + +2002-02-26 Primoz Peterlin + + # mailing lists freefont-announce and freefont-bugs created + +2002-02-25 Primoz Peterlin + + # sfd/FreeSerif.sfd - Added a couple of glyphs in Mathematics + Operators area. + + # sfd/FreeMono.sfd + - Added some more glyphs, in particular in the Mathematical + Operators section. + - Changed FamilyName to Free, FontName to FreeMono, and Full name + to "Free Monospaced". + +2002-02-20 Primoz Peterlin + + # sfd/ directory added containing FreeSerif, FreeSans and FreeMono + families. + + # tools/ directory added containing lists with characters required + for MES (Multilinguag European Subset) compliance. + + # tools/mes-list-expand.pl created - a Perl script for expanding MES + ranges into simple one-char-per-line format + + # tools/CheckConformance.pl created - a Perl script for checking + conformance of a font file with a given coded character set + + # homepage created + +2002-02-19 Primoz Peterlin + + # freefont (Free UCS Scalable Fonts) project approved on + savannah.gnu.org: diff --git a/vendor/plugins/rfpdf/lib/fonts/freefont/INSTALL b/vendor/plugins/rfpdf/lib/fonts/freefont/INSTALL new file mode 100755 index 00000000..1e1e6463 --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/freefont/INSTALL @@ -0,0 +1,57 @@ +-*-mode:text;-*- +$Id: INSTALL,v 1.1 2002/12/12 15:09:05 peterlin Exp $ + + + Installing the Free UCS outline fonts + ===================================== + + +These installation notes are supposed to provide a helpful guidance +through the process of installation of free UCS outline fonts. They +can probably be significantly improved. Please direct your comments, +suggestions for improvements, criticisms etc. to Primoz PETERLIN + and thus help improve them. + + +1. UNIX/GNU/Linux/BSD Systems + +The rather awkward "UNIX/GNU/Linux/BSD" agglomeration is used to +denote any system capable of running XFree86 server with FreeType +, a high-quality free font rasterizer. + +1.1 The rough way + +Unfortunately, hardly any other way exists at the moment. + +1) Fetch the freefont-ttf.tar.gz package with Free UCS outline fonts + in the TrueType format. + +2) Unpack TrueType fonts into a suitable directory, + e.g. /usr/share/fonts/default/TrueType/. + +3) If you have chosen any other directory, make sure the directory you + used to install the fonts is listed in the path searched by the X + Font Server. Append the directory to the "catalogue=" in the + /etc/X11/fs/config. + +4) Run ttmkfdir in the directory where you unpacked the fonts. + + +1.2 Debian GNU/Linux + +Users of Debian GNU/Linux system will probably want to use the +pre-packed Debian package, as available from the Debian site, +, or +any of its mirrors. You can install them by issuing the command + +apt-get install ttf-freefont + + +2. Microsoft Windows 95/98/NT/2000/XP + +To be written. + + +3. MacOS + +To be written. diff --git a/vendor/plugins/rfpdf/lib/fonts/freefont/README b/vendor/plugins/rfpdf/lib/fonts/freefont/README new file mode 100755 index 00000000..6f0a3d8d --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/freefont/README @@ -0,0 +1,113 @@ +-*-text-*- +$Id: README,v 1.1 2002/11/28 10:10:30 peterlin Exp $ + +Summary: This project aims to privide a set of free scalable +(PostScript Type0, TrueType, OpenType...) fonts covering the ISO +10646/Unicode UCS (Universal Character Set). + + +Why do we need free scalable UCS fonts? + +A large number of free software users switched from free X11 +bitmapped fonts to proprietary Microsoft Truetype fonts, as a) they +used to be freely downloaded from Microsoft Typography page +, b) they contain a more +or less decent subsed of the ISO 10646 UCS (Universal Character Set), +c) they are high-quality, well hinted scalable Truetype fonts, and d) +Freetype , a free high-quality Truetype font +renderer exists and has been integrated into the latest release of +XFree86, the free X11 server. + +Building a dependence on non-free software, even a niche one like +fonts, is dangerous. Microsoft Truetype core fonts are not free, they +are just costless. For now, at least. Citing the TrueType core fonts +for the Web FAQ : +"You may only redistribute the fonts in their original form (.exe or +.sit.hqx) and with their original file name from your Web site or +intranet site. You must not supply the fonts, or any derivative fonts +based on them, in any form that adds value to commercial products, +such as CD-ROM or disk based multimedia programs, application software +or utilities." As of August 2002, however, the fonts are not +anymore available on the Web, which makes the situation clearer. + +Aren't there any free high-quality scalable fonts? Yes, there are. +URW++, a German digital typefoundry, released their own version of the +35 Postscript Type 1 core fonts under GPL as their donation to the +Ghostscript project . The Wadalab +Kanji comittee has produced Type 1 font files with thousands of +filigree Japanese glyphs . +Yannis Haralambous has drawn beautiful glyphs for the Omega +typesetting system . And so +on. Scattered around the internet there are numerous other free +resources for other national scripts, many of them aiming to be a +suitable match for Latin fonts like Times or Helvetica. + + +What do we plan to achieve, and how? + +Our aim is to collect available resources, fill in the missing pieces, +and provide a set of free high-quality scalable (Type 1 and Truetype) +UCS fonts, released under GPL. + +Free UCS scalable fonts will cover the following character sets + +# ISO 8859 parts 1-15 +# CEN MES-3 European Unicode Subset + http://www.evertype.com/standards/iso10646/pdf/cwa13873.pdf +# IBM/Microsoft code pages 437, 850, 852, 1250, 1252 and more +# Microsoft/Adobe Windows Glyph List 4 (WGL4) + http://partners.adobe.com/asn/developer/opentype/appendices/wgl4.html +# KOI8-R and KOI8-RU +# DEC VT100 graphics symbols +# International Phonetic Alphabet +# Arabic, Hebrew, Armenian, Georgian, Ethiopian, Thai and Lao alphabets, + including Arabic presentation forms A/B +# Japanese Katakana and Hiragana +# mathematical symbols, including the whole TeX repertoire of symbols +# APL symbols + etc. + +A free Postscript font editor, George Williams's Pfaedit + will be used for creating new +glyphs. + +Which font shapes should be made? As historical style terms like +Renaissance or Baroque letterforms cannot be applied beyond +Latin/Cyrillic/Greek scripts to any greater extent than Kufi or Nashki +can be applied beyond Arabic script, a smaller subset of styles will +be made: one monospaced and two proportional (one with uniform stroke +and one with modulated) will be made at the start. + +In the beginning, however, we don't believe that Truetype hinting will +be good enough to compete with neither the hand-crafted bitmapped +fonts at small sizes, nor with commercial TrueType fonts. A companion +program for modifying the TrueType font tables, TtfMod, is in the +works, though: . For +applications like xterm, users are referred to the existing UCS bitmap +fonts, . + + +What do the file suffices mean? + +The files with .sfd (Spline Font Database) are in PfaEdit's native +format. Please use these if you plan to modify the font files. PfaEdit +can export these to mostly any existing font file format. + +TrueType fonts for immediate consumption are the files with the .ttf +(TrueType Font) suffix. You can use them directly, e.g. with the X +font server. + +The files with .ps (PostScript) suffix are not font files at all - +they are merely PostScript files with glyph tables, which can be used +for overview, which glyphs are contained in which font file. + +You may have noticed the lacking of PostScript Type 1 (.pfa/.pfb) font +files. Type 1 format does not support large (> 256) encoding vectors, +so they can not be used with ISO 10646 encoding. If your printer +supports it, you can use Type 0 format, though. Please use PfaEdit for +conversion to Type 0. + + +Primoz Peterlin, + +Free UCS scalable fonts: ftp:#biofiz.mf.uni-lj.si/pub/fonts/elbrus/ diff --git a/vendor/plugins/rfpdf/lib/fonts/freemono.rb b/vendor/plugins/rfpdf/lib/fonts/freemono.rb new file mode 100755 index 00000000..389815db --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/freemono.rb @@ -0,0 +1,174 @@ +TCPDFFontDescriptor.define('freemono') do |font| + font[:type]='TrueTypeUnicode'; + font[:name]='FreeMono'; + font[:desc]={'Ascent'=>1057,'Descent'=>-319,'CapHeight'=>1057,'Flags'=>32,'FontBBox'=>'[-557 -319 699 1057]','ItalicAngle'=>0,'StemV'=>70,'MissingWidth'=>600} + font[:up]=-100; + font[:ut]=50; + font[:cw]={ + 13=>333, 32=>600, 33=>600, 34=>600, 35=>600, 36=>600, 37=>600, 38=>600, 39=>600, 40=>600, 41=>600, 42=>600, 43=>600, 44=>600, 45=>600, 46=>600, + 47=>600, 48=>600, 49=>600, 50=>600, 51=>600, 52=>600, 53=>600, 54=>600, 55=>600, 56=>600, 57=>600, 58=>600, 59=>600, 60=>600, 61=>600, 62=>600, + 63=>600, 64=>600, 65=>600, 66=>600, 67=>600, 68=>600, 69=>600, 70=>600, 71=>600, 72=>600, 73=>600, 74=>600, 75=>600, 76=>600, 77=>600, 78=>600, + 79=>600, 80=>600, 81=>600, 82=>600, 83=>600, 84=>600, 85=>600, 86=>600, 87=>600, 88=>600, 89=>600, 90=>600, 91=>600, 92=>600, 93=>600, 94=>600, + 95=>600, 96=>600, 97=>600, 98=>600, 99=>600, 100=>600, 101=>600, 102=>600, 103=>600, 104=>600, 105=>600, 106=>600, 107=>600, 108=>600, 109=>600, 110=>600, + 111=>600, 112=>600, 113=>600, 114=>600, 115=>600, 116=>600, 117=>600, 118=>600, 119=>600, 120=>600, 121=>600, 122=>600, 123=>600, 124=>600, 125=>600, 126=>600, + 8364=>600, 1027=>600, 8218=>600, 402=>600, 8222=>600, 8230=>600, 8224=>600, 8225=>600, 710=>600, 8240=>600, 352=>600, 8249=>600, 338=>600, 1036=>600, 381=>600, 1039=>600, + 8216=>600, 8217=>600, 8220=>600, 8221=>600, 8226=>600, 8211=>600, 8212=>600, 732=>600, 8482=>600, 353=>600, 8250=>600, 339=>600, 1116=>600, 382=>600, 376=>600, 160=>600, + 161=>600, 162=>600, 163=>600, 164=>600, 165=>600, 166=>600, 167=>600, 168=>600, 169=>600, 170=>600, 171=>600, 172=>600, 173=>600, 174=>600, 175=>600, 176=>600, + 177=>600, 178=>600, 179=>600, 180=>600, 181=>600, 182=>600, 183=>600, 184=>600, 185=>600, 186=>600, 187=>600, 188=>600, 189=>600, 190=>600, 191=>600, 192=>600, + 193=>600, 194=>600, 195=>600, 196=>600, 197=>600, 198=>600, 199=>600, 200=>600, 201=>600, 202=>600, 203=>600, 204=>600, 205=>600, 206=>600, 207=>600, 208=>600, + 209=>600, 210=>600, 211=>600, 212=>600, 213=>600, 214=>600, 215=>600, 216=>600, 217=>600, 218=>600, 219=>600, 220=>600, 221=>600, 222=>600, 223=>600, 224=>600, + 225=>600, 226=>600, 227=>600, 228=>600, 229=>600, 230=>600, 231=>600, 232=>600, 233=>600, 234=>600, 235=>600, 236=>600, 237=>600, 238=>600, 239=>600, 240=>600, + 241=>600, 242=>600, 243=>600, 244=>600, 245=>600, 246=>600, 247=>600, 248=>600, 249=>600, 250=>600, 251=>600, 252=>600, 253=>600, 254=>600, 255=>600, 256=>600, + 257=>600, 258=>600, 259=>600, 260=>600, 261=>600, 262=>600, 263=>600, 264=>600, 265=>600, 266=>600, 267=>600, 268=>600, 269=>600, 270=>600, 271=>600, 272=>600, + 273=>600, 274=>600, 275=>600, 276=>600, 277=>600, 278=>600, 279=>600, 280=>600, 281=>600, 282=>600, 283=>600, 284=>600, 285=>600, 286=>600, 287=>600, 288=>600, + 289=>600, 290=>600, 291=>600, 292=>600, 293=>600, 294=>600, 295=>600, 296=>600, 297=>600, 298=>600, 299=>600, 300=>600, 301=>600, 302=>600, 303=>600, 304=>600, + 305=>600, 306=>600, 307=>600, 308=>600, 309=>600, 310=>600, 311=>600, 312=>600, 313=>600, 314=>600, 315=>600, 316=>600, 317=>600, 318=>600, 319=>600, 320=>600, + 321=>600, 322=>600, 323=>600, 324=>600, 325=>600, 326=>600, 327=>600, 328=>600, 329=>600, 330=>600, 331=>600, 332=>600, 333=>600, 334=>600, 335=>600, 336=>600, + 337=>600, 340=>600, 341=>600, 342=>600, 343=>600, 344=>600, 345=>600, 346=>600, 347=>600, 348=>600, 349=>600, 350=>600, 351=>600, 354=>600, 355=>600, 356=>600, + 357=>600, 358=>600, 359=>600, 360=>600, 361=>600, 362=>600, 363=>600, 364=>600, 365=>600, 366=>600, 367=>600, 368=>600, 369=>600, 370=>600, 371=>600, 372=>600, + 373=>600, 374=>600, 375=>600, 377=>600, 378=>600, 379=>600, 380=>600, 383=>600, 384=>600, 385=>600, 386=>600, 387=>600, 388=>600, 389=>600, 390=>600, 391=>600, + 392=>600, 393=>600, 394=>600, 395=>600, 396=>600, 397=>600, 398=>600, 399=>600, 400=>600, 401=>600, 403=>600, 404=>600, 405=>600, 406=>600, 407=>600, 408=>600, + 409=>600, 410=>600, 411=>600, 412=>600, 413=>600, 414=>600, 415=>600, 416=>600, 417=>600, 418=>600, 419=>600, 420=>600, 421=>600, 422=>600, 423=>600, 424=>600, + 425=>600, 426=>600, 427=>600, 428=>600, 429=>600, 430=>600, 431=>600, 432=>600, 433=>600, 434=>600, 435=>600, 436=>600, 437=>600, 438=>600, 439=>600, 440=>600, + 441=>600, 442=>600, 443=>600, 444=>600, 445=>600, 446=>600, 447=>600, 448=>600, 449=>600, 450=>600, 451=>600, 452=>600, 453=>600, 454=>600, 455=>600, 456=>600, + 457=>600, 458=>600, 459=>600, 460=>600, 461=>600, 462=>600, 463=>600, 464=>600, 465=>600, 466=>600, 467=>600, 468=>600, 469=>600, 470=>600, 471=>600, 472=>600, + 473=>600, 474=>600, 475=>600, 476=>600, 477=>600, 478=>600, 479=>600, 480=>600, 481=>600, 482=>600, 483=>600, 484=>600, 485=>600, 486=>600, 487=>600, 488=>600, + 489=>600, 490=>600, 491=>600, 492=>600, 493=>600, 494=>600, 495=>600, 496=>600, 497=>600, 498=>600, 499=>600, 500=>600, 501=>600, 502=>600, 503=>600, 504=>600, + 505=>600, 506=>600, 507=>600, 508=>600, 509=>600, 510=>600, 511=>600, 512=>600, 513=>600, 514=>600, 515=>600, 516=>600, 517=>600, 518=>600, 519=>600, 520=>600, + 521=>600, 522=>600, 523=>600, 524=>600, 525=>600, 526=>600, 527=>600, 528=>600, 529=>600, 530=>600, 531=>600, 532=>600, 533=>600, 534=>600, 535=>600, 536=>600, + 537=>600, 538=>600, 539=>600, 540=>600, 541=>600, 542=>600, 543=>600, 548=>600, 549=>600, 550=>600, 551=>600, 552=>600, 553=>600, 554=>600, 555=>600, 556=>600, + 557=>600, 558=>600, 559=>600, 560=>600, 561=>600, 562=>600, 563=>600, 577=>600, 578=>600, 592=>600, 593=>600, 594=>600, 595=>600, 596=>600, 597=>600, 598=>600, + 599=>600, 600=>600, 601=>600, 602=>600, 603=>600, 604=>600, 607=>600, 608=>600, 609=>600, 610=>600, 611=>600, 612=>600, 613=>600, 614=>600, 615=>600, 616=>600, + 617=>600, 618=>600, 619=>600, 620=>600, 621=>600, 623=>600, 624=>600, 625=>600, 626=>600, 627=>600, 628=>600, 629=>600, 630=>600, 632=>600, 633=>600, 634=>600, + 635=>600, 636=>600, 637=>600, 638=>600, 639=>600, 640=>600, 641=>600, 642=>600, 643=>600, 644=>600, 645=>600, 646=>600, 647=>600, 648=>600, 649=>600, 652=>600, + 653=>600, 654=>600, 655=>600, 656=>600, 657=>600, 658=>600, 660=>600, 661=>600, 662=>600, 663=>600, 665=>600, 667=>600, 668=>600, 669=>600, 670=>600, 671=>600, + 672=>600, 673=>600, 674=>600, 675=>600, 676=>600, 678=>600, 679=>600, 699=>600, 700=>600, 701=>600, 702=>600, 703=>600, 711=>600, 712=>600, 713=>600, 714=>600, + 715=>600, 720=>600, 721=>600, 722=>600, 723=>600, 724=>600, 725=>600, 726=>600, 727=>600, 728=>600, 729=>600, 730=>600, 731=>600, 733=>600, 735=>600, 750=>600, + 768=>0, 769=>0, 770=>0, 771=>0, 772=>0, 773=>0, 774=>0, 775=>0, 776=>0, 777=>0, 778=>0, 779=>0, 780=>0, 781=>0, 782=>0, 783=>0, + 784=>0, 785=>0, 795=>0, 801=>0, 802=>0, 807=>0, 808=>0, 819=>600, 821=>0, 822=>0, 823=>0, 824=>0, 834=>0, 836=>0, 890=>600, 900=>600, + 901=>600, 902=>600, 903=>600, 904=>600, 905=>600, 906=>600, 908=>600, 910=>600, 911=>600, 912=>600, 913=>600, 914=>600, 915=>600, 916=>600, 917=>600, 918=>600, + 919=>600, 920=>600, 921=>600, 922=>600, 923=>600, 924=>600, 925=>600, 926=>600, 927=>600, 928=>600, 929=>600, 930=>600, 931=>600, 932=>600, 933=>600, 934=>600, + 935=>600, 936=>600, 937=>600, 938=>600, 939=>600, 940=>600, 941=>600, 942=>600, 943=>600, 944=>600, 945=>600, 946=>600, 947=>600, 948=>600, 949=>600, 950=>600, + 951=>600, 952=>600, 953=>600, 954=>600, 955=>600, 956=>600, 957=>600, 958=>600, 959=>600, 960=>600, 961=>600, 962=>600, 963=>600, 964=>600, 965=>600, 966=>600, + 967=>600, 968=>600, 969=>600, 970=>600, 971=>600, 972=>600, 973=>600, 974=>600, 976=>600, 977=>600, 978=>600, 979=>600, 981=>600, 986=>600, 987=>600, 988=>600, + 1024=>600, 1025=>600, 1026=>600, 1028=>600, 1029=>600, 1030=>600, 1031=>600, 1032=>600, 1033=>600, 1034=>600, 1035=>600, 1037=>600, 1038=>600, 1040=>600, 1041=>600, 1042=>600, + 1043=>600, 1044=>600, 1045=>600, 1046=>600, 1047=>600, 1048=>600, 1049=>600, 1050=>600, 1051=>600, 1052=>600, 1053=>600, 1054=>600, 1055=>600, 1056=>600, 1057=>600, 1058=>600, + 1059=>600, 1060=>600, 1061=>600, 1062=>600, 1063=>600, 1064=>600, 1065=>600, 1066=>600, 1067=>600, 1068=>600, 1069=>600, 1070=>600, 1071=>600, 1072=>600, 1073=>600, 1074=>600, + 1075=>600, 1076=>600, 1077=>600, 1078=>600, 1079=>600, 1080=>600, 1081=>600, 1082=>600, 1083=>600, 1084=>600, 1085=>600, 1086=>600, 1087=>600, 1088=>600, 1089=>600, 1090=>600, + 1091=>600, 1092=>600, 1093=>600, 1094=>600, 1095=>600, 1096=>600, 1097=>600, 1098=>600, 1099=>600, 1100=>600, 1101=>600, 1102=>600, 1103=>600, 1104=>600, 1105=>600, 1106=>600, + 1107=>600, 1108=>600, 1109=>600, 1110=>600, 1111=>600, 1112=>600, 1113=>600, 1114=>600, 1115=>600, 1117=>600, 1118=>600, 1119=>600, 1124=>600, 1130=>600, 1132=>600, 1136=>600, + 1137=>600, 1164=>600, 1165=>600, 1166=>600, 1167=>600, 1168=>600, 1169=>600, 1170=>600, 1171=>600, 1172=>600, 1173=>600, 1174=>600, 1175=>600, 1176=>600, 1177=>600, 1178=>600, + 1179=>600, 1180=>600, 1181=>600, 1182=>600, 1183=>600, 1184=>600, 1185=>600, 1186=>600, 1187=>600, 1188=>600, 1189=>600, 1190=>600, 1191=>600, 1192=>600, 1193=>600, 1194=>600, + 1195=>600, 1196=>600, 1197=>600, 1198=>600, 1199=>600, 1200=>600, 1201=>600, 1202=>600, 1203=>600, 1204=>600, 1205=>600, 1206=>600, 1207=>600, 1208=>600, 1209=>600, 1210=>600, + 1211=>600, 1212=>600, 1213=>600, 1214=>600, 1215=>600, 1216=>600, 1217=>600, 1218=>600, 1219=>600, 1220=>600, 1223=>600, 1224=>600, 1227=>600, 1228=>600, 1232=>600, 1233=>600, + 1234=>600, 1235=>600, 1236=>600, 1237=>600, 1238=>600, 1239=>600, 1240=>600, 1241=>600, 1242=>600, 1243=>600, 1244=>600, 1245=>600, 1246=>600, 1247=>600, 1248=>600, 1249=>600, + 1250=>600, 1251=>600, 1252=>600, 1253=>600, 1254=>600, 1255=>600, 1256=>600, 1257=>600, 1258=>600, 1259=>600, 1260=>600, 1261=>600, 1262=>600, 1263=>600, 1264=>600, 1265=>600, + 1266=>600, 1267=>600, 1268=>600, 1269=>600, 1272=>600, 1273=>600, 1329=>600, 1330=>600, 1331=>600, 1332=>600, 1333=>600, 1334=>600, 1335=>600, 1336=>600, 1337=>600, 1338=>600, + 1339=>600, 1340=>600, 1341=>600, 1342=>600, 1343=>600, 1344=>600, 1345=>600, 1346=>600, 1347=>600, 1348=>600, 1349=>600, 1350=>600, 1351=>600, 1352=>600, 1353=>600, 1354=>600, + 1355=>600, 1356=>600, 1357=>600, 1358=>600, 1359=>600, 1360=>600, 1361=>600, 1362=>600, 1363=>600, 1364=>600, 1365=>600, 1366=>600, 1377=>600, 1378=>600, 1379=>600, 1380=>600, + 1381=>600, 1382=>600, 1383=>600, 1384=>600, 1385=>600, 1386=>600, 1387=>600, 1388=>600, 1389=>600, 1390=>600, 1391=>600, 1392=>600, 1393=>600, 1394=>600, 1395=>600, 1396=>600, + 1397=>600, 1398=>600, 1399=>600, 1400=>600, 1401=>600, 1402=>600, 1403=>600, 1404=>600, 1405=>600, 1406=>600, 1407=>600, 1408=>600, 1409=>600, 1410=>600, 1411=>600, 1412=>600, + 1413=>600, 1414=>600, 1418=>600, 1456=>600, 1457=>600, 1458=>600, 1459=>600, 1460=>600, 1461=>600, 1462=>600, 1463=>600, 1464=>600, 1465=>600, 1467=>600, 1468=>600, 1469=>600, + 1470=>600, 1471=>600, 1472=>600, 1473=>600, 1474=>600, 1475=>600, 1476=>600, 1488=>600, 1489=>600, 1490=>600, 1491=>600, 1492=>600, 1493=>600, 1494=>600, 1495=>600, 1496=>600, + 1497=>600, 1498=>600, 1499=>600, 1500=>600, 1501=>600, 1502=>600, 1503=>600, 1504=>600, 1505=>600, 1506=>600, 1507=>600, 1508=>600, 1509=>600, 1510=>600, 1511=>600, 1512=>600, + 1513=>600, 1514=>600, 1520=>600, 1521=>600, 1522=>600, 1523=>600, 1524=>600, 5792=>600, 5793=>600, 5794=>600, 5795=>600, 5796=>600, 5797=>600, 5798=>600, 5799=>600, 5800=>600, + 5801=>600, 5802=>600, 5803=>600, 5804=>600, 5805=>600, 5806=>600, 5807=>600, 5808=>600, 5809=>600, 5810=>600, 5811=>600, 5812=>600, 5813=>600, 5814=>600, 5815=>600, 5816=>600, + 5817=>600, 5818=>600, 5819=>600, 5820=>600, 5821=>600, 5822=>600, 5823=>600, 5824=>600, 5825=>600, 5826=>600, 5827=>600, 5828=>600, 5829=>600, 5830=>600, 5831=>600, 5832=>600, + 5833=>600, 5834=>600, 5835=>600, 5836=>600, 5837=>600, 5838=>600, 5839=>600, 5840=>600, 5841=>600, 5842=>600, 5843=>600, 5844=>600, 5845=>600, 5846=>600, 5847=>600, 5848=>600, + 5849=>600, 5850=>600, 5851=>600, 5852=>600, 5853=>600, 5854=>600, 5855=>600, 5856=>600, 5857=>600, 5858=>600, 5859=>600, 5860=>600, 5861=>600, 5862=>600, 5863=>600, 5864=>600, + 5865=>600, 5866=>600, 5867=>600, 5868=>600, 5869=>600, 5870=>600, 5871=>600, 5872=>600, 7680=>600, 7681=>600, 7682=>600, 7683=>600, 7684=>600, 7685=>600, 7686=>600, 7687=>600, + 7688=>600, 7689=>600, 7690=>600, 7691=>600, 7692=>600, 7693=>600, 7694=>600, 7695=>600, 7696=>600, 7697=>600, 7698=>600, 7699=>600, 7700=>600, 7701=>600, 7702=>600, 7703=>600, + 7704=>600, 7705=>600, 7706=>600, 7707=>600, 7708=>600, 7709=>600, 7710=>600, 7711=>600, 7712=>600, 7713=>600, 7714=>600, 7715=>600, 7716=>600, 7717=>600, 7718=>600, 7719=>600, + 7720=>600, 7721=>600, 7722=>600, 7723=>600, 7724=>600, 7725=>600, 7726=>600, 7727=>600, 7728=>600, 7729=>600, 7730=>600, 7731=>600, 7732=>600, 7733=>600, 7734=>600, 7735=>600, + 7736=>600, 7737=>600, 7738=>600, 7739=>600, 7740=>600, 7741=>600, 7742=>600, 7743=>600, 7744=>600, 7745=>600, 7746=>600, 7747=>600, 7748=>600, 7749=>600, 7750=>600, 7751=>600, + 7752=>600, 7753=>600, 7754=>600, 7755=>600, 7756=>600, 7757=>600, 7758=>600, 7759=>600, 7760=>600, 7761=>600, 7762=>600, 7763=>600, 7764=>600, 7765=>600, 7766=>600, 7767=>600, + 7768=>600, 7769=>600, 7770=>600, 7771=>600, 7772=>600, 7773=>600, 7774=>600, 7775=>600, 7776=>600, 7777=>600, 7778=>600, 7779=>600, 7780=>600, 7781=>600, 7782=>600, 7783=>600, + 7784=>600, 7785=>600, 7786=>600, 7787=>600, 7788=>600, 7789=>600, 7790=>600, 7791=>600, 7792=>600, 7793=>600, 7794=>600, 7795=>600, 7796=>600, 7797=>600, 7798=>600, 7799=>600, + 7800=>600, 7801=>600, 7802=>600, 7803=>600, 7804=>600, 7805=>600, 7806=>600, 7807=>600, 7808=>600, 7809=>600, 7810=>600, 7811=>600, 7812=>600, 7813=>600, 7814=>600, 7815=>600, + 7816=>600, 7817=>600, 7818=>600, 7819=>600, 7820=>600, 7821=>600, 7822=>600, 7823=>600, 7824=>600, 7825=>600, 7826=>600, 7827=>600, 7828=>600, 7829=>600, 7830=>600, 7831=>600, + 7832=>600, 7833=>600, 7834=>600, 7835=>600, 7840=>600, 7841=>600, 7842=>600, 7843=>600, 7844=>600, 7845=>600, 7846=>600, 7847=>600, 7848=>600, 7849=>600, 7850=>600, 7851=>600, + 7852=>600, 7853=>600, 7854=>600, 7855=>600, 7856=>600, 7857=>600, 7858=>600, 7859=>600, 7860=>600, 7861=>600, 7862=>600, 7863=>600, 7864=>600, 7865=>600, 7866=>600, 7867=>600, + 7868=>600, 7869=>600, 7870=>600, 7871=>600, 7872=>600, 7873=>600, 7874=>600, 7875=>600, 7876=>600, 7877=>600, 7878=>600, 7879=>600, 7880=>600, 7881=>600, 7882=>600, 7883=>600, + 7884=>600, 7885=>600, 7886=>600, 7887=>600, 7888=>600, 7889=>600, 7890=>600, 7891=>600, 7892=>600, 7893=>600, 7894=>600, 7895=>600, 7896=>600, 7897=>600, 7898=>600, 7899=>600, + 7900=>600, 7901=>600, 7902=>600, 7903=>600, 7904=>600, 7905=>600, 7906=>600, 7907=>600, 7908=>600, 7909=>600, 7910=>600, 7911=>600, 7912=>600, 7913=>600, 7914=>600, 7915=>600, + 7916=>600, 7917=>600, 7918=>600, 7919=>600, 7920=>600, 7921=>600, 7922=>600, 7923=>600, 7924=>600, 7925=>600, 7926=>600, 7927=>600, 7928=>600, 7929=>600, 7936=>600, 7937=>600, + 7938=>600, 7939=>600, 7940=>600, 7941=>600, 7942=>600, 7943=>600, 7944=>600, 7945=>600, 7946=>600, 7947=>600, 7948=>600, 7949=>600, 7950=>600, 7951=>600, 7952=>600, 7953=>600, + 7954=>600, 7955=>600, 7956=>600, 7957=>600, 7960=>600, 7961=>600, 7962=>600, 7963=>600, 7964=>600, 7965=>600, 7968=>600, 7969=>600, 7970=>600, 7971=>600, 7972=>600, 7973=>600, + 7974=>600, 7975=>600, 7976=>600, 7977=>600, 7978=>600, 7979=>600, 7980=>600, 7981=>600, 7982=>600, 7983=>600, 7984=>600, 7985=>600, 7986=>600, 7987=>600, 7988=>600, 7989=>600, + 7990=>600, 7991=>600, 7992=>600, 7993=>600, 7994=>600, 7995=>600, 7996=>600, 7997=>600, 7998=>600, 7999=>600, 8000=>600, 8001=>600, 8002=>600, 8003=>600, 8004=>600, 8005=>600, + 8008=>600, 8009=>600, 8010=>600, 8011=>600, 8012=>600, 8013=>600, 8016=>600, 8017=>600, 8018=>600, 8019=>600, 8020=>600, 8021=>600, 8022=>600, 8023=>600, 8025=>600, 8027=>600, + 8029=>600, 8031=>600, 8032=>600, 8033=>600, 8034=>600, 8035=>600, 8036=>600, 8037=>600, 8038=>600, 8039=>600, 8040=>600, 8041=>600, 8042=>600, 8043=>600, 8044=>600, 8045=>600, + 8046=>600, 8047=>600, 8048=>600, 8049=>600, 8050=>600, 8051=>600, 8052=>600, 8053=>600, 8054=>600, 8055=>600, 8056=>600, 8057=>600, 8058=>600, 8059=>600, 8060=>600, 8061=>600, + 8064=>600, 8065=>600, 8066=>600, 8067=>600, 8068=>600, 8069=>600, 8070=>600, 8071=>600, 8072=>600, 8073=>600, 8074=>600, 8075=>600, 8076=>600, 8077=>600, 8078=>600, 8079=>600, + 8080=>600, 8081=>600, 8082=>600, 8083=>600, 8084=>600, 8085=>600, 8086=>600, 8087=>600, 8088=>600, 8089=>600, 8090=>600, 8091=>600, 8092=>600, 8093=>600, 8094=>600, 8095=>600, + 8096=>600, 8097=>600, 8098=>600, 8099=>600, 8100=>600, 8101=>600, 8102=>600, 8103=>600, 8104=>600, 8105=>600, 8106=>600, 8107=>600, 8108=>600, 8109=>600, 8110=>600, 8111=>600, + 8112=>600, 8113=>600, 8114=>600, 8115=>600, 8116=>600, 8118=>600, 8119=>600, 8120=>600, 8121=>600, 8122=>600, 8123=>600, 8124=>600, 8125=>600, 8126=>600, 8127=>600, 8128=>600, + 8129=>600, 8130=>600, 8131=>600, 8132=>600, 8134=>600, 8135=>600, 8136=>600, 8137=>600, 8138=>600, 8139=>600, 8140=>600, 8141=>600, 8142=>600, 8143=>600, 8144=>600, 8145=>600, + 8146=>600, 8147=>600, 8150=>600, 8151=>600, 8152=>600, 8153=>600, 8154=>600, 8155=>600, 8157=>600, 8158=>600, 8159=>600, 8160=>600, 8161=>600, 8162=>600, 8163=>600, 8164=>600, + 8165=>600, 8166=>600, 8167=>600, 8168=>600, 8169=>600, 8170=>600, 8171=>600, 8172=>600, 8173=>600, 8175=>600, 8178=>600, 8179=>600, 8180=>600, 8182=>600, 8183=>600, 8184=>600, + 8185=>600, 8186=>600, 8187=>600, 8188=>600, 8189=>600, 8190=>600, 8208=>600, 8213=>600, 8215=>600, 8219=>600, 8223=>600, 8229=>600, 8241=>600, 8242=>600, 8243=>600, 8244=>600, + 8245=>600, 8246=>600, 8247=>600, 8252=>600, 8253=>600, 8254=>600, 8259=>600, 8260=>600, 8261=>600, 8262=>600, 8264=>600, 8265=>600, 8267=>600, 8304=>600, 8305=>600, 8306=>600, + 8307=>600, 8308=>600, 8309=>600, 8310=>600, 8311=>600, 8312=>600, 8313=>600, 8314=>600, 8315=>600, 8316=>600, 8317=>600, 8318=>600, 8319=>600, 8320=>600, 8321=>600, 8322=>600, + 8323=>600, 8324=>600, 8325=>600, 8326=>600, 8327=>600, 8328=>600, 8329=>600, 8330=>600, 8331=>600, 8332=>600, 8333=>600, 8334=>600, 8355=>600, 8356=>600, 8359=>600, 8362=>600, + 8448=>600, 8449=>600, 8450=>600, 8451=>600, 8453=>600, 8454=>600, 8455=>600, 8461=>600, 8464=>600, 8465=>600, 8466=>600, 8467=>600, 8468=>600, 8469=>600, 8470=>600, 8471=>600, + 8472=>600, 8473=>600, 8474=>600, 8477=>600, 8478=>600, 8484=>600, 8485=>600, 8486=>600, 8487=>600, 8490=>600, 8491=>600, 8498=>600, 8501=>600, 8531=>600, 8532=>600, 8533=>600, + 8534=>600, 8535=>600, 8536=>600, 8537=>600, 8538=>600, 8539=>600, 8540=>600, 8541=>600, 8542=>600, 8543=>600, 8544=>600, 8545=>600, 8546=>600, 8547=>600, 8548=>600, 8549=>600, + 8550=>600, 8551=>600, 8552=>600, 8553=>600, 8554=>600, 8555=>600, 8556=>600, 8557=>600, 8558=>600, 8559=>600, 8592=>600, 8593=>600, 8594=>600, 8595=>600, 8596=>600, 8597=>600, + 8598=>600, 8599=>600, 8600=>600, 8601=>600, 8602=>600, 8603=>600, 8604=>600, 8605=>600, 8606=>600, 8607=>600, 8608=>600, 8609=>600, 8610=>600, 8611=>600, 8612=>600, 8613=>600, + 8614=>600, 8615=>600, 8616=>600, 8617=>600, 8618=>600, 8619=>600, 8620=>600, 8621=>600, 8622=>600, 8623=>600, 8624=>600, 8625=>600, 8626=>600, 8627=>600, 8628=>600, 8629=>600, + 8630=>600, 8631=>600, 8632=>600, 8633=>600, 8634=>600, 8635=>600, 8636=>600, 8637=>600, 8638=>600, 8639=>600, 8640=>600, 8641=>600, 8642=>600, 8643=>600, 8644=>600, 8645=>600, + 8646=>600, 8647=>600, 8648=>600, 8649=>600, 8650=>600, 8651=>600, 8652=>600, 8653=>600, 8654=>600, 8655=>600, 8656=>600, 8657=>600, 8658=>600, 8659=>600, 8660=>600, 8661=>600, + 8704=>600, 8705=>600, 8706=>600, 8707=>600, 8708=>600, 8709=>600, 8710=>600, 8711=>600, 8712=>600, 8713=>600, 8714=>600, 8715=>600, 8716=>600, 8717=>600, 8719=>600, 8721=>600, + 8722=>600, 8723=>600, 8724=>600, 8725=>600, 8729=>600, 8730=>600, 8731=>600, 8732=>600, 8733=>600, 8734=>600, 8735=>600, 8743=>600, 8744=>600, 8745=>600, 8746=>600, 8747=>600, + 8748=>600, 8749=>600, 8750=>600, 8751=>600, 8752=>600, 8756=>600, 8757=>600, 8759=>600, 8764=>600, 8765=>600, 8769=>600, 8770=>600, 8771=>600, 8772=>600, 8773=>600, 8776=>600, + 8784=>600, 8785=>600, 8786=>600, 8787=>600, 8793=>600, 8794=>600, 8800=>600, 8801=>600, 8804=>600, 8805=>600, 8806=>600, 8807=>600, 8810=>600, 8811=>600, 8812=>600, 8814=>600, + 8815=>600, 8822=>600, 8823=>600, 8834=>600, 8835=>600, 8838=>600, 8839=>600, 8853=>600, 8854=>600, 8855=>600, 8856=>600, 8857=>600, 8858=>600, 8859=>600, 8860=>600, 8861=>600, + 8866=>600, 8867=>600, 8868=>600, 8869=>600, 8870=>600, 8871=>600, 8872=>600, 8873=>600, 8874=>600, 8875=>600, 8876=>600, 8877=>600, 8878=>600, 8879=>600, 8894=>600, 8901=>600, + 8902=>600, 8960=>600, 8962=>600, 8963=>600, 8968=>600, 8969=>600, 8970=>600, 8971=>600, 8972=>600, 8973=>600, 8974=>600, 8975=>600, 8976=>600, 8981=>600, 8988=>600, 8989=>600, + 8990=>600, 8991=>600, 9001=>600, 9002=>600, 9115=>600, 9116=>600, 9117=>600, 9118=>600, 9119=>600, 9120=>600, 9121=>600, 9122=>600, 9123=>600, 9124=>600, 9125=>600, 9126=>600, + 9127=>600, 9128=>600, 9129=>600, 9130=>600, 9131=>600, 9132=>600, 9133=>600, 9134=>600, 9135=>600, 9136=>600, 9137=>600, 9138=>600, 9139=>600, 9140=>600, 9143=>600, 9146=>600, + 9147=>600, 9148=>600, 9149=>600, 9472=>600, 9473=>600, 9474=>600, 9475=>600, 9476=>600, 9477=>600, 9478=>600, 9479=>600, 9480=>600, 9481=>600, 9482=>600, 9483=>600, 9484=>600, + 9485=>600, 9486=>600, 9487=>600, 9488=>600, 9489=>600, 9490=>600, 9491=>600, 9492=>600, 9493=>600, 9494=>600, 9495=>600, 9496=>600, 9497=>600, 9498=>600, 9499=>600, 9500=>600, + 9501=>600, 9502=>600, 9503=>600, 9504=>600, 9505=>600, 9506=>600, 9507=>600, 9508=>600, 9509=>600, 9510=>600, 9511=>600, 9512=>600, 9513=>600, 9514=>600, 9515=>600, 9516=>600, + 9517=>600, 9518=>600, 9519=>600, 9520=>600, 9521=>600, 9522=>600, 9523=>600, 9524=>600, 9525=>600, 9526=>600, 9527=>600, 9528=>600, 9529=>600, 9530=>600, 9531=>600, 9532=>600, + 9533=>600, 9534=>600, 9535=>600, 9536=>600, 9537=>600, 9538=>600, 9539=>600, 9540=>600, 9541=>600, 9542=>600, 9543=>600, 9544=>600, 9545=>600, 9546=>600, 9547=>600, 9548=>600, + 9549=>600, 9550=>600, 9551=>600, 9552=>600, 9553=>600, 9554=>600, 9555=>600, 9556=>600, 9557=>600, 9558=>600, 9559=>600, 9560=>600, 9561=>600, 9562=>600, 9563=>600, 9564=>600, + 9565=>600, 9566=>600, 9567=>600, 9568=>600, 9569=>600, 9570=>600, 9571=>600, 9572=>600, 9573=>600, 9574=>600, 9575=>600, 9576=>600, 9577=>600, 9578=>600, 9579=>600, 9580=>600, + 9581=>600, 9582=>600, 9583=>600, 9584=>600, 9585=>600, 9586=>600, 9587=>600, 9588=>600, 9589=>600, 9590=>600, 9591=>600, 9592=>600, 9593=>600, 9594=>600, 9595=>600, 9596=>600, + 9597=>600, 9598=>600, 9599=>600, 9600=>600, 9601=>600, 9602=>600, 9603=>600, 9604=>600, 9605=>600, 9606=>600, 9607=>600, 9608=>600, 9609=>600, 9610=>600, 9611=>600, 9612=>600, + 9613=>600, 9614=>600, 9615=>600, 9616=>600, 9617=>600, 9618=>600, 9619=>600, 9620=>600, 9621=>600, 9622=>600, 9623=>600, 9624=>600, 9625=>600, 9626=>600, 9627=>600, 9628=>600, + 9629=>600, 9630=>600, 9631=>600, 9632=>600, 9633=>600, 9634=>600, 9635=>600, 9636=>600, 9637=>600, 9638=>600, 9639=>600, 9640=>600, 9641=>600, 9642=>600, 9643=>600, 9644=>600, + 9645=>600, 9646=>600, 9647=>600, 9648=>600, 9649=>600, 9650=>600, 9651=>600, 9652=>600, 9653=>600, 9654=>600, 9655=>600, 9656=>600, 9657=>600, 9658=>600, 9659=>600, 9660=>600, + 9661=>600, 9662=>600, 9663=>600, 9664=>600, 9665=>600, 9666=>600, 9667=>600, 9668=>600, 9669=>600, 9670=>600, 9671=>600, 9672=>600, 9673=>600, 9674=>600, 9675=>600, 9676=>600, + 9677=>600, 9678=>600, 9679=>600, 9680=>600, 9681=>600, 9682=>600, 9683=>600, 9684=>600, 9685=>600, 9686=>600, 9687=>600, 9688=>600, 9689=>600, 9690=>600, 9691=>600, 9692=>600, + 9693=>600, 9694=>600, 9695=>600, 9696=>600, 9697=>600, 9698=>600, 9699=>600, 9700=>600, 9701=>600, 9702=>600, 9703=>600, 9704=>600, 9705=>600, 9706=>600, 9707=>600, 9708=>600, + 9709=>600, 9710=>600, 9711=>600, 9712=>600, 9713=>600, 9714=>600, 9715=>600, 9716=>600, 9717=>600, 9718=>600, 9719=>600, 9720=>600, 9721=>600, 9722=>600, 9723=>600, 9724=>600, + 9725=>600, 9726=>600, 9727=>600, 9728=>600, 9729=>600, 9730=>600, 9733=>600, 9734=>600, 9735=>600, 9736=>600, 9737=>600, 9744=>600, 9745=>600, 9746=>600, 9756=>600, 9758=>600, + 9766=>600, 9768=>600, 9769=>600, 9774=>600, 9776=>600, 9777=>600, 9778=>600, 9779=>600, 9780=>600, 9781=>600, 9782=>600, 9783=>600, 9785=>600, 9786=>600, 9787=>600, 9788=>600, + 9791=>600, 9792=>600, 9793=>600, 9794=>600, 9833=>600, 9834=>600, 9835=>600, 9836=>600, 9837=>600, 9838=>600, 9839=>600, 10214=>600, 10215=>600, 10216=>600, 10217=>600, 10218=>600, + 10219=>600, 10240=>600, 10241=>600, 10242=>600, 10243=>600, 10244=>600, 10245=>600, 10246=>600, 10247=>600, 10248=>600, 10249=>600, 10250=>600, 10251=>600, 10252=>600, 10253=>600, 10254=>600, + 10255=>600, 10256=>600, 10257=>600, 10258=>600, 10259=>600, 10260=>600, 10261=>600, 10262=>600, 10263=>600, 10264=>600, 10265=>600, 10266=>600, 10267=>600, 10268=>600, 10269=>600, 10270=>600, + 10271=>600, 10272=>600, 10273=>600, 10274=>600, 10275=>600, 10276=>600, 10277=>600, 10278=>600, 10279=>600, 10280=>600, 10281=>600, 10282=>600, 10283=>600, 10284=>600, 10285=>600, 10286=>600, + 10287=>600, 10288=>600, 10289=>600, 10290=>600, 10291=>600, 10292=>600, 10293=>600, 10294=>600, 10295=>600, 10296=>600, 10297=>600, 10298=>600, 10299=>600, 10300=>600, 10301=>600, 10302=>600, + 10303=>600, 10304=>600, 10305=>600, 10306=>600, 10307=>600, 10308=>600, 10309=>600, 10310=>600, 10311=>600, 10312=>600, 10313=>600, 10314=>600, 10315=>600, 10316=>600, 10317=>600, 10318=>600, + 10319=>600, 10320=>600, 10321=>600, 10322=>600, 10323=>600, 10324=>600, 10325=>600, 10326=>600, 10327=>600, 10328=>600, 10329=>600, 10330=>600, 10331=>600, 10332=>600, 10333=>600, 10334=>600, + 10335=>600, 10336=>600, 10337=>600, 10338=>600, 10339=>600, 10340=>600, 10341=>600, 10342=>600, 10343=>600, 10344=>600, 10345=>600, 10346=>600, 10347=>600, 10348=>600, 10349=>600, 10350=>600, + 10351=>600, 10352=>600, 10353=>600, 10354=>600, 10355=>600, 10356=>600, 10357=>600, 10358=>600, 10359=>600, 10360=>600, 10361=>600, 10362=>600, 10363=>600, 10364=>600, 10365=>600, 10366=>600, + 10367=>600, 10368=>600, 10369=>600, 10370=>600, 10371=>600, 10372=>600, 10373=>600, 10374=>600, 10375=>600, 10376=>600, 10377=>600, 10378=>600, 10379=>600, 10380=>600, 10381=>600, 10382=>600, + 10383=>600, 10384=>600, 10385=>600, 10386=>600, 10387=>600, 10388=>600, 10389=>600, 10390=>600, 10391=>600, 10392=>600, 10393=>600, 10394=>600, 10395=>600, 10396=>600, 10397=>600, 10398=>600, + 10399=>600, 10400=>600, 10401=>600, 10402=>600, 10403=>600, 10404=>600, 10405=>600, 10406=>600, 10407=>600, 10408=>600, 10409=>600, 10410=>600, 10411=>600, 10412=>600, 10413=>600, 10414=>600, + 10415=>600, 10416=>600, 10417=>600, 10418=>600, 10419=>600, 10420=>600, 10421=>600, 10422=>600, 10423=>600, 10424=>600, 10425=>600, 10426=>600, 10427=>600, 10428=>600, 10429=>600, 10430=>600, + 10431=>600, 10432=>600, 10433=>600, 10434=>600, 10435=>600, 10436=>600, 10437=>600, 10438=>600, 10439=>600, 10440=>600, 10441=>600, 10442=>600, 10443=>600, 10444=>600, 10445=>600, 10446=>600, + 10447=>600, 10448=>600, 10449=>600, 10450=>600, 10451=>600, 10452=>600, 10453=>600, 10454=>600, 10455=>600, 10456=>600, 10457=>600, 10458=>600, 10459=>600, 10460=>600, 10461=>600, 10462=>600, + 10463=>600, 10464=>600, 10465=>600, 10466=>600, 10467=>600, 10468=>600, 10469=>600, 10470=>600, 10471=>600, 10472=>600, 10473=>600, 10474=>600, 10475=>600, 10476=>600, 10477=>600, 10478=>600, + 10479=>600, 10480=>600, 10481=>600, 10482=>600, 10483=>600, 10484=>600, 10485=>600, 10486=>600, 10487=>600, 10488=>600, 10489=>600, 10490=>600, 10491=>600, 10492=>600, 10493=>600, 10494=>600, + 10495=>600, 63171=>600, 64256=>600, 64257=>600, 64258=>600, 64261=>600, 64262=>600, 64285=>600, 64286=>600, 64287=>600, 64288=>600, 64289=>600, 64290=>600, 64291=>600, 64292=>600, 64293=>600, + 64294=>600, 64295=>600, 64296=>600, 64297=>600, 64298=>600, 64299=>600, 64300=>600, 64301=>600, 64302=>600, 64303=>600, 64304=>600, 64305=>600, 64306=>600, 64307=>600, 64308=>600, 64309=>600, + 64310=>600, 64312=>600, 64313=>600, 64314=>600, 64315=>600, 64316=>600, 64318=>600, 64320=>600, 64321=>600, 64323=>600, 64324=>600, 64326=>600, 64327=>600, 64328=>600, 64329=>600, 64330=>600, + 64331=>600, 64332=>600, 64333=>600, 64334=>600, 64335=>600, 65533=>600, 8174=>600} + font[:enc]=''; + font[:diff]=''; + font[:file]='FreeMono.z'; + font[:ctg]='FreeMono.ctg.z'; + font[:originalsize]=293572; +end diff --git a/vendor/plugins/rfpdf/lib/fonts/freemonob.rb b/vendor/plugins/rfpdf/lib/fonts/freemonob.rb new file mode 100755 index 00000000..caeb7957 --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/freemonob.rb @@ -0,0 +1,107 @@ +TCPDFFontDescriptor.define('freemonob') do |font| + font[:type]='TrueTypeUnicode'; + font[:name]='FreeMonoBold'; + font[:desc]={'Ascent'=>1155,'Descent'=>-365,'CapHeight'=>1155,'Flags'=>32,'FontBBox'=>'[-656 -365 950 1155]','ItalicAngle'=>0,'StemV'=>120,'MissingWidth'=>600} + font[:up]=-100; + font[:ut]=50; + font[:cw]={ + 13=>333, 32=>600, 33=>600, 34=>600, 35=>600, 36=>600, 37=>600, 38=>600, 39=>600, 40=>600, 41=>600, 42=>600, 43=>600, 44=>600, 45=>600, 46=>600, + 47=>600, 48=>600, 49=>600, 50=>600, 51=>600, 52=>600, 53=>600, 54=>600, 55=>600, 56=>600, 57=>600, 58=>600, 59=>600, 60=>600, 61=>600, 62=>600, + 63=>600, 64=>600, 65=>600, 66=>600, 67=>600, 68=>600, 69=>600, 70=>600, 71=>600, 72=>600, 73=>600, 74=>600, 75=>600, 76=>600, 77=>600, 78=>600, + 79=>600, 80=>600, 81=>600, 82=>600, 83=>600, 84=>600, 85=>600, 86=>600, 87=>600, 88=>600, 89=>600, 90=>600, 91=>600, 92=>600, 93=>600, 94=>600, + 95=>600, 96=>600, 97=>600, 98=>600, 99=>600, 100=>600, 101=>600, 102=>600, 103=>600, 104=>600, 105=>600, 106=>600, 107=>600, 108=>600, 109=>600, 110=>600, + 111=>600, 112=>600, 113=>600, 114=>600, 115=>600, 116=>600, 117=>600, 118=>600, 119=>600, 120=>600, 121=>600, 122=>600, 123=>600, 124=>600, 125=>600, 126=>600, + 8364=>600, 1027=>600, 8218=>600, 402=>600, 8222=>600, 8230=>600, 8224=>600, 8225=>600, 710=>600, 8240=>600, 352=>600, 8249=>600, 338=>600, 1036=>600, 381=>600, 1039=>600, + 8216=>600, 8217=>600, 8220=>600, 8221=>600, 8226=>600, 8211=>600, 8212=>600, 732=>600, 8482=>600, 353=>600, 8250=>600, 339=>600, 1116=>600, 382=>600, 376=>600, 160=>600, + 161=>600, 162=>600, 163=>600, 164=>600, 165=>600, 166=>600, 167=>600, 168=>600, 169=>600, 170=>600, 171=>600, 172=>600, 173=>600, 174=>600, 175=>600, 176=>600, + 177=>600, 178=>600, 179=>600, 180=>600, 181=>600, 182=>600, 183=>600, 184=>600, 185=>600, 186=>600, 187=>600, 188=>600, 189=>600, 190=>600, 191=>600, 192=>600, + 193=>600, 194=>600, 195=>600, 196=>600, 197=>600, 198=>600, 199=>600, 200=>600, 201=>600, 202=>600, 203=>600, 204=>600, 205=>600, 206=>600, 207=>600, 208=>600, + 209=>600, 210=>600, 211=>600, 212=>600, 213=>600, 214=>600, 215=>600, 216=>600, 217=>600, 218=>600, 219=>600, 220=>600, 221=>600, 222=>600, 223=>600, 224=>600, + 225=>600, 226=>600, 227=>600, 228=>600, 229=>600, 230=>600, 231=>600, 232=>600, 233=>600, 234=>600, 235=>600, 236=>600, 237=>600, 238=>600, 239=>600, 240=>600, + 241=>600, 242=>600, 243=>600, 244=>600, 245=>600, 246=>600, 247=>600, 248=>600, 249=>600, 250=>600, 251=>600, 252=>600, 253=>600, 254=>600, 255=>600, 256=>600, + 257=>600, 258=>600, 259=>600, 260=>600, 261=>600, 262=>600, 263=>600, 264=>600, 265=>600, 266=>600, 267=>600, 268=>600, 269=>600, 270=>600, 271=>600, 272=>600, + 273=>600, 274=>600, 275=>600, 276=>600, 277=>600, 278=>600, 279=>600, 280=>600, 281=>600, 282=>600, 283=>600, 284=>600, 285=>600, 286=>600, 287=>600, 288=>600, + 289=>600, 290=>600, 291=>600, 292=>600, 293=>600, 294=>600, 295=>600, 296=>600, 297=>600, 298=>600, 299=>600, 300=>600, 301=>600, 302=>600, 303=>600, 304=>600, + 305=>600, 306=>600, 307=>600, 308=>600, 309=>600, 310=>600, 311=>600, 312=>600, 313=>600, 314=>600, 315=>600, 316=>600, 317=>600, 318=>600, 319=>600, 320=>600, + 321=>600, 322=>600, 323=>600, 324=>600, 325=>600, 326=>600, 327=>600, 328=>600, 329=>600, 330=>600, 331=>600, 332=>600, 333=>600, 334=>600, 335=>600, 336=>600, + 337=>600, 340=>600, 341=>600, 342=>600, 343=>600, 344=>600, 345=>600, 346=>600, 347=>600, 348=>600, 349=>600, 350=>600, 351=>600, 354=>600, 355=>600, 356=>600, + 357=>600, 358=>600, 359=>600, 360=>600, 361=>600, 362=>600, 363=>600, 364=>600, 365=>600, 366=>600, 367=>600, 368=>600, 369=>600, 370=>600, 371=>600, 372=>600, + 373=>600, 374=>600, 375=>600, 377=>600, 378=>600, 379=>600, 380=>600, 383=>600, 384=>600, 385=>600, 386=>600, 387=>600, 390=>600, 391=>600, 392=>600, 393=>600, + 394=>600, 395=>600, 396=>600, 397=>600, 398=>600, 400=>600, 401=>600, 403=>600, 405=>600, 406=>600, 407=>600, 409=>600, 410=>600, 411=>600, 412=>600, 413=>600, + 414=>600, 415=>600, 416=>600, 417=>600, 418=>600, 419=>600, 420=>600, 421=>600, 422=>600, 423=>600, 424=>600, 425=>600, 427=>600, 428=>600, 429=>600, 430=>600, + 431=>600, 432=>600, 435=>600, 436=>600, 437=>600, 438=>600, 439=>600, 440=>600, 443=>600, 448=>600, 449=>600, 451=>600, 455=>600, 456=>600, 457=>600, 459=>600, + 460=>600, 461=>600, 462=>600, 463=>600, 464=>600, 465=>600, 466=>600, 467=>600, 468=>600, 469=>600, 470=>600, 471=>600, 472=>600, 473=>600, 474=>600, 475=>600, + 476=>600, 477=>600, 478=>600, 479=>600, 480=>600, 481=>600, 482=>600, 483=>600, 484=>600, 485=>600, 486=>600, 487=>600, 488=>600, 489=>600, 490=>600, 491=>600, + 492=>600, 493=>600, 494=>600, 496=>600, 500=>600, 501=>600, 502=>600, 504=>600, 505=>600, 506=>600, 507=>600, 508=>600, 509=>600, 510=>600, 511=>600, 512=>600, + 513=>600, 514=>600, 515=>600, 516=>600, 517=>600, 518=>600, 519=>600, 520=>600, 521=>600, 522=>600, 523=>600, 524=>600, 525=>600, 526=>600, 527=>600, 528=>600, + 529=>600, 530=>600, 531=>600, 532=>600, 533=>600, 534=>600, 535=>600, 536=>600, 537=>600, 538=>600, 539=>600, 542=>600, 543=>600, 548=>600, 549=>600, 550=>600, + 551=>600, 552=>600, 553=>600, 554=>600, 555=>600, 556=>600, 557=>600, 558=>600, 559=>600, 560=>600, 561=>600, 562=>600, 563=>600, 592=>600, 593=>600, 594=>600, + 595=>600, 596=>600, 598=>600, 599=>600, 600=>600, 601=>600, 603=>600, 604=>600, 607=>600, 608=>600, 609=>600, 613=>600, 614=>600, 615=>600, 616=>600, 617=>600, + 618=>600, 619=>600, 621=>600, 623=>600, 624=>600, 625=>600, 626=>600, 627=>600, 628=>600, 629=>600, 633=>600, 634=>600, 635=>600, 636=>600, 637=>600, 638=>600, + 639=>600, 640=>600, 641=>600, 642=>600, 643=>600, 644=>600, 645=>600, 647=>600, 648=>600, 649=>600, 652=>600, 653=>600, 654=>600, 656=>600, 660=>600, 661=>600, + 662=>600, 663=>600, 664=>600, 668=>600, 670=>600, 671=>600, 672=>600, 673=>600, 674=>600, 711=>600, 720=>600, 721=>600, 728=>600, 729=>600, 730=>600, 731=>600, + 733=>600, 768=>0, 769=>0, 770=>0, 771=>0, 772=>0, 773=>0, 774=>0, 775=>0, 776=>0, 777=>0, 778=>0, 779=>0, 780=>0, 781=>0, 782=>0, + 783=>0, 784=>0, 785=>0, 795=>0, 801=>0, 802=>0, 807=>0, 808=>0, 823=>0, 884=>600, 885=>600, 890=>600, 894=>600, 900=>600, 901=>600, 902=>600, + 903=>600, 904=>600, 905=>600, 906=>600, 908=>600, 910=>600, 911=>600, 912=>600, 913=>600, 914=>600, 915=>600, 916=>600, 917=>600, 918=>600, 919=>600, 920=>600, + 921=>600, 922=>600, 923=>600, 924=>600, 925=>600, 926=>600, 927=>600, 928=>600, 929=>600, 931=>600, 932=>600, 933=>600, 934=>600, 935=>600, 936=>600, 937=>600, + 938=>600, 939=>600, 940=>600, 941=>600, 942=>600, 943=>600, 944=>600, 945=>600, 946=>600, 947=>600, 948=>600, 949=>600, 950=>600, 951=>600, 952=>600, 953=>600, + 954=>600, 955=>600, 956=>600, 957=>600, 958=>600, 959=>600, 960=>600, 961=>600, 962=>600, 963=>600, 964=>600, 965=>600, 966=>600, 967=>600, 968=>600, 969=>600, + 970=>600, 971=>600, 972=>600, 973=>600, 974=>600, 976=>600, 977=>600, 981=>600, 1009=>600, 1024=>600, 1025=>600, 1026=>600, 1028=>600, 1029=>600, 1030=>600, 1031=>600, + 1032=>600, 1033=>600, 1034=>600, 1035=>600, 1037=>600, 1038=>600, 1040=>600, 1041=>600, 1042=>600, 1043=>600, 1044=>600, 1045=>600, 1046=>600, 1047=>600, 1048=>600, 1049=>600, + 1050=>600, 1051=>600, 1052=>600, 1053=>600, 1054=>600, 1055=>600, 1056=>600, 1057=>600, 1058=>600, 1059=>600, 1060=>600, 1061=>600, 1062=>600, 1063=>600, 1064=>600, 1065=>600, + 1066=>600, 1067=>600, 1068=>600, 1069=>600, 1070=>600, 1071=>600, 1072=>600, 1073=>600, 1074=>600, 1075=>600, 1076=>600, 1077=>600, 1078=>600, 1079=>600, 1080=>600, 1081=>600, + 1082=>600, 1083=>600, 1084=>600, 1085=>600, 1086=>600, 1087=>600, 1088=>600, 1089=>600, 1090=>600, 1091=>600, 1092=>600, 1093=>600, 1094=>600, 1095=>600, 1096=>600, 1097=>600, + 1098=>600, 1099=>600, 1100=>600, 1101=>600, 1102=>600, 1103=>600, 1104=>600, 1105=>600, 1106=>600, 1107=>600, 1108=>600, 1109=>600, 1110=>600, 1111=>600, 1112=>600, 1113=>600, + 1114=>600, 1115=>600, 1117=>600, 1118=>600, 1119=>600, 1164=>600, 1165=>600, 1166=>600, 1167=>600, 1168=>600, 1169=>600, 1170=>600, 1171=>600, 1172=>600, 1173=>600, 1174=>600, + 1175=>600, 1176=>600, 1177=>600, 1178=>600, 1179=>600, 1180=>600, 1181=>600, 1182=>600, 1183=>600, 1184=>600, 1185=>600, 1186=>600, 1187=>600, 1188=>600, 1189=>600, 1190=>600, + 1191=>600, 1192=>600, 1193=>600, 1194=>600, 1195=>600, 1196=>600, 1197=>600, 1198=>600, 1199=>600, 1200=>600, 1201=>600, 1202=>600, 1203=>600, 1204=>600, 1205=>600, 1206=>600, + 1207=>600, 1208=>600, 1209=>600, 1210=>600, 1211=>600, 1212=>600, 1213=>600, 1214=>600, 1215=>600, 1216=>600, 1217=>600, 1218=>600, 1219=>600, 1220=>600, 1221=>600, 1222=>600, + 1223=>600, 1224=>600, 1225=>600, 1226=>600, 1227=>600, 1228=>600, 1229=>600, 1230=>600, 1231=>600, 1232=>600, 1233=>600, 1234=>600, 1235=>600, 1236=>600, 1237=>600, 1238=>600, + 1239=>600, 1240=>600, 1241=>600, 1242=>600, 1243=>600, 1244=>600, 1245=>600, 1246=>600, 1247=>600, 1248=>600, 1249=>600, 1250=>600, 1251=>600, 1252=>600, 1253=>600, 1254=>600, + 1255=>600, 1256=>600, 1257=>600, 1258=>600, 1259=>600, 1260=>600, 1261=>600, 1262=>600, 1263=>600, 1264=>600, 1265=>600, 1266=>600, 1267=>600, 1268=>600, 1269=>600, 1270=>600, + 1271=>600, 1272=>600, 1273=>600, 1456=>600, 1457=>600, 1458=>600, 1459=>600, 1460=>600, 1461=>600, 1462=>600, 1463=>600, 1464=>600, 1465=>600, 1467=>600, 1468=>600, 1469=>600, + 1470=>600, 1471=>600, 1472=>600, 1473=>600, 1474=>600, 1475=>600, 1476=>600, 1488=>600, 1489=>600, 1490=>600, 1491=>600, 1492=>600, 1493=>600, 1494=>600, 1495=>600, 1496=>600, + 1497=>600, 1498=>600, 1499=>600, 1500=>600, 1501=>600, 1502=>600, 1503=>600, 1504=>600, 1505=>600, 1506=>600, 1507=>600, 1508=>600, 1509=>600, 1510=>600, 1511=>600, 1512=>600, + 1513=>600, 1514=>600, 1520=>600, 1521=>600, 1522=>600, 1523=>600, 1524=>600, 7680=>600, 7681=>600, 7682=>600, 7683=>600, 7684=>600, 7685=>600, 7686=>600, 7687=>600, 7688=>600, + 7689=>600, 7690=>600, 7691=>600, 7692=>600, 7693=>600, 7694=>600, 7695=>600, 7696=>600, 7697=>600, 7698=>600, 7699=>600, 7700=>600, 7701=>600, 7702=>600, 7703=>600, 7704=>600, + 7705=>600, 7706=>600, 7707=>600, 7708=>600, 7709=>600, 7710=>600, 7711=>600, 7712=>600, 7713=>600, 7714=>600, 7715=>600, 7716=>600, 7717=>600, 7718=>600, 7719=>600, 7720=>600, + 7721=>600, 7722=>600, 7723=>600, 7724=>600, 7725=>600, 7726=>600, 7727=>600, 7728=>600, 7729=>600, 7730=>600, 7731=>600, 7732=>600, 7733=>600, 7734=>600, 7735=>600, 7736=>600, + 7737=>600, 7738=>600, 7739=>600, 7740=>600, 7741=>600, 7742=>600, 7743=>600, 7744=>600, 7745=>600, 7746=>600, 7747=>600, 7748=>600, 7749=>600, 7750=>600, 7751=>600, 7752=>600, + 7753=>600, 7754=>600, 7755=>600, 7756=>600, 7757=>600, 7758=>600, 7759=>600, 7760=>600, 7761=>600, 7762=>600, 7763=>600, 7764=>600, 7765=>600, 7766=>600, 7767=>600, 7768=>600, + 7769=>600, 7770=>600, 7771=>600, 7772=>600, 7773=>600, 7774=>600, 7775=>600, 7776=>600, 7777=>600, 7778=>600, 7779=>600, 7780=>600, 7781=>600, 7782=>600, 7783=>600, 7784=>600, + 7785=>600, 7786=>600, 7787=>600, 7788=>600, 7789=>600, 7790=>600, 7791=>600, 7792=>600, 7793=>600, 7794=>600, 7795=>600, 7796=>600, 7797=>600, 7798=>600, 7799=>600, 7800=>600, + 7801=>600, 7802=>600, 7803=>600, 7804=>600, 7805=>600, 7806=>600, 7807=>600, 7808=>600, 7809=>600, 7810=>600, 7811=>600, 7812=>600, 7813=>600, 7814=>600, 7815=>600, 7816=>600, + 7817=>600, 7818=>600, 7819=>600, 7820=>600, 7821=>600, 7822=>600, 7823=>600, 7824=>600, 7825=>600, 7826=>600, 7827=>600, 7828=>600, 7829=>600, 7830=>600, 7831=>600, 7832=>600, + 7833=>600, 7835=>600, 7840=>600, 7841=>600, 7842=>600, 7843=>600, 7844=>600, 7845=>600, 7846=>600, 7847=>600, 7848=>600, 7849=>600, 7850=>600, 7851=>600, 7852=>600, 7853=>600, + 7854=>600, 7855=>600, 7856=>600, 7857=>600, 7858=>600, 7859=>600, 7860=>600, 7861=>600, 7862=>600, 7863=>600, 7864=>600, 7865=>600, 7866=>600, 7867=>600, 7868=>600, 7869=>600, + 7870=>600, 7871=>600, 7872=>600, 7873=>600, 7874=>600, 7875=>600, 7876=>600, 7877=>600, 7878=>600, 7879=>600, 7880=>600, 7881=>600, 7882=>600, 7883=>600, 7884=>600, 7885=>600, + 7886=>600, 7887=>600, 7888=>600, 7889=>600, 7890=>600, 7891=>600, 7892=>600, 7893=>600, 7894=>600, 7895=>600, 7896=>600, 7897=>600, 7898=>600, 7899=>600, 7900=>600, 7901=>600, + 7902=>600, 7903=>600, 7904=>600, 7905=>600, 7906=>600, 7907=>600, 7908=>600, 7909=>600, 7910=>600, 7911=>600, 7912=>600, 7913=>600, 7914=>600, 7915=>600, 7916=>600, 7917=>600, + 7918=>600, 7919=>600, 7920=>600, 7921=>600, 7922=>600, 7923=>600, 7924=>600, 7925=>600, 7926=>600, 7927=>600, 7928=>600, 7929=>600, 8209=>600, 8213=>600, 8219=>600, 8223=>600, + 8242=>600, 8243=>600, 8244=>600, 8245=>600, 8246=>600, 8247=>600, 8252=>600, 8260=>600, 8261=>600, 8262=>600, 8264=>600, 8265=>600, 8267=>600, 8292=>600, 8304=>600, 8305=>600, + 8306=>600, 8307=>600, 8308=>600, 8309=>600, 8310=>600, 8311=>600, 8312=>600, 8313=>600, 8314=>600, 8315=>600, 8316=>600, 8317=>600, 8318=>600, 8319=>600, 8320=>600, 8321=>600, + 8322=>600, 8323=>600, 8324=>600, 8325=>600, 8326=>600, 8327=>600, 8328=>600, 8329=>600, 8355=>600, 8356=>600, 8362=>600, 8466=>600, 8470=>600, 8486=>600, 8487=>600, 8490=>600, + 8491=>600, 8531=>600, 8532=>600, 8533=>600, 8534=>600, 8535=>600, 8536=>600, 8537=>600, 8538=>600, 8539=>600, 8540=>600, 8541=>600, 8542=>600, 8543=>600, 8592=>600, 8593=>600, + 8594=>600, 8595=>600, 8706=>600, 8709=>600, 8710=>600, 8711=>600, 8721=>600, 8722=>600, 8725=>600, 8730=>600, 8733=>600, 8734=>600, 8735=>600, 8800=>600, 8801=>600, 8804=>600, + 8805=>600, 8976=>600, 9472=>600, 9473=>600, 9474=>600, 9475=>600, 9476=>600, 9477=>600, 9478=>600, 9479=>600, 9480=>600, 9481=>600, 9482=>600, 9483=>600, 9484=>600, 9485=>600, + 9486=>600, 9487=>600, 9488=>600, 9489=>600, 9490=>600, 9491=>600, 9492=>600, 9493=>600, 9494=>600, 9495=>600, 9496=>600, 9497=>600, 9498=>600, 9499=>600, 9500=>600, 9501=>600, + 9502=>600, 9503=>600, 9504=>600, 9505=>600, 9506=>600, 9507=>600, 9508=>600, 9509=>600, 9510=>600, 9511=>600, 9512=>600, 9513=>600, 9514=>600, 9515=>600, 9516=>600, 9517=>600, + 9518=>600, 9519=>600, 9520=>600, 9521=>600, 9522=>600, 9523=>600, 9524=>600, 9525=>600, 9526=>600, 9527=>600, 9528=>600, 9529=>600, 9530=>600, 9531=>600, 9532=>600, 9533=>600, + 9534=>600, 9535=>600, 9536=>600, 9537=>600, 9538=>600, 9539=>600, 9540=>600, 9541=>600, 9542=>600, 9543=>600, 9544=>600, 9545=>600, 9546=>600, 9547=>600, 9548=>600, 9549=>600, + 9550=>600, 9551=>600, 9552=>600, 9553=>600, 9554=>600, 9555=>600, 9556=>600, 9557=>600, 9558=>600, 9559=>600, 9560=>600, 9561=>600, 9562=>600, 9563=>600, 9564=>600, 9565=>600, + 9566=>600, 9567=>600, 9568=>600, 9569=>600, 9570=>600, 9571=>600, 9572=>600, 9573=>600, 9574=>600, 9575=>600, 9576=>600, 9577=>600, 9578=>600, 9579=>600, 9580=>600, 9581=>600, + 9582=>600, 9583=>600, 9584=>600, 9585=>600, 9586=>600, 9587=>600, 9588=>600, 9589=>600, 9590=>600, 9591=>600, 9592=>600, 9593=>600, 9594=>600, 9595=>600, 9596=>600, 9597=>600, + 9598=>600, 9599=>600, 9600=>600, 9601=>600, 9602=>600, 9603=>600, 9604=>600, 9605=>600, 9606=>600, 9607=>600, 9608=>600, 9609=>600, 9610=>600, 9611=>600, 9612=>600, 9613=>600, + 9614=>600, 9615=>600, 9616=>600, 9617=>600, 9618=>600, 9619=>600, 9620=>600, 9621=>600, 9632=>600, 9633=>600, 9635=>600, 9636=>600, 9637=>600, 9638=>600, 9639=>600, 9640=>600, + 9641=>600, 9642=>600, 9643=>600, 9644=>600, 9645=>600, 9646=>600, 9647=>600, 9648=>600, 9649=>600, 9650=>600, 9651=>600, 9652=>600, 9653=>600, 9654=>600, 9655=>600, 9656=>600, + 9657=>600, 9658=>600, 9660=>600, 9661=>600, 9662=>600, 9663=>600, 9664=>600, 9665=>600, 9666=>600, 9667=>600, 9668=>600, 9669=>600, 9670=>600, 9671=>600, 9673=>600, 9674=>600, + 9675=>600, 9677=>600, 9679=>600, 9680=>600, 9681=>600, 9682=>600, 9683=>600, 9684=>600, 9685=>600, 9686=>600, 9687=>600, 9688=>600, 9689=>600, 9698=>600, 9699=>600, 9700=>600, + 9701=>600, 9702=>600, 9703=>600, 9704=>600, 9705=>600, 9706=>600, 9707=>600, 9708=>600, 9709=>600, 9710=>600, 9712=>600, 9713=>600, 9714=>600, 9715=>600, 9716=>600, 9717=>600, + 9718=>600, 9719=>600, 9735=>600, 9736=>600, 9737=>600, 9776=>600, 9777=>600, 9778=>600, 9779=>600, 9780=>600, 9781=>600, 9782=>600, 9783=>600, 9785=>600, 9786=>600, 9787=>600, + 9833=>600, 9834=>600, 9835=>600, 9836=>600, 63166=>600, 63171=>600, 64256=>600, 64257=>600, 64258=>600} + font[:enc]=''; + font[:diff]=''; + font[:file]='FreeMonoBold.z'; + font[:ctg]='FreeMonoBold.ctg.z'; + font[:originalsize]=175016; +end diff --git a/vendor/plugins/rfpdf/lib/fonts/freemonobi.rb b/vendor/plugins/rfpdf/lib/fonts/freemonobi.rb new file mode 100755 index 00000000..9909b0d6 --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/freemonobi.rb @@ -0,0 +1,62 @@ +TCPDFFontDescriptor.define('freemonobi') do |font| + font[:type]='TrueTypeUnicode'; + font[:name]='FreeMonoBoldOblique'; + font[:desc]={'Ascent'=>1111,'Descent'=>-278,'CapHeight'=>1111,'Flags'=>96,'FontBBox'=>'[-513 -278 840 1111]','ItalicAngle'=>-12,'StemV'=>120,'MissingWidth'=>600} + font[:up]=-100; + font[:ut]=50; + font[:cw]={ + 13=>333, 32=>600, 33=>600, 34=>600, 35=>600, 36=>600, 37=>600, 38=>600, 39=>600, 40=>600, 41=>600, 42=>600, 43=>600, 44=>600, 45=>600, 46=>600, + 47=>600, 48=>600, 49=>600, 50=>600, 51=>600, 52=>600, 53=>600, 54=>600, 55=>600, 56=>600, 57=>600, 58=>600, 59=>600, 60=>600, 61=>600, 62=>600, + 63=>600, 64=>600, 65=>600, 66=>600, 67=>600, 68=>600, 69=>600, 70=>600, 71=>600, 72=>600, 73=>600, 74=>600, 75=>600, 76=>600, 77=>600, 78=>600, + 79=>600, 80=>600, 81=>600, 82=>600, 83=>600, 84=>600, 85=>600, 86=>600, 87=>600, 88=>600, 89=>600, 90=>600, 91=>600, 92=>600, 93=>600, 94=>600, + 95=>600, 96=>600, 97=>600, 98=>600, 99=>600, 100=>600, 101=>600, 102=>600, 103=>600, 104=>600, 105=>600, 106=>600, 107=>600, 108=>600, 109=>600, 110=>600, + 111=>600, 112=>600, 113=>600, 114=>600, 115=>600, 116=>600, 117=>600, 118=>600, 119=>600, 120=>600, 121=>600, 122=>600, 123=>600, 124=>600, 125=>600, 126=>600, + 8364=>600, 1027=>600, 8218=>600, 402=>600, 8222=>600, 8230=>600, 8224=>600, 8225=>600, 710=>600, 8240=>600, 352=>600, 8249=>600, 338=>600, 1036=>600, 381=>600, 1039=>600, + 8216=>600, 8217=>600, 8220=>600, 8221=>600, 8226=>600, 8211=>600, 8212=>600, 732=>600, 8482=>600, 353=>600, 8250=>600, 339=>600, 1116=>600, 382=>600, 376=>600, 160=>600, + 161=>600, 162=>600, 163=>600, 164=>600, 165=>600, 166=>600, 167=>600, 168=>600, 169=>600, 170=>600, 171=>600, 172=>600, 173=>600, 174=>600, 175=>600, 176=>600, + 177=>600, 178=>600, 179=>600, 180=>600, 181=>600, 182=>600, 183=>600, 184=>600, 185=>600, 186=>600, 187=>600, 188=>600, 189=>600, 190=>600, 191=>600, 192=>600, + 193=>600, 194=>600, 195=>600, 196=>600, 197=>600, 198=>600, 199=>600, 200=>600, 201=>600, 202=>600, 203=>600, 204=>600, 205=>600, 206=>600, 207=>600, 208=>600, + 209=>600, 210=>600, 211=>600, 212=>600, 213=>600, 214=>600, 215=>600, 216=>600, 217=>600, 218=>600, 219=>600, 220=>600, 221=>600, 222=>600, 223=>600, 224=>600, + 225=>600, 226=>600, 227=>600, 228=>600, 229=>600, 230=>600, 231=>600, 232=>600, 233=>600, 234=>600, 235=>600, 236=>600, 237=>600, 238=>600, 239=>600, 240=>600, + 241=>600, 242=>600, 243=>600, 244=>600, 245=>600, 246=>600, 247=>600, 248=>600, 249=>600, 250=>600, 251=>600, 252=>600, 253=>600, 254=>600, 255=>600, 256=>600, + 257=>600, 258=>600, 259=>600, 260=>600, 261=>600, 262=>600, 263=>600, 264=>600, 265=>600, 266=>600, 267=>600, 268=>600, 269=>600, 270=>600, 271=>600, 272=>600, + 273=>600, 274=>600, 275=>600, 276=>600, 277=>600, 278=>600, 279=>600, 280=>600, 281=>600, 282=>600, 283=>600, 284=>600, 285=>600, 286=>600, 287=>600, 288=>600, + 289=>600, 290=>600, 291=>600, 292=>600, 293=>600, 294=>600, 295=>600, 296=>600, 297=>600, 298=>600, 299=>600, 300=>600, 301=>600, 302=>600, 303=>600, 304=>600, + 305=>600, 306=>600, 307=>600, 308=>600, 309=>600, 310=>600, 311=>600, 312=>600, 313=>600, 314=>600, 315=>600, 316=>600, 317=>600, 318=>600, 319=>600, 320=>600, + 321=>600, 322=>600, 323=>600, 324=>600, 325=>600, 326=>600, 327=>600, 328=>600, 329=>600, 330=>600, 331=>600, 332=>600, 333=>600, 334=>600, 335=>600, 336=>600, + 337=>600, 340=>600, 341=>600, 342=>600, 343=>600, 344=>600, 345=>600, 346=>600, 347=>600, 348=>600, 349=>600, 350=>600, 351=>600, 354=>600, 355=>600, 356=>600, + 357=>600, 358=>600, 359=>600, 360=>600, 361=>600, 362=>600, 363=>600, 364=>600, 365=>600, 366=>600, 367=>600, 368=>600, 369=>600, 370=>600, 371=>600, 372=>600, + 373=>600, 374=>600, 375=>600, 377=>600, 378=>600, 379=>600, 380=>600, 383=>600, 425=>600, 461=>600, 462=>600, 463=>600, 464=>600, 465=>600, 466=>600, 467=>600, + 468=>600, 469=>600, 470=>600, 471=>600, 472=>600, 473=>600, 474=>600, 475=>600, 476=>600, 477=>600, 478=>600, 479=>600, 482=>600, 483=>600, 486=>600, 487=>600, + 488=>600, 489=>600, 490=>600, 491=>600, 492=>600, 493=>600, 496=>600, 500=>600, 501=>600, 504=>600, 505=>600, 506=>600, 507=>600, 508=>600, 509=>600, 510=>600, + 511=>600, 512=>600, 513=>600, 514=>600, 515=>600, 516=>600, 517=>600, 518=>600, 519=>600, 520=>600, 521=>600, 522=>600, 523=>600, 524=>600, 525=>600, 526=>600, + 527=>600, 528=>600, 529=>600, 530=>600, 531=>600, 532=>600, 533=>600, 534=>600, 535=>600, 536=>600, 537=>600, 538=>600, 539=>600, 593=>600, 617=>600, 711=>600, + 728=>600, 729=>0, 730=>600, 731=>600, 733=>600, 768=>0, 769=>0, 770=>0, 771=>0, 772=>0, 774=>0, 775=>0, 776=>0, 778=>0, 779=>0, 780=>0, + 783=>0, 784=>0, 785=>0, 900=>600, 901=>600, 902=>600, 904=>600, 912=>600, 913=>600, 914=>600, 915=>600, 916=>600, 917=>600, 918=>600, 919=>600, 920=>600, + 921=>600, 922=>600, 923=>600, 924=>600, 925=>600, 926=>600, 927=>600, 928=>600, 929=>600, 931=>600, 932=>600, 933=>600, 934=>600, 935=>600, 936=>600, 937=>600, + 938=>600, 939=>600, 945=>600, 946=>600, 947=>600, 950=>600, 951=>600, 952=>600, 953=>600, 954=>600, 955=>600, 956=>600, 957=>600, 959=>600, 970=>600, 1024=>600, + 1025=>600, 1026=>600, 1028=>600, 1029=>600, 1030=>600, 1031=>600, 1032=>600, 1033=>600, 1034=>600, 1035=>600, 1037=>600, 1038=>600, 1040=>600, 1041=>600, 1042=>600, 1043=>600, + 1044=>600, 1045=>600, 1046=>600, 1047=>600, 1048=>600, 1049=>600, 1050=>600, 1051=>600, 1052=>600, 1053=>600, 1054=>600, 1055=>600, 1056=>600, 1057=>600, 1058=>600, 1059=>600, + 1060=>600, 1061=>600, 1062=>600, 1063=>600, 1064=>600, 1065=>600, 1066=>600, 1067=>600, 1068=>600, 1069=>600, 1070=>600, 1071=>600, 1072=>600, 1073=>600, 1074=>600, 1075=>600, + 1076=>600, 1077=>600, 1078=>600, 1079=>600, 1080=>600, 1081=>600, 1082=>600, 1083=>600, 1084=>600, 1085=>600, 1086=>600, 1087=>600, 1088=>600, 1089=>600, 1090=>600, 1091=>600, + 1092=>600, 1093=>600, 1094=>600, 1095=>600, 1096=>600, 1097=>600, 1098=>600, 1099=>600, 1100=>600, 1101=>600, 1102=>600, 1103=>600, 1104=>600, 1105=>600, 1106=>600, 1107=>600, + 1108=>600, 1109=>600, 1110=>600, 1111=>600, 1112=>600, 1113=>600, 1114=>600, 1115=>600, 1117=>600, 1118=>600, 1119=>600, 1164=>600, 1165=>600, 1166=>600, 1167=>600, 1168=>600, + 1169=>600, 1170=>600, 1171=>600, 1172=>600, 1173=>600, 1174=>600, 1175=>600, 1176=>600, 1177=>600, 1178=>600, 1179=>600, 1180=>600, 1181=>600, 1182=>600, 1183=>600, 1184=>600, + 1185=>600, 1186=>600, 1187=>600, 1188=>600, 1189=>600, 1190=>600, 1191=>600, 1192=>600, 1193=>600, 1194=>600, 1195=>600, 1196=>600, 1197=>600, 1198=>600, 1199=>600, 1200=>600, + 1201=>600, 1202=>600, 1203=>600, 1204=>600, 1205=>600, 1206=>600, 1207=>600, 1208=>600, 1209=>600, 1210=>600, 1211=>600, 1212=>600, 1213=>600, 1214=>600, 1215=>600, 1216=>600, + 1217=>600, 1218=>600, 1219=>600, 1220=>600, 1223=>600, 1224=>600, 1227=>600, 1228=>600, 1232=>600, 1233=>600, 1234=>600, 1235=>600, 1236=>600, 1237=>600, 1238=>600, 1239=>600, + 1240=>600, 1241=>600, 1242=>600, 1243=>600, 1244=>600, 1245=>600, 1246=>600, 1247=>600, 1248=>600, 1249=>600, 1250=>600, 1251=>600, 1252=>600, 1253=>600, 1254=>600, 1255=>600, + 1256=>600, 1257=>600, 1258=>600, 1259=>600, 1260=>600, 1261=>600, 1262=>600, 1263=>600, 1264=>600, 1265=>600, 1266=>600, 1267=>600, 1268=>600, 1269=>600, 1272=>600, 1273=>600, + 1456=>600, 1457=>600, 1458=>600, 1459=>600, 1460=>600, 1461=>600, 1462=>600, 1463=>600, 1464=>600, 1465=>600, 1467=>600, 1468=>600, 1469=>600, 1470=>600, 1471=>600, 1472=>600, + 1473=>600, 1474=>600, 1475=>600, 1476=>600, 1488=>600, 1489=>600, 1490=>600, 1491=>600, 1492=>600, 1493=>600, 1494=>600, 1495=>600, 1496=>600, 1497=>600, 1498=>600, 1499=>600, + 1500=>600, 1501=>600, 1502=>600, 1503=>600, 1504=>600, 1505=>600, 1506=>600, 1507=>600, 1508=>600, 1509=>600, 1510=>600, 1511=>600, 1512=>600, 1513=>600, 1514=>600, 1520=>600, + 1521=>600, 1522=>600, 1523=>600, 1524=>600, 8213=>600, 8260=>600, 8304=>600, 8305=>600, 8306=>600, 8307=>600, 8308=>600, 8309=>600, 8310=>600, 8311=>600, 8312=>600, 8313=>600, + 8320=>600, 8321=>600, 8322=>600, 8323=>600, 8324=>600, 8325=>600, 8326=>600, 8327=>600, 8328=>600, 8329=>600, 8362=>600, 8470=>600, 8486=>600, 8531=>600, 8532=>600, 8533=>600, + 8534=>600, 8535=>600, 8536=>600, 8537=>600, 8538=>600, 8539=>600, 8540=>600, 8541=>600, 8542=>600, 8543=>600, 8592=>600, 8593=>600, 8594=>600, 8595=>600, 8706=>600, 8710=>600, + 8721=>600, 8722=>600, 8730=>600, 8734=>600, 8800=>600, 8804=>600, 8805=>600, 9674=>600, 9833=>600, 9834=>600, 9835=>600, 9836=>600, 63166=>600, 63171=>600, 64257=>600, 64258=>600} + font[:enc]=''; + font[:diff]=''; + font[:file]='FreeMonoBoldOblique.z'; + font[:ctg]='FreeMonoBoldOblique.ctg.z'; + font[:originalsize]=128384; +end diff --git a/vendor/plugins/rfpdf/lib/fonts/freemonoi.rb b/vendor/plugins/rfpdf/lib/fonts/freemonoi.rb new file mode 100755 index 00000000..5cb6baa2 --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/freemonoi.rb @@ -0,0 +1,89 @@ +TCPDFFontDescriptor.define('freemonoi') do |font| + font[:type]='TrueTypeUnicode'; + font[:name]='FreeMonoOblique'; + font[:desc]={'Ascent'=>1000,'Descent'=>-273,'CapHeight'=>1000,'Flags'=>96,'FontBBox'=>'[-577 -273 779 1000]','ItalicAngle'=>-12,'StemV'=>70,'MissingWidth'=>600} + font[:up]=-100; + font[:ut]=50; + font[:cw]={ + 13=>333, 32=>600, 33=>600, 34=>600, 35=>600, 36=>600, 37=>600, 38=>600, 39=>600, 40=>600, 41=>600, 42=>600, 43=>600, 44=>600, 45=>600, 46=>600, + 47=>600, 48=>600, 49=>600, 50=>600, 51=>600, 52=>600, 53=>600, 54=>600, 55=>600, 56=>600, 57=>600, 58=>600, 59=>600, 60=>600, 61=>600, 62=>600, + 63=>600, 64=>600, 65=>600, 66=>600, 67=>600, 68=>600, 69=>600, 70=>600, 71=>600, 72=>600, 73=>600, 74=>600, 75=>600, 76=>600, 77=>600, 78=>600, + 79=>600, 80=>600, 81=>600, 82=>600, 83=>600, 84=>600, 85=>600, 86=>600, 87=>600, 88=>600, 89=>600, 90=>600, 91=>600, 92=>600, 93=>600, 94=>600, + 95=>600, 96=>600, 97=>600, 98=>600, 99=>600, 100=>600, 101=>600, 102=>600, 103=>600, 104=>600, 105=>600, 106=>600, 107=>600, 108=>600, 109=>600, 110=>600, + 111=>600, 112=>600, 113=>600, 114=>600, 115=>600, 116=>600, 117=>600, 118=>600, 119=>600, 120=>600, 121=>600, 122=>600, 123=>600, 124=>600, 125=>600, 126=>600, + 8364=>600, 1027=>600, 8218=>600, 402=>600, 8222=>600, 8230=>600, 8224=>600, 8225=>600, 710=>600, 8240=>600, 352=>600, 8249=>600, 338=>600, 1036=>600, 381=>600, 1039=>600, + 8216=>600, 8217=>600, 8220=>600, 8221=>600, 8226=>600, 8211=>600, 8212=>600, 732=>600, 8482=>600, 353=>600, 8250=>600, 339=>600, 1116=>600, 382=>600, 376=>600, 160=>600, + 161=>600, 162=>600, 163=>600, 164=>600, 165=>600, 166=>600, 167=>600, 168=>600, 169=>600, 170=>600, 171=>600, 172=>600, 173=>600, 174=>600, 175=>600, 176=>600, + 177=>600, 178=>600, 179=>600, 180=>600, 181=>600, 182=>600, 183=>600, 184=>600, 185=>600, 186=>600, 187=>600, 188=>600, 189=>600, 190=>600, 191=>600, 192=>600, + 193=>600, 194=>600, 195=>600, 196=>600, 197=>600, 198=>600, 199=>600, 200=>600, 201=>600, 202=>600, 203=>600, 204=>600, 205=>600, 206=>600, 207=>600, 208=>600, + 209=>600, 210=>600, 211=>600, 212=>600, 213=>600, 214=>600, 215=>600, 216=>600, 217=>600, 218=>600, 219=>600, 220=>600, 221=>600, 222=>600, 223=>600, 224=>600, + 225=>600, 226=>600, 227=>600, 228=>600, 229=>600, 230=>600, 231=>600, 232=>600, 233=>600, 234=>600, 235=>600, 236=>600, 237=>600, 238=>600, 239=>600, 240=>600, + 241=>600, 242=>600, 243=>600, 244=>600, 245=>600, 246=>600, 247=>600, 248=>600, 249=>600, 250=>600, 251=>600, 252=>600, 253=>600, 254=>600, 255=>600, 256=>600, + 257=>600, 258=>600, 259=>600, 260=>600, 261=>600, 262=>600, 263=>600, 264=>600, 265=>600, 266=>600, 267=>600, 268=>600, 269=>600, 270=>600, 271=>600, 272=>600, + 273=>600, 274=>600, 275=>600, 276=>600, 277=>600, 278=>600, 279=>600, 280=>600, 281=>600, 282=>600, 283=>600, 284=>600, 285=>600, 286=>600, 287=>600, 288=>600, + 289=>600, 290=>600, 291=>600, 292=>600, 293=>600, 294=>600, 295=>600, 296=>600, 297=>600, 298=>600, 299=>600, 300=>600, 301=>600, 302=>600, 303=>600, 304=>600, + 305=>600, 306=>600, 307=>600, 308=>600, 309=>600, 310=>600, 311=>600, 312=>600, 313=>600, 314=>600, 315=>600, 316=>600, 317=>600, 318=>600, 319=>600, 320=>600, + 321=>600, 322=>600, 323=>600, 324=>600, 325=>600, 326=>600, 327=>600, 328=>600, 329=>600, 330=>600, 331=>600, 332=>600, 333=>600, 334=>600, 335=>600, 336=>600, + 337=>600, 340=>600, 341=>600, 342=>600, 343=>600, 344=>600, 345=>600, 346=>600, 347=>600, 348=>600, 349=>600, 350=>600, 351=>600, 354=>600, 355=>600, 356=>600, + 357=>600, 358=>600, 359=>600, 360=>600, 361=>600, 362=>600, 363=>600, 364=>600, 365=>600, 366=>600, 367=>600, 368=>600, 369=>600, 370=>600, 371=>600, 372=>600, + 373=>600, 374=>600, 375=>600, 377=>600, 378=>600, 379=>600, 380=>600, 383=>600, 384=>600, 385=>600, 386=>600, 387=>600, 388=>600, 389=>600, 390=>600, 391=>600, + 392=>600, 393=>600, 394=>600, 395=>600, 396=>600, 397=>600, 398=>600, 399=>600, 400=>600, 401=>600, 403=>600, 404=>600, 405=>600, 406=>600, 407=>600, 408=>600, + 409=>600, 410=>600, 411=>600, 412=>600, 413=>600, 414=>600, 415=>600, 416=>600, 417=>600, 418=>600, 419=>600, 420=>600, 421=>600, 422=>600, 423=>600, 424=>600, + 425=>600, 426=>600, 427=>600, 428=>600, 429=>600, 430=>600, 431=>600, 432=>600, 433=>600, 434=>600, 435=>600, 436=>600, 437=>600, 438=>600, 439=>600, 440=>600, + 441=>600, 442=>600, 443=>600, 444=>600, 445=>600, 446=>600, 448=>600, 449=>600, 450=>600, 451=>600, 452=>600, 453=>600, 454=>600, 455=>600, 456=>600, 457=>600, + 458=>600, 459=>600, 460=>600, 461=>600, 462=>600, 463=>600, 464=>600, 465=>600, 466=>600, 467=>600, 468=>600, 469=>600, 470=>600, 471=>600, 472=>600, 473=>600, + 474=>600, 475=>600, 476=>600, 477=>600, 478=>600, 479=>600, 480=>600, 481=>600, 482=>600, 483=>600, 484=>600, 485=>600, 486=>600, 487=>600, 488=>600, 489=>600, + 490=>600, 491=>600, 492=>600, 493=>600, 494=>600, 495=>600, 496=>600, 497=>600, 498=>600, 499=>600, 500=>600, 501=>600, 502=>600, 504=>600, 505=>600, 506=>600, + 507=>600, 508=>600, 509=>600, 510=>600, 511=>600, 512=>600, 513=>600, 514=>600, 515=>600, 516=>600, 517=>600, 518=>600, 519=>600, 520=>600, 521=>600, 522=>600, + 523=>600, 524=>600, 525=>600, 526=>600, 527=>600, 528=>600, 529=>600, 530=>600, 531=>600, 532=>600, 533=>600, 534=>600, 535=>600, 536=>600, 537=>600, 538=>600, + 539=>600, 542=>600, 543=>600, 548=>600, 549=>600, 550=>600, 551=>600, 552=>600, 553=>600, 554=>600, 555=>600, 556=>600, 557=>600, 558=>600, 559=>600, 560=>600, + 561=>600, 562=>600, 563=>600, 592=>600, 593=>600, 594=>600, 595=>600, 596=>600, 597=>600, 598=>600, 599=>600, 600=>600, 601=>600, 602=>600, 603=>600, 604=>600, + 605=>600, 606=>600, 607=>600, 608=>600, 609=>600, 610=>600, 611=>600, 612=>600, 613=>600, 614=>600, 615=>600, 616=>600, 617=>600, 618=>600, 619=>600, 620=>600, + 621=>600, 622=>600, 623=>600, 624=>600, 625=>600, 626=>600, 627=>600, 628=>600, 629=>600, 630=>600, 631=>600, 632=>600, 633=>600, 634=>600, 635=>600, 636=>600, + 637=>600, 638=>600, 639=>600, 640=>600, 641=>600, 642=>600, 643=>600, 644=>600, 645=>600, 646=>600, 647=>600, 648=>600, 649=>600, 650=>600, 651=>600, 652=>600, + 653=>600, 654=>600, 655=>600, 656=>600, 657=>600, 658=>600, 659=>600, 660=>600, 661=>600, 662=>600, 663=>600, 664=>600, 665=>600, 666=>600, 667=>600, 668=>600, + 669=>600, 670=>600, 671=>600, 672=>600, 673=>600, 674=>600, 711=>600, 712=>600, 713=>600, 714=>600, 715=>600, 728=>600, 729=>600, 730=>600, 731=>600, 733=>600, + 768=>0, 769=>0, 770=>0, 771=>0, 772=>0, 773=>0, 774=>0, 775=>0, 776=>0, 777=>0, 778=>0, 779=>0, 780=>0, 781=>0, 782=>0, 783=>0, + 807=>0, 808=>0, 821=>0, 822=>0, 823=>0, 824=>0, 901=>600, 902=>600, 904=>600, 905=>600, 906=>600, 908=>600, 910=>600, 911=>600, 912=>600, 913=>600, + 914=>600, 915=>600, 916=>600, 917=>600, 918=>600, 919=>600, 920=>600, 921=>600, 922=>600, 923=>600, 924=>600, 925=>600, 926=>600, 927=>600, 928=>600, 929=>600, + 931=>600, 932=>600, 933=>600, 934=>600, 935=>600, 936=>600, 937=>600, 938=>600, 939=>600, 940=>600, 941=>600, 942=>600, 943=>600, 944=>600, 945=>600, 946=>600, + 947=>600, 948=>600, 949=>600, 950=>600, 951=>600, 952=>600, 953=>600, 954=>600, 955=>600, 956=>600, 957=>600, 958=>600, 959=>600, 960=>600, 961=>600, 962=>600, + 963=>600, 964=>600, 965=>600, 966=>600, 967=>600, 968=>600, 969=>600, 970=>600, 971=>600, 972=>600, 973=>600, 974=>600, 1024=>600, 1025=>600, 1026=>600, 1028=>600, + 1029=>600, 1030=>600, 1031=>600, 1032=>600, 1033=>600, 1034=>600, 1035=>600, 1037=>600, 1038=>600, 1040=>600, 1041=>600, 1042=>600, 1043=>600, 1044=>600, 1045=>600, 1046=>600, + 1047=>600, 1048=>600, 1049=>600, 1050=>600, 1051=>600, 1052=>600, 1053=>600, 1054=>600, 1055=>600, 1056=>600, 1057=>600, 1058=>600, 1059=>600, 1060=>600, 1061=>600, 1062=>600, + 1063=>600, 1064=>600, 1065=>600, 1066=>600, 1067=>600, 1068=>600, 1069=>600, 1070=>600, 1071=>600, 1072=>600, 1073=>600, 1074=>600, 1075=>600, 1076=>600, 1077=>600, 1078=>600, + 1079=>600, 1080=>600, 1081=>600, 1082=>600, 1083=>600, 1084=>600, 1085=>600, 1086=>600, 1087=>600, 1088=>600, 1089=>600, 1090=>600, 1091=>600, 1092=>600, 1093=>600, 1094=>600, + 1095=>600, 1096=>600, 1097=>600, 1098=>600, 1099=>600, 1100=>600, 1101=>600, 1102=>600, 1103=>600, 1104=>600, 1105=>600, 1106=>600, 1107=>600, 1108=>600, 1109=>600, 1110=>600, + 1111=>600, 1112=>600, 1113=>600, 1114=>600, 1115=>600, 1117=>600, 1118=>600, 1119=>600, 1164=>600, 1165=>600, 1166=>600, 1167=>600, 1168=>600, 1169=>600, 1170=>600, 1171=>600, + 1172=>600, 1173=>600, 1174=>600, 1175=>600, 1176=>600, 1177=>600, 1178=>600, 1179=>600, 1180=>600, 1181=>600, 1182=>600, 1183=>600, 1184=>600, 1185=>600, 1186=>600, 1187=>600, + 1188=>600, 1189=>600, 1190=>600, 1191=>600, 1192=>600, 1193=>600, 1194=>600, 1195=>600, 1196=>600, 1197=>600, 1198=>600, 1199=>600, 1200=>600, 1201=>600, 1202=>600, 1203=>600, + 1204=>600, 1205=>600, 1206=>600, 1207=>600, 1208=>600, 1209=>600, 1210=>600, 1211=>600, 1212=>600, 1213=>600, 1214=>600, 1215=>600, 1216=>600, 1217=>600, 1218=>600, 1219=>600, + 1220=>600, 1223=>600, 1224=>600, 1227=>600, 1228=>600, 1232=>600, 1233=>600, 1234=>600, 1235=>600, 1236=>600, 1237=>600, 1238=>600, 1239=>600, 1240=>600, 1241=>600, 1242=>600, + 1243=>600, 1244=>600, 1245=>600, 1246=>600, 1247=>600, 1248=>600, 1249=>600, 1250=>600, 1251=>600, 1252=>600, 1253=>600, 1254=>600, 1255=>600, 1256=>600, 1257=>600, 1258=>600, + 1259=>600, 1260=>600, 1261=>600, 1262=>600, 1263=>600, 1264=>600, 1265=>600, 1266=>600, 1267=>600, 1268=>600, 1269=>600, 1272=>600, 1273=>600, 1328=>600, 1329=>600, 1330=>600, + 1331=>600, 1332=>600, 1333=>600, 1334=>600, 1335=>600, 1336=>600, 1337=>600, 1338=>600, 1339=>600, 1340=>600, 1341=>600, 1342=>600, 1343=>600, 1344=>600, 1345=>600, 1346=>600, + 1347=>600, 1348=>600, 1349=>600, 1350=>600, 1351=>600, 1352=>600, 1353=>600, 1354=>600, 1355=>600, 1356=>600, 1357=>600, 1358=>600, 1359=>600, 1360=>600, 1361=>600, 1362=>600, + 1363=>600, 1364=>600, 1365=>600, 1366=>600, 1367=>600, 1368=>600, 1369=>600, 1370=>600, 1371=>600, 1372=>600, 1373=>600, 1374=>600, 1375=>600, 1376=>600, 1377=>600, 1378=>600, + 1379=>600, 1380=>600, 1381=>600, 1382=>600, 1383=>600, 1384=>600, 1385=>600, 1386=>600, 1387=>600, 1388=>600, 1389=>600, 1390=>600, 1391=>600, 1392=>600, 1393=>600, 1394=>600, + 1395=>600, 1396=>600, 1397=>600, 1398=>600, 1399=>600, 1400=>600, 1401=>600, 1402=>600, 1403=>600, 1404=>600, 1405=>600, 1406=>600, 1407=>600, 1408=>600, 1409=>600, 1410=>600, + 1411=>600, 1412=>600, 1413=>600, 1414=>600, 1415=>600, 1416=>600, 1417=>600, 1418=>600, 1456=>600, 1457=>600, 1458=>600, 1459=>600, 1460=>600, 1461=>600, 1462=>600, 1463=>600, + 1464=>600, 1465=>600, 1467=>600, 1468=>600, 1469=>600, 1470=>600, 1471=>600, 1472=>600, 1473=>600, 1474=>600, 1475=>600, 1476=>600, 1488=>600, 1489=>600, 1490=>600, 1491=>600, + 1492=>600, 1493=>600, 1494=>600, 1495=>600, 1496=>600, 1497=>600, 1498=>600, 1499=>600, 1500=>600, 1501=>600, 1502=>600, 1503=>600, 1504=>600, 1505=>600, 1506=>600, 1507=>600, + 1508=>600, 1509=>600, 1510=>600, 1511=>600, 1512=>600, 1513=>600, 1514=>600, 1520=>600, 1521=>600, 1522=>600, 1523=>600, 1524=>600, 8213=>600, 8241=>600, 8242=>600, 8243=>600, + 8244=>600, 8245=>600, 8246=>600, 8247=>600, 8252=>600, 8253=>600, 8260=>600, 8261=>600, 8262=>600, 8263=>600, 8264=>600, 8265=>600, 8304=>600, 8305=>600, 8306=>600, 8307=>600, + 8308=>600, 8309=>600, 8310=>600, 8311=>600, 8312=>600, 8313=>600, 8314=>600, 8315=>600, 8316=>600, 8317=>600, 8318=>600, 8319=>600, 8320=>600, 8321=>600, 8322=>600, 8323=>600, + 8324=>600, 8325=>600, 8326=>600, 8327=>600, 8328=>600, 8329=>600, 8356=>600, 8362=>600, 8448=>600, 8449=>600, 8450=>600, 8451=>600, 8452=>600, 8453=>600, 8454=>600, 8455=>600, + 8456=>600, 8457=>600, 8458=>600, 8459=>600, 8460=>600, 8461=>600, 8462=>600, 8463=>600, 8464=>600, 8465=>600, 8466=>600, 8467=>600, 8468=>600, 8469=>600, 8470=>600, 8471=>600, + 8472=>600, 8473=>600, 8474=>600, 8475=>600, 8476=>600, 8477=>600, 8478=>600, 8479=>600, 8484=>600, 8486=>600, 8487=>600, 8490=>600, 8491=>600, 8531=>600, 8532=>600, 8533=>600, + 8534=>600, 8535=>600, 8536=>600, 8537=>600, 8538=>600, 8539=>600, 8540=>600, 8541=>600, 8542=>600, 8543=>600, 8592=>600, 8593=>600, 8594=>600, 8595=>600, 8596=>600, 8597=>600, + 8598=>600, 8599=>600, 8600=>600, 8601=>600, 8616=>600, 8706=>600, 8710=>600, 8721=>600, 8722=>600, 8730=>600, 8734=>600, 8800=>600, 8804=>600, 8805=>600, 9674=>600, 9833=>600, + 9834=>600, 9835=>600, 9836=>600, 9837=>600, 9838=>600, 9839=>600, 63171=>600, 64257=>600, 64258=>600, 64285=>600, 64286=>600, 64287=>600, 64288=>600, 64289=>600, 64290=>600, 64291=>600, + 64292=>600, 64293=>600, 64294=>600, 64295=>600, 64296=>600, 64297=>600, 64298=>600, 64299=>600, 64300=>600, 64301=>600, 64302=>600, 64303=>600, 64304=>600, 64305=>600, 64306=>600, 64307=>600, + 64308=>600, 64309=>600, 64310=>600, 64312=>600, 64313=>600, 64314=>600, 64315=>600, 64316=>600, 64318=>600, 64320=>600, 64321=>600, 64323=>600, 64324=>600, 64326=>600, 64327=>600, 64328=>600, + 64329=>600, 64330=>600, 64331=>600, 64332=>600, 64333=>600, 64334=>600, 64335=>600} + font[:enc]=''; + font[:diff]=''; + font[:file]='FreeMonoOblique.z'; + font[:ctg]='FreeMonoOblique.ctg.z'; + font[:originalsize]=175484; +end diff --git a/vendor/plugins/rfpdf/lib/fonts/freesans.rb b/vendor/plugins/rfpdf/lib/fonts/freesans.rb new file mode 100755 index 00000000..d3568d23 --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/freesans.rb @@ -0,0 +1,149 @@ +TCPDFFontDescriptor.define('freesans') do |font| + font[:type]='TrueTypeUnicode'; + font[:name]='FreeSans'; + font[:desc]={'Ascent'=>1141,'Descent'=>-459,'CapHeight'=>1141,'Flags'=>32,'FontBBox'=>'[-797 -459 1632 1141]','ItalicAngle'=>0,'StemV'=>70,'MissingWidth'=>600} + font[:up]=-151; + font[:ut]=50; + font[:cw]={ + 13=>333, 32=>278, 33=>278, 34=>355, 35=>556, 36=>556, 37=>889, 38=>667, 39=>191, 40=>333, 41=>333, 42=>389, 43=>584, 44=>278, 45=>333, 46=>278, + 47=>278, 48=>556, 49=>556, 50=>556, 51=>556, 52=>556, 53=>556, 54=>556, 55=>556, 56=>556, 57=>556, 58=>278, 59=>278, 60=>584, 61=>584, 62=>584, + 63=>556, 64=>1015, 65=>667, 66=>667, 67=>722, 68=>722, 69=>667, 70=>611, 71=>778, 72=>722, 73=>278, 74=>500, 75=>667, 76=>556, 77=>833, 78=>722, + 79=>778, 80=>667, 81=>778, 82=>722, 83=>667, 84=>611, 85=>722, 86=>667, 87=>944, 88=>667, 89=>667, 90=>611, 91=>278, 92=>278, 93=>278, 94=>469, + 95=>556, 96=>333, 97=>556, 98=>556, 99=>500, 100=>556, 101=>556, 102=>278, 103=>556, 104=>556, 105=>222, 106=>222, 107=>500, 108=>222, 109=>833, 110=>556, + 111=>556, 112=>556, 113=>556, 114=>333, 115=>500, 116=>278, 117=>556, 118=>500, 119=>722, 120=>500, 121=>500, 122=>500, 123=>334, 124=>260, 125=>334, 126=>584, + 8364=>556, 1027=>611, 8218=>222, 402=>556, 8222=>333, 8230=>1000, 8224=>556, 8225=>556, 710=>333, 8240=>1000, 352=>667, 8249=>333, 338=>1000, 1036=>667, 381=>611, 1039=>722, + 8216=>222, 8217=>221, 8220=>333, 8221=>333, 8226=>350, 8211=>556, 8212=>1000, 732=>333, 8482=>1000, 353=>500, 8250=>333, 339=>944, 1116=>500, 382=>500, 376=>667, 160=>278, + 161=>333, 162=>556, 163=>556, 164=>556, 165=>556, 166=>260, 167=>556, 168=>333, 169=>737, 170=>370, 171=>556, 172=>584, 173=>333, 174=>737, 175=>333, 176=>606, + 177=>584, 178=>351, 179=>351, 180=>333, 181=>556, 182=>537, 183=>278, 184=>333, 185=>351, 186=>365, 187=>556, 188=>869, 189=>869, 190=>869, 191=>611, 192=>667, + 193=>667, 194=>667, 195=>667, 196=>667, 197=>667, 198=>1000, 199=>722, 200=>667, 201=>667, 202=>667, 203=>667, 204=>278, 205=>278, 206=>278, 207=>278, 208=>722, + 209=>722, 210=>778, 211=>778, 212=>778, 213=>778, 214=>778, 215=>584, 216=>778, 217=>722, 218=>722, 219=>722, 220=>722, 221=>666, 222=>666, 223=>611, 224=>556, + 225=>556, 226=>556, 227=>556, 228=>556, 229=>556, 230=>889, 231=>500, 232=>556, 233=>556, 234=>556, 235=>556, 236=>278, 237=>278, 238=>278, 239=>278, 240=>556, + 241=>556, 242=>556, 243=>556, 244=>556, 245=>556, 246=>556, 247=>584, 248=>611, 249=>556, 250=>556, 251=>556, 252=>556, 253=>500, 254=>555, 255=>500, 256=>667, + 257=>556, 258=>667, 259=>556, 260=>667, 261=>556, 262=>722, 263=>500, 264=>722, 265=>500, 266=>722, 267=>500, 268=>722, 269=>500, 270=>722, 271=>635, 272=>722, + 273=>556, 274=>667, 275=>556, 276=>667, 277=>556, 278=>667, 279=>556, 280=>667, 281=>556, 282=>667, 283=>556, 284=>778, 285=>556, 286=>778, 287=>556, 288=>778, + 289=>556, 290=>778, 291=>556, 292=>722, 293=>556, 294=>722, 295=>556, 296=>278, 297=>278, 298=>278, 299=>222, 300=>278, 301=>278, 302=>278, 303=>222, 304=>278, + 305=>278, 306=>700, 307=>374, 308=>500, 309=>222, 310=>667, 311=>500, 312=>500, 313=>556, 314=>222, 315=>556, 316=>222, 317=>556, 318=>292, 319=>556, 320=>500, + 321=>556, 322=>222, 323=>722, 324=>556, 325=>722, 326=>556, 327=>722, 328=>556, 329=>556, 330=>722, 331=>556, 332=>778, 333=>556, 334=>778, 335=>556, 336=>778, + 337=>556, 340=>722, 341=>333, 342=>722, 343=>333, 344=>722, 345=>333, 346=>667, 347=>500, 348=>667, 349=>500, 350=>667, 351=>500, 354=>611, 355=>278, 356=>611, + 357=>308, 358=>611, 359=>278, 360=>722, 361=>556, 362=>722, 363=>556, 364=>722, 365=>556, 366=>722, 367=>556, 368=>722, 369=>556, 370=>722, 371=>556, 372=>944, + 373=>722, 374=>667, 375=>500, 377=>611, 378=>500, 379=>611, 380=>500, 383=>278, 384=>556, 386=>667, 387=>556, 388=>667, 389=>556, 390=>722, 391=>722, 392=>500, + 393=>722, 395=>667, 396=>556, 398=>667, 399=>778, 400=>667, 401=>611, 403=>778, 409=>500, 413=>722, 414=>556, 415=>778, 421=>556, 423=>667, 424=>500, 425=>611, + 427=>278, 429=>278, 430=>611, 452=>1311, 453=>1208, 454=>1056, 455=>1056, 456=>778, 457=>444, 458=>1158, 459=>944, 460=>778, 461=>667, 462=>556, 463=>278, 464=>278, + 465=>778, 466=>556, 467=>722, 468=>556, 469=>722, 470=>556, 471=>722, 472=>556, 473=>722, 474=>556, 475=>722, 476=>556, 477=>556, 478=>667, 479=>556, 480=>667, + 481=>556, 482=>1000, 483=>889, 486=>778, 487=>556, 488=>667, 489=>500, 490=>778, 491=>556, 492=>778, 493=>556, 496=>222, 497=>1333, 498=>1222, 499=>1056, 500=>778, + 501=>556, 504=>722, 505=>556, 506=>667, 507=>556, 508=>1000, 509=>889, 510=>778, 511=>611, 512=>667, 513=>556, 514=>667, 515=>556, 516=>667, 517=>556, 518=>667, + 519=>556, 520=>278, 521=>278, 522=>278, 523=>278, 524=>778, 525=>556, 526=>778, 527=>556, 528=>722, 529=>333, 530=>722, 531=>333, 532=>722, 533=>556, 534=>722, + 535=>556, 536=>667, 537=>500, 538=>611, 539=>278, 542=>722, 543=>556, 550=>667, 551=>556, 552=>667, 553=>556, 554=>778, 555=>556, 556=>778, 557=>556, 558=>778, + 559=>556, 560=>778, 561=>556, 562=>667, 563=>500, 592=>556, 593=>556, 594=>556, 595=>556, 596=>500, 598=>556, 599=>556, 600=>556, 601=>556, 603=>500, 604=>500, + 608=>556, 609=>556, 613=>556, 614=>556, 615=>556, 616=>222, 617=>222, 618=>278, 621=>222, 623=>833, 624=>833, 625=>833, 626=>556, 627=>556, 629=>556, 633=>333, + 634=>333, 635=>333, 636=>333, 637=>333, 638=>278, 639=>278, 642=>500, 643=>278, 644=>278, 645=>278, 647=>278, 648=>278, 649=>556, 652=>500, 653=>722, 654=>500, + 656=>500, 668=>500, 670=>500, 672=>556, 711=>333, 714=>333, 715=>333, 728=>333, 729=>333, 730=>333, 731=>333, 733=>333, 768=>0, 769=>0, 770=>0, 771=>0, + 772=>0, 774=>0, 775=>0, 776=>0, 778=>0, 779=>0, 780=>0, 783=>0, 785=>0, 786=>0, 787=>0, 788=>0, 806=>0, 807=>0, 808=>0, 884=>199, + 885=>199, 890=>332, 894=>278, 900=>414, 901=>747, 902=>730, 903=>278, 904=>664, 905=>681, 906=>230, 908=>792, 910=>710, 911=>758, 912=>286, 913=>684, 914=>628, + 915=>582, 916=>684, 917=>650, 918=>628, 919=>683, 920=>750, 921=>236, 922=>684, 923=>684, 924=>800, 925=>654, 926=>630, 927=>750, 928=>721, 929=>638, 931=>628, + 932=>628, 933=>684, 934=>717, 935=>723, 936=>745, 937=>720, 938=>236, 939=>684, 940=>608, 941=>528, 942=>547, 943=>307, 944=>515, 945=>596, 946=>516, 947=>531, + 948=>560, 949=>510, 950=>462, 951=>526, 952=>526, 953=>286, 954=>516, 955=>560, 956=>574, 957=>504, 958=>470, 959=>550, 960=>661, 961=>566, 962=>535, 963=>616, + 964=>532, 965=>515, 966=>741, 967=>572, 968=>662, 969=>740, 970=>286, 971=>515, 972=>553, 973=>518, 974=>740, 1024=>667, 1025=>667, 1026=>766, 1028=>722, 1029=>667, + 1030=>278, 1031=>278, 1032=>500, 1033=>1080, 1034=>1014, 1035=>766, 1037=>722, 1038=>650, 1040=>667, 1041=>667, 1042=>667, 1043=>611, 1044=>812, 1045=>667, 1046=>1023, 1047=>667, + 1048=>728, 1049=>728, 1050=>667, 1051=>673, 1052=>844, 1053=>719, 1054=>778, 1055=>719, 1056=>667, 1057=>722, 1058=>611, 1059=>650, 1060=>936, 1061=>667, 1062=>741, 1063=>648, + 1064=>828, 1065=>850, 1066=>897, 1067=>872, 1068=>667, 1069=>722, 1070=>1032, 1071=>702, 1072=>556, 1073=>556, 1074=>522, 1075=>430, 1076=>602, 1077=>556, 1078=>837, 1079=>500, + 1080=>567, 1081=>567, 1082=>510, 1083=>557, 1084=>618, 1085=>558, 1086=>556, 1087=>557, 1088=>576, 1089=>500, 1090=>496, 1091=>500, 1092=>912, 1093=>500, 1094=>578, 1095=>520, + 1096=>692, 1097=>712, 1098=>734, 1099=>690, 1100=>552, 1101=>500, 1102=>758, 1103=>543, 1104=>556, 1105=>556, 1106=>568, 1107=>430, 1108=>500, 1109=>500, 1110=>222, 1111=>278, + 1112=>222, 1113=>840, 1114=>850, 1115=>568, 1117=>556, 1118=>500, 1119=>556, 1164=>667, 1165=>552, 1166=>667, 1167=>556, 1168=>611, 1169=>430, 1170=>611, 1171=>430, 1172=>611, + 1173=>430, 1174=>1023, 1175=>837, 1176=>667, 1177=>500, 1178=>667, 1179=>500, 1180=>667, 1181=>500, 1182=>667, 1183=>500, 1184=>667, 1185=>500, 1186=>722, 1187=>556, 1188=>1060, + 1189=>764, 1190=>722, 1191=>556, 1192=>722, 1193=>500, 1194=>722, 1195=>500, 1196=>611, 1197=>496, 1198=>667, 1199=>500, 1200=>667, 1201=>500, 1202=>667, 1203=>500, 1204=>774, + 1205=>608, 1206=>642, 1207=>508, 1208=>642, 1209=>508, 1210=>642, 1211=>508, 1212=>778, 1213=>556, 1214=>688, 1215=>556, 1216=>278, 1217=>1023, 1218=>837, 1219=>667, 1220=>500, + 1223=>722, 1224=>556, 1227=>642, 1228=>508, 1232=>667, 1233=>556, 1234=>667, 1235=>556, 1236=>1000, 1237=>889, 1238=>667, 1239=>556, 1240=>778, 1241=>556, 1242=>778, 1243=>556, + 1244=>1023, 1245=>837, 1246=>667, 1247=>500, 1248=>667, 1249=>500, 1250=>728, 1251=>567, 1252=>728, 1253=>567, 1254=>778, 1255=>556, 1256=>778, 1257=>556, 1258=>778, 1259=>556, + 1260=>722, 1261=>500, 1262=>650, 1263=>500, 1264=>650, 1265=>500, 1266=>650, 1267=>500, 1268=>648, 1269=>520, 1272=>872, 1273=>690, 1329=>722, 1330=>705, 1331=>774, 1332=>754, + 1333=>722, 1334=>751, 1335=>485, 1336=>722, 1337=>782, 1338=>655, 1339=>699, 1340=>417, 1341=>853, 1342=>791, 1343=>711, 1344=>588, 1345=>663, 1346=>665, 1347=>665, 1348=>756, + 1349=>623, 1350=>773, 1351=>603, 1352=>722, 1353=>648, 1354=>722, 1355=>751, 1356=>750, 1357=>722, 1358=>748, 1359=>667, 1360=>699, 1361=>623, 1362=>417, 1363=>785, 1364=>638, + 1365=>778, 1366=>716, 1370=>222, 1371=>133, 1372=>325, 1373=>333, 1374=>344, 1377=>833, 1378=>556, 1379=>572, 1380=>581, 1381=>550, 1382=>588, 1383=>448, 1384=>556, 1385=>568, + 1386=>582, 1387=>545, 1388=>301, 1389=>799, 1390=>556, 1391=>554, 1392=>533, 1393=>548, 1394=>552, 1395=>552, 1396=>544, 1397=>222, 1398=>544, 1399=>456, 1400=>556, 1401=>390, + 1402=>833, 1403=>509, 1404=>547, 1405=>533, 1406=>610, 1407=>887, 1408=>556, 1409=>545, 1410=>352, 1411=>853, 1412=>588, 1413=>579, 1414=>690, 1415=>545, 1417=>278, 1418=>367, + 1456=>70, 1457=>335, 1458=>329, 1459=>329, 1460=>70, 1461=>200, 1462=>200, 1463=>188, 1464=>188, 1465=>70, 1467=>329, 1468=>70, 1469=>70, 1470=>488, 1471=>200, 1472=>212, + 1473=>0, 1474=>0, 1475=>278, 1476=>70, 1488=>640, 1489=>591, 1490=>466, 1491=>598, 1492=>622, 1493=>212, 1494=>351, 1495=>623, 1496=>608, 1497=>200, 1498=>526, 1499=>550, + 1500=>600, 1501=>623, 1502=>621, 1503=>212, 1504=>378, 1505=>607, 1506=>587, 1507=>575, 1508=>568, 1509=>540, 1510=>590, 1511=>606, 1512=>547, 1513=>776, 1514=>687, 1792=>600, + 1793=>201, 1794=>201, 1795=>201, 1796=>201, 1797=>500, 1798=>500, 1799=>500, 1800=>370, 1801=>370, 1802=>574, 1803=>574, 1804=>645, 1805=>574, 1808=>452, 1809=>452, 1810=>574, + 1811=>645, 1812=>645, 1813=>509, 1814=>509, 1815=>682, 1816=>585, 1817=>404, 1818=>627, 1819=>718, 1820=>718, 1821=>484, 1822=>682, 1823=>600, 1824=>660, 1825=>682, 1826=>538, + 1827=>718, 1828=>718, 1829=>718, 1830=>574, 1831=>574, 1832=>638, 1833=>585, 1834=>509, 1835=>682, 1836=>682, 1840=>1, 1841=>1, 1842=>1, 1843=>1, 1844=>1, 1845=>1, + 1846=>1, 1847=>1, 1848=>1, 1849=>1, 1850=>1, 1851=>1, 1852=>1, 1853=>1, 1854=>1, 1855=>1, 1856=>1, 1857=>1, 1858=>1, 1859=>1, 1860=>1, 1861=>1, + 1862=>1, 1863=>1, 1864=>1, 1865=>1, 1866=>1, 2305=>6, 2306=>6, 2309=>644, 2310=>816, 2311=>392, 2312=>392, 2313=>459, 2314=>661, 2315=>641, 2317=>423, 2320=>423, + 2321=>816, 2323=>816, 2324=>816, 2325=>393, 2326=>622, 2327=>424, 2328=>472, 2329=>508, 2330=>517, 2331=>583, 2332=>549, 2333=>503, 2334=>538, 2335=>444, 2336=>480, 2337=>519, + 2338=>479, 2339=>504, 2340=>439, 2341=>542, 2342=>427, 2343=>520, 2344=>415, 2345=>415, 2346=>401, 2347=>401, 2348=>442, 2349=>520, 2350=>463, 2351=>451, 2352=>319, 2353=>319, + 2354=>549, 2355=>641, 2357=>442, 2358=>589, 2359=>398, 2360=>506, 2361=>430, 2364=>6, 2365=>438, 2366=>172, 2367=>172, 2368=>172, 2369=>6, 2370=>6, 2371=>6, 2373=>6, + 2375=>6, 2376=>6, 2377=>172, 2379=>172, 2380=>172, 2381=>6, 2384=>898, 2385=>6, 2406=>584, 2407=>584, 2408=>584, 2409=>584, 2410=>584, 2411=>584, 2412=>584, 2413=>584, + 2414=>584, 2415=>584, 2416=>898, 2433=>300, 2434=>400, 2435=>300, 2437=>640, 2438=>780, 2439=>520, 2440=>520, 2441=>530, 2442=>550, 2443=>620, 2444=>420, 2447=>480, 2448=>620, + 2451=>620, 2452=>720, 2453=>652, 2454=>500, 2455=>490, 2456=>466, 2457=>540, 2458=>490, 2459=>540, 2460=>630, 2461=>590, 2462=>680, 2463=>510, 2464=>490, 2465=>520, 2466=>520, + 2467=>470, 2468=>540, 2469=>490, 2470=>470, 2471=>490, 2472=>452, 2474=>560, 2475=>650, 2476=>480, 2477=>588, 2478=>480, 2479=>470, 2480=>480, 2482=>472, 2486=>512, 2487=>470, + 2488=>470, 2489=>520, 2492=>160, 2494=>180, 2495=>180, 2496=>180, 2497=>320, 2498=>329, 2499=>195, 2500=>260, 2503=>340, 2504=>340, 2507=>740, 2508=>740, 2509=>400, 2519=>180, + 2524=>540, 2525=>520, 2527=>470, 2528=>612, 2529=>420, 2530=>234, 2531=>360, 2534=>460, 2535=>420, 2536=>520, 2537=>540, 2538=>400, 2539=>400, 2540=>560, 2541=>390, 2542=>480, + 2543=>420, 2544=>480, 2545=>470, 2546=>400, 2547=>470, 2548=>400, 2549=>400, 2550=>400, 2551=>120, 2552=>440, 2553=>420, 2554=>420, 2565=>744, 2566=>914, 2567=>690, 2568=>670, + 2569=>596, 2570=>596, 2575=>498, 2576=>744, 2579=>596, 2580=>744, 2581=>550, 2582=>534, 2583=>618, 2584=>690, 2585=>546, 2586=>518, 2587=>592, 2588=>492, 2589=>574, 2590=>514, + 2591=>526, 2592=>556, 2593=>524, 2594=>528, 2595=>574, 2596=>484, 2597=>534, 2598=>504, 2599=>534, 2600=>538, 2602=>534, 2603=>506, 2604=>562, 2605=>516, 2606=>546, 2607=>670, + 2608=>538, 2610=>726, 2611=>726, 2613=>514, 2614=>546, 2616=>546, 2617=>517, 2620=>286, 2622=>172, 2623=>190, 2624=>190, 2625=>1, 2626=>1, 2631=>1, 2632=>1, 2635=>1, + 2636=>1, 2637=>1, 2649=>534, 2650=>618, 2651=>492, 2652=>484, 2654=>506, 2662=>616, 2663=>480, 2664=>560, 2665=>480, 2666=>468, 2667=>492, 2668=>514, 2669=>538, 2670=>572, + 2671=>560, 2672=>1, 2674=>498, 2675=>596, 2676=>900, 2689=>33, 2690=>33, 2693=>767, 2694=>961, 2695=>500, 2696=>495, 2697=>528, 2698=>702, 2699=>885, 2709=>501, 2710=>612, + 2711=>619, 2712=>569, 2713=>532, 2714=>358, 2715=>620, 2716=>606, 2717=>602, 2718=>631, 2719=>495, 2720=>528, 2721=>531, 2722=>511, 2723=>614, 2724=>294, 2725=>344, 2726=>425, + 2727=>345, 2728=>611, 2730=>512, 2731=>578, 2732=>428, 2733=>423, 2734=>231, 2735=>582, 2736=>344, 2738=>558, 2739=>670, 2741=>537, 2742=>592, 2743=>568, 2744=>600, 2745=>544, + 2749=>531, 2750=>232, 2751=>232, 2752=>232, 2753=>33, 2754=>33, 2755=>33, 2759=>33, 2760=>33, 2763=>232, 2764=>232, 2768=>903, 2790=>479, 2791=>416, 2792=>465, 2793=>469, + 2794=>498, 2795=>463, 2796=>451, 2797=>510, 2798=>455, 2799=>488, 2818=>131, 2819=>302, 2821=>560, 2822=>644, 2823=>632, 2825=>630, 2827=>553, 2831=>604, 2835=>520, 2837=>572, + 2838=>570, 2839=>580, 2840=>565, 2842=>580, 2844=>564, 2845=>575, 2847=>565, 2848=>565, 2849=>524, 2858=>572, 2859=>700, 2863=>655, 2864=>620, 2866=>652, 2867=>560, 2870=>565, + 2871=>565, 2872=>545, 2873=>524, 2878=>128, 2879=>1, 2880=>190, 2881=>1, 2882=>1, 2883=>1, 2887=>396, 2912=>563, 2918=>508, 2919=>424, 2920=>440, 2921=>600, 2922=>600, + 2923=>600, 2924=>600, 2925=>600, 2926=>511, 2927=>483, 2946=>479, 2947=>893, 2949=>1018, 2950=>1170, 2951=>916, 2952=>676, 2953=>836, 2954=>1225, 2958=>744, 2959=>744, 2960=>848, + 2962=>813, 2963=>813, 2964=>813, 2965=>688, 2969=>744, 2970=>676, 2972=>848, 2974=>984, 2975=>777, 2979=>1338, 2980=>664, 2984=>561, 2985=>1029, 2986=>607, 2990=>697, 2991=>697, + 2992=>434, 2993=>617, 2994=>869, 2995=>859, 2996=>697, 2997=>869, 2999=>1145, 3000=>1064, 3001=>1316, 3006=>424, 3007=>125, 3008=>596, 3009=>539, 3014=>596, 3015=>650, 3016=>973, + 3018=>1286, 3019=>1286, 3020=>1706, 3021=>333, 3031=>859, 3034=>778, 3035=>881, 3036=>876, 3037=>648, 3041=>744, 3203=>342, 3205=>620, 3206=>591, 3207=>600, 3208=>776, 3209=>1138, + 3210=>1464, 3214=>574, 3215=>570, 3216=>580, 3218=>589, 3219=>597, 3220=>625, 3221=>256, 3222=>565, 3223=>326, 3224=>604, 3225=>651, 3226=>408, 3228=>611, 3230=>843, 3231=>610, + 3232=>258, 3233=>317, 3234=>328, 3235=>803, 3236=>317, 3237=>328, 3238=>352, 3239=>352, 3240=>317, 3248=>248, 3249=>621, 3250=>620, 3251=>620, 3302=>649, 3303=>550, 3304=>573, + 3305=>567, 3306=>562, 3307=>557, 3308=>562, 3309=>567, 3310=>557, 3311=>557, 3458=>468, 3459=>318, 3461=>660, 3465=>778, 3466=>807, 3467=>830, 3473=>838, 3476=>860, 3481=>1000, + 3482=>973, 3483=>860, 3484=>997, 3486=>740, 3488=>838, 3489=>886, 3490=>886, 3492=>1295, 3493=>1295, 3495=>838, 3496=>860, 3497=>860, 3498=>860, 3499=>1403, 3501=>973, 3502=>838, + 3503=>660, 3504=>860, 3505=>973, 3507=>660, 3508=>886, 3509=>838, 3510=>860, 3511=>973, 3512=>838, 3513=>860, 3514=>886, 3515=>807, 3517=>830, 3520=>838, 3521=>973, 3522=>886, + 3523=>886, 3524=>973, 3525=>830, 3526=>973, 3530=>0, 3535=>432, 3536=>380, 3537=>420, 3538=>0, 3539=>0, 3540=>0, 3542=>0, 3544=>501, 3545=>652, 3551=>648, 7936=>596, + 7937=>596, 7938=>596, 7939=>596, 7940=>596, 7941=>596, 7942=>596, 7943=>596, 7944=>684, 7945=>684, 7946=>684, 7947=>684, 7948=>684, 7949=>684, 7950=>684, 7951=>684, 7952=>510, + 7953=>510, 7954=>510, 7955=>510, 7956=>510, 7957=>510, 7960=>650, 7961=>650, 7962=>650, 7963=>650, 7964=>650, 7965=>650, 7968=>526, 7969=>526, 7970=>526, 7971=>526, 7972=>526, + 7973=>526, 7974=>526, 7975=>526, 7976=>683, 7977=>683, 7978=>683, 7979=>683, 7980=>683, 7981=>683, 7982=>683, 7983=>683, 7984=>286, 7985=>286, 7986=>286, 7987=>286, 7988=>286, + 7989=>286, 7990=>286, 7991=>286, 7992=>236, 7993=>236, 7994=>236, 7995=>236, 7996=>236, 7997=>236, 7998=>236, 7999=>236, 8000=>550, 8001=>550, 8002=>550, 8003=>550, 8004=>550, + 8005=>550, 8008=>750, 8009=>750, 8010=>750, 8011=>750, 8012=>750, 8013=>750, 8016=>515, 8017=>515, 8018=>515, 8019=>515, 8020=>515, 8021=>515, 8022=>515, 8023=>515, 8025=>684, + 8027=>684, 8029=>684, 8031=>684, 8032=>740, 8033=>740, 8034=>740, 8035=>740, 8036=>740, 8037=>740, 8038=>740, 8039=>740, 8040=>720, 8041=>720, 8042=>720, 8043=>720, 8044=>720, + 8045=>720, 8046=>720, 8047=>720, 8048=>596, 8049=>596, 8050=>510, 8051=>510, 8052=>526, 8053=>526, 8054=>286, 8055=>286, 8056=>550, 8057=>550, 8058=>515, 8059=>515, 8060=>740, + 8061=>740, 8064=>596, 8065=>596, 8066=>596, 8067=>596, 8068=>596, 8069=>596, 8070=>596, 8071=>596, 8072=>882, 8073=>882, 8074=>882, 8075=>882, 8076=>882, 8077=>882, 8078=>882, + 8079=>882, 8080=>526, 8081=>526, 8082=>526, 8083=>526, 8084=>526, 8085=>526, 8086=>526, 8087=>526, 8088=>857, 8089=>857, 8090=>857, 8091=>857, 8092=>857, 8093=>857, 8094=>857, + 8095=>857, 8096=>740, 8097=>740, 8098=>740, 8099=>740, 8100=>740, 8101=>740, 8102=>740, 8103=>740, 8104=>945, 8105=>945, 8106=>945, 8107=>945, 8108=>945, 8109=>945, 8110=>945, + 8111=>945, 8112=>596, 8113=>596, 8114=>596, 8115=>596, 8116=>596, 8118=>596, 8119=>596, 8120=>684, 8121=>684, 8122=>684, 8123=>684, 8124=>882, 8125=>278, 8126=>201, 8127=>333, + 8128=>278, 8129=>333, 8130=>526, 8131=>526, 8132=>536, 8134=>526, 8135=>526, 8136=>650, 8137=>650, 8138=>683, 8139=>683, 8140=>857, 8141=>582, 8142=>582, 8143=>333, 8144=>286, + 8145=>286, 8146=>286, 8147=>286, 8150=>286, 8151=>312, 8152=>236, 8153=>236, 8154=>236, 8155=>236, 8157=>582, 8158=>582, 8159=>333, 8160=>515, 8161=>515, 8162=>515, 8163=>515, + 8164=>566, 8165=>566, 8166=>515, 8167=>515, 8168=>684, 8169=>684, 8170=>684, 8171=>684, 8172=>638, 8173=>333, 8174=>393, 8175=>333, 8178=>740, 8179=>740, 8180=>740, 8182=>740, + 8183=>740, 8184=>750, 8185=>750, 8186=>720, 8187=>720, 8188=>939, 8189=>333, 8190=>333, 8208=>333, 8219=>221, 8223=>333, 8227=>350, 8241=>1360, 8242=>278, 8243=>469, 8244=>680, + 8245=>278, 8246=>469, 8247=>680, 8251=>622, 8252=>556, 8253=>556, 8260=>167, 8263=>1112, 8264=>834, 8265=>834, 8267=>537, 8304=>351, 8305=>351, 8308=>351, 8309=>351, 8310=>351, + 8311=>351, 8312=>351, 8313=>351, 8320=>351, 8321=>351, 8322=>351, 8323=>351, 8324=>351, 8325=>353, 8326=>351, 8327=>351, 8328=>351, 8329=>351, 8359=>1445, 8360=>1222, 8362=>869, + 8459=>969, 8460=>615, 8464=>809, 8465=>519, 8466=>874, 8470=>1008, 8475=>850, 8476=>644, 8486=>720, 8487=>720, 8488=>512, 8490=>667, 8491=>667, 8492=>908, 8493=>623, 8496=>562, + 8497=>611, 8498=>611, 8499=>1080, 8531=>869, 8532=>869, 8533=>869, 8534=>869, 8535=>869, 8536=>869, 8537=>869, 8538=>869, 8539=>869, 8540=>869, 8541=>869, 8542=>869, 8543=>869, + 8544=>278, 8545=>556, 8546=>834, 8547=>945, 8548=>667, 8549=>945, 8550=>1223, 8551=>1501, 8552=>945, 8553=>667, 8554=>945, 8555=>1223, 8556=>556, 8557=>722, 8558=>722, 8559=>833, + 8560=>222, 8561=>444, 8562=>666, 8563=>722, 8564=>500, 8565=>722, 8566=>944, 8567=>1166, 8568=>722, 8569=>500, 8570=>722, 8571=>944, 8572=>222, 8573=>500, 8574=>556, 8575=>833, + 8592=>987, 8593=>603, 8594=>987, 8595=>603, 8596=>1042, 8597=>1042, 8629=>658, 8656=>987, 8657=>603, 8658=>987, 8659=>603, 8660=>1042, 8704=>667, 8706=>556, 8707=>667, 8709=>556, + 8710=>711, 8711=>711, 8712=>713, 8713=>713, 8719=>823, 8720=>823, 8721=>804, 8722=>584, 8723=>584, 8727=>500, 8730=>542, 8733=>713, 8734=>713, 8736=>768, 8743=>603, 8744=>603, + 8745=>768, 8746=>768, 8747=>556, 8748=>796, 8749=>956, 8750=>556, 8756=>863, 8764=>549, 8766=>584, 8769=>584, 8770=>584, 8771=>584, 8777=>636, 8800=>548, 8804=>584, 8805=>584, + 8853=>768, 8854=>768, 8855=>768, 8869=>658, 8960=>823, 9674=>489, 9834=>555, 12289=>1000, 12290=>1000, 12291=>1000, 12293=>1000, 12295=>1000, 12296=>1000, 12297=>1000, 12298=>1000, 12299=>1000, + 12300=>1000, 12301=>1000, 12302=>1000, 12303=>1000, 12304=>1000, 12305=>1000, 12308=>1000, 12309=>1000, 12353=>1000, 12354=>1000, 12355=>1000, 12356=>1000, 12357=>1000, 12358=>1000, 12359=>1000, 12360=>1000, + 12361=>1000, 12362=>1000, 12363=>1000, 12364=>1000, 12365=>1000, 12366=>1000, 12367=>1000, 12368=>1000, 12369=>1000, 12370=>1000, 12371=>1000, 12372=>1000, 12373=>1000, 12374=>1000, 12375=>1000, 12376=>1000, + 12377=>1000, 12378=>1000, 12379=>1000, 12380=>1000, 12381=>1000, 12382=>1000, 12383=>1000, 12384=>1000, 12385=>1000, 12386=>1000, 12387=>1000, 12388=>1000, 12389=>1000, 12390=>1000, 12391=>1000, 12392=>1000, + 12393=>1000, 12394=>1000, 12395=>1000, 12396=>1000, 12397=>1000, 12398=>1000, 12399=>1000, 12400=>1000, 12401=>1000, 12402=>1000, 12403=>1000, 12404=>1000, 12405=>1000, 12406=>1000, 12407=>1000, 12408=>1000, + 12409=>1000, 12410=>1000, 12411=>1000, 12412=>1000, 12413=>1000, 12414=>1000, 12415=>1000, 12416=>1000, 12417=>1000, 12418=>1000, 12419=>1000, 12420=>1000, 12421=>1000, 12422=>1000, 12423=>1000, 12424=>1000, + 12425=>1000, 12426=>1000, 12427=>1000, 12428=>1000, 12429=>1000, 12430=>1000, 12431=>1000, 12432=>1000, 12433=>1000, 12434=>1000, 12435=>1000, 12441=>1000, 12443=>1000, 12449=>1000, 12450=>1000, 12451=>1000, + 12452=>1000, 12453=>1000, 12454=>1000, 12455=>1000, 12456=>1000, 12457=>1000, 12458=>1000, 12459=>1000, 12460=>1000, 12461=>1000, 12462=>1000, 12463=>1000, 12464=>1000, 12465=>1000, 12466=>1000, 12467=>1000, + 12468=>1000, 12469=>1000, 12470=>1000, 12471=>1000, 12472=>1000, 12473=>1000, 12474=>1000, 12475=>1000, 12476=>1000, 12477=>1000, 12478=>1000, 12479=>1000, 12480=>1000, 12481=>1000, 12482=>1000, 12483=>1000, + 12484=>1000, 12485=>1000, 12486=>1000, 12487=>1000, 12488=>1000, 12489=>1000, 12490=>1000, 12491=>1000, 12492=>1000, 12493=>1000, 12494=>1000, 12495=>1000, 12496=>1000, 12497=>1000, 12498=>1000, 12499=>1000, + 12500=>1000, 12501=>1000, 12502=>1000, 12503=>1000, 12504=>1000, 12505=>1000, 12506=>1000, 12507=>1000, 12508=>1000, 12509=>1000, 12510=>1000, 12511=>1000, 12512=>1000, 12513=>1000, 12514=>1000, 12515=>1000, + 12516=>1000, 12517=>1000, 12518=>1000, 12519=>1000, 12520=>1000, 12521=>1000, 12522=>1000, 12523=>1000, 12524=>1000, 12525=>1000, 12526=>1000, 12527=>1000, 12528=>1000, 12529=>1000, 12530=>1000, 12531=>1000, + 12532=>1000, 12533=>1000, 12534=>1000, 12535=>1000, 12536=>1000, 12537=>1000, 12538=>1000, 12539=>278, 12540=>1000, 12541=>1000, 12542=>1000, 63033=>556, 63034=>556, 63035=>556, 63036=>556, 63037=>556, + 63038=>556, 63039=>556, 63040=>556, 63041=>556, 63166=>222, 63171=>333, 63196=>556, 64256=>556, 64257=>500, 64258=>500, 64259=>778, 64260=>778, 64261=>556, 64262=>778, 64285=>200, 64286=>305, + 64287=>400, 64288=>587, 64289=>890, 64290=>848, 64291=>872, 64292=>800, 64293=>850, 64294=>873, 64295=>797, 64296=>937, 64297=>584, 64298=>776, 64299=>776, 64300=>776, 64301=>776, 64302=>640, + 64303=>640, 64304=>640, 64305=>591, 64306=>466, 64307=>598, 64308=>622, 64309=>262, 64310=>351, 64312=>608, 64313=>270, 64314=>526, 64315=>550, 64316=>600, 64318=>621, 64320=>378, 64321=>607, + 64323=>575, 64324=>568, 64326=>590, 64327=>606, 64328=>547, 64329=>776, 64330=>687, 64331=>212, 64332=>591, 64333=>550, 64334=>568, 64335=>640, 65533=>788} + font[:enc]=''; + font[:diff]=''; + font[:file]='FreeSans.z'; + font[:ctg]='FreeSans.ctg.z'; + font[:originalsize]=264072; +end diff --git a/vendor/plugins/rfpdf/lib/fonts/freesansb.rb b/vendor/plugins/rfpdf/lib/fonts/freesansb.rb new file mode 100755 index 00000000..41aba3ab --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/freesansb.rb @@ -0,0 +1,79 @@ +TCPDFFontDescriptor.define('freesansb') do |font| + font[:type]='TrueTypeUnicode'; + font[:name]='FreeSansBold'; + font[:desc]={'Ascent'=>1159,'Descent'=>-355,'CapHeight'=>1159,'Flags'=>32,'FontBBox'=>'[-459 -355 1300 1159]','ItalicAngle'=>0,'StemV'=>120,'MissingWidth'=>600}; + font[:up]=-155; + font[:ut]=69; + font[:cw]={ + 13=>333, 32=>278, 33=>333, 34=>474, 35=>556, 36=>556, 37=>889, 38=>722, 39=>238, 40=>333, 41=>333, 42=>389, 43=>584, 44=>278, 45=>333, 46=>278, + 47=>278, 48=>556, 49=>556, 50=>556, 51=>556, 52=>556, 53=>556, 54=>556, 55=>556, 56=>556, 57=>556, 58=>333, 59=>333, 60=>584, 61=>584, 62=>584, + 63=>611, 64=>975, 65=>722, 66=>722, 67=>722, 68=>722, 69=>667, 70=>611, 71=>778, 72=>722, 73=>278, 74=>556, 75=>722, 76=>611, 77=>833, 78=>722, + 79=>778, 80=>667, 81=>778, 82=>722, 83=>667, 84=>611, 85=>722, 86=>667, 87=>944, 88=>667, 89=>667, 90=>611, 91=>333, 92=>278, 93=>333, 94=>584, + 95=>556, 96=>333, 97=>556, 98=>611, 99=>556, 100=>611, 101=>556, 102=>333, 103=>611, 104=>611, 105=>278, 106=>278, 107=>556, 108=>278, 109=>889, 110=>611, + 111=>611, 112=>611, 113=>611, 114=>389, 115=>556, 116=>333, 117=>611, 118=>556, 119=>778, 120=>556, 121=>556, 122=>500, 123=>389, 124=>280, 125=>389, 126=>584, + 8364=>556, 1027=>611, 8218=>278, 402=>556, 8222=>500, 8230=>1000, 8224=>556, 8225=>556, 710=>333, 8240=>1000, 352=>667, 8249=>333, 338=>1000, 1036=>722, 381=>611, 1039=>722, + 8216=>278, 8217=>278, 8220=>500, 8221=>500, 8226=>350, 8211=>556, 8212=>1000, 732=>333, 8482=>1000, 353=>556, 8250=>333, 339=>944, 1116=>573, 382=>500, 376=>667, 161=>333, + 162=>556, 163=>556, 164=>556, 165=>556, 166=>280, 167=>556, 168=>333, 169=>737, 170=>370, 171=>556, 172=>584, 174=>737, 175=>333, 176=>606, 177=>584, 178=>351, + 179=>351, 180=>333, 181=>611, 182=>556, 183=>278, 184=>333, 185=>351, 186=>365, 187=>556, 188=>869, 189=>869, 190=>869, 191=>611, 192=>722, 193=>722, 194=>722, + 195=>722, 196=>722, 197=>722, 198=>1000, 199=>722, 200=>667, 201=>667, 202=>667, 203=>667, 204=>278, 205=>278, 206=>278, 207=>278, 208=>722, 209=>722, 210=>778, + 211=>778, 212=>778, 213=>778, 214=>778, 215=>584, 216=>778, 217=>722, 218=>722, 219=>722, 220=>722, 221=>667, 222=>667, 223=>611, 224=>556, 225=>556, 226=>556, + 227=>556, 228=>556, 229=>556, 230=>889, 231=>556, 232=>556, 233=>556, 234=>556, 235=>556, 236=>278, 237=>278, 238=>278, 239=>278, 240=>611, 241=>611, 242=>611, + 243=>611, 244=>611, 245=>611, 246=>611, 247=>584, 248=>611, 249=>611, 250=>611, 251=>611, 252=>611, 253=>556, 254=>611, 255=>556, 256=>722, 257=>556, 258=>722, + 259=>556, 260=>722, 261=>556, 262=>722, 263=>556, 264=>722, 265=>556, 266=>722, 267=>556, 268=>722, 269=>556, 270=>722, 271=>611, 272=>722, 273=>611, 274=>667, + 275=>556, 276=>667, 277=>556, 278=>667, 279=>556, 280=>667, 281=>556, 282=>667, 283=>556, 284=>778, 285=>611, 286=>778, 287=>611, 288=>778, 289=>611, 290=>778, + 291=>611, 292=>722, 293=>611, 294=>722, 295=>611, 296=>278, 297=>278, 298=>278, 299=>278, 300=>278, 301=>278, 302=>278, 303=>278, 304=>278, 305=>278, 306=>808, + 307=>492, 308=>556, 309=>278, 310=>722, 311=>556, 312=>573, 313=>611, 314=>278, 315=>611, 316=>278, 317=>611, 318=>278, 319=>611, 320=>556, 321=>611, 322=>278, + 323=>722, 324=>611, 325=>722, 326=>611, 327=>722, 328=>611, 329=>611, 330=>722, 331=>611, 332=>778, 333=>611, 334=>778, 335=>611, 336=>778, 337=>611, 340=>722, + 341=>389, 342=>722, 343=>389, 344=>722, 345=>389, 346=>667, 347=>556, 348=>667, 349=>556, 350=>667, 351=>556, 354=>611, 355=>333, 356=>611, 357=>333, 358=>611, + 359=>333, 360=>722, 361=>611, 362=>722, 363=>611, 364=>722, 365=>611, 366=>722, 367=>611, 368=>722, 369=>611, 370=>722, 371=>611, 372=>944, 373=>778, 374=>667, + 375=>556, 377=>611, 378=>500, 379=>611, 380=>500, 383=>333, 452=>1333, 453=>1222, 454=>1111, 455=>1167, 456=>889, 457=>556, 458=>1278, 459=>1000, 460=>889, 461=>722, + 462=>556, 463=>278, 464=>278, 465=>778, 466=>611, 467=>722, 468=>611, 469=>722, 470=>611, 471=>722, 472=>611, 473=>722, 474=>611, 475=>722, 476=>611, 478=>722, + 479=>556, 482=>1000, 483=>889, 486=>778, 487=>611, 488=>722, 489=>556, 490=>778, 491=>611, 492=>778, 493=>611, 497=>1333, 498=>1222, 499=>1111, 504=>722, 505=>611, + 506=>722, 507=>556, 508=>1000, 509=>889, 510=>778, 511=>611, 514=>722, 515=>556, 518=>667, 519=>556, 522=>278, 523=>278, 526=>778, 527=>611, 530=>722, 531=>389, + 534=>722, 535=>611, 536=>667, 537=>556, 538=>611, 539=>333, 711=>333, 728=>333, 729=>333, 730=>333, 731=>333, 733=>333, 884=>379, 885=>379, 890=>332, 894=>333, + 900=>325, 901=>658, 902=>761, 903=>474, 904=>706, 905=>733, 906=>285, 908=>785, 910=>823, 911=>819, 913=>722, 914=>722, 915=>642, 916=>726, 917=>667, 918=>611, + 919=>722, 920=>810, 921=>278, 922=>722, 923=>744, 924=>860, 925=>714, 926=>690, 927=>822, 928=>781, 929=>698, 931=>688, 932=>688, 933=>804, 934=>777, 935=>783, + 936=>805, 937=>780, 938=>278, 939=>804, 940=>660, 941=>559, 942=>560, 943=>356, 944=>575, 945=>656, 946=>576, 947=>591, 948=>620, 949=>570, 950=>522, 951=>586, + 952=>586, 953=>346, 954=>576, 955=>620, 956=>667, 957=>564, 958=>530, 959=>610, 960=>721, 961=>626, 962=>595, 963=>676, 964=>592, 965=>575, 966=>801, 967=>632, + 968=>722, 969=>800, 970=>346, 971=>575, 972=>599, 973=>567, 974=>1125, 1024=>667, 1025=>709, 1026=>790, 1028=>722, 1029=>667, 1030=>278, 1031=>278, 1032=>556, 1033=>1110, + 1034=>1113, 1035=>790, 1037=>726, 1038=>718, 1040=>722, 1041=>722, 1042=>722, 1043=>611, 1044=>900, 1045=>709, 1046=>1093, 1047=>672, 1048=>757, 1049=>757, 1050=>750, 1051=>729, + 1052=>874, 1053=>753, 1054=>778, 1055=>753, 1056=>671, 1057=>722, 1058=>611, 1059=>718, 1060=>892, 1061=>667, 1062=>816, 1063=>685, 1064=>1057, 1065=>1183, 1066=>928, 1067=>949, + 1068=>687, 1069=>722, 1070=>1109, 1071=>698, 1072=>556, 1073=>606, 1074=>572, 1075=>454, 1076=>685, 1077=>556, 1078=>809, 1079=>546, 1080=>615, 1081=>615, 1082=>573, 1083=>577, + 1084=>666, 1085=>603, 1086=>611, 1087=>603, 1088=>611, 1089=>556, 1090=>454, 1091=>556, 1092=>957, 1093=>556, 1094=>652, 1095=>578, 1096=>886, 1097=>968, 1098=>693, 1099=>811, + 1100=>562, 1101=>564, 1102=>908, 1103=>596, 1104=>556, 1105=>556, 1106=>606, 1107=>454, 1108=>556, 1109=>556, 1110=>278, 1111=>278, 1112=>278, 1113=>900, 1114=>611, 1115=>606, + 1117=>608, 1118=>556, 1119=>608, 1164=>687, 1165=>562, 1166=>667, 1167=>611, 1168=>611, 1169=>454, 1170=>611, 1171=>454, 1172=>611, 1173=>454, 1174=>1093, 1175=>809, 1176=>672, + 1177=>546, 1178=>722, 1179=>573, 1180=>722, 1181=>573, 1182=>722, 1183=>573, 1184=>722, 1185=>573, 1186=>722, 1187=>608, 1188=>722, 1189=>608, 1190=>722, 1191=>608, 1192=>722, + 1193=>556, 1194=>722, 1195=>556, 1196=>611, 1197=>454, 1198=>667, 1199=>556, 1200=>667, 1201=>556, 1202=>667, 1203=>556, 1204=>814, 1205=>685, 1206=>675, 1207=>580, 1208=>675, + 1209=>580, 1210=>675, 1211=>580, 1212=>722, 1213=>556, 1214=>722, 1215=>556, 1216=>278, 1217=>1093, 1218=>809, 1219=>722, 1220=>573, 1223=>722, 1224=>608, 1227=>675, 1228=>580, + 1232=>722, 1233=>556, 1234=>722, 1235=>556, 1236=>1000, 1237=>889, 1238=>709, 1239=>556, 1240=>722, 1241=>556, 1242=>722, 1243=>556, 1244=>1093, 1245=>809, 1246=>672, 1247=>546, + 1248=>672, 1249=>546, 1250=>757, 1251=>615, 1252=>757, 1253=>615, 1254=>778, 1255=>611, 1256=>778, 1257=>611, 1258=>778, 1259=>611, 1260=>722, 1261=>564, 1262=>718, 1263=>556, + 1264=>718, 1265=>556, 1266=>718, 1267=>556, 1268=>685, 1269=>578, 1272=>949, 1273=>811, 1456=>82, 1457=>347, 1458=>341, 1459=>341, 1460=>82, 1461=>211, 1462=>211, 1463=>200, + 1464=>200, 1465=>82, 1467=>341, 1468=>82, 1469=>82, 1470=>516, 1471=>200, 1472=>297, 1473=>1038, 1474=>1038, 1475=>333, 1476=>82, 1488=>714, 1489=>651, 1490=>557, 1491=>638, + 1492=>682, 1493=>297, 1494=>443, 1495=>682, 1496=>670, 1497=>284, 1498=>590, 1499=>595, 1500=>667, 1501=>683, 1502=>704, 1503=>297, 1504=>429, 1505=>670, 1506=>653, 1507=>661, + 1508=>660, 1509=>616, 1510=>671, 1511=>672, 1512=>600, 1513=>840, 1514=>756, 1520=>554, 1521=>550, 1522=>542, 1523=>238, 1524=>474, 1559=>556, 1560=>778, 1561=>944, 1562=>611, + 1563=>278, 1564=>889, 1569=>844, 1576=>923, 1578=>922, 1579=>922, 1581=>649, 1582=>704, 1587=>1221, 7936=>656, 7937=>656, 7938=>656, 7939=>656, 7940=>656, 7941=>656, 7942=>656, + 7943=>656, 7944=>722, 7945=>722, 7946=>722, 7947=>722, 7948=>722, 7949=>722, 7950=>722, 7951=>722, 7952=>570, 7953=>570, 7954=>570, 7955=>570, 7956=>570, 7957=>570, 7960=>667, + 7961=>667, 7962=>667, 7963=>667, 7964=>667, 7965=>667, 7968=>586, 7969=>586, 7970=>586, 7971=>586, 7972=>586, 7973=>586, 7974=>586, 7975=>586, 7976=>722, 7977=>722, 7978=>722, + 7979=>722, 7980=>722, 7981=>722, 7982=>722, 7983=>722, 7984=>346, 7985=>346, 7986=>346, 7987=>346, 7988=>346, 7989=>346, 7990=>346, 7991=>346, 7992=>278, 7993=>278, 7994=>278, + 7995=>278, 7996=>278, 7997=>278, 7998=>278, 7999=>278, 8000=>610, 8001=>610, 8002=>610, 8003=>610, 8004=>610, 8005=>610, 8008=>822, 8009=>822, 8010=>822, 8011=>822, 8012=>822, + 8013=>822, 8016=>575, 8017=>575, 8018=>575, 8019=>575, 8020=>575, 8021=>575, 8022=>575, 8023=>575, 8025=>804, 8027=>804, 8029=>804, 8031=>804, 8032=>800, 8033=>800, 8034=>800, + 8035=>800, 8036=>800, 8037=>800, 8038=>800, 8039=>800, 8040=>780, 8041=>780, 8042=>780, 8043=>780, 8044=>780, 8045=>780, 8046=>780, 8047=>780, 8048=>656, 8049=>656, 8050=>570, + 8051=>570, 8052=>586, 8053=>586, 8054=>346, 8055=>346, 8056=>610, 8057=>610, 8058=>575, 8059=>575, 8060=>800, 8061=>800, 8064=>656, 8065=>656, 8066=>656, 8067=>656, 8068=>656, + 8069=>656, 8070=>656, 8071=>656, 8072=>968, 8073=>968, 8074=>968, 8075=>968, 8076=>968, 8077=>968, 8078=>968, 8079=>968, 8080=>586, 8081=>586, 8082=>586, 8083=>586, 8084=>586, + 8085=>586, 8086=>586, 8087=>586, 8088=>968, 8089=>968, 8090=>968, 8091=>968, 8092=>968, 8093=>968, 8094=>968, 8095=>968, 8096=>800, 8097=>800, 8098=>800, 8099=>800, 8100=>800, + 8101=>800, 8102=>800, 8103=>800, 8104=>1026, 8105=>1026, 8106=>1026, 8107=>1026, 8108=>1026, 8109=>1026, 8110=>1026, 8111=>1026, 8112=>656, 8113=>656, 8114=>656, 8115=>656, 8116=>660, + 8118=>656, 8119=>656, 8120=>722, 8121=>722, 8122=>722, 8123=>722, 8124=>968, 8125=>278, 8126=>346, 8127=>278, 8128=>278, 8129=>333, 8130=>586, 8131=>586, 8132=>560, 8134=>586, + 8135=>586, 8136=>667, 8137=>667, 8138=>722, 8139=>722, 8140=>968, 8141=>492, 8142=>489, 8143=>394, 8144=>346, 8145=>346, 8146=>346, 8147=>346, 8150=>346, 8151=>346, 8152=>278, + 8153=>278, 8154=>278, 8155=>278, 8157=>481, 8158=>589, 8159=>333, 8160=>575, 8161=>575, 8162=>575, 8163=>575, 8164=>626, 8165=>626, 8166=>575, 8167=>575, 8168=>804, 8169=>804, + 8170=>804, 8171=>804, 8172=>698, 8173=>333, 8174=>333, 8175=>333, 8178=>800, 8179=>800, 8180=>1125, 8182=>800, 8183=>800, 8184=>822, 8185=>822, 8186=>780, 8187=>780, 8188=>1111, + 8189=>333, 8190=>278, 8260=>167, 8308=>351, 8321=>351, 8322=>351, 8323=>351, 8324=>351, 8362=>1049, 8543=>869, 8706=>490, 8710=>729, 8721=>711, 8722=>584, 8730=>542, 8800=>548, + 8804=>584, 8805=>584, 9674=>489, 63033=>556, 63034=>556, 63035=>556, 63036=>556, 63037=>556, 63038=>556, 63039=>556, 63040=>556, 63041=>556, 63171=>333, 63196=>556, 64257=>611, 64258=>611, + 64285=>284, 64286=>305, 64287=>542, 64288=>653, 64289=>964, 64290=>888, 64291=>932, 64292=>845, 64293=>917, 64294=>933, 64295=>850, 64296=>1006, 64297=>584, 64298=>840, 64299=>840, 64300=>840, + 64301=>840, 64302=>714, 64303=>714, 64304=>714, 64305=>651, 64306=>557, 64307=>638, 64308=>682, 64309=>367, 64310=>443, 64312=>670, 64313=>354, 64314=>590, 64315=>595, 64316=>667, 64318=>704, + 64320=>429, 64321=>670, 64323=>661, 64324=>660, 64326=>671, 64327=>672, 64328=>600, 64329=>840, 64330=>756, 64331=>297, 64332=>651, 64333=>595, 64334=>660, 64335=>714, 65182=>636} + font[:enc]=''; + font[:diff]=''; + font[:file]='FreeSansBold.z'; + font[:ctg]='FreeSansBold.ctg.z'; + font[:originalsize]=91432; +end \ No newline at end of file diff --git a/vendor/plugins/rfpdf/lib/fonts/freesansbi.rb b/vendor/plugins/rfpdf/lib/fonts/freesansbi.rb new file mode 100755 index 00000000..40ada3cb --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/freesansbi.rb @@ -0,0 +1,76 @@ +TCPDFFontDescriptor.define('freesansbi') do |font| + font[:type]='TrueTypeUnicode'; + font[:name]='FreeSansBoldOblique'; + font[:desc]={'Ascent'=>979,'Descent'=>-309,'CapHeight'=>979,'Flags'=>96,'FontBBox'=>'[-379 -309 1283 979]','ItalicAngle'=>-12,'StemV'=>120,'MissingWidth'=>600}; + font[:up]=-111; + font[:ut]=69; + font[:cw]={ + 13=>333, 32=>278, 33=>333, 34=>474, 35=>556, 36=>556, 37=>889, 38=>722, 39=>238, 40=>333, 41=>333, 42=>389, 43=>584, 44=>278, 45=>333, 46=>278, + 47=>278, 48=>556, 49=>556, 50=>556, 51=>556, 52=>556, 53=>556, 54=>556, 55=>556, 56=>556, 57=>556, 58=>333, 59=>333, 60=>584, 61=>584, 62=>584, + 63=>611, 64=>975, 65=>722, 66=>722, 67=>722, 68=>722, 69=>667, 70=>611, 71=>778, 72=>722, 73=>278, 74=>556, 75=>722, 76=>611, 77=>833, 78=>722, + 79=>778, 80=>667, 81=>778, 82=>722, 83=>667, 84=>611, 85=>722, 86=>667, 87=>944, 88=>667, 89=>667, 90=>611, 91=>333, 92=>278, 93=>333, 94=>584, + 95=>556, 96=>333, 97=>556, 98=>611, 99=>556, 100=>611, 101=>556, 102=>333, 103=>611, 104=>611, 105=>278, 106=>278, 107=>556, 108=>278, 109=>889, 110=>611, + 111=>611, 112=>611, 113=>611, 114=>389, 115=>556, 116=>333, 117=>611, 118=>556, 119=>778, 120=>556, 121=>556, 122=>500, 123=>389, 124=>280, 125=>389, 126=>584, + 8364=>556, 1027=>611, 8218=>278, 402=>556, 8222=>500, 8230=>1000, 8224=>556, 8225=>556, 710=>333, 8240=>1000, 352=>667, 8249=>333, 338=>1000, 1036=>722, 381=>611, 1039=>722, + 8216=>278, 8217=>278, 8220=>500, 8221=>500, 8226=>350, 8211=>556, 8212=>1000, 732=>333, 8482=>1000, 353=>556, 8250=>333, 339=>944, 1116=>556, 382=>500, 376=>667, 161=>333, + 162=>556, 163=>556, 164=>556, 165=>556, 166=>280, 167=>556, 168=>333, 169=>737, 170=>370, 171=>556, 172=>584, 174=>737, 175=>333, 176=>606, 177=>584, 178=>444, + 179=>444, 180=>333, 181=>611, 182=>556, 183=>278, 184=>333, 185=>444, 186=>365, 187=>556, 188=>1055, 189=>1055, 190=>1055, 191=>611, 192=>722, 193=>722, 194=>722, + 195=>722, 196=>722, 197=>722, 198=>1000, 199=>722, 200=>667, 201=>667, 202=>667, 203=>667, 204=>278, 205=>278, 206=>278, 207=>278, 208=>722, 209=>722, 210=>778, + 211=>778, 212=>778, 213=>778, 214=>778, 215=>584, 216=>778, 217=>722, 218=>722, 219=>722, 220=>722, 221=>667, 222=>667, 223=>611, 224=>556, 225=>556, 226=>556, + 227=>556, 228=>556, 229=>556, 230=>889, 231=>556, 232=>556, 233=>556, 234=>556, 235=>556, 236=>278, 237=>278, 238=>278, 239=>278, 240=>611, 241=>611, 242=>611, + 243=>611, 244=>611, 245=>611, 246=>611, 247=>584, 248=>611, 249=>611, 250=>611, 251=>611, 252=>611, 253=>556, 254=>611, 255=>556, 256=>722, 257=>556, 258=>722, + 259=>556, 260=>722, 261=>556, 262=>722, 263=>556, 264=>722, 265=>556, 266=>722, 267=>556, 268=>722, 269=>556, 270=>722, 271=>722, 272=>722, 273=>611, 274=>667, + 275=>556, 276=>667, 277=>556, 278=>667, 279=>556, 280=>667, 281=>556, 282=>667, 283=>556, 284=>778, 285=>611, 286=>778, 287=>611, 288=>778, 289=>611, 290=>778, + 291=>611, 292=>722, 293=>611, 294=>722, 295=>611, 296=>278, 297=>278, 298=>278, 299=>278, 300=>278, 301=>278, 302=>278, 303=>268, 304=>278, 305=>278, 306=>278, + 307=>278, 308=>556, 309=>278, 310=>722, 311=>556, 312=>529, 313=>611, 314=>278, 315=>611, 316=>278, 317=>611, 318=>384, 319=>611, 320=>556, 321=>611, 322=>278, + 323=>722, 324=>611, 325=>722, 326=>611, 327=>722, 328=>611, 329=>611, 330=>722, 331=>611, 332=>778, 333=>611, 334=>778, 335=>611, 336=>778, 337=>611, 340=>722, + 341=>389, 342=>722, 343=>389, 344=>722, 345=>389, 346=>667, 347=>556, 348=>667, 349=>556, 350=>667, 351=>556, 354=>611, 355=>333, 356=>611, 357=>404, 358=>611, + 359=>333, 360=>722, 361=>611, 362=>722, 363=>611, 364=>722, 365=>611, 366=>722, 367=>611, 368=>722, 369=>611, 370=>722, 371=>611, 372=>944, 373=>778, 374=>667, + 375=>556, 377=>611, 378=>500, 379=>611, 380=>500, 383=>333, 536=>667, 537=>556, 538=>611, 539=>333, 711=>333, 728=>333, 729=>333, 730=>333, 731=>333, 733=>333, + 768=>0, 769=>0, 770=>0, 771=>0, 772=>0, 774=>0, 775=>0, 776=>0, 778=>0, 779=>0, 780=>0, 783=>0, 785=>0, 787=>0, 788=>0, 884=>208, + 885=>247, 890=>364, 894=>333, 900=>308, 901=>446, 902=>688, 903=>418, 904=>642, 905=>743, 906=>228, 908=>754, 910=>736, 911=>743, 912=>346, 913=>764, 914=>688, + 915=>642, 916=>744, 917=>710, 918=>688, 919=>743, 920=>810, 921=>296, 922=>744, 923=>744, 924=>860, 925=>714, 926=>690, 927=>822, 928=>781, 929=>698, 931=>688, + 932=>688, 933=>744, 934=>777, 935=>783, 936=>805, 937=>780, 938=>296, 939=>744, 940=>640, 941=>530, 942=>597, 943=>339, 944=>575, 945=>656, 946=>576, 947=>591, + 948=>620, 949=>570, 950=>522, 951=>586, 952=>586, 953=>346, 954=>576, 955=>620, 956=>667, 957=>564, 958=>530, 959=>610, 960=>721, 961=>626, 962=>595, 963=>676, + 964=>592, 965=>575, 966=>801, 967=>632, 968=>722, 969=>800, 970=>346, 971=>575, 972=>609, 973=>604, 974=>769, 1024=>666, 1025=>666, 1026=>790, 1028=>722, 1029=>667, + 1030=>278, 1031=>278, 1032=>556, 1033=>1110, 1034=>1088, 1035=>790, 1037=>722, 1038=>718, 1040=>722, 1041=>722, 1042=>723, 1043=>611, 1044=>918, 1045=>666, 1046=>1054, 1047=>659, + 1048=>722, 1049=>722, 1050=>720, 1051=>722, 1052=>843, 1053=>722, 1054=>778, 1055=>722, 1056=>649, 1057=>837, 1058=>611, 1059=>698, 1060=>902, 1061=>664, 1062=>730, 1063=>671, + 1064=>1101, 1065=>1179, 1066=>816, 1067=>939, 1068=>639, 1069=>737, 1070=>1080, 1071=>690, 1072=>554, 1073=>611, 1074=>621, 1075=>475, 1076=>804, 1077=>552, 1078=>775, 1079=>556, + 1080=>636, 1081=>636, 1082=>529, 1083=>608, 1084=>697, 1085=>636, 1086=>611, 1087=>636, 1088=>611, 1089=>554, 1090=>454, 1091=>552, 1092=>989, 1093=>554, 1094=>690, 1095=>606, + 1096=>934, 1097=>987, 1098=>741, 1099=>839, 1100=>619, 1101=>575, 1102=>908, 1103=>636, 1104=>552, 1105=>552, 1106=>606, 1107=>454, 1108=>556, 1109=>556, 1110=>278, 1111=>278, + 1112=>278, 1113=>900, 1114=>611, 1115=>606, 1117=>636, 1118=>556, 1119=>636, 1164=>639, 1165=>619, 1166=>649, 1167=>611, 1168=>611, 1169=>454, 1170=>611, 1171=>475, 1172=>611, + 1173=>475, 1174=>1054, 1175=>775, 1176=>659, 1177=>556, 1178=>720, 1179=>529, 1180=>720, 1181=>529, 1182=>720, 1183=>529, 1184=>720, 1185=>529, 1186=>722, 1187=>636, 1188=>722, + 1189=>636, 1190=>722, 1191=>636, 1192=>837, 1193=>554, 1194=>837, 1195=>554, 1196=>611, 1197=>454, 1198=>667, 1199=>556, 1200=>667, 1201=>556, 1202=>664, 1203=>554, 1204=>730, + 1205=>690, 1206=>671, 1207=>606, 1208=>671, 1209=>606, 1210=>671, 1211=>606, 1212=>837, 1213=>554, 1214=>837, 1215=>554, 1216=>278, 1217=>1054, 1218=>775, 1219=>720, 1220=>529, + 1223=>722, 1224=>636, 1227=>671, 1228=>606, 1232=>722, 1233=>554, 1234=>722, 1235=>554, 1236=>1000, 1237=>889, 1238=>666, 1239=>552, 1240=>837, 1241=>554, 1242=>837, 1243=>554, + 1244=>1054, 1245=>775, 1246=>659, 1247=>556, 1248=>659, 1249=>556, 1250=>722, 1251=>636, 1252=>722, 1253=>636, 1254=>778, 1255=>611, 1256=>778, 1257=>611, 1258=>778, 1259=>611, + 1260=>737, 1261=>575, 1262=>698, 1263=>552, 1264=>698, 1265=>552, 1266=>698, 1267=>552, 1268=>671, 1269=>606, 1272=>939, 1273=>839, 1456=>82, 1457=>347, 1458=>341, 1459=>341, + 1460=>82, 1461=>211, 1462=>211, 1463=>200, 1464=>200, 1465=>82, 1467=>341, 1468=>82, 1469=>82, 1470=>516, 1471=>200, 1472=>297, 1473=>1038, 1474=>1038, 1475=>333, 1476=>82, + 1488=>714, 1489=>651, 1490=>557, 1491=>638, 1492=>682, 1493=>297, 1494=>443, 1495=>682, 1496=>670, 1497=>284, 1498=>590, 1499=>595, 1500=>667, 1501=>683, 1502=>704, 1503=>297, + 1504=>429, 1505=>670, 1506=>653, 1507=>661, 1508=>660, 1509=>616, 1510=>671, 1511=>672, 1512=>600, 1513=>840, 1514=>756, 1520=>554, 1521=>550, 1522=>542, 1523=>238, 1524=>474, + 7936=>656, 7937=>656, 7938=>656, 7939=>656, 7940=>656, 7941=>656, 7942=>656, 7943=>656, 7944=>764, 7945=>764, 7946=>764, 7947=>764, 7948=>764, 7949=>764, 7950=>764, 7951=>764, + 7952=>570, 7953=>570, 7954=>570, 7955=>570, 7956=>570, 7957=>570, 7960=>710, 7961=>710, 7962=>710, 7963=>710, 7964=>710, 7965=>710, 7968=>586, 7969=>586, 7970=>586, 7971=>586, + 7972=>586, 7973=>586, 7974=>586, 7975=>586, 7976=>743, 7977=>743, 7978=>743, 7979=>743, 7980=>743, 7981=>743, 7982=>743, 7983=>743, 7984=>346, 7985=>346, 7986=>346, 7987=>346, + 7988=>346, 7989=>346, 7990=>346, 7991=>346, 7992=>296, 7993=>296, 7994=>296, 7995=>296, 7996=>296, 7997=>296, 7998=>296, 7999=>296, 8000=>610, 8001=>610, 8002=>610, 8003=>610, + 8004=>610, 8005=>610, 8008=>822, 8009=>822, 8010=>822, 8011=>822, 8012=>822, 8013=>822, 8016=>575, 8017=>575, 8018=>575, 8019=>575, 8020=>575, 8021=>575, 8022=>575, 8023=>575, + 8025=>744, 8027=>744, 8029=>744, 8031=>744, 8032=>800, 8033=>800, 8034=>800, 8035=>800, 8036=>800, 8037=>800, 8038=>800, 8039=>800, 8040=>780, 8041=>780, 8042=>780, 8043=>780, + 8044=>780, 8045=>780, 8046=>780, 8047=>780, 8048=>656, 8049=>656, 8050=>570, 8051=>570, 8052=>586, 8053=>586, 8054=>346, 8055=>346, 8056=>610, 8057=>610, 8058=>575, 8059=>575, + 8060=>800, 8061=>800, 8064=>656, 8065=>656, 8066=>656, 8067=>656, 8068=>656, 8069=>656, 8070=>656, 8071=>656, 8072=>1007, 8073=>1007, 8074=>1007, 8075=>1007, 8076=>1007, 8077=>1007, + 8078=>1007, 8079=>1007, 8080=>586, 8081=>586, 8082=>586, 8083=>586, 8084=>586, 8085=>586, 8086=>586, 8087=>586, 8088=>986, 8089=>986, 8090=>986, 8091=>986, 8092=>986, 8093=>986, + 8094=>986, 8095=>986, 8096=>800, 8097=>800, 8098=>800, 8099=>800, 8100=>800, 8101=>800, 8102=>800, 8103=>800, 8104=>1023, 8105=>1023, 8106=>1023, 8107=>1023, 8108=>1023, 8109=>1023, + 8110=>1023, 8111=>1023, 8112=>656, 8113=>656, 8114=>656, 8115=>656, 8116=>640, 8118=>656, 8119=>656, 8120=>764, 8121=>764, 8122=>764, 8123=>764, 8124=>1007, 8125=>278, 8126=>201, + 8127=>147, 8128=>278, 8129=>333, 8130=>586, 8131=>586, 8132=>597, 8134=>586, 8135=>586, 8136=>710, 8137=>710, 8138=>743, 8139=>743, 8140=>986, 8141=>402, 8142=>403, 8143=>147, + 8144=>346, 8145=>346, 8146=>346, 8147=>346, 8150=>346, 8151=>346, 8152=>296, 8153=>296, 8154=>296, 8155=>296, 8157=>434, 8158=>433, 8159=>333, 8160=>575, 8161=>575, 8162=>575, + 8163=>575, 8164=>626, 8165=>626, 8166=>575, 8167=>575, 8168=>744, 8169=>744, 8173=>333, 8174=>351, 8175=>303, 8182=>800, 8183=>800, 8184=>822, 8185=>822, 8186=>780, 8187=>780, + 8188=>1023, 8189=>333, 8190=>159, 8260=>167, 8263=>1222, 8264=>944, 8265=>944, 8362=>1049, 8706=>490, 8710=>729, 8721=>711, 8722=>584, 8730=>542, 8800=>584, 8804=>584, 8805=>584, + 9674=>489, 63033=>556, 63034=>556, 63035=>556, 63036=>556, 63037=>556, 63038=>556, 63039=>556, 63040=>556, 63041=>556, 63166=>278, 63171=>333, 63196=>556, 64256=>666, 64257=>611, 64258=>611, + 64259=>944, 64260=>944, 64261=>666, 64262=>889, 64285=>284, 64286=>305, 64287=>542, 64288=>653, 64289=>964, 64290=>888, 64291=>932, 64292=>845, 64293=>917, 64294=>933, 64295=>850, 64296=>1006, + 64297=>584, 64298=>840, 64299=>840, 64300=>840, 64301=>840, 64302=>714, 64303=>714, 64304=>714, 64305=>651, 64306=>557, 64307=>638, 64308=>682, 64309=>367, 64310=>443, 64312=>670, 64313=>354, + 64314=>590, 64315=>595, 64316=>667, 64318=>704, 64320=>429, 64321=>670, 64323=>661, 64324=>660, 64326=>671, 64327=>672, 64328=>600, 64329=>840, 64330=>756, 64331=>297, 64332=>651, 64333=>595, + 64334=>660, 64335=>714}; + font[:enc]=''; + font[:diff]=''; + font[:file]='FreeSansBoldOblique.z'; + font[:ctg]='FreeSansBoldOblique.ctg.z'; + font[:originalsize]=95508; +end \ No newline at end of file diff --git a/vendor/plugins/rfpdf/lib/fonts/freesansi.rb b/vendor/plugins/rfpdf/lib/fonts/freesansi.rb new file mode 100755 index 00000000..8111837f --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/freesansi.rb @@ -0,0 +1,85 @@ +TCPDFFontDescriptor.define('freesansi') do |font| + font[:type]='TrueTypeUnicode'; + font[:name]='FreeSansOblique'; + font[:desc]={'Ascent'=>1141,'Descent'=>-419,'CapHeight'=>1141,'Flags'=>96,'FontBBox'=>'[-313 -419 1129 1141]','ItalicAngle'=>-12,'StemV'=>70,'MissingWidth'=>600}; + font[:up]=-151; + font[:ut]=50; + font[:cw]={ + 13=>333, 32=>278, 33=>278, 34=>355, 35=>556, 36=>556, 37=>889, 38=>667, 39=>191, 40=>333, 41=>333, 42=>389, 43=>584, 44=>278, 45=>333, 46=>278, + 47=>278, 48=>556, 49=>556, 50=>556, 51=>556, 52=>556, 53=>556, 54=>556, 55=>556, 56=>556, 57=>556, 58=>278, 59=>278, 60=>584, 61=>584, 62=>584, + 63=>556, 64=>1015, 65=>667, 66=>667, 67=>722, 68=>722, 69=>667, 70=>611, 71=>778, 72=>722, 73=>278, 74=>500, 75=>667, 76=>556, 77=>833, 78=>722, + 79=>778, 80=>667, 81=>778, 82=>722, 83=>667, 84=>611, 85=>722, 86=>667, 87=>944, 88=>667, 89=>667, 90=>611, 91=>278, 92=>278, 93=>278, 94=>469, + 95=>556, 96=>333, 97=>556, 98=>556, 99=>500, 100=>556, 101=>556, 102=>278, 103=>556, 104=>556, 105=>222, 106=>222, 107=>500, 108=>222, 109=>833, 110=>556, + 111=>556, 112=>556, 113=>556, 114=>333, 115=>500, 116=>278, 117=>556, 118=>500, 119=>722, 120=>500, 121=>500, 122=>500, 123=>334, 124=>260, 125=>334, 126=>584, + 8364=>556, 1027=>611, 8218=>222, 402=>556, 8222=>333, 8230=>1000, 8224=>556, 8225=>556, 710=>333, 8240=>1000, 352=>667, 8249=>333, 338=>1000, 1036=>667, 381=>611, 1039=>722, + 8216=>222, 8217=>222, 8220=>333, 8221=>333, 8226=>350, 8211=>556, 8212=>1000, 732=>333, 8482=>1000, 353=>500, 8250=>333, 339=>944, 1116=>500, 382=>500, 376=>667, 161=>333, + 162=>556, 163=>556, 164=>556, 165=>556, 166=>260, 167=>556, 168=>333, 169=>737, 170=>370, 171=>556, 172=>584, 173=>333, 174=>737, 175=>333, 176=>606, 177=>584, + 178=>390, 179=>390, 180=>333, 181=>556, 182=>537, 183=>278, 184=>333, 185=>390, 186=>365, 187=>556, 188=>947, 189=>947, 190=>947, 191=>611, 192=>667, 193=>667, + 194=>667, 195=>667, 196=>667, 197=>667, 198=>1000, 199=>722, 200=>667, 201=>667, 202=>667, 203=>667, 204=>278, 205=>278, 206=>278, 207=>278, 208=>722, 209=>722, + 210=>778, 211=>778, 212=>778, 213=>778, 214=>778, 215=>584, 216=>778, 217=>722, 218=>722, 219=>722, 220=>722, 221=>667, 222=>667, 223=>611, 224=>556, 225=>556, + 226=>556, 227=>556, 228=>556, 229=>556, 230=>889, 231=>500, 232=>556, 233=>556, 234=>556, 235=>556, 236=>278, 237=>278, 238=>278, 239=>278, 240=>556, 241=>556, + 242=>556, 243=>556, 244=>556, 245=>556, 246=>556, 247=>584, 248=>611, 249=>556, 250=>556, 251=>556, 252=>556, 253=>500, 254=>556, 255=>500, 256=>667, 257=>556, + 258=>667, 259=>556, 260=>667, 261=>556, 262=>722, 263=>500, 264=>722, 265=>500, 266=>722, 267=>500, 268=>722, 269=>500, 270=>722, 271=>650, 272=>722, 273=>556, + 274=>667, 275=>556, 276=>667, 277=>556, 278=>667, 279=>556, 280=>667, 281=>556, 282=>667, 283=>556, 284=>778, 285=>556, 286=>778, 287=>556, 288=>778, 289=>556, + 290=>778, 291=>527, 292=>722, 293=>556, 294=>722, 295=>556, 296=>278, 297=>278, 298=>278, 299=>222, 300=>278, 301=>278, 302=>278, 303=>222, 304=>278, 305=>278, + 306=>742, 307=>362, 308=>500, 309=>222, 310=>667, 311=>500, 312=>510, 313=>556, 314=>222, 315=>556, 316=>222, 317=>556, 318=>307, 319=>556, 320=>500, 321=>556, + 322=>222, 323=>722, 324=>556, 325=>722, 326=>556, 327=>722, 328=>556, 329=>556, 330=>722, 331=>556, 332=>778, 333=>556, 334=>778, 335=>556, 336=>778, 337=>556, + 340=>722, 341=>333, 342=>722, 343=>333, 344=>722, 345=>333, 346=>667, 347=>500, 348=>667, 349=>500, 350=>667, 351=>500, 354=>611, 355=>278, 356=>611, 357=>319, + 358=>611, 359=>278, 360=>722, 361=>556, 362=>722, 363=>556, 364=>722, 365=>556, 366=>722, 367=>556, 368=>722, 369=>556, 370=>722, 371=>556, 372=>944, 373=>722, + 374=>667, 375=>500, 377=>611, 378=>500, 379=>611, 380=>500, 383=>278, 461=>667, 462=>556, 463=>278, 464=>278, 465=>778, 466=>556, 467=>722, 468=>556, 469=>722, + 470=>556, 471=>722, 472=>556, 473=>722, 474=>556, 475=>722, 476=>556, 478=>667, 479=>556, 482=>1000, 483=>889, 486=>778, 487=>556, 488=>667, 489=>500, 490=>778, + 491=>556, 492=>778, 493=>556, 496=>222, 500=>778, 501=>556, 504=>722, 505=>556, 506=>667, 507=>556, 508=>1000, 509=>889, 510=>778, 511=>611, 512=>667, 513=>556, + 514=>667, 515=>556, 516=>667, 517=>556, 518=>667, 519=>556, 520=>278, 521=>278, 522=>278, 523=>278, 524=>778, 525=>556, 526=>778, 527=>556, 528=>722, 529=>333, + 530=>722, 531=>333, 532=>722, 533=>556, 534=>722, 535=>556, 536=>667, 537=>500, 538=>611, 539=>278, 711=>333, 728=>333, 729=>333, 730=>333, 731=>333, 733=>333, + 768=>0, 769=>0, 770=>0, 771=>0, 772=>0, 774=>0, 775=>0, 776=>0, 778=>0, 779=>0, 783=>0, 785=>0, 787=>0, 788=>0, 884=>199, 885=>199, + 890=>332, 894=>278, 900=>291, 901=>624, 902=>659, 903=>358, 904=>657, 905=>678, 906=>183, 908=>729, 910=>699, 911=>747, 912=>286, 913=>684, 914=>628, 915=>582, + 916=>684, 917=>650, 918=>628, 919=>683, 920=>750, 921=>236, 922=>684, 923=>684, 924=>800, 925=>654, 926=>630, 927=>750, 928=>721, 929=>638, 931=>628, 932=>628, + 933=>684, 934=>717, 935=>723, 936=>745, 937=>720, 938=>236, 939=>684, 940=>593, 941=>519, 942=>595, 943=>271, 944=>515, 945=>596, 946=>516, 947=>531, 948=>560, + 949=>510, 950=>462, 951=>526, 952=>526, 953=>286, 954=>516, 955=>560, 956=>607, 957=>504, 958=>470, 959=>550, 960=>661, 961=>566, 962=>535, 963=>616, 964=>532, + 965=>515, 966=>741, 967=>572, 968=>662, 969=>740, 970=>286, 971=>515, 972=>535, 973=>503, 974=>725, 1024=>667, 1025=>667, 1026=>766, 1028=>722, 1029=>667, 1030=>278, + 1031=>278, 1032=>500, 1033=>968, 1034=>1173, 1035=>766, 1037=>731, 1038=>650, 1040=>667, 1041=>639, 1042=>667, 1043=>611, 1044=>816, 1045=>667, 1046=>897, 1047=>652, 1048=>731, + 1049=>731, 1050=>664, 1051=>646, 1052=>833, 1053=>722, 1054=>778, 1055=>722, 1056=>667, 1057=>722, 1058=>611, 1059=>530, 1060=>891, 1061=>667, 1062=>722, 1063=>642, 1064=>836, + 1065=>837, 1066=>866, 1067=>886, 1068=>698, 1069=>717, 1070=>1079, 1071=>691, 1072=>556, 1073=>556, 1074=>538, 1075=>430, 1076=>640, 1077=>556, 1078=>818, 1079=>495, 1080=>560, + 1081=>560, 1082=>510, 1083=>556, 1084=>621, 1085=>561, 1086=>556, 1087=>560, 1088=>556, 1089=>500, 1090=>400, 1091=>500, 1092=>916, 1093=>500, 1094=>560, 1095=>497, 1096=>695, + 1097=>695, 1098=>640, 1099=>734, 1100=>523, 1101=>534, 1102=>788, 1103=>564, 1104=>556, 1105=>556, 1106=>568, 1107=>430, 1108=>500, 1109=>500, 1110=>222, 1111=>278, 1112=>222, + 1113=>840, 1114=>850, 1115=>568, 1117=>560, 1118=>500, 1119=>560, 1164=>698, 1165=>523, 1166=>667, 1167=>556, 1168=>611, 1169=>430, 1170=>611, 1171=>430, 1172=>611, 1173=>430, + 1174=>897, 1175=>818, 1176=>652, 1177=>495, 1178=>664, 1179=>510, 1180=>664, 1181=>510, 1182=>664, 1183=>510, 1184=>664, 1185=>510, 1186=>722, 1187=>561, 1188=>722, 1189=>561, + 1190=>722, 1191=>560, 1192=>722, 1193=>495, 1194=>722, 1195=>495, 1196=>611, 1197=>400, 1198=>667, 1199=>500, 1200=>667, 1201=>500, 1202=>665, 1203=>496, 1204=>722, 1205=>560, + 1206=>642, 1207=>497, 1208=>642, 1209=>497, 1210=>642, 1211=>497, 1212=>722, 1213=>495, 1214=>722, 1215=>495, 1216=>278, 1217=>897, 1218=>818, 1219=>664, 1220=>510, 1223=>722, + 1224=>561, 1227=>642, 1228=>497, 1232=>667, 1233=>556, 1234=>667, 1235=>556, 1236=>1000, 1237=>889, 1238=>667, 1239=>556, 1240=>722, 1241=>495, 1242=>722, 1243=>495, 1244=>897, + 1245=>818, 1246=>652, 1247=>495, 1248=>652, 1249=>495, 1250=>731, 1251=>560, 1252=>731, 1253=>560, 1254=>778, 1255=>556, 1256=>780, 1257=>554, 1258=>780, 1259=>554, 1260=>717, + 1261=>534, 1262=>530, 1263=>500, 1264=>530, 1265=>500, 1266=>530, 1267=>500, 1268=>642, 1269=>497, 1272=>886, 1273=>734, 1329=>722, 1330=>705, 1331=>774, 1332=>754, 1333=>722, + 1334=>751, 1335=>485, 1336=>722, 1337=>782, 1338=>655, 1339=>699, 1340=>417, 1341=>853, 1342=>791, 1343=>711, 1344=>588, 1345=>663, 1346=>665, 1347=>665, 1348=>756, 1349=>623, + 1350=>773, 1351=>603, 1352=>722, 1353=>648, 1354=>722, 1355=>751, 1356=>750, 1357=>722, 1358=>748, 1359=>667, 1360=>699, 1361=>623, 1362=>417, 1363=>785, 1364=>638, 1365=>778, + 1366=>716, 1370=>222, 1371=>133, 1372=>325, 1373=>333, 1374=>344, 1377=>833, 1378=>556, 1379=>572, 1380=>581, 1381=>550, 1382=>588, 1383=>448, 1384=>556, 1385=>568, 1386=>582, + 1387=>545, 1388=>301, 1389=>799, 1390=>556, 1391=>554, 1392=>533, 1393=>548, 1394=>552, 1395=>552, 1396=>544, 1397=>222, 1398=>544, 1399=>456, 1400=>556, 1401=>390, 1402=>833, + 1403=>509, 1404=>547, 1405=>533, 1406=>610, 1407=>887, 1408=>556, 1409=>545, 1410=>352, 1411=>853, 1412=>588, 1413=>579, 1414=>690, 1415=>545, 1417=>278, 1418=>367, 1456=>70, + 1457=>335, 1458=>329, 1459=>329, 1460=>70, 1461=>200, 1462=>200, 1463=>188, 1464=>188, 1465=>70, 1467=>329, 1468=>70, 1469=>70, 1470=>488, 1471=>200, 1472=>212, 1473=>0, + 1474=>0, 1475=>278, 1476=>70, 1488=>640, 1489=>591, 1490=>466, 1491=>598, 1492=>622, 1493=>212, 1494=>351, 1495=>623, 1496=>608, 1497=>200, 1498=>526, 1499=>550, 1500=>600, + 1501=>623, 1502=>621, 1503=>212, 1504=>378, 1505=>607, 1506=>587, 1507=>575, 1508=>568, 1509=>540, 1510=>590, 1511=>606, 1512=>547, 1513=>776, 1514=>687, 1520=>424, 1521=>412, + 1522=>400, 1523=>184, 1524=>344, 7936=>596, 7937=>596, 7938=>596, 7939=>596, 7940=>596, 7941=>596, 7942=>596, 7943=>596, 7944=>684, 7945=>684, 7946=>684, 7947=>684, 7948=>684, + 7949=>684, 7950=>684, 7951=>684, 7952=>510, 7953=>510, 7954=>510, 7955=>510, 7956=>510, 7957=>510, 7960=>650, 7961=>650, 7962=>650, 7963=>650, 7964=>650, 7965=>650, 7968=>526, + 7969=>526, 7970=>526, 7971=>526, 7972=>526, 7973=>526, 7974=>526, 7975=>526, 7976=>683, 7977=>683, 7978=>683, 7979=>683, 7980=>683, 7981=>683, 7982=>683, 7983=>683, 7984=>286, + 7985=>286, 7986=>286, 7987=>286, 7988=>286, 7989=>286, 7990=>286, 7991=>286, 7992=>236, 7993=>236, 7994=>236, 7995=>236, 7996=>236, 7997=>236, 7998=>236, 7999=>236, 8000=>550, + 8001=>550, 8002=>550, 8003=>550, 8004=>550, 8005=>550, 8008=>750, 8009=>750, 8010=>750, 8011=>750, 8012=>750, 8013=>750, 8016=>515, 8017=>515, 8018=>515, 8019=>515, 8020=>515, + 8021=>515, 8022=>515, 8023=>515, 8025=>684, 8027=>684, 8029=>684, 8031=>684, 8032=>740, 8033=>740, 8034=>740, 8035=>740, 8036=>740, 8037=>740, 8038=>740, 8039=>740, 8040=>720, + 8041=>720, 8042=>720, 8043=>720, 8044=>720, 8045=>720, 8046=>720, 8047=>720, 8048=>596, 8049=>596, 8050=>510, 8051=>510, 8052=>526, 8053=>526, 8054=>286, 8055=>286, 8056=>550, + 8057=>550, 8058=>515, 8059=>515, 8060=>740, 8061=>740, 8064=>596, 8065=>596, 8066=>596, 8067=>596, 8068=>596, 8069=>596, 8070=>596, 8071=>596, 8072=>900, 8073=>900, 8074=>900, + 8075=>900, 8076=>900, 8077=>900, 8078=>900, 8079=>900, 8080=>526, 8081=>526, 8082=>526, 8083=>526, 8084=>526, 8085=>526, 8086=>526, 8087=>526, 8088=>899, 8089=>899, 8090=>899, + 8091=>899, 8092=>899, 8093=>899, 8094=>899, 8095=>899, 8096=>740, 8097=>740, 8098=>740, 8099=>740, 8100=>740, 8101=>740, 8102=>740, 8103=>740, 8104=>936, 8105=>936, 8106=>936, + 8107=>936, 8108=>936, 8109=>936, 8110=>936, 8111=>936, 8112=>596, 8113=>596, 8114=>596, 8115=>596, 8116=>593, 8118=>596, 8119=>596, 8120=>684, 8121=>684, 8122=>684, 8123=>684, + 8124=>900, 8125=>278, 8126=>201, 8127=>147, 8128=>278, 8129=>333, 8130=>526, 8131=>526, 8132=>595, 8134=>526, 8135=>526, 8136=>650, 8137=>650, 8138=>683, 8139=>683, 8140=>899, + 8141=>602, 8142=>601, 8143=>333, 8144=>286, 8145=>286, 8146=>286, 8147=>286, 8150=>286, 8151=>286, 8152=>236, 8153=>236, 8154=>236, 8155=>236, 8157=>434, 8158=>433, 8159=>333, + 8160=>515, 8161=>515, 8162=>515, 8163=>515, 8164=>566, 8165=>566, 8166=>515, 8167=>515, 8168=>684, 8169=>684, 8170=>684, 8171=>684, 8172=>638, 8173=>333, 8174=>624, 8175=>303, + 8178=>740, 8179=>740, 8180=>725, 8182=>740, 8183=>740, 8184=>750, 8185=>750, 8186=>720, 8187=>720, 8188=>936, 8189=>333, 8190=>159, 8260=>167, 8362=>869, 8706=>490, 8710=>712, + 8721=>711, 8722=>584, 8730=>542, 8800=>584, 8804=>584, 8805=>584, 9674=>489, 63033=>556, 63034=>556, 63035=>556, 63036=>556, 63037=>556, 63038=>556, 63039=>556, 63040=>556, 63041=>556, + 63166=>222, 63171=>333, 63196=>556, 64256=>556, 64257=>500, 64258=>500, 64259=>778, 64260=>778, 64261=>556, 64262=>778, 64285=>200, 64286=>305, 64287=>400, 64288=>587, 64289=>890, 64290=>848, + 64291=>872, 64292=>800, 64293=>850, 64294=>873, 64295=>797, 64296=>937, 64297=>584, 64298=>776, 64299=>776, 64300=>776, 64301=>776, 64302=>640, 64303=>640, 64304=>640, 64305=>591, 64306=>466, + 64307=>598, 64308=>622, 64309=>262, 64310=>351, 64312=>608, 64313=>270, 64314=>526, 64315=>550, 64316=>600, 64318=>621, 64320=>378, 64321=>607, 64323=>575, 64324=>568, 64326=>590, 64327=>606, + 64328=>547, 64329=>776, 64330=>687, 64331=>212, 64332=>591, 64333=>550, 64334=>568, 64335=>640}; + font[:enc]=''; + font[:diff]=''; + font[:file]='FreeSansOblique.z'; + font[:ctg]='FreeSansOblique.ctg.z'; + font[:originalsize]=110740; +end \ No newline at end of file diff --git a/vendor/plugins/rfpdf/lib/fonts/helvetica.rb b/vendor/plugins/rfpdf/lib/fonts/helvetica.rb new file mode 100755 index 00000000..a1dcad0e --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/helvetica.rb @@ -0,0 +1,4 @@ +TCPDFFontDescriptor.define('helvetica') do |font| + font[:cw]={ + 0.chr=>278, 1.chr=>278, 2.chr=>278, 3.chr=>278, 4.chr=>278, 5.chr=>278, 6.chr=>278, 7.chr=>278, 8.chr=>278, 9.chr=>278, 10.chr=>278, 11.chr=>278, 12.chr=>278, 13.chr=>278, 14.chr=>278, 15.chr=>278, 16.chr=>278, 17.chr=>278, 18.chr=>278, 19.chr=>278, 20.chr=>278, 21.chr=>278, 22.chr=>278, 23.chr=>278, 24.chr=>278, 25.chr=>278, 26.chr=>278, 27.chr=>278, 28.chr=>278, 29.chr=>278, 30.chr=>278, 31.chr=>278, ' '=>278, '!'=>278, '"'=>355, '#'=>556, '$'=>556, '%'=>889, '&'=>667, '\''=>191, '('=>333, ')'=>333, '*'=>389, '+'=>584, ','=>278, '-'=>333, '.'=>278, '/'=>278, '0'=>556, '1'=>556, '2'=>556, '3'=>556, '4'=>556, '5'=>556, '6'=>556, '7'=>556, '8'=>556, '9'=>556, ':'=>278, ';'=>278, '<'=>584, '='=>584, '>'=>584, '?'=>556, '@'=>1015, 'A'=>667, 'B'=>667, 'C'=>722, 'D'=>722, 'E'=>667, 'F'=>611, 'G'=>778, 'H'=>722, 'I'=>278, 'J'=>500, 'K'=>667, 'L'=>556, 'M'=>833, 'N'=>722, 'O'=>778, 'P'=>667, 'Q'=>778, 'R'=>722, 'S'=>667, 'T'=>611, 'U'=>722, 'V'=>667, 'W'=>944, 'X'=>667, 'Y'=>667, 'Z'=>611, '['=>278, '\\'=>278, ']'=>278, '^'=>469, '_'=>556, '`'=>333, 'a'=>556, 'b'=>556, 'c'=>500, 'd'=>556, 'e'=>556, 'f'=>278, 'g'=>556, 'h'=>556, 'i'=>222, 'j'=>222, 'k'=>500, 'l'=>222, 'm'=>833, 'n'=>556, 'o'=>556, 'p'=>556, 'q'=>556, 'r'=>333, 's'=>500, 't'=>278, 'u'=>556, 'v'=>500, 'w'=>722, 'x'=>500, 'y'=>500, 'z'=>500, '{'=>334, '|'=>260, '}'=>334, '~'=>584, 127.chr=>350, 128.chr=>556, 129.chr=>350, 130.chr=>222, 131.chr=>556, 132.chr=>333, 133.chr=>1000, 134.chr=>556, 135.chr=>556, 136.chr=>333, 137.chr=>1000, 138.chr=>667, 139.chr=>333, 140.chr=>1000, 141.chr=>350, 142.chr=>611, 143.chr=>350, 144.chr=>350, 145.chr=>222, 146.chr=>222, 147.chr=>333, 148.chr=>333, 149.chr=>350, 150.chr=>556, 151.chr=>1000, 152.chr=>333, 153.chr=>1000, 154.chr=>500, 155.chr=>333, 156.chr=>944, 157.chr=>350, 158.chr=>500, 159.chr=>667, 160.chr=>278, 161.chr=>333, 162.chr=>556, 163.chr=>556, 164.chr=>556, 165.chr=>556, 166.chr=>260, 167.chr=>556, 168.chr=>333, 169.chr=>737, 170.chr=>370, 171.chr=>556, 172.chr=>584, 173.chr=>333, 174.chr=>737, 175.chr=>333, 176.chr=>400, 177.chr=>584, 178.chr=>333, 179.chr=>333, 180.chr=>333, 181.chr=>556, 182.chr=>537, 183.chr=>278, 184.chr=>333, 185.chr=>333, 186.chr=>365, 187.chr=>556, 188.chr=>834, 189.chr=>834, 190.chr=>834, 191.chr=>611, 192.chr=>667, 193.chr=>667, 194.chr=>667, 195.chr=>667, 196.chr=>667, 197.chr=>667, 198.chr=>1000, 199.chr=>722, 200.chr=>667, 201.chr=>667, 202.chr=>667, 203.chr=>667, 204.chr=>278, 205.chr=>278, 206.chr=>278, 207.chr=>278, 208.chr=>722, 209.chr=>722, 210.chr=>778, 211.chr=>778, 212.chr=>778, 213.chr=>778, 214.chr=>778, 215.chr=>584, 216.chr=>778, 217.chr=>722, 218.chr=>722, 219.chr=>722, 220.chr=>722, 221.chr=>667, 222.chr=>667, 223.chr=>611, 224.chr=>556, 225.chr=>556, 226.chr=>556, 227.chr=>556, 228.chr=>556, 229.chr=>556, 230.chr=>889, 231.chr=>500, 232.chr=>556, 233.chr=>556, 234.chr=>556, 235.chr=>556, 236.chr=>278, 237.chr=>278, 238.chr=>278, 239.chr=>278, 240.chr=>556, 241.chr=>556, 242.chr=>556, 243.chr=>556, 244.chr=>556, 245.chr=>556, 246.chr=>556, 247.chr=>584, 248.chr=>611, 249.chr=>556, 250.chr=>556, 251.chr=>556, 252.chr=>556, 253.chr=>500, 254.chr=>556, 255.chr=>500} +end \ No newline at end of file diff --git a/vendor/plugins/rfpdf/lib/fonts/helveticab.rb b/vendor/plugins/rfpdf/lib/fonts/helveticab.rb new file mode 100755 index 00000000..ae057cde --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/helveticab.rb @@ -0,0 +1,15 @@ +TCPDFFontDescriptor.define('helveticab') do |font| + font[:cw]={ + 0.chr=>278,1.chr=>278,2.chr=>278,3.chr=>278,4.chr=>278,5.chr=>278,6.chr=>278,7.chr=>278,8.chr=>278,9.chr=>278,10.chr=>278,11.chr=>278,12.chr=>278,13.chr=>278,14.chr=>278,15.chr=>278,16.chr=>278,17.chr=>278,18.chr=>278,19.chr=>278,20.chr=>278,21.chr=>278, + 22.chr=>278,23.chr=>278,24.chr=>278,25.chr=>278,26.chr=>278,27.chr=>278,28.chr=>278,29.chr=>278,30.chr=>278,31.chr=>278,' '=>278,'!'=>333,'"'=>474,'#'=>556,'$'=>556,'%'=>889,'&'=>722,'\''=>238,'('=>333,')'=>333,'*'=>389,'+'=>584, + ','=>278,'-'=>333,'.'=>278,'/'=>278,'0'=>556,'1'=>556,'2'=>556,'3'=>556,'4'=>556,'5'=>556,'6'=>556,'7'=>556,'8'=>556,'9'=>556,':'=>333,';'=>333,'<'=>584,'='=>584,'>'=>584,'?'=>611,'@'=>975,'A'=>722, + 'B'=>722,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>722,'I'=>278,'J'=>556,'K'=>722,'L'=>611,'M'=>833,'N'=>722,'O'=>778,'P'=>667,'Q'=>778,'R'=>722,'S'=>667,'T'=>611,'U'=>722,'V'=>667,'W'=>944, + 'X'=>667,'Y'=>667,'Z'=>611,'['=>333,'\\'=>278,']'=>333,'^'=>584,'_'=>556,'`'=>333,'a'=>556,'b'=>611,'c'=>556,'d'=>611,'e'=>556,'f'=>333,'g'=>611,'h'=>611,'i'=>278,'j'=>278,'k'=>556,'l'=>278,'m'=>889, + 'n'=>611,'o'=>611,'p'=>611,'q'=>611,'r'=>389,'s'=>556,'t'=>333,'u'=>611,'v'=>556,'w'=>778,'x'=>556,'y'=>556,'z'=>500,'{'=>389,'|'=>280,'}'=>389,'~'=>584,127.chr=>350,128.chr=>556,129.chr=>350,130.chr=>278,131.chr=>556, + 132.chr=>500,133.chr=>1000,134.chr=>556,135.chr=>556,136.chr=>333,137.chr=>1000,138.chr=>667,139.chr=>333,140.chr=>1000,141.chr=>350,142.chr=>611,143.chr=>350,144.chr=>350,145.chr=>278,146.chr=>278,147.chr=>500,148.chr=>500,149.chr=>350,150.chr=>556,151.chr=>1000,152.chr=>333,153.chr=>1000, + 154.chr=>556,155.chr=>333,156.chr=>944,157.chr=>350,158.chr=>500,159.chr=>667,160.chr=>278,161.chr=>333,162.chr=>556,163.chr=>556,164.chr=>556,165.chr=>556,166.chr=>280,167.chr=>556,168.chr=>333,169.chr=>737,170.chr=>370,171.chr=>556,172.chr=>584,173.chr=>333,174.chr=>737,175.chr=>333, + 176.chr=>400,177.chr=>584,178.chr=>333,179.chr=>333,180.chr=>333,181.chr=>611,182.chr=>556,183.chr=>278,184.chr=>333,185.chr=>333,186.chr=>365,187.chr=>556,188.chr=>834,189.chr=>834,190.chr=>834,191.chr=>611,192.chr=>722,193.chr=>722,194.chr=>722,195.chr=>722,196.chr=>722,197.chr=>722, + 198.chr=>1000,199.chr=>722,200.chr=>667,201.chr=>667,202.chr=>667,203.chr=>667,204.chr=>278,205.chr=>278,206.chr=>278,207.chr=>278,208.chr=>722,209.chr=>722,210.chr=>778,211.chr=>778,212.chr=>778,213.chr=>778,214.chr=>778,215.chr=>584,216.chr=>778,217.chr=>722,218.chr=>722,219.chr=>722, + 220.chr=>722,221.chr=>667,222.chr=>667,223.chr=>611,224.chr=>556,225.chr=>556,226.chr=>556,227.chr=>556,228.chr=>556,229.chr=>556,230.chr=>889,231.chr=>556,232.chr=>556,233.chr=>556,234.chr=>556,235.chr=>556,236.chr=>278,237.chr=>278,238.chr=>278,239.chr=>278,240.chr=>611,241.chr=>611, + 242.chr=>611,243.chr=>611,244.chr=>611,245.chr=>611,246.chr=>611,247.chr=>584,248.chr=>611,249.chr=>611,250.chr=>611,251.chr=>611,252.chr=>611,253.chr=>556,254.chr=>611,255.chr=>556} +end \ No newline at end of file diff --git a/vendor/plugins/rfpdf/lib/fonts/helveticabi.rb b/vendor/plugins/rfpdf/lib/fonts/helveticabi.rb new file mode 100755 index 00000000..bb3b9ffe --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/helveticabi.rb @@ -0,0 +1,15 @@ +TCPDFFontDescriptor.define('helveticabi') do |font| + font[:cw]={ + 0.chr=>278,1.chr=>278,2.chr=>278,3.chr=>278,4.chr=>278,5.chr=>278,6.chr=>278,7.chr=>278,8.chr=>278,9.chr=>278,10.chr=>278,11.chr=>278,12.chr=>278,13.chr=>278,14.chr=>278,15.chr=>278,16.chr=>278,17.chr=>278,18.chr=>278,19.chr=>278,20.chr=>278,21.chr=>278, + 22.chr=>278,23.chr=>278,24.chr=>278,25.chr=>278,26.chr=>278,27.chr=>278,28.chr=>278,29.chr=>278,30.chr=>278,31.chr=>278,' '=>278,'!'=>333,'"'=>474,'#'=>556,'$'=>556,'%'=>889,'&'=>722,'\''=>238,'('=>333,')'=>333,'*'=>389,'+'=>584, + ','=>278,'-'=>333,'.'=>278,'/'=>278,'0'=>556,'1'=>556,'2'=>556,'3'=>556,'4'=>556,'5'=>556,'6'=>556,'7'=>556,'8'=>556,'9'=>556,':'=>333,';'=>333,'<'=>584,'='=>584,'>'=>584,'?'=>611,'@'=>975,'A'=>722, + 'B'=>722,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>722,'I'=>278,'J'=>556,'K'=>722,'L'=>611,'M'=>833,'N'=>722,'O'=>778,'P'=>667,'Q'=>778,'R'=>722,'S'=>667,'T'=>611,'U'=>722,'V'=>667,'W'=>944, + 'X'=>667,'Y'=>667,'Z'=>611,'['=>333,'\\'=>278,']'=>333,'^'=>584,'_'=>556,'`'=>333,'a'=>556,'b'=>611,'c'=>556,'d'=>611,'e'=>556,'f'=>333,'g'=>611,'h'=>611,'i'=>278,'j'=>278,'k'=>556,'l'=>278,'m'=>889, + 'n'=>611,'o'=>611,'p'=>611,'q'=>611,'r'=>389,'s'=>556,'t'=>333,'u'=>611,'v'=>556,'w'=>778,'x'=>556,'y'=>556,'z'=>500,'{'=>389,'|'=>280,'}'=>389,'~'=>584,127.chr=>350,128.chr=>556,129.chr=>350,130.chr=>278,131.chr=>556, + 132.chr=>500,133.chr=>1000,134.chr=>556,135.chr=>556,136.chr=>333,137.chr=>1000,138.chr=>667,139.chr=>333,140.chr=>1000,141.chr=>350,142.chr=>611,143.chr=>350,144.chr=>350,145.chr=>278,146.chr=>278,147.chr=>500,148.chr=>500,149.chr=>350,150.chr=>556,151.chr=>1000,152.chr=>333,153.chr=>1000, + 154.chr=>556,155.chr=>333,156.chr=>944,157.chr=>350,158.chr=>500,159.chr=>667,160.chr=>278,161.chr=>333,162.chr=>556,163.chr=>556,164.chr=>556,165.chr=>556,166.chr=>280,167.chr=>556,168.chr=>333,169.chr=>737,170.chr=>370,171.chr=>556,172.chr=>584,173.chr=>333,174.chr=>737,175.chr=>333, + 176.chr=>400,177.chr=>584,178.chr=>333,179.chr=>333,180.chr=>333,181.chr=>611,182.chr=>556,183.chr=>278,184.chr=>333,185.chr=>333,186.chr=>365,187.chr=>556,188.chr=>834,189.chr=>834,190.chr=>834,191.chr=>611,192.chr=>722,193.chr=>722,194.chr=>722,195.chr=>722,196.chr=>722,197.chr=>722, + 198.chr=>1000,199.chr=>722,200.chr=>667,201.chr=>667,202.chr=>667,203.chr=>667,204.chr=>278,205.chr=>278,206.chr=>278,207.chr=>278,208.chr=>722,209.chr=>722,210.chr=>778,211.chr=>778,212.chr=>778,213.chr=>778,214.chr=>778,215.chr=>584,216.chr=>778,217.chr=>722,218.chr=>722,219.chr=>722, + 220.chr=>722,221.chr=>667,222.chr=>667,223.chr=>611,224.chr=>556,225.chr=>556,226.chr=>556,227.chr=>556,228.chr=>556,229.chr=>556,230.chr=>889,231.chr=>556,232.chr=>556,233.chr=>556,234.chr=>556,235.chr=>556,236.chr=>278,237.chr=>278,238.chr=>278,239.chr=>278,240.chr=>611,241.chr=>611, + 242.chr=>611,243.chr=>611,244.chr=>611,245.chr=>611,246.chr=>611,247.chr=>584,248.chr=>611,249.chr=>611,250.chr=>611,251.chr=>611,252.chr=>611,253.chr=>556,254.chr=>611,255.chr=>556} +end \ No newline at end of file diff --git a/vendor/plugins/rfpdf/lib/fonts/helveticai.rb b/vendor/plugins/rfpdf/lib/fonts/helveticai.rb new file mode 100755 index 00000000..f1acd6dc --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/helveticai.rb @@ -0,0 +1,15 @@ +TCPDFFontDescriptor.define('helveticai') do |font| + font[:cw]={ + 0.chr=>278,1.chr=>278,2.chr=>278,3.chr=>278,4.chr=>278,5.chr=>278,6.chr=>278,7.chr=>278,8.chr=>278,9.chr=>278,10.chr=>278,11.chr=>278,12.chr=>278,13.chr=>278,14.chr=>278,15.chr=>278,16.chr=>278,17.chr=>278,18.chr=>278,19.chr=>278,20.chr=>278,21.chr=>278, + 22.chr=>278,23.chr=>278,24.chr=>278,25.chr=>278,26.chr=>278,27.chr=>278,28.chr=>278,29.chr=>278,30.chr=>278,31.chr=>278,' '=>278,'!'=>278,'"'=>355,'#'=>556,'$'=>556,'%'=>889,'&'=>667,'\''=>191,'('=>333,')'=>333,'*'=>389,'+'=>584, + ','=>278,'-'=>333,'.'=>278,'/'=>278,'0'=>556,'1'=>556,'2'=>556,'3'=>556,'4'=>556,'5'=>556,'6'=>556,'7'=>556,'8'=>556,'9'=>556,':'=>278,';'=>278,'<'=>584,'='=>584,'>'=>584,'?'=>556,'@'=>1015,'A'=>667, + 'B'=>667,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>722,'I'=>278,'J'=>500,'K'=>667,'L'=>556,'M'=>833,'N'=>722,'O'=>778,'P'=>667,'Q'=>778,'R'=>722,'S'=>667,'T'=>611,'U'=>722,'V'=>667,'W'=>944, + 'X'=>667,'Y'=>667,'Z'=>611,'['=>278,'\\'=>278,']'=>278,'^'=>469,'_'=>556,'`'=>333,'a'=>556,'b'=>556,'c'=>500,'d'=>556,'e'=>556,'f'=>278,'g'=>556,'h'=>556,'i'=>222,'j'=>222,'k'=>500,'l'=>222,'m'=>833, + 'n'=>556,'o'=>556,'p'=>556,'q'=>556,'r'=>333,'s'=>500,'t'=>278,'u'=>556,'v'=>500,'w'=>722,'x'=>500,'y'=>500,'z'=>500,'{'=>334,'|'=>260,'}'=>334,'~'=>584,127.chr=>350,128.chr=>556,129.chr=>350,130.chr=>222,131.chr=>556, + 132.chr=>333,133.chr=>1000,134.chr=>556,135.chr=>556,136.chr=>333,137.chr=>1000,138.chr=>667,139.chr=>333,140.chr=>1000,141.chr=>350,142.chr=>611,143.chr=>350,144.chr=>350,145.chr=>222,146.chr=>222,147.chr=>333,148.chr=>333,149.chr=>350,150.chr=>556,151.chr=>1000,152.chr=>333,153.chr=>1000, + 154.chr=>500,155.chr=>333,156.chr=>944,157.chr=>350,158.chr=>500,159.chr=>667,160.chr=>278,161.chr=>333,162.chr=>556,163.chr=>556,164.chr=>556,165.chr=>556,166.chr=>260,167.chr=>556,168.chr=>333,169.chr=>737,170.chr=>370,171.chr=>556,172.chr=>584,173.chr=>333,174.chr=>737,175.chr=>333, + 176.chr=>400,177.chr=>584,178.chr=>333,179.chr=>333,180.chr=>333,181.chr=>556,182.chr=>537,183.chr=>278,184.chr=>333,185.chr=>333,186.chr=>365,187.chr=>556,188.chr=>834,189.chr=>834,190.chr=>834,191.chr=>611,192.chr=>667,193.chr=>667,194.chr=>667,195.chr=>667,196.chr=>667,197.chr=>667, + 198.chr=>1000,199.chr=>722,200.chr=>667,201.chr=>667,202.chr=>667,203.chr=>667,204.chr=>278,205.chr=>278,206.chr=>278,207.chr=>278,208.chr=>722,209.chr=>722,210.chr=>778,211.chr=>778,212.chr=>778,213.chr=>778,214.chr=>778,215.chr=>584,216.chr=>778,217.chr=>722,218.chr=>722,219.chr=>722, + 220.chr=>722,221.chr=>667,222.chr=>667,223.chr=>611,224.chr=>556,225.chr=>556,226.chr=>556,227.chr=>556,228.chr=>556,229.chr=>556,230.chr=>889,231.chr=>500,232.chr=>556,233.chr=>556,234.chr=>556,235.chr=>556,236.chr=>278,237.chr=>278,238.chr=>278,239.chr=>278,240.chr=>556,241.chr=>556, + 242.chr=>556,243.chr=>556,244.chr=>556,245.chr=>556,246.chr=>556,247.chr=>584,248.chr=>611,249.chr=>556,250.chr=>556,251.chr=>556,252.chr=>556,253.chr=>500,254.chr=>556,255.chr=>500} +end \ No newline at end of file diff --git a/vendor/plugins/rfpdf/lib/fonts/old/.noencode b/vendor/plugins/rfpdf/lib/fonts/old/.noencode new file mode 100755 index 00000000..e69de29b diff --git a/vendor/plugins/rfpdf/lib/fonts/old/makefont/cp1250.map b/vendor/plugins/rfpdf/lib/fonts/old/makefont/cp1250.map new file mode 100755 index 00000000..ec110af0 --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/old/makefont/cp1250.map @@ -0,0 +1,251 @@ +!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 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!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 Euro +!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 quoteleft +!92 U+2019 quoteright +!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 space +!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 logicalnot +!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+00B7 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+0110 Dcroat +!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 Tcommaaccent +!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 dcroat +!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 tcommaaccent +!FF U+02D9 dotaccent diff --git a/vendor/plugins/rfpdf/lib/fonts/old/makefont/cp1251.map b/vendor/plugins/rfpdf/lib/fonts/old/makefont/cp1251.map new file mode 100755 index 00000000..de6a198d --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/old/makefont/cp1251.map @@ -0,0 +1,255 @@ +!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 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!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 afii10051 +!81 U+0403 afii10052 +!82 U+201A quotesinglbase +!83 U+0453 afii10100 +!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 afii10058 +!8B U+2039 guilsinglleft +!8C U+040A afii10059 +!8D U+040C afii10061 +!8E U+040B afii10060 +!8F U+040F afii10145 +!90 U+0452 afii10099 +!91 U+2018 quoteleft +!92 U+2019 quoteright +!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 afii10106 +!9B U+203A guilsinglright +!9C U+045A afii10107 +!9D U+045C afii10109 +!9E U+045B afii10108 +!9F U+045F afii10193 +!A0 U+00A0 space +!A1 U+040E afii10062 +!A2 U+045E afii10110 +!A3 U+0408 afii10057 +!A4 U+00A4 currency +!A5 U+0490 afii10050 +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+0401 afii10023 +!A9 U+00A9 copyright +!AA U+0404 afii10053 +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+0407 afii10056 +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+0406 afii10055 +!B3 U+0456 afii10103 +!B4 U+0491 afii10098 +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+0451 afii10071 +!B9 U+2116 afii61352 +!BA U+0454 afii10101 +!BB U+00BB guillemotright +!BC U+0458 afii10105 +!BD U+0405 afii10054 +!BE U+0455 afii10102 +!BF U+0457 afii10104 +!C0 U+0410 afii10017 +!C1 U+0411 afii10018 +!C2 U+0412 afii10019 +!C3 U+0413 afii10020 +!C4 U+0414 afii10021 +!C5 U+0415 afii10022 +!C6 U+0416 afii10024 +!C7 U+0417 afii10025 +!C8 U+0418 afii10026 +!C9 U+0419 afii10027 +!CA U+041A afii10028 +!CB U+041B afii10029 +!CC U+041C afii10030 +!CD U+041D afii10031 +!CE U+041E afii10032 +!CF U+041F afii10033 +!D0 U+0420 afii10034 +!D1 U+0421 afii10035 +!D2 U+0422 afii10036 +!D3 U+0423 afii10037 +!D4 U+0424 afii10038 +!D5 U+0425 afii10039 +!D6 U+0426 afii10040 +!D7 U+0427 afii10041 +!D8 U+0428 afii10042 +!D9 U+0429 afii10043 +!DA U+042A afii10044 +!DB U+042B afii10045 +!DC U+042C afii10046 +!DD U+042D afii10047 +!DE U+042E afii10048 +!DF U+042F afii10049 +!E0 U+0430 afii10065 +!E1 U+0431 afii10066 +!E2 U+0432 afii10067 +!E3 U+0433 afii10068 +!E4 U+0434 afii10069 +!E5 U+0435 afii10070 +!E6 U+0436 afii10072 +!E7 U+0437 afii10073 +!E8 U+0438 afii10074 +!E9 U+0439 afii10075 +!EA U+043A afii10076 +!EB U+043B afii10077 +!EC U+043C afii10078 +!ED U+043D afii10079 +!EE U+043E afii10080 +!EF U+043F afii10081 +!F0 U+0440 afii10082 +!F1 U+0441 afii10083 +!F2 U+0442 afii10084 +!F3 U+0443 afii10085 +!F4 U+0444 afii10086 +!F5 U+0445 afii10087 +!F6 U+0446 afii10088 +!F7 U+0447 afii10089 +!F8 U+0448 afii10090 +!F9 U+0449 afii10091 +!FA U+044A afii10092 +!FB U+044B afii10093 +!FC U+044C afii10094 +!FD U+044D afii10095 +!FE U+044E afii10096 +!FF U+044F afii10097 diff --git a/vendor/plugins/rfpdf/lib/fonts/old/makefont/cp1252.map b/vendor/plugins/rfpdf/lib/fonts/old/makefont/cp1252.map new file mode 100755 index 00000000..dd490e59 --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/old/makefont/cp1252.map @@ -0,0 +1,251 @@ +!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 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!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 Euro +!82 U+201A quotesinglbase +!83 U+0192 florin +!84 U+201E quotedblbase +!85 U+2026 ellipsis +!86 U+2020 dagger +!87 U+2021 daggerdbl +!88 U+02C6 circumflex +!89 U+2030 perthousand +!8A U+0160 Scaron +!8B U+2039 guilsinglleft +!8C U+0152 OE +!8E U+017D Zcaron +!91 U+2018 quoteleft +!92 U+2019 quoteright +!93 U+201C quotedblleft +!94 U+201D quotedblright +!95 U+2022 bullet +!96 U+2013 endash +!97 U+2014 emdash +!98 U+02DC tilde +!99 U+2122 trademark +!9A U+0161 scaron +!9B U+203A guilsinglright +!9C U+0153 oe +!9E U+017E zcaron +!9F U+0178 Ydieresis +!A0 U+00A0 space +!A1 U+00A1 exclamdown +!A2 U+00A2 cent +!A3 U+00A3 sterling +!A4 U+00A4 currency +!A5 U+00A5 yen +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+00A9 copyright +!AA U+00AA ordfeminine +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+00AF macron +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+00B4 acute +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+00B8 cedilla +!B9 U+00B9 onesuperior +!BA U+00BA ordmasculine +!BB U+00BB guillemotright +!BC U+00BC onequarter +!BD U+00BD onehalf +!BE U+00BE threequarters +!BF U+00BF questiondown +!C0 U+00C0 Agrave +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+00C3 Atilde +!C4 U+00C4 Adieresis +!C5 U+00C5 Aring +!C6 U+00C6 AE +!C7 U+00C7 Ccedilla +!C8 U+00C8 Egrave +!C9 U+00C9 Eacute +!CA U+00CA Ecircumflex +!CB U+00CB Edieresis +!CC U+00CC Igrave +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+00CF Idieresis +!D0 U+00D0 Eth +!D1 U+00D1 Ntilde +!D2 U+00D2 Ograve +!D3 U+00D3 Oacute +!D4 U+00D4 Ocircumflex +!D5 U+00D5 Otilde +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+00D8 Oslash +!D9 U+00D9 Ugrave +!DA U+00DA Uacute +!DB U+00DB Ucircumflex +!DC U+00DC Udieresis +!DD U+00DD Yacute +!DE U+00DE Thorn +!DF U+00DF germandbls +!E0 U+00E0 agrave +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+00E3 atilde +!E4 U+00E4 adieresis +!E5 U+00E5 aring +!E6 U+00E6 ae +!E7 U+00E7 ccedilla +!E8 U+00E8 egrave +!E9 U+00E9 eacute +!EA U+00EA ecircumflex +!EB U+00EB edieresis +!EC U+00EC igrave +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+00EF idieresis +!F0 U+00F0 eth +!F1 U+00F1 ntilde +!F2 U+00F2 ograve +!F3 U+00F3 oacute +!F4 U+00F4 ocircumflex +!F5 U+00F5 otilde +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+00F8 oslash +!F9 U+00F9 ugrave +!FA U+00FA uacute +!FB U+00FB ucircumflex +!FC U+00FC udieresis +!FD U+00FD yacute +!FE U+00FE thorn +!FF U+00FF ydieresis diff --git a/vendor/plugins/rfpdf/lib/fonts/old/makefont/cp1253.map b/vendor/plugins/rfpdf/lib/fonts/old/makefont/cp1253.map new file mode 100755 index 00000000..4bd826fb --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/old/makefont/cp1253.map @@ -0,0 +1,239 @@ +!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 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!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 Euro +!82 U+201A quotesinglbase +!83 U+0192 florin +!84 U+201E quotedblbase +!85 U+2026 ellipsis +!86 U+2020 dagger +!87 U+2021 daggerdbl +!89 U+2030 perthousand +!8B U+2039 guilsinglleft +!91 U+2018 quoteleft +!92 U+2019 quoteright +!93 U+201C quotedblleft +!94 U+201D quotedblright +!95 U+2022 bullet +!96 U+2013 endash +!97 U+2014 emdash +!99 U+2122 trademark +!9B U+203A guilsinglright +!A0 U+00A0 space +!A1 U+0385 dieresistonos +!A2 U+0386 Alphatonos +!A3 U+00A3 sterling +!A4 U+00A4 currency +!A5 U+00A5 yen +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+00A9 copyright +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+2015 afii00208 +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+0384 tonos +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+0388 Epsilontonos +!B9 U+0389 Etatonos +!BA U+038A Iotatonos +!BB U+00BB guillemotright +!BC U+038C Omicrontonos +!BD U+00BD onehalf +!BE U+038E Upsilontonos +!BF U+038F Omegatonos +!C0 U+0390 iotadieresistonos +!C1 U+0391 Alpha +!C2 U+0392 Beta +!C3 U+0393 Gamma +!C4 U+0394 Delta +!C5 U+0395 Epsilon +!C6 U+0396 Zeta +!C7 U+0397 Eta +!C8 U+0398 Theta +!C9 U+0399 Iota +!CA U+039A Kappa +!CB U+039B Lambda +!CC U+039C Mu +!CD U+039D Nu +!CE U+039E Xi +!CF U+039F Omicron +!D0 U+03A0 Pi +!D1 U+03A1 Rho +!D3 U+03A3 Sigma +!D4 U+03A4 Tau +!D5 U+03A5 Upsilon +!D6 U+03A6 Phi +!D7 U+03A7 Chi +!D8 U+03A8 Psi +!D9 U+03A9 Omega +!DA U+03AA Iotadieresis +!DB U+03AB Upsilondieresis +!DC U+03AC alphatonos +!DD U+03AD epsilontonos +!DE U+03AE etatonos +!DF U+03AF iotatonos +!E0 U+03B0 upsilondieresistonos +!E1 U+03B1 alpha +!E2 U+03B2 beta +!E3 U+03B3 gamma +!E4 U+03B4 delta +!E5 U+03B5 epsilon +!E6 U+03B6 zeta +!E7 U+03B7 eta +!E8 U+03B8 theta +!E9 U+03B9 iota +!EA U+03BA kappa +!EB U+03BB lambda +!EC U+03BC mu +!ED U+03BD nu +!EE U+03BE xi +!EF U+03BF omicron +!F0 U+03C0 pi +!F1 U+03C1 rho +!F2 U+03C2 sigma1 +!F3 U+03C3 sigma +!F4 U+03C4 tau +!F5 U+03C5 upsilon +!F6 U+03C6 phi +!F7 U+03C7 chi +!F8 U+03C8 psi +!F9 U+03C9 omega +!FA U+03CA iotadieresis +!FB U+03CB upsilondieresis +!FC U+03CC omicrontonos +!FD U+03CD upsilontonos +!FE U+03CE omegatonos diff --git a/vendor/plugins/rfpdf/lib/fonts/old/makefont/cp1254.map b/vendor/plugins/rfpdf/lib/fonts/old/makefont/cp1254.map new file mode 100755 index 00000000..829473b2 --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/old/makefont/cp1254.map @@ -0,0 +1,249 @@ +!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 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!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 Euro +!82 U+201A quotesinglbase +!83 U+0192 florin +!84 U+201E quotedblbase +!85 U+2026 ellipsis +!86 U+2020 dagger +!87 U+2021 daggerdbl +!88 U+02C6 circumflex +!89 U+2030 perthousand +!8A U+0160 Scaron +!8B U+2039 guilsinglleft +!8C U+0152 OE +!91 U+2018 quoteleft +!92 U+2019 quoteright +!93 U+201C quotedblleft +!94 U+201D quotedblright +!95 U+2022 bullet +!96 U+2013 endash +!97 U+2014 emdash +!98 U+02DC tilde +!99 U+2122 trademark +!9A U+0161 scaron +!9B U+203A guilsinglright +!9C U+0153 oe +!9F U+0178 Ydieresis +!A0 U+00A0 space +!A1 U+00A1 exclamdown +!A2 U+00A2 cent +!A3 U+00A3 sterling +!A4 U+00A4 currency +!A5 U+00A5 yen +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+00A9 copyright +!AA U+00AA ordfeminine +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+00AF macron +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+00B4 acute +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+00B8 cedilla +!B9 U+00B9 onesuperior +!BA U+00BA ordmasculine +!BB U+00BB guillemotright +!BC U+00BC onequarter +!BD U+00BD onehalf +!BE U+00BE threequarters +!BF U+00BF questiondown +!C0 U+00C0 Agrave +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+00C3 Atilde +!C4 U+00C4 Adieresis +!C5 U+00C5 Aring +!C6 U+00C6 AE +!C7 U+00C7 Ccedilla +!C8 U+00C8 Egrave +!C9 U+00C9 Eacute +!CA U+00CA Ecircumflex +!CB U+00CB Edieresis +!CC U+00CC Igrave +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+00CF Idieresis +!D0 U+011E Gbreve +!D1 U+00D1 Ntilde +!D2 U+00D2 Ograve +!D3 U+00D3 Oacute +!D4 U+00D4 Ocircumflex +!D5 U+00D5 Otilde +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+00D8 Oslash +!D9 U+00D9 Ugrave +!DA U+00DA Uacute +!DB U+00DB Ucircumflex +!DC U+00DC Udieresis +!DD U+0130 Idotaccent +!DE U+015E Scedilla +!DF U+00DF germandbls +!E0 U+00E0 agrave +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+00E3 atilde +!E4 U+00E4 adieresis +!E5 U+00E5 aring +!E6 U+00E6 ae +!E7 U+00E7 ccedilla +!E8 U+00E8 egrave +!E9 U+00E9 eacute +!EA U+00EA ecircumflex +!EB U+00EB edieresis +!EC U+00EC igrave +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+00EF idieresis +!F0 U+011F gbreve +!F1 U+00F1 ntilde +!F2 U+00F2 ograve +!F3 U+00F3 oacute +!F4 U+00F4 ocircumflex +!F5 U+00F5 otilde +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+00F8 oslash +!F9 U+00F9 ugrave +!FA U+00FA uacute +!FB U+00FB ucircumflex +!FC U+00FC udieresis +!FD U+0131 dotlessi +!FE U+015F scedilla +!FF U+00FF ydieresis diff --git a/vendor/plugins/rfpdf/lib/fonts/old/makefont/cp1255.map b/vendor/plugins/rfpdf/lib/fonts/old/makefont/cp1255.map new file mode 100755 index 00000000..079e10c6 --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/old/makefont/cp1255.map @@ -0,0 +1,233 @@ +!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 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!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 Euro +!82 U+201A quotesinglbase +!83 U+0192 florin +!84 U+201E quotedblbase +!85 U+2026 ellipsis +!86 U+2020 dagger +!87 U+2021 daggerdbl +!88 U+02C6 circumflex +!89 U+2030 perthousand +!8B U+2039 guilsinglleft +!91 U+2018 quoteleft +!92 U+2019 quoteright +!93 U+201C quotedblleft +!94 U+201D quotedblright +!95 U+2022 bullet +!96 U+2013 endash +!97 U+2014 emdash +!98 U+02DC tilde +!99 U+2122 trademark +!9B U+203A guilsinglright +!A0 U+00A0 space +!A1 U+00A1 exclamdown +!A2 U+00A2 cent +!A3 U+00A3 sterling +!A4 U+20AA afii57636 +!A5 U+00A5 yen +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+00A9 copyright +!AA U+00D7 multiply +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD sfthyphen +!AE U+00AE registered +!AF U+00AF macron +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+00B4 acute +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 middot +!B8 U+00B8 cedilla +!B9 U+00B9 onesuperior +!BA U+00F7 divide +!BB U+00BB guillemotright +!BC U+00BC onequarter +!BD U+00BD onehalf +!BE U+00BE threequarters +!BF U+00BF questiondown +!C0 U+05B0 afii57799 +!C1 U+05B1 afii57801 +!C2 U+05B2 afii57800 +!C3 U+05B3 afii57802 +!C4 U+05B4 afii57793 +!C5 U+05B5 afii57794 +!C6 U+05B6 afii57795 +!C7 U+05B7 afii57798 +!C8 U+05B8 afii57797 +!C9 U+05B9 afii57806 +!CB U+05BB afii57796 +!CC U+05BC afii57807 +!CD U+05BD afii57839 +!CE U+05BE afii57645 +!CF U+05BF afii57841 +!D0 U+05C0 afii57842 +!D1 U+05C1 afii57804 +!D2 U+05C2 afii57803 +!D3 U+05C3 afii57658 +!D4 U+05F0 afii57716 +!D5 U+05F1 afii57717 +!D6 U+05F2 afii57718 +!D7 U+05F3 gereshhebrew +!D8 U+05F4 gershayimhebrew +!E0 U+05D0 afii57664 +!E1 U+05D1 afii57665 +!E2 U+05D2 afii57666 +!E3 U+05D3 afii57667 +!E4 U+05D4 afii57668 +!E5 U+05D5 afii57669 +!E6 U+05D6 afii57670 +!E7 U+05D7 afii57671 +!E8 U+05D8 afii57672 +!E9 U+05D9 afii57673 +!EA U+05DA afii57674 +!EB U+05DB afii57675 +!EC U+05DC afii57676 +!ED U+05DD afii57677 +!EE U+05DE afii57678 +!EF U+05DF afii57679 +!F0 U+05E0 afii57680 +!F1 U+05E1 afii57681 +!F2 U+05E2 afii57682 +!F3 U+05E3 afii57683 +!F4 U+05E4 afii57684 +!F5 U+05E5 afii57685 +!F6 U+05E6 afii57686 +!F7 U+05E7 afii57687 +!F8 U+05E8 afii57688 +!F9 U+05E9 afii57689 +!FA U+05EA afii57690 +!FD U+200E afii299 +!FE U+200F afii300 diff --git a/vendor/plugins/rfpdf/lib/fonts/old/makefont/cp1257.map b/vendor/plugins/rfpdf/lib/fonts/old/makefont/cp1257.map new file mode 100755 index 00000000..2f2ecfa2 --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/old/makefont/cp1257.map @@ -0,0 +1,244 @@ +!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 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!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 Euro +!82 U+201A quotesinglbase +!84 U+201E quotedblbase +!85 U+2026 ellipsis +!86 U+2020 dagger +!87 U+2021 daggerdbl +!89 U+2030 perthousand +!8B U+2039 guilsinglleft +!8D U+00A8 dieresis +!8E U+02C7 caron +!8F U+00B8 cedilla +!91 U+2018 quoteleft +!92 U+2019 quoteright +!93 U+201C quotedblleft +!94 U+201D quotedblright +!95 U+2022 bullet +!96 U+2013 endash +!97 U+2014 emdash +!99 U+2122 trademark +!9B U+203A guilsinglright +!9D U+00AF macron +!9E U+02DB ogonek +!A0 U+00A0 space +!A2 U+00A2 cent +!A3 U+00A3 sterling +!A4 U+00A4 currency +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00D8 Oslash +!A9 U+00A9 copyright +!AA U+0156 Rcommaaccent +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+00C6 AE +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+00B4 acute +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+00F8 oslash +!B9 U+00B9 onesuperior +!BA U+0157 rcommaaccent +!BB U+00BB guillemotright +!BC U+00BC onequarter +!BD U+00BD onehalf +!BE U+00BE threequarters +!BF U+00E6 ae +!C0 U+0104 Aogonek +!C1 U+012E Iogonek +!C2 U+0100 Amacron +!C3 U+0106 Cacute +!C4 U+00C4 Adieresis +!C5 U+00C5 Aring +!C6 U+0118 Eogonek +!C7 U+0112 Emacron +!C8 U+010C Ccaron +!C9 U+00C9 Eacute +!CA U+0179 Zacute +!CB U+0116 Edotaccent +!CC U+0122 Gcommaaccent +!CD U+0136 Kcommaaccent +!CE U+012A Imacron +!CF U+013B Lcommaaccent +!D0 U+0160 Scaron +!D1 U+0143 Nacute +!D2 U+0145 Ncommaaccent +!D3 U+00D3 Oacute +!D4 U+014C Omacron +!D5 U+00D5 Otilde +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+0172 Uogonek +!D9 U+0141 Lslash +!DA U+015A Sacute +!DB U+016A Umacron +!DC U+00DC Udieresis +!DD U+017B Zdotaccent +!DE U+017D Zcaron +!DF U+00DF germandbls +!E0 U+0105 aogonek +!E1 U+012F iogonek +!E2 U+0101 amacron +!E3 U+0107 cacute +!E4 U+00E4 adieresis +!E5 U+00E5 aring +!E6 U+0119 eogonek +!E7 U+0113 emacron +!E8 U+010D ccaron +!E9 U+00E9 eacute +!EA U+017A zacute +!EB U+0117 edotaccent +!EC U+0123 gcommaaccent +!ED U+0137 kcommaaccent +!EE U+012B imacron +!EF U+013C lcommaaccent +!F0 U+0161 scaron +!F1 U+0144 nacute +!F2 U+0146 ncommaaccent +!F3 U+00F3 oacute +!F4 U+014D omacron +!F5 U+00F5 otilde +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+0173 uogonek +!F9 U+0142 lslash +!FA U+015B sacute +!FB U+016B umacron +!FC U+00FC udieresis +!FD U+017C zdotaccent +!FE U+017E zcaron +!FF U+02D9 dotaccent diff --git a/vendor/plugins/rfpdf/lib/fonts/old/makefont/cp1258.map b/vendor/plugins/rfpdf/lib/fonts/old/makefont/cp1258.map new file mode 100755 index 00000000..fed915f7 --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/old/makefont/cp1258.map @@ -0,0 +1,247 @@ +!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 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!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 Euro +!82 U+201A quotesinglbase +!83 U+0192 florin +!84 U+201E quotedblbase +!85 U+2026 ellipsis +!86 U+2020 dagger +!87 U+2021 daggerdbl +!88 U+02C6 circumflex +!89 U+2030 perthousand +!8B U+2039 guilsinglleft +!8C U+0152 OE +!91 U+2018 quoteleft +!92 U+2019 quoteright +!93 U+201C quotedblleft +!94 U+201D quotedblright +!95 U+2022 bullet +!96 U+2013 endash +!97 U+2014 emdash +!98 U+02DC tilde +!99 U+2122 trademark +!9B U+203A guilsinglright +!9C U+0153 oe +!9F U+0178 Ydieresis +!A0 U+00A0 space +!A1 U+00A1 exclamdown +!A2 U+00A2 cent +!A3 U+00A3 sterling +!A4 U+00A4 currency +!A5 U+00A5 yen +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+00A9 copyright +!AA U+00AA ordfeminine +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+00AF macron +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+00B4 acute +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+00B8 cedilla +!B9 U+00B9 onesuperior +!BA U+00BA ordmasculine +!BB U+00BB guillemotright +!BC U+00BC onequarter +!BD U+00BD onehalf +!BE U+00BE threequarters +!BF U+00BF questiondown +!C0 U+00C0 Agrave +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+0102 Abreve +!C4 U+00C4 Adieresis +!C5 U+00C5 Aring +!C6 U+00C6 AE +!C7 U+00C7 Ccedilla +!C8 U+00C8 Egrave +!C9 U+00C9 Eacute +!CA U+00CA Ecircumflex +!CB U+00CB Edieresis +!CC U+0300 gravecomb +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+00CF Idieresis +!D0 U+0110 Dcroat +!D1 U+00D1 Ntilde +!D2 U+0309 hookabovecomb +!D3 U+00D3 Oacute +!D4 U+00D4 Ocircumflex +!D5 U+01A0 Ohorn +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+00D8 Oslash +!D9 U+00D9 Ugrave +!DA U+00DA Uacute +!DB U+00DB Ucircumflex +!DC U+00DC Udieresis +!DD U+01AF Uhorn +!DE U+0303 tildecomb +!DF U+00DF germandbls +!E0 U+00E0 agrave +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+0103 abreve +!E4 U+00E4 adieresis +!E5 U+00E5 aring +!E6 U+00E6 ae +!E7 U+00E7 ccedilla +!E8 U+00E8 egrave +!E9 U+00E9 eacute +!EA U+00EA ecircumflex +!EB U+00EB edieresis +!EC U+0301 acutecomb +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+00EF idieresis +!F0 U+0111 dcroat +!F1 U+00F1 ntilde +!F2 U+0323 dotbelowcomb +!F3 U+00F3 oacute +!F4 U+00F4 ocircumflex +!F5 U+01A1 ohorn +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+00F8 oslash +!F9 U+00F9 ugrave +!FA U+00FA uacute +!FB U+00FB ucircumflex +!FC U+00FC udieresis +!FD U+01B0 uhorn +!FE U+20AB dong +!FF U+00FF ydieresis diff --git a/vendor/plugins/rfpdf/lib/fonts/old/makefont/cp874.map b/vendor/plugins/rfpdf/lib/fonts/old/makefont/cp874.map new file mode 100755 index 00000000..1006e6b1 --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/old/makefont/cp874.map @@ -0,0 +1,225 @@ +!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 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!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 Euro +!85 U+2026 ellipsis +!91 U+2018 quoteleft +!92 U+2019 quoteright +!93 U+201C quotedblleft +!94 U+201D quotedblright +!95 U+2022 bullet +!96 U+2013 endash +!97 U+2014 emdash +!A0 U+00A0 space +!A1 U+0E01 kokaithai +!A2 U+0E02 khokhaithai +!A3 U+0E03 khokhuatthai +!A4 U+0E04 khokhwaithai +!A5 U+0E05 khokhonthai +!A6 U+0E06 khorakhangthai +!A7 U+0E07 ngonguthai +!A8 U+0E08 chochanthai +!A9 U+0E09 chochingthai +!AA U+0E0A chochangthai +!AB U+0E0B sosothai +!AC U+0E0C chochoethai +!AD U+0E0D yoyingthai +!AE U+0E0E dochadathai +!AF U+0E0F topatakthai +!B0 U+0E10 thothanthai +!B1 U+0E11 thonangmonthothai +!B2 U+0E12 thophuthaothai +!B3 U+0E13 nonenthai +!B4 U+0E14 dodekthai +!B5 U+0E15 totaothai +!B6 U+0E16 thothungthai +!B7 U+0E17 thothahanthai +!B8 U+0E18 thothongthai +!B9 U+0E19 nonuthai +!BA U+0E1A bobaimaithai +!BB U+0E1B poplathai +!BC U+0E1C phophungthai +!BD U+0E1D fofathai +!BE U+0E1E phophanthai +!BF U+0E1F fofanthai +!C0 U+0E20 phosamphaothai +!C1 U+0E21 momathai +!C2 U+0E22 yoyakthai +!C3 U+0E23 roruathai +!C4 U+0E24 ruthai +!C5 U+0E25 lolingthai +!C6 U+0E26 luthai +!C7 U+0E27 wowaenthai +!C8 U+0E28 sosalathai +!C9 U+0E29 sorusithai +!CA U+0E2A sosuathai +!CB U+0E2B hohipthai +!CC U+0E2C lochulathai +!CD U+0E2D oangthai +!CE U+0E2E honokhukthai +!CF U+0E2F paiyannoithai +!D0 U+0E30 saraathai +!D1 U+0E31 maihanakatthai +!D2 U+0E32 saraaathai +!D3 U+0E33 saraamthai +!D4 U+0E34 saraithai +!D5 U+0E35 saraiithai +!D6 U+0E36 sarauethai +!D7 U+0E37 saraueethai +!D8 U+0E38 sarauthai +!D9 U+0E39 sarauuthai +!DA U+0E3A phinthuthai +!DF U+0E3F bahtthai +!E0 U+0E40 saraethai +!E1 U+0E41 saraaethai +!E2 U+0E42 saraothai +!E3 U+0E43 saraaimaimuanthai +!E4 U+0E44 saraaimaimalaithai +!E5 U+0E45 lakkhangyaothai +!E6 U+0E46 maiyamokthai +!E7 U+0E47 maitaikhuthai +!E8 U+0E48 maiekthai +!E9 U+0E49 maithothai +!EA U+0E4A maitrithai +!EB U+0E4B maichattawathai +!EC U+0E4C thanthakhatthai +!ED U+0E4D nikhahitthai +!EE U+0E4E yamakkanthai +!EF U+0E4F fongmanthai +!F0 U+0E50 zerothai +!F1 U+0E51 onethai +!F2 U+0E52 twothai +!F3 U+0E53 threethai +!F4 U+0E54 fourthai +!F5 U+0E55 fivethai +!F6 U+0E56 sixthai +!F7 U+0E57 seventhai +!F8 U+0E58 eightthai +!F9 U+0E59 ninethai +!FA U+0E5A angkhankhuthai +!FB U+0E5B khomutthai diff --git a/vendor/plugins/rfpdf/lib/fonts/old/makefont/iso-8859-1.map b/vendor/plugins/rfpdf/lib/fonts/old/makefont/iso-8859-1.map new file mode 100755 index 00000000..61740a38 --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/old/makefont/iso-8859-1.map @@ -0,0 +1,256 @@ +!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 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!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+0080 .notdef +!81 U+0081 .notdef +!82 U+0082 .notdef +!83 U+0083 .notdef +!84 U+0084 .notdef +!85 U+0085 .notdef +!86 U+0086 .notdef +!87 U+0087 .notdef +!88 U+0088 .notdef +!89 U+0089 .notdef +!8A U+008A .notdef +!8B U+008B .notdef +!8C U+008C .notdef +!8D U+008D .notdef +!8E U+008E .notdef +!8F U+008F .notdef +!90 U+0090 .notdef +!91 U+0091 .notdef +!92 U+0092 .notdef +!93 U+0093 .notdef +!94 U+0094 .notdef +!95 U+0095 .notdef +!96 U+0096 .notdef +!97 U+0097 .notdef +!98 U+0098 .notdef +!99 U+0099 .notdef +!9A U+009A .notdef +!9B U+009B .notdef +!9C U+009C .notdef +!9D U+009D .notdef +!9E U+009E .notdef +!9F U+009F .notdef +!A0 U+00A0 space +!A1 U+00A1 exclamdown +!A2 U+00A2 cent +!A3 U+00A3 sterling +!A4 U+00A4 currency +!A5 U+00A5 yen +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+00A9 copyright +!AA U+00AA ordfeminine +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+00AF macron +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+00B4 acute +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+00B8 cedilla +!B9 U+00B9 onesuperior +!BA U+00BA ordmasculine +!BB U+00BB guillemotright +!BC U+00BC onequarter +!BD U+00BD onehalf +!BE U+00BE threequarters +!BF U+00BF questiondown +!C0 U+00C0 Agrave +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+00C3 Atilde +!C4 U+00C4 Adieresis +!C5 U+00C5 Aring +!C6 U+00C6 AE +!C7 U+00C7 Ccedilla +!C8 U+00C8 Egrave +!C9 U+00C9 Eacute +!CA U+00CA Ecircumflex +!CB U+00CB Edieresis +!CC U+00CC Igrave +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+00CF Idieresis +!D0 U+00D0 Eth +!D1 U+00D1 Ntilde +!D2 U+00D2 Ograve +!D3 U+00D3 Oacute +!D4 U+00D4 Ocircumflex +!D5 U+00D5 Otilde +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+00D8 Oslash +!D9 U+00D9 Ugrave +!DA U+00DA Uacute +!DB U+00DB Ucircumflex +!DC U+00DC Udieresis +!DD U+00DD Yacute +!DE U+00DE Thorn +!DF U+00DF germandbls +!E0 U+00E0 agrave +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+00E3 atilde +!E4 U+00E4 adieresis +!E5 U+00E5 aring +!E6 U+00E6 ae +!E7 U+00E7 ccedilla +!E8 U+00E8 egrave +!E9 U+00E9 eacute +!EA U+00EA ecircumflex +!EB U+00EB edieresis +!EC U+00EC igrave +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+00EF idieresis +!F0 U+00F0 eth +!F1 U+00F1 ntilde +!F2 U+00F2 ograve +!F3 U+00F3 oacute +!F4 U+00F4 ocircumflex +!F5 U+00F5 otilde +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+00F8 oslash +!F9 U+00F9 ugrave +!FA U+00FA uacute +!FB U+00FB ucircumflex +!FC U+00FC udieresis +!FD U+00FD yacute +!FE U+00FE thorn +!FF U+00FF ydieresis diff --git a/vendor/plugins/rfpdf/lib/fonts/old/makefont/iso-8859-11.map b/vendor/plugins/rfpdf/lib/fonts/old/makefont/iso-8859-11.map new file mode 100755 index 00000000..91688120 --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/old/makefont/iso-8859-11.map @@ -0,0 +1,248 @@ +!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 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!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+0080 .notdef +!81 U+0081 .notdef +!82 U+0082 .notdef +!83 U+0083 .notdef +!84 U+0084 .notdef +!85 U+0085 .notdef +!86 U+0086 .notdef +!87 U+0087 .notdef +!88 U+0088 .notdef +!89 U+0089 .notdef +!8A U+008A .notdef +!8B U+008B .notdef +!8C U+008C .notdef +!8D U+008D .notdef +!8E U+008E .notdef +!8F U+008F .notdef +!90 U+0090 .notdef +!91 U+0091 .notdef +!92 U+0092 .notdef +!93 U+0093 .notdef +!94 U+0094 .notdef +!95 U+0095 .notdef +!96 U+0096 .notdef +!97 U+0097 .notdef +!98 U+0098 .notdef +!99 U+0099 .notdef +!9A U+009A .notdef +!9B U+009B .notdef +!9C U+009C .notdef +!9D U+009D .notdef +!9E U+009E .notdef +!9F U+009F .notdef +!A0 U+00A0 space +!A1 U+0E01 kokaithai +!A2 U+0E02 khokhaithai +!A3 U+0E03 khokhuatthai +!A4 U+0E04 khokhwaithai +!A5 U+0E05 khokhonthai +!A6 U+0E06 khorakhangthai +!A7 U+0E07 ngonguthai +!A8 U+0E08 chochanthai +!A9 U+0E09 chochingthai +!AA U+0E0A chochangthai +!AB U+0E0B sosothai +!AC U+0E0C chochoethai +!AD U+0E0D yoyingthai +!AE U+0E0E dochadathai +!AF U+0E0F topatakthai +!B0 U+0E10 thothanthai +!B1 U+0E11 thonangmonthothai +!B2 U+0E12 thophuthaothai +!B3 U+0E13 nonenthai +!B4 U+0E14 dodekthai +!B5 U+0E15 totaothai +!B6 U+0E16 thothungthai +!B7 U+0E17 thothahanthai +!B8 U+0E18 thothongthai +!B9 U+0E19 nonuthai +!BA U+0E1A bobaimaithai +!BB U+0E1B poplathai +!BC U+0E1C phophungthai +!BD U+0E1D fofathai +!BE U+0E1E phophanthai +!BF U+0E1F fofanthai +!C0 U+0E20 phosamphaothai +!C1 U+0E21 momathai +!C2 U+0E22 yoyakthai +!C3 U+0E23 roruathai +!C4 U+0E24 ruthai +!C5 U+0E25 lolingthai +!C6 U+0E26 luthai +!C7 U+0E27 wowaenthai +!C8 U+0E28 sosalathai +!C9 U+0E29 sorusithai +!CA U+0E2A sosuathai +!CB U+0E2B hohipthai +!CC U+0E2C lochulathai +!CD U+0E2D oangthai +!CE U+0E2E honokhukthai +!CF U+0E2F paiyannoithai +!D0 U+0E30 saraathai +!D1 U+0E31 maihanakatthai +!D2 U+0E32 saraaathai +!D3 U+0E33 saraamthai +!D4 U+0E34 saraithai +!D5 U+0E35 saraiithai +!D6 U+0E36 sarauethai +!D7 U+0E37 saraueethai +!D8 U+0E38 sarauthai +!D9 U+0E39 sarauuthai +!DA U+0E3A phinthuthai +!DF U+0E3F bahtthai +!E0 U+0E40 saraethai +!E1 U+0E41 saraaethai +!E2 U+0E42 saraothai +!E3 U+0E43 saraaimaimuanthai +!E4 U+0E44 saraaimaimalaithai +!E5 U+0E45 lakkhangyaothai +!E6 U+0E46 maiyamokthai +!E7 U+0E47 maitaikhuthai +!E8 U+0E48 maiekthai +!E9 U+0E49 maithothai +!EA U+0E4A maitrithai +!EB U+0E4B maichattawathai +!EC U+0E4C thanthakhatthai +!ED U+0E4D nikhahitthai +!EE U+0E4E yamakkanthai +!EF U+0E4F fongmanthai +!F0 U+0E50 zerothai +!F1 U+0E51 onethai +!F2 U+0E52 twothai +!F3 U+0E53 threethai +!F4 U+0E54 fourthai +!F5 U+0E55 fivethai +!F6 U+0E56 sixthai +!F7 U+0E57 seventhai +!F8 U+0E58 eightthai +!F9 U+0E59 ninethai +!FA U+0E5A angkhankhuthai +!FB U+0E5B khomutthai diff --git a/vendor/plugins/rfpdf/lib/fonts/old/makefont/iso-8859-15.map b/vendor/plugins/rfpdf/lib/fonts/old/makefont/iso-8859-15.map new file mode 100755 index 00000000..6c2b5712 --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/old/makefont/iso-8859-15.map @@ -0,0 +1,256 @@ +!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 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!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+0080 .notdef +!81 U+0081 .notdef +!82 U+0082 .notdef +!83 U+0083 .notdef +!84 U+0084 .notdef +!85 U+0085 .notdef +!86 U+0086 .notdef +!87 U+0087 .notdef +!88 U+0088 .notdef +!89 U+0089 .notdef +!8A U+008A .notdef +!8B U+008B .notdef +!8C U+008C .notdef +!8D U+008D .notdef +!8E U+008E .notdef +!8F U+008F .notdef +!90 U+0090 .notdef +!91 U+0091 .notdef +!92 U+0092 .notdef +!93 U+0093 .notdef +!94 U+0094 .notdef +!95 U+0095 .notdef +!96 U+0096 .notdef +!97 U+0097 .notdef +!98 U+0098 .notdef +!99 U+0099 .notdef +!9A U+009A .notdef +!9B U+009B .notdef +!9C U+009C .notdef +!9D U+009D .notdef +!9E U+009E .notdef +!9F U+009F .notdef +!A0 U+00A0 space +!A1 U+00A1 exclamdown +!A2 U+00A2 cent +!A3 U+00A3 sterling +!A4 U+20AC Euro +!A5 U+00A5 yen +!A6 U+0160 Scaron +!A7 U+00A7 section +!A8 U+0161 scaron +!A9 U+00A9 copyright +!AA U+00AA ordfeminine +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+00AF macron +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+017D Zcaron +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+017E zcaron +!B9 U+00B9 onesuperior +!BA U+00BA ordmasculine +!BB U+00BB guillemotright +!BC U+0152 OE +!BD U+0153 oe +!BE U+0178 Ydieresis +!BF U+00BF questiondown +!C0 U+00C0 Agrave +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+00C3 Atilde +!C4 U+00C4 Adieresis +!C5 U+00C5 Aring +!C6 U+00C6 AE +!C7 U+00C7 Ccedilla +!C8 U+00C8 Egrave +!C9 U+00C9 Eacute +!CA U+00CA Ecircumflex +!CB U+00CB Edieresis +!CC U+00CC Igrave +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+00CF Idieresis +!D0 U+00D0 Eth +!D1 U+00D1 Ntilde +!D2 U+00D2 Ograve +!D3 U+00D3 Oacute +!D4 U+00D4 Ocircumflex +!D5 U+00D5 Otilde +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+00D8 Oslash +!D9 U+00D9 Ugrave +!DA U+00DA Uacute +!DB U+00DB Ucircumflex +!DC U+00DC Udieresis +!DD U+00DD Yacute +!DE U+00DE Thorn +!DF U+00DF germandbls +!E0 U+00E0 agrave +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+00E3 atilde +!E4 U+00E4 adieresis +!E5 U+00E5 aring +!E6 U+00E6 ae +!E7 U+00E7 ccedilla +!E8 U+00E8 egrave +!E9 U+00E9 eacute +!EA U+00EA ecircumflex +!EB U+00EB edieresis +!EC U+00EC igrave +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+00EF idieresis +!F0 U+00F0 eth +!F1 U+00F1 ntilde +!F2 U+00F2 ograve +!F3 U+00F3 oacute +!F4 U+00F4 ocircumflex +!F5 U+00F5 otilde +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+00F8 oslash +!F9 U+00F9 ugrave +!FA U+00FA uacute +!FB U+00FB ucircumflex +!FC U+00FC udieresis +!FD U+00FD yacute +!FE U+00FE thorn +!FF U+00FF ydieresis diff --git a/vendor/plugins/rfpdf/lib/fonts/old/makefont/iso-8859-16.map b/vendor/plugins/rfpdf/lib/fonts/old/makefont/iso-8859-16.map new file mode 100755 index 00000000..202c8fe5 --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/old/makefont/iso-8859-16.map @@ -0,0 +1,256 @@ +!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 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!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+0080 .notdef +!81 U+0081 .notdef +!82 U+0082 .notdef +!83 U+0083 .notdef +!84 U+0084 .notdef +!85 U+0085 .notdef +!86 U+0086 .notdef +!87 U+0087 .notdef +!88 U+0088 .notdef +!89 U+0089 .notdef +!8A U+008A .notdef +!8B U+008B .notdef +!8C U+008C .notdef +!8D U+008D .notdef +!8E U+008E .notdef +!8F U+008F .notdef +!90 U+0090 .notdef +!91 U+0091 .notdef +!92 U+0092 .notdef +!93 U+0093 .notdef +!94 U+0094 .notdef +!95 U+0095 .notdef +!96 U+0096 .notdef +!97 U+0097 .notdef +!98 U+0098 .notdef +!99 U+0099 .notdef +!9A U+009A .notdef +!9B U+009B .notdef +!9C U+009C .notdef +!9D U+009D .notdef +!9E U+009E .notdef +!9F U+009F .notdef +!A0 U+00A0 space +!A1 U+0104 Aogonek +!A2 U+0105 aogonek +!A3 U+0141 Lslash +!A4 U+20AC Euro +!A5 U+201E quotedblbase +!A6 U+0160 Scaron +!A7 U+00A7 section +!A8 U+0161 scaron +!A9 U+00A9 copyright +!AA U+0218 Scommaaccent +!AB U+00AB guillemotleft +!AC U+0179 Zacute +!AD U+00AD hyphen +!AE U+017A zacute +!AF U+017B Zdotaccent +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+010C Ccaron +!B3 U+0142 lslash +!B4 U+017D Zcaron +!B5 U+201D quotedblright +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+017E zcaron +!B9 U+010D ccaron +!BA U+0219 scommaaccent +!BB U+00BB guillemotright +!BC U+0152 OE +!BD U+0153 oe +!BE U+0178 Ydieresis +!BF U+017C zdotaccent +!C0 U+00C0 Agrave +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+0102 Abreve +!C4 U+00C4 Adieresis +!C5 U+0106 Cacute +!C6 U+00C6 AE +!C7 U+00C7 Ccedilla +!C8 U+00C8 Egrave +!C9 U+00C9 Eacute +!CA U+00CA Ecircumflex +!CB U+00CB Edieresis +!CC U+00CC Igrave +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+00CF Idieresis +!D0 U+0110 Dcroat +!D1 U+0143 Nacute +!D2 U+00D2 Ograve +!D3 U+00D3 Oacute +!D4 U+00D4 Ocircumflex +!D5 U+0150 Ohungarumlaut +!D6 U+00D6 Odieresis +!D7 U+015A Sacute +!D8 U+0170 Uhungarumlaut +!D9 U+00D9 Ugrave +!DA U+00DA Uacute +!DB U+00DB Ucircumflex +!DC U+00DC Udieresis +!DD U+0118 Eogonek +!DE U+021A Tcommaaccent +!DF U+00DF germandbls +!E0 U+00E0 agrave +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+0103 abreve +!E4 U+00E4 adieresis +!E5 U+0107 cacute +!E6 U+00E6 ae +!E7 U+00E7 ccedilla +!E8 U+00E8 egrave +!E9 U+00E9 eacute +!EA U+00EA ecircumflex +!EB U+00EB edieresis +!EC U+00EC igrave +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+00EF idieresis +!F0 U+0111 dcroat +!F1 U+0144 nacute +!F2 U+00F2 ograve +!F3 U+00F3 oacute +!F4 U+00F4 ocircumflex +!F5 U+0151 ohungarumlaut +!F6 U+00F6 odieresis +!F7 U+015B sacute +!F8 U+0171 uhungarumlaut +!F9 U+00F9 ugrave +!FA U+00FA uacute +!FB U+00FB ucircumflex +!FC U+00FC udieresis +!FD U+0119 eogonek +!FE U+021B tcommaaccent +!FF U+00FF ydieresis diff --git a/vendor/plugins/rfpdf/lib/fonts/old/makefont/iso-8859-2.map b/vendor/plugins/rfpdf/lib/fonts/old/makefont/iso-8859-2.map new file mode 100755 index 00000000..65ae09f9 --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/old/makefont/iso-8859-2.map @@ -0,0 +1,256 @@ +!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 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!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+0080 .notdef +!81 U+0081 .notdef +!82 U+0082 .notdef +!83 U+0083 .notdef +!84 U+0084 .notdef +!85 U+0085 .notdef +!86 U+0086 .notdef +!87 U+0087 .notdef +!88 U+0088 .notdef +!89 U+0089 .notdef +!8A U+008A .notdef +!8B U+008B .notdef +!8C U+008C .notdef +!8D U+008D .notdef +!8E U+008E .notdef +!8F U+008F .notdef +!90 U+0090 .notdef +!91 U+0091 .notdef +!92 U+0092 .notdef +!93 U+0093 .notdef +!94 U+0094 .notdef +!95 U+0095 .notdef +!96 U+0096 .notdef +!97 U+0097 .notdef +!98 U+0098 .notdef +!99 U+0099 .notdef +!9A U+009A .notdef +!9B U+009B .notdef +!9C U+009C .notdef +!9D U+009D .notdef +!9E U+009E .notdef +!9F U+009F .notdef +!A0 U+00A0 space +!A1 U+0104 Aogonek +!A2 U+02D8 breve +!A3 U+0141 Lslash +!A4 U+00A4 currency +!A5 U+013D Lcaron +!A6 U+015A Sacute +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+0160 Scaron +!AA U+015E Scedilla +!AB U+0164 Tcaron +!AC U+0179 Zacute +!AD U+00AD hyphen +!AE U+017D Zcaron +!AF U+017B Zdotaccent +!B0 U+00B0 degree +!B1 U+0105 aogonek +!B2 U+02DB ogonek +!B3 U+0142 lslash +!B4 U+00B4 acute +!B5 U+013E lcaron +!B6 U+015B sacute +!B7 U+02C7 caron +!B8 U+00B8 cedilla +!B9 U+0161 scaron +!BA U+015F scedilla +!BB U+0165 tcaron +!BC U+017A zacute +!BD U+02DD hungarumlaut +!BE U+017E zcaron +!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+0110 Dcroat +!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 Tcommaaccent +!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 dcroat +!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 tcommaaccent +!FF U+02D9 dotaccent diff --git a/vendor/plugins/rfpdf/lib/fonts/old/makefont/iso-8859-4.map b/vendor/plugins/rfpdf/lib/fonts/old/makefont/iso-8859-4.map new file mode 100755 index 00000000..a7d87bf3 --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/old/makefont/iso-8859-4.map @@ -0,0 +1,256 @@ +!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 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!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+0080 .notdef +!81 U+0081 .notdef +!82 U+0082 .notdef +!83 U+0083 .notdef +!84 U+0084 .notdef +!85 U+0085 .notdef +!86 U+0086 .notdef +!87 U+0087 .notdef +!88 U+0088 .notdef +!89 U+0089 .notdef +!8A U+008A .notdef +!8B U+008B .notdef +!8C U+008C .notdef +!8D U+008D .notdef +!8E U+008E .notdef +!8F U+008F .notdef +!90 U+0090 .notdef +!91 U+0091 .notdef +!92 U+0092 .notdef +!93 U+0093 .notdef +!94 U+0094 .notdef +!95 U+0095 .notdef +!96 U+0096 .notdef +!97 U+0097 .notdef +!98 U+0098 .notdef +!99 U+0099 .notdef +!9A U+009A .notdef +!9B U+009B .notdef +!9C U+009C .notdef +!9D U+009D .notdef +!9E U+009E .notdef +!9F U+009F .notdef +!A0 U+00A0 space +!A1 U+0104 Aogonek +!A2 U+0138 kgreenlandic +!A3 U+0156 Rcommaaccent +!A4 U+00A4 currency +!A5 U+0128 Itilde +!A6 U+013B Lcommaaccent +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+0160 Scaron +!AA U+0112 Emacron +!AB U+0122 Gcommaaccent +!AC U+0166 Tbar +!AD U+00AD hyphen +!AE U+017D Zcaron +!AF U+00AF macron +!B0 U+00B0 degree +!B1 U+0105 aogonek +!B2 U+02DB ogonek +!B3 U+0157 rcommaaccent +!B4 U+00B4 acute +!B5 U+0129 itilde +!B6 U+013C lcommaaccent +!B7 U+02C7 caron +!B8 U+00B8 cedilla +!B9 U+0161 scaron +!BA U+0113 emacron +!BB U+0123 gcommaaccent +!BC U+0167 tbar +!BD U+014A Eng +!BE U+017E zcaron +!BF U+014B eng +!C0 U+0100 Amacron +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+00C3 Atilde +!C4 U+00C4 Adieresis +!C5 U+00C5 Aring +!C6 U+00C6 AE +!C7 U+012E Iogonek +!C8 U+010C Ccaron +!C9 U+00C9 Eacute +!CA U+0118 Eogonek +!CB U+00CB Edieresis +!CC U+0116 Edotaccent +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+012A Imacron +!D0 U+0110 Dcroat +!D1 U+0145 Ncommaaccent +!D2 U+014C Omacron +!D3 U+0136 Kcommaaccent +!D4 U+00D4 Ocircumflex +!D5 U+00D5 Otilde +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+00D8 Oslash +!D9 U+0172 Uogonek +!DA U+00DA Uacute +!DB U+00DB Ucircumflex +!DC U+00DC Udieresis +!DD U+0168 Utilde +!DE U+016A Umacron +!DF U+00DF germandbls +!E0 U+0101 amacron +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+00E3 atilde +!E4 U+00E4 adieresis +!E5 U+00E5 aring +!E6 U+00E6 ae +!E7 U+012F iogonek +!E8 U+010D ccaron +!E9 U+00E9 eacute +!EA U+0119 eogonek +!EB U+00EB edieresis +!EC U+0117 edotaccent +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+012B imacron +!F0 U+0111 dcroat +!F1 U+0146 ncommaaccent +!F2 U+014D omacron +!F3 U+0137 kcommaaccent +!F4 U+00F4 ocircumflex +!F5 U+00F5 otilde +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+00F8 oslash +!F9 U+0173 uogonek +!FA U+00FA uacute +!FB U+00FB ucircumflex +!FC U+00FC udieresis +!FD U+0169 utilde +!FE U+016B umacron +!FF U+02D9 dotaccent diff --git a/vendor/plugins/rfpdf/lib/fonts/old/makefont/iso-8859-5.map b/vendor/plugins/rfpdf/lib/fonts/old/makefont/iso-8859-5.map new file mode 100755 index 00000000..f9cd4edc --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/old/makefont/iso-8859-5.map @@ -0,0 +1,256 @@ +!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 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!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+0080 .notdef +!81 U+0081 .notdef +!82 U+0082 .notdef +!83 U+0083 .notdef +!84 U+0084 .notdef +!85 U+0085 .notdef +!86 U+0086 .notdef +!87 U+0087 .notdef +!88 U+0088 .notdef +!89 U+0089 .notdef +!8A U+008A .notdef +!8B U+008B .notdef +!8C U+008C .notdef +!8D U+008D .notdef +!8E U+008E .notdef +!8F U+008F .notdef +!90 U+0090 .notdef +!91 U+0091 .notdef +!92 U+0092 .notdef +!93 U+0093 .notdef +!94 U+0094 .notdef +!95 U+0095 .notdef +!96 U+0096 .notdef +!97 U+0097 .notdef +!98 U+0098 .notdef +!99 U+0099 .notdef +!9A U+009A .notdef +!9B U+009B .notdef +!9C U+009C .notdef +!9D U+009D .notdef +!9E U+009E .notdef +!9F U+009F .notdef +!A0 U+00A0 space +!A1 U+0401 afii10023 +!A2 U+0402 afii10051 +!A3 U+0403 afii10052 +!A4 U+0404 afii10053 +!A5 U+0405 afii10054 +!A6 U+0406 afii10055 +!A7 U+0407 afii10056 +!A8 U+0408 afii10057 +!A9 U+0409 afii10058 +!AA U+040A afii10059 +!AB U+040B afii10060 +!AC U+040C afii10061 +!AD U+00AD hyphen +!AE U+040E afii10062 +!AF U+040F afii10145 +!B0 U+0410 afii10017 +!B1 U+0411 afii10018 +!B2 U+0412 afii10019 +!B3 U+0413 afii10020 +!B4 U+0414 afii10021 +!B5 U+0415 afii10022 +!B6 U+0416 afii10024 +!B7 U+0417 afii10025 +!B8 U+0418 afii10026 +!B9 U+0419 afii10027 +!BA U+041A afii10028 +!BB U+041B afii10029 +!BC U+041C afii10030 +!BD U+041D afii10031 +!BE U+041E afii10032 +!BF U+041F afii10033 +!C0 U+0420 afii10034 +!C1 U+0421 afii10035 +!C2 U+0422 afii10036 +!C3 U+0423 afii10037 +!C4 U+0424 afii10038 +!C5 U+0425 afii10039 +!C6 U+0426 afii10040 +!C7 U+0427 afii10041 +!C8 U+0428 afii10042 +!C9 U+0429 afii10043 +!CA U+042A afii10044 +!CB U+042B afii10045 +!CC U+042C afii10046 +!CD U+042D afii10047 +!CE U+042E afii10048 +!CF U+042F afii10049 +!D0 U+0430 afii10065 +!D1 U+0431 afii10066 +!D2 U+0432 afii10067 +!D3 U+0433 afii10068 +!D4 U+0434 afii10069 +!D5 U+0435 afii10070 +!D6 U+0436 afii10072 +!D7 U+0437 afii10073 +!D8 U+0438 afii10074 +!D9 U+0439 afii10075 +!DA U+043A afii10076 +!DB U+043B afii10077 +!DC U+043C afii10078 +!DD U+043D afii10079 +!DE U+043E afii10080 +!DF U+043F afii10081 +!E0 U+0440 afii10082 +!E1 U+0441 afii10083 +!E2 U+0442 afii10084 +!E3 U+0443 afii10085 +!E4 U+0444 afii10086 +!E5 U+0445 afii10087 +!E6 U+0446 afii10088 +!E7 U+0447 afii10089 +!E8 U+0448 afii10090 +!E9 U+0449 afii10091 +!EA U+044A afii10092 +!EB U+044B afii10093 +!EC U+044C afii10094 +!ED U+044D afii10095 +!EE U+044E afii10096 +!EF U+044F afii10097 +!F0 U+2116 afii61352 +!F1 U+0451 afii10071 +!F2 U+0452 afii10099 +!F3 U+0453 afii10100 +!F4 U+0454 afii10101 +!F5 U+0455 afii10102 +!F6 U+0456 afii10103 +!F7 U+0457 afii10104 +!F8 U+0458 afii10105 +!F9 U+0459 afii10106 +!FA U+045A afii10107 +!FB U+045B afii10108 +!FC U+045C afii10109 +!FD U+00A7 section +!FE U+045E afii10110 +!FF U+045F afii10193 diff --git a/vendor/plugins/rfpdf/lib/fonts/old/makefont/iso-8859-7.map b/vendor/plugins/rfpdf/lib/fonts/old/makefont/iso-8859-7.map new file mode 100755 index 00000000..e163796b --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/old/makefont/iso-8859-7.map @@ -0,0 +1,250 @@ +!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 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!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+0080 .notdef +!81 U+0081 .notdef +!82 U+0082 .notdef +!83 U+0083 .notdef +!84 U+0084 .notdef +!85 U+0085 .notdef +!86 U+0086 .notdef +!87 U+0087 .notdef +!88 U+0088 .notdef +!89 U+0089 .notdef +!8A U+008A .notdef +!8B U+008B .notdef +!8C U+008C .notdef +!8D U+008D .notdef +!8E U+008E .notdef +!8F U+008F .notdef +!90 U+0090 .notdef +!91 U+0091 .notdef +!92 U+0092 .notdef +!93 U+0093 .notdef +!94 U+0094 .notdef +!95 U+0095 .notdef +!96 U+0096 .notdef +!97 U+0097 .notdef +!98 U+0098 .notdef +!99 U+0099 .notdef +!9A U+009A .notdef +!9B U+009B .notdef +!9C U+009C .notdef +!9D U+009D .notdef +!9E U+009E .notdef +!9F U+009F .notdef +!A0 U+00A0 space +!A1 U+2018 quoteleft +!A2 U+2019 quoteright +!A3 U+00A3 sterling +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+00A9 copyright +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AF U+2015 afii00208 +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+0384 tonos +!B5 U+0385 dieresistonos +!B6 U+0386 Alphatonos +!B7 U+00B7 periodcentered +!B8 U+0388 Epsilontonos +!B9 U+0389 Etatonos +!BA U+038A Iotatonos +!BB U+00BB guillemotright +!BC U+038C Omicrontonos +!BD U+00BD onehalf +!BE U+038E Upsilontonos +!BF U+038F Omegatonos +!C0 U+0390 iotadieresistonos +!C1 U+0391 Alpha +!C2 U+0392 Beta +!C3 U+0393 Gamma +!C4 U+0394 Delta +!C5 U+0395 Epsilon +!C6 U+0396 Zeta +!C7 U+0397 Eta +!C8 U+0398 Theta +!C9 U+0399 Iota +!CA U+039A Kappa +!CB U+039B Lambda +!CC U+039C Mu +!CD U+039D Nu +!CE U+039E Xi +!CF U+039F Omicron +!D0 U+03A0 Pi +!D1 U+03A1 Rho +!D3 U+03A3 Sigma +!D4 U+03A4 Tau +!D5 U+03A5 Upsilon +!D6 U+03A6 Phi +!D7 U+03A7 Chi +!D8 U+03A8 Psi +!D9 U+03A9 Omega +!DA U+03AA Iotadieresis +!DB U+03AB Upsilondieresis +!DC U+03AC alphatonos +!DD U+03AD epsilontonos +!DE U+03AE etatonos +!DF U+03AF iotatonos +!E0 U+03B0 upsilondieresistonos +!E1 U+03B1 alpha +!E2 U+03B2 beta +!E3 U+03B3 gamma +!E4 U+03B4 delta +!E5 U+03B5 epsilon +!E6 U+03B6 zeta +!E7 U+03B7 eta +!E8 U+03B8 theta +!E9 U+03B9 iota +!EA U+03BA kappa +!EB U+03BB lambda +!EC U+03BC mu +!ED U+03BD nu +!EE U+03BE xi +!EF U+03BF omicron +!F0 U+03C0 pi +!F1 U+03C1 rho +!F2 U+03C2 sigma1 +!F3 U+03C3 sigma +!F4 U+03C4 tau +!F5 U+03C5 upsilon +!F6 U+03C6 phi +!F7 U+03C7 chi +!F8 U+03C8 psi +!F9 U+03C9 omega +!FA U+03CA iotadieresis +!FB U+03CB upsilondieresis +!FC U+03CC omicrontonos +!FD U+03CD upsilontonos +!FE U+03CE omegatonos diff --git a/vendor/plugins/rfpdf/lib/fonts/old/makefont/iso-8859-9.map b/vendor/plugins/rfpdf/lib/fonts/old/makefont/iso-8859-9.map new file mode 100755 index 00000000..48c123ae --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/old/makefont/iso-8859-9.map @@ -0,0 +1,256 @@ +!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 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!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+0080 .notdef +!81 U+0081 .notdef +!82 U+0082 .notdef +!83 U+0083 .notdef +!84 U+0084 .notdef +!85 U+0085 .notdef +!86 U+0086 .notdef +!87 U+0087 .notdef +!88 U+0088 .notdef +!89 U+0089 .notdef +!8A U+008A .notdef +!8B U+008B .notdef +!8C U+008C .notdef +!8D U+008D .notdef +!8E U+008E .notdef +!8F U+008F .notdef +!90 U+0090 .notdef +!91 U+0091 .notdef +!92 U+0092 .notdef +!93 U+0093 .notdef +!94 U+0094 .notdef +!95 U+0095 .notdef +!96 U+0096 .notdef +!97 U+0097 .notdef +!98 U+0098 .notdef +!99 U+0099 .notdef +!9A U+009A .notdef +!9B U+009B .notdef +!9C U+009C .notdef +!9D U+009D .notdef +!9E U+009E .notdef +!9F U+009F .notdef +!A0 U+00A0 space +!A1 U+00A1 exclamdown +!A2 U+00A2 cent +!A3 U+00A3 sterling +!A4 U+00A4 currency +!A5 U+00A5 yen +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+00A9 copyright +!AA U+00AA ordfeminine +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+00AF macron +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+00B4 acute +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+00B8 cedilla +!B9 U+00B9 onesuperior +!BA U+00BA ordmasculine +!BB U+00BB guillemotright +!BC U+00BC onequarter +!BD U+00BD onehalf +!BE U+00BE threequarters +!BF U+00BF questiondown +!C0 U+00C0 Agrave +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+00C3 Atilde +!C4 U+00C4 Adieresis +!C5 U+00C5 Aring +!C6 U+00C6 AE +!C7 U+00C7 Ccedilla +!C8 U+00C8 Egrave +!C9 U+00C9 Eacute +!CA U+00CA Ecircumflex +!CB U+00CB Edieresis +!CC U+00CC Igrave +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+00CF Idieresis +!D0 U+011E Gbreve +!D1 U+00D1 Ntilde +!D2 U+00D2 Ograve +!D3 U+00D3 Oacute +!D4 U+00D4 Ocircumflex +!D5 U+00D5 Otilde +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+00D8 Oslash +!D9 U+00D9 Ugrave +!DA U+00DA Uacute +!DB U+00DB Ucircumflex +!DC U+00DC Udieresis +!DD U+0130 Idotaccent +!DE U+015E Scedilla +!DF U+00DF germandbls +!E0 U+00E0 agrave +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+00E3 atilde +!E4 U+00E4 adieresis +!E5 U+00E5 aring +!E6 U+00E6 ae +!E7 U+00E7 ccedilla +!E8 U+00E8 egrave +!E9 U+00E9 eacute +!EA U+00EA ecircumflex +!EB U+00EB edieresis +!EC U+00EC igrave +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+00EF idieresis +!F0 U+011F gbreve +!F1 U+00F1 ntilde +!F2 U+00F2 ograve +!F3 U+00F3 oacute +!F4 U+00F4 ocircumflex +!F5 U+00F5 otilde +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+00F8 oslash +!F9 U+00F9 ugrave +!FA U+00FA uacute +!FB U+00FB ucircumflex +!FC U+00FC udieresis +!FD U+0131 dotlessi +!FE U+015F scedilla +!FF U+00FF ydieresis diff --git a/vendor/plugins/rfpdf/lib/fonts/old/makefont/koi8-r.map b/vendor/plugins/rfpdf/lib/fonts/old/makefont/koi8-r.map new file mode 100755 index 00000000..6ad5d05d --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/old/makefont/koi8-r.map @@ -0,0 +1,256 @@ +!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 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!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+2500 SF100000 +!81 U+2502 SF110000 +!82 U+250C SF010000 +!83 U+2510 SF030000 +!84 U+2514 SF020000 +!85 U+2518 SF040000 +!86 U+251C SF080000 +!87 U+2524 SF090000 +!88 U+252C SF060000 +!89 U+2534 SF070000 +!8A U+253C SF050000 +!8B U+2580 upblock +!8C U+2584 dnblock +!8D U+2588 block +!8E U+258C lfblock +!8F U+2590 rtblock +!90 U+2591 ltshade +!91 U+2592 shade +!92 U+2593 dkshade +!93 U+2320 integraltp +!94 U+25A0 filledbox +!95 U+2219 periodcentered +!96 U+221A radical +!97 U+2248 approxequal +!98 U+2264 lessequal +!99 U+2265 greaterequal +!9A U+00A0 space +!9B U+2321 integralbt +!9C U+00B0 degree +!9D U+00B2 twosuperior +!9E U+00B7 periodcentered +!9F U+00F7 divide +!A0 U+2550 SF430000 +!A1 U+2551 SF240000 +!A2 U+2552 SF510000 +!A3 U+0451 afii10071 +!A4 U+2553 SF520000 +!A5 U+2554 SF390000 +!A6 U+2555 SF220000 +!A7 U+2556 SF210000 +!A8 U+2557 SF250000 +!A9 U+2558 SF500000 +!AA U+2559 SF490000 +!AB U+255A SF380000 +!AC U+255B SF280000 +!AD U+255C SF270000 +!AE U+255D SF260000 +!AF U+255E SF360000 +!B0 U+255F SF370000 +!B1 U+2560 SF420000 +!B2 U+2561 SF190000 +!B3 U+0401 afii10023 +!B4 U+2562 SF200000 +!B5 U+2563 SF230000 +!B6 U+2564 SF470000 +!B7 U+2565 SF480000 +!B8 U+2566 SF410000 +!B9 U+2567 SF450000 +!BA U+2568 SF460000 +!BB U+2569 SF400000 +!BC U+256A SF540000 +!BD U+256B SF530000 +!BE U+256C SF440000 +!BF U+00A9 copyright +!C0 U+044E afii10096 +!C1 U+0430 afii10065 +!C2 U+0431 afii10066 +!C3 U+0446 afii10088 +!C4 U+0434 afii10069 +!C5 U+0435 afii10070 +!C6 U+0444 afii10086 +!C7 U+0433 afii10068 +!C8 U+0445 afii10087 +!C9 U+0438 afii10074 +!CA U+0439 afii10075 +!CB U+043A afii10076 +!CC U+043B afii10077 +!CD U+043C afii10078 +!CE U+043D afii10079 +!CF U+043E afii10080 +!D0 U+043F afii10081 +!D1 U+044F afii10097 +!D2 U+0440 afii10082 +!D3 U+0441 afii10083 +!D4 U+0442 afii10084 +!D5 U+0443 afii10085 +!D6 U+0436 afii10072 +!D7 U+0432 afii10067 +!D8 U+044C afii10094 +!D9 U+044B afii10093 +!DA U+0437 afii10073 +!DB U+0448 afii10090 +!DC U+044D afii10095 +!DD U+0449 afii10091 +!DE U+0447 afii10089 +!DF U+044A afii10092 +!E0 U+042E afii10048 +!E1 U+0410 afii10017 +!E2 U+0411 afii10018 +!E3 U+0426 afii10040 +!E4 U+0414 afii10021 +!E5 U+0415 afii10022 +!E6 U+0424 afii10038 +!E7 U+0413 afii10020 +!E8 U+0425 afii10039 +!E9 U+0418 afii10026 +!EA U+0419 afii10027 +!EB U+041A afii10028 +!EC U+041B afii10029 +!ED U+041C afii10030 +!EE U+041D afii10031 +!EF U+041E afii10032 +!F0 U+041F afii10033 +!F1 U+042F afii10049 +!F2 U+0420 afii10034 +!F3 U+0421 afii10035 +!F4 U+0422 afii10036 +!F5 U+0423 afii10037 +!F6 U+0416 afii10024 +!F7 U+0412 afii10019 +!F8 U+042C afii10046 +!F9 U+042B afii10045 +!FA U+0417 afii10025 +!FB U+0428 afii10042 +!FC U+042D afii10047 +!FD U+0429 afii10043 +!FE U+0427 afii10041 +!FF U+042A afii10044 diff --git a/vendor/plugins/rfpdf/lib/fonts/old/makefont/koi8-u.map b/vendor/plugins/rfpdf/lib/fonts/old/makefont/koi8-u.map new file mode 100755 index 00000000..40a7e4fd --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/old/makefont/koi8-u.map @@ -0,0 +1,256 @@ +!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 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!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+2500 SF100000 +!81 U+2502 SF110000 +!82 U+250C SF010000 +!83 U+2510 SF030000 +!84 U+2514 SF020000 +!85 U+2518 SF040000 +!86 U+251C SF080000 +!87 U+2524 SF090000 +!88 U+252C SF060000 +!89 U+2534 SF070000 +!8A U+253C SF050000 +!8B U+2580 upblock +!8C U+2584 dnblock +!8D U+2588 block +!8E U+258C lfblock +!8F U+2590 rtblock +!90 U+2591 ltshade +!91 U+2592 shade +!92 U+2593 dkshade +!93 U+2320 integraltp +!94 U+25A0 filledbox +!95 U+2022 bullet +!96 U+221A radical +!97 U+2248 approxequal +!98 U+2264 lessequal +!99 U+2265 greaterequal +!9A U+00A0 space +!9B U+2321 integralbt +!9C U+00B0 degree +!9D U+00B2 twosuperior +!9E U+00B7 periodcentered +!9F U+00F7 divide +!A0 U+2550 SF430000 +!A1 U+2551 SF240000 +!A2 U+2552 SF510000 +!A3 U+0451 afii10071 +!A4 U+0454 afii10101 +!A5 U+2554 SF390000 +!A6 U+0456 afii10103 +!A7 U+0457 afii10104 +!A8 U+2557 SF250000 +!A9 U+2558 SF500000 +!AA U+2559 SF490000 +!AB U+255A SF380000 +!AC U+255B SF280000 +!AD U+0491 afii10098 +!AE U+255D SF260000 +!AF U+255E SF360000 +!B0 U+255F SF370000 +!B1 U+2560 SF420000 +!B2 U+2561 SF190000 +!B3 U+0401 afii10023 +!B4 U+0404 afii10053 +!B5 U+2563 SF230000 +!B6 U+0406 afii10055 +!B7 U+0407 afii10056 +!B8 U+2566 SF410000 +!B9 U+2567 SF450000 +!BA U+2568 SF460000 +!BB U+2569 SF400000 +!BC U+256A SF540000 +!BD U+0490 afii10050 +!BE U+256C SF440000 +!BF U+00A9 copyright +!C0 U+044E afii10096 +!C1 U+0430 afii10065 +!C2 U+0431 afii10066 +!C3 U+0446 afii10088 +!C4 U+0434 afii10069 +!C5 U+0435 afii10070 +!C6 U+0444 afii10086 +!C7 U+0433 afii10068 +!C8 U+0445 afii10087 +!C9 U+0438 afii10074 +!CA U+0439 afii10075 +!CB U+043A afii10076 +!CC U+043B afii10077 +!CD U+043C afii10078 +!CE U+043D afii10079 +!CF U+043E afii10080 +!D0 U+043F afii10081 +!D1 U+044F afii10097 +!D2 U+0440 afii10082 +!D3 U+0441 afii10083 +!D4 U+0442 afii10084 +!D5 U+0443 afii10085 +!D6 U+0436 afii10072 +!D7 U+0432 afii10067 +!D8 U+044C afii10094 +!D9 U+044B afii10093 +!DA U+0437 afii10073 +!DB U+0448 afii10090 +!DC U+044D afii10095 +!DD U+0449 afii10091 +!DE U+0447 afii10089 +!DF U+044A afii10092 +!E0 U+042E afii10048 +!E1 U+0410 afii10017 +!E2 U+0411 afii10018 +!E3 U+0426 afii10040 +!E4 U+0414 afii10021 +!E5 U+0415 afii10022 +!E6 U+0424 afii10038 +!E7 U+0413 afii10020 +!E8 U+0425 afii10039 +!E9 U+0418 afii10026 +!EA U+0419 afii10027 +!EB U+041A afii10028 +!EC U+041B afii10029 +!ED U+041C afii10030 +!EE U+041D afii10031 +!EF U+041E afii10032 +!F0 U+041F afii10033 +!F1 U+042F afii10049 +!F2 U+0420 afii10034 +!F3 U+0421 afii10035 +!F4 U+0422 afii10036 +!F5 U+0423 afii10037 +!F6 U+0416 afii10024 +!F7 U+0412 afii10019 +!F8 U+042C afii10046 +!F9 U+042B afii10045 +!FA U+0417 afii10025 +!FB U+0428 afii10042 +!FC U+042D afii10047 +!FD U+0429 afii10043 +!FE U+0427 afii10041 +!FF U+042A afii10044 diff --git a/vendor/plugins/rfpdf/lib/fonts/old/makefont/makefont.php b/vendor/plugins/rfpdf/lib/fonts/old/makefont/makefont.php new file mode 100755 index 00000000..eeef58ff --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/old/makefont/makefont.php @@ -0,0 +1,411 @@ + +#***************************************************************************** +# Utility to generate font definition files # +# Version: 1.13 # +# Date: 2004-12-31 # +******************************************************************************# + +function ReadMap($enc) +{ + #Read a map file + $file=dirname(__FILE__) + '/' + $enc.downcase + '.map'; + $a=file($file); + if ($a)) + die('Error: encoding not found: '.$enc); + $cc2gn = [] + foreach($a as $l) + { + if ($l{0}=='!') + { + $e=rtrim($l).scan('/[ \\t]+/'); + $cc=hexdec(substr($e[0],1)); + $gn=$e[2]; + $cc2gn[$cc]=$gn; + end + end + for($i=0;$i<=255;$i++) + { + if (!$cc2gn[$i].nil?) + $cc2gn[$i]='.notdef'; + end + return $cc2gn; +} + +function ReadAFM($file,&$map) +{ + #Read a font metric file + $a=file($file); + if ($a.empty?) + die('File not found'); + $widths = [] + $fm = [] + $fix=Hash.new('Edot'=>'Edotaccent','edot'=>'edotaccent','Idot'=>'Idotaccent','Zdot'=>'Zdotaccent','zdot'=>'zdotaccent', + 'Odblacute'=>'Ohungarumlaut','odblacute'=>'ohungarumlaut','Udblacute'=>'Uhungarumlaut','udblacute'=>'uhungarumlaut', + 'Gcedilla'=>'Gcommaaccent','gcedilla'=>'gcommaaccent','Kcedilla'=>'Kcommaaccent','kcedilla'=>'kcommaaccent', + 'Lcedilla'=>'Lcommaaccent','lcedilla'=>'lcommaaccent','Ncedilla'=>'Ncommaaccent','ncedilla'=>'ncommaaccent', + 'Rcedilla'=>'Rcommaaccent','rcedilla'=>'rcommaaccent','Scedilla'=>'Scommaaccent','scedilla'=>'scommaaccent', + 'Tcedilla'=>'Tcommaaccent','tcedilla'=>'tcommaaccent','Dslash'=>'Dcroat','dslash'=>'dcroat','Dmacron'=>'Dcroat','dmacron'=>'dcroat', + 'combininggraveaccent'=>'gravecomb','combininghookabove'=>'hookabovecomb','combiningtildeaccent'=>'tildecomb', + 'combiningacuteaccent'=>'acutecomb','combiningdotbelow'=>'dotbelowcomb','dongsign'=>'dong'); + foreach($a as $l) + { + $e=explode(' ',rtrim($l)); + if ($e.length<2) + continue; + $code=$e[0]; + $param=$e[1]; + if ($code=='C') + { + #Character metrics + $cc=(int)$e[1]; + $w=$e[4]; + $gn=$e[7]; + if (substr($gn,-4)=='20AC') + $gn='Euro'; + if ($fix[$gn].nil?) + { + #Fix incorrect glyph name + foreach($map as $c=>$n) + { + if ($n==$fix[$gn]) + $map[$c]=$gn; + end + end + if ($map.empty?) + { + #Symbolic font: use built-in encoding + $widths[$cc]=$w; + else + { + $widths[$gn]=$w; + if ($gn=='X') + $fm['CapXHeight']=$e[13]; + end + if ($gn=='.notdef') + $fm['MissingWidth']=$w; + elsif ($code=='FontName') + $fm['FontName']=$param; + elsif ($code=='Weight') + $fm['Weight']=$param; + elsif ($code=='ItalicAngle') + $fm['ItalicAngle']=(double)$param; + elsif ($code=='Ascender') + $fm['Ascender']=(int)$param; + elsif ($code=='Descender') + $fm['Descender']=(int)$param; + elsif ($code=='UnderlineThickness') + $fm['UnderlineThickness']=(int)$param; + elsif ($code=='UnderlinePosition') + $fm['UnderlinePosition']=(int)$param; + elsif ($code=='IsFixedPitch') + $fm['IsFixedPitch']=($param=='true'); + elsif ($code=='FontBBox') + $fm['FontBBox']=Hash.new($e[1],$e[2],$e[3],$e[4]); + elsif ($code=='CapHeight') + $fm['CapHeight']=(int)$param; + elsif ($code=='StdVW') + $fm['StdVW']=(int)$param; + end + if (!$fm['FontName'].nil?) + die('FontName not found'); + if (!$map.empty?) + { + if (!$widths['.notdef'].nil?) + $widths['.notdef']=600; + if (!$widths['Delta'].nil? and $widths['increment'].nil?) + $widths['Delta']=$widths['increment']; + #Order widths according to map + for($i=0;$i<=255;$i++) + { + if (!$widths[$map[$i]].nil?) + { + echo 'Warning: character '.$map[$i].' is missing
    '; + $widths[$i]=$widths['.notdef']; + else + $widths[$i]=$widths[$map[$i]]; + end + end + $fm['Widths']=$widths; + return $fm; +} + +function MakeFontDescriptor($fm,$symbolic) +{ + #Ascent + $asc=($fm['Ascender'].nil? ? $fm['Ascender'] : 1000); + $fd="Hash.new('Ascent'=>".$asc; + #Descent + $desc=($fm['Descender'].nil? ? $fm['Descender'] : -200); + $fd<<",'Descent'=>".$desc; + #CapHeight + if ($fm['CapHeight'].nil?) + $ch=$fm['CapHeight']; + elsif ($fm['CapXHeight'].nil?) + $ch=$fm['CapXHeight']; + else + $ch=$asc; + $fd<<",'CapHeight'=>".$ch; + #Flags + $flags=0; + if ($fm['IsFixedPitch'].nil? and $fm['IsFixedPitch']) + $flags+=1<<0; + if ($symbolic) + $flags+=1<<2; + if (!$symbolic) + $flags+=1<<5; + if ($fm['ItalicAngle'].nil? and $fm['ItalicAngle']!=0) + $flags+=1<<6; + $fd<<",'Flags'=>".$flags; + #FontBBox + if ($fm['FontBBox'].nil?) + $fbb=$fm['FontBBox']; + else + $fbb=Hash.new(0,$des-100,1000,$asc+100); + $fd<<",'FontBBox'=>'[".$fbb[0].' '.$fbb[1].' '.$fbb[2].' '.$fbb[3]."]'"; + #ItalicAngle + $ia=($fm['ItalicAngle'].nil? ? $fm['ItalicAngle'] : 0); + $fd<<",'ItalicAngle'=>".$ia; + #StemV + if ($fm['StdVW'].nil?) + $stemv=$fm['StdVW']; + elsif ($fm['Weight'].nil? and eregi('(bold|black)',$fm['Weight'])) + $stemv=120; + else + $stemv=70; + $fd<<",'StemV'=>".$stemv; + #MissingWidth + if ($fm['MissingWidth'].nil?) + $fd<<",'MissingWidth'=>".$fm['MissingWidth']; + $fd<<')'; + return $fd; +} + +function MakeWidthArray($fm) +{ + #Make character width array + $s="Hash.new(\n\t"; + $cw=$fm['Widths']; + for($i=0;$i<=255;$i++) + { + if ($i.chr=="'") + $s<<"'\\''"; + elsif ($i.chr=="\\") + $s<<"'\\\\'"; + elsif ($i>=32 and $i<=126) + $s<<"'".$i.chr."'"; + else + $s<<"$i.chr"; + $s<<'=>'.$fm['Widths'][$i]; + if ($i<255) + $s<<','; + if (($i+1)%22==0) + $s<<"\n\t"; + end + $s<<')'; + return $s; +} + +function MakeFontEncoding($map) +{ + #Build differences from reference encoding + $ref=ReadMap('cp1252'); + $s=''; + $last=0; + for($i=32;$i<=255;$i++) + { + if ($map[$i]!=$ref[$i]) + { + if ($i!=$last+1) + $s<<$i.' '; + $last=$i; + $s<<'/'.$map[$i].' '; + end + end + return rtrim($s); +} + +function SaveToFile($file,$s,$mode='t') +{ + $f=fopen($file,'w'.$mode); + if (!$f) + die('Can\'t write to file '.$file); + fwrite($f,$s,$s.length); + fclose($f); +} + +function ReadShort($f) +{ + $a=unpack('n1n',fread($f,2)); + return $a['n']; +} + +function ReadLong($f) +{ + $a=unpack('N1N',fread($f,4)); + return $a['N']; +} + +function CheckTTF($file) +{ + #Check if font license allows embedding + $f=fopen($file,'rb'); + if (!$f) + die('Error: Can\'t open '.$file); + #Extract number of tables + fseek($f,4,SEEK_CUR); + $nb=ReadShort($f); + fseek($f,6,SEEK_CUR); + #Seek OS/2 table + $found=false; + for($i=0;$i<$nb;$i++) + { + if (fread($f,4)=='OS/2') + { + $found=true; + break; + end + fseek($f,12,SEEK_CUR); + end + if (!$found) + { + fclose($f); + return; + end + fseek($f,4,SEEK_CUR); + $offset=ReadLong($f); + fseek($f,$offset,SEEK_SET); + #Extract fsType flags + fseek($f,8,SEEK_CUR); + $fsType=ReadShort($f); + $rl=($fsType & 0x02)!=0; + $pp=($fsType & 0x04)!=0; + $e=($fsType & 0x08)!=0; + fclose($f); + if ($rl and !$pp and !$e) + echo 'Warning: font license does not allow embedding'; +} + +#***************************************************************************** +# $fontfile : chemin du fichier TTF (ou chane vide si pas d'incorporation) # +# $afmfile : chemin du fichier AFM # +# $enc : encodage (ou chane vide si la police est symbolique) # +# $patch : patch optionnel pour l'encodage # +# $type : type de la police si $fontfile est vide # +******************************************************************************# +function MakeFont($fontfile,$afmfile,$enc='cp1252',$patch=Hash.new(),$type='TrueType') +{ + #Generate a font definition file + set_magic_quotes_runtime(0); + ini_set('auto_detect_line_endings','1'); + if ($enc) + { + $map=ReadMap($enc); + foreach($patch as $cc=>$gn) + $map[$cc]=$gn; + end + else + $map = [] + if (!file_exists($afmfile)) + die('Error: AFM file not found: '.$afmfile); + $fm=ReadAFM($afmfile,$map); + if ($enc) + $diff=MakeFontEncoding($map); + else + $diff=''; + $fd=MakeFontDescriptor($fm,$map.empty?); + #Find font type + if ($fontfile) + { + $ext=strtolower(substr($fontfile,-3)); + if ($ext=='ttf') + $type='TrueType'; + elsif ($ext=='pfb') + $type='Type1'; + else + die('Error: unrecognized font file extension: '.$ext); + end + else + { + if ($type!='TrueType' and $type!='Type1') + die('Error: incorrect font type: '.$type); + end + #Start generation + $s=''."\n"; + $s<<'$type=\''.$type."';\n"; + $s<<'$name=\''.$fm['FontName']."';\n"; + $s<<'$desc='.$fd.";\n"; + if (!$fm['UnderlinePosition'].nil?) + $fm['UnderlinePosition']=-100; + if (!$fm['UnderlineThickness'].nil?) + $fm['UnderlineThickness']=50; + $s<<'$up='.$fm['UnderlinePosition'].";\n"; + $s<<'$ut='.$fm['UnderlineThickness'].";\n"; + $w=MakeWidthArray($fm); + $s<<'$cw='.$w.";\n"; + $s<<'$enc=\''.$enc."';\n"; + $s<<'$diff=\''.$diff."';\n"; + $basename=substr(basename($afmfile),0,-4); + if ($fontfile) + { + #Embedded font + if (!file_exists($fontfile)) + die('Error: font file not found: '.$fontfile); + if ($type=='TrueType') + CheckTTF($fontfile); + $f=fopen($fontfile,'rb'); + if (!$f) + die('Error: Can\'t open '.$fontfile); + $file=fread($f,filesize($fontfile)); + fclose($f); + if ($type=='Type1') + { + #Find first two sections and discard third one + $header=($file[0][0]==128); + if ($header) + { + #Strip first binary header + $file=substr($file,6); + end + $pos=$file.include?('eexec'); + if (!$pos) + die('Error: font file does not seem to be valid Type1'); + $size1=$pos+6; + if ($header and ?($file{$size1})==128) + { + #Strip second binary header + $file=substr($file,0,$size1).substr($file,$size1+6); + end + $pos=$file.include?('00000000'); + if (!$pos) + die('Error: font file does not seem to be valid Type1'); + $size2=$pos-$size1; + $file=substr($file,0,$size1+$size2); + end + if (respond_to('gzcompress')) + { + $cmp=$basename.'.z'; + SaveToFile($cmp,gzcompress($file),'b'); + $s<<'$file=\''.$cmp."';\n"; + echo 'Font file compressed ('.$cmp.')
    '; + else + { + $s<<'$file=\''.basename($fontfile)."';\n"; + echo 'Notice: font file could not be compressed (zlib extension not available)
    '; + end + if ($type=='Type1') + { + $s<<'$size1='.$size1.";\n"; + $s<<'$size2='.$size2.";\n"; + else + $s<<'$originalsize='.filesize($fontfile).";\n"; + end + else + { + #Not embedded font + $s<<'$file='."'';\n"; + end + $s<<"\n"; + SaveToFile($basename.'.rb',$s); + echo 'Font definition file generated ('.$basename.'.rb'.')
    '; +} + diff --git a/vendor/plugins/rfpdf/lib/fonts/sjis.rb b/vendor/plugins/rfpdf/lib/fonts/sjis.rb new file mode 100644 index 00000000..fb705912 --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/sjis.rb @@ -0,0 +1,834 @@ +TCPDFFontDescriptor.define('sjis') do |font| + font[:type]='Type0'; + font[:name]='KozMinPro-Regular-Acro'; + font[:desc]={'Ascent'=>995,'Descent'=>-203,'CapHeight'=>6,'Flags'=>32,'FontBBox'=>'[-50 -203 1041 995]','ItalicAngle'=>0,'StemV'=>70,'MissingWidth'=>1000} + font[:up]=-120; + font[:ut]=40 + font[:cMap]='90msp-RKSJ-H' + font[:cw]={ + 0=>1000, 32=>500, 33=>500, 34=>500, 35=>500, 36=>500, 37=>500, 38=>500, 39=>500, 40=>500, 41=>500, 42=>500, 43=>500, 44=>500, 45=>500, 46=>500, + 47=>500, 48=>500, 49=>500, 50=>500, 51=>500, 52=>500, 53=>500, 54=>500, 55=>500, 56=>500, 57=>500, 58=>500, 59=>500, 60=>500, 61=>500, 62=>500, + 63=>500, 64=>500, 65=>500, 66=>500, 67=>500, 68=>500, 69=>500, 70=>500, 71=>500, 72=>500, 73=>500, 74=>500, 75=>500, 76=>500, 77=>500, 78=>500, + 79=>500, 80=>500, 81=>500, 82=>500, 83=>500, 84=>500, 85=>500, 86=>500, 87=>500, 88=>500, 89=>500, 90=>500, 91=>500, 92=>500, 93=>500, 94=>500, + 95=>500, 96=>500, 97=>500, 98=>500, 99=>500, 100=>500, 101=>500, 102=>500, 103=>500, 104=>500, 105=>500, 106=>500, 107=>500, 108=>500, 109=>500, 110=>500, + 111=>500, 112=>500, 113=>500, 114=>500, 115=>500, 116=>500, 117=>500, 118=>500, 119=>500, 120=>500, 121=>500, 122=>500, 123=>500, 124=>500, 125=>500, 126=>500, + 8364=>1000, 402=>500, 8230=>1000, 8224=>1000, 8225=>1000, 710=>500, 8240=>1000, 338=>875, 8216=>1000, 8217=>1000, 8220=>1000, 8221=>1000, 732=>500, 339=>875, 160=>446, 161=>500, + 162=>500, 163=>500, 164=>1000, 165=>500, 166=>500, 167=>1000, 168=>1000, 169=>500, 170=>500, 171=>500, 172=>490, 173=>500, 174=>500, 175=>500, 176=>1000, 177=>1000, + 178=>500, 179=>500, 180=>1000, 181=>500, 182=>1000, 183=>500, 184=>500, 185=>500, 186=>500, 187=>500, 188=>500, 189=>500, 190=>500, 191=>500, 192=>500, 193=>500, + 194=>500, 195=>500, 196=>500, 197=>500, 198=>875, 199=>500, 200=>500, 201=>500, 202=>500, 203=>500, 204=>500, 205=>500, 206=>500, 207=>500, 208=>500, 209=>500, + 210=>500, 211=>500, 212=>500, 213=>500, 214=>500, 215=>1000, 216=>500, 217=>500, 218=>500, 219=>500, 220=>500, 221=>500, 222=>500, 223=>500, 224=>500, 225=>500, + 226=>500, 227=>500, 228=>500, 229=>500, 230=>813, 231=>500, 232=>500, 233=>500, 234=>500, 235=>500, 236=>500, 237=>500, 238=>500, 239=>500, 240=>500, 241=>500, + 242=>500, 243=>500, 244=>500, 245=>500, 246=>500, 247=>1000, 248=>500, 249=>500, 250=>500, 251=>500, 252=>500, 253=>500, 254=>500, 255=>500, 305=>500, 321=>500, + 322=>500, 331=>500, 593=>500, 602=>500, 658=>500, 711=>500, 714=>500, 715=>500, 728=>500, 730=>500, 913=>1000, 914=>1000, 915=>1000, 916=>1000, 917=>1000, 918=>1000, + 919=>1000, 920=>1000, 921=>1000, 922=>1000, 923=>1000, 924=>1000, 925=>1000, 926=>1000, 927=>1000, 928=>1000, 929=>1000, 931=>1000, 932=>1000, 933=>1000, 934=>1000, 935=>1000, + 936=>1000, 937=>1000, 945=>1000, 946=>1000, 947=>1000, 948=>1000, 949=>1000, 950=>1000, 951=>1000, 952=>1000, 953=>1000, 954=>1000, 955=>1000, 956=>1000, 957=>1000, 958=>1000, + 959=>1000, 960=>1000, 961=>1000, 962=>1000, 963=>1000, 964=>1000, 965=>1000, 966=>1000, 967=>1000, 968=>1000, 969=>1000, 977=>1000, 981=>1000, 1025=>1000, 1040=>1000, 1041=>1000, + 1042=>1000, 1043=>1000, 1044=>1000, 1045=>1000, 1046=>1000, 1047=>1000, 1048=>1000, 1049=>1000, 1050=>1000, 1051=>1000, 1052=>1000, 1053=>1000, 1054=>1000, 1055=>1000, 1056=>1000, 1057=>1000, + 1058=>1000, 1059=>1000, 1060=>1000, 1061=>1000, 1062=>1000, 1063=>1000, 1064=>1000, 1065=>1000, 1066=>1000, 1067=>1000, 1068=>1000, 1069=>1000, 1070=>1000, 1071=>1000, 1072=>1000, 1073=>1000, + 1074=>1000, 1075=>1000, 1076=>1000, 1077=>1000, 1078=>1000, 1079=>1000, 1080=>1000, 1081=>1000, 1082=>1000, 1083=>1000, 1084=>1000, 1085=>1000, 1086=>1000, 1087=>1000, 1088=>1000, 1089=>1000, + 1090=>1000, 1091=>1000, 1092=>1000, 1093=>1000, 1094=>1000, 1095=>1000, 1096=>1000, 1097=>1000, 1098=>1000, 1099=>1000, 1100=>1000, 1101=>1000, 1102=>1000, 1103=>1000, 1105=>1000, 8195=>915, + 8208=>1000, 8213=>1000, 8214=>915, 8215=>500, 8229=>1000, 8242=>1000, 8243=>1000, 8251=>1000, 8254=>766, 8451=>1000, 8467=>1000, 8470=>915, 8481=>1000, 8491=>1000, 8544=>915, 8545=>915, + 8546=>915, 8547=>915, 8548=>915, 8549=>915, 8550=>915, 8551=>915, 8552=>915, 8553=>915, 8592=>1000, 8593=>1000, 8594=>1000, 8595=>1000, 8658=>1000, 8660=>1000, 8704=>1000, 8706=>1000, + 8707=>1000, 8711=>1000, 8712=>1000, 8715=>1000, 8722=>915, 8730=>1000, 8733=>1000, 8734=>1000, 8735=>915, 8736=>1000, 8741=>1000, 8743=>1000, 8744=>1000, 8745=>1000, 8746=>1000, 8747=>1000, + 8748=>1000, 8749=>1000, 8750=>915, 8756=>1000, 8757=>1000, 8765=>1000, 8771=>1000, 8786=>1000, 8800=>1000, 8801=>1000, 8806=>1000, 8807=>1000, 8810=>1000, 8811=>1000, 8818=>977, 8819=>977, + 8834=>1000, 8835=>1000, 8838=>1000, 8839=>1000, 8869=>1000, 8895=>915, 8978=>1000, 9312=>1000, 9313=>1000, 9314=>1000, 9315=>1000, 9316=>1000, 9317=>1000, 9318=>1000, 9319=>1000, 9320=>1000, + 9321=>1000, 9322=>1000, 9323=>1000, 9324=>1000, 9325=>1000, 9326=>1000, 9327=>1000, 9328=>1000, 9329=>1000, 9330=>1000, 9331=>1000, 9472=>1000, 9473=>1000, 9474=>1000, 9475=>1000, 9484=>1000, + 9487=>1000, 9488=>1000, 9491=>1000, 9492=>1000, 9495=>1000, 9496=>1000, 9499=>1000, 9500=>1000, 9501=>1000, 9504=>1000, 9507=>1000, 9508=>1000, 9509=>1000, 9512=>1000, 9515=>1000, 9516=>1000, + 9519=>1000, 9520=>1000, 9523=>1000, 9524=>1000, 9527=>1000, 9528=>1000, 9531=>1000, 9532=>1000, 9535=>1000, 9538=>1000, 9547=>1000, 9632=>1000, 9633=>1000, 9634=>977, 9650=>1000, 9651=>1000, + 9660=>1000, 9661=>1000, 9670=>1000, 9671=>1000, 9675=>1000, 9678=>1000, 9679=>1000, 9711=>1000, 9733=>1000, 9734=>1000, 9792=>1000, 9794=>1000, 9825=>977, 9826=>977, 9828=>977, 9831=>977, + 9834=>1000, 9837=>1000, 9839=>1000, 12288=>1000, 12289=>1000, 12290=>1000, 12291=>1000, 12293=>1000, 12294=>1000, 12295=>1000, 12296=>1000, 12297=>1000, 12298=>1000, 12299=>1000, 12300=>1000, 12301=>1000, + 12302=>1000, 12303=>1000, 12304=>1000, 12305=>1000, 12306=>1000, 12307=>1000, 12308=>1000, 12309=>1000, 12316=>1000, 12339=>1000, 12340=>1000, 12341=>1000, 12353=>1000, 12354=>1000, 12355=>1000, 12356=>1000, + 12357=>1000, 12358=>1000, 12359=>1000, 12360=>1000, 12361=>1000, 12362=>1000, 12363=>1000, 12364=>1000, 12365=>1000, 12366=>1000, 12367=>1000, 12368=>1000, 12369=>1000, 12370=>1000, 12371=>1000, 12372=>1000, + 12373=>1000, 12374=>1000, 12375=>1000, 12376=>1000, 12377=>1000, 12378=>1000, 12379=>1000, 12380=>1000, 12381=>1000, 12382=>1000, 12383=>1000, 12384=>1000, 12385=>1000, 12386=>1000, 12387=>1000, 12388=>1000, + 12389=>1000, 12390=>1000, 12391=>1000, 12392=>1000, 12393=>1000, 12394=>1000, 12395=>1000, 12396=>1000, 12397=>1000, 12398=>1000, 12399=>1000, 12400=>1000, 12401=>1000, 12402=>1000, 12403=>1000, 12404=>1000, + 12405=>1000, 12406=>1000, 12407=>1000, 12408=>1000, 12409=>1000, 12410=>1000, 12411=>1000, 12412=>1000, 12413=>1000, 12414=>1000, 12415=>1000, 12416=>1000, 12417=>1000, 12418=>1000, 12419=>1000, 12420=>1000, + 12421=>1000, 12422=>1000, 12423=>1000, 12424=>1000, 12425=>1000, 12426=>1000, 12427=>1000, 12428=>1000, 12429=>1000, 12430=>1000, 12431=>1000, 12432=>1000, 12433=>1000, 12434=>1000, 12435=>1000, 12436=>1000, + 12437=>1000, 12438=>1000, 12443=>1000, 12444=>1000, 12445=>1000, 12446=>1000, 12449=>1000, 12450=>1000, 12451=>1000, 12452=>1000, 12453=>1000, 12454=>1000, 12455=>1000, 12456=>1000, 12457=>1000, 12458=>1000, + 12459=>1000, 12460=>1000, 12461=>1000, 12462=>1000, 12463=>1000, 12464=>1000, 12465=>1000, 12466=>1000, 12467=>1000, 12468=>1000, 12469=>1000, 12470=>1000, 12471=>1000, 12472=>1000, 12473=>1000, 12474=>1000, + 12475=>1000, 12476=>1000, 12477=>1000, 12478=>1000, 12479=>1000, 12480=>1000, 12481=>1000, 12482=>1000, 12483=>1000, 12484=>1000, 12485=>1000, 12486=>1000, 12487=>1000, 12488=>1000, 12489=>1000, 12490=>1000, + 12491=>1000, 12492=>1000, 12493=>1000, 12494=>1000, 12495=>1000, 12496=>1000, 12497=>1000, 12498=>1000, 12499=>1000, 12500=>1000, 12501=>1000, 12502=>1000, 12503=>1000, 12504=>1000, 12505=>1000, 12506=>1000, + 12507=>1000, 12508=>1000, 12509=>1000, 12510=>1000, 12511=>1000, 12512=>1000, 12513=>1000, 12514=>1000, 12515=>1000, 12516=>1000, 12517=>1000, 12518=>1000, 12519=>1000, 12520=>1000, 12521=>1000, 12522=>1000, + 12523=>1000, 12524=>1000, 12525=>1000, 12526=>1000, 12527=>1000, 12528=>1000, 12529=>1000, 12530=>1000, 12531=>1000, 12532=>1000, 12533=>1000, 12534=>1000, 12535=>1000, 12536=>1000, 12537=>1000, 12538=>1000, + 12539=>1000, 12540=>1000, 12541=>1000, 12542=>1000, 12849=>1000, 12850=>915, 12857=>915, 12964=>915, 12965=>915, 12966=>915, 12967=>915, 12968=>915, 13059=>915, 13069=>915, 13076=>915, 13080=>915, + 13090=>915, 13091=>915, 13094=>915, 13095=>915, 13099=>915, 13110=>915, 13115=>915, 13129=>915, 13130=>915, 13133=>915, 13137=>915, 13143=>915, 13179=>915, 13180=>915, 13181=>915, 13182=>915, + 13198=>915, 13199=>915, 13212=>915, 13213=>915, 13214=>915, 13217=>915, 13252=>915, 13259=>1000, 13261=>915, 19968=>1000, 19969=>1000, 19970=>1000, 19971=>1000, 19972=>1000, 19973=>1000, 19975=>1000, + 19976=>1000, 19977=>1000, 19978=>1000, 19979=>1000, 19980=>1000, 19981=>1000, 19982=>1000, 19984=>1000, 19985=>1000, 19986=>1000, 19988=>1000, 19989=>1000, 19990=>1000, 19991=>1000, 19992=>1000, 19993=>1000, + 19998=>1000, 19999=>1000, 20001=>1000, 20003=>1000, 20004=>1000, 20006=>1000, 20008=>1000, 20010=>1000, 20011=>1000, 20013=>1000, 20014=>1000, 20015=>1000, 20016=>1000, 20017=>1000, 20018=>1000, 20021=>1000, + 20022=>1000, 20024=>1000, 20025=>1000, 20027=>1000, 20028=>1000, 20031=>1000, 20032=>1000, 20033=>1000, 20034=>1000, 20035=>1000, 20036=>1000, 20037=>1000, 20039=>1000, 20043=>1000, 20045=>1000, 20046=>1000, + 20047=>1000, 20049=>1000, 20053=>1000, 20054=>1000, 20055=>1000, 20056=>1000, 20057=>1000, 20058=>1000, 20060=>1000, 20061=>1000, 20062=>1000, 20063=>1000, 20066=>1000, 20067=>1000, 20072=>1000, 20073=>1000, + 20081=>1000, 20083=>1000, 20084=>1000, 20085=>1000, 20089=>1000, 20094=>1000, 20095=>1000, 20096=>1000, 20098=>1000, 20101=>1000, 20102=>1000, 20104=>1000, 20105=>1000, 20106=>1000, 20107=>1000, 20108=>1000, + 20109=>1000, 20110=>1000, 20113=>1000, 20114=>1000, 20116=>1000, 20117=>1000, 20118=>1000, 20119=>1000, 20120=>1000, 20121=>1000, 20123=>1000, 20124=>1000, 20125=>1000, 20126=>1000, 20127=>1000, 20128=>1000, + 20129=>1000, 20130=>1000, 20132=>1000, 20133=>1000, 20134=>1000, 20136=>1000, 20139=>1000, 20140=>1000, 20141=>1000, 20142=>1000, 20143=>1000, 20144=>1000, 20147=>1000, 20150=>1000, 20153=>1000, 20154=>1000, + 20160=>1000, 20161=>1000, 20162=>1000, 20163=>1000, 20164=>1000, 20166=>1000, 20167=>1000, 20170=>1000, 20171=>1000, 20173=>1000, 20174=>1000, 20175=>1000, 20176=>1000, 20180=>1000, 20181=>1000, 20182=>1000, + 20183=>1000, 20184=>1000, 20185=>1000, 20186=>1000, 20187=>1000, 20189=>1000, 20190=>1000, 20191=>1000, 20192=>1000, 20193=>1000, 20194=>1000, 20195=>1000, 20196=>1000, 20197=>1000, 20200=>1000, 20205=>1000, + 20206=>1000, 20207=>1000, 20208=>1000, 20209=>1000, 20210=>1000, 20211=>1000, 20213=>1000, 20214=>1000, 20215=>1000, 20219=>1000, 20220=>1000, 20221=>1000, 20222=>1000, 20223=>1000, 20224=>1000, 20225=>1000, + 20226=>1000, 20227=>1000, 20232=>1000, 20233=>1000, 20234=>1000, 20235=>1000, 20236=>1000, 20237=>1000, 20238=>1000, 20239=>1000, 20240=>1000, 20241=>1000, 20242=>1000, 20245=>1000, 20246=>1000, 20247=>1000, + 20249=>1000, 20250=>1000, 20252=>1000, 20253=>1000, 20270=>1000, 20271=>1000, 20272=>1000, 20273=>1000, 20275=>1000, 20276=>1000, 20277=>1000, 20278=>1000, 20279=>1000, 20280=>1000, 20281=>1000, 20282=>1000, + 20283=>1000, 20284=>1000, 20285=>1000, 20286=>1000, 20288=>1000, 20290=>1000, 20291=>1000, 20294=>1000, 20295=>1000, 20296=>1000, 20297=>1000, 20299=>1000, 20300=>1000, 20301=>1000, 20302=>1000, 20303=>1000, + 20304=>1000, 20305=>1000, 20306=>1000, 20307=>1000, 20308=>1000, 20309=>1000, 20310=>1000, 20311=>1000, 20312=>1000, 20313=>1000, 20314=>1000, 20315=>1000, 20316=>1000, 20317=>1000, 20318=>1000, 20319=>1000, + 20320=>1000, 20323=>1000, 20329=>1000, 20330=>1000, 20332=>1000, 20334=>1000, 20335=>1000, 20336=>1000, 20337=>1000, 20339=>1000, 20341=>1000, 20342=>1000, 20343=>1000, 20344=>1000, 20345=>1000, 20346=>1000, + 20347=>1000, 20348=>1000, 20349=>1000, 20350=>1000, 20351=>1000, 20353=>1000, 20354=>1000, 20355=>1000, 20356=>1000, 20357=>1000, 20358=>1000, 20360=>1000, 20361=>1000, 20362=>1000, 20363=>1000, 20364=>1000, + 20365=>1000, 20366=>1000, 20367=>1000, 20368=>1000, 20369=>1000, 20370=>1000, 20371=>1000, 20372=>1000, 20374=>1000, 20375=>1000, 20376=>1000, 20377=>1000, 20378=>1000, 20379=>1000, 20381=>1000, 20382=>1000, + 20383=>1000, 20384=>1000, 20385=>1000, 20395=>1000, 20397=>1000, 20398=>1000, 20399=>1000, 20402=>1000, 20405=>1000, 20406=>1000, 20407=>1000, 20409=>1000, 20411=>1000, 20412=>1000, 20413=>1000, 20414=>1000, + 20415=>1000, 20416=>1000, 20417=>1000, 20418=>1000, 20419=>1000, 20420=>1000, 20421=>1000, 20422=>1000, 20424=>1000, 20425=>1000, 20426=>1000, 20427=>1000, 20428=>1000, 20429=>1000, 20430=>1000, 20431=>1000, + 20432=>1000, 20433=>1000, 20434=>1000, 20436=>1000, 20439=>1000, 20440=>1000, 20442=>1000, 20443=>1000, 20444=>1000, 20445=>1000, 20447=>1000, 20448=>1000, 20449=>1000, 20450=>1000, 20451=>1000, 20452=>1000, + 20453=>1000, 20462=>1000, 20463=>1000, 20464=>1000, 20466=>1000, 20467=>1000, 20469=>1000, 20470=>1000, 20472=>1000, 20474=>1000, 20476=>1000, 20477=>1000, 20478=>1000, 20479=>1000, 20480=>1000, 20481=>1000, + 20484=>1000, 20485=>1000, 20486=>1000, 20487=>1000, 20489=>1000, 20490=>1000, 20491=>1000, 20492=>1000, 20493=>1000, 20494=>1000, 20495=>1000, 20496=>1000, 20497=>1000, 20498=>1000, 20499=>1000, 20500=>1000, + 20502=>1000, 20503=>1000, 20504=>1000, 20505=>1000, 20506=>1000, 20507=>1000, 20508=>1000, 20509=>1000, 20510=>1000, 20511=>1000, 20513=>1000, 20514=>1000, 20515=>1000, 20516=>1000, 20517=>1000, 20518=>1000, + 20519=>1000, 20520=>1000, 20521=>1000, 20522=>1000, 20523=>1000, 20524=>1000, 20525=>1000, 20526=>1000, 20528=>1000, 20530=>1000, 20531=>1000, 20533=>1000, 20534=>1000, 20537=>1000, 20539=>1000, 20544=>1000, + 20545=>1000, 20546=>1000, 20547=>1000, 20549=>1000, 20550=>1000, 20551=>1000, 20552=>1000, 20553=>1000, 20554=>1000, 20556=>1000, 20558=>1000, 20559=>1000, 20560=>1000, 20561=>1000, 20562=>1000, 20563=>1000, + 20565=>1000, 20566=>1000, 20567=>1000, 20569=>1000, 20570=>1000, 20572=>1000, 20575=>1000, 20576=>1000, 20578=>1000, 20579=>1000, 20581=>1000, 20582=>1000, 20583=>1000, 20586=>1000, 20588=>1000, 20589=>1000, + 20592=>1000, 20593=>1000, 20594=>1000, 20596=>1000, 20597=>1000, 20598=>1000, 20600=>1000, 20605=>1000, 20608=>1000, 20609=>1000, 20611=>1000, 20612=>1000, 20613=>1000, 20614=>1000, 20618=>1000, 20621=>1000, + 20622=>1000, 20623=>1000, 20624=>1000, 20625=>1000, 20626=>1000, 20627=>1000, 20628=>1000, 20630=>1000, 20632=>1000, 20633=>1000, 20634=>1000, 20635=>1000, 20636=>1000, 20638=>1000, 20639=>1000, 20640=>1000, + 20641=>1000, 20642=>1000, 20650=>1000, 20652=>1000, 20653=>1000, 20655=>1000, 20656=>1000, 20658=>1000, 20659=>1000, 20660=>1000, 20661=>1000, 20663=>1000, 20665=>1000, 20666=>1000, 20669=>1000, 20670=>1000, + 20672=>1000, 20674=>1000, 20675=>1000, 20676=>1000, 20677=>1000, 20679=>1000, 20681=>1000, 20682=>1000, 20684=>1000, 20685=>1000, 20686=>1000, 20687=>1000, 20688=>1000, 20689=>1000, 20691=>1000, 20692=>1000, + 20693=>1000, 20694=>1000, 20696=>1000, 20698=>1000, 20700=>1000, 20701=>1000, 20702=>1000, 20703=>1000, 20706=>1000, 20707=>1000, 20708=>1000, 20709=>1000, 20710=>1000, 20711=>1000, 20712=>1000, 20713=>1000, + 20717=>1000, 20718=>1000, 20719=>1000, 20721=>1000, 20722=>1000, 20724=>1000, 20725=>1000, 20726=>1000, 20729=>1000, 20730=>1000, 20731=>1000, 20734=>1000, 20736=>1000, 20737=>1000, 20738=>1000, 20739=>1000, + 20740=>1000, 20742=>1000, 20743=>1000, 20744=>1000, 20745=>1000, 20747=>1000, 20748=>1000, 20749=>1000, 20750=>1000, 20752=>1000, 20754=>1000, 20756=>1000, 20757=>1000, 20758=>1000, 20759=>1000, 20760=>1000, + 20761=>1000, 20762=>1000, 20763=>1000, 20764=>1000, 20765=>1000, 20766=>1000, 20767=>1000, 20769=>1000, 20771=>1000, 20775=>1000, 20776=>1000, 20778=>1000, 20780=>1000, 20781=>1000, 20783=>1000, 20785=>1000, + 20786=>1000, 20787=>1000, 20788=>1000, 20789=>1000, 20791=>1000, 20792=>1000, 20793=>1000, 20794=>1000, 20795=>1000, 20796=>1000, 20799=>1000, 20800=>1000, 20801=>1000, 20802=>1000, 20803=>1000, 20804=>1000, + 20805=>1000, 20806=>1000, 20807=>1000, 20808=>1000, 20809=>1000, 20810=>1000, 20811=>1000, 20812=>1000, 20813=>1000, 20814=>1000, 20815=>1000, 20816=>1000, 20818=>1000, 20819=>1000, 20820=>1000, 20821=>1000, + 20823=>1000, 20824=>1000, 20826=>1000, 20828=>1000, 20831=>1000, 20834=>1000, 20836=>1000, 20837=>1000, 20838=>1000, 20840=>1000, 20841=>1000, 20842=>1000, 20843=>1000, 20844=>1000, 20845=>1000, 20846=>1000, + 20849=>1000, 20853=>1000, 20854=>1000, 20855=>1000, 20856=>1000, 20860=>1000, 20862=>1000, 20864=>1000, 20866=>1000, 20867=>1000, 20868=>1000, 20869=>1000, 20870=>1000, 20873=>1000, 20874=>1000, 20875=>1000, + 20876=>1000, 20877=>1000, 20878=>1000, 20879=>1000, 20880=>1000, 20881=>1000, 20882=>1000, 20883=>1000, 20885=>1000, 20886=>1000, 20887=>1000, 20888=>1000, 20889=>1000, 20893=>1000, 20896=>1000, 20897=>1000, + 20898=>1000, 20899=>1000, 20900=>1000, 20901=>1000, 20902=>1000, 20904=>1000, 20905=>1000, 20906=>1000, 20907=>1000, 20908=>1000, 20909=>1000, 20912=>1000, 20913=>1000, 20914=>1000, 20915=>1000, 20916=>1000, + 20917=>1000, 20918=>1000, 20919=>1000, 20920=>1000, 20922=>1000, 20924=>1000, 20925=>1000, 20926=>1000, 20927=>1000, 20930=>1000, 20932=>1000, 20933=>1000, 20934=>1000, 20936=>1000, 20937=>1000, 20939=>1000, + 20940=>1000, 20941=>1000, 20943=>1000, 20945=>1000, 20946=>1000, 20947=>1000, 20949=>1000, 20950=>1000, 20952=>1000, 20955=>1000, 20956=>1000, 20957=>1000, 20958=>1000, 20960=>1000, 20961=>1000, 20962=>1000, + 20965=>1000, 20966=>1000, 20967=>1000, 20969=>1000, 20970=>1000, 20972=>1000, 20973=>1000, 20974=>1000, 20976=>1000, 20977=>1000, 20978=>1000, 20979=>1000, 20980=>1000, 20981=>1000, 20982=>1000, 20983=>1000, + 20984=>1000, 20985=>1000, 20986=>1000, 20989=>1000, 20990=>1000, 20992=>1000, 20993=>1000, 20994=>1000, 20995=>1000, 20996=>1000, 20997=>1000, 20998=>1000, 20999=>1000, 21000=>1000, 21002=>1000, 21003=>1000, + 21006=>1000, 21009=>1000, 21010=>1000, 21011=>1000, 21012=>1000, 21013=>1000, 21014=>1000, 21015=>1000, 21016=>1000, 21021=>1000, 21026=>1000, 21028=>1000, 21029=>1000, 21031=>1000, 21032=>1000, 21033=>1000, + 21034=>1000, 21038=>1000, 21040=>1000, 21041=>1000, 21042=>1000, 21043=>1000, 21045=>1000, 21046=>1000, 21047=>1000, 21048=>1000, 21049=>1000, 21050=>1000, 21051=>1000, 21052=>1000, 21059=>1000, 21060=>1000, + 21061=>1000, 21063=>1000, 21065=>1000, 21066=>1000, 21067=>1000, 21068=>1000, 21069=>1000, 21071=>1000, 21076=>1000, 21077=>1000, 21078=>1000, 21079=>1000, 21080=>1000, 21082=>1000, 21083=>1000, 21084=>1000, + 21086=>1000, 21087=>1000, 21088=>1000, 21089=>1000, 21091=>1000, 21092=>1000, 21093=>1000, 21094=>1000, 21097=>1000, 21098=>1000, 21102=>1000, 21103=>1000, 21104=>1000, 21105=>1000, 21106=>1000, 21107=>1000, + 21108=>1000, 21109=>1000, 21111=>1000, 21112=>1000, 21113=>1000, 21117=>1000, 21119=>1000, 21120=>1000, 21122=>1000, 21123=>1000, 21125=>1000, 21127=>1000, 21128=>1000, 21129=>1000, 21130=>1000, 21132=>1000, + 21133=>1000, 21137=>1000, 21138=>1000, 21139=>1000, 21140=>1000, 21141=>1000, 21142=>1000, 21143=>1000, 21144=>1000, 21146=>1000, 21147=>1000, 21148=>1000, 21151=>1000, 21152=>1000, 21155=>1000, 21156=>1000, + 21157=>1000, 21158=>1000, 21159=>1000, 21161=>1000, 21162=>1000, 21163=>1000, 21164=>1000, 21165=>1000, 21167=>1000, 21168=>1000, 21169=>1000, 21172=>1000, 21173=>1000, 21174=>1000, 21175=>1000, 21176=>1000, + 21177=>1000, 21178=>1000, 21179=>1000, 21180=>1000, 21181=>1000, 21182=>1000, 21184=>1000, 21185=>1000, 21187=>1000, 21188=>1000, 21189=>1000, 21190=>1000, 21191=>1000, 21192=>1000, 21193=>1000, 21196=>1000, + 21197=>1000, 21199=>1000, 21201=>1000, 21202=>1000, 21204=>1000, 21205=>1000, 21206=>1000, 21207=>1000, 21208=>1000, 21209=>1000, 21211=>1000, 21212=>1000, 21213=>1000, 21214=>1000, 21215=>1000, 21216=>1000, + 21217=>1000, 21218=>1000, 21219=>1000, 21220=>1000, 21221=>1000, 21222=>1000, 21223=>1000, 21224=>1000, 21225=>1000, 21226=>1000, 21228=>1000, 21232=>1000, 21233=>1000, 21234=>1000, 21235=>1000, 21236=>1000, + 21237=>1000, 21238=>1000, 21239=>1000, 21240=>1000, 21241=>1000, 21242=>1000, 21246=>1000, 21247=>1000, 21248=>1000, 21249=>1000, 21250=>1000, 21251=>1000, 21253=>1000, 21254=>1000, 21255=>1000, 21256=>1000, + 21258=>1000, 21259=>1000, 21260=>1000, 21261=>1000, 21263=>1000, 21264=>1000, 21265=>1000, 21267=>1000, 21269=>1000, 21270=>1000, 21271=>1000, 21272=>1000, 21273=>1000, 21274=>1000, 21275=>1000, 21276=>1000, + 21277=>1000, 21278=>1000, 21279=>1000, 21280=>1000, 21281=>1000, 21283=>1000, 21284=>1000, 21285=>1000, 21287=>1000, 21288=>1000, 21289=>1000, 21290=>1000, 21291=>1000, 21292=>1000, 21293=>1000, 21295=>1000, + 21296=>1000, 21297=>1000, 21298=>1000, 21299=>1000, 21301=>1000, 21304=>1000, 21305=>1000, 21306=>1000, 21307=>1000, 21308=>1000, 21309=>1000, 21310=>1000, 21311=>1000, 21312=>1000, 21313=>1000, 21314=>1000, + 21315=>1000, 21317=>1000, 21318=>1000, 21319=>1000, 21320=>1000, 21321=>1000, 21322=>1000, 21323=>1000, 21324=>1000, 21325=>1000, 21329=>1000, 21330=>1000, 21331=>1000, 21332=>1000, 21335=>1000, 21336=>1000, + 21337=>1000, 21338=>1000, 21339=>1000, 21340=>1000, 21342=>1000, 21344=>1000, 21345=>1000, 21347=>1000, 21349=>1000, 21350=>1000, 21353=>1000, 21356=>1000, 21357=>1000, 21358=>1000, 21359=>1000, 21360=>1000, + 21361=>1000, 21362=>1000, 21363=>1000, 21364=>1000, 21365=>1000, 21367=>1000, 21368=>1000, 21369=>1000, 21371=>1000, 21374=>1000, 21375=>1000, 21378=>1000, 21379=>1000, 21380=>1000, 21383=>1000, 21384=>1000, + 21390=>1000, 21395=>1000, 21396=>1000, 21398=>1000, 21400=>1000, 21401=>1000, 21402=>1000, 21405=>1000, 21407=>1000, 21408=>1000, 21409=>1000, 21412=>1000, 21413=>1000, 21414=>1000, 21416=>1000, 21417=>1000, + 21418=>1000, 21419=>1000, 21421=>1000, 21422=>1000, 21423=>1000, 21424=>1000, 21426=>1000, 21427=>1000, 21428=>1000, 21429=>1000, 21430=>1000, 21431=>1000, 21432=>1000, 21434=>1000, 21435=>1000, 21437=>1000, + 21440=>1000, 21442=>1000, 21443=>1000, 21445=>1000, 21448=>1000, 21449=>1000, 21450=>1000, 21451=>1000, 21452=>1000, 21453=>1000, 21454=>1000, 21455=>1000, 21458=>1000, 21459=>1000, 21460=>1000, 21461=>1000, + 21462=>1000, 21463=>1000, 21465=>1000, 21466=>1000, 21467=>1000, 21469=>1000, 21470=>1000, 21471=>1000, 21472=>1000, 21473=>1000, 21474=>1000, 21475=>1000, 21476=>1000, 21477=>1000, 21478=>1000, 21479=>1000, + 21480=>1000, 21481=>1000, 21482=>1000, 21483=>1000, 21484=>1000, 21485=>1000, 21486=>1000, 21487=>1000, 21488=>1000, 21489=>1000, 21490=>1000, 21491=>1000, 21493=>1000, 21494=>1000, 21495=>1000, 21496=>1000, + 21498=>1000, 21505=>1000, 21506=>1000, 21507=>1000, 21508=>1000, 21512=>1000, 21513=>1000, 21514=>1000, 21515=>1000, 21516=>1000, 21517=>1000, 21518=>1000, 21519=>1000, 21520=>1000, 21521=>1000, 21523=>1000, + 21530=>1000, 21531=>1000, 21533=>1000, 21535=>1000, 21536=>1000, 21537=>1000, 21542=>1000, 21543=>1000, 21544=>1000, 21545=>1000, 21546=>1000, 21547=>1000, 21548=>1000, 21549=>1000, 21550=>1000, 21551=>1000, + 21553=>1000, 21556=>1000, 21557=>1000, 21558=>1000, 21560=>1000, 21561=>1000, 21563=>1000, 21564=>1000, 21565=>1000, 21566=>1000, 21568=>1000, 21570=>1000, 21571=>1000, 21572=>1000, 21574=>1000, 21575=>1000, + 21576=>1000, 21577=>1000, 21578=>1000, 21581=>1000, 21582=>1000, 21583=>1000, 21585=>1000, 21598=>1000, 21599=>1000, 21602=>1000, 21604=>1000, 21606=>1000, 21607=>1000, 21608=>1000, 21609=>1000, 21610=>1000, + 21611=>1000, 21613=>1000, 21614=>1000, 21616=>1000, 21617=>1000, 21619=>1000, 21620=>1000, 21621=>1000, 21622=>1000, 21623=>1000, 21627=>1000, 21628=>1000, 21629=>1000, 21631=>1000, 21632=>1000, 21633=>1000, + 21635=>1000, 21636=>1000, 21637=>1000, 21638=>1000, 21640=>1000, 21641=>1000, 21642=>1000, 21643=>1000, 21644=>1000, 21645=>1000, 21646=>1000, 21647=>1000, 21648=>1000, 21649=>1000, 21650=>1000, 21653=>1000, + 21654=>1000, 21660=>1000, 21663=>1000, 21665=>1000, 21666=>1000, 21668=>1000, 21669=>1000, 21670=>1000, 21671=>1000, 21672=>1000, 21673=>1000, 21674=>1000, 21675=>1000, 21676=>1000, 21677=>1000, 21678=>1000, + 21679=>1000, 21681=>1000, 21682=>1000, 21683=>1000, 21687=>1000, 21688=>1000, 21689=>1000, 21690=>1000, 21691=>1000, 21692=>1000, 21693=>1000, 21694=>1000, 21695=>1000, 21696=>1000, 21697=>1000, 21698=>1000, + 21700=>1000, 21702=>1000, 21703=>1000, 21704=>1000, 21705=>1000, 21706=>1000, 21709=>1000, 21710=>1000, 21720=>1000, 21728=>1000, 21729=>1000, 21730=>1000, 21733=>1000, 21734=>1000, 21736=>1000, 21737=>1000, + 21738=>1000, 21740=>1000, 21741=>1000, 21742=>1000, 21743=>1000, 21746=>1000, 21750=>1000, 21754=>1000, 21756=>1000, 21757=>1000, 21758=>1000, 21759=>1000, 21760=>1000, 21761=>1000, 21764=>1000, 21765=>1000, + 21766=>1000, 21767=>1000, 21768=>1000, 21769=>1000, 21772=>1000, 21773=>1000, 21774=>1000, 21775=>1000, 21776=>1000, 21780=>1000, 21781=>1000, 21782=>1000, 21802=>1000, 21803=>1000, 21806=>1000, 21807=>1000, + 21809=>1000, 21810=>1000, 21811=>1000, 21813=>1000, 21814=>1000, 21816=>1000, 21817=>1000, 21819=>1000, 21820=>1000, 21821=>1000, 21822=>1000, 21824=>1000, 21825=>1000, 21828=>1000, 21829=>1000, 21830=>1000, + 21831=>1000, 21833=>1000, 21834=>1000, 21836=>1000, 21837=>1000, 21839=>1000, 21840=>1000, 21841=>1000, 21843=>1000, 21846=>1000, 21847=>1000, 21848=>1000, 21850=>1000, 21851=>1000, 21852=>1000, 21853=>1000, + 21854=>1000, 21856=>1000, 21857=>1000, 21859=>1000, 21860=>1000, 21862=>1000, 21883=>1000, 21884=>1000, 21886=>1000, 21887=>1000, 21888=>1000, 21889=>1000, 21890=>1000, 21891=>1000, 21892=>1000, 21894=>1000, + 21895=>1000, 21896=>1000, 21897=>1000, 21898=>1000, 21899=>1000, 21902=>1000, 21903=>1000, 21905=>1000, 21906=>1000, 21907=>1000, 21908=>1000, 21911=>1000, 21912=>1000, 21913=>1000, 21914=>1000, 21916=>1000, + 21917=>1000, 21918=>1000, 21919=>1000, 21923=>1000, 21924=>1000, 21927=>1000, 21928=>1000, 21929=>1000, 21930=>1000, 21931=>1000, 21932=>1000, 21933=>1000, 21934=>1000, 21936=>1000, 21938=>1000, 21942=>1000, + 21951=>1000, 21953=>1000, 21955=>1000, 21956=>1000, 21957=>1000, 21958=>1000, 21959=>1000, 21961=>1000, 21963=>1000, 21964=>1000, 21966=>1000, 21969=>1000, 21970=>1000, 21971=>1000, 21972=>1000, 21975=>1000, + 21976=>1000, 21978=>1000, 21979=>1000, 21980=>1000, 21982=>1000, 21983=>1000, 21986=>1000, 21987=>1000, 21988=>1000, 21993=>1000, 22006=>1000, 22007=>1000, 22009=>1000, 22013=>1000, 22014=>1000, 22015=>1000, + 22021=>1000, 22022=>1000, 22024=>1000, 22025=>1000, 22026=>1000, 22029=>1000, 22030=>1000, 22031=>1000, 22032=>1000, 22033=>1000, 22034=>1000, 22036=>1000, 22038=>1000, 22039=>1000, 22040=>1000, 22041=>1000, + 22043=>1000, 22057=>1000, 22060=>1000, 22063=>1000, 22064=>1000, 22065=>1000, 22066=>1000, 22067=>1000, 22068=>1000, 22069=>1000, 22070=>1000, 22071=>1000, 22072=>1000, 22073=>1000, 22075=>1000, 22076=>1000, + 22077=>1000, 22079=>1000, 22080=>1000, 22081=>1000, 22082=>1000, 22083=>1000, 22084=>1000, 22086=>1000, 22089=>1000, 22091=>1000, 22092=>1000, 22093=>1000, 22094=>1000, 22095=>1000, 22096=>1000, 22100=>1000, + 22107=>1000, 22110=>1000, 22112=>1000, 22113=>1000, 22114=>1000, 22115=>1000, 22116=>1000, 22118=>1000, 22120=>1000, 22121=>1000, 22122=>1000, 22123=>1000, 22124=>1000, 22125=>1000, 22127=>1000, 22129=>1000, + 22130=>1000, 22132=>1000, 22133=>1000, 22136=>1000, 22138=>1000, 22144=>1000, 22148=>1000, 22149=>1000, 22150=>1000, 22151=>1000, 22152=>1000, 22154=>1000, 22155=>1000, 22156=>1000, 22159=>1000, 22164=>1000, + 22165=>1000, 22169=>1000, 22170=>1000, 22173=>1000, 22174=>1000, 22175=>1000, 22176=>1000, 22178=>1000, 22181=>1000, 22182=>1000, 22183=>1000, 22184=>1000, 22185=>1000, 22187=>1000, 22188=>1000, 22189=>1000, + 22190=>1000, 22193=>1000, 22195=>1000, 22196=>1000, 22198=>1000, 22199=>1000, 22204=>1000, 22206=>1000, 22208=>1000, 22209=>1000, 22210=>1000, 22211=>1000, 22213=>1000, 22216=>1000, 22217=>1000, 22218=>1000, + 22219=>1000, 22220=>1000, 22221=>1000, 22222=>1000, 22223=>1000, 22224=>1000, 22225=>1000, 22227=>1000, 22231=>1000, 22232=>1000, 22233=>1000, 22234=>1000, 22235=>1000, 22236=>1000, 22237=>1000, 22238=>1000, + 22239=>1000, 22240=>1000, 22241=>1000, 22243=>1000, 22244=>1000, 22245=>1000, 22246=>1000, 22247=>1000, 22248=>1000, 22251=>1000, 22253=>1000, 22254=>1000, 22256=>1000, 22257=>1000, 22258=>1000, 22259=>1000, + 22262=>1000, 22263=>1000, 22265=>1000, 22266=>1000, 22269=>1000, 22271=>1000, 22272=>1000, 22273=>1000, 22274=>1000, 22275=>1000, 22276=>1000, 22279=>1000, 22280=>1000, 22281=>1000, 22282=>1000, 22283=>1000, + 22284=>1000, 22285=>1000, 22287=>1000, 22289=>1000, 22290=>1000, 22291=>1000, 22293=>1000, 22294=>1000, 22296=>1000, 22298=>1000, 22299=>1000, 22300=>1000, 22301=>1000, 22303=>1000, 22304=>1000, 22306=>1000, + 22307=>1000, 22308=>1000, 22309=>1000, 22310=>1000, 22311=>1000, 22312=>1000, 22313=>1000, 22314=>1000, 22316=>1000, 22317=>1000, 22318=>1000, 22319=>1000, 22320=>1000, 22323=>1000, 22324=>1000, 22327=>1000, + 22328=>1000, 22331=>1000, 22333=>1000, 22334=>1000, 22335=>1000, 22336=>1000, 22338=>1000, 22341=>1000, 22342=>1000, 22343=>1000, 22346=>1000, 22348=>1000, 22349=>1000, 22350=>1000, 22351=>1000, 22352=>1000, + 22353=>1000, 22354=>1000, 22361=>1000, 22369=>1000, 22370=>1000, 22372=>1000, 22373=>1000, 22374=>1000, 22375=>1000, 22376=>1000, 22377=>1000, 22378=>1000, 22379=>1000, 22381=>1000, 22382=>1000, 22383=>1000, + 22384=>1000, 22385=>1000, 22387=>1000, 22388=>1000, 22389=>1000, 22391=>1000, 22393=>1000, 22394=>1000, 22395=>1000, 22396=>1000, 22398=>1000, 22399=>1000, 22401=>1000, 22402=>1000, 22403=>1000, 22408=>1000, + 22409=>1000, 22411=>1000, 22412=>1000, 22419=>1000, 22420=>1000, 22421=>1000, 22423=>1000, 22425=>1000, 22426=>1000, 22428=>1000, 22429=>1000, 22430=>1000, 22431=>1000, 22432=>1000, 22433=>1000, 22434=>1000, + 22435=>1000, 22436=>1000, 22439=>1000, 22440=>1000, 22441=>1000, 22442=>1000, 22444=>1000, 22448=>1000, 22451=>1000, 22456=>1000, 22461=>1000, 22464=>1000, 22467=>1000, 22470=>1000, 22471=>1000, 22472=>1000, + 22475=>1000, 22476=>1000, 22478=>1000, 22479=>1000, 22482=>1000, 22483=>1000, 22484=>1000, 22485=>1000, 22486=>1000, 22492=>1000, 22493=>1000, 22494=>1000, 22495=>1000, 22496=>1000, 22497=>1000, 22499=>1000, + 22500=>1000, 22502=>1000, 22503=>1000, 22505=>1000, 22509=>1000, 22512=>1000, 22516=>1000, 22517=>1000, 22518=>1000, 22519=>1000, 22520=>1000, 22521=>1000, 22522=>1000, 22524=>1000, 22525=>1000, 22526=>1000, + 22527=>1000, 22528=>1000, 22530=>1000, 22531=>1000, 22532=>1000, 22533=>1000, 22534=>1000, 22536=>1000, 22537=>1000, 22538=>1000, 22539=>1000, 22540=>1000, 22541=>1000, 22549=>1000, 22553=>1000, 22555=>1000, + 22557=>1000, 22558=>1000, 22559=>1000, 22560=>1000, 22561=>1000, 22564=>1000, 22566=>1000, 22567=>1000, 22570=>1000, 22573=>1000, 22575=>1000, 22576=>1000, 22577=>1000, 22578=>1000, 22580=>1000, 22581=>1000, + 22585=>1000, 22586=>1000, 22589=>1000, 22591=>1000, 22592=>1000, 22593=>1000, 22601=>1000, 22602=>1000, 22603=>1000, 22604=>1000, 22605=>1000, 22607=>1000, 22608=>1000, 22609=>1000, 22610=>1000, 22612=>1000, + 22613=>1000, 22615=>1000, 22616=>1000, 22617=>1000, 22618=>1000, 22622=>1000, 22623=>1000, 22625=>1000, 22626=>1000, 22628=>1000, 22631=>1000, 22632=>1000, 22633=>1000, 22635=>1000, 22640=>1000, 22642=>1000, + 22645=>1000, 22648=>1000, 22649=>1000, 22652=>1000, 22654=>1000, 22655=>1000, 22656=>1000, 22657=>1000, 22659=>1000, 22661=>1000, 22663=>1000, 22664=>1000, 22665=>1000, 22666=>1000, 22668=>1000, 22669=>1000, + 22671=>1000, 22672=>1000, 22675=>1000, 22676=>1000, 22678=>1000, 22679=>1000, 22684=>1000, 22685=>1000, 22686=>1000, 22687=>1000, 22688=>1000, 22689=>1000, 22690=>1000, 22694=>1000, 22696=>1000, 22697=>1000, + 22699=>1000, 22702=>1000, 22705=>1000, 22706=>1000, 22707=>1000, 22712=>1000, 22713=>1000, 22714=>1000, 22715=>1000, 22716=>1000, 22718=>1000, 22721=>1000, 22722=>1000, 22724=>1000, 22725=>1000, 22727=>1000, + 22728=>1000, 22730=>1000, 22732=>1000, 22733=>1000, 22734=>1000, 22736=>1000, 22737=>1000, 22738=>1000, 22739=>1000, 22740=>1000, 22741=>1000, 22742=>1000, 22743=>1000, 22744=>1000, 22745=>1000, 22746=>1000, + 22748=>1000, 22749=>1000, 22750=>1000, 22751=>1000, 22753=>1000, 22754=>1000, 22756=>1000, 22757=>1000, 22761=>1000, 22763=>1000, 22764=>1000, 22766=>1000, 22767=>1000, 22768=>1000, 22769=>1000, 22770=>1000, + 22771=>1000, 22775=>1000, 22777=>1000, 22778=>1000, 22779=>1000, 22780=>1000, 22781=>1000, 22786=>1000, 22789=>1000, 22790=>1000, 22793=>1000, 22794=>1000, 22795=>1000, 22796=>1000, 22799=>1000, 22800=>1000, + 22802=>1000, 22803=>1000, 22804=>1000, 22805=>1000, 22806=>1000, 22808=>1000, 22809=>1000, 22810=>1000, 22811=>1000, 22812=>1000, 22813=>1000, 22817=>1000, 22818=>1000, 22819=>1000, 22820=>1000, 22821=>1000, + 22823=>1000, 22824=>1000, 22825=>1000, 22826=>1000, 22827=>1000, 22828=>1000, 22829=>1000, 22830=>1000, 22831=>1000, 22832=>1000, 22833=>1000, 22834=>1000, 22835=>1000, 22837=>1000, 22838=>1000, 22839=>1000, + 22840=>1000, 22846=>1000, 22847=>1000, 22851=>1000, 22852=>1000, 22854=>1000, 22855=>1000, 22856=>1000, 22857=>1000, 22862=>1000, 22863=>1000, 22864=>1000, 22865=>1000, 22866=>1000, 22867=>1000, 22868=>1000, + 22869=>1000, 22871=>1000, 22872=>1000, 22873=>1000, 22874=>1000, 22875=>1000, 22877=>1000, 22878=>1000, 22879=>1000, 22880=>1000, 22881=>1000, 22882=>1000, 22883=>1000, 22885=>1000, 22887=>1000, 22888=>1000, + 22889=>1000, 22890=>1000, 22891=>1000, 22892=>1000, 22893=>1000, 22894=>1000, 22895=>1000, 22898=>1000, 22899=>1000, 22900=>1000, 22901=>1000, 22902=>1000, 22904=>1000, 22905=>1000, 22907=>1000, 22908=>1000, + 22909=>1000, 22913=>1000, 22914=>1000, 22915=>1000, 22916=>1000, 22922=>1000, 22923=>1000, 22924=>1000, 22925=>1000, 22926=>1000, 22930=>1000, 22931=>1000, 22933=>1000, 22934=>1000, 22935=>1000, 22937=>1000, + 22939=>1000, 22941=>1000, 22943=>1000, 22947=>1000, 22948=>1000, 22949=>1000, 22951=>1000, 22952=>1000, 22956=>1000, 22957=>1000, 22958=>1000, 22959=>1000, 22960=>1000, 22962=>1000, 22963=>1000, 22967=>1000, + 22969=>1000, 22970=>1000, 22971=>1000, 22972=>1000, 22974=>1000, 22977=>1000, 22979=>1000, 22980=>1000, 22982=>1000, 22984=>1000, 22985=>1000, 22986=>1000, 22987=>1000, 22989=>1000, 22992=>1000, 22993=>1000, + 22994=>1000, 22995=>1000, 22996=>1000, 23001=>1000, 23002=>1000, 23004=>1000, 23005=>1000, 23006=>1000, 23007=>1000, 23011=>1000, 23012=>1000, 23013=>1000, 23014=>1000, 23015=>1000, 23016=>1000, 23018=>1000, + 23019=>1000, 23022=>1000, 23023=>1000, 23025=>1000, 23026=>1000, 23028=>1000, 23030=>1000, 23031=>1000, 23035=>1000, 23039=>1000, 23040=>1000, 23041=>1000, 23043=>1000, 23044=>1000, 23049=>1000, 23052=>1000, + 23053=>1000, 23054=>1000, 23057=>1000, 23058=>1000, 23059=>1000, 23064=>1000, 23066=>1000, 23068=>1000, 23070=>1000, 23071=>1000, 23072=>1000, 23075=>1000, 23076=>1000, 23077=>1000, 23079=>1000, 23080=>1000, + 23081=>1000, 23082=>1000, 23085=>1000, 23087=>1000, 23088=>1000, 23093=>1000, 23094=>1000, 23100=>1000, 23104=>1000, 23105=>1000, 23108=>1000, 23109=>1000, 23110=>1000, 23111=>1000, 23112=>1000, 23113=>1000, + 23116=>1000, 23120=>1000, 23125=>1000, 23130=>1000, 23134=>1000, 23138=>1000, 23139=>1000, 23141=>1000, 23142=>1000, 23143=>1000, 23146=>1000, 23148=>1000, 23149=>1000, 23159=>1000, 23162=>1000, 23163=>1000, + 23166=>1000, 23167=>1000, 23179=>1000, 23184=>1000, 23186=>1000, 23187=>1000, 23190=>1000, 23193=>1000, 23194=>1000, 23195=>1000, 23196=>1000, 23198=>1000, 23199=>1000, 23200=>1000, 23202=>1000, 23207=>1000, + 23212=>1000, 23217=>1000, 23218=>1000, 23219=>1000, 23221=>1000, 23224=>1000, 23226=>1000, 23227=>1000, 23228=>1000, 23229=>1000, 23230=>1000, 23231=>1000, 23233=>1000, 23234=>1000, 23236=>1000, 23238=>1000, + 23240=>1000, 23241=>1000, 23243=>1000, 23244=>1000, 23247=>1000, 23248=>1000, 23254=>1000, 23255=>1000, 23258=>1000, 23260=>1000, 23264=>1000, 23265=>1000, 23267=>1000, 23269=>1000, 23270=>1000, 23273=>1000, + 23274=>1000, 23278=>1000, 23285=>1000, 23286=>1000, 23290=>1000, 23291=>1000, 23293=>1000, 23296=>1000, 23297=>1000, 23304=>1000, 23305=>1000, 23307=>1000, 23308=>1000, 23318=>1000, 23319=>1000, 23321=>1000, + 23323=>1000, 23325=>1000, 23329=>1000, 23330=>1000, 23333=>1000, 23338=>1000, 23340=>1000, 23341=>1000, 23344=>1000, 23346=>1000, 23348=>1000, 23350=>1000, 23352=>1000, 23358=>1000, 23360=>1000, 23361=>1000, + 23363=>1000, 23365=>1000, 23371=>1000, 23372=>1000, 23376=>1000, 23377=>1000, 23378=>1000, 23380=>1000, 23381=>1000, 23382=>1000, 23383=>1000, 23384=>1000, 23386=>1000, 23387=>1000, 23388=>1000, 23389=>1000, + 23390=>1000, 23391=>1000, 23395=>1000, 23396=>1000, 23397=>1000, 23398=>1000, 23400=>1000, 23401=>1000, 23403=>1000, 23406=>1000, 23407=>1000, 23408=>1000, 23409=>1000, 23411=>1000, 23413=>1000, 23416=>1000, + 23418=>1000, 23420=>1000, 23421=>1000, 23422=>1000, 23423=>1000, 23424=>1000, 23425=>1000, 23427=>1000, 23428=>1000, 23429=>1000, 23430=>1000, 23431=>1000, 23432=>1000, 23433=>1000, 23434=>1000, 23435=>1000, + 23436=>1000, 23437=>1000, 23438=>1000, 23439=>1000, 23440=>1000, 23441=>1000, 23443=>1000, 23444=>1000, 23445=>1000, 23446=>1000, 23447=>1000, 23448=>1000, 23449=>1000, 23450=>1000, 23451=>1000, 23452=>1000, + 23453=>1000, 23455=>1000, 23458=>1000, 23459=>1000, 23460=>1000, 23461=>1000, 23462=>1000, 23464=>1000, 23465=>1000, 23468=>1000, 23469=>1000, 23470=>1000, 23471=>1000, 23472=>1000, 23473=>1000, 23474=>1000, + 23475=>1000, 23476=>1000, 23477=>1000, 23478=>1000, 23479=>1000, 23480=>1000, 23481=>1000, 23482=>1000, 23484=>1000, 23487=>1000, 23488=>1000, 23489=>1000, 23490=>1000, 23491=>1000, 23492=>1000, 23493=>1000, + 23494=>1000, 23495=>1000, 23497=>1000, 23500=>1000, 23501=>1000, 23503=>1000, 23504=>1000, 23506=>1000, 23507=>1000, 23508=>1000, 23510=>1000, 23511=>1000, 23512=>1000, 23513=>1000, 23514=>1000, 23515=>1000, + 23517=>1000, 23518=>1000, 23519=>1000, 23520=>1000, 23521=>1000, 23522=>1000, 23524=>1000, 23525=>1000, 23526=>1000, 23527=>1000, 23528=>1000, 23529=>1000, 23531=>1000, 23532=>1000, 23534=>1000, 23535=>1000, + 23536=>1000, 23537=>1000, 23539=>1000, 23540=>1000, 23541=>1000, 23542=>1000, 23544=>1000, 23546=>1000, 23549=>1000, 23550=>1000, 23551=>1000, 23553=>1000, 23554=>1000, 23556=>1000, 23557=>1000, 23558=>1000, + 23559=>1000, 23560=>1000, 23561=>1000, 23562=>1000, 23563=>1000, 23564=>1000, 23565=>1000, 23566=>1000, 23567=>1000, 23569=>1000, 23571=>1000, 23574=>1000, 23575=>1000, 23578=>1000, 23582=>1000, 23583=>1000, + 23584=>1000, 23586=>1000, 23587=>1000, 23588=>1000, 23590=>1000, 23592=>1000, 23593=>1000, 23595=>1000, 23596=>1000, 23597=>1000, 23598=>1000, 23600=>1000, 23601=>1000, 23602=>1000, 23605=>1000, 23606=>1000, + 23608=>1000, 23609=>1000, 23610=>1000, 23611=>1000, 23612=>1000, 23613=>1000, 23614=>1000, 23615=>1000, 23616=>1000, 23617=>1000, 23621=>1000, 23622=>1000, 23624=>1000, 23626=>1000, 23627=>1000, 23629=>1000, + 23630=>1000, 23631=>1000, 23632=>1000, 23633=>1000, 23635=>1000, 23637=>1000, 23641=>1000, 23642=>1000, 23644=>1000, 23646=>1000, 23648=>1000, 23649=>1000, 23650=>1000, 23651=>1000, 23652=>1000, 23653=>1000, + 23655=>1000, 23656=>1000, 23657=>1000, 23660=>1000, 23661=>1000, 23662=>1000, 23663=>1000, 23664=>1000, 23665=>1000, 23668=>1000, 23669=>1000, 23670=>1000, 23673=>1000, 23674=>1000, 23675=>1000, 23676=>1000, + 23677=>1000, 23687=>1000, 23688=>1000, 23690=>1000, 23692=>1000, 23695=>1000, 23696=>1000, 23697=>1000, 23698=>1000, 23700=>1000, 23709=>1000, 23711=>1000, 23712=>1000, 23713=>1000, 23714=>1000, 23715=>1000, + 23718=>1000, 23720=>1000, 23721=>1000, 23722=>1000, 23723=>1000, 23724=>1000, 23729=>1000, 23730=>1000, 23731=>1000, 23732=>1000, 23733=>1000, 23734=>1000, 23735=>1000, 23736=>1000, 23738=>1000, 23739=>1000, + 23740=>1000, 23742=>1000, 23749=>1000, 23751=>1000, 23753=>1000, 23755=>1000, 23762=>1000, 23767=>1000, 23769=>1000, 23773=>1000, 23776=>1000, 23777=>1000, 23784=>1000, 23785=>1000, 23786=>1000, 23789=>1000, + 23790=>1000, 23791=>1000, 23792=>1000, 23793=>1000, 23794=>1000, 23796=>1000, 23797=>1000, 23798=>1000, 23802=>1000, 23803=>1000, 23805=>1000, 23809=>1000, 23814=>1000, 23815=>1000, 23819=>1000, 23821=>1000, + 23822=>1000, 23825=>1000, 23826=>1000, 23828=>1000, 23829=>1000, 23830=>1000, 23831=>1000, 23832=>1000, 23833=>1000, 23834=>1000, 23835=>1000, 23839=>1000, 23842=>1000, 23843=>1000, 23844=>1000, 23846=>1000, + 23847=>1000, 23849=>1000, 23851=>1000, 23857=>1000, 23860=>1000, 23865=>1000, 23869=>1000, 23871=>1000, 23874=>1000, 23875=>1000, 23878=>1000, 23880=>1000, 23882=>1000, 23883=>1000, 23884=>1000, 23886=>1000, + 23888=>1000, 23889=>1000, 23890=>1000, 23893=>1000, 23897=>1000, 23900=>1000, 23903=>1000, 23904=>1000, 23905=>1000, 23906=>1000, 23908=>1000, 23913=>1000, 23914=>1000, 23916=>1000, 23917=>1000, 23919=>1000, + 23920=>1000, 23923=>1000, 23926=>1000, 23929=>1000, 23930=>1000, 23934=>1000, 23935=>1000, 23937=>1000, 23938=>1000, 23939=>1000, 23940=>1000, 23943=>1000, 23944=>1000, 23946=>1000, 23947=>1000, 23948=>1000, + 23952=>1000, 23954=>1000, 23955=>1000, 23956=>1000, 23957=>1000, 23961=>1000, 23963=>1000, 23965=>1000, 23967=>1000, 23968=>1000, 23970=>1000, 23975=>1000, 23979=>1000, 23980=>1000, 23982=>1000, 23984=>1000, + 23986=>1000, 23988=>1000, 23991=>1000, 23992=>1000, 23993=>1000, 23994=>1000, 23996=>1000, 23997=>1000, 24003=>1000, 24007=>1000, 24009=>1000, 24011=>1000, 24012=>1000, 24013=>1000, 24014=>1000, 24016=>1000, + 24018=>1000, 24019=>1000, 24022=>1000, 24024=>1000, 24025=>1000, 24027=>1000, 24029=>1000, 24030=>1000, 24032=>1000, 24033=>1000, 24035=>1000, 24036=>1000, 24037=>1000, 24038=>1000, 24039=>1000, 24040=>1000, + 24041=>1000, 24043=>1000, 24046=>1000, 24049=>1000, 24050=>1000, 24051=>1000, 24052=>1000, 24053=>1000, 24055=>1000, 24056=>1000, 24057=>1000, 24059=>1000, 24061=>1000, 24062=>1000, 24064=>1000, 24066=>1000, + 24067=>1000, 24070=>1000, 24071=>1000, 24075=>1000, 24076=>1000, 24077=>1000, 24081=>1000, 24082=>1000, 24084=>1000, 24085=>1000, 24086=>1000, 24088=>1000, 24089=>1000, 24090=>1000, 24091=>1000, 24093=>1000, + 24095=>1000, 24096=>1000, 24101=>1000, 24104=>1000, 24107=>1000, 24109=>1000, 24110=>1000, 24111=>1000, 24112=>1000, 24114=>1000, 24115=>1000, 24117=>1000, 24118=>1000, 24119=>1000, 24120=>1000, 24125=>1000, + 24126=>1000, 24128=>1000, 24131=>1000, 24132=>1000, 24133=>1000, 24135=>1000, 24137=>1000, 24139=>1000, 24140=>1000, 24142=>1000, 24144=>1000, 24145=>1000, 24148=>1000, 24149=>1000, 24150=>1000, 24151=>1000, + 24152=>1000, 24155=>1000, 24156=>1000, 24158=>1000, 24159=>1000, 24161=>1000, 24162=>1000, 24163=>1000, 24164=>1000, 24168=>1000, 24170=>1000, 24171=>1000, 24172=>1000, 24173=>1000, 24174=>1000, 24176=>1000, + 24178=>1000, 24179=>1000, 24180=>1000, 24181=>1000, 24182=>1000, 24184=>1000, 24185=>1000, 24186=>1000, 24187=>1000, 24188=>1000, 24189=>1000, 24190=>1000, 24191=>1000, 24192=>1000, 24193=>1000, 24195=>1000, + 24196=>1000, 24199=>1000, 24202=>1000, 24203=>1000, 24206=>1000, 24207=>1000, 24213=>1000, 24214=>1000, 24215=>1000, 24218=>1000, 24220=>1000, 24224=>1000, 24226=>1000, 24228=>1000, 24229=>1000, 24230=>1000, + 24231=>1000, 24232=>1000, 24234=>1000, 24235=>1000, 24236=>1000, 24237=>1000, 24241=>1000, 24243=>1000, 24245=>1000, 24246=>1000, 24247=>1000, 24248=>1000, 24253=>1000, 24254=>1000, 24255=>1000, 24257=>1000, + 24258=>1000, 24259=>1000, 24262=>1000, 24264=>1000, 24265=>1000, 24266=>1000, 24267=>1000, 24268=>1000, 24270=>1000, 24271=>1000, 24272=>1000, 24273=>1000, 24274=>1000, 24275=>1000, 24276=>1000, 24277=>1000, + 24278=>1000, 24282=>1000, 24283=>1000, 24284=>1000, 24285=>1000, 24286=>1000, 24287=>1000, 24288=>1000, 24289=>1000, 24290=>1000, 24291=>1000, 24293=>1000, 24296=>1000, 24297=>1000, 24299=>1000, 24300=>1000, + 24304=>1000, 24305=>1000, 24307=>1000, 24308=>1000, 24310=>1000, 24311=>1000, 24312=>1000, 24314=>1000, 24315=>1000, 24316=>1000, 24318=>1000, 24319=>1000, 24321=>1000, 24322=>1000, 24323=>1000, 24324=>1000, + 24326=>1000, 24327=>1000, 24328=>1000, 24329=>1000, 24330=>1000, 24331=>1000, 24332=>1000, 24333=>1000, 24334=>1000, 24335=>1000, 24336=>1000, 24337=>1000, 24339=>1000, 24340=>1000, 24341=>1000, 24342=>1000, + 24343=>1000, 24344=>1000, 24345=>1000, 24347=>1000, 24348=>1000, 24349=>1000, 24351=>1000, 24353=>1000, 24354=>1000, 24355=>1000, 24356=>1000, 24357=>1000, 24358=>1000, 24359=>1000, 24360=>1000, 24361=>1000, + 24363=>1000, 24364=>1000, 24365=>1000, 24366=>1000, 24367=>1000, 24368=>1000, 24369=>1000, 24372=>1000, 24373=>1000, 24374=>1000, 24375=>1000, 24376=>1000, 24379=>1000, 24380=>1000, 24381=>1000, 24382=>1000, + 24383=>1000, 24384=>1000, 24385=>1000, 24388=>1000, 24389=>1000, 24391=>1000, 24392=>1000, 24394=>1000, 24396=>1000, 24397=>1000, 24398=>1000, 24400=>1000, 24401=>1000, 24403=>1000, 24404=>1000, 24406=>1000, + 24407=>1000, 24408=>1000, 24409=>1000, 24411=>1000, 24412=>1000, 24413=>1000, 24416=>1000, 24417=>1000, 24418=>1000, 24419=>1000, 24420=>1000, 24422=>1000, 24423=>1000, 24425=>1000, 24426=>1000, 24427=>1000, + 24428=>1000, 24429=>1000, 24431=>1000, 24432=>1000, 24433=>1000, 24434=>1000, 24435=>1000, 24436=>1000, 24437=>1000, 24439=>1000, 24440=>1000, 24441=>1000, 24442=>1000, 24444=>1000, 24445=>1000, 24446=>1000, + 24447=>1000, 24448=>1000, 24449=>1000, 24450=>1000, 24451=>1000, 24452=>1000, 24453=>1000, 24455=>1000, 24456=>1000, 24457=>1000, 24458=>1000, 24459=>1000, 24460=>1000, 24461=>1000, 24463=>1000, 24464=>1000, + 24465=>1000, 24466=>1000, 24467=>1000, 24470=>1000, 24471=>1000, 24472=>1000, 24473=>1000, 24476=>1000, 24477=>1000, 24478=>1000, 24480=>1000, 24481=>1000, 24482=>1000, 24484=>1000, 24487=>1000, 24488=>1000, + 24489=>1000, 24490=>1000, 24491=>1000, 24492=>1000, 24493=>1000, 24494=>1000, 24495=>1000, 24496=>1000, 24497=>1000, 24499=>1000, 24500=>1000, 24503=>1000, 24504=>1000, 24505=>1000, 24508=>1000, 24509=>1000, + 24515=>1000, 24516=>1000, 24517=>1000, 24519=>1000, 24520=>1000, 24521=>1000, 24523=>1000, 24524=>1000, 24525=>1000, 24528=>1000, 24529=>1000, 24530=>1000, 24531=>1000, 24532=>1000, 24534=>1000, 24535=>1000, + 24536=>1000, 24537=>1000, 24540=>1000, 24541=>1000, 24542=>1000, 24544=>1000, 24545=>1000, 24546=>1000, 24548=>1000, 24552=>1000, 24553=>1000, 24554=>1000, 24555=>1000, 24556=>1000, 24557=>1000, 24558=>1000, + 24559=>1000, 24560=>1000, 24561=>1000, 24562=>1000, 24563=>1000, 24565=>1000, 24566=>1000, 24568=>1000, 24570=>1000, 24571=>1000, 24572=>1000, 24573=>1000, 24575=>1000, 24583=>1000, 24586=>1000, 24589=>1000, + 24590=>1000, 24591=>1000, 24592=>1000, 24594=>1000, 24595=>1000, 24596=>1000, 24597=>1000, 24598=>1000, 24599=>1000, 24600=>1000, 24601=>1000, 24602=>1000, 24603=>1000, 24604=>1000, 24605=>1000, 24607=>1000, + 24608=>1000, 24609=>1000, 24612=>1000, 24613=>1000, 24614=>1000, 24615=>1000, 24616=>1000, 24617=>1000, 24618=>1000, 24619=>1000, 24621=>1000, 24623=>1000, 24625=>1000, 24627=>1000, 24629=>1000, 24634=>1000, + 24640=>1000, 24641=>1000, 24642=>1000, 24643=>1000, 24646=>1000, 24647=>1000, 24648=>1000, 24649=>1000, 24650=>1000, 24651=>1000, 24652=>1000, 24653=>1000, 24656=>1000, 24657=>1000, 24658=>1000, 24660=>1000, + 24661=>1000, 24662=>1000, 24663=>1000, 24665=>1000, 24666=>1000, 24669=>1000, 24671=>1000, 24672=>1000, 24673=>1000, 24674=>1000, 24675=>1000, 24676=>1000, 24677=>1000, 24679=>1000, 24680=>1000, 24681=>1000, + 24682=>1000, 24683=>1000, 24684=>1000, 24685=>1000, 24687=>1000, 24688=>1000, 24689=>1000, 24693=>1000, 24695=>1000, 24702=>1000, 24703=>1000, 24705=>1000, 24706=>1000, 24707=>1000, 24708=>1000, 24709=>1000, + 24710=>1000, 24712=>1000, 24713=>1000, 24714=>1000, 24715=>1000, 24716=>1000, 24717=>1000, 24718=>1000, 24721=>1000, 24722=>1000, 24723=>1000, 24724=>1000, 24725=>1000, 24726=>1000, 24727=>1000, 24728=>1000, + 24730=>1000, 24731=>1000, 24733=>1000, 24734=>1000, 24735=>1000, 24736=>1000, 24738=>1000, 24739=>1000, 24740=>1000, 24741=>1000, 24742=>1000, 24743=>1000, 24744=>1000, 24745=>1000, 24746=>1000, 24752=>1000, + 24753=>1000, 24754=>1000, 24755=>1000, 24756=>1000, 24757=>1000, 24758=>1000, 24759=>1000, 24760=>1000, 24763=>1000, 24764=>1000, 24765=>1000, 24766=>1000, 24770=>1000, 24772=>1000, 24773=>1000, 24774=>1000, + 24775=>1000, 24776=>1000, 24777=>1000, 24778=>1000, 24779=>1000, 24782=>1000, 24783=>1000, 24785=>1000, 24787=>1000, 24788=>1000, 24789=>1000, 24792=>1000, 24793=>1000, 24794=>1000, 24795=>1000, 24796=>1000, + 24797=>1000, 24798=>1000, 24799=>1000, 24800=>1000, 24801=>1000, 24802=>1000, 24803=>1000, 24805=>1000, 24807=>1000, 24808=>1000, 24816=>1000, 24817=>1000, 24818=>1000, 24819=>1000, 24820=>1000, 24821=>1000, + 24822=>1000, 24823=>1000, 24824=>1000, 24825=>1000, 24826=>1000, 24827=>1000, 24828=>1000, 24829=>1000, 24832=>1000, 24833=>1000, 24834=>1000, 24835=>1000, 24838=>1000, 24839=>1000, 24840=>1000, 24841=>1000, + 24842=>1000, 24844=>1000, 24845=>1000, 24846=>1000, 24847=>1000, 24848=>1000, 24849=>1000, 24850=>1000, 24851=>1000, 24852=>1000, 24853=>1000, 24854=>1000, 24855=>1000, 24857=>1000, 24858=>1000, 24859=>1000, + 24860=>1000, 24862=>1000, 24863=>1000, 24864=>1000, 24865=>1000, 24866=>1000, 24871=>1000, 24872=>1000, 24874=>1000, 24875=>1000, 24876=>1000, 24880=>1000, 24881=>1000, 24884=>1000, 24885=>1000, 24886=>1000, + 24887=>1000, 24889=>1000, 24892=>1000, 24893=>1000, 24894=>1000, 24895=>1000, 24897=>1000, 24898=>1000, 24900=>1000, 24901=>1000, 24902=>1000, 24903=>1000, 24904=>1000, 24905=>1000, 24906=>1000, 24907=>1000, + 24908=>1000, 24909=>1000, 24910=>1000, 24915=>1000, 24917=>1000, 24920=>1000, 24921=>1000, 24922=>1000, 24925=>1000, 24926=>1000, 24927=>1000, 24928=>1000, 24930=>1000, 24931=>1000, 24933=>1000, 24935=>1000, + 24936=>1000, 24939=>1000, 24940=>1000, 24942=>1000, 24943=>1000, 24944=>1000, 24945=>1000, 24946=>1000, 24947=>1000, 24948=>1000, 24949=>1000, 24950=>1000, 24951=>1000, 24952=>1000, 24955=>1000, 24956=>1000, + 24958=>1000, 24959=>1000, 24960=>1000, 24961=>1000, 24962=>1000, 24963=>1000, 24964=>1000, 24967=>1000, 24970=>1000, 24971=>1000, 24973=>1000, 24974=>1000, 24976=>1000, 24977=>1000, 24978=>1000, 24979=>1000, + 24980=>1000, 24982=>1000, 24983=>1000, 24984=>1000, 24985=>1000, 24986=>1000, 24988=>1000, 24989=>1000, 24991=>1000, 24992=>1000, 24996=>1000, 24997=>1000, 24999=>1000, 25000=>1000, 25001=>1000, 25002=>1000, + 25003=>1000, 25004=>1000, 25005=>1000, 25006=>1000, 25010=>1000, 25014=>1000, 25016=>1000, 25017=>1000, 25018=>1000, 25020=>1000, 25022=>1000, 25024=>1000, 25025=>1000, 25026=>1000, 25027=>1000, 25030=>1000, + 25031=>1000, 25032=>1000, 25033=>1000, 25034=>1000, 25035=>1000, 25036=>1000, 25037=>1000, 25038=>1000, 25039=>1000, 25040=>1000, 25045=>1000, 25052=>1000, 25053=>1000, 25054=>1000, 25055=>1000, 25057=>1000, + 25058=>1000, 25059=>1000, 25061=>1000, 25062=>1000, 25063=>1000, 25065=>1000, 25068=>1000, 25069=>1000, 25071=>1000, 25074=>1000, 25076=>1000, 25078=>1000, 25079=>1000, 25080=>1000, 25082=>1000, 25084=>1000, + 25085=>1000, 25086=>1000, 25087=>1000, 25088=>1000, 25089=>1000, 25091=>1000, 25092=>1000, 25095=>1000, 25096=>1000, 25097=>1000, 25098=>1000, 25100=>1000, 25101=>1000, 25102=>1000, 25104=>1000, 25105=>1000, + 25106=>1000, 25107=>1000, 25108=>1000, 25109=>1000, 25110=>1000, 25114=>1000, 25115=>1000, 25116=>1000, 25117=>1000, 25118=>1000, 25119=>1000, 25120=>1000, 25121=>1000, 25122=>1000, 25123=>1000, 25126=>1000, + 25127=>1000, 25129=>1000, 25130=>1000, 25131=>1000, 25134=>1000, 25135=>1000, 25136=>1000, 25138=>1000, 25139=>1000, 25140=>1000, 25144=>1000, 25145=>1000, 25147=>1000, 25149=>1000, 25151=>1000, 25152=>1000, + 25153=>1000, 25154=>1000, 25155=>1000, 25156=>1000, 25158=>1000, 25159=>1000, 25160=>1000, 25161=>1000, 25163=>1000, 25164=>1000, 25165=>1000, 25166=>1000, 25168=>1000, 25169=>1000, 25170=>1000, 25171=>1000, + 25172=>1000, 25173=>1000, 25174=>1000, 25176=>1000, 25178=>1000, 25179=>1000, 25180=>1000, 25182=>1000, 25184=>1000, 25187=>1000, 25188=>1000, 25192=>1000, 25197=>1000, 25198=>1000, 25199=>1000, 25201=>1000, + 25203=>1000, 25206=>1000, 25209=>1000, 25210=>1000, 25212=>1000, 25213=>1000, 25214=>1000, 25215=>1000, 25216=>1000, 25218=>1000, 25219=>1000, 25220=>1000, 25225=>1000, 25226=>1000, 25229=>1000, 25230=>1000, + 25231=>1000, 25232=>1000, 25233=>1000, 25234=>1000, 25235=>1000, 25236=>1000, 25237=>1000, 25238=>1000, 25239=>1000, 25240=>1000, 25243=>1000, 25244=>1000, 25246=>1000, 25254=>1000, 25256=>1000, 25259=>1000, + 25260=>1000, 25265=>1000, 25267=>1000, 25269=>1000, 25270=>1000, 25271=>1000, 25273=>1000, 25274=>1000, 25275=>1000, 25276=>1000, 25277=>1000, 25278=>1000, 25279=>1000, 25282=>1000, 25284=>1000, 25285=>1000, + 25286=>1000, 25287=>1000, 25288=>1000, 25289=>1000, 25290=>1000, 25292=>1000, 25293=>1000, 25294=>1000, 25295=>1000, 25296=>1000, 25297=>1000, 25298=>1000, 25299=>1000, 25300=>1000, 25301=>1000, 25302=>1000, + 25303=>1000, 25304=>1000, 25305=>1000, 25306=>1000, 25307=>1000, 25308=>1000, 25309=>1000, 25312=>1000, 25313=>1000, 25322=>1000, 25324=>1000, 25325=>1000, 25326=>1000, 25327=>1000, 25329=>1000, 25330=>1000, + 25331=>1000, 25332=>1000, 25333=>1000, 25334=>1000, 25335=>1000, 25340=>1000, 25341=>1000, 25342=>1000, 25343=>1000, 25345=>1000, 25346=>1000, 25347=>1000, 25348=>1000, 25351=>1000, 25352=>1000, 25353=>1000, + 25354=>1000, 25355=>1000, 25356=>1000, 25357=>1000, 25360=>1000, 25361=>1000, 25363=>1000, 25366=>1000, 25368=>1000, 25369=>1000, 25375=>1000, 25383=>1000, 25384=>1000, 25385=>1000, 25386=>1000, 25387=>1000, + 25389=>1000, 25391=>1000, 25397=>1000, 25398=>1000, 25401=>1000, 25402=>1000, 25404=>1000, 25405=>1000, 25406=>1000, 25407=>1000, 25409=>1000, 25410=>1000, 25411=>1000, 25412=>1000, 25414=>1000, 25417=>1000, + 25418=>1000, 25419=>1000, 25420=>1000, 25421=>1000, 25422=>1000, 25423=>1000, 25424=>1000, 25426=>1000, 25427=>1000, 25428=>1000, 25429=>1000, 25431=>1000, 25432=>1000, 25435=>1000, 25436=>1000, 25445=>1000, + 25446=>1000, 25447=>1000, 25448=>1000, 25449=>1000, 25451=>1000, 25452=>1000, 25453=>1000, 25454=>1000, 25457=>1000, 25458=>1000, 25460=>1000, 25461=>1000, 25462=>1000, 25463=>1000, 25464=>1000, 25466=>1000, + 25467=>1000, 25468=>1000, 25469=>1000, 25471=>1000, 25472=>1000, 25474=>1000, 25475=>1000, 25476=>1000, 25479=>1000, 25480=>1000, 25481=>1000, 25482=>1000, 25484=>1000, 25486=>1000, 25487=>1000, 25488=>1000, + 25490=>1000, 25492=>1000, 25493=>1000, 25494=>1000, 25496=>1000, 25497=>1000, 25498=>1000, 25499=>1000, 25502=>1000, 25503=>1000, 25504=>1000, 25505=>1000, 25506=>1000, 25507=>1000, 25508=>1000, 25509=>1000, + 25510=>1000, 25511=>1000, 25512=>1000, 25513=>1000, 25514=>1000, 25515=>1000, 25516=>1000, 25517=>1000, 25518=>1000, 25519=>1000, 25522=>1000, 25524=>1000, 25525=>1000, 25531=>1000, 25533=>1000, 25534=>1000, + 25536=>1000, 25537=>1000, 25539=>1000, 25540=>1000, 25541=>1000, 25542=>1000, 25544=>1000, 25545=>1000, 25550=>1000, 25551=>1000, 25552=>1000, 25553=>1000, 25554=>1000, 25555=>1000, 25556=>1000, 25557=>1000, + 25558=>1000, 25562=>1000, 25563=>1000, 25564=>1000, 25568=>1000, 25569=>1000, 25571=>1000, 25573=>1000, 25577=>1000, 25578=>1000, 25580=>1000, 25582=>1000, 25586=>1000, 25587=>1000, 25588=>1000, 25589=>1000, + 25590=>1000, 25592=>1000, 25593=>1000, 25594=>1000, 25606=>1000, 25609=>1000, 25610=>1000, 25613=>1000, 25615=>1000, 25616=>1000, 25618=>1000, 25619=>1000, 25620=>1000, 25622=>1000, 25623=>1000, 25624=>1000, + 25628=>1000, 25630=>1000, 25632=>1000, 25634=>1000, 25636=>1000, 25637=>1000, 25638=>1000, 25640=>1000, 25641=>1000, 25642=>1000, 25644=>1000, 25645=>1000, 25647=>1000, 25648=>1000, 25652=>1000, 25653=>1000, + 25654=>1000, 25658=>1000, 25661=>1000, 25662=>1000, 25663=>1000, 25666=>1000, 25675=>1000, 25678=>1000, 25679=>1000, 25681=>1000, 25682=>1000, 25683=>1000, 25684=>1000, 25688=>1000, 25690=>1000, 25691=>1000, + 25692=>1000, 25693=>1000, 25695=>1000, 25696=>1000, 25697=>1000, 25699=>1000, 25703=>1000, 25705=>1000, 25709=>1000, 25711=>1000, 25715=>1000, 25716=>1000, 25718=>1000, 25720=>1000, 25722=>1000, 25723=>1000, + 25725=>1000, 25731=>1000, 25733=>1000, 25735=>1000, 25736=>1000, 25743=>1000, 25744=>1000, 25745=>1000, 25746=>1000, 25747=>1000, 25749=>1000, 25752=>1000, 25753=>1000, 25754=>1000, 25755=>1000, 25757=>1000, + 25758=>1000, 25759=>1000, 25761=>1000, 25763=>1000, 25764=>1000, 25765=>1000, 25766=>1000, 25768=>1000, 25769=>1000, 25771=>1000, 25772=>1000, 25773=>1000, 25774=>1000, 25776=>1000, 25778=>1000, 25779=>1000, + 25785=>1000, 25787=>1000, 25788=>1000, 25789=>1000, 25790=>1000, 25791=>1000, 25793=>1000, 25794=>1000, 25796=>1000, 25797=>1000, 25799=>1000, 25801=>1000, 25802=>1000, 25803=>1000, 25804=>1000, 25805=>1000, + 25806=>1000, 25808=>1000, 25809=>1000, 25810=>1000, 25812=>1000, 25813=>1000, 25815=>1000, 25816=>1000, 25818=>1000, 25824=>1000, 25825=>1000, 25826=>1000, 25827=>1000, 25828=>1000, 25829=>1000, 25830=>1000, + 25831=>1000, 25833=>1000, 25834=>1000, 25836=>1000, 25837=>1000, 25839=>1000, 25840=>1000, 25841=>1000, 25842=>1000, 25844=>1000, 25845=>1000, 25846=>1000, 25847=>1000, 25850=>1000, 25851=>1000, 25853=>1000, + 25854=>1000, 25855=>1000, 25856=>1000, 25857=>1000, 25860=>1000, 25861=>1000, 25864=>1000, 25865=>1000, 25866=>1000, 25871=>1000, 25875=>1000, 25876=>1000, 25878=>1000, 25880=>1000, 25881=>1000, 25883=>1000, + 25884=>1000, 25885=>1000, 25886=>1000, 25887=>1000, 25890=>1000, 25891=>1000, 25892=>1000, 25894=>1000, 25897=>1000, 25898=>1000, 25899=>1000, 25900=>1000, 25902=>1000, 25903=>1000, 25905=>1000, 25908=>1000, + 25909=>1000, 25910=>1000, 25911=>1000, 25912=>1000, 25913=>1000, 25914=>1000, 25915=>1000, 25916=>1000, 25917=>1000, 25918=>1000, 25919=>1000, 25923=>1000, 25925=>1000, 25927=>1000, 25928=>1000, 25929=>1000, + 25933=>1000, 25934=>1000, 25935=>1000, 25936=>1000, 25937=>1000, 25938=>1000, 25940=>1000, 25941=>1000, 25942=>1000, 25943=>1000, 25944=>1000, 25945=>1000, 25949=>1000, 25950=>1000, 25951=>1000, 25952=>1000, + 25954=>1000, 25955=>1000, 25958=>1000, 25959=>1000, 25963=>1000, 25964=>1000, 25968=>1000, 25970=>1000, 25972=>1000, 25973=>1000, 25975=>1000, 25976=>1000, 25978=>1000, 25981=>1000, 25985=>1000, 25986=>1000, + 25987=>1000, 25989=>1000, 25991=>1000, 25992=>1000, 25993=>1000, 25994=>1000, 25996=>1000, 25998=>1000, 26000=>1000, 26001=>1000, 26002=>1000, 26005=>1000, 26007=>1000, 26008=>1000, 26009=>1000, 26011=>1000, + 26012=>1000, 26013=>1000, 26015=>1000, 26016=>1000, 26017=>1000, 26019=>1000, 26020=>1000, 26021=>1000, 26022=>1000, 26023=>1000, 26027=>1000, 26028=>1000, 26029=>1000, 26030=>1000, 26031=>1000, 26032=>1000, + 26034=>1000, 26035=>1000, 26036=>1000, 26039=>1000, 26041=>1000, 26044=>1000, 26045=>1000, 26047=>1000, 26049=>1000, 26050=>1000, 26051=>1000, 26052=>1000, 26053=>1000, 26054=>1000, 26056=>1000, 26057=>1000, + 26059=>1000, 26060=>1000, 26062=>1000, 26063=>1000, 26064=>1000, 26066=>1000, 26068=>1000, 26070=>1000, 26071=>1000, 26072=>1000, 26073=>1000, 26075=>1000, 26079=>1000, 26080=>1000, 26081=>1000, 26082=>1000, + 26085=>1000, 26086=>1000, 26087=>1000, 26088=>1000, 26089=>1000, 26092=>1000, 26093=>1000, 26096=>1000, 26097=>1000, 26098=>1000, 26100=>1000, 26101=>1000, 26105=>1000, 26106=>1000, 26107=>1000, 26110=>1000, + 26111=>1000, 26112=>1000, 26114=>1000, 26115=>1000, 26116=>1000, 26118=>1000, 26119=>1000, 26120=>1000, 26121=>1000, 26122=>1000, 26124=>1000, 26125=>1000, 26126=>1000, 26127=>1000, 26129=>1000, 26130=>1000, + 26131=>1000, 26132=>1000, 26133=>1000, 26134=>1000, 26140=>1000, 26141=>1000, 26142=>1000, 26143=>1000, 26144=>1000, 26145=>1000, 26146=>1000, 26147=>1000, 26148=>1000, 26149=>1000, 26150=>1000, 26151=>1000, + 26152=>1000, 26153=>1000, 26154=>1000, 26155=>1000, 26156=>1000, 26157=>1000, 26158=>1000, 26159=>1000, 26160=>1000, 26161=>1000, 26163=>1000, 26164=>1000, 26165=>1000, 26166=>1000, 26167=>1000, 26169=>1000, + 26172=>1000, 26175=>1000, 26176=>1000, 26177=>1000, 26178=>1000, 26179=>1000, 26180=>1000, 26181=>1000, 26182=>1000, 26185=>1000, 26186=>1000, 26187=>1000, 26188=>1000, 26190=>1000, 26191=>1000, 26193=>1000, + 26194=>1000, 26199=>1000, 26200=>1000, 26201=>1000, 26203=>1000, 26204=>1000, 26205=>1000, 26206=>1000, 26207=>1000, 26208=>1000, 26209=>1000, 26210=>1000, 26212=>1000, 26213=>1000, 26214=>1000, 26215=>1000, + 26216=>1000, 26217=>1000, 26218=>1000, 26219=>1000, 26220=>1000, 26222=>1000, 26223=>1000, 26224=>1000, 26227=>1000, 26228=>1000, 26229=>1000, 26230=>1000, 26231=>1000, 26232=>1000, 26233=>1000, 26234=>1000, + 26235=>1000, 26236=>1000, 26238=>1000, 26239=>1000, 26240=>1000, 26241=>1000, 26243=>1000, 26244=>1000, 26247=>1000, 26248=>1000, 26249=>1000, 26251=>1000, 26252=>1000, 26253=>1000, 26254=>1000, 26256=>1000, + 26257=>1000, 26258=>1000, 26262=>1000, 26263=>1000, 26264=>1000, 26265=>1000, 26266=>1000, 26267=>1000, 26268=>1000, 26269=>1000, 26271=>1000, 26272=>1000, 26274=>1000, 26276=>1000, 26278=>1000, 26283=>1000, + 26285=>1000, 26286=>1000, 26289=>1000, 26290=>1000, 26292=>1000, 26293=>1000, 26296=>1000, 26297=>1000, 26299=>1000, 26300=>1000, 26302=>1000, 26303=>1000, 26304=>1000, 26305=>1000, 26306=>1000, 26307=>1000, + 26308=>1000, 26311=>1000, 26312=>1000, 26313=>1000, 26316=>1000, 26318=>1000, 26319=>1000, 26324=>1000, 26326=>1000, 26329=>1000, 26330=>1000, 26331=>1000, 26332=>1000, 26333=>1000, 26335=>1000, 26336=>1000, + 26342=>1000, 26344=>1000, 26345=>1000, 26347=>1000, 26348=>1000, 26350=>1000, 26352=>1000, 26354=>1000, 26355=>1000, 26356=>1000, 26357=>1000, 26359=>1000, 26360=>1000, 26361=>1000, 26362=>1000, 26363=>1000, + 26364=>1000, 26365=>1000, 26366=>1000, 26367=>1000, 26368=>1000, 26371=>1000, 26373=>1000, 26375=>1000, 26376=>1000, 26377=>1000, 26379=>1000, 26381=>1000, 26382=>1000, 26383=>1000, 26387=>1000, 26388=>1000, + 26389=>1000, 26390=>1000, 26391=>1000, 26393=>1000, 26395=>1000, 26396=>1000, 26397=>1000, 26398=>1000, 26399=>1000, 26400=>1000, 26402=>1000, 26406=>1000, 26407=>1000, 26408=>1000, 26410=>1000, 26411=>1000, + 26412=>1000, 26413=>1000, 26414=>1000, 26417=>1000, 26419=>1000, 26420=>1000, 26422=>1000, 26423=>1000, 26424=>1000, 26426=>1000, 26429=>1000, 26430=>1000, 26431=>1000, 26433=>1000, 26437=>1000, 26438=>1000, + 26439=>1000, 26440=>1000, 26441=>1000, 26444=>1000, 26446=>1000, 26447=>1000, 26448=>1000, 26449=>1000, 26451=>1000, 26452=>1000, 26453=>1000, 26454=>1000, 26457=>1000, 26460=>1000, 26461=>1000, 26462=>1000, + 26463=>1000, 26464=>1000, 26465=>1000, 26466=>1000, 26467=>1000, 26468=>1000, 26469=>1000, 26470=>1000, 26474=>1000, 26476=>1000, 26477=>1000, 26478=>1000, 26479=>1000, 26480=>1000, 26481=>1000, 26482=>1000, + 26483=>1000, 26484=>1000, 26485=>1000, 26486=>1000, 26487=>1000, 26491=>1000, 26492=>1000, 26494=>1000, 26495=>1000, 26497=>1000, 26500=>1000, 26501=>1000, 26503=>1000, 26505=>1000, 26507=>1000, 26508=>1000, + 26510=>1000, 26511=>1000, 26512=>1000, 26513=>1000, 26515=>1000, 26517=>1000, 26518=>1000, 26519=>1000, 26520=>1000, 26521=>1000, 26522=>1000, 26523=>1000, 26524=>1000, 26525=>1000, 26528=>1000, 26529=>1000, + 26530=>1000, 26534=>1000, 26537=>1000, 26543=>1000, 26544=>1000, 26545=>1000, 26546=>1000, 26547=>1000, 26548=>1000, 26549=>1000, 26550=>1000, 26551=>1000, 26552=>1000, 26553=>1000, 26555=>1000, 26556=>1000, + 26557=>1000, 26560=>1000, 26561=>1000, 26562=>1000, 26563=>1000, 26564=>1000, 26565=>1000, 26566=>1000, 26568=>1000, 26569=>1000, 26570=>1000, 26574=>1000, 26575=>1000, 26576=>1000, 26577=>1000, 26578=>1000, + 26579=>1000, 26580=>1000, 26583=>1000, 26584=>1000, 26585=>1000, 26586=>1000, 26588=>1000, 26589=>1000, 26590=>1000, 26593=>1000, 26594=>1000, 26596=>1000, 26598=>1000, 26599=>1000, 26601=>1000, 26604=>1000, + 26606=>1000, 26607=>1000, 26608=>1000, 26609=>1000, 26610=>1000, 26611=>1000, 26612=>1000, 26613=>1000, 26614=>1000, 26615=>1000, 26617=>1000, 26619=>1000, 26622=>1000, 26623=>1000, 26625=>1000, 26626=>1000, + 26627=>1000, 26628=>1000, 26643=>1000, 26644=>1000, 26646=>1000, 26647=>1000, 26649=>1000, 26653=>1000, 26654=>1000, 26655=>1000, 26657=>1000, 26658=>1000, 26663=>1000, 26664=>1000, 26665=>1000, 26666=>1000, + 26667=>1000, 26668=>1000, 26669=>1000, 26671=>1000, 26672=>1000, 26673=>1000, 26674=>1000, 26675=>1000, 26676=>1000, 26680=>1000, 26681=>1000, 26683=>1000, 26684=>1000, 26685=>1000, 26687=>1000, 26688=>1000, + 26689=>1000, 26690=>1000, 26691=>1000, 26692=>1000, 26693=>1000, 26694=>1000, 26696=>1000, 26698=>1000, 26700=>1000, 26701=>1000, 26702=>1000, 26704=>1000, 26705=>1000, 26706=>1000, 26707=>1000, 26708=>1000, + 26709=>1000, 26711=>1000, 26712=>1000, 26713=>1000, 26715=>1000, 26716=>1000, 26717=>1000, 26719=>1000, 26723=>1000, 26727=>1000, 26731=>1000, 26734=>1000, 26735=>1000, 26736=>1000, 26737=>1000, 26738=>1000, + 26740=>1000, 26741=>1000, 26742=>1000, 26743=>1000, 26745=>1000, 26746=>1000, 26747=>1000, 26748=>1000, 26750=>1000, 26751=>1000, 26753=>1000, 26754=>1000, 26755=>1000, 26756=>1000, 26757=>1000, 26758=>1000, + 26760=>1000, 26765=>1000, 26767=>1000, 26771=>1000, 26772=>1000, 26774=>1000, 26775=>1000, 26776=>1000, 26778=>1000, 26779=>1000, 26780=>1000, 26781=>1000, 26783=>1000, 26784=>1000, 26785=>1000, 26786=>1000, + 26787=>1000, 26789=>1000, 26790=>1000, 26791=>1000, 26792=>1000, 26793=>1000, 26794=>1000, 26797=>1000, 26798=>1000, 26799=>1000, 26800=>1000, 26801=>1000, 26802=>1000, 26803=>1000, 26805=>1000, 26806=>1000, + 26809=>1000, 26810=>1000, 26811=>1000, 26812=>1000, 26820=>1000, 26821=>1000, 26822=>1000, 26824=>1000, 26825=>1000, 26826=>1000, 26827=>1000, 26828=>1000, 26829=>1000, 26831=>1000, 26832=>1000, 26833=>1000, + 26834=>1000, 26835=>1000, 26836=>1000, 26837=>1000, 26838=>1000, 26839=>1000, 26840=>1000, 26841=>1000, 26842=>1000, 26844=>1000, 26845=>1000, 26847=>1000, 26848=>1000, 26849=>1000, 26851=>1000, 26853=>1000, + 26855=>1000, 26856=>1000, 26858=>1000, 26859=>1000, 26860=>1000, 26861=>1000, 26862=>1000, 26863=>1000, 26864=>1000, 26865=>1000, 26866=>1000, 26869=>1000, 26870=>1000, 26873=>1000, 26874=>1000, 26875=>1000, + 26876=>1000, 26877=>1000, 26880=>1000, 26881=>1000, 26884=>1000, 26885=>1000, 26886=>1000, 26888=>1000, 26889=>1000, 26890=>1000, 26891=>1000, 26892=>1000, 26893=>1000, 26894=>1000, 26895=>1000, 26896=>1000, + 26897=>1000, 26898=>1000, 26899=>1000, 26902=>1000, 26903=>1000, 26905=>1000, 26906=>1000, 26907=>1000, 26908=>1000, 26913=>1000, 26914=>1000, 26915=>1000, 26917=>1000, 26918=>1000, 26920=>1000, 26922=>1000, + 26928=>1000, 26929=>1000, 26931=>1000, 26932=>1000, 26933=>1000, 26934=>1000, 26936=>1000, 26937=>1000, 26939=>1000, 26941=>1000, 26943=>1000, 26946=>1000, 26949=>1000, 26953=>1000, 26954=>1000, 26958=>1000, + 26963=>1000, 26964=>1000, 26965=>1000, 26967=>1000, 26969=>1000, 26970=>1000, 26971=>1000, 26972=>1000, 26973=>1000, 26974=>1000, 26976=>1000, 26977=>1000, 26978=>1000, 26979=>1000, 26980=>1000, 26981=>1000, + 26982=>1000, 26984=>1000, 26985=>1000, 26986=>1000, 26987=>1000, 26988=>1000, 26989=>1000, 26990=>1000, 26991=>1000, 26992=>1000, 26993=>1000, 26994=>1000, 26995=>1000, 26996=>1000, 26997=>1000, 26999=>1000, + 27000=>1000, 27001=>1000, 27002=>1000, 27003=>1000, 27004=>1000, 27005=>1000, 27006=>1000, 27007=>1000, 27008=>1000, 27009=>1000, 27010=>1000, 27018=>1000, 27021=>1000, 27022=>1000, 27025=>1000, 27026=>1000, + 27028=>1000, 27029=>1000, 27030=>1000, 27032=>1000, 27035=>1000, 27036=>1000, 27040=>1000, 27041=>1000, 27045=>1000, 27046=>1000, 27047=>1000, 27048=>1000, 27051=>1000, 27053=>1000, 27054=>1000, 27055=>1000, + 27057=>1000, 27058=>1000, 27060=>1000, 27063=>1000, 27064=>1000, 27066=>1000, 27067=>1000, 27068=>1000, 27070=>1000, 27071=>1000, 27073=>1000, 27075=>1000, 27077=>1000, 27079=>1000, 27080=>1000, 27082=>1000, + 27083=>1000, 27084=>1000, 27085=>1000, 27086=>1000, 27088=>1000, 27089=>1000, 27091=>1000, 27094=>1000, 27095=>1000, 27096=>1000, 27097=>1000, 27101=>1000, 27102=>1000, 27106=>1000, 27109=>1000, 27111=>1000, + 27112=>1000, 27115=>1000, 27117=>1000, 27118=>1000, 27119=>1000, 27121=>1000, 27122=>1000, 27123=>1000, 27125=>1000, 27129=>1000, 27131=>1000, 27133=>1000, 27134=>1000, 27135=>1000, 27136=>1000, 27137=>1000, + 27138=>1000, 27139=>1000, 27141=>1000, 27146=>1000, 27147=>1000, 27148=>1000, 27151=>1000, 27153=>1000, 27154=>1000, 27155=>1000, 27156=>1000, 27157=>1000, 27159=>1000, 27161=>1000, 27162=>1000, 27163=>1000, + 27165=>1000, 27166=>1000, 27167=>1000, 27168=>1000, 27169=>1000, 27170=>1000, 27171=>1000, 27172=>1000, 27176=>1000, 27177=>1000, 27178=>1000, 27179=>1000, 27182=>1000, 27184=>1000, 27186=>1000, 27188=>1000, + 27189=>1000, 27190=>1000, 27191=>1000, 27192=>1000, 27193=>1000, 27194=>1000, 27195=>1000, 27197=>1000, 27198=>1000, 27199=>1000, 27204=>1000, 27205=>1000, 27206=>1000, 27207=>1000, 27208=>1000, 27209=>1000, + 27210=>1000, 27211=>1000, 27214=>1000, 27216=>1000, 27217=>1000, 27218=>1000, 27221=>1000, 27222=>1000, 27224=>1000, 27225=>1000, 27227=>1000, 27231=>1000, 27233=>1000, 27234=>1000, 27236=>1000, 27238=>1000, + 27239=>1000, 27242=>1000, 27243=>1000, 27249=>1000, 27250=>1000, 27251=>1000, 27256=>1000, 27262=>1000, 27263=>1000, 27264=>1000, 27265=>1000, 27267=>1000, 27268=>1000, 27270=>1000, 27271=>1000, 27273=>1000, + 27275=>1000, 27277=>1000, 27278=>1000, 27280=>1000, 27281=>1000, 27287=>1000, 27291=>1000, 27292=>1000, 27293=>1000, 27294=>1000, 27295=>1000, 27296=>1000, 27298=>1000, 27299=>1000, 27301=>1000, 27306=>1000, + 27307=>1000, 27308=>1000, 27310=>1000, 27311=>1000, 27312=>1000, 27313=>1000, 27315=>1000, 27316=>1000, 27320=>1000, 27323=>1000, 27325=>1000, 27326=>1000, 27327=>1000, 27329=>1000, 27330=>1000, 27331=>1000, + 27334=>1000, 27336=>1000, 27337=>1000, 27340=>1000, 27344=>1000, 27345=>1000, 27347=>1000, 27348=>1000, 27349=>1000, 27350=>1000, 27354=>1000, 27355=>1000, 27356=>1000, 27357=>1000, 27358=>1000, 27359=>1000, + 27362=>1000, 27364=>1000, 27367=>1000, 27368=>1000, 27370=>1000, 27372=>1000, 27376=>1000, 27377=>1000, 27378=>1000, 27386=>1000, 27387=>1000, 27388=>1000, 27389=>1000, 27394=>1000, 27395=>1000, 27396=>1000, + 27397=>1000, 27398=>1000, 27399=>1000, 27401=>1000, 27402=>1000, 27407=>1000, 27408=>1000, 27409=>1000, 27410=>1000, 27414=>1000, 27415=>1000, 27419=>1000, 27421=>1000, 27422=>1000, 27423=>1000, 27424=>1000, + 27425=>1000, 27427=>1000, 27428=>1000, 27431=>1000, 27432=>1000, 27435=>1000, 27436=>1000, 27439=>1000, 27442=>1000, 27445=>1000, 27446=>1000, 27447=>1000, 27448=>1000, 27449=>1000, 27450=>1000, 27451=>1000, + 27453=>1000, 27454=>1000, 27455=>1000, 27459=>1000, 27462=>1000, 27463=>1000, 27465=>1000, 27466=>1000, 27468=>1000, 27469=>1000, 27470=>1000, 27472=>1000, 27474=>1000, 27475=>1000, 27476=>1000, 27478=>1000, + 27480=>1000, 27481=>1000, 27483=>1000, 27485=>1000, 27487=>1000, 27488=>1000, 27489=>1000, 27490=>1000, 27491=>1000, 27492=>1000, 27494=>1000, 27495=>1000, 27497=>1000, 27498=>1000, 27499=>1000, 27502=>1000, + 27503=>1000, 27504=>1000, 27507=>1000, 27508=>1000, 27509=>1000, 27512=>1000, 27513=>1000, 27515=>1000, 27517=>1000, 27518=>1000, 27519=>1000, 27520=>1000, 27522=>1000, 27523=>1000, 27524=>1000, 27525=>1000, + 27526=>1000, 27529=>1000, 27530=>1000, 27531=>1000, 27533=>1000, 27541=>1000, 27542=>1000, 27543=>1000, 27544=>1000, 27547=>1000, 27550=>1000, 27551=>1000, 27552=>1000, 27554=>1000, 27555=>1000, 27556=>1000, + 27560=>1000, 27561=>1000, 27562=>1000, 27563=>1000, 27564=>1000, 27565=>1000, 27566=>1000, 27567=>1000, 27568=>1000, 27569=>1000, 27570=>1000, 27571=>1000, 27572=>1000, 27573=>1000, 27575=>1000, 27576=>1000, + 27577=>1000, 27578=>1000, 27579=>1000, 27580=>1000, 27581=>1000, 27582=>1000, 27583=>1000, 27584=>1000, 27587=>1000, 27588=>1000, 27589=>1000, 27590=>1000, 27593=>1000, 27595=>1000, 27596=>1000, 27597=>1000, + 27598=>1000, 27602=>1000, 27603=>1000, 27604=>1000, 27606=>1000, 27608=>1000, 27610=>1000, 27611=>1000, 27615=>1000, 27617=>1000, 27619=>1000, 27622=>1000, 27623=>1000, 27627=>1000, 27628=>1000, 27630=>1000, + 27631=>1000, 27633=>1000, 27635=>1000, 27639=>1000, 27641=>1000, 27647=>1000, 27650=>1000, 27652=>1000, 27653=>1000, 27656=>1000, 27657=>1000, 27661=>1000, 27662=>1000, 27663=>1000, 27664=>1000, 27665=>1000, + 27666=>1000, 27667=>1000, 27668=>1000, 27671=>1000, 27673=>1000, 27675=>1000, 27679=>1000, 27683=>1000, 27684=>1000, 27686=>1000, 27687=>1000, 27688=>1000, 27692=>1000, 27694=>1000, 27699=>1000, 27700=>1000, + 27701=>1000, 27702=>1000, 27703=>1000, 27704=>1000, 27706=>1000, 27707=>1000, 27710=>1000, 27711=>1000, 27712=>1000, 27713=>1000, 27714=>1000, 27722=>1000, 27723=>1000, 27725=>1000, 27726=>1000, 27727=>1000, + 27728=>1000, 27730=>1000, 27732=>1000, 27733=>1000, 27735=>1000, 27737=>1000, 27738=>1000, 27739=>1000, 27740=>1000, 27741=>1000, 27742=>1000, 27743=>1000, 27744=>1000, 27746=>1000, 27751=>1000, 27752=>1000, + 27754=>1000, 27755=>1000, 27757=>1000, 27759=>1000, 27760=>1000, 27762=>1000, 27763=>1000, 27764=>1000, 27766=>1000, 27768=>1000, 27769=>1000, 27770=>1000, 27771=>1000, 27773=>1000, 27774=>1000, 27777=>1000, + 27778=>1000, 27779=>1000, 27781=>1000, 27782=>1000, 27783=>1000, 27784=>1000, 27785=>1000, 27788=>1000, 27789=>1000, 27792=>1000, 27794=>1000, 27795=>1000, 27796=>1000, 27797=>1000, 27798=>1000, 27799=>1000, + 27800=>1000, 27801=>1000, 27802=>1000, 27803=>1000, 27804=>1000, 27807=>1000, 27809=>1000, 27810=>1000, 27819=>1000, 27822=>1000, 27824=>1000, 27825=>1000, 27826=>1000, 27827=>1000, 27828=>1000, 27832=>1000, + 27833=>1000, 27834=>1000, 27835=>1000, 27836=>1000, 27837=>1000, 27838=>1000, 27839=>1000, 27841=>1000, 27842=>1000, 27844=>1000, 27845=>1000, 27846=>1000, 27849=>1000, 27850=>1000, 27852=>1000, 27853=>1000, + 27855=>1000, 27856=>1000, 27857=>1000, 27858=>1000, 27859=>1000, 27860=>1000, 27861=>1000, 27862=>1000, 27863=>1000, 27865=>1000, 27866=>1000, 27867=>1000, 27868=>1000, 27869=>1000, 27872=>1000, 27873=>1000, + 27874=>1000, 27875=>1000, 27877=>1000, 27879=>1000, 27880=>1000, 27881=>1000, 27882=>1000, 27883=>1000, 27884=>1000, 27886=>1000, 27887=>1000, 27888=>1000, 27889=>1000, 27890=>1000, 27891=>1000, 27892=>1000, + 27908=>1000, 27911=>1000, 27914=>1000, 27915=>1000, 27916=>1000, 27918=>1000, 27919=>1000, 27921=>1000, 27922=>1000, 27923=>1000, 27927=>1000, 27929=>1000, 27930=>1000, 27931=>1000, 27934=>1000, 27935=>1000, + 27941=>1000, 27942=>1000, 27943=>1000, 27944=>1000, 27945=>1000, 27946=>1000, 27947=>1000, 27950=>1000, 27951=>1000, 27953=>1000, 27954=>1000, 27955=>1000, 27957=>1000, 27958=>1000, 27960=>1000, 27961=>1000, + 27963=>1000, 27964=>1000, 27965=>1000, 27966=>1000, 27967=>1000, 27969=>1000, 27972=>1000, 27973=>1000, 27991=>1000, 27993=>1000, 27994=>1000, 27996=>1000, 27998=>1000, 27999=>1000, 28001=>1000, 28003=>1000, + 28004=>1000, 28005=>1000, 28006=>1000, 28007=>1000, 28009=>1000, 28010=>1000, 28012=>1000, 28014=>1000, 28015=>1000, 28016=>1000, 28020=>1000, 28023=>1000, 28024=>1000, 28025=>1000, 28028=>1000, 28034=>1000, + 28037=>1000, 28039=>1000, 28040=>1000, 28044=>1000, 28046=>1000, 28049=>1000, 28050=>1000, 28051=>1000, 28052=>1000, 28053=>1000, 28054=>1000, 28055=>1000, 28056=>1000, 28057=>1000, 28059=>1000, 28060=>1000, + 28074=>1000, 28076=>1000, 28079=>1000, 28082=>1000, 28084=>1000, 28085=>1000, 28087=>1000, 28088=>1000, 28089=>1000, 28092=>1000, 28093=>1000, 28095=>1000, 28096=>1000, 28100=>1000, 28101=>1000, 28102=>1000, + 28103=>1000, 28104=>1000, 28106=>1000, 28107=>1000, 28108=>1000, 28110=>1000, 28111=>1000, 28113=>1000, 28114=>1000, 28117=>1000, 28118=>1000, 28120=>1000, 28121=>1000, 28123=>1000, 28125=>1000, 28126=>1000, + 28127=>1000, 28128=>1000, 28129=>1000, 28130=>1000, 28132=>1000, 28133=>1000, 28134=>1000, 28136=>1000, 28137=>1000, 28138=>1000, 28139=>1000, 28140=>1000, 28142=>1000, 28143=>1000, 28144=>1000, 28145=>1000, + 28146=>1000, 28147=>1000, 28148=>1000, 28149=>1000, 28150=>1000, 28151=>1000, 28152=>1000, 28153=>1000, 28154=>1000, 28155=>1000, 28156=>1000, 28160=>1000, 28164=>1000, 28165=>1000, 28167=>1000, 28168=>1000, + 28169=>1000, 28170=>1000, 28171=>1000, 28179=>1000, 28181=>1000, 28185=>1000, 28186=>1000, 28187=>1000, 28189=>1000, 28190=>1000, 28191=>1000, 28192=>1000, 28193=>1000, 28194=>1000, 28195=>1000, 28196=>1000, + 28197=>1000, 28198=>1000, 28199=>1000, 28201=>1000, 28203=>1000, 28204=>1000, 28205=>1000, 28206=>1000, 28207=>1000, 28210=>1000, 28214=>1000, 28216=>1000, 28217=>1000, 28218=>1000, 28219=>1000, 28220=>1000, + 28222=>1000, 28227=>1000, 28228=>1000, 28229=>1000, 28232=>1000, 28233=>1000, 28234=>1000, 28235=>1000, 28237=>1000, 28238=>1000, 28239=>1000, 28241=>1000, 28242=>1000, 28243=>1000, 28244=>1000, 28246=>1000, + 28247=>1000, 28248=>1000, 28251=>1000, 28252=>1000, 28253=>1000, 28254=>1000, 28255=>1000, 28258=>1000, 28259=>1000, 28263=>1000, 28264=>1000, 28267=>1000, 28270=>1000, 28271=>1000, 28274=>1000, 28275=>1000, + 28278=>1000, 28283=>1000, 28285=>1000, 28286=>1000, 28287=>1000, 28288=>1000, 28290=>1000, 28300=>1000, 28301=>1000, 28303=>1000, 28304=>1000, 28307=>1000, 28310=>1000, 28312=>1000, 28313=>1000, 28316=>1000, + 28317=>1000, 28319=>1000, 28320=>1000, 28322=>1000, 28325=>1000, 28327=>1000, 28330=>1000, 28333=>1000, 28334=>1000, 28335=>1000, 28337=>1000, 28338=>1000, 28339=>1000, 28342=>1000, 28343=>1000, 28346=>1000, + 28347=>1000, 28349=>1000, 28351=>1000, 28352=>1000, 28353=>1000, 28354=>1000, 28355=>1000, 28356=>1000, 28357=>1000, 28359=>1000, 28360=>1000, 28361=>1000, 28362=>1000, 28363=>1000, 28364=>1000, 28365=>1000, + 28366=>1000, 28367=>1000, 28369=>1000, 28371=>1000, 28372=>1000, 28373=>1000, 28381=>1000, 28382=>1000, 28395=>1000, 28396=>1000, 28397=>1000, 28398=>1000, 28399=>1000, 28402=>1000, 28404=>1000, 28407=>1000, + 28408=>1000, 28409=>1000, 28411=>1000, 28413=>1000, 28414=>1000, 28415=>1000, 28417=>1000, 28418=>1000, 28420=>1000, 28422=>1000, 28424=>1000, 28425=>1000, 28426=>1000, 28428=>1000, 28429=>1000, 28431=>1000, + 28433=>1000, 28435=>1000, 28436=>1000, 28437=>1000, 28438=>1000, 28440=>1000, 28442=>1000, 28443=>1000, 28448=>1000, 28450=>1000, 28451=>1000, 28454=>1000, 28457=>1000, 28458=>1000, 28459=>1000, 28460=>1000, + 28461=>1000, 28463=>1000, 28464=>1000, 28465=>1000, 28466=>1000, 28467=>1000, 28470=>1000, 28472=>1000, 28475=>1000, 28476=>1000, 28478=>1000, 28479=>1000, 28481=>1000, 28485=>1000, 28495=>1000, 28497=>1000, + 28498=>1000, 28499=>1000, 28500=>1000, 28503=>1000, 28504=>1000, 28505=>1000, 28506=>1000, 28507=>1000, 28508=>1000, 28509=>1000, 28510=>1000, 28511=>1000, 28513=>1000, 28514=>1000, 28516=>1000, 28518=>1000, + 28520=>1000, 28524=>1000, 28525=>1000, 28526=>1000, 28527=>1000, 28528=>1000, 28532=>1000, 28536=>1000, 28538=>1000, 28540=>1000, 28541=>1000, 28542=>1000, 28544=>1000, 28545=>1000, 28546=>1000, 28547=>1000, + 28548=>1000, 28550=>1000, 28551=>1000, 28552=>1000, 28555=>1000, 28556=>1000, 28557=>1000, 28558=>1000, 28560=>1000, 28561=>1000, 28562=>1000, 28563=>1000, 28564=>1000, 28566=>1000, 28567=>1000, 28570=>1000, + 28575=>1000, 28576=>1000, 28577=>1000, 28579=>1000, 28580=>1000, 28581=>1000, 28582=>1000, 28583=>1000, 28584=>1000, 28586=>1000, 28590=>1000, 28591=>1000, 28592=>1000, 28593=>1000, 28595=>1000, 28597=>1000, + 28598=>1000, 28601=>1000, 28604=>1000, 28608=>1000, 28609=>1000, 28610=>1000, 28611=>1000, 28613=>1000, 28614=>1000, 28615=>1000, 28616=>1000, 28618=>1000, 28628=>1000, 28629=>1000, 28632=>1000, 28634=>1000, + 28635=>1000, 28638=>1000, 28639=>1000, 28640=>1000, 28641=>1000, 28644=>1000, 28648=>1000, 28649=>1000, 28651=>1000, 28652=>1000, 28654=>1000, 28655=>1000, 28656=>1000, 28657=>1000, 28659=>1000, 28661=>1000, + 28662=>1000, 28665=>1000, 28666=>1000, 28668=>1000, 28669=>1000, 28670=>1000, 28672=>1000, 28673=>1000, 28677=>1000, 28678=>1000, 28679=>1000, 28681=>1000, 28683=>1000, 28685=>1000, 28687=>1000, 28689=>1000, + 28693=>1000, 28695=>1000, 28696=>1000, 28698=>1000, 28699=>1000, 28701=>1000, 28702=>1000, 28703=>1000, 28704=>1000, 28707=>1000, 28710=>1000, 28711=>1000, 28712=>1000, 28716=>1000, 28719=>1000, 28720=>1000, + 28722=>1000, 28724=>1000, 28727=>1000, 28729=>1000, 28732=>1000, 28734=>1000, 28739=>1000, 28740=>1000, 28744=>1000, 28745=>1000, 28746=>1000, 28747=>1000, 28748=>1000, 28750=>1000, 28753=>1000, 28756=>1000, + 28757=>1000, 28760=>1000, 28765=>1000, 28766=>1000, 28771=>1000, 28772=>1000, 28773=>1000, 28779=>1000, 28780=>1000, 28782=>1000, 28783=>1000, 28784=>1000, 28789=>1000, 28790=>1000, 28792=>1000, 28796=>1000, + 28797=>1000, 28798=>1000, 28801=>1000, 28805=>1000, 28806=>1000, 28809=>1000, 28810=>1000, 28814=>1000, 28818=>1000, 28820=>1000, 28821=>1000, 28822=>1000, 28823=>1000, 28824=>1000, 28825=>1000, 28827=>1000, + 28836=>1000, 28843=>1000, 28844=>1000, 28845=>1000, 28846=>1000, 28847=>1000, 28848=>1000, 28849=>1000, 28851=>1000, 28852=>1000, 28855=>1000, 28856=>1000, 28857=>1000, 28858=>1000, 28859=>1000, 28872=>1000, + 28874=>1000, 28875=>1000, 28879=>1000, 28881=>1000, 28883=>1000, 28884=>1000, 28885=>1000, 28886=>1000, 28888=>1000, 28889=>1000, 28892=>1000, 28893=>1000, 28895=>1000, 28900=>1000, 28913=>1000, 28921=>1000, + 28922=>1000, 28925=>1000, 28931=>1000, 28932=>1000, 28933=>1000, 28934=>1000, 28935=>1000, 28937=>1000, 28939=>1000, 28940=>1000, 28943=>1000, 28948=>1000, 28953=>1000, 28954=>1000, 28956=>1000, 28958=>1000, + 28960=>1000, 28961=>1000, 28966=>1000, 28971=>1000, 28973=>1000, 28975=>1000, 28976=>1000, 28977=>1000, 28982=>1000, 28984=>1000, 28988=>1000, 28993=>1000, 28997=>1000, 28998=>1000, 28999=>1000, 29001=>1000, + 29002=>1000, 29003=>1000, 29004=>1000, 29006=>1000, 29008=>1000, 29010=>1000, 29013=>1000, 29014=>1000, 29015=>1000, 29017=>1000, 29018=>1000, 29020=>1000, 29022=>1000, 29024=>1000, 29026=>1000, 29028=>1000, + 29029=>1000, 29030=>1000, 29031=>1000, 29032=>1000, 29033=>1000, 29036=>1000, 29038=>1000, 29049=>1000, 29053=>1000, 29056=>1000, 29060=>1000, 29061=>1000, 29063=>1000, 29064=>1000, 29066=>1000, 29068=>1000, + 29071=>1000, 29074=>1000, 29076=>1000, 29077=>1000, 29081=>1000, 29082=>1000, 29083=>1000, 29087=>1000, 29088=>1000, 29090=>1000, 29096=>1000, 29100=>1000, 29103=>1000, 29104=>1000, 29105=>1000, 29106=>1000, + 29107=>1000, 29113=>1000, 29114=>1000, 29118=>1000, 29119=>1000, 29120=>1000, 29121=>1000, 29123=>1000, 29124=>1000, 29128=>1000, 29129=>1000, 29131=>1000, 29132=>1000, 29134=>1000, 29136=>1000, 29138=>1000, + 29139=>1000, 29140=>1000, 29141=>1000, 29142=>1000, 29143=>1000, 29145=>1000, 29146=>1000, 29148=>1000, 29151=>1000, 29152=>1000, 29157=>1000, 29158=>1000, 29159=>1000, 29164=>1000, 29165=>1000, 29166=>1000, + 29173=>1000, 29176=>1000, 29177=>1000, 29179=>1000, 29180=>1000, 29182=>1000, 29183=>1000, 29184=>1000, 29190=>1000, 29191=>1000, 29192=>1000, 29193=>1000, 29197=>1000, 29200=>1000, 29203=>1000, 29207=>1000, + 29210=>1000, 29211=>1000, 29213=>1000, 29215=>1000, 29220=>1000, 29224=>1000, 29226=>1000, 29227=>1000, 29228=>1000, 29229=>1000, 29231=>1000, 29232=>1000, 29234=>1000, 29236=>1000, 29237=>1000, 29238=>1000, + 29240=>1000, 29241=>1000, 29242=>1000, 29243=>1000, 29244=>1000, 29245=>1000, 29246=>1000, 29247=>1000, 29248=>1000, 29249=>1000, 29250=>1000, 29251=>1000, 29253=>1000, 29254=>1000, 29255=>1000, 29256=>1000, + 29259=>1000, 29260=>1000, 29262=>1000, 29263=>1000, 29264=>1000, 29266=>1000, 29267=>1000, 29269=>1000, 29270=>1000, 29272=>1000, 29273=>1000, 29274=>1000, 29275=>1000, 29276=>1000, 29277=>1000, 29278=>1000, + 29279=>1000, 29280=>1000, 29281=>1000, 29282=>1000, 29283=>1000, 29287=>1000, 29288=>1000, 29289=>1000, 29291=>1000, 29294=>1000, 29295=>1000, 29297=>1000, 29298=>1000, 29300=>1000, 29303=>1000, 29304=>1000, + 29305=>1000, 29307=>1000, 29308=>1000, 29309=>1000, 29310=>1000, 29311=>1000, 29312=>1000, 29313=>1000, 29314=>1000, 29316=>1000, 29319=>1000, 29321=>1000, 29325=>1000, 29326=>1000, 29330=>1000, 29331=>1000, + 29334=>1000, 29339=>1000, 29344=>1000, 29346=>1000, 29351=>1000, 29352=>1000, 29356=>1000, 29357=>1000, 29358=>1000, 29359=>1000, 29361=>1000, 29362=>1000, 29364=>1000, 29366=>1000, 29369=>1000, 29374=>1000, + 29377=>1000, 29378=>1000, 29379=>1000, 29380=>1000, 29382=>1000, 29383=>1000, 29385=>1000, 29388=>1000, 29390=>1000, 29392=>1000, 29394=>1000, 29397=>1000, 29398=>1000, 29399=>1000, 29400=>1000, 29401=>1000, + 29403=>1000, 29407=>1000, 29408=>1000, 29409=>1000, 29410=>1000, 29413=>1000, 29417=>1000, 29420=>1000, 29421=>1000, 29427=>1000, 29428=>1000, 29431=>1000, 29432=>1000, 29433=>1000, 29434=>1000, 29435=>1000, + 29436=>1000, 29437=>1000, 29438=>1000, 29442=>1000, 29444=>1000, 29445=>1000, 29447=>1000, 29450=>1000, 29451=>1000, 29453=>1000, 29458=>1000, 29459=>1000, 29462=>1000, 29463=>1000, 29464=>1000, 29465=>1000, + 29467=>1000, 29468=>1000, 29469=>1000, 29470=>1000, 29471=>1000, 29474=>1000, 29476=>1000, 29477=>1000, 29479=>1000, 29480=>1000, 29481=>1000, 29482=>1000, 29483=>1000, 29484=>1000, 29486=>1000, 29487=>1000, + 29489=>1000, 29490=>1000, 29492=>1000, 29493=>1000, 29494=>1000, 29495=>1000, 29498=>1000, 29499=>1000, 29501=>1000, 29502=>1000, 29503=>1000, 29507=>1000, 29508=>1000, 29509=>1000, 29517=>1000, 29518=>1000, + 29519=>1000, 29520=>1000, 29522=>1000, 29526=>1000, 29527=>1000, 29528=>1000, 29533=>1000, 29534=>1000, 29535=>1000, 29536=>1000, 29539=>1000, 29542=>1000, 29543=>1000, 29544=>1000, 29545=>1000, 29546=>1000, + 29547=>1000, 29548=>1000, 29550=>1000, 29551=>1000, 29552=>1000, 29553=>1000, 29554=>1000, 29557=>1000, 29559=>1000, 29560=>1000, 29561=>1000, 29562=>1000, 29563=>1000, 29564=>1000, 29568=>1000, 29569=>1000, + 29571=>1000, 29572=>1000, 29573=>1000, 29574=>1000, 29575=>1000, 29577=>1000, 29579=>1000, 29582=>1000, 29584=>1000, 29587=>1000, 29589=>1000, 29590=>1000, 29591=>1000, 29592=>1000, 29596=>1000, 29598=>1000, + 29599=>1000, 29600=>1000, 29602=>1000, 29605=>1000, 29606=>1000, 29609=>1000, 29610=>1000, 29611=>1000, 29613=>1000, 29618=>1000, 29619=>1000, 29621=>1000, 29623=>1000, 29625=>1000, 29627=>1000, 29628=>1000, + 29629=>1000, 29631=>1000, 29632=>1000, 29634=>1000, 29637=>1000, 29638=>1000, 29640=>1000, 29641=>1000, 29642=>1000, 29643=>1000, 29644=>1000, 29645=>1000, 29646=>1000, 29647=>1000, 29650=>1000, 29651=>1000, + 29654=>1000, 29657=>1000, 29661=>1000, 29662=>1000, 29664=>1000, 29665=>1000, 29667=>1000, 29669=>1000, 29670=>1000, 29671=>1000, 29673=>1000, 29674=>1000, 29677=>1000, 29678=>1000, 29681=>1000, 29684=>1000, + 29685=>1000, 29687=>1000, 29688=>1000, 29689=>1000, 29690=>1000, 29691=>1000, 29693=>1000, 29694=>1000, 29695=>1000, 29696=>1000, 29697=>1000, 29699=>1000, 29700=>1000, 29701=>1000, 29702=>1000, 29703=>1000, + 29705=>1000, 29706=>1000, 29713=>1000, 29722=>1000, 29723=>1000, 29730=>1000, 29732=>1000, 29733=>1000, 29734=>1000, 29736=>1000, 29737=>1000, 29738=>1000, 29739=>1000, 29740=>1000, 29741=>1000, 29742=>1000, + 29743=>1000, 29744=>1000, 29745=>1000, 29746=>1000, 29747=>1000, 29748=>1000, 29749=>1000, 29750=>1000, 29753=>1000, 29754=>1000, 29759=>1000, 29760=>1000, 29761=>1000, 29763=>1000, 29764=>1000, 29766=>1000, + 29767=>1000, 29771=>1000, 29773=>1000, 29777=>1000, 29778=>1000, 29781=>1000, 29783=>1000, 29785=>1000, 29786=>1000, 29787=>1000, 29788=>1000, 29789=>1000, 29790=>1000, 29791=>1000, 29792=>1000, 29794=>1000, + 29795=>1000, 29796=>1000, 29798=>1000, 29799=>1000, 29800=>1000, 29801=>1000, 29802=>1000, 29803=>1000, 29805=>1000, 29806=>1000, 29807=>1000, 29808=>1000, 29809=>1000, 29810=>1000, 29811=>1000, 29814=>1000, + 29822=>1000, 29824=>1000, 29825=>1000, 29827=>1000, 29829=>1000, 29830=>1000, 29831=>1000, 29833=>1000, 29835=>1000, 29839=>1000, 29840=>1000, 29841=>1000, 29842=>1000, 29848=>1000, 29849=>1000, 29850=>1000, + 29852=>1000, 29854=>1000, 29855=>1000, 29856=>1000, 29857=>1000, 29858=>1000, 29859=>1000, 29862=>1000, 29863=>1000, 29864=>1000, 29865=>1000, 29866=>1000, 29867=>1000, 29870=>1000, 29871=>1000, 29872=>1000, + 29873=>1000, 29874=>1000, 29877=>1000, 29881=>1000, 29883=>1000, 29885=>1000, 29887=>1000, 29896=>1000, 29897=>1000, 29898=>1000, 29900=>1000, 29903=>1000, 29904=>1000, 29907=>1000, 29908=>1000, 29912=>1000, + 29914=>1000, 29915=>1000, 29916=>1000, 29918=>1000, 29919=>1000, 29920=>1000, 29922=>1000, 29923=>1000, 29924=>1000, 29926=>1000, 29927=>1000, 29928=>1000, 29929=>1000, 29930=>1000, 29931=>1000, 29934=>1000, + 29935=>1000, 29936=>1000, 29937=>1000, 29938=>1000, 29940=>1000, 29942=>1000, 29943=>1000, 29944=>1000, 29946=>1000, 29947=>1000, 29948=>1000, 29951=>1000, 29953=>1000, 29955=>1000, 29956=>1000, 29957=>1000, + 29958=>1000, 29964=>1000, 29965=>1000, 29966=>1000, 29969=>1000, 29970=>1000, 29971=>1000, 29973=>1000, 29974=>1000, 29975=>1000, 29976=>1000, 29978=>1000, 29980=>1000, 29982=>1000, 29983=>1000, 29984=>1000, + 29985=>1000, 29987=>1000, 29988=>1000, 29989=>1000, 29990=>1000, 29991=>1000, 29992=>1000, 29993=>1000, 29994=>1000, 29995=>1000, 29996=>1000, 29999=>1000, 30000=>1000, 30001=>1000, 30002=>1000, 30003=>1000, + 30006=>1000, 30007=>1000, 30008=>1000, 30009=>1000, 30010=>1000, 30011=>1000, 30012=>1000, 30013=>1000, 30014=>1000, 30015=>1000, 30016=>1000, 30019=>1000, 30020=>1000, 30022=>1000, 30023=>1000, 30024=>1000, + 30025=>1000, 30026=>1000, 30027=>1000, 30028=>1000, 30029=>1000, 30030=>1000, 30031=>1000, 30032=>1000, 30033=>1000, 30034=>1000, 30036=>1000, 30039=>1000, 30041=>1000, 30042=>1000, 30043=>1000, 30044=>1000, + 30045=>1000, 30046=>1000, 30047=>1000, 30048=>1000, 30049=>1000, 30050=>1000, 30052=>1000, 30053=>1000, 30054=>1000, 30055=>1000, 30057=>1000, 30058=>1000, 30059=>1000, 30061=>1000, 30063=>1000, 30064=>1000, + 30065=>1000, 30067=>1000, 30068=>1000, 30070=>1000, 30071=>1000, 30072=>1000, 30073=>1000, 30074=>1000, 30075=>1000, 30076=>1000, 30077=>1000, 30078=>1000, 30079=>1000, 30081=>1000, 30082=>1000, 30085=>1000, + 30086=>1000, 30087=>1000, 30089=>1000, 30090=>1000, 30091=>1000, 30094=>1000, 30095=>1000, 30096=>1000, 30097=>1000, 30098=>1000, 30099=>1000, 30100=>1000, 30101=>1000, 30105=>1000, 30106=>1000, 30108=>1000, + 30109=>1000, 30114=>1000, 30115=>1000, 30116=>1000, 30117=>1000, 30123=>1000, 30129=>1000, 30130=>1000, 30131=>1000, 30132=>1000, 30133=>1000, 30136=>1000, 30137=>1000, 30138=>1000, 30140=>1000, 30141=>1000, + 30142=>1000, 30143=>1000, 30144=>1000, 30145=>1000, 30146=>1000, 30147=>1000, 30148=>1000, 30149=>1000, 30150=>1000, 30151=>1000, 30154=>1000, 30156=>1000, 30157=>1000, 30158=>1000, 30159=>1000, 30162=>1000, + 30164=>1000, 30165=>1000, 30167=>1000, 30168=>1000, 30169=>1000, 30171=>1000, 30172=>1000, 30174=>1000, 30175=>1000, 30176=>1000, 30177=>1000, 30178=>1000, 30179=>1000, 30180=>1000, 30183=>1000, 30185=>1000, + 30188=>1000, 30190=>1000, 30191=>1000, 30192=>1000, 30193=>1000, 30194=>1000, 30195=>1000, 30196=>1000, 30201=>1000, 30202=>1000, 30204=>1000, 30206=>1000, 30207=>1000, 30208=>1000, 30209=>1000, 30210=>1000, + 30211=>1000, 30212=>1000, 30215=>1000, 30216=>1000, 30217=>1000, 30218=>1000, 30219=>1000, 30220=>1000, 30221=>1000, 30223=>1000, 30226=>1000, 30227=>1000, 30229=>1000, 30230=>1000, 30233=>1000, 30235=>1000, + 30236=>1000, 30237=>1000, 30238=>1000, 30239=>1000, 30240=>1000, 30241=>1000, 30242=>1000, 30243=>1000, 30244=>1000, 30245=>1000, 30246=>1000, 30247=>1000, 30249=>1000, 30253=>1000, 30256=>1000, 30258=>1000, + 30259=>1000, 30260=>1000, 30261=>1000, 30264=>1000, 30265=>1000, 30266=>1000, 30267=>1000, 30268=>1000, 30272=>1000, 30273=>1000, 30274=>1000, 30275=>1000, 30276=>1000, 30277=>1000, 30278=>1000, 30279=>1000, + 30280=>1000, 30281=>1000, 30282=>1000, 30283=>1000, 30284=>1000, 30290=>1000, 30293=>1000, 30294=>1000, 30296=>1000, 30297=>1000, 30300=>1000, 30303=>1000, 30305=>1000, 30306=>1000, 30308=>1000, 30309=>1000, + 30311=>1000, 30312=>1000, 30313=>1000, 30314=>1000, 30316=>1000, 30317=>1000, 30318=>1000, 30319=>1000, 30320=>1000, 30321=>1000, 30322=>1000, 30324=>1000, 30326=>1000, 30328=>1000, 30330=>1000, 30331=>1000, + 30332=>1000, 30333=>1000, 30334=>1000, 30336=>1000, 30337=>1000, 30338=>1000, 30339=>1000, 30340=>1000, 30341=>1000, 30342=>1000, 30343=>1000, 30344=>1000, 30347=>1000, 30348=>1000, 30349=>1000, 30350=>1000, + 30352=>1000, 30355=>1000, 30357=>1000, 30358=>1000, 30361=>1000, 30362=>1000, 30363=>1000, 30364=>1000, 30365=>1000, 30366=>1000, 30367=>1000, 30368=>1000, 30370=>1000, 30371=>1000, 30372=>1000, 30373=>1000, + 30374=>1000, 30375=>1000, 30376=>1000, 30378=>1000, 30381=>1000, 30382=>1000, 30384=>1000, 30388=>1000, 30391=>1000, 30392=>1000, 30393=>1000, 30394=>1000, 30397=>1000, 30399=>1000, 30401=>1000, 30402=>1000, + 30403=>1000, 30405=>1000, 30406=>1000, 30408=>1000, 30409=>1000, 30410=>1000, 30411=>1000, 30412=>1000, 30413=>1000, 30414=>1000, 30418=>1000, 30420=>1000, 30422=>1000, 30423=>1000, 30425=>1000, 30427=>1000, + 30428=>1000, 30430=>1000, 30431=>1000, 30432=>1000, 30433=>1000, 30435=>1000, 30436=>1000, 30437=>1000, 30438=>1000, 30439=>1000, 30440=>1000, 30442=>1000, 30444=>1000, 30446=>1000, 30448=>1000, 30449=>1000, + 30450=>1000, 30452=>1000, 30454=>1000, 30456=>1000, 30457=>1000, 30459=>1000, 30460=>1000, 30462=>1000, 30464=>1000, 30465=>1000, 30468=>1000, 30470=>1000, 30471=>1000, 30472=>1000, 30473=>1000, 30474=>1000, + 30475=>1000, 30476=>1000, 30478=>1000, 30482=>1000, 30484=>1000, 30485=>1000, 30487=>1000, 30489=>1000, 30490=>1000, 30491=>1000, 30492=>1000, 30494=>1000, 30495=>1000, 30496=>1000, 30498=>1000, 30500=>1000, + 30501=>1000, 30502=>1000, 30504=>1000, 30505=>1000, 30509=>1000, 30510=>1000, 30511=>1000, 30516=>1000, 30517=>1000, 30518=>1000, 30519=>1000, 30520=>1000, 30521=>1000, 30522=>1000, 30524=>1000, 30525=>1000, + 30526=>1000, 30528=>1000, 30530=>1000, 30533=>1000, 30534=>1000, 30535=>1000, 30538=>1000, 30541=>1000, 30542=>1000, 30543=>1000, 30546=>1000, 30550=>1000, 30551=>1000, 30554=>1000, 30555=>1000, 30556=>1000, + 30558=>1000, 30559=>1000, 30560=>1000, 30561=>1000, 30562=>1000, 30563=>1000, 30564=>1000, 30565=>1000, 30566=>1000, 30567=>1000, 30568=>1000, 30570=>1000, 30571=>1000, 30572=>1000, 30576=>1000, 30578=>1000, + 30579=>1000, 30580=>1000, 30585=>1000, 30586=>1000, 30589=>1000, 30590=>1000, 30591=>1000, 30592=>1000, 30596=>1000, 30603=>1000, 30604=>1000, 30605=>1000, 30606=>1000, 30609=>1000, 30612=>1000, 30613=>1000, + 30614=>1000, 30618=>1000, 30622=>1000, 30623=>1000, 30624=>1000, 30626=>1000, 30629=>1000, 30631=>1000, 30634=>1000, 30636=>1000, 30637=>1000, 30638=>1000, 30639=>1000, 30640=>1000, 30641=>1000, 30643=>1000, + 30645=>1000, 30646=>1000, 30649=>1000, 30651=>1000, 30652=>1000, 30653=>1000, 30654=>1000, 30655=>1000, 30659=>1000, 30663=>1000, 30665=>1000, 30669=>1000, 30673=>1000, 30674=>1000, 30677=>1000, 30679=>1000, + 30681=>1000, 30682=>1000, 30683=>1000, 30684=>1000, 30686=>1000, 30687=>1000, 30688=>1000, 30690=>1000, 30691=>1000, 30692=>1000, 30693=>1000, 30694=>1000, 30695=>1000, 30697=>1000, 30698=>1000, 30700=>1000, + 30701=>1000, 30702=>1000, 30703=>1000, 30704=>1000, 30705=>1000, 30707=>1000, 30708=>1000, 30712=>1000, 30715=>1000, 30716=>1000, 30722=>1000, 30725=>1000, 30726=>1000, 30729=>1000, 30732=>1000, 30733=>1000, + 30734=>1000, 30737=>1000, 30738=>1000, 30740=>1000, 30741=>1000, 30749=>1000, 30752=>1000, 30753=>1000, 30754=>1000, 30755=>1000, 30757=>1000, 30758=>1000, 30759=>1000, 30765=>1000, 30766=>1000, 30768=>1000, + 30770=>1000, 30772=>1000, 30773=>1000, 30775=>1000, 30778=>1000, 30783=>1000, 30787=>1000, 30788=>1000, 30789=>1000, 30791=>1000, 30792=>1000, 30796=>1000, 30798=>1000, 30802=>1000, 30812=>1000, 30813=>1000, + 30814=>1000, 30816=>1000, 30817=>1000, 30819=>1000, 30820=>1000, 30824=>1000, 30826=>1000, 30827=>1000, 30828=>1000, 30830=>1000, 30831=>1000, 30834=>1000, 30836=>1000, 30842=>1000, 30844=>1000, 30846=>1000, + 30849=>1000, 30854=>1000, 30855=>1000, 30858=>1000, 30860=>1000, 30861=>1000, 30862=>1000, 30863=>1000, 30865=>1000, 30867=>1000, 30868=>1000, 30869=>1000, 30871=>1000, 30872=>1000, 30874=>1000, 30877=>1000, + 30878=>1000, 30879=>1000, 30881=>1000, 30883=>1000, 30884=>1000, 30887=>1000, 30888=>1000, 30889=>1000, 30890=>1000, 30892=>1000, 30893=>1000, 30895=>1000, 30896=>1000, 30897=>1000, 30898=>1000, 30899=>1000, + 30901=>1000, 30906=>1000, 30907=>1000, 30908=>1000, 30909=>1000, 30910=>1000, 30911=>1000, 30913=>1000, 30917=>1000, 30918=>1000, 30919=>1000, 30920=>1000, 30921=>1000, 30922=>1000, 30923=>1000, 30924=>1000, + 30926=>1000, 30928=>1000, 30929=>1000, 30930=>1000, 30931=>1000, 30932=>1000, 30933=>1000, 30934=>1000, 30938=>1000, 30939=>1000, 30943=>1000, 30944=>1000, 30945=>1000, 30948=>1000, 30950=>1000, 30951=>1000, + 30952=>1000, 30954=>1000, 30956=>1000, 30959=>1000, 30962=>1000, 30963=>1000, 30964=>1000, 30966=>1000, 30967=>1000, 30970=>1000, 30971=>1000, 30973=>1000, 30975=>1000, 30976=>1000, 30977=>1000, 30982=>1000, + 30983=>1000, 30988=>1000, 30990=>1000, 30992=>1000, 30993=>1000, 30994=>1000, 31001=>1000, 31002=>1000, 31004=>1000, 31006=>1000, 31007=>1000, 31008=>1000, 31013=>1000, 31014=>1000, 31015=>1000, 31017=>1000, + 31018=>1000, 31019=>1000, 31020=>1000, 31021=>1000, 31024=>1000, 31025=>1000, 31028=>1000, 31029=>1000, 31034=>1000, 31035=>1000, 31036=>1000, 31037=>1000, 31038=>1000, 31039=>1000, 31040=>1000, 31041=>1000, + 31044=>1000, 31045=>1000, 31046=>1000, 31047=>1000, 31048=>1000, 31049=>1000, 31050=>1000, 31051=>1000, 31055=>1000, 31056=>1000, 31057=>1000, 31059=>1000, 31060=>1000, 31061=>1000, 31062=>1000, 31063=>1000, + 31064=>1000, 31066=>1000, 31067=>1000, 31068=>1000, 31069=>1000, 31070=>1000, 31071=>1000, 31072=>1000, 31074=>1000, 31077=>1000, 31079=>1000, 31080=>1000, 31081=>1000, 31083=>1000, 31085=>1000, 31090=>1000, + 31095=>1000, 31097=>1000, 31098=>1000, 31099=>1000, 31100=>1000, 31102=>1000, 31103=>1000, 31104=>1000, 31105=>1000, 31108=>1000, 31109=>1000, 31114=>1000, 31115=>1000, 31116=>1000, 31117=>1000, 31118=>1000, + 31119=>1000, 31121=>1000, 31123=>1000, 31124=>1000, 31125=>1000, 31126=>1000, 31128=>1000, 31131=>1000, 31132=>1000, 31133=>1000, 31137=>1000, 31142=>1000, 31143=>1000, 31144=>1000, 31145=>1000, 31146=>1000, + 31147=>1000, 31150=>1000, 31151=>1000, 31152=>1000, 31153=>1000, 31155=>1000, 31156=>1000, 31160=>1000, 31161=>1000, 31162=>1000, 31163=>1000, 31165=>1000, 31166=>1000, 31167=>1000, 31168=>1000, 31169=>1000, + 31170=>1000, 31172=>1000, 31175=>1000, 31176=>1000, 31177=>1000, 31178=>1000, 31179=>1000, 31183=>1000, 31185=>1000, 31186=>1000, 31188=>1000, 31189=>1000, 31190=>1000, 31192=>1000, 31194=>1000, 31197=>1000, + 31198=>1000, 31199=>1000, 31200=>1000, 31201=>1000, 31202=>1000, 31203=>1000, 31204=>1000, 31205=>1000, 31206=>1000, 31207=>1000, 31209=>1000, 31210=>1000, 31211=>1000, 31212=>1000, 31213=>1000, 31216=>1000, + 31217=>1000, 31224=>1000, 31227=>1000, 31228=>1000, 31232=>1000, 31234=>1000, 31235=>1000, 31239=>1000, 31240=>1000, 31241=>1000, 31242=>1000, 31243=>1000, 31244=>1000, 31245=>1000, 31246=>1000, 31249=>1000, + 31252=>1000, 31253=>1000, 31255=>1000, 31256=>1000, 31257=>1000, 31258=>1000, 31259=>1000, 31260=>1000, 31262=>1000, 31263=>1000, 31264=>1000, 31265=>1000, 31271=>1000, 31275=>1000, 31277=>1000, 31278=>1000, + 31279=>1000, 31280=>1000, 31281=>1000, 31282=>1000, 31284=>1000, 31285=>1000, 31287=>1000, 31288=>1000, 31289=>1000, 31290=>1000, 31291=>1000, 31292=>1000, 31293=>1000, 31294=>1000, 31295=>1000, 31296=>1000, + 31298=>1000, 31299=>1000, 31300=>1000, 31301=>1000, 31302=>1000, 31303=>1000, 31304=>1000, 31305=>1000, 31308=>1000, 31309=>1000, 31310=>1000, 31311=>1000, 31312=>1000, 31317=>1000, 31318=>1000, 31319=>1000, + 31321=>1000, 31324=>1000, 31325=>1000, 31327=>1000, 31328=>1000, 31329=>1000, 31330=>1000, 31331=>1000, 31333=>1000, 31335=>1000, 31337=>1000, 31338=>1000, 31339=>1000, 31341=>1000, 31344=>1000, 31348=>1000, + 31349=>1000, 31350=>1000, 31352=>1000, 31353=>1000, 31354=>1000, 31357=>1000, 31358=>1000, 31359=>1000, 31360=>1000, 31361=>1000, 31362=>1000, 31363=>1000, 31364=>1000, 31365=>1000, 31366=>1000, 31368=>1000, + 31370=>1000, 31371=>1000, 31376=>1000, 31377=>1000, 31378=>1000, 31379=>1000, 31380=>1000, 31381=>1000, 31382=>1000, 31383=>1000, 31384=>1000, 31390=>1000, 31391=>1000, 31392=>1000, 31395=>1000, 31401=>1000, + 31402=>1000, 31404=>1000, 31406=>1000, 31407=>1000, 31408=>1000, 31411=>1000, 31413=>1000, 31414=>1000, 31417=>1000, 31418=>1000, 31419=>1000, 31420=>1000, 31423=>1000, 31427=>1000, 31428=>1000, 31429=>1000, + 31430=>1000, 31431=>1000, 31432=>1000, 31433=>1000, 31434=>1000, 31435=>1000, 31436=>1000, 31437=>1000, 31438=>1000, 31439=>1000, 31441=>1000, 31442=>1000, 31443=>1000, 31445=>1000, 31449=>1000, 31450=>1000, + 31451=>1000, 31452=>1000, 31453=>1000, 31455=>1000, 31456=>1000, 31457=>1000, 31458=>1000, 31459=>1000, 31461=>1000, 31462=>1000, 31463=>1000, 31464=>1000, 31465=>1000, 31466=>1000, 31467=>1000, 31468=>1000, + 31469=>1000, 31471=>1000, 31472=>1000, 31473=>1000, 31476=>1000, 31478=>1000, 31480=>1000, 31481=>1000, 31482=>1000, 31483=>1000, 31485=>1000, 31486=>1000, 31487=>1000, 31490=>1000, 31492=>1000, 31494=>1000, + 31495=>1000, 31496=>1000, 31498=>1000, 31499=>1000, 31503=>1000, 31505=>1000, 31508=>1000, 31512=>1000, 31513=>1000, 31515=>1000, 31518=>1000, 31519=>1000, 31520=>1000, 31523=>1000, 31525=>1000, 31526=>1000, + 31527=>1000, 31528=>1000, 31529=>1000, 31530=>1000, 31531=>1000, 31532=>1000, 31533=>1000, 31534=>1000, 31535=>1000, 31536=>1000, 31537=>1000, 31539=>1000, 31540=>1000, 31541=>1000, 31542=>1000, 31545=>1000, + 31549=>1000, 31551=>1000, 31552=>1000, 31553=>1000, 31557=>1000, 31558=>1000, 31559=>1000, 31560=>1000, 31561=>1000, 31563=>1000, 31564=>1000, 31565=>1000, 31566=>1000, 31567=>1000, 31568=>1000, 31569=>1000, + 31570=>1000, 31572=>1000, 31573=>1000, 31574=>1000, 31581=>1000, 31584=>1000, 31588=>1000, 31589=>1000, 31590=>1000, 31591=>1000, 31593=>1000, 31594=>1000, 31596=>1000, 31597=>1000, 31598=>1000, 31599=>1000, + 31600=>1000, 31601=>1000, 31602=>1000, 31603=>1000, 31604=>1000, 31605=>1000, 31607=>1000, 31610=>1000, 31620=>1000, 31622=>1000, 31623=>1000, 31625=>1000, 31627=>1000, 31629=>1000, 31630=>1000, 31631=>1000, + 31632=>1000, 31633=>1000, 31634=>1000, 31636=>1000, 31637=>1000, 31638=>1000, 31639=>1000, 31640=>1000, 31641=>1000, 31642=>1000, 31643=>1000, 31644=>1000, 31645=>1000, 31646=>1000, 31647=>1000, 31648=>1000, + 31649=>1000, 31653=>1000, 31658=>1000, 31660=>1000, 31661=>1000, 31663=>1000, 31664=>1000, 31665=>1000, 31666=>1000, 31668=>1000, 31669=>1000, 31670=>1000, 31672=>1000, 31674=>1000, 31675=>1000, 31676=>1000, + 31677=>1000, 31680=>1000, 31681=>1000, 31682=>1000, 31684=>1000, 31685=>1000, 31686=>1000, 31687=>1000, 31688=>1000, 31689=>1000, 31690=>1000, 31691=>1000, 31692=>1000, 31695=>1000, 31700=>1000, 31702=>1000, + 31703=>1000, 31705=>1000, 31706=>1000, 31707=>1000, 31709=>1000, 31712=>1000, 31716=>1000, 31717=>1000, 31718=>1000, 31720=>1000, 31721=>1000, 31722=>1000, 31725=>1000, 31730=>1000, 31731=>1000, 31732=>1000, + 31733=>1000, 31734=>1000, 31735=>1000, 31736=>1000, 31737=>1000, 31738=>1000, 31740=>1000, 31742=>1000, 31744=>1000, 31745=>1000, 31746=>1000, 31747=>1000, 31748=>1000, 31750=>1000, 31751=>1000, 31753=>1000, + 31755=>1000, 31756=>1000, 31757=>1000, 31758=>1000, 31759=>1000, 31761=>1000, 31762=>1000, 31763=>1000, 31764=>1000, 31767=>1000, 31769=>1000, 31771=>1000, 31775=>1000, 31776=>1000, 31777=>1000, 31779=>1000, + 31781=>1000, 31782=>1000, 31783=>1000, 31784=>1000, 31786=>1000, 31787=>1000, 31788=>1000, 31793=>1000, 31795=>1000, 31796=>1000, 31798=>1000, 31799=>1000, 31800=>1000, 31801=>1000, 31802=>1000, 31805=>1000, + 31806=>1000, 31807=>1000, 31808=>1000, 31811=>1000, 31814=>1000, 31818=>1000, 31820=>1000, 31821=>1000, 31823=>1000, 31824=>1000, 31825=>1000, 31826=>1000, 31827=>1000, 31828=>1000, 31829=>1000, 31830=>1000, + 31832=>1000, 31833=>1000, 31834=>1000, 31835=>1000, 31836=>1000, 31837=>1000, 31838=>1000, 31839=>1000, 31840=>1000, 31841=>1000, 31843=>1000, 31844=>1000, 31845=>1000, 31847=>1000, 31849=>1000, 31852=>1000, + 31853=>1000, 31854=>1000, 31856=>1000, 31858=>1000, 31859=>1000, 31861=>1000, 31865=>1000, 31868=>1000, 31869=>1000, 31870=>1000, 31873=>1000, 31874=>1000, 31875=>1000, 31878=>1000, 31879=>1000, 31881=>1000, + 31883=>1000, 31885=>1000, 31887=>1000, 31888=>1000, 31890=>1000, 31892=>1000, 31893=>1000, 31895=>1000, 31896=>1000, 31899=>1000, 31902=>1000, 31903=>1000, 31904=>1000, 31905=>1000, 31906=>1000, 31908=>1000, + 31909=>1000, 31910=>1000, 31911=>1000, 31912=>1000, 31915=>1000, 31917=>1000, 31918=>1000, 31920=>1000, 31921=>1000, 31922=>1000, 31923=>1000, 31926=>1000, 31927=>1000, 31929=>1000, 31930=>1000, 31931=>1000, + 31932=>1000, 31933=>1000, 31934=>1000, 31935=>1000, 31936=>1000, 31938=>1000, 31940=>1000, 31941=>1000, 31943=>1000, 31944=>1000, 31945=>1000, 31946=>1000, 31949=>1000, 31950=>1000, 31951=>1000, 31954=>1000, + 31955=>1000, 31956=>1000, 31957=>1000, 31958=>1000, 31959=>1000, 31960=>1000, 31961=>1000, 31962=>1000, 31964=>1000, 31965=>1000, 31966=>1000, 31967=>1000, 31968=>1000, 31970=>1000, 31974=>1000, 31975=>1000, + 31977=>1000, 31979=>1000, 31983=>1000, 31986=>1000, 31988=>1000, 31989=>1000, 31990=>1000, 31992=>1000, 31994=>1000, 31995=>1000, 31998=>1000, 32000=>1000, 32002=>1000, 32003=>1000, 32004=>1000, 32005=>1000, + 32006=>1000, 32007=>1000, 32008=>1000, 32009=>1000, 32010=>1000, 32011=>1000, 32013=>1000, 32015=>1000, 32016=>1000, 32017=>1000, 32018=>1000, 32019=>1000, 32020=>1000, 32021=>1000, 32022=>1000, 32023=>1000, + 32024=>1000, 32025=>1000, 32026=>1000, 32027=>1000, 32028=>1000, 32029=>1000, 32030=>1000, 32032=>1000, 32033=>1000, 32034=>1000, 32035=>1000, 32038=>1000, 32042=>1000, 32043=>1000, 32044=>1000, 32045=>1000, + 32046=>1000, 32047=>1000, 32048=>1000, 32049=>1000, 32050=>1000, 32051=>1000, 32053=>1000, 32057=>1000, 32058=>1000, 32060=>1000, 32061=>1000, 32062=>1000, 32063=>1000, 32064=>1000, 32065=>1000, 32066=>1000, + 32067=>1000, 32068=>1000, 32069=>1000, 32070=>1000, 32071=>1000, 32072=>1000, 32075=>1000, 32076=>1000, 32077=>1000, 32078=>1000, 32079=>1000, 32080=>1000, 32081=>1000, 32083=>1000, 32086=>1000, 32087=>1000, + 32089=>1000, 32090=>1000, 32091=>1000, 32092=>1000, 32093=>1000, 32094=>1000, 32097=>1000, 32098=>1000, 32099=>1000, 32101=>1000, 32102=>1000, 32103=>1000, 32104=>1000, 32106=>1000, 32110=>1000, 32112=>1000, + 32113=>1000, 32114=>1000, 32115=>1000, 32117=>1000, 32118=>1000, 32120=>1000, 32121=>1000, 32122=>1000, 32123=>1000, 32125=>1000, 32127=>1000, 32129=>1000, 32130=>1000, 32131=>1000, 32133=>1000, 32134=>1000, + 32136=>1000, 32137=>1000, 32139=>1000, 32140=>1000, 32141=>1000, 32143=>1000, 32145=>1000, 32147=>1000, 32150=>1000, 32151=>1000, 32153=>1000, 32154=>1000, 32155=>1000, 32156=>1000, 32157=>1000, 32158=>1000, + 32159=>1000, 32160=>1000, 32162=>1000, 32163=>1000, 32166=>1000, 32167=>1000, 32170=>1000, 32171=>1000, 32172=>1000, 32173=>1000, 32174=>1000, 32175=>1000, 32176=>1000, 32177=>1000, 32178=>1000, 32179=>1000, + 32180=>1000, 32181=>1000, 32182=>1000, 32183=>1000, 32184=>1000, 32185=>1000, 32186=>1000, 32187=>1000, 32189=>1000, 32190=>1000, 32191=>1000, 32194=>1000, 32195=>1000, 32196=>1000, 32197=>1000, 32198=>1000, + 32199=>1000, 32202=>1000, 32203=>1000, 32204=>1000, 32205=>1000, 32206=>1000, 32207=>1000, 32209=>1000, 32210=>1000, 32213=>1000, 32214=>1000, 32215=>1000, 32216=>1000, 32217=>1000, 32218=>1000, 32220=>1000, + 32221=>1000, 32222=>1000, 32224=>1000, 32225=>1000, 32226=>1000, 32228=>1000, 32229=>1000, 32230=>1000, 32232=>1000, 32233=>1000, 32234=>1000, 32235=>1000, 32236=>1000, 32237=>1000, 32239=>1000, 32241=>1000, + 32242=>1000, 32244=>1000, 32245=>1000, 32246=>1000, 32249=>1000, 32250=>1000, 32251=>1000, 32256=>1000, 32257=>1000, 32260=>1000, 32261=>1000, 32264=>1000, 32265=>1000, 32266=>1000, 32267=>1000, 32272=>1000, + 32273=>1000, 32274=>1000, 32277=>1000, 32279=>1000, 32283=>1000, 32284=>1000, 32285=>1000, 32286=>1000, 32287=>1000, 32288=>1000, 32289=>1000, 32290=>1000, 32291=>1000, 32294=>1000, 32295=>1000, 32296=>1000, + 32299=>1000, 32300=>1000, 32301=>1000, 32302=>1000, 32303=>1000, 32305=>1000, 32306=>1000, 32307=>1000, 32309=>1000, 32310=>1000, 32311=>1000, 32313=>1000, 32314=>1000, 32315=>1000, 32317=>1000, 32318=>1000, + 32319=>1000, 32321=>1000, 32323=>1000, 32324=>1000, 32325=>1000, 32326=>1000, 32327=>1000, 32330=>1000, 32331=>1000, 32333=>1000, 32334=>1000, 32336=>1000, 32338=>1000, 32340=>1000, 32341=>1000, 32342=>1000, + 32344=>1000, 32345=>1000, 32346=>1000, 32349=>1000, 32350=>1000, 32351=>1000, 32353=>1000, 32354=>1000, 32357=>1000, 32358=>1000, 32359=>1000, 32361=>1000, 32362=>1000, 32363=>1000, 32365=>1000, 32366=>1000, + 32367=>1000, 32368=>1000, 32371=>1000, 32376=>1000, 32377=>1000, 32379=>1000, 32380=>1000, 32381=>1000, 32382=>1000, 32383=>1000, 32385=>1000, 32386=>1000, 32387=>1000, 32390=>1000, 32391=>1000, 32392=>1000, + 32393=>1000, 32394=>1000, 32396=>1000, 32397=>1000, 32398=>1000, 32399=>1000, 32400=>1000, 32401=>1000, 32402=>1000, 32403=>1000, 32404=>1000, 32405=>1000, 32406=>1000, 32408=>1000, 32410=>1000, 32411=>1000, + 32412=>1000, 32413=>1000, 32414=>1000, 32566=>1000, 32568=>1000, 32570=>1000, 32571=>1000, 32572=>1000, 32573=>1000, 32574=>1000, 32575=>1000, 32579=>1000, 32580=>1000, 32581=>1000, 32583=>1000, 32588=>1000, + 32589=>1000, 32590=>1000, 32591=>1000, 32592=>1000, 32593=>1000, 32594=>1000, 32595=>1000, 32596=>1000, 32597=>1000, 32600=>1000, 32603=>1000, 32604=>1000, 32605=>1000, 32607=>1000, 32608=>1000, 32609=>1000, + 32611=>1000, 32612=>1000, 32613=>1000, 32614=>1000, 32615=>1000, 32616=>1000, 32617=>1000, 32618=>1000, 32619=>1000, 32621=>1000, 32622=>1000, 32624=>1000, 32625=>1000, 32626=>1000, 32629=>1000, 32631=>1000, + 32632=>1000, 32633=>1000, 32637=>1000, 32638=>1000, 32639=>1000, 32640=>1000, 32642=>1000, 32643=>1000, 32645=>1000, 32646=>1000, 32647=>1000, 32648=>1000, 32650=>1000, 32651=>1000, 32652=>1000, 32653=>1000, + 32654=>1000, 32655=>1000, 32656=>1000, 32657=>1000, 32660=>1000, 32662=>1000, 32663=>1000, 32666=>1000, 32668=>1000, 32669=>1000, 32670=>1000, 32673=>1000, 32674=>1000, 32675=>1000, 32676=>1000, 32678=>1000, + 32680=>1000, 32681=>1000, 32682=>1000, 32685=>1000, 32686=>1000, 32687=>1000, 32690=>1000, 32692=>1000, 32694=>1000, 32696=>1000, 32697=>1000, 32700=>1000, 32701=>1000, 32703=>1000, 32704=>1000, 32705=>1000, + 32707=>1000, 32709=>1000, 32710=>1000, 32712=>1000, 32714=>1000, 32716=>1000, 32718=>1000, 32719=>1000, 32722=>1000, 32724=>1000, 32725=>1000, 32731=>1000, 32735=>1000, 32736=>1000, 32737=>1000, 32739=>1000, + 32741=>1000, 32742=>1000, 32744=>1000, 32745=>1000, 32747=>1000, 32748=>1000, 32750=>1000, 32751=>1000, 32752=>1000, 32754=>1000, 32755=>1000, 32761=>1000, 32762=>1000, 32763=>1000, 32764=>1000, 32765=>1000, + 32766=>1000, 32767=>1000, 32768=>1000, 32769=>1000, 32771=>1000, 32772=>1000, 32773=>1000, 32774=>1000, 32775=>1000, 32776=>1000, 32778=>1000, 32779=>1000, 32780=>1000, 32781=>1000, 32782=>1000, 32783=>1000, + 32784=>1000, 32785=>1000, 32786=>1000, 32787=>1000, 32788=>1000, 32789=>1000, 32790=>1000, 32791=>1000, 32792=>1000, 32793=>1000, 32796=>1000, 32797=>1000, 32798=>1000, 32799=>1000, 32800=>1000, 32801=>1000, + 32804=>1000, 32806=>1000, 32808=>1000, 32812=>1000, 32814=>1000, 32816=>1000, 32819=>1000, 32820=>1000, 32821=>1000, 32822=>1000, 32823=>1000, 32825=>1000, 32826=>1000, 32827=>1000, 32828=>1000, 32829=>1000, + 32830=>1000, 32831=>1000, 32832=>1000, 32836=>1000, 32838=>1000, 32842=>1000, 32850=>1000, 32854=>1000, 32856=>1000, 32858=>1000, 32862=>1000, 32863=>1000, 32864=>1000, 32865=>1000, 32866=>1000, 32868=>1000, + 32870=>1000, 32872=>1000, 32877=>1000, 32879=>1000, 32880=>1000, 32881=>1000, 32882=>1000, 32883=>1000, 32884=>1000, 32885=>1000, 32886=>1000, 32887=>1000, 32889=>1000, 32893=>1000, 32894=>1000, 32895=>1000, + 32897=>1000, 32900=>1000, 32901=>1000, 32902=>1000, 32903=>1000, 32904=>1000, 32905=>1000, 32907=>1000, 32908=>1000, 32910=>1000, 32915=>1000, 32918=>1000, 32920=>1000, 32922=>1000, 32923=>1000, 32924=>1000, + 32925=>1000, 32926=>1000, 32929=>1000, 32930=>1000, 32933=>1000, 32934=>1000, 32935=>1000, 32937=>1000, 32938=>1000, 32939=>1000, 32940=>1000, 32941=>1000, 32943=>1000, 32945=>1000, 32946=>1000, 32948=>1000, + 32952=>1000, 32953=>1000, 32954=>1000, 32963=>1000, 32964=>1000, 32966=>1000, 32968=>1000, 32972=>1000, 32973=>1000, 32974=>1000, 32975=>1000, 32978=>1000, 32980=>1000, 32981=>1000, 32982=>1000, 32983=>1000, + 32984=>1000, 32985=>1000, 32986=>1000, 32987=>1000, 32989=>1000, 32990=>1000, 32992=>1000, 32993=>1000, 32996=>1000, 32997=>1000, 33005=>1000, 33006=>1000, 33007=>1000, 33008=>1000, 33009=>1000, 33010=>1000, + 33011=>1000, 33012=>1000, 33014=>1000, 33016=>1000, 33017=>1000, 33018=>1000, 33020=>1000, 33021=>1000, 33022=>1000, 33026=>1000, 33027=>1000, 33029=>1000, 33030=>1000, 33031=>1000, 33032=>1000, 33033=>1000, + 33034=>1000, 33035=>1000, 33046=>1000, 33047=>1000, 33048=>1000, 33050=>1000, 33051=>1000, 33052=>1000, 33054=>1000, 33056=>1000, 33059=>1000, 33060=>1000, 33063=>1000, 33065=>1000, 33068=>1000, 33071=>1000, + 33072=>1000, 33073=>1000, 33075=>1000, 33077=>1000, 33081=>1000, 33082=>1000, 33084=>1000, 33086=>1000, 33093=>1000, 33094=>1000, 33095=>1000, 33098=>1000, 33099=>1000, 33100=>1000, 33102=>1000, 33104=>1000, + 33105=>1000, 33106=>1000, 33107=>1000, 33108=>1000, 33109=>1000, 33111=>1000, 33119=>1000, 33120=>1000, 33121=>1000, 33125=>1000, 33126=>1000, 33127=>1000, 33128=>1000, 33129=>1000, 33131=>1000, 33133=>1000, + 33134=>1000, 33135=>1000, 33136=>1000, 33137=>1000, 33140=>1000, 33143=>1000, 33144=>1000, 33145=>1000, 33146=>1000, 33151=>1000, 33152=>1000, 33153=>1000, 33154=>1000, 33155=>1000, 33156=>1000, 33157=>1000, + 33158=>1000, 33160=>1000, 33162=>1000, 33163=>1000, 33166=>1000, 33167=>1000, 33168=>1000, 33171=>1000, 33173=>1000, 33174=>1000, 33176=>1000, 33178=>1000, 33179=>1000, 33180=>1000, 33181=>1000, 33182=>1000, + 33184=>1000, 33186=>1000, 33187=>1000, 33188=>1000, 33192=>1000, 33193=>1000, 33198=>1000, 33200=>1000, 33202=>1000, 33203=>1000, 33204=>1000, 33205=>1000, 33208=>1000, 33210=>1000, 33211=>1000, 33213=>1000, + 33214=>1000, 33215=>1000, 33216=>1000, 33218=>1000, 33219=>1000, 33221=>1000, 33222=>1000, 33224=>1000, 33225=>1000, 33226=>1000, 33227=>1000, 33229=>1000, 33230=>1000, 33231=>1000, 33233=>1000, 33235=>1000, + 33237=>1000, 33239=>1000, 33240=>1000, 33241=>1000, 33242=>1000, 33243=>1000, 33245=>1000, 33246=>1000, 33247=>1000, 33248=>1000, 33249=>1000, 33251=>1000, 33252=>1000, 33253=>1000, 33255=>1000, 33256=>1000, + 33258=>1000, 33259=>1000, 33260=>1000, 33261=>1000, 33264=>1000, 33265=>1000, 33266=>1000, 33267=>1000, 33268=>1000, 33269=>1000, 33270=>1000, 33272=>1000, 33273=>1000, 33274=>1000, 33275=>1000, 33276=>1000, + 33277=>1000, 33278=>1000, 33279=>1000, 33280=>1000, 33281=>1000, 33282=>1000, 33283=>1000, 33285=>1000, 33287=>1000, 33288=>1000, 33289=>1000, 33290=>1000, 33292=>1000, 33293=>1000, 33294=>1000, 33295=>1000, + 33296=>1000, 33298=>1000, 33299=>1000, 33300=>1000, 33302=>1000, 33303=>1000, 33304=>1000, 33305=>1000, 33306=>1000, 33307=>1000, 33308=>1000, 33309=>1000, 33310=>1000, 33311=>1000, 33313=>1000, 33314=>1000, + 33320=>1000, 33321=>1000, 33322=>1000, 33323=>1000, 33324=>1000, 33326=>1000, 33330=>1000, 33331=>1000, 33332=>1000, 33333=>1000, 33334=>1000, 33335=>1000, 33336=>1000, 33337=>1000, 33338=>1000, 33344=>1000, + 33347=>1000, 33348=>1000, 33349=>1000, 33350=>1000, 33351=>1000, 33355=>1000, 33358=>1000, 33359=>1000, 33361=>1000, 33366=>1000, 33368=>1000, 33369=>1000, 33370=>1000, 33372=>1000, 33373=>1000, 33375=>1000, + 33376=>1000, 33378=>1000, 33379=>1000, 33380=>1000, 33382=>1000, 33383=>1000, 33384=>1000, 33386=>1000, 33387=>1000, 33389=>1000, 33390=>1000, 33391=>1000, 33393=>1000, 33394=>1000, 33396=>1000, 33398=>1000, + 33399=>1000, 33400=>1000, 33403=>1000, 33405=>1000, 33406=>1000, 33407=>1000, 33408=>1000, 33409=>1000, 33411=>1000, 33412=>1000, 33415=>1000, 33417=>1000, 33418=>1000, 33419=>1000, 33421=>1000, 33422=>1000, + 33425=>1000, 33426=>1000, 33428=>1000, 33430=>1000, 33432=>1000, 33433=>1000, 33434=>1000, 33435=>1000, 33437=>1000, 33439=>1000, 33440=>1000, 33441=>1000, 33443=>1000, 33444=>1000, 33445=>1000, 33446=>1000, + 33447=>1000, 33448=>1000, 33449=>1000, 33450=>1000, 33451=>1000, 33452=>1000, 33453=>1000, 33454=>1000, 33455=>1000, 33456=>1000, 33457=>1000, 33458=>1000, 33459=>1000, 33460=>1000, 33463=>1000, 33464=>1000, + 33465=>1000, 33466=>1000, 33467=>1000, 33468=>1000, 33469=>1000, 33470=>1000, 33471=>1000, 33477=>1000, 33478=>1000, 33488=>1000, 33489=>1000, 33490=>1000, 33491=>1000, 33492=>1000, 33493=>1000, 33495=>1000, + 33497=>1000, 33498=>1000, 33499=>1000, 33500=>1000, 33502=>1000, 33503=>1000, 33504=>1000, 33505=>1000, 33506=>1000, 33507=>1000, 33508=>1000, 33509=>1000, 33510=>1000, 33511=>1000, 33512=>1000, 33514=>1000, + 33515=>1000, 33517=>1000, 33519=>1000, 33521=>1000, 33523=>1000, 33524=>1000, 33526=>1000, 33527=>1000, 33529=>1000, 33530=>1000, 33531=>1000, 33533=>1000, 33534=>1000, 33536=>1000, 33537=>1000, 33538=>1000, + 33539=>1000, 33540=>1000, 33541=>1000, 33542=>1000, 33543=>1000, 33544=>1000, 33545=>1000, 33546=>1000, 33547=>1000, 33550=>1000, 33558=>1000, 33559=>1000, 33560=>1000, 33563=>1000, 33564=>1000, 33565=>1000, + 33566=>1000, 33567=>1000, 33569=>1000, 33570=>1000, 33571=>1000, 33576=>1000, 33579=>1000, 33580=>1000, 33581=>1000, 33582=>1000, 33583=>1000, 33584=>1000, 33585=>1000, 33586=>1000, 33587=>1000, 33588=>1000, + 33589=>1000, 33590=>1000, 33591=>1000, 33592=>1000, 33593=>1000, 33594=>1000, 33596=>1000, 33597=>1000, 33600=>1000, 33602=>1000, 33603=>1000, 33604=>1000, 33605=>1000, 33607=>1000, 33609=>1000, 33610=>1000, + 33613=>1000, 33614=>1000, 33615=>1000, 33616=>1000, 33617=>1000, 33618=>1000, 33619=>1000, 33620=>1000, 33621=>1000, 33622=>1000, 33623=>1000, 33624=>1000, 33634=>1000, 33648=>1000, 33651=>1000, 33653=>1000, + 33655=>1000, 33656=>1000, 33659=>1000, 33660=>1000, 33661=>1000, 33663=>1000, 33664=>1000, 33666=>1000, 33668=>1000, 33669=>1000, 33670=>1000, 33671=>1000, 33673=>1000, 33674=>1000, 33677=>1000, 33678=>1000, + 33682=>1000, 33683=>1000, 33684=>1000, 33685=>1000, 33686=>1000, 33688=>1000, 33689=>1000, 33690=>1000, 33691=>1000, 33692=>1000, 33693=>1000, 33694=>1000, 33695=>1000, 33696=>1000, 33698=>1000, 33702=>1000, + 33703=>1000, 33704=>1000, 33705=>1000, 33706=>1000, 33707=>1000, 33708=>1000, 33709=>1000, 33713=>1000, 33717=>1000, 33725=>1000, 33726=>1000, 33727=>1000, 33728=>1000, 33729=>1000, 33733=>1000, 33735=>1000, + 33737=>1000, 33738=>1000, 33740=>1000, 33742=>1000, 33743=>1000, 33744=>1000, 33745=>1000, 33747=>1000, 33748=>1000, 33750=>1000, 33752=>1000, 33756=>1000, 33757=>1000, 33759=>1000, 33760=>1000, 33768=>1000, + 33769=>1000, 33770=>1000, 33771=>1000, 33775=>1000, 33776=>1000, 33777=>1000, 33778=>1000, 33780=>1000, 33782=>1000, 33783=>1000, 33784=>1000, 33785=>1000, 33787=>1000, 33788=>1000, 33789=>1000, 33793=>1000, + 33795=>1000, 33796=>1000, 33798=>1000, 33799=>1000, 33802=>1000, 33803=>1000, 33804=>1000, 33805=>1000, 33806=>1000, 33807=>1000, 33809=>1000, 33811=>1000, 33813=>1000, 33817=>1000, 33824=>1000, 33826=>1000, + 33833=>1000, 33834=>1000, 33836=>1000, 33839=>1000, 33841=>1000, 33845=>1000, 33848=>1000, 33849=>1000, 33852=>1000, 33853=>1000, 33861=>1000, 33862=>1000, 33863=>1000, 33864=>1000, 33865=>1000, 33866=>1000, + 33869=>1000, 33870=>1000, 33871=>1000, 33873=>1000, 33874=>1000, 33878=>1000, 33879=>1000, 33880=>1000, 33881=>1000, 33882=>1000, 33883=>1000, 33884=>1000, 33888=>1000, 33889=>1000, 33890=>1000, 33891=>1000, + 33892=>1000, 33893=>1000, 33894=>1000, 33895=>1000, 33897=>1000, 33898=>1000, 33899=>1000, 33900=>1000, 33901=>1000, 33902=>1000, 33903=>1000, 33904=>1000, 33905=>1000, 33907=>1000, 33908=>1000, 33909=>1000, + 33910=>1000, 33911=>1000, 33912=>1000, 33913=>1000, 33914=>1000, 33916=>1000, 33917=>1000, 33921=>1000, 33922=>1000, 33924=>1000, 33925=>1000, 33931=>1000, 33936=>1000, 33938=>1000, 33939=>1000, 33940=>1000, + 33941=>1000, 33945=>1000, 33948=>1000, 33950=>1000, 33951=>1000, 33953=>1000, 33958=>1000, 33960=>1000, 33961=>1000, 33962=>1000, 33965=>1000, 33967=>1000, 33969=>1000, 33970=>1000, 33972=>1000, 33976=>1000, + 33977=>1000, 33978=>1000, 33979=>1000, 33980=>1000, 33981=>1000, 33982=>1000, 33983=>1000, 33984=>1000, 33985=>1000, 33986=>1000, 33988=>1000, 33990=>1000, 33991=>1000, 33992=>1000, 33993=>1000, 33994=>1000, + 33995=>1000, 33996=>1000, 33997=>1000, 33999=>1000, 34000=>1000, 34001=>1000, 34003=>1000, 34006=>1000, 34009=>1000, 34010=>1000, 34012=>1000, 34023=>1000, 34026=>1000, 34028=>1000, 34030=>1000, 34031=>1000, + 34032=>1000, 34033=>1000, 34034=>1000, 34036=>1000, 34039=>1000, 34042=>1000, 34043=>1000, 34044=>1000, 34045=>1000, 34047=>1000, 34048=>1000, 34050=>1000, 34051=>1000, 34054=>1000, 34055=>1000, 34060=>1000, + 34062=>1000, 34064=>1000, 34065=>1000, 34067=>1000, 34068=>1000, 34069=>1000, 34071=>1000, 34072=>1000, 34074=>1000, 34076=>1000, 34078=>1000, 34079=>1000, 34081=>1000, 34082=>1000, 34083=>1000, 34084=>1000, + 34085=>1000, 34086=>1000, 34087=>1000, 34090=>1000, 34091=>1000, 34092=>1000, 34093=>1000, 34095=>1000, 34098=>1000, 34099=>1000, 34100=>1000, 34101=>1000, 34102=>1000, 34109=>1000, 34111=>1000, 34112=>1000, + 34113=>1000, 34115=>1000, 34118=>1000, 34120=>1000, 34121=>1000, 34122=>1000, 34123=>1000, 34126=>1000, 34127=>1000, 34128=>1000, 34129=>1000, 34130=>1000, 34131=>1000, 34133=>1000, 34134=>1000, 34135=>1000, + 34136=>1000, 34137=>1000, 34138=>1000, 34140=>1000, 34141=>1000, 34142=>1000, 34143=>1000, 34144=>1000, 34145=>1000, 34146=>1000, 34147=>1000, 34148=>1000, 34152=>1000, 34153=>1000, 34154=>1000, 34155=>1000, + 34157=>1000, 34159=>1000, 34167=>1000, 34169=>1000, 34170=>1000, 34171=>1000, 34173=>1000, 34174=>1000, 34175=>1000, 34176=>1000, 34177=>1000, 34180=>1000, 34181=>1000, 34182=>1000, 34183=>1000, 34184=>1000, + 34185=>1000, 34186=>1000, 34187=>1000, 34188=>1000, 34191=>1000, 34192=>1000, 34193=>1000, 34195=>1000, 34196=>1000, 34199=>1000, 34200=>1000, 34201=>1000, 34203=>1000, 34204=>1000, 34205=>1000, 34207=>1000, + 34208=>1000, 34210=>1000, 34212=>1000, 34213=>1000, 34214=>1000, 34215=>1000, 34216=>1000, 34217=>1000, 34218=>1000, 34219=>1000, 34220=>1000, 34221=>1000, 34222=>1000, 34223=>1000, 34224=>1000, 34228=>1000, + 34230=>1000, 34231=>1000, 34232=>1000, 34233=>1000, 34234=>1000, 34236=>1000, 34237=>1000, 34238=>1000, 34239=>1000, 34241=>1000, 34242=>1000, 34247=>1000, 34249=>1000, 34250=>1000, 34251=>1000, 34253=>1000, + 34254=>1000, 34255=>1000, 34256=>1000, 34261=>1000, 34264=>1000, 34266=>1000, 34268=>1000, 34269=>1000, 34271=>1000, 34272=>1000, 34276=>1000, 34277=>1000, 34278=>1000, 34280=>1000, 34281=>1000, 34282=>1000, + 34285=>1000, 34291=>1000, 34294=>1000, 34295=>1000, 34297=>1000, 34298=>1000, 34299=>1000, 34300=>1000, 34302=>1000, 34303=>1000, 34304=>1000, 34306=>1000, 34308=>1000, 34309=>1000, 34310=>1000, 34311=>1000, + 34314=>1000, 34315=>1000, 34317=>1000, 34318=>1000, 34320=>1000, 34321=>1000, 34322=>1000, 34323=>1000, 34326=>1000, 34327=>1000, 34328=>1000, 34329=>1000, 34330=>1000, 34331=>1000, 34334=>1000, 34337=>1000, + 34338=>1000, 34343=>1000, 34345=>1000, 34349=>1000, 34351=>1000, 34352=>1000, 34358=>1000, 34360=>1000, 34362=>1000, 34364=>1000, 34365=>1000, 34367=>1000, 34368=>1000, 34369=>1000, 34370=>1000, 34374=>1000, + 34381=>1000, 34382=>1000, 34384=>1000, 34386=>1000, 34387=>1000, 34388=>1000, 34389=>1000, 34390=>1000, 34391=>1000, 34392=>1000, 34393=>1000, 34394=>1000, 34396=>1000, 34397=>1000, 34398=>1000, 34399=>1000, + 34400=>1000, 34401=>1000, 34402=>1000, 34403=>1000, 34404=>1000, 34407=>1000, 34409=>1000, 34411=>1000, 34412=>1000, 34415=>1000, 34417=>1000, 34421=>1000, 34422=>1000, 34423=>1000, 34425=>1000, 34426=>1000, + 34427=>1000, 34440=>1000, 34442=>1000, 34443=>1000, 34444=>1000, 34445=>1000, 34449=>1000, 34451=>1000, 34453=>1000, 34454=>1000, 34456=>1000, 34458=>1000, 34460=>1000, 34465=>1000, 34467=>1000, 34468=>1000, + 34470=>1000, 34471=>1000, 34472=>1000, 34473=>1000, 34474=>1000, 34475=>1000, 34477=>1000, 34479=>1000, 34480=>1000, 34481=>1000, 34483=>1000, 34484=>1000, 34485=>1000, 34486=>1000, 34487=>1000, 34488=>1000, + 34489=>1000, 34495=>1000, 34496=>1000, 34497=>1000, 34499=>1000, 34500=>1000, 34501=>1000, 34502=>1000, 34503=>1000, 34505=>1000, 34507=>1000, 34509=>1000, 34510=>1000, 34513=>1000, 34514=>1000, 34516=>1000, + 34517=>1000, 34519=>1000, 34521=>1000, 34522=>1000, 34523=>1000, 34524=>1000, 34526=>1000, 34527=>1000, 34528=>1000, 34531=>1000, 34532=>1000, 34533=>1000, 34535=>1000, 34537=>1000, 34540=>1000, 34541=>1000, + 34542=>1000, 34543=>1000, 34552=>1000, 34553=>1000, 34554=>1000, 34555=>1000, 34556=>1000, 34557=>1000, 34558=>1000, 34560=>1000, 34562=>1000, 34563=>1000, 34564=>1000, 34565=>1000, 34566=>1000, 34567=>1000, + 34568=>1000, 34569=>1000, 34570=>1000, 34571=>1000, 34573=>1000, 34574=>1000, 34575=>1000, 34576=>1000, 34577=>1000, 34578=>1000, 34579=>1000, 34580=>1000, 34584=>1000, 34585=>1000, 34586=>1000, 34588=>1000, + 34590=>1000, 34591=>1000, 34593=>1000, 34595=>1000, 34597=>1000, 34600=>1000, 34601=>1000, 34606=>1000, 34607=>1000, 34609=>1000, 34610=>1000, 34612=>1000, 34615=>1000, 34617=>1000, 34618=>1000, 34619=>1000, + 34620=>1000, 34621=>1000, 34622=>1000, 34623=>1000, 34624=>1000, 34627=>1000, 34629=>1000, 34633=>1000, 34635=>1000, 34636=>1000, 34637=>1000, 34638=>1000, 34643=>1000, 34645=>1000, 34647=>1000, 34648=>1000, + 34649=>1000, 34653=>1000, 34655=>1000, 34656=>1000, 34657=>1000, 34659=>1000, 34660=>1000, 34661=>1000, 34662=>1000, 34664=>1000, 34666=>1000, 34670=>1000, 34671=>1000, 34673=>1000, 34674=>1000, 34676=>1000, + 34678=>1000, 34680=>1000, 34683=>1000, 34687=>1000, 34690=>1000, 34691=>1000, 34692=>1000, 34693=>1000, 34694=>1000, 34695=>1000, 34696=>1000, 34697=>1000, 34699=>1000, 34700=>1000, 34701=>1000, 34704=>1000, + 34707=>1000, 34709=>1000, 34711=>1000, 34712=>1000, 34713=>1000, 34718=>1000, 34719=>1000, 34720=>1000, 34722=>1000, 34723=>1000, 34727=>1000, 34731=>1000, 34732=>1000, 34733=>1000, 34734=>1000, 34735=>1000, + 34737=>1000, 34739=>1000, 34741=>1000, 34746=>1000, 34747=>1000, 34749=>1000, 34750=>1000, 34751=>1000, 34752=>1000, 34753=>1000, 34756=>1000, 34758=>1000, 34759=>1000, 34760=>1000, 34761=>1000, 34762=>1000, + 34763=>1000, 34766=>1000, 34768=>1000, 34770=>1000, 34773=>1000, 34774=>1000, 34777=>1000, 34778=>1000, 34780=>1000, 34783=>1000, 34784=>1000, 34786=>1000, 34787=>1000, 34788=>1000, 34794=>1000, 34795=>1000, + 34797=>1000, 34799=>1000, 34801=>1000, 34802=>1000, 34803=>1000, 34806=>1000, 34807=>1000, 34808=>1000, 34809=>1000, 34810=>1000, 34811=>1000, 34814=>1000, 34815=>1000, 34817=>1000, 34819=>1000, 34821=>1000, + 34822=>1000, 34823=>1000, 34825=>1000, 34826=>1000, 34827=>1000, 34829=>1000, 34830=>1000, 34831=>1000, 34832=>1000, 34833=>1000, 34834=>1000, 34835=>1000, 34836=>1000, 34837=>1000, 34838=>1000, 34840=>1000, + 34841=>1000, 34842=>1000, 34843=>1000, 34844=>1000, 34846=>1000, 34847=>1000, 34849=>1000, 34850=>1000, 34851=>1000, 34855=>1000, 34856=>1000, 34861=>1000, 34862=>1000, 34864=>1000, 34865=>1000, 34866=>1000, + 34869=>1000, 34870=>1000, 34873=>1000, 34874=>1000, 34875=>1000, 34876=>1000, 34880=>1000, 34881=>1000, 34882=>1000, 34883=>1000, 34884=>1000, 34885=>1000, 34886=>1000, 34888=>1000, 34889=>1000, 34890=>1000, + 34891=>1000, 34892=>1000, 34893=>1000, 34894=>1000, 34897=>1000, 34898=>1000, 34899=>1000, 34901=>1000, 34902=>1000, 34903=>1000, 34904=>1000, 34905=>1000, 34906=>1000, 34907=>1000, 34908=>1000, 34909=>1000, + 34910=>1000, 34911=>1000, 34912=>1000, 34913=>1000, 34914=>1000, 34915=>1000, 34916=>1000, 34920=>1000, 34921=>1000, 34923=>1000, 34928=>1000, 34929=>1000, 34930=>1000, 34933=>1000, 34935=>1000, 34937=>1000, + 34939=>1000, 34941=>1000, 34942=>1000, 34943=>1000, 34944=>1000, 34945=>1000, 34946=>1000, 34952=>1000, 34955=>1000, 34957=>1000, 34962=>1000, 34966=>1000, 34967=>1000, 34968=>1000, 34969=>1000, 34970=>1000, + 34971=>1000, 34972=>1000, 34974=>1000, 34975=>1000, 34976=>1000, 34978=>1000, 34980=>1000, 34984=>1000, 34986=>1000, 34987=>1000, 34990=>1000, 34992=>1000, 34993=>1000, 34996=>1000, 34997=>1000, 34999=>1000, + 35002=>1000, 35005=>1000, 35006=>1000, 35007=>1000, 35008=>1000, 35009=>1000, 35010=>1000, 35011=>1000, 35012=>1000, 35013=>1000, 35018=>1000, 35019=>1000, 35020=>1000, 35021=>1000, 35022=>1000, 35023=>1000, + 35025=>1000, 35026=>1000, 35027=>1000, 35028=>1000, 35029=>1000, 35032=>1000, 35033=>1000, 35035=>1000, 35036=>1000, 35037=>1000, 35038=>1000, 35039=>1000, 35041=>1000, 35047=>1000, 35048=>1000, 35055=>1000, + 35056=>1000, 35057=>1000, 35058=>1000, 35059=>1000, 35060=>1000, 35061=>1000, 35063=>1000, 35064=>1000, 35065=>1000, 35068=>1000, 35069=>1000, 35070=>1000, 35073=>1000, 35074=>1000, 35076=>1000, 35078=>1000, + 35079=>1000, 35082=>1000, 35084=>1000, 35085=>1000, 35086=>1000, 35087=>1000, 35088=>1000, 35090=>1000, 35091=>1000, 35093=>1000, 35094=>1000, 35096=>1000, 35097=>1000, 35098=>1000, 35100=>1000, 35101=>1000, + 35102=>1000, 35104=>1000, 35109=>1000, 35110=>1000, 35111=>1000, 35112=>1000, 35114=>1000, 35115=>1000, 35120=>1000, 35121=>1000, 35122=>1000, 35125=>1000, 35126=>1000, 35128=>1000, 35129=>1000, 35130=>1000, + 35131=>1000, 35134=>1000, 35136=>1000, 35137=>1000, 35138=>1000, 35139=>1000, 35140=>1000, 35141=>1000, 35142=>1000, 35145=>1000, 35148=>1000, 35149=>1000, 35151=>1000, 35154=>1000, 35158=>1000, 35159=>1000, + 35162=>1000, 35163=>1000, 35164=>1000, 35166=>1000, 35167=>1000, 35168=>1000, 35169=>1000, 35170=>1000, 35171=>1000, 35172=>1000, 35174=>1000, 35178=>1000, 35179=>1000, 35181=>1000, 35182=>1000, 35183=>1000, + 35184=>1000, 35186=>1000, 35187=>1000, 35188=>1000, 35189=>1000, 35191=>1000, 35194=>1000, 35195=>1000, 35196=>1000, 35197=>1000, 35198=>1000, 35199=>1000, 35201=>1000, 35203=>1000, 35206=>1000, 35207=>1000, + 35208=>1000, 35209=>1000, 35210=>1000, 35211=>1000, 35213=>1000, 35215=>1000, 35216=>1000, 35219=>1000, 35220=>1000, 35221=>1000, 35222=>1000, 35223=>1000, 35224=>1000, 35226=>1000, 35227=>1000, 35228=>1000, + 35231=>1000, 35232=>1000, 35233=>1000, 35237=>1000, 35238=>1000, 35239=>1000, 35241=>1000, 35242=>1000, 35244=>1000, 35247=>1000, 35248=>1000, 35250=>1000, 35251=>1000, 35252=>1000, 35253=>1000, 35254=>1000, + 35255=>1000, 35258=>1000, 35260=>1000, 35261=>1000, 35263=>1000, 35264=>1000, 35282=>1000, 35284=>1000, 35285=>1000, 35286=>1000, 35287=>1000, 35288=>1000, 35290=>1000, 35292=>1000, 35293=>1000, 35299=>1000, + 35301=>1000, 35302=>1000, 35303=>1000, 35305=>1000, 35307=>1000, 35309=>1000, 35313=>1000, 35315=>1000, 35316=>1000, 35318=>1000, 35320=>1000, 35321=>1000, 35325=>1000, 35327=>1000, 35328=>1000, 35330=>1000, + 35331=>1000, 35332=>1000, 35333=>1000, 35335=>1000, 35336=>1000, 35338=>1000, 35340=>1000, 35342=>1000, 35343=>1000, 35344=>1000, 35345=>1000, 35346=>1000, 35347=>1000, 35348=>1000, 35349=>1000, 35350=>1000, + 35351=>1000, 35352=>1000, 35355=>1000, 35357=>1000, 35358=>1000, 35359=>1000, 35360=>1000, 35362=>1000, 35363=>1000, 35364=>1000, 35365=>1000, 35366=>1000, 35370=>1000, 35371=>1000, 35372=>1000, 35373=>1000, + 35375=>1000, 35377=>1000, 35379=>1000, 35380=>1000, 35381=>1000, 35382=>1000, 35383=>1000, 35386=>1000, 35387=>1000, 35388=>1000, 35389=>1000, 35390=>1000, 35392=>1000, 35393=>1000, 35395=>1000, 35397=>1000, + 35398=>1000, 35399=>1000, 35400=>1000, 35401=>1000, 35405=>1000, 35406=>1000, 35408=>1000, 35409=>1000, 35410=>1000, 35411=>1000, 35412=>1000, 35413=>1000, 35414=>1000, 35415=>1000, 35416=>1000, 35419=>1000, + 35420=>1000, 35421=>1000, 35422=>1000, 35424=>1000, 35425=>1000, 35426=>1000, 35427=>1000, 35429=>1000, 35430=>1000, 35431=>1000, 35433=>1000, 35435=>1000, 35436=>1000, 35437=>1000, 35438=>1000, 35440=>1000, + 35441=>1000, 35442=>1000, 35443=>1000, 35445=>1000, 35446=>1000, 35447=>1000, 35449=>1000, 35450=>1000, 35451=>1000, 35452=>1000, 35454=>1000, 35455=>1000, 35456=>1000, 35458=>1000, 35459=>1000, 35460=>1000, + 35461=>1000, 35462=>1000, 35463=>1000, 35465=>1000, 35467=>1000, 35468=>1000, 35469=>1000, 35471=>1000, 35472=>1000, 35473=>1000, 35474=>1000, 35475=>1000, 35477=>1000, 35478=>1000, 35479=>1000, 35480=>1000, + 35481=>1000, 35482=>1000, 35486=>1000, 35487=>1000, 35488=>1000, 35489=>1000, 35491=>1000, 35492=>1000, 35493=>1000, 35494=>1000, 35495=>1000, 35496=>1000, 35497=>1000, 35500=>1000, 35501=>1000, 35502=>1000, + 35503=>1000, 35504=>1000, 35506=>1000, 35507=>1000, 35510=>1000, 35511=>1000, 35513=>1000, 35515=>1000, 35516=>1000, 35518=>1000, 35519=>1000, 35522=>1000, 35523=>1000, 35524=>1000, 35526=>1000, 35527=>1000, + 35528=>1000, 35529=>1000, 35530=>1000, 35531=>1000, 35532=>1000, 35533=>1000, 35535=>1000, 35537=>1000, 35538=>1000, 35539=>1000, 35540=>1000, 35541=>1000, 35542=>1000, 35543=>1000, 35546=>1000, 35547=>1000, + 35548=>1000, 35549=>1000, 35550=>1000, 35551=>1000, 35552=>1000, 35553=>1000, 35554=>1000, 35556=>1000, 35558=>1000, 35559=>1000, 35563=>1000, 35564=>1000, 35565=>1000, 35566=>1000, 35568=>1000, 35569=>1000, + 35571=>1000, 35572=>1000, 35573=>1000, 35574=>1000, 35575=>1000, 35576=>1000, 35578=>1000, 35580=>1000, 35582=>1000, 35583=>1000, 35584=>1000, 35585=>1000, 35586=>1000, 35588=>1000, 35589=>1000, 35590=>1000, + 35591=>1000, 35594=>1000, 35595=>1000, 35596=>1000, 35598=>1000, 35600=>1000, 35601=>1000, 35604=>1000, 35606=>1000, 35607=>1000, 35609=>1000, 35610=>1000, 35611=>1000, 35612=>1000, 35613=>1000, 35614=>1000, + 35615=>1000, 35616=>1000, 35617=>1000, 35622=>1000, 35624=>1000, 35627=>1000, 35628=>1000, 35629=>1000, 35632=>1000, 35635=>1000, 35639=>1000, 35641=>1000, 35644=>1000, 35646=>1000, 35649=>1000, 35650=>1000, + 35651=>1000, 35652=>1000, 35653=>1000, 35654=>1000, 35656=>1000, 35657=>1000, 35660=>1000, 35661=>1000, 35662=>1000, 35663=>1000, 35666=>1000, 35667=>1000, 35668=>1000, 35670=>1000, 35672=>1000, 35673=>1000, + 35674=>1000, 35675=>1000, 35676=>1000, 35678=>1000, 35679=>1000, 35683=>1000, 35686=>1000, 35691=>1000, 35692=>1000, 35693=>1000, 35695=>1000, 35696=>1000, 35697=>1000, 35698=>1000, 35700=>1000, 35702=>1000, + 35703=>1000, 35704=>1000, 35705=>1000, 35708=>1000, 35709=>1000, 35710=>1000, 35711=>1000, 35712=>1000, 35713=>1000, 35715=>1000, 35716=>1000, 35717=>1000, 35722=>1000, 35723=>1000, 35724=>1000, 35725=>1000, + 35726=>1000, 35727=>1000, 35728=>1000, 35730=>1000, 35731=>1000, 35732=>1000, 35733=>1000, 35734=>1000, 35737=>1000, 35738=>1000, 35740=>1000, 35742=>1000, 35743=>1000, 35895=>1000, 35896=>1000, 35897=>1000, + 35898=>1000, 35901=>1000, 35902=>1000, 35903=>1000, 35905=>1000, 35909=>1000, 35910=>1000, 35911=>1000, 35912=>1000, 35913=>1000, 35914=>1000, 35915=>1000, 35916=>1000, 35918=>1000, 35919=>1000, 35920=>1000, + 35921=>1000, 35923=>1000, 35924=>1000, 35925=>1000, 35927=>1000, 35928=>1000, 35929=>1000, 35930=>1000, 35931=>1000, 35933=>1000, 35937=>1000, 35938=>1000, 35939=>1000, 35940=>1000, 35942=>1000, 35944=>1000, + 35945=>1000, 35946=>1000, 35947=>1000, 35948=>1000, 35949=>1000, 35955=>1000, 35957=>1000, 35958=>1000, 35960=>1000, 35961=>1000, 35962=>1000, 35963=>1000, 35964=>1000, 35966=>1000, 35970=>1000, 35973=>1000, + 35974=>1000, 35975=>1000, 35977=>1000, 35978=>1000, 35979=>1000, 35980=>1000, 35981=>1000, 35982=>1000, 35984=>1000, 35986=>1000, 35987=>1000, 35988=>1000, 35992=>1000, 35993=>1000, 35995=>1000, 35996=>1000, + 35997=>1000, 35998=>1000, 36000=>1000, 36001=>1000, 36002=>1000, 36004=>1000, 36007=>1000, 36008=>1000, 36009=>1000, 36010=>1000, 36011=>1000, 36012=>1000, 36013=>1000, 36014=>1000, 36015=>1000, 36016=>1000, + 36018=>1000, 36019=>1000, 36020=>1000, 36022=>1000, 36023=>1000, 36024=>1000, 36025=>1000, 36026=>1000, 36027=>1000, 36028=>1000, 36029=>1000, 36031=>1000, 36032=>1000, 36033=>1000, 36034=>1000, 36035=>1000, + 36036=>1000, 36037=>1000, 36038=>1000, 36039=>1000, 36040=>1000, 36041=>1000, 36042=>1000, 36043=>1000, 36045=>1000, 36046=>1000, 36047=>1000, 36049=>1000, 36051=>1000, 36053=>1000, 36054=>1000, 36057=>1000, + 36058=>1000, 36059=>1000, 36060=>1000, 36061=>1000, 36062=>1000, 36064=>1000, 36065=>1000, 36066=>1000, 36067=>1000, 36068=>1000, 36070=>1000, 36072=>1000, 36074=>1000, 36076=>1000, 36077=>1000, 36079=>1000, + 36080=>1000, 36082=>1000, 36084=>1000, 36085=>1000, 36087=>1000, 36088=>1000, 36090=>1000, 36091=>1000, 36092=>1000, 36093=>1000, 36094=>1000, 36095=>1000, 36097=>1000, 36099=>1000, 36100=>1000, 36101=>1000, + 36103=>1000, 36104=>1000, 36105=>1000, 36106=>1000, 36107=>1000, 36109=>1000, 36111=>1000, 36112=>1000, 36114=>1000, 36115=>1000, 36116=>1000, 36118=>1000, 36119=>1000, 36123=>1000, 36196=>1000, 36197=>1000, + 36198=>1000, 36199=>1000, 36201=>1000, 36203=>1000, 36204=>1000, 36205=>1000, 36206=>1000, 36208=>1000, 36209=>1000, 36211=>1000, 36212=>1000, 36214=>1000, 36215=>1000, 36223=>1000, 36225=>1000, 36226=>1000, + 36228=>1000, 36229=>1000, 36232=>1000, 36234=>1000, 36237=>1000, 36240=>1000, 36241=>1000, 36245=>1000, 36249=>1000, 36254=>1000, 36255=>1000, 36256=>1000, 36259=>1000, 36262=>1000, 36264=>1000, 36267=>1000, + 36268=>1000, 36271=>1000, 36274=>1000, 36275=>1000, 36277=>1000, 36279=>1000, 36281=>1000, 36282=>1000, 36283=>1000, 36284=>1000, 36286=>1000, 36288=>1000, 36290=>1000, 36293=>1000, 36294=>1000, 36295=>1000, + 36296=>1000, 36298=>1000, 36299=>1000, 36300=>1000, 36302=>1000, 36303=>1000, 36305=>1000, 36308=>1000, 36309=>1000, 36310=>1000, 36311=>1000, 36313=>1000, 36314=>1000, 36315=>1000, 36317=>1000, 36319=>1000, + 36321=>1000, 36323=>1000, 36324=>1000, 36325=>1000, 36327=>1000, 36328=>1000, 36330=>1000, 36331=>1000, 36332=>1000, 36335=>1000, 36336=>1000, 36337=>1000, 36338=>1000, 36339=>1000, 36340=>1000, 36341=>1000, + 36348=>1000, 36349=>1000, 36351=>1000, 36353=>1000, 36356=>1000, 36357=>1000, 36358=>1000, 36360=>1000, 36361=>1000, 36362=>1000, 36363=>1000, 36367=>1000, 36368=>1000, 36369=>1000, 36372=>1000, 36374=>1000, + 36381=>1000, 36382=>1000, 36383=>1000, 36384=>1000, 36385=>1000, 36386=>1000, 36387=>1000, 36390=>1000, 36391=>1000, 36394=>1000, 36400=>1000, 36401=>1000, 36403=>1000, 36404=>1000, 36405=>1000, 36406=>1000, + 36407=>1000, 36408=>1000, 36409=>1000, 36413=>1000, 36416=>1000, 36417=>1000, 36418=>1000, 36420=>1000, 36423=>1000, 36424=>1000, 36425=>1000, 36426=>1000, 36427=>1000, 36428=>1000, 36429=>1000, 36430=>1000, + 36431=>1000, 36432=>1000, 36436=>1000, 36437=>1000, 36441=>1000, 36443=>1000, 36444=>1000, 36445=>1000, 36446=>1000, 36447=>1000, 36448=>1000, 36449=>1000, 36450=>1000, 36451=>1000, 36452=>1000, 36457=>1000, + 36460=>1000, 36461=>1000, 36463=>1000, 36464=>1000, 36465=>1000, 36466=>1000, 36468=>1000, 36470=>1000, 36473=>1000, 36474=>1000, 36475=>1000, 36476=>1000, 36481=>1000, 36482=>1000, 36483=>1000, 36484=>1000, + 36485=>1000, 36487=>1000, 36489=>1000, 36490=>1000, 36491=>1000, 36493=>1000, 36496=>1000, 36497=>1000, 36498=>1000, 36499=>1000, 36500=>1000, 36501=>1000, 36505=>1000, 36506=>1000, 36507=>1000, 36509=>1000, + 36510=>1000, 36513=>1000, 36514=>1000, 36519=>1000, 36521=>1000, 36522=>1000, 36523=>1000, 36524=>1000, 36525=>1000, 36526=>1000, 36527=>1000, 36528=>1000, 36529=>1000, 36531=>1000, 36533=>1000, 36538=>1000, + 36539=>1000, 36542=>1000, 36544=>1000, 36545=>1000, 36547=>1000, 36548=>1000, 36549=>1000, 36550=>1000, 36551=>1000, 36552=>1000, 36554=>1000, 36555=>1000, 36556=>1000, 36557=>1000, 36559=>1000, 36561=>1000, + 36562=>1000, 36564=>1000, 36571=>1000, 36572=>1000, 36575=>1000, 36578=>1000, 36579=>1000, 36584=>1000, 36587=>1000, 36589=>1000, 36590=>1000, 36592=>1000, 36593=>1000, 36599=>1000, 36600=>1000, 36601=>1000, + 36602=>1000, 36603=>1000, 36604=>1000, 36605=>1000, 36606=>1000, 36608=>1000, 36610=>1000, 36611=>1000, 36613=>1000, 36615=>1000, 36616=>1000, 36617=>1000, 36618=>1000, 36620=>1000, 36623=>1000, 36624=>1000, + 36626=>1000, 36627=>1000, 36628=>1000, 36629=>1000, 36630=>1000, 36631=>1000, 36632=>1000, 36633=>1000, 36635=>1000, 36636=>1000, 36637=>1000, 36638=>1000, 36639=>1000, 36640=>1000, 36641=>1000, 36643=>1000, + 36645=>1000, 36646=>1000, 36647=>1000, 36648=>1000, 36649=>1000, 36650=>1000, 36652=>1000, 36653=>1000, 36654=>1000, 36655=>1000, 36659=>1000, 36660=>1000, 36661=>1000, 36662=>1000, 36663=>1000, 36664=>1000, + 36665=>1000, 36666=>1000, 36667=>1000, 36670=>1000, 36671=>1000, 36672=>1000, 36673=>1000, 36674=>1000, 36675=>1000, 36676=>1000, 36677=>1000, 36678=>1000, 36679=>1000, 36681=>1000, 36684=>1000, 36685=>1000, + 36686=>1000, 36687=>1000, 36689=>1000, 36690=>1000, 36691=>1000, 36692=>1000, 36693=>1000, 36695=>1000, 36696=>1000, 36700=>1000, 36701=>1000, 36702=>1000, 36703=>1000, 36705=>1000, 36706=>1000, 36707=>1000, + 36708=>1000, 36709=>1000, 36763=>1000, 36764=>1000, 36765=>1000, 36766=>1000, 36767=>1000, 36768=>1000, 36769=>1000, 36771=>1000, 36772=>1000, 36773=>1000, 36774=>1000, 36775=>1000, 36776=>1000, 36781=>1000, + 36782=>1000, 36783=>1000, 36784=>1000, 36785=>1000, 36786=>1000, 36789=>1000, 36790=>1000, 36791=>1000, 36792=>1000, 36794=>1000, 36795=>1000, 36796=>1000, 36798=>1000, 36799=>1000, 36800=>1000, 36801=>1000, + 36802=>1000, 36804=>1000, 36805=>1000, 36806=>1000, 36810=>1000, 36811=>1000, 36813=>1000, 36814=>1000, 36816=>1000, 36817=>1000, 36818=>1000, 36819=>1000, 36820=>1000, 36821=>1000, 36826=>1000, 36832=>1000, + 36834=>1000, 36835=>1000, 36836=>1000, 36837=>1000, 36838=>1000, 36840=>1000, 36841=>1000, 36842=>1000, 36843=>1000, 36845=>1000, 36846=>1000, 36847=>1000, 36848=>1000, 36849=>1000, 36852=>1000, 36853=>1000, + 36854=>1000, 36855=>1000, 36856=>1000, 36857=>1000, 36858=>1000, 36859=>1000, 36861=>1000, 36862=>1000, 36864=>1000, 36865=>1000, 36866=>1000, 36867=>1000, 36868=>1000, 36869=>1000, 36870=>1000, 36872=>1000, + 36875=>1000, 36876=>1000, 36877=>1000, 36878=>1000, 36879=>1000, 36880=>1000, 36881=>1000, 36883=>1000, 36884=>1000, 36885=>1000, 36886=>1000, 36887=>1000, 36888=>1000, 36889=>1000, 36890=>1000, 36891=>1000, + 36893=>1000, 36894=>1000, 36895=>1000, 36896=>1000, 36897=>1000, 36898=>1000, 36899=>1000, 36903=>1000, 36904=>1000, 36905=>1000, 36906=>1000, 36908=>1000, 36909=>1000, 36910=>1000, 36911=>1000, 36913=>1000, + 36914=>1000, 36915=>1000, 36916=>1000, 36917=>1000, 36918=>1000, 36919=>1000, 36920=>1000, 36921=>1000, 36924=>1000, 36926=>1000, 36927=>1000, 36929=>1000, 36930=>1000, 36931=>1000, 36932=>1000, 36933=>1000, + 36935=>1000, 36937=>1000, 36938=>1000, 36939=>1000, 36940=>1000, 36941=>1000, 36942=>1000, 36943=>1000, 36944=>1000, 36945=>1000, 36946=>1000, 36947=>1000, 36948=>1000, 36949=>1000, 36950=>1000, 36952=>1000, + 36953=>1000, 36955=>1000, 36956=>1000, 36957=>1000, 36958=>1000, 36960=>1000, 36961=>1000, 36962=>1000, 36963=>1000, 36965=>1000, 36966=>1000, 36967=>1000, 36968=>1000, 36969=>1000, 36972=>1000, 36973=>1000, + 36974=>1000, 36975=>1000, 36976=>1000, 36978=>1000, 36980=>1000, 36981=>1000, 36982=>1000, 36983=>1000, 36984=>1000, 36985=>1000, 36986=>1000, 36988=>1000, 36989=>1000, 36991=>1000, 36992=>1000, 36993=>1000, + 36994=>1000, 36995=>1000, 36996=>1000, 36997=>1000, 36999=>1000, 37000=>1000, 37001=>1000, 37002=>1000, 37003=>1000, 37004=>1000, 37006=>1000, 37007=>1000, 37008=>1000, 37009=>1000, 37013=>1000, 37015=>1000, + 37016=>1000, 37017=>1000, 37019=>1000, 37024=>1000, 37025=>1000, 37026=>1000, 37027=>1000, 37029=>1000, 37030=>1000, 37032=>1000, 37034=>1000, 37039=>1000, 37040=>1000, 37041=>1000, 37042=>1000, 37043=>1000, + 37044=>1000, 37045=>1000, 37046=>1000, 37048=>1000, 37053=>1000, 37054=>1000, 37057=>1000, 37059=>1000, 37060=>1000, 37061=>1000, 37063=>1000, 37064=>1000, 37066=>1000, 37068=>1000, 37070=>1000, 37074=>1000, + 37077=>1000, 37079=>1000, 37080=>1000, 37081=>1000, 37083=>1000, 37084=>1000, 37085=>1000, 37086=>1000, 37087=>1000, 37089=>1000, 37090=>1000, 37092=>1000, 37093=>1000, 37096=>1000, 37099=>1000, 37101=>1000, + 37103=>1000, 37104=>1000, 37108=>1000, 37109=>1000, 37110=>1000, 37111=>1000, 37117=>1000, 37118=>1000, 37119=>1000, 37120=>1000, 37122=>1000, 37124=>1000, 37125=>1000, 37126=>1000, 37128=>1000, 37133=>1000, + 37136=>1000, 37138=>1000, 37140=>1000, 37141=>1000, 37142=>1000, 37143=>1000, 37144=>1000, 37145=>1000, 37146=>1000, 37148=>1000, 37150=>1000, 37152=>1000, 37154=>1000, 37155=>1000, 37157=>1000, 37159=>1000, + 37161=>1000, 37165=>1000, 37166=>1000, 37167=>1000, 37168=>1000, 37169=>1000, 37170=>1000, 37172=>1000, 37174=>1000, 37175=>1000, 37177=>1000, 37178=>1000, 37180=>1000, 37181=>1000, 37187=>1000, 37191=>1000, + 37192=>1000, 37193=>1000, 37194=>1000, 37195=>1000, 37196=>1000, 37197=>1000, 37198=>1000, 37199=>1000, 37202=>1000, 37203=>1000, 37204=>1000, 37206=>1000, 37207=>1000, 37208=>1000, 37209=>1000, 37210=>1000, + 37211=>1000, 37217=>1000, 37218=>1000, 37219=>1000, 37220=>1000, 37221=>1000, 37223=>1000, 37225=>1000, 37226=>1000, 37228=>1000, 37229=>1000, 37234=>1000, 37235=>1000, 37236=>1000, 37237=>1000, 37239=>1000, + 37240=>1000, 37241=>1000, 37242=>1000, 37243=>1000, 37249=>1000, 37250=>1000, 37251=>1000, 37253=>1000, 37254=>1000, 37255=>1000, 37257=>1000, 37258=>1000, 37259=>1000, 37261=>1000, 37262=>1000, 37264=>1000, + 37265=>1000, 37266=>1000, 37267=>1000, 37268=>1000, 37269=>1000, 37271=>1000, 37272=>1000, 37276=>1000, 37278=>1000, 37281=>1000, 37282=>1000, 37284=>1000, 37286=>1000, 37288=>1000, 37290=>1000, 37291=>1000, + 37292=>1000, 37293=>1000, 37294=>1000, 37295=>1000, 37296=>1000, 37297=>1000, 37298=>1000, 37299=>1000, 37300=>1000, 37301=>1000, 37302=>1000, 37304=>1000, 37306=>1000, 37307=>1000, 37308=>1000, 37309=>1000, + 37311=>1000, 37312=>1000, 37313=>1000, 37314=>1000, 37315=>1000, 37317=>1000, 37318=>1000, 37319=>1000, 37320=>1000, 37321=>1000, 37323=>1000, 37324=>1000, 37325=>1000, 37326=>1000, 37327=>1000, 37328=>1000, + 37329=>1000, 37331=>1000, 37332=>1000, 37334=>1000, 37335=>1000, 37336=>1000, 37337=>1000, 37338=>1000, 37339=>1000, 37340=>1000, 37341=>1000, 37342=>1000, 37343=>1000, 37345=>1000, 37347=>1000, 37348=>1000, + 37349=>1000, 37350=>1000, 37351=>1000, 37353=>1000, 37354=>1000, 37356=>1000, 37357=>1000, 37358=>1000, 37359=>1000, 37360=>1000, 37361=>1000, 37365=>1000, 37366=>1000, 37367=>1000, 37369=>1000, 37371=>1000, + 37372=>1000, 37373=>1000, 37375=>1000, 37376=>1000, 37377=>1000, 37380=>1000, 37381=>1000, 37382=>1000, 37383=>1000, 37385=>1000, 37386=>1000, 37388=>1000, 37389=>1000, 37390=>1000, 37392=>1000, 37393=>1000, + 37394=>1000, 37395=>1000, 37396=>1000, 37397=>1000, 37398=>1000, 37400=>1000, 37404=>1000, 37405=>1000, 37406=>1000, 37411=>1000, 37412=>1000, 37413=>1000, 37414=>1000, 37416=>1000, 37417=>1000, 37420=>1000, + 37422=>1000, 37423=>1000, 37424=>1000, 37427=>1000, 37428=>1000, 37429=>1000, 37430=>1000, 37431=>1000, 37432=>1000, 37433=>1000, 37434=>1000, 37436=>1000, 37438=>1000, 37439=>1000, 37440=>1000, 37442=>1000, + 37443=>1000, 37444=>1000, 37445=>1000, 37446=>1000, 37447=>1000, 37448=>1000, 37449=>1000, 37450=>1000, 37451=>1000, 37453=>1000, 37454=>1000, 37455=>1000, 37456=>1000, 37457=>1000, 37463=>1000, 37464=>1000, + 37465=>1000, 37466=>1000, 37467=>1000, 37468=>1000, 37469=>1000, 37470=>1000, 37472=>1000, 37473=>1000, 37474=>1000, 37476=>1000, 37477=>1000, 37478=>1000, 37479=>1000, 37480=>1000, 37481=>1000, 37486=>1000, + 37487=>1000, 37488=>1000, 37489=>1000, 37493=>1000, 37494=>1000, 37495=>1000, 37496=>1000, 37497=>1000, 37499=>1000, 37500=>1000, 37501=>1000, 37502=>1000, 37503=>1000, 37504=>1000, 37507=>1000, 37509=>1000, + 37512=>1000, 37513=>1000, 37514=>1000, 37517=>1000, 37518=>1000, 37521=>1000, 37522=>1000, 37523=>1000, 37525=>1000, 37526=>1000, 37527=>1000, 37528=>1000, 37529=>1000, 37530=>1000, 37531=>1000, 37532=>1000, + 37535=>1000, 37536=>1000, 37540=>1000, 37541=>1000, 37543=>1000, 37544=>1000, 37547=>1000, 37549=>1000, 37551=>1000, 37554=>1000, 37558=>1000, 37559=>1000, 37560=>1000, 37561=>1000, 37562=>1000, 37563=>1000, + 37564=>1000, 37565=>1000, 37567=>1000, 37568=>1000, 37569=>1000, 37570=>1000, 37571=>1000, 37573=>1000, 37574=>1000, 37575=>1000, 37576=>1000, 37579=>1000, 37580=>1000, 37581=>1000, 37582=>1000, 37583=>1000, + 37584=>1000, 37586=>1000, 37587=>1000, 37589=>1000, 37591=>1000, 37592=>1000, 37593=>1000, 37596=>1000, 37597=>1000, 37599=>1000, 37600=>1000, 37601=>1000, 37603=>1000, 37604=>1000, 37605=>1000, 37607=>1000, + 37608=>1000, 37609=>1000, 37610=>1000, 37612=>1000, 37613=>1000, 37614=>1000, 37616=>1000, 37618=>1000, 37619=>1000, 37624=>1000, 37625=>1000, 37626=>1000, 37627=>1000, 37628=>1000, 37631=>1000, 37632=>1000, + 37634=>1000, 37638=>1000, 37640=>1000, 37645=>1000, 37647=>1000, 37648=>1000, 37649=>1000, 37652=>1000, 37653=>1000, 37656=>1000, 37657=>1000, 37658=>1000, 37660=>1000, 37661=>1000, 37662=>1000, 37663=>1000, + 37664=>1000, 37665=>1000, 37666=>1000, 37667=>1000, 37668=>1000, 37669=>1000, 37670=>1000, 37671=>1000, 37672=>1000, 37673=>1000, 37674=>1000, 37675=>1000, 37676=>1000, 37678=>1000, 37679=>1000, 37682=>1000, + 37683=>1000, 37684=>1000, 37685=>1000, 37686=>1000, 37687=>1000, 37690=>1000, 37691=>1000, 37700=>1000, 37703=>1000, 37704=>1000, 37705=>1000, 37707=>1000, 37709=>1000, 37712=>1000, 37713=>1000, 37714=>1000, + 37716=>1000, 37717=>1000, 37718=>1000, 37719=>1000, 37720=>1000, 37722=>1000, 37723=>1000, 37724=>1000, 37726=>1000, 37728=>1000, 37732=>1000, 37733=>1000, 37735=>1000, 37737=>1000, 37738=>1000, 37740=>1000, + 37741=>1000, 37742=>1000, 37743=>1000, 37744=>1000, 37745=>1000, 37747=>1000, 37748=>1000, 37749=>1000, 37750=>1000, 37754=>1000, 37756=>1000, 37757=>1000, 37758=>1000, 37759=>1000, 37760=>1000, 37761=>1000, + 37762=>1000, 37768=>1000, 37770=>1000, 37771=>1000, 37772=>1000, 37773=>1000, 37775=>1000, 37778=>1000, 37780=>1000, 37781=>1000, 37782=>1000, 37783=>1000, 37784=>1000, 37786=>1000, 37787=>1000, 37790=>1000, + 37793=>1000, 37795=>1000, 37796=>1000, 37798=>1000, 37799=>1000, 37800=>1000, 37801=>1000, 37803=>1000, 37804=>1000, 37805=>1000, 37806=>1000, 37808=>1000, 37812=>1000, 37813=>1000, 37814=>1000, 37817=>1000, + 37818=>1000, 37825=>1000, 37827=>1000, 37828=>1000, 37829=>1000, 37830=>1000, 37831=>1000, 37832=>1000, 37833=>1000, 37834=>1000, 37835=>1000, 37836=>1000, 37837=>1000, 37840=>1000, 37841=>1000, 37843=>1000, + 37846=>1000, 37847=>1000, 37848=>1000, 37849=>1000, 37852=>1000, 37853=>1000, 37854=>1000, 37855=>1000, 37857=>1000, 37858=>1000, 37860=>1000, 37861=>1000, 37862=>1000, 37863=>1000, 37864=>1000, 37879=>1000, + 37880=>1000, 37881=>1000, 37882=>1000, 37883=>1000, 37885=>1000, 37889=>1000, 37890=>1000, 37891=>1000, 37892=>1000, 37895=>1000, 37896=>1000, 37897=>1000, 37901=>1000, 37902=>1000, 37903=>1000, 37904=>1000, + 37907=>1000, 37908=>1000, 37909=>1000, 37910=>1000, 37911=>1000, 37912=>1000, 37913=>1000, 37914=>1000, 37919=>1000, 37921=>1000, 37931=>1000, 37934=>1000, 37935=>1000, 37937=>1000, 37938=>1000, 37939=>1000, + 37940=>1000, 37941=>1000, 37942=>1000, 37944=>1000, 37946=>1000, 37947=>1000, 37949=>1000, 37951=>1000, 37953=>1000, 37955=>1000, 37956=>1000, 37957=>1000, 37960=>1000, 37962=>1000, 37964=>1000, 37969=>1000, + 37970=>1000, 37971=>1000, 37973=>1000, 37977=>1000, 37978=>1000, 37979=>1000, 37980=>1000, 37982=>1000, 37983=>1000, 37984=>1000, 37985=>1000, 37986=>1000, 37987=>1000, 37992=>1000, 37994=>1000, 37995=>1000, + 37997=>1000, 37998=>1000, 37999=>1000, 38000=>1000, 38001=>1000, 38002=>1000, 38005=>1000, 38007=>1000, 38012=>1000, 38013=>1000, 38014=>1000, 38015=>1000, 38017=>1000, 38019=>1000, 38020=>1000, 38263=>1000, + 38264=>1000, 38265=>1000, 38270=>1000, 38272=>1000, 38274=>1000, 38275=>1000, 38276=>1000, 38279=>1000, 38280=>1000, 38281=>1000, 38282=>1000, 38283=>1000, 38284=>1000, 38285=>1000, 38286=>1000, 38287=>1000, + 38289=>1000, 38290=>1000, 38291=>1000, 38292=>1000, 38294=>1000, 38296=>1000, 38297=>1000, 38301=>1000, 38302=>1000, 38303=>1000, 38304=>1000, 38305=>1000, 38306=>1000, 38307=>1000, 38308=>1000, 38309=>1000, + 38310=>1000, 38311=>1000, 38312=>1000, 38313=>1000, 38315=>1000, 38316=>1000, 38317=>1000, 38322=>1000, 38324=>1000, 38326=>1000, 38329=>1000, 38330=>1000, 38331=>1000, 38332=>1000, 38333=>1000, 38334=>1000, + 38335=>1000, 38339=>1000, 38342=>1000, 38343=>1000, 38344=>1000, 38345=>1000, 38346=>1000, 38347=>1000, 38348=>1000, 38349=>1000, 38352=>1000, 38353=>1000, 38354=>1000, 38355=>1000, 38356=>1000, 38357=>1000, + 38358=>1000, 38360=>1000, 38361=>1000, 38362=>1000, 38364=>1000, 38365=>1000, 38366=>1000, 38367=>1000, 38368=>1000, 38369=>1000, 38370=>1000, 38372=>1000, 38373=>1000, 38374=>1000, 38428=>1000, 38429=>1000, + 38430=>1000, 38433=>1000, 38434=>1000, 38436=>1000, 38437=>1000, 38438=>1000, 38440=>1000, 38442=>1000, 38444=>1000, 38446=>1000, 38447=>1000, 38449=>1000, 38450=>1000, 38451=>1000, 38455=>1000, 38456=>1000, + 38457=>1000, 38458=>1000, 38459=>1000, 38460=>1000, 38461=>1000, 38463=>1000, 38464=>1000, 38465=>1000, 38466=>1000, 38468=>1000, 38475=>1000, 38476=>1000, 38477=>1000, 38479=>1000, 38480=>1000, 38482=>1000, + 38484=>1000, 38486=>1000, 38487=>1000, 38488=>1000, 38491=>1000, 38492=>1000, 38493=>1000, 38494=>1000, 38495=>1000, 38497=>1000, 38498=>1000, 38499=>1000, 38500=>1000, 38501=>1000, 38502=>1000, 38506=>1000, + 38508=>1000, 38510=>1000, 38512=>1000, 38514=>1000, 38515=>1000, 38516=>1000, 38517=>1000, 38518=>1000, 38519=>1000, 38520=>1000, 38522=>1000, 38523=>1000, 38524=>1000, 38525=>1000, 38526=>1000, 38527=>1000, + 38529=>1000, 38530=>1000, 38531=>1000, 38532=>1000, 38533=>1000, 38534=>1000, 38536=>1000, 38537=>1000, 38538=>1000, 38539=>1000, 38541=>1000, 38542=>1000, 38543=>1000, 38545=>1000, 38548=>1000, 38549=>1000, + 38550=>1000, 38551=>1000, 38552=>1000, 38553=>1000, 38554=>1000, 38555=>1000, 38556=>1000, 38557=>1000, 38559=>1000, 38560=>1000, 38563=>1000, 38564=>1000, 38565=>1000, 38566=>1000, 38567=>1000, 38568=>1000, + 38569=>1000, 38570=>1000, 38574=>1000, 38575=>1000, 38576=>1000, 38577=>1000, 38578=>1000, 38579=>1000, 38580=>1000, 38582=>1000, 38583=>1000, 38584=>1000, 38585=>1000, 38586=>1000, 38587=>1000, 38588=>1000, + 38592=>1000, 38593=>1000, 38596=>1000, 38597=>1000, 38598=>1000, 38599=>1000, 38601=>1000, 38602=>1000, 38603=>1000, 38604=>1000, 38605=>1000, 38606=>1000, 38609=>1000, 38610=>1000, 38613=>1000, 38614=>1000, + 38616=>1000, 38617=>1000, 38618=>1000, 38619=>1000, 38620=>1000, 38621=>1000, 38622=>1000, 38623=>1000, 38626=>1000, 38627=>1000, 38632=>1000, 38633=>1000, 38634=>1000, 38635=>1000, 38639=>1000, 38640=>1000, + 38641=>1000, 38642=>1000, 38646=>1000, 38647=>1000, 38649=>1000, 38650=>1000, 38651=>1000, 38656=>1000, 38658=>1000, 38659=>1000, 38660=>1000, 38661=>1000, 38662=>1000, 38663=>1000, 38664=>1000, 38665=>1000, + 38666=>1000, 38669=>1000, 38670=>1000, 38671=>1000, 38673=>1000, 38675=>1000, 38678=>1000, 38681=>1000, 38682=>1000, 38683=>1000, 38684=>1000, 38685=>1000, 38686=>1000, 38689=>1000, 38690=>1000, 38691=>1000, + 38692=>1000, 38695=>1000, 38696=>1000, 38698=>1000, 38704=>1000, 38705=>1000, 38706=>1000, 38707=>1000, 38712=>1000, 38713=>1000, 38715=>1000, 38717=>1000, 38718=>1000, 38721=>1000, 38722=>1000, 38723=>1000, + 38724=>1000, 38726=>1000, 38728=>1000, 38729=>1000, 38730=>1000, 38733=>1000, 38734=>1000, 38735=>1000, 38737=>1000, 38738=>1000, 38741=>1000, 38742=>1000, 38743=>1000, 38744=>1000, 38745=>1000, 38746=>1000, + 38747=>1000, 38748=>1000, 38750=>1000, 38752=>1000, 38753=>1000, 38754=>1000, 38755=>1000, 38756=>1000, 38758=>1000, 38759=>1000, 38760=>1000, 38761=>1000, 38762=>1000, 38763=>1000, 38765=>1000, 38766=>1000, + 38769=>1000, 38771=>1000, 38772=>1000, 38774=>1000, 38775=>1000, 38776=>1000, 38777=>1000, 38778=>1000, 38779=>1000, 38780=>1000, 38781=>1000, 38783=>1000, 38784=>1000, 38785=>1000, 38788=>1000, 38789=>1000, + 38790=>1000, 38793=>1000, 38795=>1000, 38797=>1000, 38799=>1000, 38800=>1000, 38805=>1000, 38806=>1000, 38807=>1000, 38808=>1000, 38809=>1000, 38810=>1000, 38812=>1000, 38814=>1000, 38815=>1000, 38816=>1000, + 38818=>1000, 38819=>1000, 38822=>1000, 38824=>1000, 38827=>1000, 38828=>1000, 38829=>1000, 38830=>1000, 38833=>1000, 38834=>1000, 38835=>1000, 38836=>1000, 38837=>1000, 38838=>1000, 38840=>1000, 38841=>1000, + 38842=>1000, 38844=>1000, 38846=>1000, 38847=>1000, 38849=>1000, 38851=>1000, 38852=>1000, 38853=>1000, 38854=>1000, 38855=>1000, 38856=>1000, 38857=>1000, 38858=>1000, 38859=>1000, 38860=>1000, 38861=>1000, + 38862=>1000, 38864=>1000, 38865=>1000, 38867=>1000, 38868=>1000, 38871=>1000, 38872=>1000, 38873=>1000, 38875=>1000, 38876=>1000, 38877=>1000, 38878=>1000, 38880=>1000, 38881=>1000, 38884=>1000, 38893=>1000, + 38894=>1000, 38895=>1000, 38897=>1000, 38898=>1000, 38899=>1000, 38900=>1000, 38901=>1000, 38902=>1000, 38903=>1000, 38904=>1000, 38906=>1000, 38907=>1000, 38911=>1000, 38913=>1000, 38914=>1000, 38915=>1000, + 38917=>1000, 38918=>1000, 38919=>1000, 38920=>1000, 38922=>1000, 38924=>1000, 38925=>1000, 38926=>1000, 38927=>1000, 38928=>1000, 38929=>1000, 38930=>1000, 38931=>1000, 38932=>1000, 38934=>1000, 38935=>1000, + 38936=>1000, 38937=>1000, 38938=>1000, 38940=>1000, 38942=>1000, 38944=>1000, 38945=>1000, 38947=>1000, 38948=>1000, 38949=>1000, 38950=>1000, 38955=>1000, 38956=>1000, 38957=>1000, 38958=>1000, 38959=>1000, + 38960=>1000, 38962=>1000, 38963=>1000, 38964=>1000, 38965=>1000, 38967=>1000, 38968=>1000, 38971=>1000, 38972=>1000, 38973=>1000, 38974=>1000, 38980=>1000, 38982=>1000, 38983=>1000, 38986=>1000, 38987=>1000, + 38988=>1000, 38989=>1000, 38990=>1000, 38991=>1000, 38993=>1000, 38994=>1000, 38995=>1000, 38996=>1000, 38997=>1000, 38998=>1000, 38999=>1000, 39000=>1000, 39001=>1000, 39002=>1000, 39003=>1000, 39006=>1000, + 39010=>1000, 39011=>1000, 39013=>1000, 39014=>1000, 39015=>1000, 39018=>1000, 39019=>1000, 39020=>1000, 39023=>1000, 39024=>1000, 39025=>1000, 39027=>1000, 39028=>1000, 39080=>1000, 39082=>1000, 39083=>1000, + 39085=>1000, 39086=>1000, 39087=>1000, 39088=>1000, 39089=>1000, 39092=>1000, 39094=>1000, 39095=>1000, 39096=>1000, 39098=>1000, 39099=>1000, 39103=>1000, 39106=>1000, 39107=>1000, 39108=>1000, 39109=>1000, + 39110=>1000, 39112=>1000, 39116=>1000, 39131=>1000, 39132=>1000, 39135=>1000, 39137=>1000, 39138=>1000, 39139=>1000, 39141=>1000, 39142=>1000, 39143=>1000, 39145=>1000, 39146=>1000, 39147=>1000, 39149=>1000, + 39150=>1000, 39151=>1000, 39154=>1000, 39155=>1000, 39156=>1000, 39158=>1000, 39164=>1000, 39165=>1000, 39166=>1000, 39170=>1000, 39171=>1000, 39173=>1000, 39175=>1000, 39176=>1000, 39177=>1000, 39178=>1000, + 39180=>1000, 39184=>1000, 39185=>1000, 39186=>1000, 39187=>1000, 39188=>1000, 39189=>1000, 39190=>1000, 39191=>1000, 39192=>1000, 39194=>1000, 39195=>1000, 39196=>1000, 39197=>1000, 39198=>1000, 39199=>1000, + 39200=>1000, 39201=>1000, 39202=>1000, 39204=>1000, 39206=>1000, 39207=>1000, 39208=>1000, 39211=>1000, 39212=>1000, 39214=>1000, 39217=>1000, 39218=>1000, 39219=>1000, 39220=>1000, 39221=>1000, 39225=>1000, + 39226=>1000, 39227=>1000, 39228=>1000, 39229=>1000, 39230=>1000, 39232=>1000, 39233=>1000, 39234=>1000, 39237=>1000, 39238=>1000, 39239=>1000, 39240=>1000, 39241=>1000, 39243=>1000, 39244=>1000, 39245=>1000, + 39246=>1000, 39248=>1000, 39249=>1000, 39250=>1000, 39252=>1000, 39253=>1000, 39255=>1000, 39256=>1000, 39257=>1000, 39259=>1000, 39260=>1000, 39262=>1000, 39263=>1000, 39264=>1000, 39318=>1000, 39319=>1000, + 39320=>1000, 39321=>1000, 39323=>1000, 39325=>1000, 39326=>1000, 39327=>1000, 39333=>1000, 39334=>1000, 39336=>1000, 39340=>1000, 39341=>1000, 39342=>1000, 39344=>1000, 39345=>1000, 39346=>1000, 39347=>1000, + 39348=>1000, 39349=>1000, 39353=>1000, 39354=>1000, 39356=>1000, 39357=>1000, 39359=>1000, 39361=>1000, 39363=>1000, 39364=>1000, 39365=>1000, 39366=>1000, 39368=>1000, 39369=>1000, 39376=>1000, 39377=>1000, + 39378=>1000, 39379=>1000, 39380=>1000, 39381=>1000, 39384=>1000, 39385=>1000, 39386=>1000, 39387=>1000, 39388=>1000, 39389=>1000, 39390=>1000, 39391=>1000, 39394=>1000, 39399=>1000, 39402=>1000, 39403=>1000, + 39404=>1000, 39405=>1000, 39406=>1000, 39408=>1000, 39409=>1000, 39410=>1000, 39412=>1000, 39413=>1000, 39416=>1000, 39417=>1000, 39419=>1000, 39421=>1000, 39422=>1000, 39423=>1000, 39425=>1000, 39426=>1000, + 39427=>1000, 39428=>1000, 39429=>1000, 39435=>1000, 39436=>1000, 39438=>1000, 39439=>1000, 39440=>1000, 39441=>1000, 39442=>1000, 39443=>1000, 39446=>1000, 39449=>1000, 39454=>1000, 39456=>1000, 39458=>1000, + 39459=>1000, 39460=>1000, 39463=>1000, 39464=>1000, 39467=>1000, 39469=>1000, 39470=>1000, 39472=>1000, 39475=>1000, 39477=>1000, 39478=>1000, 39479=>1000, 39480=>1000, 39486=>1000, 39488=>1000, 39489=>1000, + 39490=>1000, 39491=>1000, 39492=>1000, 39493=>1000, 39495=>1000, 39498=>1000, 39499=>1000, 39500=>1000, 39501=>1000, 39502=>1000, 39505=>1000, 39508=>1000, 39509=>1000, 39510=>1000, 39511=>1000, 39514=>1000, + 39515=>1000, 39517=>1000, 39519=>1000, 39522=>1000, 39524=>1000, 39525=>1000, 39529=>1000, 39530=>1000, 39531=>1000, 39592=>1000, 39594=>1000, 39596=>1000, 39597=>1000, 39598=>1000, 39599=>1000, 39600=>1000, + 39602=>1000, 39604=>1000, 39605=>1000, 39606=>1000, 39608=>1000, 39609=>1000, 39611=>1000, 39612=>1000, 39614=>1000, 39615=>1000, 39616=>1000, 39617=>1000, 39619=>1000, 39620=>1000, 39622=>1000, 39624=>1000, + 39630=>1000, 39631=>1000, 39632=>1000, 39633=>1000, 39634=>1000, 39635=>1000, 39636=>1000, 39637=>1000, 39638=>1000, 39639=>1000, 39640=>1000, 39641=>1000, 39643=>1000, 39644=>1000, 39646=>1000, 39647=>1000, + 39648=>1000, 39650=>1000, 39651=>1000, 39652=>1000, 39653=>1000, 39654=>1000, 39655=>1000, 39657=>1000, 39658=>1000, 39659=>1000, 39660=>1000, 39661=>1000, 39662=>1000, 39663=>1000, 39665=>1000, 39666=>1000, + 39667=>1000, 39668=>1000, 39669=>1000, 39671=>1000, 39673=>1000, 39674=>1000, 39675=>1000, 39677=>1000, 39679=>1000, 39680=>1000, 39681=>1000, 39682=>1000, 39683=>1000, 39684=>1000, 39685=>1000, 39686=>1000, + 39688=>1000, 39689=>1000, 39691=>1000, 39692=>1000, 39693=>1000, 39694=>1000, 39696=>1000, 39698=>1000, 39702=>1000, 39704=>1000, 39705=>1000, 39706=>1000, 39707=>1000, 39708=>1000, 39711=>1000, 39712=>1000, + 39714=>1000, 39715=>1000, 39717=>1000, 39718=>1000, 39719=>1000, 39720=>1000, 39721=>1000, 39722=>1000, 39723=>1000, 39725=>1000, 39726=>1000, 39727=>1000, 39729=>1000, 39730=>1000, 39731=>1000, 39732=>1000, + 39733=>1000, 39735=>1000, 39737=>1000, 39738=>1000, 39739=>1000, 39740=>1000, 39741=>1000, 39745=>1000, 39746=>1000, 39747=>1000, 39748=>1000, 39749=>1000, 39752=>1000, 39755=>1000, 39756=>1000, 39757=>1000, + 39758=>1000, 39759=>1000, 39761=>1000, 39764=>1000, 39765=>1000, 39766=>1000, 39767=>1000, 39768=>1000, 39770=>1000, 39771=>1000, 39774=>1000, 39777=>1000, 39779=>1000, 39781=>1000, 39782=>1000, 39784=>1000, + 39786=>1000, 39787=>1000, 39788=>1000, 39789=>1000, 39790=>1000, 39791=>1000, 39794=>1000, 39795=>1000, 39796=>1000, 39797=>1000, 39799=>1000, 39800=>1000, 39801=>1000, 39807=>1000, 39808=>1000, 39811=>1000, + 39812=>1000, 39813=>1000, 39814=>1000, 39815=>1000, 39817=>1000, 39818=>1000, 39819=>1000, 39821=>1000, 39822=>1000, 39823=>1000, 39824=>1000, 39825=>1000, 39826=>1000, 39827=>1000, 39828=>1000, 39830=>1000, + 39831=>1000, 39834=>1000, 39837=>1000, 39838=>1000, 39839=>1000, 39840=>1000, 39846=>1000, 39847=>1000, 39848=>1000, 39849=>1000, 39850=>1000, 39851=>1000, 39852=>1000, 39853=>1000, 39854=>1000, 39856=>1000, + 39857=>1000, 39858=>1000, 39860=>1000, 39863=>1000, 39864=>1000, 39865=>1000, 39867=>1000, 39868=>1000, 39870=>1000, 39871=>1000, 39872=>1000, 39873=>1000, 39878=>1000, 39879=>1000, 39880=>1000, 39881=>1000, + 39882=>1000, 39886=>1000, 39887=>1000, 39888=>1000, 39889=>1000, 39890=>1000, 39892=>1000, 39894=>1000, 39895=>1000, 39896=>1000, 39899=>1000, 39901=>1000, 39903=>1000, 39905=>1000, 39906=>1000, 39907=>1000, + 39908=>1000, 39909=>1000, 39911=>1000, 39912=>1000, 39914=>1000, 39915=>1000, 39919=>1000, 39920=>1000, 39921=>1000, 39922=>1000, 39923=>1000, 39925=>1000, 39927=>1000, 39928=>1000, 39929=>1000, 39930=>1000, + 39933=>1000, 39935=>1000, 39936=>1000, 39938=>1000, 39940=>1000, 39942=>1000, 39944=>1000, 39945=>1000, 39946=>1000, 39947=>1000, 39948=>1000, 39949=>1000, 39951=>1000, 39952=>1000, 39953=>1000, 39954=>1000, + 39955=>1000, 39956=>1000, 39957=>1000, 39958=>1000, 39960=>1000, 39961=>1000, 39962=>1000, 39963=>1000, 39964=>1000, 39966=>1000, 39969=>1000, 39970=>1000, 39971=>1000, 39972=>1000, 39973=>1000, 39974=>1000, + 39975=>1000, 39976=>1000, 39977=>1000, 39978=>1000, 39981=>1000, 39982=>1000, 39983=>1000, 39984=>1000, 39985=>1000, 39986=>1000, 39989=>1000, 39990=>1000, 39991=>1000, 39993=>1000, 39994=>1000, 39995=>1000, + 39997=>1000, 39998=>1000, 40001=>1000, 40003=>1000, 40004=>1000, 40005=>1000, 40006=>1000, 40007=>1000, 40008=>1000, 40009=>1000, 40010=>1000, 40014=>1000, 40015=>1000, 40016=>1000, 40018=>1000, 40019=>1000, + 40020=>1000, 40022=>1000, 40023=>1000, 40024=>1000, 40026=>1000, 40027=>1000, 40028=>1000, 40029=>1000, 40030=>1000, 40031=>1000, 40032=>1000, 40035=>1000, 40039=>1000, 40040=>1000, 40041=>1000, 40042=>1000, + 40043=>1000, 40046=>1000, 40048=>1000, 40050=>1000, 40053=>1000, 40054=>1000, 40055=>1000, 40056=>1000, 40059=>1000, 40165=>1000, 40166=>1000, 40167=>1000, 40169=>1000, 40171=>1000, 40172=>1000, 40176=>1000, + 40178=>1000, 40179=>1000, 40180=>1000, 40182=>1000, 40183=>1000, 40185=>1000, 40194=>1000, 40195=>1000, 40198=>1000, 40199=>1000, 40200=>1000, 40201=>1000, 40203=>1000, 40206=>1000, 40209=>1000, 40210=>1000, + 40213=>1000, 40215=>1000, 40216=>1000, 40219=>1000, 40220=>1000, 40221=>1000, 40222=>1000, 40223=>1000, 40227=>1000, 40230=>1000, 40232=>1000, 40234=>1000, 40235=>1000, 40236=>1000, 40239=>1000, 40240=>1000, + 40242=>1000, 40243=>1000, 40244=>1000, 40250=>1000, 40251=>1000, 40252=>1000, 40253=>1000, 40254=>1000, 40255=>1000, 40257=>1000, 40258=>1000, 40259=>1000, 40260=>1000, 40261=>1000, 40262=>1000, 40263=>1000, + 40264=>1000, 40266=>1000, 40272=>1000, 40273=>1000, 40275=>1000, 40276=>1000, 40281=>1000, 40284=>1000, 40285=>1000, 40286=>1000, 40287=>1000, 40288=>1000, 40289=>1000, 40290=>1000, 40291=>1000, 40292=>1000, + 40293=>1000, 40297=>1000, 40298=>1000, 40299=>1000, 40300=>1000, 40303=>1000, 40304=>1000, 40306=>1000, 40310=>1000, 40311=>1000, 40314=>1000, 40315=>1000, 40316=>1000, 40318=>1000, 40323=>1000, 40324=>1000, + 40326=>1000, 40327=>1000, 40329=>1000, 40330=>1000, 40333=>1000, 40334=>1000, 40335=>1000, 40338=>1000, 40339=>1000, 40341=>1000, 40342=>1000, 40343=>1000, 40344=>1000, 40346=>1000, 40353=>1000, 40356=>1000, + 40361=>1000, 40362=>1000, 40363=>1000, 40364=>1000, 40366=>1000, 40367=>1000, 40369=>1000, 40370=>1000, 40372=>1000, 40373=>1000, 40376=>1000, 40377=>1000, 40378=>1000, 40379=>1000, 40380=>1000, 40383=>1000, + 40385=>1000, 40386=>1000, 40387=>1000, 40388=>1000, 40390=>1000, 40391=>1000, 40393=>1000, 40394=>1000, 40399=>1000, 40403=>1000, 40404=>1000, 40405=>1000, 40406=>1000, 40407=>1000, 40409=>1000, 40410=>1000, + 40414=>1000, 40415=>1000, 40416=>1000, 40421=>1000, 40422=>1000, 40423=>1000, 40425=>1000, 40427=>1000, 40429=>1000, 40430=>1000, 40431=>1000, 40432=>1000, 40434=>1000, 40435=>1000, 40436=>1000, 40440=>1000, + 40441=>1000, 40442=>1000, 40445=>1000, 40446=>1000, 40450=>1000, 40455=>1000, 40458=>1000, 40462=>1000, 40464=>1000, 40465=>1000, 40466=>1000, 40469=>1000, 40470=>1000, 40473=>1000, 40474=>1000, 40475=>1000, + 40476=>1000, 40477=>1000, 40478=>1000, 40565=>1000, 40568=>1000, 40569=>1000, 40570=>1000, 40571=>1000, 40572=>1000, 40573=>1000, 40575=>1000, 40576=>1000, 40577=>1000, 40578=>1000, 40579=>1000, 40580=>1000, + 40581=>1000, 40583=>1000, 40584=>1000, 40587=>1000, 40588=>1000, 40590=>1000, 40591=>1000, 40593=>1000, 40594=>1000, 40595=>1000, 40597=>1000, 40598=>1000, 40599=>1000, 40600=>1000, 40603=>1000, 40605=>1000, + 40606=>1000, 40607=>1000, 40612=>1000, 40613=>1000, 40614=>1000, 40616=>1000, 40617=>1000, 40618=>1000, 40620=>1000, 40621=>1000, 40622=>1000, 40623=>1000, 40624=>1000, 40627=>1000, 40628=>1000, 40629=>1000, + 40632=>1000, 40633=>1000, 40634=>1000, 40635=>1000, 40636=>1000, 40638=>1000, 40639=>1000, 40644=>1000, 40646=>1000, 40648=>1000, 40651=>1000, 40652=>1000, 40653=>1000, 40654=>1000, 40655=>1000, 40656=>1000, + 40657=>1000, 40658=>1000, 40660=>1000, 40661=>1000, 40664=>1000, 40665=>1000, 40667=>1000, 40668=>1000, 40669=>1000, 40670=>1000, 40671=>1000, 40672=>1000, 40676=>1000, 40677=>1000, 40679=>1000, 40680=>1000, + 40684=>1000, 40685=>1000, 40686=>1000, 40687=>1000, 40688=>1000, 40689=>1000, 40690=>1000, 40692=>1000, 40693=>1000, 40694=>1000, 40695=>1000, 40696=>1000, 40697=>1000, 40699=>1000, 40700=>1000, 40701=>1000, + 40703=>1000, 40706=>1000, 40707=>1000, 40711=>1000, 40712=>1000, 40713=>1000, 40718=>1000, 40719=>1000, 40720=>1000, 40721=>1000, 40722=>1000, 40723=>1000, 40724=>1000, 40725=>1000, 40726=>1000, 40727=>1000, + 40729=>1000, 40730=>1000, 40731=>1000, 40735=>1000, 40736=>1000, 40737=>1000, 40738=>1000, 40742=>1000, 40746=>1000, 40747=>1000, 40748=>1000, 40751=>1000, 40753=>1000, 40754=>1000, 40756=>1000, 40759=>1000, + 40761=>1000, 40762=>1000, 40763=>1000, 40764=>1000, 40765=>1000, 40766=>1000, 40767=>1000, 40769=>1000, 40771=>1000, 40772=>1000, 40773=>1000, 40774=>1000, 40775=>1000, 40778=>1000, 40779=>1000, 40782=>1000, + 40783=>1000, 40786=>1000, 40787=>1000, 40788=>1000, 40789=>1000, 40790=>1000, 40791=>1000, 40792=>1000, 40794=>1000, 40797=>1000, 40798=>1000, 40799=>1000, 40800=>1000, 40801=>1000, 40802=>1000, 40803=>1000, + 40806=>1000, 40807=>1000, 40808=>1000, 40809=>1000, 40810=>1000, 40812=>1000, 40813=>1000, 40814=>1000, 40815=>1000, 40816=>1000, 40817=>1000, 40818=>1000, 40819=>1000, 40821=>1000, 40822=>1000, 40823=>1000, + 40826=>1000, 40829=>1000, 40845=>1000, 40847=>1000, 40848=>1000, 40849=>1000, 40850=>1000, 40852=>1000, 40853=>1000, 40854=>1000, 40855=>1000, 40860=>1000, 40861=>1000, 40862=>1000, 40864=>1000, 40865=>1000, + 40866=>1000, 40867=>1000, 40869=>1000, 63785=>1000, 63964=>1000, 64014=>1000, 64015=>1000, 64016=>1000, 64017=>1000, 64018=>1000, 64019=>1000, 64020=>1000, 64021=>1000, 64022=>1000, 64023=>1000, 64024=>1000, + 64025=>1000, 64026=>1000, 64027=>1000, 64028=>1000, 64029=>1000, 64030=>1000, 64031=>1000, 64032=>1000, 64033=>1000, 64034=>1000, 64035=>1000, 64036=>1000, 64037=>1000, 64038=>1000, 64039=>1000, 64040=>1000, + 64041=>1000, 64042=>1000, 64043=>1000, 64044=>1000, 64045=>1000, 65281=>1000, 65282=>1000, 65283=>1000, 65284=>1000, 65285=>1000, 65286=>1000, 65287=>1000, 65288=>1000, 65289=>1000, 65290=>1000, 65291=>1000, + 65292=>1000, 65293=>1000, 65294=>1000, 65295=>1000, 65296=>1000, 65297=>1000, 65298=>1000, 65299=>1000, 65300=>1000, 65301=>1000, 65302=>1000, 65303=>1000, 65304=>1000, 65305=>1000, 65306=>1000, 65307=>1000, + 65308=>1000, 65309=>1000, 65310=>1000, 65311=>1000, 65312=>1000, 65313=>1000, 65314=>1000, 65315=>1000, 65316=>1000, 65317=>1000, 65318=>1000, 65319=>1000, 65320=>1000, 65321=>1000, 65322=>1000, 65323=>1000, + 65324=>1000, 65325=>1000, 65326=>1000, 65327=>1000, 65328=>1000, 65329=>1000, 65330=>1000, 65331=>1000, 65332=>1000, 65333=>1000, 65334=>1000, 65335=>1000, 65336=>1000, 65337=>1000, 65338=>1000, 65339=>1000, + 65340=>1000, 65341=>1000, 65342=>1000, 65343=>1000, 65344=>1000, 65345=>1000, 65346=>1000, 65347=>1000, 65348=>1000, 65349=>1000, 65350=>1000, 65351=>1000, 65352=>1000, 65353=>1000, 65354=>1000, 65355=>1000, + 65356=>1000, 65357=>1000, 65358=>1000, 65359=>1000, 65360=>1000, 65361=>1000, 65362=>1000, 65363=>1000, 65364=>1000, 65365=>1000, 65366=>1000, 65367=>1000, 65368=>1000, 65369=>1000, 65370=>1000, 65371=>1000, + 65372=>1000, 65373=>1000, 65374=>1000, 65377=>500, 65378=>500, 65379=>500, 65380=>500, 65381=>500, 65382=>500, 65383=>500, 65384=>500, 65385=>500, 65386=>500, 65387=>500, 65388=>500, 65389=>500, + 65390=>500, 65391=>500, 65392=>500, 65393=>500, 65394=>500, 65395=>500, 65396=>500, 65397=>500, 65398=>500, 65399=>500, 65400=>500, 65401=>500, 65402=>500, 65403=>500, 65404=>500, 65405=>500, + 65406=>500, 65407=>500, 65408=>500, 65409=>500, 65410=>500, 65411=>500, 65412=>500, 65413=>500, 65414=>500, 65415=>500, 65416=>500, 65417=>500, 65418=>500, 65419=>500, 65420=>500, 65421=>500, + 65422=>500, 65423=>500, 65424=>500, 65425=>500, 65426=>500, 65427=>500, 65428=>500, 65429=>500, 65430=>500, 65431=>500, 65432=>500, 65433=>500, 65434=>500, 65435=>500, 65436=>500, 65437=>500, + 65438=>500, 65439=>500, 65504=>1000, 65505=>1000, 65506=>1000, 65507=>1000, 65509=>1000} + font[:enc]=''; + font[:diff]=''; + font[:file]=''; + font[:registry]={'ordering'=>'Japan1','supplement'=>2} +end \ No newline at end of file diff --git a/vendor/plugins/rfpdf/lib/fonts/symbol.rb b/vendor/plugins/rfpdf/lib/fonts/symbol.rb new file mode 100755 index 00000000..dc392b3e --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/symbol.rb @@ -0,0 +1,15 @@ +TCPDFFontDescriptor.define('symbol') do |font| + font[:cw]={ + 0.chr=>250,1.chr=>250,2.chr=>250,3.chr=>250,4.chr=>250,5.chr=>250,6.chr=>250,7.chr=>250,8.chr=>250,9.chr=>250,10.chr=>250,11.chr=>250,12.chr=>250,13.chr=>250,14.chr=>250,15.chr=>250,16.chr=>250,17.chr=>250,18.chr=>250,19.chr=>250,20.chr=>250,21.chr=>250, + 22.chr=>250,23.chr=>250,24.chr=>250,25.chr=>250,26.chr=>250,27.chr=>250,28.chr=>250,29.chr=>250,30.chr=>250,31.chr=>250,' '=>250,'!'=>333,'"'=>713,'#'=>500,'$'=>549,'%'=>833,'&'=>778,'\''=>439,'('=>333,')'=>333,'*'=>500,'+'=>549, + ','=>250,'-'=>549,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>278,';'=>278,'<'=>549,'='=>549,'>'=>549,'?'=>444,'@'=>549,'A'=>722, + 'B'=>667,'C'=>722,'D'=>612,'E'=>611,'F'=>763,'G'=>603,'H'=>722,'I'=>333,'J'=>631,'K'=>722,'L'=>686,'M'=>889,'N'=>722,'O'=>722,'P'=>768,'Q'=>741,'R'=>556,'S'=>592,'T'=>611,'U'=>690,'V'=>439,'W'=>768, + 'X'=>645,'Y'=>795,'Z'=>611,'['=>333,'\\'=>863,']'=>333,'^'=>658,'_'=>500,'`'=>500,'a'=>631,'b'=>549,'c'=>549,'d'=>494,'e'=>439,'f'=>521,'g'=>411,'h'=>603,'i'=>329,'j'=>603,'k'=>549,'l'=>549,'m'=>576, + 'n'=>521,'o'=>549,'p'=>549,'q'=>521,'r'=>549,'s'=>603,'t'=>439,'u'=>576,'v'=>713,'w'=>686,'x'=>493,'y'=>686,'z'=>494,'{'=>480,'|'=>200,'}'=>480,'~'=>549,127.chr=>0,128.chr=>0,129.chr=>0,130.chr=>0,131.chr=>0, + 132.chr=>0,133.chr=>0,134.chr=>0,135.chr=>0,136.chr=>0,137.chr=>0,138.chr=>0,139.chr=>0,140.chr=>0,141.chr=>0,142.chr=>0,143.chr=>0,144.chr=>0,145.chr=>0,146.chr=>0,147.chr=>0,148.chr=>0,149.chr=>0,150.chr=>0,151.chr=>0,152.chr=>0,153.chr=>0, + 154.chr=>0,155.chr=>0,156.chr=>0,157.chr=>0,158.chr=>0,159.chr=>0,160.chr=>750,161.chr=>620,162.chr=>247,163.chr=>549,164.chr=>167,165.chr=>713,166.chr=>500,167.chr=>753,168.chr=>753,169.chr=>753,170.chr=>753,171.chr=>1042,172.chr=>987,173.chr=>603,174.chr=>987,175.chr=>603, + 176.chr=>400,177.chr=>549,178.chr=>411,179.chr=>549,180.chr=>549,181.chr=>713,182.chr=>494,183.chr=>460,184.chr=>549,185.chr=>549,186.chr=>549,187.chr=>549,188.chr=>1000,189.chr=>603,190.chr=>1000,191.chr=>658,192.chr=>823,193.chr=>686,194.chr=>795,195.chr=>987,196.chr=>768,197.chr=>768, + 198.chr=>823,199.chr=>768,200.chr=>768,201.chr=>713,202.chr=>713,203.chr=>713,204.chr=>713,205.chr=>713,206.chr=>713,207.chr=>713,208.chr=>768,209.chr=>713,210.chr=>790,211.chr=>790,212.chr=>890,213.chr=>823,214.chr=>549,215.chr=>250,216.chr=>713,217.chr=>603,218.chr=>603,219.chr=>1042, + 220.chr=>987,221.chr=>603,222.chr=>987,223.chr=>603,224.chr=>494,225.chr=>329,226.chr=>790,227.chr=>790,228.chr=>786,229.chr=>713,230.chr=>384,231.chr=>384,232.chr=>384,233.chr=>384,234.chr=>384,235.chr=>384,236.chr=>494,237.chr=>494,238.chr=>494,239.chr=>494,240.chr=>0,241.chr=>329, + 242.chr=>274,243.chr=>686,244.chr=>686,245.chr=>686,246.chr=>384,247.chr=>384,248.chr=>384,249.chr=>384,250.chr=>384,251.chr=>384,252.chr=>494,253.chr=>494,254.chr=>494,255.chr=>0); +end \ No newline at end of file diff --git a/vendor/plugins/rfpdf/lib/fonts/times.rb b/vendor/plugins/rfpdf/lib/fonts/times.rb new file mode 100755 index 00000000..08babc61 --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/times.rb @@ -0,0 +1,15 @@ +TCPDFFontDescriptor.define('times') do |font| + font[:cw]={ + 0.chr=>250,1.chr=>250,2.chr=>250,3.chr=>250,4.chr=>250,5.chr=>250,6.chr=>250,7.chr=>250,8.chr=>250,9.chr=>250,10.chr=>250,11.chr=>250,12.chr=>250,13.chr=>250,14.chr=>250,15.chr=>250,16.chr=>250,17.chr=>250,18.chr=>250,19.chr=>250,20.chr=>250,21.chr=>250, + 22.chr=>250,23.chr=>250,24.chr=>250,25.chr=>250,26.chr=>250,27.chr=>250,28.chr=>250,29.chr=>250,30.chr=>250,31.chr=>250,' '=>250,'!'=>333,'"'=>408,'#'=>500,'$'=>500,'%'=>833,'&'=>778,'\''=>180,'('=>333,')'=>333,'*'=>500,'+'=>564, + ','=>250,'-'=>333,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>278,';'=>278,'<'=>564,'='=>564,'>'=>564,'?'=>444,'@'=>921,'A'=>722, + 'B'=>667,'C'=>667,'D'=>722,'E'=>611,'F'=>556,'G'=>722,'H'=>722,'I'=>333,'J'=>389,'K'=>722,'L'=>611,'M'=>889,'N'=>722,'O'=>722,'P'=>556,'Q'=>722,'R'=>667,'S'=>556,'T'=>611,'U'=>722,'V'=>722,'W'=>944, + 'X'=>722,'Y'=>722,'Z'=>611,'['=>333,'\\'=>278,']'=>333,'^'=>469,'_'=>500,'`'=>333,'a'=>444,'b'=>500,'c'=>444,'d'=>500,'e'=>444,'f'=>333,'g'=>500,'h'=>500,'i'=>278,'j'=>278,'k'=>500,'l'=>278,'m'=>778, + 'n'=>500,'o'=>500,'p'=>500,'q'=>500,'r'=>333,'s'=>389,'t'=>278,'u'=>500,'v'=>500,'w'=>722,'x'=>500,'y'=>500,'z'=>444,'{'=>480,'|'=>200,'}'=>480,'~'=>541,127.chr=>350,128.chr=>500,129.chr=>350,130.chr=>333,131.chr=>500, + 132.chr=>444,133.chr=>1000,134.chr=>500,135.chr=>500,136.chr=>333,137.chr=>1000,138.chr=>556,139.chr=>333,140.chr=>889,141.chr=>350,142.chr=>611,143.chr=>350,144.chr=>350,145.chr=>333,146.chr=>333,147.chr=>444,148.chr=>444,149.chr=>350,150.chr=>500,151.chr=>1000,152.chr=>333,153.chr=>980, + 154.chr=>389,155.chr=>333,156.chr=>722,157.chr=>350,158.chr=>444,159.chr=>722,160.chr=>250,161.chr=>333,162.chr=>500,163.chr=>500,164.chr=>500,165.chr=>500,166.chr=>200,167.chr=>500,168.chr=>333,169.chr=>760,170.chr=>276,171.chr=>500,172.chr=>564,173.chr=>333,174.chr=>760,175.chr=>333, + 176.chr=>400,177.chr=>564,178.chr=>300,179.chr=>300,180.chr=>333,181.chr=>500,182.chr=>453,183.chr=>250,184.chr=>333,185.chr=>300,186.chr=>310,187.chr=>500,188.chr=>750,189.chr=>750,190.chr=>750,191.chr=>444,192.chr=>722,193.chr=>722,194.chr=>722,195.chr=>722,196.chr=>722,197.chr=>722, + 198.chr=>889,199.chr=>667,200.chr=>611,201.chr=>611,202.chr=>611,203.chr=>611,204.chr=>333,205.chr=>333,206.chr=>333,207.chr=>333,208.chr=>722,209.chr=>722,210.chr=>722,211.chr=>722,212.chr=>722,213.chr=>722,214.chr=>722,215.chr=>564,216.chr=>722,217.chr=>722,218.chr=>722,219.chr=>722, + 220.chr=>722,221.chr=>722,222.chr=>556,223.chr=>500,224.chr=>444,225.chr=>444,226.chr=>444,227.chr=>444,228.chr=>444,229.chr=>444,230.chr=>667,231.chr=>444,232.chr=>444,233.chr=>444,234.chr=>444,235.chr=>444,236.chr=>278,237.chr=>278,238.chr=>278,239.chr=>278,240.chr=>500,241.chr=>500, + 242.chr=>500,243.chr=>500,244.chr=>500,245.chr=>500,246.chr=>500,247.chr=>564,248.chr=>500,249.chr=>500,250.chr=>500,251.chr=>500,252.chr=>500,253.chr=>500,254.chr=>500,255.chr=>500); +end \ No newline at end of file diff --git a/vendor/plugins/rfpdf/lib/fonts/timesb.rb b/vendor/plugins/rfpdf/lib/fonts/timesb.rb new file mode 100755 index 00000000..8a86ce47 --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/timesb.rb @@ -0,0 +1,15 @@ +TCPDFFontDescriptor.define('timesb') do |font| + font[:cw]={ + 0.chr=>250,1.chr=>250,2.chr=>250,3.chr=>250,4.chr=>250,5.chr=>250,6.chr=>250,7.chr=>250,8.chr=>250,9.chr=>250,10.chr=>250,11.chr=>250,12.chr=>250,13.chr=>250,14.chr=>250,15.chr=>250,16.chr=>250,17.chr=>250,18.chr=>250,19.chr=>250,20.chr=>250,21.chr=>250, + 22.chr=>250,23.chr=>250,24.chr=>250,25.chr=>250,26.chr=>250,27.chr=>250,28.chr=>250,29.chr=>250,30.chr=>250,31.chr=>250,' '=>250,'!'=>333,'"'=>555,'#'=>500,'$'=>500,'%'=>1000,'&'=>833,'\''=>278,'('=>333,')'=>333,'*'=>500,'+'=>570, + ','=>250,'-'=>333,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>333,';'=>333,'<'=>570,'='=>570,'>'=>570,'?'=>500,'@'=>930,'A'=>722, + 'B'=>667,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>778,'I'=>389,'J'=>500,'K'=>778,'L'=>667,'M'=>944,'N'=>722,'O'=>778,'P'=>611,'Q'=>778,'R'=>722,'S'=>556,'T'=>667,'U'=>722,'V'=>722,'W'=>1000, + 'X'=>722,'Y'=>722,'Z'=>667,'['=>333,'\\'=>278,']'=>333,'^'=>581,'_'=>500,'`'=>333,'a'=>500,'b'=>556,'c'=>444,'d'=>556,'e'=>444,'f'=>333,'g'=>500,'h'=>556,'i'=>278,'j'=>333,'k'=>556,'l'=>278,'m'=>833, + 'n'=>556,'o'=>500,'p'=>556,'q'=>556,'r'=>444,'s'=>389,'t'=>333,'u'=>556,'v'=>500,'w'=>722,'x'=>500,'y'=>500,'z'=>444,'{'=>394,'|'=>220,'}'=>394,'~'=>520,127.chr=>350,128.chr=>500,129.chr=>350,130.chr=>333,131.chr=>500, + 132.chr=>500,133.chr=>1000,134.chr=>500,135.chr=>500,136.chr=>333,137.chr=>1000,138.chr=>556,139.chr=>333,140.chr=>1000,141.chr=>350,142.chr=>667,143.chr=>350,144.chr=>350,145.chr=>333,146.chr=>333,147.chr=>500,148.chr=>500,149.chr=>350,150.chr=>500,151.chr=>1000,152.chr=>333,153.chr=>1000, + 154.chr=>389,155.chr=>333,156.chr=>722,157.chr=>350,158.chr=>444,159.chr=>722,160.chr=>250,161.chr=>333,162.chr=>500,163.chr=>500,164.chr=>500,165.chr=>500,166.chr=>220,167.chr=>500,168.chr=>333,169.chr=>747,170.chr=>300,171.chr=>500,172.chr=>570,173.chr=>333,174.chr=>747,175.chr=>333, + 176.chr=>400,177.chr=>570,178.chr=>300,179.chr=>300,180.chr=>333,181.chr=>556,182.chr=>540,183.chr=>250,184.chr=>333,185.chr=>300,186.chr=>330,187.chr=>500,188.chr=>750,189.chr=>750,190.chr=>750,191.chr=>500,192.chr=>722,193.chr=>722,194.chr=>722,195.chr=>722,196.chr=>722,197.chr=>722, + 198.chr=>1000,199.chr=>722,200.chr=>667,201.chr=>667,202.chr=>667,203.chr=>667,204.chr=>389,205.chr=>389,206.chr=>389,207.chr=>389,208.chr=>722,209.chr=>722,210.chr=>778,211.chr=>778,212.chr=>778,213.chr=>778,214.chr=>778,215.chr=>570,216.chr=>778,217.chr=>722,218.chr=>722,219.chr=>722, + 220.chr=>722,221.chr=>722,222.chr=>611,223.chr=>556,224.chr=>500,225.chr=>500,226.chr=>500,227.chr=>500,228.chr=>500,229.chr=>500,230.chr=>722,231.chr=>444,232.chr=>444,233.chr=>444,234.chr=>444,235.chr=>444,236.chr=>278,237.chr=>278,238.chr=>278,239.chr=>278,240.chr=>500,241.chr=>556, + 242.chr=>500,243.chr=>500,244.chr=>500,245.chr=>500,246.chr=>500,247.chr=>570,248.chr=>500,249.chr=>556,250.chr=>556,251.chr=>556,252.chr=>556,253.chr=>500,254.chr=>556,255.chr=>500); +end \ No newline at end of file diff --git a/vendor/plugins/rfpdf/lib/fonts/timesbi.rb b/vendor/plugins/rfpdf/lib/fonts/timesbi.rb new file mode 100755 index 00000000..db1b985e --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/timesbi.rb @@ -0,0 +1,15 @@ +TCPDFFontDescriptor.define('timesbi') do |font| + font[:cw]={ + 0.chr=>250,1.chr=>250,2.chr=>250,3.chr=>250,4.chr=>250,5.chr=>250,6.chr=>250,7.chr=>250,8.chr=>250,9.chr=>250,10.chr=>250,11.chr=>250,12.chr=>250,13.chr=>250,14.chr=>250,15.chr=>250,16.chr=>250,17.chr=>250,18.chr=>250,19.chr=>250,20.chr=>250,21.chr=>250, + 22.chr=>250,23.chr=>250,24.chr=>250,25.chr=>250,26.chr=>250,27.chr=>250,28.chr=>250,29.chr=>250,30.chr=>250,31.chr=>250,' '=>250,'!'=>389,'"'=>555,'#'=>500,'$'=>500,'%'=>833,'&'=>778,'\''=>278,'('=>333,')'=>333,'*'=>500,'+'=>570, + ','=>250,'-'=>333,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>333,';'=>333,'<'=>570,'='=>570,'>'=>570,'?'=>500,'@'=>832,'A'=>667, + 'B'=>667,'C'=>667,'D'=>722,'E'=>667,'F'=>667,'G'=>722,'H'=>778,'I'=>389,'J'=>500,'K'=>667,'L'=>611,'M'=>889,'N'=>722,'O'=>722,'P'=>611,'Q'=>722,'R'=>667,'S'=>556,'T'=>611,'U'=>722,'V'=>667,'W'=>889, + 'X'=>667,'Y'=>611,'Z'=>611,'['=>333,'\\'=>278,']'=>333,'^'=>570,'_'=>500,'`'=>333,'a'=>500,'b'=>500,'c'=>444,'d'=>500,'e'=>444,'f'=>333,'g'=>500,'h'=>556,'i'=>278,'j'=>278,'k'=>500,'l'=>278,'m'=>778, + 'n'=>556,'o'=>500,'p'=>500,'q'=>500,'r'=>389,'s'=>389,'t'=>278,'u'=>556,'v'=>444,'w'=>667,'x'=>500,'y'=>444,'z'=>389,'{'=>348,'|'=>220,'}'=>348,'~'=>570,127.chr=>350,128.chr=>500,129.chr=>350,130.chr=>333,131.chr=>500, + 132.chr=>500,133.chr=>1000,134.chr=>500,135.chr=>500,136.chr=>333,137.chr=>1000,138.chr=>556,139.chr=>333,140.chr=>944,141.chr=>350,142.chr=>611,143.chr=>350,144.chr=>350,145.chr=>333,146.chr=>333,147.chr=>500,148.chr=>500,149.chr=>350,150.chr=>500,151.chr=>1000,152.chr=>333,153.chr=>1000, + 154.chr=>389,155.chr=>333,156.chr=>722,157.chr=>350,158.chr=>389,159.chr=>611,160.chr=>250,161.chr=>389,162.chr=>500,163.chr=>500,164.chr=>500,165.chr=>500,166.chr=>220,167.chr=>500,168.chr=>333,169.chr=>747,170.chr=>266,171.chr=>500,172.chr=>606,173.chr=>333,174.chr=>747,175.chr=>333, + 176.chr=>400,177.chr=>570,178.chr=>300,179.chr=>300,180.chr=>333,181.chr=>576,182.chr=>500,183.chr=>250,184.chr=>333,185.chr=>300,186.chr=>300,187.chr=>500,188.chr=>750,189.chr=>750,190.chr=>750,191.chr=>500,192.chr=>667,193.chr=>667,194.chr=>667,195.chr=>667,196.chr=>667,197.chr=>667, + 198.chr=>944,199.chr=>667,200.chr=>667,201.chr=>667,202.chr=>667,203.chr=>667,204.chr=>389,205.chr=>389,206.chr=>389,207.chr=>389,208.chr=>722,209.chr=>722,210.chr=>722,211.chr=>722,212.chr=>722,213.chr=>722,214.chr=>722,215.chr=>570,216.chr=>722,217.chr=>722,218.chr=>722,219.chr=>722, + 220.chr=>722,221.chr=>611,222.chr=>611,223.chr=>500,224.chr=>500,225.chr=>500,226.chr=>500,227.chr=>500,228.chr=>500,229.chr=>500,230.chr=>722,231.chr=>444,232.chr=>444,233.chr=>444,234.chr=>444,235.chr=>444,236.chr=>278,237.chr=>278,238.chr=>278,239.chr=>278,240.chr=>500,241.chr=>556, + 242.chr=>500,243.chr=>500,244.chr=>500,245.chr=>500,246.chr=>500,247.chr=>570,248.chr=>500,249.chr=>556,250.chr=>556,251.chr=>556,252.chr=>556,253.chr=>444,254.chr=>500,255.chr=>444); +end \ No newline at end of file diff --git a/vendor/plugins/rfpdf/lib/fonts/timesi.rb b/vendor/plugins/rfpdf/lib/fonts/timesi.rb new file mode 100755 index 00000000..44f80853 --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/timesi.rb @@ -0,0 +1,15 @@ +TCPDFFontDescriptor.define('timesi') do |font| + font[:cw]={ + 0.chr=>250,1.chr=>250,2.chr=>250,3.chr=>250,4.chr=>250,5.chr=>250,6.chr=>250,7.chr=>250,8.chr=>250,9.chr=>250,10.chr=>250,11.chr=>250,12.chr=>250,13.chr=>250,14.chr=>250,15.chr=>250,16.chr=>250,17.chr=>250,18.chr=>250,19.chr=>250,20.chr=>250,21.chr=>250, + 22.chr=>250,23.chr=>250,24.chr=>250,25.chr=>250,26.chr=>250,27.chr=>250,28.chr=>250,29.chr=>250,30.chr=>250,31.chr=>250,' '=>250,'!'=>333,'"'=>420,'#'=>500,'$'=>500,'%'=>833,'&'=>778,'\''=>214,'('=>333,')'=>333,'*'=>500,'+'=>675, + ','=>250,'-'=>333,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>333,';'=>333,'<'=>675,'='=>675,'>'=>675,'?'=>500,'@'=>920,'A'=>611, + 'B'=>611,'C'=>667,'D'=>722,'E'=>611,'F'=>611,'G'=>722,'H'=>722,'I'=>333,'J'=>444,'K'=>667,'L'=>556,'M'=>833,'N'=>667,'O'=>722,'P'=>611,'Q'=>722,'R'=>611,'S'=>500,'T'=>556,'U'=>722,'V'=>611,'W'=>833, + 'X'=>611,'Y'=>556,'Z'=>556,'['=>389,'\\'=>278,']'=>389,'^'=>422,'_'=>500,'`'=>333,'a'=>500,'b'=>500,'c'=>444,'d'=>500,'e'=>444,'f'=>278,'g'=>500,'h'=>500,'i'=>278,'j'=>278,'k'=>444,'l'=>278,'m'=>722, + 'n'=>500,'o'=>500,'p'=>500,'q'=>500,'r'=>389,'s'=>389,'t'=>278,'u'=>500,'v'=>444,'w'=>667,'x'=>444,'y'=>444,'z'=>389,'{'=>400,'|'=>275,'}'=>400,'~'=>541,127.chr=>350,128.chr=>500,129.chr=>350,130.chr=>333,131.chr=>500, + 132.chr=>556,133.chr=>889,134.chr=>500,135.chr=>500,136.chr=>333,137.chr=>1000,138.chr=>500,139.chr=>333,140.chr=>944,141.chr=>350,142.chr=>556,143.chr=>350,144.chr=>350,145.chr=>333,146.chr=>333,147.chr=>556,148.chr=>556,149.chr=>350,150.chr=>500,151.chr=>889,152.chr=>333,153.chr=>980, + 154.chr=>389,155.chr=>333,156.chr=>667,157.chr=>350,158.chr=>389,159.chr=>556,160.chr=>250,161.chr=>389,162.chr=>500,163.chr=>500,164.chr=>500,165.chr=>500,166.chr=>275,167.chr=>500,168.chr=>333,169.chr=>760,170.chr=>276,171.chr=>500,172.chr=>675,173.chr=>333,174.chr=>760,175.chr=>333, + 176.chr=>400,177.chr=>675,178.chr=>300,179.chr=>300,180.chr=>333,181.chr=>500,182.chr=>523,183.chr=>250,184.chr=>333,185.chr=>300,186.chr=>310,187.chr=>500,188.chr=>750,189.chr=>750,190.chr=>750,191.chr=>500,192.chr=>611,193.chr=>611,194.chr=>611,195.chr=>611,196.chr=>611,197.chr=>611, + 198.chr=>889,199.chr=>667,200.chr=>611,201.chr=>611,202.chr=>611,203.chr=>611,204.chr=>333,205.chr=>333,206.chr=>333,207.chr=>333,208.chr=>722,209.chr=>667,210.chr=>722,211.chr=>722,212.chr=>722,213.chr=>722,214.chr=>722,215.chr=>675,216.chr=>722,217.chr=>722,218.chr=>722,219.chr=>722, + 220.chr=>722,221.chr=>556,222.chr=>611,223.chr=>500,224.chr=>500,225.chr=>500,226.chr=>500,227.chr=>500,228.chr=>500,229.chr=>500,230.chr=>667,231.chr=>444,232.chr=>444,233.chr=>444,234.chr=>444,235.chr=>444,236.chr=>278,237.chr=>278,238.chr=>278,239.chr=>278,240.chr=>500,241.chr=>500, + 242.chr=>500,243.chr=>500,244.chr=>500,245.chr=>500,246.chr=>500,247.chr=>675,248.chr=>500,249.chr=>500,250.chr=>500,251.chr=>500,252.chr=>500,253.chr=>444,254.chr=>500,255.chr=>444); +end \ No newline at end of file diff --git a/vendor/plugins/rfpdf/lib/fonts/ttf-bitstream-vera-1.10/COPYRIGHT.TXT b/vendor/plugins/rfpdf/lib/fonts/ttf-bitstream-vera-1.10/COPYRIGHT.TXT new file mode 100755 index 00000000..e9ed8be8 --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/ttf-bitstream-vera-1.10/COPYRIGHT.TXT @@ -0,0 +1,124 @@ +Bitstream Vera Fonts Copyright + +The fonts have a generous copyright, allowing derivative works (as +long as "Bitstream" or "Vera" are not in the names), and full +redistribution (so long as they are not#sold# by themselves). They +can be be bundled, redistributed and sold with any software. + +The fonts are distributed under the following copyright: + +Copyright +========= + +Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream +Vera is a trademark of Bitstream, Inc. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of the fonts accompanying this license ("Fonts") and associated +documentation files (the "Font Software"), to reproduce and distribute +the Font Software, including without limitation the rights to use, +copy, merge, publish, distribute, and/or sell copies of the Font +Software, and to permit persons to whom the Font Software is furnished +to do so, subject to the following conditions: + +The above copyright and trademark notices and this permission notice +shall be included in all copies of one or more of the Font Software +typefaces. + +The Font Software may be modified, altered, or added to, and in +particular the designs of glyphs or characters in the Fonts may be +modified and additional glyphs or characters may be added to the +Fonts, only if the fonts are renamed to names not containing either +the words "Bitstream" or the word "Vera". + +This License becomes null and void to the extent applicable to Fonts +or Font Software that has been modified and is distributed under the +"Bitstream Vera" names. + +The Font Software may be sold as part of a larger software package but +no copy of one or more of the Font Software typefaces may be sold by +itself. + +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL +BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, +OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT +SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. + +Except as contained in this notice, the names of Gnome, the Gnome +Foundation, and Bitstream Inc., shall not be used in advertising or +otherwise to promote the sale, use or other dealings in this Font +Software without prior written authorization from the Gnome Foundation +or Bitstream Inc., respectively. For further information, contact: +fonts at gnome dot org. + +Copyright FAQ +============= + + 1. I don't understand the resale restriction... What gives? + + Bitstream is giving away these fonts, but wishes to ensure its + competitors can't just drop the fonts as is into a font sale system + and sell them as is. It seems fair that if Bitstream can't make money + from the Bitstream Vera fonts, their competitors should not be able to + do so either. You can sell the fonts as part of any software package, + however. + + 2. I want to package these fonts separately for distribution and + sale as part of a larger software package or system. Can I do so? + + Yes. A RPM or Debian package is a "larger software package" to begin + with, and you aren't selling them independently by themselves. + See 1. above. + + 3. Are derivative works allowed? + Yes! + + 4. Can I change or add to the font(s)? + Yes, but you must change the name(s) of the font(s). + + 5. Under what terms are derivative works allowed? + + You must change the name(s) of the fonts. This is to ensure the + quality of the fonts, both to protect Bitstream and Gnome. We want to + ensure that if an application has opened a font specifically of these + names, it gets what it expects (though of course, using fontconfig, + substitutions could still could have occurred during font + opening). You must include the Bitstream copyright. Additional + copyrights can be added, as per copyright law. Happy Font Hacking! + + 6. If I have improvements for Bitstream Vera, is it possible they might get + adopted in future versions? + + Yes. The contract between the Gnome Foundation and Bitstream has + provisions for working with Bitstream to ensure quality additions to + the Bitstream Vera font family. Please contact us if you have such + additions. Note, that in general, we will want such additions for the + entire family, not just a single font, and that you'll have to keep + both Gnome and Jim Lyles, Vera's designer, happy! To make sense to add + glyphs to the font, they must be stylistically in keeping with Vera's + design. Vera cannot become a "ransom note" font. Jim Lyles will be + providing a document describing the design elements used in Vera, as a + guide and aid for people interested in contributing to Vera. + + 7. I want to sell a software package that uses these fonts: Can I do so? + + Sure. Bundle the fonts with your software and sell your software + with the fonts. That is the intent of the copyright. + + 8. If applications have built the names "Bitstream Vera" into them, + can I override this somehow to use fonts of my choosing? + + This depends on exact details of the software. Most open source + systems and software (e.g., Gnome, KDE, etc.) are now converting to + use fontconfig (see www.fontconfig.org) to handle font configuration, + selection and substitution; it has provisions for overriding font + names and subsituting alternatives. An example is provided by the + supplied local.conf file, which chooses the family Bitstream Vera for + "sans", "serif" and "monospace". Other software (e.g., the XFree86 + core server) has other mechanisms for font substitution. + diff --git a/vendor/plugins/rfpdf/lib/fonts/ttf-bitstream-vera-1.10/README.TXT b/vendor/plugins/rfpdf/lib/fonts/ttf-bitstream-vera-1.10/README.TXT new file mode 100755 index 00000000..e5c23ac6 --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/ttf-bitstream-vera-1.10/README.TXT @@ -0,0 +1,11 @@ +Contained herin is the Bitstream Vera font family. + +The Copyright information is found in the COPYRIGHT.TXT file (along +with being incoporated into the fonts themselves). + +The releases notes are found in the file "RELEASENOTES.TXT". + +We hope you enjoy Vera! + + Bitstream, Inc. + The Gnome Project diff --git a/vendor/plugins/rfpdf/lib/fonts/ttf-bitstream-vera-1.10/RELEASENOTES.TXT b/vendor/plugins/rfpdf/lib/fonts/ttf-bitstream-vera-1.10/RELEASENOTES.TXT new file mode 100755 index 00000000..38f9883f --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/ttf-bitstream-vera-1.10/RELEASENOTES.TXT @@ -0,0 +1,162 @@ +Bitstream Vera Fonts - April 16, 2003 +===================================== + +The version number of these fonts is 1.10 to distinguish them from the +beta test fonts. + +Note that the Vera copyright is incorporated in the fonts themselves. +The License field in the fonts contains the copyright license as it +appears below. The TrueType copyright field is not large enough to +contain the full license, so the license is incorporated (as you might +think if you thought about it) into the license field, which +unfortunately can be obscure to find. (In pfaedit, see: Element->Font +Info->TTFNames->License). + +Our apologies for it taking longer to complete the fonts than planned. +Beta testers requested a tighter line spacing (less leading) and Jim +Lyles redesigned Vera's accents to bring its line spacing to more +typical of other fonts. This took additional time and effort. Our +thanks to Jim for this effort above and beyond the call of duty. + +There are four monospace and sans faces (normal, oblique, bold, bold +oblique) and two serif faces (normal and bold). Fontconfig/Xft2 (see +www.fontconfig.org) can artificially oblique the serif faces for you: +this loses hinting and distorts the faces slightly, but is visibly +different than normal and bold, and reasonably pleasing. + +On systems with fontconfig 2.0 or 2.1 installed, making your sans, +serif and monospace fonts default to these fonts is very easy. Just +drop the file local.conf into your /etc/fonts directory. This will +make the Bitstream fonts your default fonts for all applications using +fontconfig (if sans, serif, or monospace names are used, as they often +are as default values in many desktops). The XML in local.conf may +need modification to enable subpixel decimation, if appropriate, +however, the commented out phrase does so for XFree86 4.3, in the case +that the server does not have sufficient information to identify the +use of a flat panel. Fontconfig 2.2 adds Vera to the list of font +families and will, by default use it as the default sans, serif and +monospace fonts. + +During the testing of the final Vera fonts, we learned that screen +fonts in general are only typically hinted to work correctly at +integer pixel sizes. Vera is coded internally for integer sizes only. +We need to investigate further to see if there are commonly used fonts +that are hinted to be rounded but are not rounded to integer sizes due +to oversights in their coding. + +Most fonts work best at 8 pixels and below if anti-aliased only, as +the amount of work required to hint well at smaller and smaller sizes +becomes astronomical. GASP tables are typically used to control +whether hinting is used or not, but Freetype/Xft does not currently +support GASP tables (which are present in Vera). + +To mitigate this problem, both for Vera and other fonts, there will be +(very shortly) a new fontconfig 2.2 release that will, by default not +apply hints if the size is below 8 pixels. if you should have a font +that in fact has been hinted more agressively, you can use fontconfig +to note this exception. We believe this should improve many hinted +fonts in addition to Vera, though implemeting GASP support is likely +the right long term solution. + +Font rendering in Gnome or KDE is the combination of algorithms in +Xft2 and Freetype, along with hinting in the fonts themselves. It is +vital to have sufficient information to disentangle problems that you +may observe. + +Note that having your font rendering system set up correctly is vital +to proper judgement of problems of the fonts: + + # Freetype may or may not be configured to in ways that may + implement execution of possibly patented (in some parts of the world) + TrueType hinting algorithms, particularly at small sizes. Best + results are obtained while using these algorithms. + + # The freetype autohinter (used when the possibly patented + algorithms are not used) continues to improve with each release. If + you are using the autohinter, please ensure you are using an up to + date version of freetype before reporting problems. + + # Please identify what version of freetype you are using in any + bug reports, and how your freetype is configured. + + # Make sure you are not using the freetype version included in + XFree86 4.3, as it has bugs that significantly degrade most fonts, + including Vera. if you build XFree86 4.3 from source yourself, you may + have installed this broken version without intending it (as I + did). Vera was verified with the recently released Freetype 2.1.4. On + many systems, 'ldd" can be used to see which freetype shared library + is actually being used. + + # Xft/X Render does not (yet) implement gamma correction. This + causes significant problems rendering white text on a black background + (causing partial pixels to be insufficiently shaded) if the gamma of + your monitor has not been compensated for, and minor problems with + black text on a while background. The program "xgamma" can be used to + set a gamma correction value in the X server's color pallette. Most + monitors have a gamma near 2. + + # Note that the Vera family uses minimal delta hinting. Your + results on other systems when not used anti-aliased may not be + entirely satisfying. We are primarily interested in reports of + problems on open source systems implementing Xft2/fontconfig/freetype + (which implements antialiasing and hinting adjustements, and + sophisticated subpixel decimation on flatpanels). Also, the + algorithms used by Xft2 adjust the hints to integer widths and the + results are crisper on open source systems than on Windows or + MacIntosh. + + # Your fontconfig may (probably does) predate the release of + fontconfig 2.2, and you may see artifacts not present when the font is + used at very small sizes with hinting enabled. "vc-list -V" can be + used to see what version you have installed. + +We believe and hope that these fonts will resolve the problems +reported during beta test. The largest change is the reduction of +leading (interline spacing), which had annoyed a number of people, and +reduced Vera's utility for some applcations. The Vera monospace font +should also now make '0' and 'O' and '1' and 'l' more clearly +distinguishable. + +The version of these fonts is version 1.10. Fontconfig should be +choosing the new version of the fonts if both the released fonts and +beta test fonts are installed (though please discard them: they have +names of form tt20[1-12]gn.ttf). Note that older versions of +fontconfig sometimes did not rebuild their cache correctly when new +fonts are installed: please upgrade to fontconfig 2.2. "fc-cache -f" +can be used to force rebuilding fontconfig's cache files. + +If you note problems, please send them to fonts at gnome dot org, with +exactly which face and size and unicode point you observe the problem +at. The xfd utility from XFree86 CVS may be useful for this (e.g. "xfd +-fa sans"). A possibly more useful program to examine fonts at a +variety of sizes is the "waterfall" program found in Keith Packard's +CVS. + + $ cvs -d :pserver:anoncvs@keithp.com:/local/src/CVS login + Logging in to :pserver:anoncvs@keithp.com:2401/local/src/CVS + CVS password: + $ cvs -d :pserver:anoncvs@keithp.com:/local/src/CVS co waterfall + $ cd waterfall + $ xmkmf -a + $ make + # make install + # make install.man + +Again, please make sure you are running an up-to-date freetype, and +that you are only examining integer sizes. + +Reporting Problems +================== + +Please send problem reports to fonts at gnome org, with the following +information: + + 1. Version of Freetype, Xft2 and fontconfig + 2. Whether TT hinting is being used, or the autohinter + 3. Application being used + 4. Character/Unicode code point that has problems (if applicable) + 5. Version of which operating system + 6. Please include a screenshot, when possible. + +Please check the fonts list archives before reporting problems to cut +down on duplication. diff --git a/vendor/plugins/rfpdf/lib/fonts/ttf-bitstream-vera-1.10/local.conf b/vendor/plugins/rfpdf/lib/fonts/ttf-bitstream-vera-1.10/local.conf new file mode 100755 index 00000000..ad550207 --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/ttf-bitstream-vera-1.10/local.conf @@ -0,0 +1,32 @@ + + + + + + + serif + + Bitstream Vera Serif + + + + sans-serif + + Bitstream Vera Sans + + + + monospace + + Bitstream Vera Sans Mono + + + diff --git a/vendor/plugins/rfpdf/lib/fonts/ttf2ufm/README.TXT b/vendor/plugins/rfpdf/lib/fonts/ttf2ufm/README.TXT new file mode 100755 index 00000000..9b164ad4 --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/ttf2ufm/README.TXT @@ -0,0 +1,30 @@ +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 or makefontuni.rb. + + +Setting up a Truetype font for usage with UFPDF: + 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_ruby.php with the .ttf and .ufm filenames as argument: + $ php -q makefontuni_ruby.php myfont.ttf myfont.ufm + + 3) Copy the resulting .rb, .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.rb for bold variation + [basic-font-name]i.rb for oblique variation + [basic-font-name]bi.rb for bold oblique variation + + 5) Rename the name of the font in the first line of each .rb file: + TCPDFFontDescriptor.define('dtlargotitalic') do |font| + becomes: + TCPDFFontDescriptor.define('dtlargoti') do |font| diff --git a/vendor/plugins/rfpdf/lib/fonts/ttf2ufm/makefontuni_ruby.php b/vendor/plugins/rfpdf/lib/fonts/ttf2ufm/makefontuni_ruby.php new file mode 100755 index 00000000..23c90a37 --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/ttf2ufm/makefontuni_ruby.php @@ -0,0 +1,313 @@ += 0 && $cc < 0xFFFF && $glyph) { + $cidtogidmap{$cc*2} = chr($glyph >> 8); + $cidtogidmap{$cc*2 + 1} = chr($glyph & 0xFF); + } + } + if($gn=='.notdef' && !isset($fm['MissingWidth'])) + $fm['MissingWidth']=$w; + } + elseif($code=='FontName') + $fm['FontName']=$param; + elseif($code=='Weight') + $fm['Weight']=$param; + elseif($code=='ItalicAngle') + $fm['ItalicAngle']=(double)$param; + elseif($code=='Ascender') + $fm['Ascender']=(int)$param; + elseif($code=='Descender') + $fm['Descender']=(int)$param; + elseif($code=='UnderlineThickness') + $fm['UnderlineThickness']=(int)$param; + elseif($code=='UnderlinePosition') + $fm['UnderlinePosition']=(int)$param; + elseif($code=='IsFixedPitch') + $fm['IsFixedPitch']=($param=='true'); + elseif($code=='FontBBox') + $fm['FontBBox']=array($e[1],$e[2],$e[3],$e[4]); + elseif($code=='CapHeight') + $fm['CapHeight']=(int)$param; + elseif($code=='StdVW') + $fm['StdVW']=(int)$param; + } + if(!isset($fm['MissingWidth'])) + $fm['MissingWidth']=600; + + if(!isset($fm['FontName'])) + die('FontName not found'); + + $fm['Widths']=$widths; + + return $fm; +} + +function MakeFontDescriptor($fm) +{ + //Ascent + $asc=(isset($fm['Ascender']) ? $fm['Ascender'] : 1000); + $fd="{'Ascent'=>".$asc; + //Descent + $desc=(isset($fm['Descender']) ? $fm['Descender'] : -200); + $fd.=",'Descent'=>".$desc; + //CapHeight + if(isset($fm['CapHeight'])) + $ch=$fm['CapHeight']; + elseif(isset($fm['CapXHeight'])) + $ch=$fm['CapXHeight']; + else + $ch=$asc; + $fd.=",'CapHeight'=>".$ch; + //Flags + $flags=0; + if(isset($fm['IsFixedPitch']) and $fm['IsFixedPitch']) + $flags+=1<<0; + $flags+=1<<5; + if(isset($fm['ItalicAngle']) and $fm['ItalicAngle']!=0) + $flags+=1<<6; + $fd.=",'Flags'=>".$flags; + //FontBBox + if(isset($fm['FontBBox'])) + $fbb=$fm['FontBBox']; + else + $fbb=array(0,$des-100,1000,$asc+100); + $fd.=",'FontBBox'=>'[".$fbb[0].' '.$fbb[1].' '.$fbb[2].' '.$fbb[3]."]'"; + //ItalicAngle + $ia=(isset($fm['ItalicAngle']) ? $fm['ItalicAngle'] : 0); + $fd.=",'ItalicAngle'=>".$ia; + //StemV + if(isset($fm['StdVW'])) + $stemv=$fm['StdVW']; + elseif(isset($fm['Weight']) and eregi('(bold|black)',$fm['Weight'])) + $stemv=120; + else + $stemv=70; + $fd.=",'StemV'=>".$stemv; + //MissingWidth + if(isset($fm['MissingWidth'])) + $fd.=",'MissingWidth'=>".$fm['MissingWidth']; + $fd.='}'; + return $fd; +} + +function MakeWidthArray($fm) +{ + //Make character width array + $s="{"; + $cw=$fm['Widths']; + $els=array(); + $c=0; + foreach ($cw as $i => $w) + { + $els[] = ((($c++)%16==0)?"\n\t":'').$i.'=>'.$w; + } + $s .= implode(', ', $els); + $s.='}'; + return $s; +} + +function SaveToFile($file,$s,$mode='t') +{ + $f=fopen($file,'w'.$mode); + if(!$f) + die('Can\'t write to file '.$file); + fwrite($f,$s,strlen($s)); + fclose($f); +} + +function ReadShort($f) +{ + $a=unpack('n1n',fread($f,2)); + return $a['n']; +} + +function ReadLong($f) +{ + $a=unpack('N1N',fread($f,4)); + return $a['N']; +} + +function CheckTTF($file) +{ + //Check if font license allows embedding + $f=fopen($file,'rb'); + if(!$f) + die('Error: Can\'t open '.$file); + //Extract number of tables + fseek($f,4,SEEK_CUR); + $nb=ReadShort($f); + fseek($f,6,SEEK_CUR); + //Seek OS/2 table + $found=false; + for($i=0;$i<$nb;$i++) + { + if(fread($f,4)=='OS/2') + { + $found=true; + break; + } + fseek($f,12,SEEK_CUR); + } + if(!$found) + { + fclose($f); + return; + } + fseek($f,4,SEEK_CUR); + $offset=ReadLong($f); + fseek($f,$offset,SEEK_SET); + //Extract fsType flags + fseek($f,8,SEEK_CUR); + $fsType=ReadShort($f); + $rl=($fsType & 0x02)!=0; + $pp=($fsType & 0x04)!=0; + $e=($fsType & 0x08)!=0; + fclose($f); + if($rl and !$pp and !$e) + echo 'Warning: font license does not allow embedding'; +} + +/******************************************************************************* +* $fontfile: path to TTF file (or empty string if not to be embedded) * +* $ufmfile: path to UFM file * +*******************************************************************************/ +function MakeFont($fontfile,$ufmfile) +{ + //Generate a font definition file + set_magic_quotes_runtime(0); + if(!file_exists($ufmfile)) + die('Error: UFM file not found: '.$ufmfile); + $cidtogidmap = ''; + $fm=ReadUFM($ufmfile, $cidtogidmap); + $fd=MakeFontDescriptor($fm); + //Find font type + if($fontfile) + { + $ext=strtolower(substr($fontfile,-3)); + if($ext=='ttf') + $type='TrueTypeUnicode'; + else + die('Error: not a truetype font: '.$ext); + } + else + { + if($type!='TrueTypeUnicode') + die('Error: incorrect font type: '.$type); + } + //Start generation + $basename=strtolower(substr(basename($ufmfile),0,-4)); + $s='TCPDFFontDescriptor.define(\''.$basename."') do |font|\n"; + $s.=" font[:type]='".$type."'\n"; + $s.=" font[:name]='".$fm['FontName']."'\n"; + $s.=" font[:desc]=".$fd."\n"; + if(!isset($fm['UnderlinePosition'])) + $fm['UnderlinePosition']=-100; + if(!isset($fm['UnderlineThickness'])) + $fm['UnderlineThickness']=50; + $s.=" font[:up]=".$fm['UnderlinePosition']."\n"; + $s.=" font[:ut]=".$fm['UnderlineThickness']."\n"; + $s.=" font[:cw]=".MakeWidthArray($fm)."\n"; + $s.=" font[:enc]=''\n"; + $s.=" font[:diff]=''\n"; + if($fontfile) + { + //Embedded font + if(!file_exists($fontfile)) + die('Error: font file not found: '.$fontfile); + CheckTTF($fontfile); + $f=fopen($fontfile,'rb'); + if(!$f) + die('Error: Can\'t open '.$fontfile); + $file=fread($f,filesize($fontfile)); + fclose($f); + if(function_exists('gzcompress')) + { + $cmp=$basename.'.z'; + SaveToFile($cmp,gzcompress($file),'b'); + $s.=' font[:file]=\''.$cmp."'\n"; + echo 'Font file compressed ('.$cmp.')
    '; + + $cmp=$basename.'.ctg.z'; + SaveToFile($cmp,gzcompress($cidtogidmap),'b'); + echo 'CIDToGIDMap created and compressed ('.$cmp.')
    '; + $s.=' font[:ctg]=\''.$cmp."'\n"; + } + else + { + $s.='$file=\''.basename($fontfile)."'\n"; + echo 'Notice: font file could not be compressed (gzcompress not available)
    '; + + $cmp=$basename.'.ctg'; + $f = fopen($cmp, 'wb'); + fwrite($f, $cidtogidmap); + fclose($f); + echo 'CIDToGIDMap created ('.$cmp.')
    '; + $s.=' font[:ctg]=\''.$cmp."'\n"; + } + if($type=='Type1') + { + $s.=' font[:size1]='.$size1."\n"; + $s.=' font[:size2]='.$size2."\n"; + } + else + $s.=' font[:originalsize]='.filesize($fontfile)."\n"; + } + else + { + //Not embedded font + $s.=' font[:file]='."''\n"; + } + $s.="end\n"; + SaveToFile($basename.'.rb',$s); + echo 'Font definition file generated ('.$basename.'.rb'.')
    '; +} + +$arg = $GLOBALS['argv']; +if (count($arg) >= 3) { + ob_start(); + array_shift($arg); + MakeFont($arg[0], $arg[1]); + $t = ob_get_clean(); + print preg_replace('!!i', "\n", $t); +} +else { + print "Usage: makefontuni_ruby.php \n"; +} +?> \ No newline at end of file diff --git a/vendor/plugins/rfpdf/lib/fonts/ttf2ufm/ttf2ufm b/vendor/plugins/rfpdf/lib/fonts/ttf2ufm/ttf2ufm new file mode 100755 index 00000000..26ecadef Binary files /dev/null and b/vendor/plugins/rfpdf/lib/fonts/ttf2ufm/ttf2ufm differ diff --git a/vendor/plugins/rfpdf/lib/fonts/ttf2ufm/ttf2ufm.exe b/vendor/plugins/rfpdf/lib/fonts/ttf2ufm/ttf2ufm.exe new file mode 100755 index 00000000..9109d5b2 Binary files /dev/null and b/vendor/plugins/rfpdf/lib/fonts/ttf2ufm/ttf2ufm.exe differ diff --git a/vendor/plugins/rfpdf/lib/fonts/vera.ctg.z b/vendor/plugins/rfpdf/lib/fonts/vera.ctg.z new file mode 100755 index 00000000..904f8fae Binary files /dev/null and b/vendor/plugins/rfpdf/lib/fonts/vera.ctg.z differ diff --git a/vendor/plugins/rfpdf/lib/fonts/vera.rb b/vendor/plugins/rfpdf/lib/fonts/vera.rb new file mode 100755 index 00000000..2c56539c --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/vera.rb @@ -0,0 +1,30 @@ +TCPDFFontDescriptor.define('vera') do |font| + font[:type]='TrueTypeUnicode'; + font[:name]='BitstreamVeraSans-Roman'; + font[:desc]={'Ascent'=>928,'Descent'=>-236,'CapHeight'=>928,'Flags'=>32,'FontBBox'=>'[-183 -236 1287 928]','ItalicAngle'=>0,'StemV'=>70,'MissingWidth'=>600} + font[:up]=-104; + font[:ut]=70; + font[:cw]={ + 270=>600, 32=>318, 33=>401, 34=>460, 35=>838, 36=>636, 37=>950, 38=>780, 39=>275, 40=>390, 41=>390, 42=>500, 43=>838, 44=>318, 45=>361, 46=>318, + 47=>337, 48=>636, 49=>636, 50=>636, 51=>636, 52=>636, 53=>636, 54=>636, 55=>636, 56=>636, 57=>636, 58=>337, 59=>337, 60=>838, 61=>838, 62=>838, + 63=>531, 64=>1000, 65=>684, 66=>686, 67=>698, 68=>770, 69=>632, 70=>575, 71=>775, 72=>752, 73=>295, 74=>295, 75=>656, 76=>557, 77=>863, 78=>748, + 79=>787, 80=>603, 81=>787, 82=>695, 83=>635, 84=>611, 85=>732, 86=>684, 87=>989, 88=>685, 89=>611, 90=>685, 91=>390, 92=>337, 93=>390, 94=>838, + 95=>500, 96=>500, 97=>613, 98=>635, 99=>550, 100=>635, 101=>615, 102=>352, 103=>635, 104=>634, 105=>278, 106=>278, 107=>579, 108=>278, 109=>974, 110=>634, + 111=>612, 112=>635, 113=>635, 114=>411, 115=>521, 116=>392, 117=>634, 118=>592, 119=>818, 120=>592, 121=>592, 122=>525, 123=>636, 124=>337, 125=>636, 126=>838, + 8364=>636, 8218=>318, 402=>636, 8222=>518, 8230=>1000, 8224=>500, 8225=>500, 710=>500, 8240=>1342, 352=>635, 8249=>400, 338=>1070, 381=>685, 8216=>318, 8217=>318, 8220=>518, + 8221=>518, 8226=>590, 8211=>500, 8212=>1000, 732=>500, 8482=>1000, 353=>521, 8250=>400, 339=>1023, 382=>525, 376=>611, 160=>636, 161=>401, 162=>636, 163=>636, 164=>636, + 165=>636, 166=>337, 167=>500, 168=>500, 169=>1000, 170=>471, 171=>612, 172=>838, 173=>361, 174=>1000, 175=>500, 176=>500, 177=>838, 178=>401, 179=>401, 180=>500, + 181=>636, 182=>636, 183=>318, 184=>500, 185=>401, 186=>471, 187=>612, 188=>969, 189=>969, 190=>969, 191=>531, 192=>684, 193=>684, 194=>684, 195=>684, 196=>684, + 197=>684, 198=>974, 199=>698, 200=>632, 201=>632, 202=>632, 203=>632, 204=>295, 205=>295, 206=>295, 207=>295, 208=>775, 209=>748, 210=>787, 211=>787, 212=>787, + 213=>787, 214=>787, 215=>838, 216=>787, 217=>732, 218=>732, 219=>732, 220=>732, 221=>611, 222=>605, 223=>630, 224=>613, 225=>613, 226=>613, 227=>613, 228=>613, + 229=>613, 230=>982, 231=>550, 232=>615, 233=>615, 234=>615, 235=>615, 236=>278, 237=>278, 238=>278, 239=>278, 240=>612, 241=>634, 242=>612, 243=>612, 244=>612, + 245=>612, 246=>612, 247=>838, 248=>612, 249=>634, 250=>634, 251=>634, 252=>634, 253=>592, 254=>635, 255=>592, 8800=>838, 8734=>833, 8804=>838, 8805=>838, 8706=>517, + 8721=>674, 8719=>757, 960=>589, 8747=>521, 937=>764, 8730=>637, 8776=>838, 8710=>669, 9674=>494, 8725=>167, 64257=>630, 64258=>630, 305=>278, 728=>500, 729=>500, 730=>500, + 733=>500, 731=>500, 711=>500, 321=>562, 322=>284, 8722=>838, 286=>775, 287=>635, 304=>295, 350=>635, 351=>521, 262=>698, 263=>550, 268=>698, 269=>550, 273=>635, + 8729=>318} + font[:enc]=''; + font[:diff]=''; + font[:file]='vera.z'; + font[:ctg]='vera.ctg.z'; + font[:originalsize]=65932; +end \ No newline at end of file diff --git a/vendor/plugins/rfpdf/lib/fonts/vera.z b/vendor/plugins/rfpdf/lib/fonts/vera.z new file mode 100755 index 00000000..dc32a237 Binary files /dev/null and b/vendor/plugins/rfpdf/lib/fonts/vera.z differ diff --git a/vendor/plugins/rfpdf/lib/fonts/verab.ctg.z b/vendor/plugins/rfpdf/lib/fonts/verab.ctg.z new file mode 100755 index 00000000..904f8fae Binary files /dev/null and b/vendor/plugins/rfpdf/lib/fonts/verab.ctg.z differ diff --git a/vendor/plugins/rfpdf/lib/fonts/verab.rb b/vendor/plugins/rfpdf/lib/fonts/verab.rb new file mode 100755 index 00000000..b82b19ed --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/verab.rb @@ -0,0 +1,30 @@ +TCPDFFontDescriptor.define('verab') do |font| + font[:type]='TrueTypeUnicode'; + font[:name]='BitstreamVeraSans-Bold'; + font[:desc]={'Ascent'=>928,'Descent'=>-236,'CapHeight'=>928,'Flags'=>32,'FontBBox'=>'[-199 -236 1417 928]','ItalicAngle'=>0,'StemV'=>120,'MissingWidth'=>600} + font[:up]=-111; + font[:ut]=126; + font[:cw]={ + 270=>600, 32=>348, 33=>456, 34=>521, 35=>838, 36=>696, 37=>1002, 38=>872, 39=>306, 40=>457, 41=>457, 42=>523, 43=>838, 44=>380, 45=>415, 46=>380, + 47=>365, 48=>696, 49=>696, 50=>696, 51=>696, 52=>696, 53=>696, 54=>696, 55=>696, 56=>696, 57=>696, 58=>400, 59=>400, 60=>838, 61=>838, 62=>838, + 63=>580, 64=>1000, 65=>774, 66=>762, 67=>734, 68=>830, 69=>683, 70=>683, 71=>821, 72=>837, 73=>372, 74=>372, 75=>775, 76=>637, 77=>995, 78=>837, + 79=>850, 80=>733, 81=>850, 82=>770, 83=>720, 84=>682, 85=>812, 86=>774, 87=>1103, 88=>771, 89=>724, 90=>725, 91=>457, 92=>365, 93=>457, 94=>838, + 95=>500, 96=>500, 97=>675, 98=>716, 99=>593, 100=>716, 101=>678, 102=>435, 103=>716, 104=>712, 105=>343, 106=>343, 107=>665, 108=>343, 109=>1042, 110=>712, + 111=>687, 112=>716, 113=>716, 114=>493, 115=>595, 116=>478, 117=>712, 118=>652, 119=>924, 120=>645, 121=>652, 122=>582, 123=>712, 124=>365, 125=>712, 126=>838, + 8364=>696, 8218=>380, 402=>696, 8222=>657, 8230=>1000, 8224=>500, 8225=>500, 710=>500, 8240=>1440, 352=>720, 8249=>412, 338=>1167, 381=>725, 8216=>380, 8217=>380, 8220=>657, + 8221=>657, 8226=>639, 8211=>500, 8212=>1000, 732=>500, 8482=>1000, 353=>595, 8250=>412, 339=>1094, 382=>582, 376=>724, 160=>696, 161=>456, 162=>696, 163=>696, 164=>636, + 165=>696, 166=>365, 167=>500, 168=>500, 169=>1000, 170=>564, 171=>646, 172=>838, 173=>415, 174=>1000, 175=>500, 176=>500, 177=>838, 178=>438, 179=>438, 180=>500, + 181=>736, 182=>636, 183=>380, 184=>500, 185=>438, 186=>564, 187=>646, 188=>1035, 189=>1035, 190=>1035, 191=>580, 192=>774, 193=>774, 194=>774, 195=>774, 196=>774, + 197=>774, 198=>1085, 199=>734, 200=>683, 201=>683, 202=>683, 203=>683, 204=>372, 205=>372, 206=>372, 207=>372, 208=>838, 209=>837, 210=>850, 211=>850, 212=>850, + 213=>850, 214=>850, 215=>838, 216=>850, 217=>812, 218=>812, 219=>812, 220=>812, 221=>724, 222=>738, 223=>719, 224=>675, 225=>675, 226=>675, 227=>675, 228=>675, + 229=>675, 230=>1048, 231=>593, 232=>678, 233=>678, 234=>678, 235=>678, 236=>343, 237=>343, 238=>343, 239=>343, 240=>687, 241=>712, 242=>687, 243=>687, 244=>687, + 245=>687, 246=>687, 247=>838, 248=>687, 249=>712, 250=>712, 251=>712, 252=>712, 253=>652, 254=>716, 255=>652, 8800=>838, 8734=>833, 8804=>838, 8805=>838, 8706=>544, + 8721=>718, 8719=>787, 960=>644, 8747=>610, 937=>769, 8730=>667, 8776=>838, 8710=>697, 9674=>494, 8725=>167, 64257=>741, 64258=>741, 305=>343, 728=>500, 729=>500, 730=>500, + 733=>500, 731=>500, 711=>500, 321=>642, 322=>371, 8722=>838, 286=>821, 287=>716, 304=>372, 350=>720, 351=>595, 262=>734, 263=>593, 268=>734, 269=>593, 273=>716, + 8729=>380} + font[:enc]=''; + font[:diff]=''; + font[:file]='verab.z'; + font[:ctg]='verab.ctg.z'; + font[:originalsize]=58716; +end \ No newline at end of file diff --git a/vendor/plugins/rfpdf/lib/fonts/verab.z b/vendor/plugins/rfpdf/lib/fonts/verab.z new file mode 100755 index 00000000..f5fa4d0a Binary files /dev/null and b/vendor/plugins/rfpdf/lib/fonts/verab.z differ diff --git a/vendor/plugins/rfpdf/lib/fonts/verabi.ctg.z b/vendor/plugins/rfpdf/lib/fonts/verabi.ctg.z new file mode 100755 index 00000000..904f8fae Binary files /dev/null and b/vendor/plugins/rfpdf/lib/fonts/verabi.ctg.z differ diff --git a/vendor/plugins/rfpdf/lib/fonts/verabi.rb b/vendor/plugins/rfpdf/lib/fonts/verabi.rb new file mode 100755 index 00000000..722a1a16 --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/verabi.rb @@ -0,0 +1,30 @@ +TCPDFFontDescriptor.define('verabi') do |font| + font[:type]='TrueTypeUnicode'; + font[:name]='BitstreamVeraSans-BoldOblique'; + font[:desc]={'Ascent'=>928,'Descent'=>-236,'CapHeight'=>928,'Flags'=>96,'FontBBox'=>'[-278 -236 1401 928]','ItalicAngle'=>-11,'StemV'=>120,'MissingWidth'=>600} + font[:up]=-111; + font[:ut]=126; + font[:cw]={ + 270=>600, 32=>348, 33=>456, 34=>521, 35=>696, 36=>696, 37=>1002, 38=>872, 39=>306, 40=>457, 41=>457, 42=>523, 43=>838, 44=>380, 45=>415, 46=>380, + 47=>365, 48=>696, 49=>696, 50=>696, 51=>696, 52=>696, 53=>696, 54=>696, 55=>696, 56=>696, 57=>696, 58=>400, 59=>400, 60=>838, 61=>838, 62=>838, + 63=>580, 64=>1000, 65=>774, 66=>762, 67=>734, 68=>830, 69=>683, 70=>683, 71=>821, 72=>837, 73=>372, 74=>372, 75=>775, 76=>637, 77=>995, 78=>837, + 79=>850, 80=>733, 81=>850, 82=>770, 83=>720, 84=>682, 85=>812, 86=>774, 87=>1103, 88=>771, 89=>724, 90=>725, 91=>457, 92=>365, 93=>457, 94=>838, + 95=>500, 96=>500, 97=>675, 98=>716, 99=>593, 100=>716, 101=>678, 102=>435, 103=>716, 104=>712, 105=>343, 106=>343, 107=>665, 108=>343, 109=>1042, 110=>712, + 111=>687, 112=>716, 113=>716, 114=>493, 115=>595, 116=>478, 117=>712, 118=>652, 119=>924, 120=>645, 121=>652, 122=>582, 123=>712, 124=>365, 125=>712, 126=>838, + 8364=>696, 8218=>380, 402=>696, 8222=>644, 8230=>1000, 8224=>500, 8225=>500, 710=>500, 8240=>1454, 352=>720, 8249=>412, 338=>1167, 381=>725, 8216=>380, 8217=>380, 8220=>644, + 8221=>644, 8226=>639, 8211=>500, 8212=>1000, 732=>500, 8482=>1000, 353=>595, 8250=>412, 339=>1094, 382=>582, 376=>724, 160=>696, 161=>456, 162=>696, 163=>696, 164=>636, + 165=>696, 166=>365, 167=>500, 168=>500, 169=>1000, 170=>564, 171=>650, 172=>838, 173=>415, 174=>1000, 175=>500, 176=>500, 177=>838, 178=>438, 179=>438, 180=>500, + 181=>736, 182=>636, 183=>380, 184=>500, 185=>438, 186=>564, 187=>650, 188=>1065, 189=>1065, 190=>1065, 191=>580, 192=>774, 193=>774, 194=>774, 195=>774, 196=>774, + 197=>774, 198=>1085, 199=>734, 200=>683, 201=>683, 202=>683, 203=>683, 204=>372, 205=>372, 206=>372, 207=>372, 208=>845, 209=>837, 210=>850, 211=>850, 212=>850, + 213=>850, 214=>850, 215=>838, 216=>850, 217=>812, 218=>812, 219=>812, 220=>812, 221=>724, 222=>742, 223=>719, 224=>675, 225=>675, 226=>675, 227=>675, 228=>675, + 229=>675, 230=>1048, 231=>593, 232=>678, 233=>678, 234=>678, 235=>678, 236=>343, 237=>343, 238=>343, 239=>343, 240=>687, 241=>712, 242=>687, 243=>687, 244=>687, + 245=>687, 246=>687, 247=>838, 248=>687, 249=>712, 250=>712, 251=>712, 252=>712, 253=>652, 254=>716, 255=>652, 8800=>838, 8734=>833, 8804=>838, 8805=>838, 8706=>544, + 8721=>718, 8719=>787, 960=>644, 8747=>610, 937=>769, 8730=>667, 8776=>838, 8710=>697, 9674=>494, 8725=>167, 64257=>787, 64258=>787, 305=>343, 728=>500, 729=>500, 730=>500, + 733=>500, 731=>500, 711=>500, 321=>660, 322=>375, 8722=>838, 286=>821, 287=>716, 304=>372, 350=>720, 351=>595, 262=>734, 263=>593, 268=>734, 269=>593, 273=>716, + 8729=>380} + font[:enc]=''; + font[:diff]=''; + font[:file]='verabi.z'; + font[:ctg]='verabi.ctg.z'; + font[:originalsize]=63208; +end \ No newline at end of file diff --git a/vendor/plugins/rfpdf/lib/fonts/verabi.z b/vendor/plugins/rfpdf/lib/fonts/verabi.z new file mode 100755 index 00000000..2ee4581d Binary files /dev/null and b/vendor/plugins/rfpdf/lib/fonts/verabi.z differ diff --git a/vendor/plugins/rfpdf/lib/fonts/verai.ctg.z b/vendor/plugins/rfpdf/lib/fonts/verai.ctg.z new file mode 100755 index 00000000..904f8fae Binary files /dev/null and b/vendor/plugins/rfpdf/lib/fonts/verai.ctg.z differ diff --git a/vendor/plugins/rfpdf/lib/fonts/verai.rb b/vendor/plugins/rfpdf/lib/fonts/verai.rb new file mode 100755 index 00000000..7c372ac0 --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/verai.rb @@ -0,0 +1,30 @@ +TCPDFFontDescriptor.define('verai') do |font| + font[:type]='TrueTypeUnicode'; + font[:name]='BitstreamVeraSans-Oblique'; + font[:desc]={'Ascent'=>928,'Descent'=>-236,'CapHeight'=>928,'Flags'=>96,'FontBBox'=>'[-262 -236 1259 928]','ItalicAngle'=>-11,'StemV'=>70,'MissingWidth'=>600} + font[:up]=-104; + font[:ut]=70; + font[:cw]={ + 270=>600, 32=>318, 33=>401, 34=>460, 35=>838, 36=>636, 37=>950, 38=>780, 39=>275, 40=>390, 41=>390, 42=>500, 43=>838, 44=>318, 45=>361, 46=>318, + 47=>337, 48=>636, 49=>636, 50=>636, 51=>636, 52=>636, 53=>636, 54=>636, 55=>636, 56=>636, 57=>636, 58=>337, 59=>337, 60=>838, 61=>838, 62=>838, + 63=>531, 64=>1000, 65=>684, 66=>686, 67=>698, 68=>770, 69=>632, 70=>575, 71=>775, 72=>752, 73=>295, 74=>295, 75=>656, 76=>557, 77=>863, 78=>748, + 79=>787, 80=>603, 81=>787, 82=>695, 83=>635, 84=>611, 85=>732, 86=>684, 87=>989, 88=>685, 89=>611, 90=>685, 91=>390, 92=>337, 93=>390, 94=>838, + 95=>500, 96=>500, 97=>613, 98=>635, 99=>550, 100=>635, 101=>615, 102=>352, 103=>635, 104=>634, 105=>278, 106=>278, 107=>579, 108=>278, 109=>974, 110=>634, + 111=>612, 112=>635, 113=>635, 114=>411, 115=>521, 116=>392, 117=>634, 118=>592, 119=>818, 120=>592, 121=>592, 122=>525, 123=>636, 124=>337, 125=>636, 126=>838, + 8364=>636, 8218=>318, 402=>636, 8222=>518, 8230=>1000, 8224=>500, 8225=>500, 710=>500, 8240=>1350, 352=>635, 8249=>400, 338=>1070, 381=>685, 8216=>318, 8217=>318, 8220=>518, + 8221=>518, 8226=>590, 8211=>500, 8212=>1000, 732=>500, 8482=>1000, 353=>521, 8250=>400, 339=>1028, 382=>525, 376=>611, 160=>636, 161=>401, 162=>636, 163=>636, 164=>636, + 165=>636, 166=>337, 167=>500, 168=>500, 169=>1000, 170=>471, 171=>617, 172=>838, 173=>361, 174=>1000, 175=>500, 176=>500, 177=>838, 178=>401, 179=>401, 180=>500, + 181=>636, 182=>636, 183=>318, 184=>500, 185=>401, 186=>471, 187=>617, 188=>969, 189=>969, 190=>969, 191=>531, 192=>684, 193=>684, 194=>684, 195=>684, 196=>684, + 197=>684, 198=>974, 199=>698, 200=>632, 201=>632, 202=>632, 203=>632, 204=>295, 205=>295, 206=>295, 207=>295, 208=>775, 209=>748, 210=>787, 211=>787, 212=>787, + 213=>787, 214=>787, 215=>838, 216=>787, 217=>732, 218=>732, 219=>732, 220=>732, 221=>611, 222=>608, 223=>630, 224=>613, 225=>613, 226=>613, 227=>613, 228=>613, + 229=>613, 230=>995, 231=>550, 232=>615, 233=>615, 234=>615, 235=>615, 236=>278, 237=>278, 238=>278, 239=>278, 240=>612, 241=>634, 242=>612, 243=>612, 244=>612, + 245=>612, 246=>612, 247=>838, 248=>612, 249=>634, 250=>634, 251=>634, 252=>634, 253=>592, 254=>635, 255=>592, 8800=>838, 8734=>833, 8804=>838, 8805=>838, 8706=>517, + 8721=>674, 8719=>757, 960=>589, 8747=>521, 937=>764, 8730=>637, 8776=>838, 8710=>669, 9674=>494, 8725=>167, 64257=>646, 64258=>646, 305=>278, 728=>500, 729=>500, 730=>500, + 733=>500, 731=>500, 711=>500, 321=>562, 322=>287, 8722=>838, 286=>775, 287=>635, 304=>295, 350=>635, 351=>521, 262=>698, 263=>550, 268=>698, 269=>550, 273=>635, + 8729=>318} + font[:enc]=''; + font[:diff]=''; + font[:file]='verai.z'; + font[:ctg]='verai.ctg.z'; + font[:originalsize]=63684; +end \ No newline at end of file diff --git a/vendor/plugins/rfpdf/lib/fonts/verai.z b/vendor/plugins/rfpdf/lib/fonts/verai.z new file mode 100755 index 00000000..b1721970 Binary files /dev/null and b/vendor/plugins/rfpdf/lib/fonts/verai.z differ diff --git a/vendor/plugins/rfpdf/lib/fonts/veramo.ctg.z b/vendor/plugins/rfpdf/lib/fonts/veramo.ctg.z new file mode 100755 index 00000000..904f8fae Binary files /dev/null and b/vendor/plugins/rfpdf/lib/fonts/veramo.ctg.z differ diff --git a/vendor/plugins/rfpdf/lib/fonts/veramo.rb b/vendor/plugins/rfpdf/lib/fonts/veramo.rb new file mode 100755 index 00000000..e4667e4d --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/veramo.rb @@ -0,0 +1,30 @@ +TCPDFFontDescriptor.define('veramo') do |font| + font[:type]='TrueTypeUnicode'; + font[:name]='BitstreamVeraSansMono-Roman'; + font[:desc]={'Ascent'=>928,'Descent'=>-236,'CapHeight'=>928,'Flags'=>33,'FontBBox'=>'[-5 -236 606 font[:928]]','ItalicAngle'=>0,'StemV'=>70,'MissingWidth'=>602} + font[:up]=-104; + font[:ut]=69; + font[:cw]={ + 270=>602, 32=>602, 33=>602, 34=>602, 35=>602, 36=>602, 37=>602, 38=>602, 39=>602, 40=>602, 41=>602, 42=>602, 43=>602, 44=>602, 45=>602, 46=>602, + 47=>602, 48=>602, 49=>602, 50=>602, 51=>602, 52=>602, 53=>602, 54=>602, 55=>602, 56=>602, 57=>602, 58=>602, 59=>602, 60=>602, 61=>602, 62=>602, + 63=>602, 64=>602, 65=>602, 66=>602, 67=>602, 68=>602, 69=>602, 70=>602, 71=>602, 72=>602, 73=>602, 74=>602, 75=>602, 76=>602, 77=>602, 78=>602, + 79=>602, 80=>602, 81=>602, 82=>602, 83=>602, 84=>602, 85=>602, 86=>602, 87=>602, 88=>602, 89=>602, 90=>602, 91=>602, 92=>602, 93=>602, 94=>602, + 95=>602, 96=>602, 97=>602, 98=>602, 99=>602, 100=>602, 101=>602, 102=>602, 103=>602, 104=>602, 105=>602, 106=>602, 107=>602, 108=>602, 109=>602, 110=>602, + 111=>602, 112=>602, 113=>602, 114=>602, 115=>602, 116=>602, 117=>602, 118=>602, 119=>602, 120=>602, 121=>602, 122=>602, 123=>602, 124=>602, 125=>602, 126=>602, + 8364=>602, 8218=>602, 402=>602, 8222=>602, 8230=>602, 8224=>602, 8225=>602, 710=>602, 8240=>602, 352=>602, 8249=>602, 338=>602, 381=>602, 8216=>602, 8217=>602, 8220=>602, + 8221=>602, 8226=>602, 8211=>602, 8212=>602, 732=>602, 8482=>602, 353=>602, 8250=>602, 339=>602, 382=>602, 376=>602, 160=>602, 161=>602, 162=>602, 163=>602, 164=>602, + 165=>602, 166=>602, 167=>602, 168=>602, 169=>602, 170=>602, 171=>602, 172=>602, 173=>602, 174=>602, 175=>602, 176=>602, 177=>602, 178=>602, 179=>602, 180=>602, + 181=>602, 182=>602, 183=>602, 184=>602, 185=>602, 186=>602, 187=>602, 188=>602, 189=>602, 190=>602, 191=>602, 192=>602, 193=>602, 194=>602, 195=>602, 196=>602, + 197=>602, 198=>602, 199=>602, 200=>602, 201=>602, 202=>602, 203=>602, 204=>602, 205=>602, 206=>602, 207=>602, 208=>602, 209=>602, 210=>602, 211=>602, 212=>602, + 213=>602, 214=>602, 215=>602, 216=>602, 217=>602, 218=>602, 219=>602, 220=>602, 221=>602, 222=>602, 223=>602, 224=>602, 225=>602, 226=>602, 227=>602, 228=>602, + 229=>602, 230=>602, 231=>602, 232=>602, 233=>602, 234=>602, 235=>602, 236=>602, 237=>602, 238=>602, 239=>602, 240=>602, 241=>602, 242=>602, 243=>602, 244=>602, + 245=>602, 246=>602, 247=>602, 248=>602, 249=>602, 250=>602, 251=>602, 252=>602, 253=>602, 254=>602, 255=>602, 8800=>602, 8734=>602, 8804=>602, 8805=>602, 8706=>602, + 8721=>602, 8719=>602, 960=>602, 8747=>602, 937=>602, 8730=>602, 8776=>602, 8710=>602, 9674=>602, 8725=>602, 64257=>602, 64258=>602, 305=>602, 728=>602, 729=>602, 730=>602, + 733=>602, 731=>602, 711=>602, 321=>602, 322=>602, 8722=>602, 286=>602, 287=>602, 304=>602, 350=>602, 351=>602, 262=>602, 263=>602, 268=>602, 269=>602, 273=>602, + 8729=>602} + font[:enc]=''; + font[:diff]=''; + font[:file]='veramo.z'; + font[:ctg]='veramo.ctg.z'; + font[:originalsize]=49224; +end \ No newline at end of file diff --git a/vendor/plugins/rfpdf/lib/fonts/veramo.z b/vendor/plugins/rfpdf/lib/fonts/veramo.z new file mode 100755 index 00000000..4c6eb767 Binary files /dev/null and b/vendor/plugins/rfpdf/lib/fonts/veramo.z differ diff --git a/vendor/plugins/rfpdf/lib/fonts/veramob.ctg.z b/vendor/plugins/rfpdf/lib/fonts/veramob.ctg.z new file mode 100755 index 00000000..904f8fae Binary files /dev/null and b/vendor/plugins/rfpdf/lib/fonts/veramob.ctg.z differ diff --git a/vendor/plugins/rfpdf/lib/fonts/veramob.rb b/vendor/plugins/rfpdf/lib/fonts/veramob.rb new file mode 100755 index 00000000..d4617ad7 --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/veramob.rb @@ -0,0 +1,30 @@ +TCPDFFontDescriptor.define('veramob') do |font| + font[:type]='TrueTypeUnicode'; + font[:name]='BitstreamVeraSansMono-Bold'; + font[:desc]={'Ascent'=>928,'Descent'=>-236,'CapHeight'=>928,'Flags'=>33,'FontBBox'=>'[-19 -236 606 928]','ItalicAngle'=>0,'StemV'=>120,'MissingWidth'=>602} + font[:up]=-108; + font[:ut]=120; + font[:cw]={ + 270=>602, 32=>602, 33=>602, 34=>602, 35=>602, 36=>602, 37=>602, 38=>602, 39=>602, 40=>602, 41=>602, 42=>602, 43=>602, 44=>602, 45=>602, 46=>602, + 47=>602, 48=>602, 49=>602, 50=>602, 51=>602, 52=>602, 53=>602, 54=>602, 55=>602, 56=>602, 57=>602, 58=>602, 59=>602, 60=>602, 61=>602, 62=>602, + 63=>602, 64=>602, 65=>602, 66=>602, 67=>602, 68=>602, 69=>602, 70=>602, 71=>602, 72=>602, 73=>602, 74=>602, 75=>602, 76=>602, 77=>602, 78=>602, + 79=>602, 80=>602, 81=>602, 82=>602, 83=>602, 84=>602, 85=>602, 86=>602, 87=>602, 88=>602, 89=>602, 90=>602, 91=>602, 92=>602, 93=>602, 94=>602, + 95=>602, 96=>602, 97=>602, 98=>602, 99=>602, 100=>602, 101=>602, 102=>602, 103=>602, 104=>602, 105=>602, 106=>602, 107=>602, 108=>602, 109=>602, 110=>602, + 111=>602, 112=>602, 113=>602, 114=>602, 115=>602, 116=>602, 117=>602, 118=>602, 119=>602, 120=>602, 121=>602, 122=>602, 123=>602, 124=>602, 125=>602, 126=>602, + 8364=>602, 8218=>602, 402=>602, 8222=>602, 8230=>602, 8224=>602, 8225=>602, 710=>602, 8240=>602, 352=>602, 8249=>602, 338=>602, 381=>602, 8216=>602, 8217=>602, 8220=>602, + 8221=>602, 8226=>602, 8211=>602, 8212=>602, 732=>602, 8482=>602, 353=>602, 8250=>602, 339=>602, 382=>602, 376=>602, 160=>602, 161=>602, 162=>602, 163=>602, 164=>602, + 165=>602, 166=>602, 167=>602, 168=>602, 169=>602, 170=>602, 171=>602, 172=>602, 173=>602, 174=>602, 175=>602, 176=>602, 177=>602, 178=>602, 179=>602, 180=>602, + 181=>602, 182=>602, 183=>602, 184=>602, 185=>602, 186=>602, 187=>602, 188=>602, 189=>602, 190=>602, 191=>602, 192=>602, 193=>602, 194=>602, 195=>602, 196=>602, + 197=>602, 198=>602, 199=>602, 200=>602, 201=>602, 202=>602, 203=>602, 204=>602, 205=>602, 206=>602, 207=>602, 208=>602, 209=>602, 210=>602, 211=>602, 212=>602, + 213=>602, 214=>602, 215=>602, 216=>602, 217=>602, 218=>602, 219=>602, 220=>602, 221=>602, 222=>602, 223=>602, 224=>602, 225=>602, 226=>602, 227=>602, 228=>602, + 229=>602, 230=>602, 231=>602, 232=>602, 233=>602, 234=>602, 235=>602, 236=>602, 237=>602, 238=>602, 239=>602, 240=>602, 241=>602, 242=>602, 243=>602, 244=>602, + 245=>602, 246=>602, 247=>602, 248=>602, 249=>602, 250=>602, 251=>602, 252=>602, 253=>602, 254=>602, 255=>602, 8800=>602, 8734=>602, 8804=>602, 8805=>602, 8706=>602, + 8721=>602, 8719=>602, 960=>602, 8747=>602, 937=>602, 8730=>602, 8776=>602, 8710=>602, 9674=>602, 8725=>602, 64257=>602, 64258=>602, 305=>602, 728=>602, 729=>602, 730=>602, + 733=>602, 731=>602, 711=>602, 321=>602, 322=>602, 8722=>602, 286=>602, 287=>602, 304=>602, 350=>602, 351=>602, 262=>602, 263=>602, 268=>602, 269=>602, 273=>602, + 8729=>602} + font[:enc]=''; + font[:diff]=''; + font[:file]='veramob.z'; + font[:ctg]='veramob.ctg.z'; + font[:originalsize]=49052; +end diff --git a/vendor/plugins/rfpdf/lib/fonts/veramob.z b/vendor/plugins/rfpdf/lib/fonts/veramob.z new file mode 100755 index 00000000..8aae085f Binary files /dev/null and b/vendor/plugins/rfpdf/lib/fonts/veramob.z differ diff --git a/vendor/plugins/rfpdf/lib/fonts/veramobi.ctg.z b/vendor/plugins/rfpdf/lib/fonts/veramobi.ctg.z new file mode 100755 index 00000000..904f8fae Binary files /dev/null and b/vendor/plugins/rfpdf/lib/fonts/veramobi.ctg.z differ diff --git a/vendor/plugins/rfpdf/lib/fonts/veramobi.rb b/vendor/plugins/rfpdf/lib/fonts/veramobi.rb new file mode 100755 index 00000000..614fdc11 --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/veramobi.rb @@ -0,0 +1,30 @@ +TCPDFFontDescriptor.define('veramobi') do |font| + font[:type]='TrueTypeUnicode'; + font[:name]='BitstreamVeraSansMono-BoldOb'; + font[:desc]={'Ascent'=>928,'Descent'=>-236,'CapHeight'=>928,'Flags'=>97,'FontBBox'=>'[-73 -236 681 928]','ItalicAngle'=>-11,'StemV'=>120,'MissingWidth'=>602} + font[:up]=-108; + font[:ut]=120; + font[:cw]={ + 270=>602, 32=>602, 33=>602, 34=>602, 35=>602, 36=>602, 37=>602, 38=>602, 39=>602, 40=>602, 41=>602, 42=>602, 43=>602, 44=>602, 45=>602, 46=>602, + 47=>602, 48=>602, 49=>602, 50=>602, 51=>602, 52=>602, 53=>602, 54=>602, 55=>602, 56=>602, 57=>602, 58=>602, 59=>602, 60=>602, 61=>602, 62=>602, + 63=>602, 64=>602, 65=>602, 66=>602, 67=>602, 68=>602, 69=>602, 70=>602, 71=>602, 72=>602, 73=>602, 74=>602, 75=>602, 76=>602, 77=>602, 78=>602, + 79=>602, 80=>602, 81=>602, 82=>602, 83=>602, 84=>602, 85=>602, 86=>602, 87=>602, 88=>602, 89=>602, 90=>602, 91=>602, 92=>602, 93=>602, 94=>602, + 95=>602, 96=>602, 97=>602, 98=>602, 99=>602, 100=>602, 101=>602, 102=>602, 103=>602, 104=>602, 105=>602, 106=>602, 107=>602, 108=>602, 109=>602, 110=>602, + 111=>602, 112=>602, 113=>602, 114=>602, 115=>602, 116=>602, 117=>602, 118=>602, 119=>602, 120=>602, 121=>602, 122=>602, 123=>602, 124=>602, 125=>602, 126=>602, + 8364=>602, 8218=>602, 402=>602, 8222=>602, 8230=>602, 8224=>602, 8225=>602, 710=>602, 8240=>602, 352=>602, 8249=>602, 338=>602, 381=>602, 8216=>602, 8217=>602, 8220=>602, + 8221=>602, 8226=>602, 8211=>602, 8212=>602, 732=>602, 8482=>602, 353=>602, 8250=>602, 339=>602, 382=>602, 376=>602, 160=>602, 161=>602, 162=>602, 163=>602, 164=>602, + 165=>602, 166=>602, 167=>602, 168=>602, 169=>602, 170=>602, 171=>602, 172=>602, 173=>602, 174=>602, 175=>602, 176=>602, 177=>602, 178=>602, 179=>602, 180=>602, + 181=>602, 182=>602, 183=>602, 184=>602, 185=>602, 186=>602, 187=>602, 188=>602, 189=>602, 190=>602, 191=>602, 192=>602, 193=>602, 194=>602, 195=>602, 196=>602, + 197=>602, 198=>602, 199=>602, 200=>602, 201=>602, 202=>602, 203=>602, 204=>602, 205=>602, 206=>602, 207=>602, 208=>602, 209=>602, 210=>602, 211=>602, 212=>602, + 213=>602, 214=>602, 215=>602, 216=>602, 217=>602, 218=>602, 219=>602, 220=>602, 221=>602, 222=>602, 223=>602, 224=>602, 225=>602, 226=>602, 227=>602, 228=>602, + 229=>602, 230=>602, 231=>602, 232=>602, 233=>602, 234=>602, 235=>602, 236=>602, 237=>602, 238=>602, 239=>602, 240=>602, 241=>602, 242=>602, 243=>602, 244=>602, + 245=>602, 246=>602, 247=>602, 248=>602, 249=>602, 250=>602, 251=>602, 252=>602, 253=>602, 254=>602, 255=>602, 8800=>602, 8734=>602, 8804=>602, 8805=>602, 8706=>602, + 8721=>602, 8719=>602, 960=>602, 8747=>602, 937=>602, 8730=>602, 8776=>602, 8710=>602, 9674=>602, 8725=>602, 64257=>602, 64258=>602, 305=>602, 728=>602, 729=>602, 730=>602, + 733=>602, 731=>602, 711=>602, 321=>602, 322=>602, 8722=>602, 286=>602, 287=>602, 304=>602, 350=>602, 351=>602, 262=>602, 263=>602, 268=>602, 269=>602, 273=>602, + 8729=>602} + font[:enc]=''; + font[:diff]=''; + font[:file]='veramobi.z'; + font[:ctg]='veramobi.ctg.z'; + font[:originalsize]=55032; +end diff --git a/vendor/plugins/rfpdf/lib/fonts/veramobi.z b/vendor/plugins/rfpdf/lib/fonts/veramobi.z new file mode 100755 index 00000000..9ef6a31b Binary files /dev/null and b/vendor/plugins/rfpdf/lib/fonts/veramobi.z differ diff --git a/vendor/plugins/rfpdf/lib/fonts/veramoi.ctg.z b/vendor/plugins/rfpdf/lib/fonts/veramoi.ctg.z new file mode 100755 index 00000000..904f8fae Binary files /dev/null and b/vendor/plugins/rfpdf/lib/fonts/veramoi.ctg.z differ diff --git a/vendor/plugins/rfpdf/lib/fonts/veramoi.rb b/vendor/plugins/rfpdf/lib/fonts/veramoi.rb new file mode 100755 index 00000000..29ce751a --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/veramoi.rb @@ -0,0 +1,30 @@ +TCPDFFontDescriptor.define('veramoi') do |font| + font[:type]='TrueTypeUnicode'; + font[:name]='BitstreamVeraSansMono-Oblique'; + font[:desc]={'Ascent'=>928,'Descent'=>-236,'CapHeight'=>928,'Flags'=>97,'FontBBox'=>'[-71 -236 691 928]','ItalicAngle'=>-11,'StemV'=>70,'MissingWidth'=>602} + font[:up]=-104; + font[:ut]=69; + font[:cw]={ + 270=>602, 32=>602, 33=>602, 34=>602, 35=>602, 36=>602, 37=>602, 38=>602, 39=>602, 40=>602, 41=>602, 42=>602, 43=>602, 44=>602, 45=>602, 46=>602, + 47=>602, 48=>602, 49=>602, 50=>602, 51=>602, 52=>602, 53=>602, 54=>602, 55=>602, 56=>602, 57=>602, 58=>602, 59=>602, 60=>602, 61=>602, 62=>602, + 63=>602, 64=>602, 65=>602, 66=>602, 67=>602, 68=>602, 69=>602, 70=>602, 71=>602, 72=>602, 73=>602, 74=>602, 75=>602, 76=>602, 77=>602, 78=>602, + 79=>602, 80=>602, 81=>602, 82=>602, 83=>602, 84=>602, 85=>602, 86=>602, 87=>602, 88=>602, 89=>602, 90=>602, 91=>602, 92=>602, 93=>602, 94=>602, + 95=>602, 96=>602, 97=>602, 98=>602, 99=>602, 100=>602, 101=>602, 102=>602, 103=>602, 104=>602, 105=>602, 106=>602, 107=>602, 108=>602, 109=>602, 110=>602, + 111=>602, 112=>602, 113=>602, 114=>602, 115=>602, 116=>602, 117=>602, 118=>602, 119=>602, 120=>602, 121=>602, 122=>602, 123=>602, 124=>602, 125=>602, 126=>602, + 8364=>602, 8218=>602, 402=>602, 8222=>602, 8230=>602, 8224=>602, 8225=>602, 710=>602, 8240=>602, 352=>602, 8249=>602, 338=>602, 381=>602, 8216=>602, 8217=>602, 8220=>602, + 8221=>602, 8226=>602, 8211=>602, 8212=>602, 732=>602, 8482=>602, 353=>602, 8250=>602, 339=>602, 382=>602, 376=>602, 160=>602, 161=>602, 162=>602, 163=>602, 164=>602, + 165=>602, 166=>602, 167=>602, 168=>602, 169=>602, 170=>602, 171=>602, 172=>602, 173=>602, 174=>602, 175=>602, 176=>602, 177=>602, 178=>602, 179=>602, 180=>602, + 181=>602, 182=>602, 183=>602, 184=>602, 185=>602, 186=>602, 187=>602, 188=>602, 189=>602, 190=>602, 191=>602, 192=>602, 193=>602, 194=>602, 195=>602, 196=>602, + 197=>602, 198=>602, 199=>602, 200=>602, 201=>602, 202=>602, 203=>602, 204=>602, 205=>602, 206=>602, 207=>602, 208=>602, 209=>602, 210=>602, 211=>602, 212=>602, + 213=>602, 214=>602, 215=>602, 216=>602, 217=>602, 218=>602, 219=>602, 220=>602, 221=>602, 222=>602, 223=>602, 224=>602, 225=>602, 226=>602, 227=>602, 228=>602, + 229=>602, 230=>602, 231=>602, 232=>602, 233=>602, 234=>602, 235=>602, 236=>602, 237=>602, 238=>602, 239=>602, 240=>602, 241=>602, 242=>602, 243=>602, 244=>602, + 245=>602, 246=>602, 247=>602, 248=>602, 249=>602, 250=>602, 251=>602, 252=>602, 253=>602, 254=>602, 255=>602, 8800=>602, 8734=>602, 8804=>602, 8805=>602, 8706=>602, + 8721=>602, 8719=>602, 960=>602, 8747=>602, 937=>602, 8730=>602, 8776=>602, 8710=>602, 9674=>602, 8725=>602, 64257=>602, 64258=>602, 305=>602, 728=>602, 729=>602, 730=>602, + 733=>602, 731=>602, 711=>602, 321=>602, 322=>602, 8722=>602, 286=>602, 287=>602, 304=>602, 350=>602, 351=>602, 262=>602, 263=>602, 268=>602, 269=>602, 273=>602, + 8729=>602} + font[:enc]=''; + font[:diff]=''; + font[:file]='veramoi.z'; + font[:ctg]='veramoi.ctg.z'; + font[:originalsize]=54508; +end diff --git a/vendor/plugins/rfpdf/lib/fonts/veramoi.z b/vendor/plugins/rfpdf/lib/fonts/veramoi.z new file mode 100755 index 00000000..de244043 Binary files /dev/null and b/vendor/plugins/rfpdf/lib/fonts/veramoi.z differ diff --git a/vendor/plugins/rfpdf/lib/fonts/verase.ctg.z b/vendor/plugins/rfpdf/lib/fonts/verase.ctg.z new file mode 100755 index 00000000..904f8fae Binary files /dev/null and b/vendor/plugins/rfpdf/lib/fonts/verase.ctg.z differ diff --git a/vendor/plugins/rfpdf/lib/fonts/verase.rb b/vendor/plugins/rfpdf/lib/fonts/verase.rb new file mode 100755 index 00000000..d0cae74d --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/verase.rb @@ -0,0 +1,30 @@ +TCPDFFontDescriptor.define('verase') do |font| + font[:type]='TrueTypeUnicode'; + font[:name]='BitstreamVeraSerif-Roman'; + font[:desc]={'Ascent'=>928,'Descent'=>-236,'CapHeight'=>928,'Flags'=>32,'FontBBox'=>'[-183 -236 1287 928]','ItalicAngle'=>0,'StemV'=>70,'MissingWidth'=>600} + font[:up]=-104; + font[:ut]=65; + font[:cw]={ + 270=>600, 32=>318, 33=>402, 34=>460, 35=>838, 36=>636, 37=>950, 38=>890, 39=>275, 40=>390, 41=>390, 42=>500, 43=>838, 44=>318, 45=>338, 46=>318, + 47=>337, 48=>636, 49=>636, 50=>636, 51=>636, 52=>636, 53=>636, 54=>636, 55=>636, 56=>636, 57=>636, 58=>337, 59=>337, 60=>838, 61=>838, 62=>838, + 63=>536, 64=>1000, 65=>722, 66=>735, 67=>765, 68=>802, 69=>730, 70=>694, 71=>799, 72=>872, 73=>395, 74=>401, 75=>747, 76=>664, 77=>1024, 78=>875, + 79=>820, 80=>673, 81=>820, 82=>753, 83=>685, 84=>667, 85=>843, 86=>722, 87=>1028, 88=>712, 89=>660, 90=>695, 91=>390, 92=>337, 93=>390, 94=>838, + 95=>500, 96=>500, 97=>596, 98=>640, 99=>560, 100=>640, 101=>592, 102=>370, 103=>640, 104=>644, 105=>320, 106=>310, 107=>606, 108=>320, 109=>948, 110=>644, + 111=>602, 112=>640, 113=>640, 114=>478, 115=>513, 116=>402, 117=>644, 118=>565, 119=>856, 120=>564, 121=>565, 122=>527, 123=>636, 124=>337, 125=>636, 126=>838, + 8364=>636, 8218=>318, 402=>636, 8222=>518, 8230=>1000, 8224=>500, 8225=>500, 710=>500, 8240=>1342, 352=>685, 8249=>400, 338=>1137, 381=>695, 8216=>318, 8217=>318, 8220=>511, + 8221=>511, 8226=>590, 8211=>500, 8212=>1000, 732=>500, 8482=>1000, 353=>513, 8250=>400, 339=>989, 382=>527, 376=>660, 160=>636, 161=>402, 162=>636, 163=>636, 164=>636, + 165=>636, 166=>337, 167=>500, 168=>500, 169=>1000, 170=>475, 171=>612, 172=>838, 173=>338, 174=>1000, 175=>500, 176=>500, 177=>838, 178=>401, 179=>401, 180=>500, + 181=>650, 182=>636, 183=>318, 184=>500, 185=>401, 186=>470, 187=>612, 188=>969, 189=>969, 190=>969, 191=>536, 192=>722, 193=>722, 194=>722, 195=>722, 196=>722, + 197=>722, 198=>1001, 199=>765, 200=>730, 201=>730, 202=>730, 203=>730, 204=>395, 205=>395, 206=>395, 207=>395, 208=>807, 209=>875, 210=>820, 211=>820, 212=>820, + 213=>820, 214=>820, 215=>838, 216=>820, 217=>843, 218=>843, 219=>843, 220=>843, 221=>660, 222=>676, 223=>668, 224=>596, 225=>596, 226=>596, 227=>596, 228=>596, + 229=>596, 230=>940, 231=>560, 232=>592, 233=>592, 234=>592, 235=>592, 236=>320, 237=>320, 238=>320, 239=>320, 240=>602, 241=>644, 242=>602, 243=>602, 244=>602, + 245=>602, 246=>602, 247=>838, 248=>602, 249=>644, 250=>644, 251=>644, 252=>644, 253=>565, 254=>640, 255=>565, 8800=>838, 8734=>833, 8804=>838, 8805=>838, 8706=>517, + 8721=>714, 8719=>796, 960=>657, 8747=>521, 937=>829, 8730=>637, 8776=>838, 8710=>698, 9674=>494, 8725=>167, 64257=>667, 64258=>667, 305=>320, 728=>500, 729=>500, 730=>500, + 733=>500, 731=>500, 711=>500, 321=>669, 322=>324, 8722=>838, 286=>799, 287=>640, 304=>395, 350=>685, 351=>513, 262=>765, 263=>560, 268=>765, 269=>560, 273=>640, + 8729=>318} + font[:enc]=''; + font[:diff]=''; + font[:file]='verase.z'; + font[:ctg]='verase.ctg.z'; + font[:originalsize]=60280; +end diff --git a/vendor/plugins/rfpdf/lib/fonts/verase.z b/vendor/plugins/rfpdf/lib/fonts/verase.z new file mode 100755 index 00000000..e228cce9 Binary files /dev/null and b/vendor/plugins/rfpdf/lib/fonts/verase.z differ diff --git a/vendor/plugins/rfpdf/lib/fonts/veraseb.ctg.z b/vendor/plugins/rfpdf/lib/fonts/veraseb.ctg.z new file mode 100755 index 00000000..904f8fae Binary files /dev/null and b/vendor/plugins/rfpdf/lib/fonts/veraseb.ctg.z differ diff --git a/vendor/plugins/rfpdf/lib/fonts/veraseb.rb b/vendor/plugins/rfpdf/lib/fonts/veraseb.rb new file mode 100755 index 00000000..3e485ce0 --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/veraseb.rb @@ -0,0 +1,30 @@ +TCPDFFontDescriptor.define('veraseb') do |font| + font[:type]='TrueTypeUnicode'; + font[:name]='BitstreamVeraSerif-Bold'; + font[:desc]={'Ascent'=>939,'Descent'=>-236,'CapHeight'=>939,'Flags'=>32,'FontBBox'=>'[-186 -236 1361 939]','ItalicAngle'=>0,'StemV'=>120,'MissingWidth'=>600} + font[:up]=-106; + font[:ut]=117; + font[:cw]={ + 270=>600, 32=>348, 33=>439, 34=>521, 35=>838, 36=>696, 37=>950, 38=>903, 39=>306, 40=>473, 41=>473, 42=>523, 43=>838, 44=>348, 45=>415, 46=>348, + 47=>365, 48=>696, 49=>696, 50=>696, 51=>696, 52=>696, 53=>696, 54=>696, 55=>696, 56=>696, 57=>696, 58=>369, 59=>369, 60=>838, 61=>838, 62=>838, + 63=>586, 64=>1000, 65=>776, 66=>845, 67=>796, 68=>867, 69=>762, 70=>710, 71=>854, 72=>945, 73=>468, 74=>473, 75=>869, 76=>703, 77=>1107, 78=>914, + 79=>871, 80=>752, 81=>871, 82=>831, 83=>722, 84=>744, 85=>872, 86=>776, 87=>1123, 88=>776, 89=>714, 90=>730, 91=>473, 92=>365, 93=>473, 94=>838, + 95=>500, 96=>500, 97=>648, 98=>699, 99=>609, 100=>699, 101=>636, 102=>430, 103=>699, 104=>727, 105=>380, 106=>362, 107=>693, 108=>380, 109=>1058, 110=>727, + 111=>667, 112=>699, 113=>699, 114=>527, 115=>563, 116=>462, 117=>727, 118=>581, 119=>861, 120=>596, 121=>581, 122=>568, 123=>643, 124=>364, 125=>643, 126=>838, + 8364=>696, 8218=>348, 402=>696, 8222=>575, 8230=>1000, 8224=>523, 8225=>523, 710=>500, 8240=>1385, 352=>722, 8249=>400, 338=>1180, 381=>730, 8216=>348, 8217=>348, 8220=>575, + 8221=>575, 8226=>639, 8211=>500, 8212=>1000, 732=>500, 8482=>1000, 353=>563, 8250=>400, 339=>1028, 382=>568, 376=>714, 160=>696, 161=>439, 162=>696, 163=>696, 164=>636, + 165=>696, 166=>364, 167=>523, 168=>500, 169=>1000, 170=>487, 171=>625, 172=>838, 173=>415, 174=>1000, 175=>500, 176=>500, 177=>838, 178=>438, 179=>438, 180=>500, + 181=>732, 182=>636, 183=>348, 184=>500, 185=>438, 186=>500, 187=>625, 188=>1043, 189=>1043, 190=>1043, 191=>586, 192=>776, 193=>776, 194=>776, 195=>776, 196=>776, + 197=>776, 198=>1034, 199=>796, 200=>762, 201=>762, 202=>762, 203=>762, 204=>468, 205=>468, 206=>468, 207=>468, 208=>874, 209=>914, 210=>871, 211=>871, 212=>871, + 213=>871, 214=>871, 215=>838, 216=>871, 217=>872, 218=>872, 219=>872, 220=>872, 221=>714, 222=>757, 223=>760, 224=>648, 225=>648, 226=>648, 227=>648, 228=>648, + 229=>648, 230=>975, 231=>609, 232=>636, 233=>636, 234=>636, 235=>636, 236=>380, 237=>380, 238=>380, 239=>380, 240=>667, 241=>727, 242=>667, 243=>667, 244=>667, + 245=>667, 246=>667, 247=>838, 248=>667, 249=>727, 250=>727, 251=>727, 252=>727, 253=>581, 254=>699, 255=>581, 8800=>838, 8734=>833, 8804=>838, 8805=>838, 8706=>534, + 8721=>753, 8719=>842, 960=>732, 8747=>579, 937=>890, 8730=>657, 8776=>838, 8710=>753, 9674=>494, 8725=>167, 64257=>727, 64258=>727, 305=>380, 728=>500, 729=>500, 730=>500, + 733=>500, 731=>500, 711=>500, 321=>710, 322=>385, 8722=>838, 286=>854, 287=>699, 304=>468, 350=>722, 351=>563, 262=>796, 263=>609, 268=>796, 269=>609, 273=>699, + 8729=>348} + font[:enc]=''; + font[:diff]=''; + font[:file]='veraseb.z'; + font[:ctg]='veraseb.ctg.z'; + font[:originalsize]=58736; +end diff --git a/vendor/plugins/rfpdf/lib/fonts/veraseb.z b/vendor/plugins/rfpdf/lib/fonts/veraseb.z new file mode 100755 index 00000000..b94115ba Binary files /dev/null and b/vendor/plugins/rfpdf/lib/fonts/veraseb.z differ diff --git a/vendor/plugins/rfpdf/lib/fonts/zapfdingbats.rb b/vendor/plugins/rfpdf/lib/fonts/zapfdingbats.rb new file mode 100755 index 00000000..cfce8940 --- /dev/null +++ b/vendor/plugins/rfpdf/lib/fonts/zapfdingbats.rb @@ -0,0 +1,15 @@ +TCPDFFontDescriptor.define('zapfdingbats') do |font| + font[:cw]={ + 0.chr=>0,1.chr=>0,2.chr=>0,3.chr=>0,4.chr=>0,5.chr=>0,6.chr=>0,7.chr=>0,8.chr=>0,9.chr=>0,10.chr=>0,11.chr=>0,12.chr=>0,13.chr=>0,14.chr=>0,15.chr=>0,16.chr=>0,17.chr=>0,18.chr=>0,19.chr=>0,20.chr=>0,21.chr=>0, + 22.chr=>0,23.chr=>0,24.chr=>0,25.chr=>0,26.chr=>0,27.chr=>0,28.chr=>0,29.chr=>0,30.chr=>0,31.chr=>0,' '=>278,'!'=>974,'"'=>961,'#'=>974,'$'=>980,'%'=>719,'&'=>789,'\''=>790,'('=>791,')'=>690,'*'=>960,'+'=>939, + ','=>549,'-'=>855,'.'=>911,'/'=>933,'0'=>911,'1'=>945,'2'=>974,'3'=>755,'4'=>846,'5'=>762,'6'=>761,'7'=>571,'8'=>677,'9'=>763,':'=>760,';'=>759,'<'=>754,'='=>494,'>'=>552,'?'=>537,'@'=>577,'A'=>692, + 'B'=>786,'C'=>788,'D'=>788,'E'=>790,'F'=>793,'G'=>794,'H'=>816,'I'=>823,'J'=>789,'K'=>841,'L'=>823,'M'=>833,'N'=>816,'O'=>831,'P'=>923,'Q'=>744,'R'=>723,'S'=>749,'T'=>790,'U'=>792,'V'=>695,'W'=>776, + 'X'=>768,'Y'=>792,'Z'=>759,'['=>707,'\\'=>708,']'=>682,'^'=>701,'_'=>826,'`'=>815,'a'=>789,'b'=>789,'c'=>707,'d'=>687,'e'=>696,'f'=>689,'g'=>786,'h'=>787,'i'=>713,'j'=>791,'k'=>785,'l'=>791,'m'=>873, + 'n'=>761,'o'=>762,'p'=>762,'q'=>759,'r'=>759,'s'=>892,'t'=>892,'u'=>788,'v'=>784,'w'=>438,'x'=>138,'y'=>277,'z'=>415,'{'=>392,'|'=>392,'}'=>668,'~'=>668,127.chr=>0,128.chr=>390,129.chr=>390,130.chr=>317,131.chr=>317, + 132.chr=>276,133.chr=>276,134.chr=>509,135.chr=>509,136.chr=>410,137.chr=>410,138.chr=>234,139.chr=>234,140.chr=>334,141.chr=>334,142.chr=>0,143.chr=>0,144.chr=>0,145.chr=>0,146.chr=>0,147.chr=>0,148.chr=>0,149.chr=>0,150.chr=>0,151.chr=>0,152.chr=>0,153.chr=>0, + 154.chr=>0,155.chr=>0,156.chr=>0,157.chr=>0,158.chr=>0,159.chr=>0,160.chr=>0,161.chr=>732,162.chr=>544,163.chr=>544,164.chr=>910,165.chr=>667,166.chr=>760,167.chr=>760,168.chr=>776,169.chr=>595,170.chr=>694,171.chr=>626,172.chr=>788,173.chr=>788,174.chr=>788,175.chr=>788, + 176.chr=>788,177.chr=>788,178.chr=>788,179.chr=>788,180.chr=>788,181.chr=>788,182.chr=>788,183.chr=>788,184.chr=>788,185.chr=>788,186.chr=>788,187.chr=>788,188.chr=>788,189.chr=>788,190.chr=>788,191.chr=>788,192.chr=>788,193.chr=>788,194.chr=>788,195.chr=>788,196.chr=>788,197.chr=>788, + 198.chr=>788,199.chr=>788,200.chr=>788,201.chr=>788,202.chr=>788,203.chr=>788,204.chr=>788,205.chr=>788,206.chr=>788,207.chr=>788,208.chr=>788,209.chr=>788,210.chr=>788,211.chr=>788,212.chr=>894,213.chr=>838,214.chr=>1016,215.chr=>458,216.chr=>748,217.chr=>924,218.chr=>748,219.chr=>918, + 220.chr=>927,221.chr=>928,222.chr=>928,223.chr=>834,224.chr=>873,225.chr=>828,226.chr=>924,227.chr=>924,228.chr=>917,229.chr=>930,230.chr=>931,231.chr=>463,232.chr=>883,233.chr=>836,234.chr=>836,235.chr=>867,236.chr=>867,237.chr=>696,238.chr=>696,239.chr=>874,240.chr=>0,241.chr=>874, + 242.chr=>760,243.chr=>946,244.chr=>771,245.chr=>865,246.chr=>771,247.chr=>888,248.chr=>967,249.chr=>888,250.chr=>831,251.chr=>873,252.chr=>927,253.chr=>970,254.chr=>918,255.chr=>0); +end \ No newline at end of file diff --git a/vendor/plugins/rfpdf/lib/rfpdf/bookmark.rb b/vendor/plugins/rfpdf/lib/fpdf/bookmark.rb similarity index 100% rename from vendor/plugins/rfpdf/lib/rfpdf/bookmark.rb rename to vendor/plugins/rfpdf/lib/fpdf/bookmark.rb diff --git a/vendor/plugins/rfpdf/lib/rfpdf/chinese.rb b/vendor/plugins/rfpdf/lib/fpdf/chinese.rb similarity index 90% rename from vendor/plugins/rfpdf/lib/rfpdf/chinese.rb rename to vendor/plugins/rfpdf/lib/fpdf/chinese.rb index 5684c702..94f8ee49 100644 --- a/vendor/plugins/rfpdf/lib/rfpdf/chinese.rb +++ b/vendor/plugins/rfpdf/lib/fpdf/chinese.rb @@ -1,473 +1,469 @@ -# Copyright (c) 2006 4ssoM LLC -# 1.12 contributed by Ed Moss. -# -# The MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. -# -# This is direct port of chinese.php -# -# Chinese PDF support. -# -# Usage is as follows: -# -# require 'fpdf' -# require 'chinese' -# pdf = FPDF.new -# pdf.extend(PDF_Chinese) -# -# This allows it to be combined with other extensions, such as the bookmark -# module. - -module PDF_Chinese - - Big5_widths={' '=>250,'!'=>250,'"'=>408,'#'=>668,''=>490,'%'=>875,'&'=>698,'\''=>250, - '('=>240,')'=>240,'*'=>417,'+'=>667,','=>250,'-'=>313,'.'=>250,'/'=>520,'0'=>500,'1'=>500, - '2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>250,''=>250, - '<'=>667,'='=>667,'>'=>667,'?'=>396,'@'=>921,'A'=>677,'B'=>615,'C'=>719,'D'=>760,'E'=>625, - 'F'=>552,'G'=>771,'H'=>802,'I'=>354,'J'=>354,'K'=>781,'L'=>604,'M'=>927,'N'=>750,'O'=>823, - 'P'=>563,'Q'=>823,'R'=>729,'S'=>542,'T'=>698,'U'=>771,'V'=>729,'W'=>948,'X'=>771,'Y'=>677, - 'Z'=>635,'['=>344,'\\'=>520,']'=>344,'^'=>469,'_'=>500,'`'=>250,'a'=>469,'b'=>521,'c'=>427, - 'd'=>521,'e'=>438,'f'=>271,'g'=>469,'h'=>531,'i'=>250,'j'=>250,'k'=>458,'l'=>240,'m'=>802, - 'n'=>531,'o'=>500,'p'=>521,'q'=>521,'r'=>365,'s'=>333,'t'=>292,'u'=>521,'v'=>458,'w'=>677, - 'x'=>479,'y'=>458,'z'=>427,'{'=>480,'|'=>496,'end'=>480,'~'=>667} - - GB_widths={' '=>207,'!'=>270,'"'=>342,'#'=>467,''=>462,'%'=>797,'&'=>710,'\''=>239, - '('=>374,')'=>374,'*'=>423,'+'=>605,','=>238,'-'=>375,'.'=>238,'/'=>334,'0'=>462,'1'=>462, - '2'=>462,'3'=>462,'4'=>462,'5'=>462,'6'=>462,'7'=>462,'8'=>462,'9'=>462,':'=>238,''=>238, - '<'=>605,'='=>605,'>'=>605,'?'=>344,'@'=>748,'A'=>684,'B'=>560,'C'=>695,'D'=>739,'E'=>563, - 'F'=>511,'G'=>729,'H'=>793,'I'=>318,'J'=>312,'K'=>666,'L'=>526,'M'=>896,'N'=>758,'O'=>772, - 'P'=>544,'Q'=>772,'R'=>628,'S'=>465,'T'=>607,'U'=>753,'V'=>711,'W'=>972,'X'=>647,'Y'=>620, - 'Z'=>607,'['=>374,'\\'=>333,']'=>374,'^'=>606,'_'=>500,'`'=>239,'a'=>417,'b'=>503,'c'=>427, - 'd'=>529,'e'=>415,'f'=>264,'g'=>444,'h'=>518,'i'=>241,'j'=>230,'k'=>495,'l'=>228,'m'=>793, - 'n'=>527,'o'=>524,'p'=>524,'q'=>504,'r'=>338,'s'=>336,'t'=>277,'u'=>517,'v'=>450,'w'=>652, - 'x'=>466,'y'=>452,'z'=>407,'{'=>370,'|'=>258,'end'=>370,'~'=>605} - - def AddCIDFont(family,style,name,cw,cMap,registry) -#ActionController::Base::logger.debug registry.to_a.join(":").to_s - fontkey=family.downcase+style.upcase - unless @fonts[fontkey].nil? - Error("Font already added: family style") - end - i=@fonts.length+1 - name=name.gsub(' ','') - @fonts[fontkey]={'i'=>i,'type'=>'Type0','name'=>name,'up'=>-130,'ut'=>40,'cw'=>cw, 'CMap'=>cMap,'registry'=>registry} - end - - def AddCIDFonts(family,name,cw,cMap,registry) - AddCIDFont(family,'',name,cw,cMap,registry) - AddCIDFont(family,'B',name+',Bold',cw,cMap,registry) - AddCIDFont(family,'I',name+',Italic',cw,cMap,registry) - AddCIDFont(family,'BI',name+',BoldItalic',cw,cMap,registry) - end - - def AddBig5Font(family='Big5',name='MSungStd-Light-Acro') - #Add Big5 font with proportional Latin - cw=Big5_widths - cMap='ETenms-B5-H' - registry={'ordering'=>'CNS1','supplement'=>0} -#ActionController::Base::logger.debug registry.to_a.join(":").to_s - AddCIDFonts(family,name,cw,cMap,registry) - end - - def AddBig5hwFont(family='Big5-hw',name='MSungStd-Light-Acro') - #Add Big5 font with half-witdh Latin - cw = {} - 32.upto(126) do |i| - cw[i.chr]=500 - end - cMap='ETen-B5-H' - registry={'ordering'=>'CNS1','supplement'=>0} - AddCIDFonts(family,name,cw,cMap,registry) - end - - def AddGBFont(family='GB',name='STSongStd-Light-Acro') - #Add GB font with proportional Latin - cw=GB_widths - cMap='GBKp-EUC-H' - registry={'ordering'=>'GB1','supplement'=>2} - AddCIDFonts(family,name,cw,cMap,registry) - end - - def AddGBhwFont(family='GB-hw',name='STSongStd-Light-Acro') - #Add GB font with half-width Latin - 32.upto(126) do |i| - cw[i.chr]=500 - end - cMap='GBK-EUC-H' - registry={'ordering'=>'GB1','supplement'=>2} - AddCIDFonts(family,name,cw,cMap,registry) - end - - def GetStringWidth(s) - if(@CurrentFont['type']=='Type0') - return GetMBStringWidth(s) - else - return super(s) - end - end - - def GetMBStringWidth(s) - #Multi-byte version of GetStringWidth() - l=0 - cw=@CurrentFont['cw'] - nb=s.length - i=0 - while(i0 and s[nb-1]=="\n") - nb-=1 - end - b=0 - if(border) - if(border==1) - border='LTRB' - b='LRT' - b2='LR' - else - b2='' - if(border.to_s.index('L')) - b2+='L' - end - if(border.to_s.index('R')) - b2+='R' - end - b=border.to_s.index('T') ? b2+'T' : b2 - end - end - sep=-1 - i=0 - j=0 - l=0 - nl=1 - while(iwmax) - #Automatic line break - if(sep==-1 or i==j) - if(i==j) - i+=ascii ? 1 : 3 - end - Cell(w,h,s[j,i-j],b,2,align,fill) - else - Cell(w,h,s[j,sep-j],b,2,align,fill) - i=(s[sep]==' ') ? sep+1 : sep - end - sep=-1 - j=i - l=0 -# nl+=1 - if(border and nl==2) - b=b2 - end - else - i+=ascii ? 1 : 3 - end - end - #Last chunk - if(border and not border.to_s.index('B').nil?) - b+='B' - end - Cell(w,h,s[j,i-j],b,2,align,fill) - @x=@lMargin - end - - def Write(h,txt,link='') - if(@CurrentFont['type']=='Type0') - MBWrite(h,txt,link) - else - super(h,txt,link) - end - end - - def MBWrite(h,txt,link) - #Multi-byte version of Write() - cw=@CurrentFont['cw'] - w=@w-@rMargin-@x - wmax=(w-2*@cMargin)*1000/@FontSize - s=txt.gsub("\r",'') - nb=s.length - sep=-1 - i=0 - j=0 - l=0 - nl=1 - while(iwmax) - #Automatic line break - if(sep==-1 or i==j) - if(@x>@lMargin) - #Move to next line - @x=@lMargin - @y+=h - w=@w-@rMargin-@x - wmax=(w-2*@cMargin)*1000/@FontSize - i+=1 - nl+=1 - next - end - if(i==j) - i+=ascii ? 1 : 3 - end - Cell(w,h,s[j,i-j],0,2,'',0,link) - else - Cell(w,h,s[j,sep-j],0,2,'',0,link) - i=(s[sep]==' ') ? sep+1 : sep - end - sep=-1 - j=i - l=0 - if(nl==1) - @x=@lMargin - w=@w-@rMargin-@x - wmax=(w-2*@cMargin)*1000/@FontSize - end - nl+=1 - else - i+=ascii ? 1 : 3 - end - end - #Last chunk - if(i!=j) - Cell(l/1000*@FontSize,h,s[j,i-j],0,0,'',0,link) - end - end - -private - - def putfonts() - nf=@n - @diffs.each do |diff| - #Encodings - newobj() - out('<>') - out('endobj') - end - # mqr=get_magic_quotes_runtime() - # set_magic_quotes_runtime(0) - @FontFiles.each_pair do |file, info| - #Font file embedding - newobj() - @FontFiles[file]['n']=@n - if(defined('FPDF_FONTPATH')) - file=FPDF_FONTPATH+file - end - size=filesize(file) - if(!size) - Error('Font file not found') - end - out('<>') - f=fopen(file,'rb') - putstream(fread(f,size)) - fclose(f) - out('endobj') - end -# - # set_magic_quotes_runtime(mqr) -# - @fonts.each_pair do |k, font| - #Font objects - newobj() - @fonts[k]['n']=@n - out('<>') - out('endobj') - if(font['type']!='core') - #Widths - newobj() - cw=font['cw'] - s='[' - 32.upto(255) do |i| - s+=cw[i.chr]+' ' - end - out(s+']') - out('endobj') - #Descriptor - newobj() - s='<>') - out('endobj') - end - end - end - end - - def putType0(font) - #Type0 - out('/Subtype /Type0') - out('/BaseFont /'+font['name']+'-'+font['CMap']) - out('/Encoding /'+font['CMap']) - out('/DescendantFonts ['+(@n+1).to_s+' 0 R]') - out('>>') - out('endobj') - #CIDFont - newobj() - out('<>') - out('/FontDescriptor '+(@n+1).to_s+' 0 R') - if(font['CMap']=='ETen-B5-H') - w='13648 13742 500' - elsif(font['CMap']=='GBK-EUC-H') - w='814 907 500 7716 [500]' - else - # ActionController::Base::logger.debug font['cw'].keys.sort.join(' ').to_s - # ActionController::Base::logger.debug font['cw'].values.join(' ').to_s - w='1 [' - font['cw'].keys.sort.each {|key| - w+=font['cw'][key].to_s + " " -# ActionController::Base::logger.debug key.to_s -# ActionController::Base::logger.debug font['cw'][key].to_s - } - w +=']' - end - out('/W ['+w+']>>') - out('endobj') - #Font descriptor - newobj() - out('<>') - out('endobj') - end -end +# Copyright (c) 2006 4ssoM LLC +# 1.12 contributed by Ed Moss. +# +# The MIT License +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +# This is direct port of chinese.php +# +# Chinese PDF support. +# +# Usage is as follows: +# +# require 'fpdf' +# require 'chinese' +# pdf = FPDF.new +# pdf.extend(PDF_Chinese) +# +# This allows it to be combined with other extensions, such as the bookmark +# module. + +module PDF_Chinese + + Big5_widths={' '=>250,'!'=>250,'"'=>408,'#'=>668,'$'=>490,'%'=>875,'&'=>698,'\''=>250, + '('=>240,')'=>240,'*'=>417,'+'=>667,','=>250,'-'=>313,'.'=>250,'/'=>520,'0'=>500,'1'=>500, + '2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>250,';'=>250, + '<'=>667,'='=>667,'>'=>667,'?'=>396,'@'=>921,'A'=>677,'B'=>615,'C'=>719,'D'=>760,'E'=>625, + 'F'=>552,'G'=>771,'H'=>802,'I'=>354,'J'=>354,'K'=>781,'L'=>604,'M'=>927,'N'=>750,'O'=>823, + 'P'=>563,'Q'=>823,'R'=>729,'S'=>542,'T'=>698,'U'=>771,'V'=>729,'W'=>948,'X'=>771,'Y'=>677, + 'Z'=>635,'['=>344,'\\'=>520,']'=>344,'^'=>469,'_'=>500,'`'=>250,'a'=>469,'b'=>521,'c'=>427, + 'd'=>521,'e'=>438,'f'=>271,'g'=>469,'h'=>531,'i'=>250,'j'=>250,'k'=>458,'l'=>240,'m'=>802, + 'n'=>531,'o'=>500,'p'=>521,'q'=>521,'r'=>365,'s'=>333,'t'=>292,'u'=>521,'v'=>458,'w'=>677, + 'x'=>479,'y'=>458,'z'=>427,'{'=>480,'|'=>496,'}'=>480,'~'=>667} + + GB_widths={' '=>207,'!'=>270,'"'=>342,'#'=>467,'$'=>462,'%'=>797,'&'=>710,'\''=>239, + '('=>374,')'=>374,'*'=>423,'+'=>605,','=>238,'-'=>375,'.'=>238,'/'=>334,'0'=>462,'1'=>462, + '2'=>462,'3'=>462,'4'=>462,'5'=>462,'6'=>462,'7'=>462,'8'=>462,'9'=>462,':'=>238,';'=>238, + '<'=>605,'='=>605,'>'=>605,'?'=>344,'@'=>748,'A'=>684,'B'=>560,'C'=>695,'D'=>739,'E'=>563, + 'F'=>511,'G'=>729,'H'=>793,'I'=>318,'J'=>312,'K'=>666,'L'=>526,'M'=>896,'N'=>758,'O'=>772, + 'P'=>544,'Q'=>772,'R'=>628,'S'=>465,'T'=>607,'U'=>753,'V'=>711,'W'=>972,'X'=>647,'Y'=>620, + 'Z'=>607,'['=>374,'\\'=>333,']'=>374,'^'=>606,'_'=>500,'`'=>239,'a'=>417,'b'=>503,'c'=>427, + 'd'=>529,'e'=>415,'f'=>264,'g'=>444,'h'=>518,'i'=>241,'j'=>230,'k'=>495,'l'=>228,'m'=>793, + 'n'=>527,'o'=>524,'p'=>524,'q'=>504,'r'=>338,'s'=>336,'t'=>277,'u'=>517,'v'=>450,'w'=>652, + 'x'=>466,'y'=>452,'z'=>407,'{'=>370,'|'=>258,'}'=>370,'~'=>605} + + def AddCIDFont(family,style,name,cw,cMap,registry) +#ActionController::Base::logger.debug registry.to_a.join(":").to_s + fontkey=family.downcase+style.upcase + unless @fonts[fontkey].nil? + Error("Font already added: family style") + end + i=@fonts.length+1 + name=name.gsub(' ','') + @fonts[fontkey]={'i'=>i,'type'=>'Type0','name'=>name,'up'=>-130,'ut'=>40,'cw'=>cw, 'CMap'=>cMap,'registry'=>registry} + end + + def AddCIDFonts(family,name,cw,cMap,registry) + AddCIDFont(family,'',name,cw,cMap,registry) + AddCIDFont(family,'B',name+',Bold',cw,cMap,registry) + AddCIDFont(family,'I',name+',Italic',cw,cMap,registry) + AddCIDFont(family,'BI',name+',BoldItalic',cw,cMap,registry) + end + + def AddBig5Font(family='Big5',name='MSungStd-Light-Acro') + #Add Big5 font with proportional Latin + cw=Big5_widths + cMap='ETenms-B5-H' + registry={'ordering'=>'CNS1','supplement'=>0} +#ActionController::Base::logger.debug registry.to_a.join(":").to_s + AddCIDFonts(family,name,cw,cMap,registry) + end + + def AddBig5hwFont(family='Big5-hw',name='MSungStd-Light-Acro') + #Add Big5 font with half-witdh Latin + cw = {} + 32.upto(126) do |i| + cw[i.chr]=500 + end + cMap='ETen-B5-H' + registry={'ordering'=>'CNS1','supplement'=>0} + AddCIDFonts(family,name,cw,cMap,registry) + end + + def AddGBFont(family='GB',name='STSongStd-Light-Acro') + #Add GB font with proportional Latin + cw=GB_widths + cMap='GBKp-EUC-H' + registry={'ordering'=>'GB1','supplement'=>2} + AddCIDFonts(family,name,cw,cMap,registry) + end + + def AddGBhwFont(family='GB-hw',name='STSongStd-Light-Acro') + #Add GB font with half-width Latin + 32.upto(126) do |i| + cw[i.chr]=500 + end + cMap='GBK-EUC-H' + registry={'ordering'=>'GB1','supplement'=>2} + AddCIDFonts(family,name,cw,cMap,registry) + end + + def GetStringWidth(s) + if(@CurrentFont['type']=='Type0') + return GetMBStringWidth(s) + else + return super(s) + end + end + + def GetMBStringWidth(s) + #Multi-byte version of GetStringWidth() + l=0 + cw=@CurrentFont['cw'] + nb=s.length + i=0 + while(i0 and s[nb-1]=="\n") + nb-=1 + end + b=0 + if(border) + if(border==1) + border='LTRB' + b='LRT' + b2='LR' + else + b2='' + b2='L' unless border.to_s.index('L').nil? + b2=b2+'R' unless border.to_s.index('R').nil? + b=(border.to_s.index('T')) ? (b2+'T') : b2 + end + end + sep=-1 + i=0 + j=0 + l=0 + nl=1 + while(iwmax) + #Automatic line break + if(sep==-1 or i==j) + if(i==j) + i+=ascii ? 1 : 2 + end + Cell(w,h,s[j,i-j],b,2,align,fill) + else + Cell(w,h,s[j,sep-j],b,2,align,fill) + i=(s[sep].chr==' ') ? sep+1 : sep + end + sep=-1 + j=i + l=0 +# nl+=1 + if(border and nl==2) + b=b2 + end + else + i+=ascii ? 1 : 2 + end + end + #Last chunk + if(border and not border.to_s.index('B').nil?) + b+='B' + end + Cell(w,h,s[j,i-j],b,2,align,fill) + @x=@lMargin + end + + def Write(h,txt,link='') + if(@CurrentFont['type']=='Type0') + MBWrite(h,txt,link) + else + super(h,txt,link) + end + end + + def MBWrite(h,txt,link) + #Multi-byte version of Write() + cw=@CurrentFont['cw'] + w=@w-@rMargin-@x + wmax=(w-2*@cMargin)*1000/@FontSize + s=txt.gsub("\r",'') + nb=s.length + sep=-1 + i=0 + j=0 + l=0 + nl=1 + while(iwmax) + #Automatic line break + if(sep==-1 or i==j) + if(@x>@lMargin) + #Move to next line + @x=@lMargin + @y+=h + w=@w-@rMargin-@x + wmax=(w-2*@cMargin)*1000/@FontSize + i+=1 + nl+=1 + next + end + if(i==j) + i+=ascii ? 1 : 2 + end + Cell(w,h,s[j,i-j],0,2,'',0,link) + else + Cell(w,h,s[j,sep-j],0,2,'',0,link) + i=(s[sep].chr==' ') ? sep+1 : sep + end + sep=-1 + j=i + l=0 + if(nl==1) + @x=@lMargin + w=@w-@rMargin-@x + wmax=(w-2*@cMargin)*1000/@FontSize + end + nl+=1 + else + i+=ascii ? 1 : 2 + end + end + #Last chunk + if(i!=j) + Cell(l/1000*@FontSize,h,s[j,i-j],0,0,'',0,link) + end + end + +private + + def putfonts() + nf=@n + @diffs.each do |diff| + #Encodings + newobj() + out('<>') + out('endobj') + end + # mqr=get_magic_quotes_runtime() + # set_magic_quotes_runtime(0) + @FontFiles.each_pair do |file, info| + #Font file embedding + newobj() + @FontFiles[file]['n']=@n + if(defined('FPDF_FONTPATH')) + file=FPDF_FONTPATH+file + end + size=filesize(file) + if(!size) + Error('Font file not found') + end + out('<>') + f=fopen(file,'rb') + putstream(fread(f,size)) + fclose(f) + out('endobj') + end +# + # set_magic_quotes_runtime(mqr) +# + @fonts.each_pair do |k, font| + #Font objects + newobj() + @fonts[k]['n']=@n + out('<>') + out('endobj') + if(font['type']!='core') + #Widths + newobj() + cw=font['cw'] + s='[' + 32.upto(255) do |i| + s+=cw[i.chr]+' ' + end + out(s+']') + out('endobj') + #Descriptor + newobj() + s='<>') + out('endobj') + end + end + end + end + + def putType0(font) + #Type0 + out('/Subtype /Type0') + out('/BaseFont /'+font['name']+'-'+font['CMap']) + out('/Encoding /'+font['CMap']) + out('/DescendantFonts ['+(@n+1).to_s+' 0 R]') + out('>>') + out('endobj') + #CIDFont + newobj() + out('<>') + out('/FontDescriptor '+(@n+1).to_s+' 0 R') + if(font['CMap']=='ETen-B5-H') + w='13648 13742 500' + elsif(font['CMap']=='GBK-EUC-H') + w='814 907 500 7716 [500]' + else + # ActionController::Base::logger.debug font['cw'].keys.sort.join(' ').to_s + # ActionController::Base::logger.debug font['cw'].values.join(' ').to_s + w='1 [' + font['cw'].keys.sort.each {|key| + w+=font['cw'][key].to_s + " " +# ActionController::Base::logger.debug key.to_s +# ActionController::Base::logger.debug font['cw'][key].to_s + } + w +=']' + end + out('/W ['+w+']>>') + out('endobj') + #Font descriptor + newobj() + out('<>') + out('endobj') + end +end diff --git a/vendor/plugins/rfpdf/lib/rfpdf/fpdf_eps.rb b/vendor/plugins/rfpdf/lib/fpdf/fpdf_eps.rb similarity index 100% rename from vendor/plugins/rfpdf/lib/rfpdf/fpdf_eps.rb rename to vendor/plugins/rfpdf/lib/fpdf/fpdf_eps.rb diff --git a/vendor/plugins/rfpdf/lib/rfpdf/japanese.rb b/vendor/plugins/rfpdf/lib/fpdf/japanese.rb similarity index 96% rename from vendor/plugins/rfpdf/lib/rfpdf/japanese.rb rename to vendor/plugins/rfpdf/lib/fpdf/japanese.rb index 4e611a6f..93bc283c 100644 --- a/vendor/plugins/rfpdf/lib/rfpdf/japanese.rb +++ b/vendor/plugins/rfpdf/lib/fpdf/japanese.rb @@ -103,7 +103,7 @@ module PDF_Japanese o=s[i] if(o<128) #ASCII - l+=cw[o.chr] + l+=cw[o.chr] if cw[o.chr] i+=1 elsif(o>=161 and o<=223) #Half-width katakana @@ -146,13 +146,9 @@ module PDF_Japanese b2='LR' else b2='' - if(border.to_s.index('L')) - b2+='L' - end - if(border.to_s.index('R')) - b2+='R' - end - b=border.to_s.index('T') ? b2+'T' : b2 + b2='L' unless border.to_s.index('L').nil? + b2=b2+'R' unless border.to_s.index('R').nil? + b=(border.to_s.index('T')) ? (b2+'T') : b2 end end sep=-1 @@ -179,7 +175,7 @@ module PDF_Japanese end if(o<128) #ASCII - l+=cw[c.chr] + l+=cw[c.chr] || 0 n=1 if(o==32) sep=i @@ -204,7 +200,7 @@ module PDF_Japanese Cell(w,h,s[j,i-j],b,2,align,fill) else Cell(w,h,s[j,sep-j],b,2,align,fill) - i=(s[sep]==' ') ? sep+1 : sep + i=(s[sep].chr==' ') ? sep+1 : sep end sep=-1 j=i @@ -230,9 +226,9 @@ module PDF_Japanese def Write(h,txt,link='') if(@CurrentFont['type']=='Type0') - SJISWrite(h,txt,link) - else - super(h,txt,link) + SJISWrite(h,txt,link) + else + super(h,txt,link) end end @@ -270,7 +266,7 @@ module PDF_Japanese end if(o<128) #ASCII - l+=cw[c.chr] + l+=cw[c.chr] || 0 n=1 if(o==32) sep=i @@ -305,7 +301,7 @@ module PDF_Japanese Cell(w,h,s[j,i-j],0,2,'',0,link) else Cell(w,h,s[j,sep-j],0,2,'',0,link) - i=(s[sep]==' ') ? sep+1 : sep + i=(s[sep].chr==' ') ? sep+1 : sep end sep=-1 j=i diff --git a/vendor/plugins/rfpdf/lib/rfpdf/korean.rb b/vendor/plugins/rfpdf/lib/fpdf/korean.rb similarity index 92% rename from vendor/plugins/rfpdf/lib/rfpdf/korean.rb rename to vendor/plugins/rfpdf/lib/fpdf/korean.rb index 2b1f6de6..0d4ee3f6 100644 --- a/vendor/plugins/rfpdf/lib/rfpdf/korean.rb +++ b/vendor/plugins/rfpdf/lib/fpdf/korean.rb @@ -101,7 +101,7 @@ UHC_widths={' ' => 333, '!' => 416, '"' => 416, '#' => 833, '$' => 625, '%' => 9 while(i 333, '!' => 416, '"' => 416, '#' => 833, '$' => 625, '%' => 9 b2='LR' else b2='' - if(border.to_s.index('L').nil?) - b2+='L' - end - if(border.to_s.index('R').nil?) - b2+='R' - end - b=border.to_s.index('T').nil? ? b2+'T' : b2 + b2='L' unless border.to_s.index('L').nil? + b2=b2+'R' unless border.to_s.index('R').nil? + b=(border.to_s.index('T')) ? (b2+'T') : b2 end end sep=-1 @@ -158,7 +154,7 @@ UHC_widths={' ' => 333, '!' => 416, '"' => 416, '#' => 833, '$' => 625, '%' => 9 c=s[i] #Check if ASCII or MB ascii=(c<128) - if(c=="\n") + if(c.chr=="\n") #Explicit line break Cell(w,h,s[j,i-j],b,2,align,fill) i+=1 @@ -174,7 +170,7 @@ UHC_widths={' ' => 333, '!' => 416, '"' => 416, '#' => 833, '$' => 625, '%' => 9 if(!ascii) sep=i ls=l - elsif(c==' ') + elsif(c.chr==' ') sep=i ls=l end @@ -188,7 +184,7 @@ UHC_widths={' ' => 333, '!' => 416, '"' => 416, '#' => 833, '$' => 625, '%' => 9 Cell(w,h,s[j,i-j],b,2,align,fill) else Cell(w,h,s[j,sep-j],b,2,align,fill) - i=(s[sep]==' ') ? sep+1 : sep + i=(s[sep].chr==' ') ? sep+1 : sep end sep=-1 j=i @@ -234,7 +230,7 @@ UHC_widths={' ' => 333, '!' => 416, '"' => 416, '#' => 833, '$' => 625, '%' => 9 c=s[i] #Check if ASCII or MB ascii=(c<128) - if(c=="\n") + if(c.chr=="\n") #Explicit line break Cell(w,h,s[j,i-j],0,2,'',0,link) i+=1 @@ -249,10 +245,10 @@ UHC_widths={' ' => 333, '!' => 416, '"' => 416, '#' => 833, '$' => 625, '%' => 9 nl+=1 next end - if(!ascii or c==' ') + if(!ascii or c.chr==' ') sep=i end - l+=ascii ? cw[c.chr] : 1000 + l+=(ascii ? cw[c.chr] : 1000) || 0 if(l>wmax) #Automatic line break if(sep==-1 or i==j) @@ -272,7 +268,7 @@ UHC_widths={' ' => 333, '!' => 416, '"' => 416, '#' => 833, '$' => 625, '%' => 9 Cell(w,h,s[j,i-j],0,2,'',0,link) else Cell(w,h,s[j,sep-j],0,2,'',0,link) - i=(s[sep]==' ') ? sep+1 : sep + i=(s[sep].chr==' ') ? sep+1 : sep end sep=-1 j=i diff --git a/vendor/plugins/rfpdf/lib/rfpdf/makefont.rb b/vendor/plugins/rfpdf/lib/fpdf/makefont.rb similarity index 99% rename from vendor/plugins/rfpdf/lib/rfpdf/makefont.rb rename to vendor/plugins/rfpdf/lib/fpdf/makefont.rb index bda7a70e..ffc98b48 100644 --- a/vendor/plugins/rfpdf/lib/rfpdf/makefont.rb +++ b/vendor/plugins/rfpdf/lib/fpdf/makefont.rb @@ -1699,7 +1699,7 @@ def MakeFont(fontfile, afmfile, enc = 'cp1252', patch = {}, type = 'TrueType') s += " def FontDef.cw\n#{w}\n end\n" s += " def FontDef.enc\n '#{enc}'\n end\n" - s += " def FontDef.diff\n #{(diff == nil) || (diff == '') ? 'nil' : '\'' + diff + '\''}\n end\n" + s += " def FontDef.diff\n #{(diff == nil) || (diff == '') ? 'nil' : '\'' + diff '\''}\n end\n" basename = File.basename(afmfile, '.*') diff --git a/vendor/plugins/rfpdf/lib/rfpdf.rb b/vendor/plugins/rfpdf/lib/rfpdf.rb index 9fc0683e..e57679d5 100644 --- a/vendor/plugins/rfpdf/lib/rfpdf.rb +++ b/vendor/plugins/rfpdf/lib/rfpdf.rb @@ -20,12 +20,21 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -$LOAD_PATH.unshift(File.dirname(__FILE__)) +require 'action_controller' +require 'action_view' -require 'rfpdf/errors' -require 'rfpdf/view' -require 'rfpdf/fpdf' -require 'rfpdf/rfpdf' -require 'rfpdf/chinese' -require 'rfpdf/japanese' -require 'rfpdf/korean' +require 'rfpdf/action_controller' +require 'rfpdf/action_view' + +require 'rfpdf/template_handler/compile_support' + +require 'rfpdf/template_handlers/base' + + +class ActionController::Base + include RFPDF::ActionController +end + +class ActionView::Base + include RFPDF::ActionView +end diff --git a/vendor/plugins/rfpdf/lib/rfpdf/action_controller.rb b/vendor/plugins/rfpdf/lib/rfpdf/action_controller.rb new file mode 100644 index 00000000..905fc704 --- /dev/null +++ b/vendor/plugins/rfpdf/lib/rfpdf/action_controller.rb @@ -0,0 +1,40 @@ +module RFPDF + module ActionController + + DEFAULT_RFPDF_OPTIONS = {:inline=>true} + + def self.included(base) + base.extend ClassMethods + end + + module ClassMethods + def rfpdf(options) + rfpdf_options = breakdown_rfpdf_options options + write_inheritable_hash(:rfpdf, rfpdf_options) + end + + private + + def breakdown_rfpdf_options(options) + rfpdf_options = options.dup + rfpdf_options + end + end + + def rfpdf(options) + @rfpdf_options ||= DEFAULT_RFPDF_OPTIONS.dup + @rfpdf_options.merge! options + end + + + private + + def compute_rfpdf_options + @rfpdf_options ||= DEFAULT_RFPDF_OPTIONS.dup + @rfpdf_options.merge!(self.class.read_inheritable_attribute(:rfpdf) || {}) {|k,o,n| o} + @rfpdf_options + end + end +end + + diff --git a/vendor/plugins/rfpdf/lib/rfpdf/action_view.rb b/vendor/plugins/rfpdf/lib/rfpdf/action_view.rb new file mode 100644 index 00000000..9836472d --- /dev/null +++ b/vendor/plugins/rfpdf/lib/rfpdf/action_view.rb @@ -0,0 +1,12 @@ +module RFPDF + module ActionView + + private + def _rfpdf_compile_setup(dsl_setup = false) + compile_support = RFPDF::TemplateHandler::CompileSupport.new(controller) + @rfpdf_options = compile_support.options + end + + end +end + diff --git a/vendor/plugins/rfpdf/lib/rfpdf/errors.rb b/vendor/plugins/rfpdf/lib/rfpdf/errors.rb index 2be2dae1..b1bc068b 100644 --- a/vendor/plugins/rfpdf/lib/rfpdf/errors.rb +++ b/vendor/plugins/rfpdf/lib/rfpdf/errors.rb @@ -1,4 +1,6 @@ module RFPDF - class GenerationError < StandardError #:nodoc: + module Errors + class GenerationError < StandardError #:nodoc: + end end end \ No newline at end of file diff --git a/vendor/plugins/rfpdf/lib/rfpdf/fpdf.rb b/vendor/plugins/rfpdf/lib/rfpdf/fpdf.rb index c41174f6..30714fa3 100644 --- a/vendor/plugins/rfpdf/lib/rfpdf/fpdf.rb +++ b/vendor/plugins/rfpdf/lib/rfpdf/fpdf.rb @@ -16,13 +16,18 @@ # Bookmarks contributed by Sylvain Lafleur. # # 1.53 contributed by Ed Moss -# Handle '\n' at the beginning of a string +# Make sure all \n references are inside double quotes - Fix some multicell bugs +# Handle "\n" at the beginning of a string # Bookmarks contributed by Sylvain Lafleur. require 'date' require 'zlib' class FPDF + include RFPDF + + attr_accessor :default_font + FPDF_VERSION = '1.53d' Charwidths = { @@ -63,6 +68,7 @@ class FPDF @pages=[] @OrientationChanges=[] @state=0 + @default_font = "arial" @fonts={} @FontFiles={} @diffs=[] @@ -169,6 +175,10 @@ class FPDF @PDFVersion='1.3' end + def GetMargins() + return @lMargin, @tMargin, @rMargin + end + def SetMargins(left, top, right=-1) # Set left, top and right margins @lMargin=left @@ -334,6 +344,7 @@ class FPDF @TextColor=tc @ColorFlag=cf end + alias_method :add_page, :AddPage def Header # To be implemented in your inherited class @@ -403,6 +414,70 @@ class FPDF out(sprintf('%.2f w',width*@k)) if @page>0 end + def Circle(mid_x, mid_y, radius, style='') + mid_y = (@h-mid_y)*@k + out(sprintf("q\n")) # postscript content in pdf + # init line type etc. with /GSD gs G g (grey) RG rg (RGB) w=line witdh etc. + out(sprintf("1 j\n")) # line join + # translate ("move") circle to mid_y, mid_y + out(sprintf("1 0 0 1 %f %f cm", mid_x, mid_y)) + kappa = 0.5522847498307933984022516322796 + # Quadrant 1 + x_s = 0.0 # 12 o'clock + y_s = 0.0 + radius + x_e = 0.0 + radius # 3 o'clock + y_e = 0.0 + out(sprintf("%f %f m\n", x_s, y_s)) # move to 12 o'clock + # cubic bezier control point 1, start height and kappa * radius to the right + bx_e1 = x_s + (radius * kappa) + by_e1 = y_s + # cubic bezier control point 2, end and kappa * radius above + bx_e2 = x_e + by_e2 = y_e + (radius * kappa) + # draw cubic bezier from current point to x_e/y_e with bx_e1/by_e1 and bx_e2/by_e2 as bezier control points + out(sprintf("%f %f %f %f %f %f c\n", bx_e1, by_e1, bx_e2, by_e2, x_e, y_e)) + # Quadrant 2 + x_s = x_e + y_s = y_e # 3 o'clock + x_e = 0.0 + y_e = 0.0 - radius # 6 o'clock + bx_e1 = x_s # cubic bezier point 1 + by_e1 = y_s - (radius * kappa) + bx_e2 = x_e + (radius * kappa) # cubic bezier point 2 + by_e2 = y_e + out(sprintf("%f %f %f %f %f %f c\n", bx_e1, by_e1, bx_e2, by_e2, x_e, y_e)) + # Quadrant 3 + x_s = x_e + y_s = y_e # 6 o'clock + x_e = 0.0 - radius + y_e = 0.0 # 9 o'clock + bx_e1 = x_s - (radius * kappa) # cubic bezier point 1 + by_e1 = y_s + bx_e2 = x_e # cubic bezier point 2 + by_e2 = y_e - (radius * kappa) + out(sprintf("%f %f %f %f %f %f c\n", bx_e1, by_e1, bx_e2, by_e2, x_e, y_e)) + # Quadrant 4 + x_s = x_e + y_s = y_e # 9 o'clock + x_e = 0.0 + y_e = 0.0 + radius # 12 o'clock + bx_e1 = x_s # cubic bezier point 1 + by_e1 = y_s + (radius * kappa) + bx_e2 = x_e - (radius * kappa) # cubic bezier point 2 + by_e2 = y_e + out(sprintf("%f %f %f %f %f %f c\n", bx_e1, by_e1, bx_e2, by_e2, x_e, y_e)) + if style=='F' + op='f' + elsif style=='FD' or style=='DF' + op='b' + else + op='s' + end + out(sprintf("#{op}\n")) # stroke circle, do not fill and close path + # for filling etc. b, b*, f, f* + out(sprintf("Q\n")) # finish postscript in PDF + end + def Line(x1, y1, x2, y2) # Draw a line out(sprintf('%.2f %.2f m %.2f %.2f l S', @@ -418,6 +493,7 @@ class FPDF else op='S' end + # x y width height re out(sprintf('%.2f %.2f %.2f %.2f re %s', x*@k,(@h-y)*@k,w*@k,-h*@k,op)) end @@ -580,9 +656,17 @@ class FPDF @AutoPageBreak end + def BreakThePage?(h) + if (@y + h) > @PageBreakTrigger and !@InFooter and self.AcceptPageBreak + true + else + false + end + end + def Cell(w,h=0,txt='',border=0,ln=0,align='',fill=0,link='') # Output a cell - if @y+h>@PageBreakTrigger and !@InFooter and self.AcceptPageBreak + if self.BreakThePage?(h) # Automatic page break x=@x ws=@ws @@ -665,9 +749,9 @@ class FPDF cw=@CurrentFont['cw'] w=@w-@rMargin-@x if w==0 wmax=(w-2*@cMargin)*1000/@FontSize - s=txt.gsub('\r','') + s=txt.gsub("\r",'') nb=s.length - nb=nb-1 if nb>0 and s[nb-1].chr=='\n' + nb=nb-1 if nb>0 and s[nb-1].chr=="\n" b=0 if border!=0 if border==1 @@ -682,70 +766,66 @@ class FPDF end end sep=-1 - i=0 - j=0 + to_index=0 + from_j=0 l=0 ns=0 nl=1 - while i0 @ws=0 out('0 Tw') end #Ed Moss -# Don't let i go negative - end_i = i == 0 ? 0 : i - 1 - # Changed from s[j..i] to fix bug reported by Hans Allis. - self.Cell(w,h,s[j..end_i],b,2,align,fill) + end_i = to_index == 0 ? 0 : to_index - 1 + # Changed from s[from_j..to_index] to fix bug reported by Hans Allis. + self.Cell(w,h,s[from_j..end_i],b,2,align,fill) # - i=i+1 + to_index=to_index+1 sep=-1 - j=i + from_j=to_index l=0 ns=0 nl=nl+1 b=b2 if border and nl==2 else - if c==' ' - sep=i + if char==' '[0] + sep=to_index ls=l ns=ns+1 end - l=l+GetCharWidth(cw, c[0]) + l=l+GetCharWidth(cw, char) if l>wmax # Automatic line break if sep==-1 - i=i+1 if i==j + to_index=to_index+1 if to_index==from_j if @ws>0 @ws=0 out('0 Tw') end - self.Cell(w,h,s[j..i],b,2,align,fill) #Ed Moss -# Added so that it wouldn't print the last character of the string if it got close -#FIXME 2006-07-18 Level=0 - but it still puts out an extra new line - i += 1 + self.Cell(w,h,s[from_j..to_index-1],b,2,align,fill) # else if align=='J' @ws=(ns>1) ? (wmax-ls)/1000.0*@FontSize/(ns-1) : 0 out(sprintf('%.3f Tw',@ws*@k)) end - self.Cell(w,h,s[j..sep],b,2,align,fill) - i=sep+1 + self.Cell(w,h,s[from_j..sep],b,2,align,fill) + to_index=sep+1 end sep=-1 - j=i + from_j=to_index l=0 ns=0 nl=nl+1 b=b2 if border and nl==2 else - i=i+1 + to_index=to_index+1 end end end @@ -756,7 +836,7 @@ class FPDF out('0 Tw') end b=b+'B' if border!=0 and not border.index('B').nil? - self.Cell(w,h,s[j..i],b,2,align,fill) + self.Cell(w,h,s[from_j..to_index],b,2,align,fill) @x=@lMargin end @@ -1273,7 +1353,7 @@ class FPDF out('startxref') out(o) out('%%EOF') - state=3 + @state=3 end def beginpage(orientation) diff --git a/vendor/plugins/rfpdf/lib/rfpdf/math.rb b/vendor/plugins/rfpdf/lib/rfpdf/math.rb new file mode 100644 index 00000000..f339af26 --- /dev/null +++ b/vendor/plugins/rfpdf/lib/rfpdf/math.rb @@ -0,0 +1,90 @@ +# Various mathematical calculations extracted from the PDF::Writer for Ruby gem. +# - http://rubyforge.org/projects/ruby-pdf +# - Copyright 2003 - 2005 Austin Ziegler. +# - Licensed under a MIT-style licence. +# + +module RFPDF::Math + PI2 = ::Math::PI * 2.0 + + # One degree of arc measured in terms of radians. + DR = PI2 / 360.0 + # One radian of arc, measured in terms of degrees. + RD = 360 / PI2 + # One degree of arc, measured in terms of gradians. + DG = 400 / 360.0 + # One gradian of arc, measured in terms of degrees. + GD = 360 / 400.0 + # One radian of arc, measured in terms of gradians. + RG = 400 / PI2 + # One gradian of arc, measured in terms of radians. + GR = PI2 / 400.0 + + # Truncate the remainder. + def remt(num, den) + num - den * (num / den.to_f).to_i + end + + # Wrap radian values within the range of radians (0..PI2). + def rad2rad(rad) + remt(rad, PI2) + end + + # Wrap degree values within the range of degrees (0..360). + def deg2deg(deg) + remt(deg, 360) + end + + # Wrap gradian values within the range of gradians (0..400). + def grad2grad(grad) + remt(grad, 400) + end + + # Convert degrees to radians. The value will be constrained to the + # range of radians (0..PI2) unless +wrap+ is false. + def deg2rad(deg, wrap = true) + rad = DR * deg + rad = rad2rad(rad) if wrap + rad + end + + # Convert degrees to gradians. The value will be constrained to the + # range of gradians (0..400) unless +wrap+ is false. + def deg2grad(deg, wrap = true) + grad = DG * deg + grad = grad2grad(grad) if wrap + grad + end + + # Convert radians to degrees. The value will be constrained to the + # range of degrees (0..360) unless +wrap+ is false. + def rad2deg(rad, wrap = true) + deg = RD * rad + deg = deg2deg(deg) if wrap + deg + end + + # Convert radians to gradians. The value will be constrained to the + # range of gradians (0..400) unless +wrap+ is false. + def rad2grad(rad, wrap = true) + grad = RG * rad + grad = grad2grad(grad) if wrap + grad + end + + # Convert gradians to degrees. The value will be constrained to the + # range of degrees (0..360) unless +wrap+ is false. + def grad2deg(grad, wrap = true) + deg = GD * grad + deg = deg2deg(deg) if wrap + deg + end + + # Convert gradians to radians. The value will be constrained to the + # range of radians (0..PI2) unless +wrap+ is false. + def grad2rad(grad, wrap = true) + rad = GR * grad + rad = rad2rad(rad) if wrap + rad + end +end diff --git a/vendor/plugins/rfpdf/lib/rfpdf/template_handler/compile_support.rb b/vendor/plugins/rfpdf/lib/rfpdf/template_handler/compile_support.rb new file mode 100644 index 00000000..b0129f08 --- /dev/null +++ b/vendor/plugins/rfpdf/lib/rfpdf/template_handler/compile_support.rb @@ -0,0 +1,73 @@ +module RFPDF + module TemplateHandler + + class CompileSupport + # extend ActiveSupport::Memoizable + + attr_reader :options + + def initialize(controller) + @controller = controller + @options = pull_options + set_headers + end + + def pull_options + @controller.send :compute_rfpdf_options || {} + end + + def set_headers + set_pragma + set_cache_control + set_content_type + set_disposition + end + + # TODO: kept around from railspdf-- maybe not needed anymore? should check. + def ie_request? + @controller.request.env['HTTP_USER_AGENT'] =~ /msie/i + end + # memoize :ie_request? + + # added to make ie happy with ssl pdf's (per naisayer) + def ssl_request? + # @controller.request.env['SERVER_PROTOCOL'].downcase == "https" + @controller.request.ssl? + end + # memoize :ssl_request? + + # TODO: kept around from railspdf-- maybe not needed anymore? should check. + def set_pragma + if ssl_request? && ie_request? + @controller.headers['Pragma'] = 'public' # added to make ie ssl pdfs work (per naisayer) + else + @controller.headers['Pragma'] ||= ie_request? ? 'no-cache' : '' + end + end + + # TODO: kept around from railspdf-- maybe not needed anymore? should check. + def set_cache_control + if ssl_request? && ie_request? + @controller.headers['Cache-Control'] = 'maxage=1' # added to make ie ssl pdfs work (per naisayer) + else + @controller.headers['Cache-Control'] ||= ie_request? ? 'no-cache, must-revalidate' : '' + end + end + + def set_content_type + @controller.response.content_type ||= Mime::PDF + end + + def set_disposition + inline = options[:inline] ? 'inline' : 'attachment' + filename = options[:filename] ? "filename=#{options[:filename]}" : nil + @controller.headers["Content-Disposition"] = [inline,filename].compact.join(';') + end + + end + + end +end + + + diff --git a/vendor/plugins/rfpdf/lib/rfpdf/template_handlers/base.rb b/vendor/plugins/rfpdf/lib/rfpdf/template_handlers/base.rb new file mode 100644 index 00000000..11b72c8f --- /dev/null +++ b/vendor/plugins/rfpdf/lib/rfpdf/template_handlers/base.rb @@ -0,0 +1,12 @@ +module RFPDF + module TemplateHandlers + class Base < ::ActionView::TemplateHandlers::ERB + + def compile(template) + src = "_rfpdf_compile_setup;" + super + end + end + end +end + + diff --git a/vendor/plugins/rfpdf/lib/rfpdf/view.rb b/vendor/plugins/rfpdf/lib/rfpdf/view.rb deleted file mode 100644 index 6b626733..00000000 --- a/vendor/plugins/rfpdf/lib/rfpdf/view.rb +++ /dev/null @@ -1,85 +0,0 @@ -# Copyright (c) 2006 4ssoM LLC -# -# The MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. -# -# Thanks go out to Bruce Williams of codefluency who created RTex. This -# template handler is modification of his work. -# -# Example Registration -# -# ActionView::Base::register_template_handler 'rfpdf', RFpdfView - -module RFPDF - - class View - @@backward_compatibility_mode = false - cattr_accessor :backward_compatibility_mode - - def initialize(action_view) - @action_view = action_view - # Override with @options_for_rfpdf Hash in your controller - @options = { - # Run through latex first? (for table of contents, etc) - :pre_process => false, - # Debugging mode; raises exception - :debug => false, - # Filename of pdf to generate - :file_name => "#{@action_view.controller.action_name}.pdf", - # Temporary Directory - :temp_dir => "#{File.expand_path(RAILS_ROOT)}/tmp" - }.merge(@action_view.controller.instance_eval{ @options_for_rfpdf } || {}).with_indifferent_access - end - - def self.compilable? - false - end - - def compilable? - self.class.compilable? - end - - def render(template, local_assigns = {}) - @pdf_name = "Default.pdf" if @pdf_name.nil? - unless @action_view.controller.headers["Content-Type"] == 'application/pdf' - @generate = true - @action_view.controller.headers["Content-Type"] = 'application/pdf' - @action_view.controller.headers["Content-disposition:"] = "inline; filename=\"#{@options[:file_name]}\"" - end - assigns = @action_view.assigns.dup - - if content_for_layout = @action_view.instance_variable_get("@content_for_layout") - assigns['content_for_layout'] = content_for_layout - end - - result = @action_view.instance_eval do - assigns.each do |key,val| - instance_variable_set "@#{key}", val - end - local_assigns.each do |key,val| - class << self; self; end.send(:define_method,key){ val } - end - ERB.new(@@backward_compatibility_mode == true ? template : template.source).result(binding) - end - end - - end - -end \ No newline at end of file diff --git a/vendor/plugins/rfpdf/lib/tcpdf.rb b/vendor/plugins/rfpdf/lib/tcpdf.rb new file mode 100755 index 00000000..1e444305 --- /dev/null +++ b/vendor/plugins/rfpdf/lib/tcpdf.rb @@ -0,0 +1,3826 @@ +#============================================================+ +# File name : tcpdf.rb +# Begin : 2002-08-03 +# Last Update : 2007-03-20 +# Author : Nicola Asuni +# Version : 1.53.0.TC031 +# License : GNU LGPL (http://www.gnu.org/copyleft/lesser.html) +# +# Description : This is a Ruby class for generating PDF files +# on-the-fly without requiring external +# extensions. +# +# IMPORTANT: +# This class is an extension and improvement of the Public Domain +# FPDF class by Olivier Plathey (http://www.fpdf.org). +# +# Main changes by Nicola Asuni: +# Ruby porting; +# UTF-8 Unicode support; +# code refactoring; +# source code clean up; +# code style and formatting; +# source code documentation using phpDocumentor (www.phpdoc.org); +# All ISO page formats were included; +# image scale factor; +# includes methods to parse and printsome XHTML code, supporting the following elements: h1, h2, h3, h4, h5, h6, b, u, i, a, img, p, br, strong, em, font, blockquote, li, ul, ol, hr, td, th, tr, table, sup, sub, small; +# includes a method to print various barcode formats using an improved version of "Generic Barcode Render Class" by Karim Mribti (http://www.mribti.com/barcode/) (require GD library: http://www.boutell.com/gd/); +# defines standard Header() and Footer() methods. +# +# Ported to Ruby by Ed Moss 2007-08-06 +# +#============================================================+ + +# +# TCPDF Class. +# @package com.tecnick.tcpdf +# + +@@version = "1.53.0.TC031" +@@fpdf_charwidths = {} + +PDF_PRODUCER = 'TCPDF via RFPDF 1.53.0.TC031 (http://tcpdf.sourceforge.net)' + +module TCPDFFontDescriptor + @@descriptors = { 'freesans' => {} } + @@font_name = 'freesans' + + def self.font(font_name) + @@descriptors[font_name.gsub(".rb", "")] + end + + def self.define(font_name = 'freesans') + @@descriptors[font_name] ||= {} + yield @@descriptors[font_name] + end +end + +# This is a Ruby class for generating PDF files on-the-fly without requiring external extensions.
    +# This class is an extension and improvement of the FPDF class by Olivier Plathey (http://www.fpdf.org).
    +# This version contains some changes: [porting to Ruby, support for UTF-8 Unicode, code style and formatting, php documentation (www.phpdoc.org), ISO page formats, minor improvements, image scale factor]
    +# TCPDF project (http://tcpdf.sourceforge.net) is based on the Public Domain FPDF class by Olivier Plathey (http://www.fpdf.org).
    +# To add your own TTF fonts please read /fonts/README.TXT +# @name TCPDF +# @package com.tecnick.tcpdf +# @@version 1.53.0.TC031 +# @author Nicola Asuni +# @link http://tcpdf.sourceforge.net +# @license http://www.gnu.org/copyleft/lesser.html LGPL +# +class TCPDF + include RFPDF + include Core::RFPDF + include RFPDF::Math + + cattr_accessor :k_cell_height_ratio + @@k_cell_height_ratio = 1.25 + + cattr_accessor :k_blank_image + @@k_blank_image = "" + + cattr_accessor :k_small_ratio + @@k_small_ratio = 2/3.0 + + cattr_accessor :k_path_cache + @@k_path_cache = File.join(RAILS_ROOT, 'tmp') + + cattr_accessor :k_path_url_cache + @@k_path_url_cache = File.join(RAILS_ROOT, 'tmp') + + cattr_accessor :decoder + + attr_accessor :barcode + + attr_accessor :buffer + + attr_accessor :diffs + + attr_accessor :color_flag + + attr_accessor :default_table_columns + + attr_accessor :default_font + + attr_accessor :draw_color + + attr_accessor :encoding + + attr_accessor :fill_color + + attr_accessor :fonts + + attr_accessor :font_family + + attr_accessor :font_files + + cattr_accessor :font_path + + attr_accessor :font_style + + attr_accessor :font_size_pt + + attr_accessor :header_width + + attr_accessor :header_logo + + attr_accessor :header_logo_width + + attr_accessor :header_title + + attr_accessor :header_string + + attr_accessor :images + + attr_accessor :img_scale + + attr_accessor :in_footer + + attr_accessor :is_unicode + + attr_accessor :lasth + + attr_accessor :links + + attr_accessor :listordered + + attr_accessor :listcount + + attr_accessor :lispacer + + attr_accessor :n + + attr_accessor :offsets + + attr_accessor :orientation_changes + + attr_accessor :page + + attr_accessor :page_links + + attr_accessor :pages + + attr_accessor :pdf_version + + attr_accessor :prevfill_color + + attr_accessor :prevtext_color + + attr_accessor :print_header + + attr_accessor :print_footer + + attr_accessor :state + + attr_accessor :tableborder + + attr_accessor :tdbegin + + attr_accessor :tdwidth + + attr_accessor :tdheight + + attr_accessor :tdalign + + attr_accessor :tdfill + + attr_accessor :tempfontsize + + attr_accessor :text_color + + attr_accessor :underline + + attr_accessor :ws + + # + # This is the class constructor. + # It allows to set up the page format, the orientation and + # the measure unit used in all the methods (except for the font sizes). + # @since 1.0 + # @param string :orientation page orientation. Possible values are (case insensitive):
    • P or Portrait (default)
    • L or Landscape
    + # @param string :unit User measure unit. Possible values are:
    • pt: point
    • mm: millimeter (default)
    • cm: centimeter
    • in: inch

    A point equals 1/72 of inch, that is to say about 0.35 mm (an inch being 2.54 cm). This is a very common unit in typography; font sizes are expressed in that unit. + # @param mixed :format The format used for pages. It can be either one of the following values (case insensitive) or a custom format in the form of a two-element array containing the width and the height (expressed in the unit given by unit).
    • 4A0
    • 2A0
    • A0
    • A1
    • A2
    • A3
    • A4 (default)
    • A5
    • A6
    • A7
    • A8
    • A9
    • A10
    • B0
    • B1
    • B2
    • B3
    • B4
    • B5
    • B6
    • B7
    • B8
    • B9
    • B10
    • C0
    • C1
    • C2
    • C3
    • C4
    • C5
    • C6
    • C7
    • C8
    • C9
    • C10
    • RA0
    • RA1
    • RA2
    • RA3
    • RA4
    • SRA0
    • SRA1
    • SRA2
    • SRA3
    • SRA4
    • LETTER
    • LEGAL
    • EXECUTIVE
    • FOLIO
    + # @param boolean :unicode TRUE means that the input text is unicode (default = true) + # @param String :encoding charset encoding; default is UTF-8 + # + def initialize(orientation = 'P', unit = 'mm', format = 'A4', unicode = true, encoding = "UTF-8") + + # Set internal character encoding to ASCII# + #FIXME 2007-05-25 (EJM) Level=0 - + # if (respond_to?("mb_internal_encoding") and mb_internal_encoding()) + # @internal_encoding = mb_internal_encoding(); + # mb_internal_encoding("ASCII"); + # } + + #Some checks + dochecks(); + + begin + @@decoder = HTMLEntities.new + rescue + @@decoder = nil + end + + #Initialization of properties + @barcode ||= false + @buffer ||= '' + @diffs ||= [] + @color_flag ||= false + @default_table_columns ||= 4 + @default_font ||= "FreeSans" if unicode + @default_font ||= "Helvetica" + @draw_color ||= '0 G' + @encoding ||= "UTF-8" + @fill_color ||= '0 g' + @fonts ||= {} + @font_family ||= '' + @font_files ||= {} + @font_style ||= '' + @font_size ||= 12 + @font_size_pt ||= 12 + @header_width ||= 0 + @header_logo ||= "" + @header_logo_width ||= 30 + @header_title ||= "" + @header_string ||= "" + @images ||= {} + @img_scale ||= 1 + @in_footer ||= false + @is_unicode = unicode + @lasth ||= 0 + @links ||= [] + @listordered ||= false + @listcount ||= 0 + @lispacer ||= "" + @n ||= 2 + @offsets ||= [] + @orientation_changes ||= [] + @page ||= 0 + @page_links ||= {} + @pages ||= [] + @pdf_version ||= "1.3" + @prevfill_color ||= [255,255,255] + @prevtext_color ||= [0,0,0] + @print_header ||= false + @print_footer ||= false + @state ||= 0 + @tableborder ||= 0 + @tdbegin ||= false + @tdwidth ||= 0 + @tdheight ||= 0 + @tdalign ||= "L" + @tdfill ||= 0 + @tempfontsize ||= 10 + @text_color ||= '0 g' + @underline ||= false + @ws ||= 0 + + #Standard Unicode fonts + @core_fonts = { + 'courier'=>'Courier', + 'courierB'=>'Courier-Bold', + 'courierI'=>'Courier-Oblique', + 'courierBI'=>'Courier-BoldOblique', + 'helvetica'=>'Helvetica', + 'helveticaB'=>'Helvetica-Bold', + 'helveticaI'=>'Helvetica-Oblique', + 'helveticaBI'=>'Helvetica-BoldOblique', + 'times'=>'Times-Roman', + 'timesB'=>'Times-Bold', + 'timesI'=>'Times-Italic', + 'timesBI'=>'Times-BoldItalic', + 'symbol'=>'Symbol', + 'zapfdingbats'=>'ZapfDingbats'} + + #Scale factor + case unit.downcase + when 'pt' ; @k=1 + when 'mm' ; @k=72/25.4 + when 'cm' ; @k=72/2.54 + when 'in' ; @k=72 + else Error("Incorrect unit: #{unit}") + end + + #Page format + if format.is_a?(String) + # Page formats (45 standard ISO paper formats and 4 american common formats). + # Paper cordinates are calculated in this way: (inches# 72) where (1 inch = 2.54 cm) + case (format.upcase) + when '4A0' ; format = [4767.87,6740.79] + when '2A0' ; format = [3370.39,4767.87] + when 'A0' ; format = [2383.94,3370.39] + when 'A1' ; format = [1683.78,2383.94] + when 'A2' ; format = [1190.55,1683.78] + when 'A3' ; format = [841.89,1190.55] + when 'A4' ; format = [595.28,841.89] # ; default + when 'A5' ; format = [419.53,595.28] + when 'A6' ; format = [297.64,419.53] + when 'A7' ; format = [209.76,297.64] + when 'A8' ; format = [147.40,209.76] + when 'A9' ; format = [104.88,147.40] + when 'A10' ; format = [73.70,104.88] + when 'B0' ; format = [2834.65,4008.19] + when 'B1' ; format = [2004.09,2834.65] + when 'B2' ; format = [1417.32,2004.09] + when 'B3' ; format = [1000.63,1417.32] + when 'B4' ; format = [708.66,1000.63] + when 'B5' ; format = [498.90,708.66] + when 'B6' ; format = [354.33,498.90] + when 'B7' ; format = [249.45,354.33] + when 'B8' ; format = [175.75,249.45] + when 'B9' ; format = [124.72,175.75] + when 'B10' ; format = [87.87,124.72] + when 'C0' ; format = [2599.37,3676.54] + when 'C1' ; format = [1836.85,2599.37] + when 'C2' ; format = [1298.27,1836.85] + when 'C3' ; format = [918.43,1298.27] + when 'C4' ; format = [649.13,918.43] + when 'C5' ; format = [459.21,649.13] + when 'C6' ; format = [323.15,459.21] + when 'C7' ; format = [229.61,323.15] + when 'C8' ; format = [161.57,229.61] + when 'C9' ; format = [113.39,161.57] + when 'C10' ; format = [79.37,113.39] + when 'RA0' ; format = [2437.80,3458.27] + when 'RA1' ; format = [1729.13,2437.80] + when 'RA2' ; format = [1218.90,1729.13] + when 'RA3' ; format = [864.57,1218.90] + when 'RA4' ; format = [609.45,864.57] + when 'SRA0' ; format = [2551.18,3628.35] + when 'SRA1' ; format = [1814.17,2551.18] + when 'SRA2' ; format = [1275.59,1814.17] + when 'SRA3' ; format = [907.09,1275.59] + when 'SRA4' ; format = [637.80,907.09] + when 'LETTER' ; format = [612.00,792.00] + when 'LEGAL' ; format = [612.00,1008.00] + when 'EXECUTIVE' ; format = [521.86,756.00] + when 'FOLIO' ; format = [612.00,936.00] + #else then Error("Unknown page format: #{format}" + end + @fw_pt = format[0] + @fh_pt = format[1] + else + @fw_pt = format[0]*@k + @fh_pt = format[1]*@k + end + + @fw = @fw_pt/@k + @fh = @fh_pt/@k + + #Page orientation + orientation = orientation.downcase + if orientation == 'p' or orientation == 'portrait' + @def_orientation = 'P' + @w_pt = @fw_pt + @h_pt = @fh_pt + elsif orientation == 'l' or orientation == 'landscape' + @def_orientation = 'L' + @w_pt = @fh_pt + @h_pt = @fw_pt + else + Error("Incorrect orientation: #{orientation}") + end + + @cur_orientation = @def_orientation + @w = @w_pt/@k + @h = @h_pt/@k + #Page margins (1 cm) + margin = 28.35/@k + SetMargins(margin, margin) + #Interior cell margin (1 mm) + @c_margin = margin / 10 + #Line width (0.2 mm) + @line_width = 0.567 / @k + #Automatic page break + SetAutoPageBreak(true, 2 * margin) + #Full width display mode + SetDisplayMode('fullwidth') + #Compression + SetCompression(true) + #Set default PDF version number + @pdf_version = "1.3" + + @encoding = encoding + @b = 0 + @i = 0 + @u = 0 + @href = '' + @fontlist = ["arial", "times", "courier", "helvetica", "symbol"] + @issetfont = false + @issetcolor = false + + SetFillColor(200, 200, 200, true) + SetTextColor(0, 0, 0, true) + end + + # + # Set the image scale. + # @param float :scale image scale. + # @author Nicola Asuni + # @since 1.5.2 + # + def SetImageScale(scale) + @img_scale = scale; + end + alias_method :set_image_scale, :SetImageScale + + # + # Returns the image scale. + # @return float image scale. + # @author Nicola Asuni + # @since 1.5.2 + # + def GetImageScale() + return @img_scale; + end + alias_method :get_image_scale, :GetImageScale + + # + # Returns the page width in units. + # @return int page width. + # @author Nicola Asuni + # @since 1.5.2 + # + def GetPageWidth() + return @w; + end + alias_method :get_page_width, :GetPageWidth + + # + # Returns the page height in units. + # @return int page height. + # @author Nicola Asuni + # @since 1.5.2 + # + def GetPageHeight() + return @h; + end + alias_method :get_page_height, :GetPageHeight + + # + # Returns the page break margin. + # @return int page break margin. + # @author Nicola Asuni + # @since 1.5.2 + # + def GetBreakMargin() + return @b_margin; + end + alias_method :get_break_margin, :GetBreakMargin + + # + # Returns the scale factor (number of points in user unit). + # @return int scale factor. + # @author Nicola Asuni + # @since 1.5.2 + # + def GetScaleFactor() + return @k; + end + alias_method :get_scale_factor, :GetScaleFactor + + # + # Defines the left, top and right margins. By default, they equal 1 cm. Call this method to change them. + # @param float :left Left margin. + # @param float :top Top margin. + # @param float :right Right margin. Default value is the left one. + # @since 1.0 + # @see SetLeftMargin(), SetTopMargin(), SetRightMargin(), SetAutoPageBreak() + # + def SetMargins(left, top, right=-1) + #Set left, top and right margins + @l_margin = left + @t_margin = top + if (right == -1) + right = left + end + @r_margin = right + end + alias_method :set_margins, :SetMargins + + # + # Defines the left margin. The method can be called before creating the first page. If the current abscissa gets out of page, it is brought back to the margin. + # @param float :margin The margin. + # @since 1.4 + # @see SetTopMargin(), SetRightMargin(), SetAutoPageBreak(), SetMargins() + # + def SetLeftMargin(margin) + #Set left margin + @l_margin = margin + if ((@page>0) and (@x < margin)) + @x = margin + end + end + alias_method :set_left_margin, :SetLeftMargin + + # + # Defines the top margin. The method can be called before creating the first page. + # @param float :margin The margin. + # @since 1.5 + # @see SetLeftMargin(), SetRightMargin(), SetAutoPageBreak(), SetMargins() + # + def SetTopMargin(margin) + #Set top margin + @t_margin = margin + end + alias_method :set_top_margin, :SetTopMargin + + # + # Defines the right margin. The method can be called before creating the first page. + # @param float :margin The margin. + # @since 1.5 + # @see SetLeftMargin(), SetTopMargin(), SetAutoPageBreak(), SetMargins() + # + def SetRightMargin(margin) + #Set right margin + @r_margin = margin + end + alias_method :set_right_margin, :SetRightMargin + + # + # Enables or disables the automatic page breaking mode. When enabling, the second parameter is the distance from the bottom of the page that defines the triggering limit. By default, the mode is on and the margin is 2 cm. + # @param boolean :auto Boolean indicating if mode should be on or off. + # @param float :margin Distance from the bottom of the page. + # @since 1.0 + # @see Cell(), MultiCell(), AcceptPageBreak() + # + def SetAutoPageBreak(auto, margin=0) + #Set auto page break mode and triggering margin + @auto_page_break = auto + @b_margin = margin + @page_break_trigger = @h - margin + end + alias_method :set_auto_page_break, :SetAutoPageBreak + + # + # Defines the way the document is to be displayed by the viewer. The zoom level can be set: pages can be displayed entirely on screen, occupy the full width of the window, use real size, be scaled by a specific zooming factor or use viewer default (configured in the Preferences menu of Acrobat). The page layout can be specified too: single at once, continuous display, two columns or viewer default. By default, documents use the full width mode with continuous display. + # @param mixed :zoom The zoom to use. It can be one of the following string values or a number indicating the zooming factor to use.
    • fullpage: displays the entire page on screen
    • fullwidth: uses maximum width of window
    • real: uses real size (equivalent to 100% zoom)
    • default: uses viewer default mode
    + # @param string :layout The page layout. Possible values are:
    • single: displays one page at once
    • continuous: displays pages continuously (default)
    • two: displays two pages on two columns
    • default: uses viewer default mode
    + # @since 1.2 + # + def SetDisplayMode(zoom, layout = 'continuous') + #Set display mode in viewer + if (zoom == 'fullpage' or zoom == 'fullwidth' or zoom == 'real' or zoom == 'default' or !zoom.is_a?(String)) + @zoom_mode = zoom + else + Error("Incorrect zoom display mode: #{zoom}") + end + if (layout == 'single' or layout == 'continuous' or layout == 'two' or layout == 'default') + @layout_mode = layout + else + Error("Incorrect layout display mode: #{layout}") + end + end + alias_method :set_display_mode, :SetDisplayMode + + # + # Activates or deactivates page compression. When activated, the internal representation of each page is compressed, which leads to a compression ratio of about 2 for the resulting document. Compression is on by default. + # Note: the Zlib extension is required for this feature. If not present, compression will be turned off. + # @param boolean :compress Boolean indicating if compression must be enabled. + # @since 1.4 + # + def SetCompression(compress) + #Set page compression + if (respond_to?('gzcompress')) + @compress = compress + else + @compress = false + end + end + alias_method :set_compression, :SetCompression + + # + # Defines the title of the document. + # @param string :title The title. + # @since 1.2 + # @see SetAuthor(), SetCreator(), SetKeywords(), SetSubject() + # + def SetTitle(title) + #Title of document + @title = title + end + alias_method :set_title, :SetTitle + + # + # Defines the subject of the document. + # @param string :subject The subject. + # @since 1.2 + # @see SetAuthor(), SetCreator(), SetKeywords(), SetTitle() + # + def SetSubject(subject) + #Subject of document + @subject = subject + end + alias_method :set_subject, :SetSubject + + # + # Defines the author of the document. + # @param string :author The name of the author. + # @since 1.2 + # @see SetCreator(), SetKeywords(), SetSubject(), SetTitle() + # + def SetAuthor(author) + #Author of document + @author = author + end + alias_method :set_author, :SetAuthor + + # + # Associates keywords with the document, generally in the form 'keyword1 keyword2 ...'. + # @param string :keywords The list of keywords. + # @since 1.2 + # @see SetAuthor(), SetCreator(), SetSubject(), SetTitle() + # + def SetKeywords(keywords) + #Keywords of document + @keywords = keywords + end + alias_method :set_keywords, :SetKeywords + + # + # Defines the creator of the document. This is typically the name of the application that generates the PDF. + # @param string :creator The name of the creator. + # @since 1.2 + # @see SetAuthor(), SetKeywords(), SetSubject(), SetTitle() + # + def SetCreator(creator) + #Creator of document + @creator = creator + end + alias_method :set_creator, :SetCreator + + # + # Defines an alias for the total number of pages. It will be substituted as the document is closed.
    + # Example:
    + #
    +	# class PDF extends TCPDF {
    +	# 	def Footer()
    +	# 		#Go to 1.5 cm from bottom
    +	# 		SetY(-15);
    +	# 		#Select Arial italic 8
    +	# 		SetFont('Arial','I',8);
    +	# 		#Print current and total page numbers
    +	# 		Cell(0,10,'Page '.PageNo().'/{nb}',0,0,'C');
    +	# 	end
    +	# }
    +	# :pdf=new PDF();
    +	# :pdf->alias_nb_pages();
    +	# 
    + # @param string :alias The alias. Default valuenb}. + # @since 1.4 + # @see PageNo(), Footer() + # + def alias_nb_pages(alias_nb ='{nb}') + #Define an alias for total number of pages + @alias_nb_pages = escapetext(alias_nb) + end + + # + # This method is automatically called in case of fatal error; it simply outputs the message and halts the execution. An inherited class may override it to customize the error handling but should always halt the script, or the resulting document would probably be invalid. + # 2004-06-11 :: Nicola Asuni : changed bold tag with strong + # @param string :msg The error message + # @since 1.0 + # + def Error(msg) + #Fatal error + raise ("TCPDF error: #{msg}") + end + alias_method :error, :Error + + # + # This method begins the generation of the PDF document. It is not necessary to call it explicitly because AddPage() does it automatically. + # Note: no page is created by this method + # @since 1.0 + # @see AddPage(), Close() + # + def Open() + #Begin document + @state = 1 + end + # alias_method :open, :Open + + # + # Terminates the PDF document. It is not necessary to call this method explicitly because Output() does it automatically. If the document contains no page, AddPage() is called to prevent from getting an invalid document. + # @since 1.0 + # @see Open(), Output() + # + def Close() + #Terminate document + if (@state==3) + return; + end + if (@page==0) + AddPage(); + end + #Page footer + @in_footer=true; + Footer(); + @in_footer=false; + #Close page + endpage(); + #Close document + enddoc(); + end + # alias_method :close, :Close + + # + # Adds a new page to the document. If a page is already present, the Footer() method is called first to output the footer. Then the page is added, the current position set to the top-left corner according to the left and top margins, and Header() is called to display the header. + # The font which was set before calling is automatically restored. There is no need to call SetFont() again if you want to continue with the same font. The same is true for colors and line width. + # The origin of the coordinate system is at the top-left corner and increasing ordinates go downwards. + # @param string :orientation Page orientation. Possible values are (case insensitive):
    • P or Portrait
    • L or Landscape
    The default value is the one passed to the constructor. + # @since 1.0 + # @see TCPDF(), Header(), Footer(), SetMargins() + # + def AddPage(orientation='') + #Start a new page + if (@state==0) + Open(); + end + family=@font_family; + style=@font_style + (@underline ? 'U' : ''); + size=@font_size_pt; + lw=@line_width; + dc=@draw_color; + fc=@fill_color; + tc=@text_color; + cf=@color_flag; + if (@page>0) + #Page footer + @in_footer=true; + Footer(); + @in_footer=false; + #Close page + endpage(); + end + #Start new page + beginpage(orientation); + #Set line cap style to square + out('2 J'); + #Set line width + @line_width = lw; + out(sprintf('%.2f w', lw*@k)); + #Set font + if (family) + SetFont(family, style, size); + end + #Set colors + @draw_color = dc; + if (dc!='0 G') + out(dc); + end + @fill_color = fc; + if (fc!='0 g') + out(fc); + end + @text_color = tc; + @color_flag = cf; + #Page header + Header(); + #Restore line width + if (@line_width != lw) + @line_width = lw; + out(sprintf('%.2f w', lw*@k)); + end + #Restore font + if (family) + SetFont(family, style, size); + end + #Restore colors + if (@draw_color != dc) + @draw_color = dc; + out(dc); + end + if (@fill_color != fc) + @fill_color = fc; + out(fc); + end + @text_color = tc; + @color_flag = cf; + end + alias_method :add_page, :AddPage + + # + # Rotate object. + # @param float :angle angle in degrees for counter-clockwise rotation + # @param int :x abscissa of the rotation center. Default is current x position + # @param int :y ordinate of the rotation center. Default is current y position + # + def Rotate(angle, x="", y="") + + if (x == '') + x = @x; + end + + if (y == '') + y = @y; + end + + if (@rtl) + x = @w - x; + angle = -@angle; + end + + y = (@h - y) * @k; + x *= @k; + + # calculate elements of transformation matrix + tm = [] + tm[0] = ::Math::cos(deg2rad(angle)); + tm[1] = ::Math::sin(deg2rad(angle)); + tm[2] = -tm[1]; + tm[3] = tm[0]; + tm[4] = x + tm[1] * y - tm[0] * x; + tm[5] = y - tm[0] * y - tm[1] * x; + + # generate the transformation matrix + Transform(tm); + end + alias_method :rotate, :Rotate + + # + # Starts a 2D tranformation saving current graphic state. + # This function must be called before scaling, mirroring, translation, rotation and skewing. + # Use StartTransform() before, and StopTransform() after the transformations to restore the normal behavior. + # + def StartTransform + out('q'); + end + alias_method :start_transform, :StartTransform + + # + # Stops a 2D tranformation restoring previous graphic state. + # This function must be called after scaling, mirroring, translation, rotation and skewing. + # Use StartTransform() before, and StopTransform() after the transformations to restore the normal behavior. + # + def StopTransform + out('Q'); + end + alias_method :stop_transform, :StopTransform + + # + # Apply graphic transformations. + # @since 2.1.000 (2008-01-07) + # @see StartTransform(), StopTransform() + # + def Transform(tm) + x = out(sprintf('%.3f %.3f %.3f %.3f %.3f %.3f cm', tm[0], tm[1], tm[2], tm[3], tm[4], tm[5])); + end + alias_method :transform, :Transform + + # + # Set header data. + # @param string :ln header image logo + # @param string :lw header image logo width in mm + # @param string :ht string to print as title on document header + # @param string :hs string to print on document header + # + def SetHeaderData(ln="", lw=0, ht="", hs="") + @header_logo = ln || "" + @header_logo_width = lw || 0 + @header_title = ht || "" + @header_string = hs || "" + end + alias_method :set_header_data, :SetHeaderData + + # + # Set header margin. + # (minimum distance between header and top page margin) + # @param int :hm distance in millimeters + # + def SetHeaderMargin(hm=10) + @header_margin = hm; + end + alias_method :set_header_margin, :SetHeaderMargin + + # + # Set footer margin. + # (minimum distance between footer and bottom page margin) + # @param int :fm distance in millimeters + # + def SetFooterMargin(fm=10) + @footer_margin = fm; + end + alias_method :set_footer_margin, :SetFooterMargin + + # + # Set a flag to print page header. + # @param boolean :val set to true to print the page header (default), false otherwise. + # + def SetPrintHeader(val=true) + @print_header = val; + end + alias_method :set_print_header, :SetPrintHeader + + # + # Set a flag to print page footer. + # @param boolean :value set to true to print the page footer (default), false otherwise. + # + def SetPrintFooter(val=true) + @print_footer = val; + end + alias_method :set_print_footer, :SetPrintFooter + + # + # This method is used to render the page header. + # It is automatically called by AddPage() and could be overwritten in your own inherited class. + # + def Header() + if (@print_header) + if (@original_l_margin.nil?) + @original_l_margin = @l_margin; + end + if (@original_r_margin.nil?) + @original_r_margin = @r_margin; + end + + #set current position + SetXY(@original_l_margin, @header_margin); + + if ((@header_logo) and (@header_logo != @@k_blank_image)) + Image(@header_logo, @original_l_margin, @header_margin, @header_logo_width); + else + @img_rb_y = GetY(); + end + + cell_height = ((@@k_cell_height_ratio * @header_font[2]) / @k).round(2) + + header_x = @original_l_margin + (@header_logo_width * 1.05); #set left margin for text data cell + + # header title + SetFont(@header_font[0], 'B', @header_font[2] + 1); + SetX(header_x); + Cell(@header_width, cell_height, @header_title, 0, 1, 'L'); + + # header string + SetFont(@header_font[0], @header_font[1], @header_font[2]); + SetX(header_x); + MultiCell(@header_width, cell_height, @header_string, 0, 'L', 0); + + # print an ending header line + if (@header_width) + #set style for cell border + SetLineWidth(0.3); + SetDrawColor(0, 0, 0); + SetY(1 + (@img_rb_y > GetY() ? @img_rb_y : GetY())); + SetX(@original_l_margin); + Cell(0, 0, '', 'T', 0, 'C'); + end + + #restore position + SetXY(@original_l_margin, @t_margin); + end + end + alias_method :header, :Header + + # + # This method is used to render the page footer. + # It is automatically called by AddPage() and could be overwritten in your own inherited class. + # + def Footer() + if (@print_footer) + + if (@original_l_margin.nil?) + @original_l_margin = @l_margin; + end + if (@original_r_margin.nil?) + @original_r_margin = @r_margin; + end + + #set font + SetFont(@footer_font[0], @footer_font[1] , @footer_font[2]); + #set style for cell border + line_width = 0.3; + SetLineWidth(line_width); + SetDrawColor(0, 0, 0); + + footer_height = ((@@k_cell_height_ratio * @footer_font[2]) / @k).round; #footer height, was , 2) + #get footer y position + footer_y = @h - @footer_margin - footer_height; + #set current position + SetXY(@original_l_margin, footer_y); + + #print document barcode + if (@barcode) + Ln(); + barcode_width = ((@w - @original_l_margin - @original_r_margin)).round; #max width + writeBarcode(@original_l_margin, footer_y + line_width, barcode_width, footer_height - line_width, "C128B", false, false, 2, @barcode); + end + + SetXY(@original_l_margin, footer_y); + + #Print page number + Cell(0, footer_height, @l['w_page'] + " " + PageNo().to_s + ' / {nb}', 'T', 0, 'R'); + end + end + alias_method :footer, :Footer + + # + # Returns the current page number. + # @return int page number + # @since 1.0 + # @see alias_nb_pages() + # + def PageNo() + #Get current page number + return @page; + end + alias_method :page_no, :PageNo + + # + # Defines the color used for all drawing operations (lines, rectangles and cell borders). It can be expressed in RGB components or gray scale. The method can be called before the first page is created and the value is retained from page to page. + # @param int :r If g et b are given, red component; if not, indicates the gray level. Value between 0 and 255 + # @param int :g Green component (between 0 and 255) + # @param int :b Blue component (between 0 and 255) + # @since 1.3 + # @see SetFillColor(), SetTextColor(), Line(), Rect(), Cell(), MultiCell() + # + def SetDrawColor(r, g=-1, b=-1) + #Set color for all stroking operations + if ((r==0 and g==0 and b==0) or g==-1) + @draw_color=sprintf('%.3f G', r/255.0); + else + @draw_color=sprintf('%.3f %.3f %.3f RG', r/255.0, g/255.0, b/255.0); + end + if (@page>0) + out(@draw_color); + end + end + alias_method :set_draw_color, :SetDrawColor + + # + # Defines the color used for all filling operations (filled rectangles and cell backgrounds). It can be expressed in RGB components or gray scale. The method can be called before the first page is created and the value is retained from page to page. + # @param int :r If g et b are given, red component; if not, indicates the gray level. Value between 0 and 255 + # @param int :g Green component (between 0 and 255) + # @param int :b Blue component (between 0 and 255) + # @param boolean :storeprev if true stores the RGB array on :prevfill_color variable. + # @since 1.3 + # @see SetDrawColor(), SetTextColor(), Rect(), Cell(), MultiCell() + # + def SetFillColor(r, g=-1, b=-1, storeprev=false) + #Set color for all filling operations + if ((r==0 and g==0 and b==0) or g==-1) + @fill_color=sprintf('%.3f g', r/255.0); + else + @fill_color=sprintf('%.3f %.3f %.3f rg', r/255.0, g/255.0, b/255.0); + end + @color_flag=(@fill_color!=@text_color); + if (@page>0) + out(@fill_color); + end + if (storeprev) + # store color as previous value + @prevfill_color = [r, g, b] + end + end + alias_method :set_fill_color, :SetFillColor + + # This hasn't been ported from tcpdf, it's a variation on SetTextColor for setting cmyk colors + def SetCmykFillColor(c, m, y, k, storeprev=false) + #Set color for all filling operations + @fill_color=sprintf('%.3f %.3f %.3f %.3f k', c, m, y, k); + @color_flag=(@fill_color!=@text_color); + if (storeprev) + # store color as previous value + @prevtext_color = [c, m, y, k] + end + if (@page>0) + out(@fill_color); + end + end + alias_method :set_cmyk_fill_color, :SetCmykFillColor + + # + # Defines the color used for text. It can be expressed in RGB components or gray scale. The method can be called before the first page is created and the value is retained from page to page. + # @param int :r If g et b are given, red component; if not, indicates the gray level. Value between 0 and 255 + # @param int :g Green component (between 0 and 255) + # @param int :b Blue component (between 0 and 255) + # @param boolean :storeprev if true stores the RGB array on :prevtext_color variable. + # @since 1.3 + # @see SetDrawColor(), SetFillColor(), Text(), Cell(), MultiCell() + # + def SetTextColor(r, g=-1, b=-1, storeprev=false) + #Set color for text + if ((r==0 and :g==0 and :b==0) or :g==-1) + @text_color=sprintf('%.3f g', r/255.0); + else + @text_color=sprintf('%.3f %.3f %.3f rg', r/255.0, g/255.0, b/255.0); + end + @color_flag=(@fill_color!=@text_color); + if (storeprev) + # store color as previous value + @prevtext_color = [r, g, b] + end + end + alias_method :set_text_color, :SetTextColor + + # This hasn't been ported from tcpdf, it's a variation on SetTextColor for setting cmyk colors + def SetCmykTextColor(c, m, y, k, storeprev=false) + #Set color for text + @text_color=sprintf('%.3f %.3f %.3f %.3f k', c, m, y, k); + @color_flag=(@fill_color!=@text_color); + if (storeprev) + # store color as previous value + @prevtext_color = [c, m, y, k] + end + end + alias_method :set_cmyk_text_color, :SetCmykTextColor + + # + # Returns the length of a string in user unit. A font must be selected.
    + # Support UTF-8 Unicode [Nicola Asuni, 2005-01-02] + # @param string :s The string whose length is to be computed + # @return int + # @since 1.2 + # + def GetStringWidth(s) + #Get width of a string in the current font + s = s.to_s; + cw = @current_font['cw'] + w = 0; + if (@is_unicode) + unicode = UTF8StringToArray(s); + unicode.each do |char| + if (!cw[char].nil?) + w += cw[char]; + # This should not happen. UTF8StringToArray should guarentee the array is ascii values. + # elsif (c!cw[char[0]].nil?) + # w += cw[char[0]]; + # elsif (!cw[char.chr].nil?) + # w += cw[char.chr]; + elsif (!@current_font['desc']['MissingWidth'].nil?) + w += @current_font['desc']['MissingWidth']; # set default size + else + w += 500; + end + end + else + s.each_byte do |c| + if cw[c] + w += cw[c]; + elsif cw[?c] + w += cw[?c] + end + end + end + return (w * @font_size / 1000.0); + end + alias_method :get_string_width, :GetStringWidth + + # + # Defines the line width. By default, the value equals 0.2 mm. The method can be called before the first page is created and the value is retained from page to page. + # @param float :width The width. + # @since 1.0 + # @see Line(), Rect(), Cell(), MultiCell() + # + def SetLineWidth(width) + #Set line width + @line_width = width; + if (@page>0) + out(sprintf('%.2f w', width*@k)); + end + end + alias_method :set_line_width, :SetLineWidth + + # + # Draws a line between two points. + # @param float :x1 Abscissa of first point + # @param float :y1 Ordinate of first point + # @param float :x2 Abscissa of second point + # @param float :y2 Ordinate of second point + # @since 1.0 + # @see SetLineWidth(), SetDrawColor() + # + def Line(x1, y1, x2, y2) + #Draw a line + out(sprintf('%.2f %.2f m %.2f %.2f l S', x1 * @k, (@h - y1) * @k, x2 * @k, (@h - y2) * @k)); + end + alias_method :line, :Line + + def Circle(mid_x, mid_y, radius, style='') + mid_y = (@h-mid_y)*@k + out(sprintf("q\n")) # postscript content in pdf + # init line type etc. with /GSD gs G g (grey) RG rg (RGB) w=line witdh etc. + out(sprintf("1 j\n")) # line join + # translate ("move") circle to mid_y, mid_y + out(sprintf("1 0 0 1 %f %f cm", mid_x, mid_y)) + kappa = 0.5522847498307933984022516322796 + # Quadrant 1 + x_s = 0.0 # 12 o'clock + y_s = 0.0 + radius + x_e = 0.0 + radius # 3 o'clock + y_e = 0.0 + out(sprintf("%f %f m\n", x_s, y_s)) # move to 12 o'clock + # cubic bezier control point 1, start height and kappa * radius to the right + bx_e1 = x_s + (radius * kappa) + by_e1 = y_s + # cubic bezier control point 2, end and kappa * radius above + bx_e2 = x_e + by_e2 = y_e + (radius * kappa) + # draw cubic bezier from current point to x_e/y_e with bx_e1/by_e1 and bx_e2/by_e2 as bezier control points + out(sprintf("%f %f %f %f %f %f c\n", bx_e1, by_e1, bx_e2, by_e2, x_e, y_e)) + # Quadrant 2 + x_s = x_e + y_s = y_e # 3 o'clock + x_e = 0.0 + y_e = 0.0 - radius # 6 o'clock + bx_e1 = x_s # cubic bezier point 1 + by_e1 = y_s - (radius * kappa) + bx_e2 = x_e + (radius * kappa) # cubic bezier point 2 + by_e2 = y_e + out(sprintf("%f %f %f %f %f %f c\n", bx_e1, by_e1, bx_e2, by_e2, x_e, y_e)) + # Quadrant 3 + x_s = x_e + y_s = y_e # 6 o'clock + x_e = 0.0 - radius + y_e = 0.0 # 9 o'clock + bx_e1 = x_s - (radius * kappa) # cubic bezier point 1 + by_e1 = y_s + bx_e2 = x_e # cubic bezier point 2 + by_e2 = y_e - (radius * kappa) + out(sprintf("%f %f %f %f %f %f c\n", bx_e1, by_e1, bx_e2, by_e2, x_e, y_e)) + # Quadrant 4 + x_s = x_e + y_s = y_e # 9 o'clock + x_e = 0.0 + y_e = 0.0 + radius # 12 o'clock + bx_e1 = x_s # cubic bezier point 1 + by_e1 = y_s + (radius * kappa) + bx_e2 = x_e - (radius * kappa) # cubic bezier point 2 + by_e2 = y_e + out(sprintf("%f %f %f %f %f %f c\n", bx_e1, by_e1, bx_e2, by_e2, x_e, y_e)) + if style=='F' + op='f' + elsif style=='FD' or style=='DF' + op='b' + else + op='s' + end + out(sprintf("#{op}\n")) # stroke circle, do not fill and close path + # for filling etc. b, b*, f, f* + out(sprintf("Q\n")) # finish postscript in PDF + end + alias_method :circle, :Circle + + # + # Outputs a rectangle. It can be drawn (border only), filled (with no border) or both. + # @param float :x Abscissa of upper-left corner + # @param float :y Ordinate of upper-left corner + # @param float :w Width + # @param float :h Height + # @param string :style Style of rendering. Possible values are:
    • D or empty string: draw (default)
    • F: fill
    • DF or FD: draw and fill
    + # @since 1.0 + # @see SetLineWidth(), SetDrawColor(), SetFillColor() + # + def Rect(x, y, w, h, style='') + #Draw a rectangle + if (style=='F') + op='f'; + elsif (style=='FD' or style=='DF') + op='B'; + else + op='S'; + end + out(sprintf('%.2f %.2f %.2f %.2f re %s', x * @k, (@h - y) * @k, w * @k, -h * @k, op)); + end + alias_method :rect, :Rect + + # + # Imports a TrueType or Type1 font and makes it available. It is necessary to generate a font definition file first with the makefont.rb utility. The definition file (and the font file itself when embedding) must be present either in the current directory or in the one indicated by FPDF_FONTPATH if the constant is defined. If it could not be found, the error "Could not include font definition file" is generated. + # Support UTF-8 Unicode [Nicola Asuni, 2005-01-02]. + # Example:
    + #
    +	# :pdf->AddFont('Comic','I');
    +	# # is equivalent to:
    +	# :pdf->AddFont('Comic','I','comici.rb');
    +	# 
    + # @param string :family Font family. The name can be chosen arbitrarily. If it is a standard family name, it will override the corresponding font. + # @param string :style Font style. Possible values are (case insensitive):
    • empty string: regular (default)
    • B: bold
    • I: italic
    • BI or IB: bold italic
    + # @param string :file The font definition file. By default, the name is built from the family and style, in lower case with no space. + # @since 1.5 + # @see SetFont() + # + def AddFont(family, style='', file='') + if (family.empty?) + return; + end + + #Add a TrueType or Type1 font + family = family.downcase + if ((!@is_unicode) and (family == 'arial')) + family = 'helvetica'; + end + + style=style.upcase + style=style.gsub('U',''); + if (style == 'IB') + style = 'BI'; + end + + fontkey = family + style; + # check if the font has been already added + if !@fonts[fontkey].nil? + return; + end + + if (file=='') + file = family.gsub(' ', '') + style.downcase + '.rb'; + end + font_file_name = getfontpath(file) + if (font_file_name.nil?) + # try to load the basic file without styles + file = family.gsub(' ', '') + '.rb'; + font_file_name = getfontpath(file) + end + if font_file_name.nil? + Error("Could not find font #{file}.") + end + require(getfontpath(file)) + font_desc = TCPDFFontDescriptor.font(file) + + if (font_desc[:name].nil? and @@fpdf_charwidths.nil?) + Error('Could not include font definition file'); + end + + i = @fonts.length+1; + if (@is_unicode) + @fonts[fontkey] = {'i' => i, 'type' => font_desc[:type], 'name' => font_desc[:name], 'desc' => font_desc[:desc], 'up' => font_desc[:up], 'ut' => font_desc[:ut], 'cw' => font_desc[:cw], 'enc' => font_desc[:enc], 'file' => font_desc[:file], 'ctg' => font_desc[:ctg], 'cMap' => font_desc[:cMap], 'registry' => font_desc[:registry]} + @@fpdf_charwidths[fontkey] = font_desc[:cw]; + else + @fonts[fontkey]={'i' => i, 'type'=>'core', 'name'=>@core_fonts[fontkey], 'up'=>-100, 'ut'=>50, 'cw' => font_desc[:cw]} + @@fpdf_charwidths[fontkey] = font_desc[:cw]; + end + + if (!font_desc[:diff].nil? and (!font_desc[:diff].empty?)) + #Search existing encodings + d=0; + nb=@diffs.length; + 1.upto(nb) do |i| + if (@diffs[i]== font_desc[:diff]) + d = i; + break; + end + end + if (d==0) + d = nb+1; + @diffs[d] = font_desc[:diff]; + end + @fonts[fontkey]['diff'] = d; + end + if (font_desc[:file] and font_desc[:file].length > 0) + if (font_desc[:type] == "TrueType") or (font_desc[:type] == "TrueTypeUnicode") + @font_files[font_desc[:file]] = {'length1' => font_desc[:originalsize]} + else + @font_files[font_desc[:file]] = {'length1' => font_desc[:size1], 'length2' => font_desc[:size2]} + end + end + end + alias_method :add_font, :AddFont + + # + # Sets the font used to print character strings. It is mandatory to call this method at least once before printing text or the resulting document would not be valid. + # The font can be either a standard one or a font added via the AddFont() method. Standard fonts use Windows encoding cp1252 (Western Europe). + # The method can be called before the first page is created and the font is retained from page to page. + # If you just wish to change the current font size, it is simpler to call SetFontSize(). + # Note: for the standard fonts, the font metric files must be accessible. There are three possibilities for this:
    • They are in the current directory (the one where the running script lies)
    • They are in one of the directories defined by the include_path parameter
    • They are in the directory defined by the FPDF_FONTPATH constant

    + # Example for the last case (note the trailing slash):
    + #
    +	# define('FPDF_FONTPATH','/home/www/font/');
    +	# require('tcpdf.rb');
    +	#
    +	# #Times regular 12
    +	# :pdf->SetFont('Times');
    +	# #Arial bold 14
    +	# :pdf->SetFont('Arial','B',14);
    +	# #Removes bold
    +	# :pdf->SetFont('');
    +	# #Times bold, italic and underlined 14
    +	# :pdf->SetFont('Times','BIU');
    +	# 

    + # If the file corresponding to the requested font is not found, the error "Could not include font metric file" is generated. + # @param string :family Family font. It can be either a name defined by AddFont() or one of the standard families (case insensitive):
    • Courier (fixed-width)
    • Helvetica or Arial (synonymous; sans serif)
    • Times (serif)
    • Symbol (symbolic)
    • ZapfDingbats (symbolic)
    It is also possible to pass an empty string. In that case, the current family is retained. + # @param string :style Font style. Possible values are (case insensitive):
    • empty string: regular
    • B: bold
    • I: italic
    • U: underline
    or any combination. The default value is regular. Bold and italic styles do not apply to Symbol and ZapfDingbats + # @param float :size Font size in points. The default value is the current size. If no size has been specified since the beginning of the document, the value taken is 12 + # @since 1.0 + # @see AddFont(), SetFontSize(), Cell(), MultiCell(), Write() + # + def SetFont(family, style='', size=0) + # save previous values + @prevfont_family = @font_family; + @prevfont_style = @font_style; + + family=family.downcase; + if (family=='') + family=@font_family; + end + if ((!@is_unicode) and (family == 'arial')) + family = 'helvetica'; + elsif ((family=="symbol") or (family=="zapfdingbats")) + style=''; + end + + style=style.upcase; + + if (style.include?('U')) + @underline=true; + style= style.gsub('U',''); + else + @underline=false; + end + if (style=='IB') + style='BI'; + end + if (size==0) + size=@font_size_pt; + end + + # try to add font (if not already added) + if (@is_unicode) + AddFont(family, style); + end + + #Test if font is already selected + if ((@font_family == family) and (@font_style == style) and (@font_size_pt == size)) + return; + end + + fontkey = family + style; + style = '' if (@fonts[fontkey].nil? and !@fonts[family].nil?) + + #Test if used for the first time + if (@fonts[fontkey].nil?) + #Check if one of the standard fonts + if (!@core_fonts[fontkey].nil?) + if @@fpdf_charwidths[fontkey].nil? + #Load metric file + file = family; + if ((family!='symbol') and (family!='zapfdingbats')) + file += style.downcase; + end + if (getfontpath(file + '.rb').nil?) + # try to load the basic file without styles + file = family; + fontkey = family; + end + require(getfontpath(file + '.rb')); + font_desc = TCPDFFontDescriptor.font(file) + if ((@is_unicode and ctg.nil?) or ((!@is_unicode) and (@@fpdf_charwidths[fontkey].nil?)) ) + Error("Could not include font metric file [" + fontkey + "]: " + getfontpath(file + ".rb")); + end + end + i = @fonts.length + 1; + + if (@is_unicode) + @fonts[fontkey] = {'i' => i, 'type' => font_desc[:type], 'name' => font_desc[:name], 'desc' => font_desc[:desc], 'up' => font_desc[:up], 'ut' => font_desc[:ut], 'cw' => font_desc[:cw], 'enc' => font_desc[:enc], 'file' => font_desc[:file], 'ctg' => font_desc[:ctg]} + @@fpdf_charwidths[fontkey] = font_desc[:cw]; + else + @fonts[fontkey] = {'i' => i, 'type'=>'core', 'name'=>@core_fonts[fontkey], 'up'=>-100, 'ut'=>50, 'cw' => font_desc[:cw]} + @@fpdf_charwidths[fontkey] = font_desc[:cw]; + end + else + Error('Undefined font: ' + family + ' ' + style); + end + end + #Select it + @font_family = family; + @font_style = style; + @font_size_pt = size; + @font_size = size / @k; + @current_font = @fonts[fontkey]; # was & may need deep copy? + if (@page>0) + out(sprintf('BT /F%d %.2f Tf ET', @current_font['i'], @font_size_pt)); + end + end + alias_method :set_font, :SetFont + + # + # Defines the size of the current font. + # @param float :size The size (in points) + # @since 1.0 + # @see SetFont() + # + def SetFontSize(size) + #Set font size in points + if (@font_size_pt== size) + return; + end + @font_size_pt = size; + @font_size = size.to_f / @k; + if (@page > 0) + out(sprintf('BT /F%d %.2f Tf ET', @current_font['i'], @font_size_pt)); + end + end + alias_method :set_font_size, :SetFontSize + + # + # Creates a new internal link and returns its identifier. An internal link is a clickable area which directs to another place within the document.
    + # The identifier can then be passed to Cell(), Write(), Image() or Link(). The destination is defined with SetLink(). + # @since 1.5 + # @see Cell(), Write(), Image(), Link(), SetLink() + # + def AddLink() + #Create a new internal link + n=@links.length+1; + @links[n]=[0,0]; + return n; + end + alias_method :add_link, :AddLink + + # + # Defines the page and position a link points to + # @param int :link The link identifier returned by AddLink() + # @param float :y Ordinate of target position; -1 indicates the current position. The default value is 0 (top of page) + # @param int :page Number of target page; -1 indicates the current page. This is the default value + # @since 1.5 + # @see AddLink() + # + def SetLink(link, y=0, page=-1) + #Set destination of internal link + if (y==-1) + y=@y; + end + if (page==-1) + page=@page; + end + @links[link] = [page, y] + end + alias_method :set_link, :SetLink + + # + # Puts a link on a rectangular area of the page. Text or image links are generally put via Cell(), Write() or Image(), but this method can be useful for instance to define a clickable area inside an image. + # @param float :x Abscissa of the upper-left corner of the rectangle + # @param float :y Ordinate of the upper-left corner of the rectangle + # @param float :w Width of the rectangle + # @param float :h Height of the rectangle + # @param mixed :link URL or identifier returned by AddLink() + # @since 1.5 + # @see AddLink(), Cell(), Write(), Image() + # + def Link(x, y, w, h, link) + #Put a link on the page + @page_links ||= Array.new + @page_links[@page] ||= Array.new + @page_links[@page].push([x * @k, @h_pt - y * @k, w * @k, h*@k, link]); + end + alias_method :link, :Link + + # + # Prints a character string. The origin is on the left of the first charcter, on the baseline. This method allows to place a string precisely on the page, but it is usually easier to use Cell(), MultiCell() or Write() which are the standard methods to print text. + # @param float :x Abscissa of the origin + # @param float :y Ordinate of the origin + # @param string :txt String to print + # @since 1.0 + # @see SetFont(), SetTextColor(), Cell(), MultiCell(), Write() + # + def Text(x, y, txt) + #Output a string + s=sprintf('BT %.2f %.2f Td (%s) Tj ET', x * @k, (@h-y) * @k, escapetext(txt)); + if (@underline and (txt!='')) + s += ' ' + dounderline(x, y, txt); + end + if (@color_flag) + s='q ' + @text_color + ' ' + s + ' Q'; + end + out(s); + end + alias_method :text, :Text + + # + # Whenever a page break condition is met, the method is called, and the break is issued or not depending on the returned value. The default implementation returns a value according to the mode selected by SetAutoPageBreak().
    + # This method is called automatically and should not be called directly by the application.
    + # Example:
    + # The method is overriden in an inherited class in order to obtain a 3 column layout:
    + #
    +	# class PDF extends TCPDF {
    +	# 	var :col=0;
    +	#
    +	# 	def SetCol(col)
    +	# 		#Move position to a column
    +	# 		@col = col;
    +	# 		:x=10+:col*65;
    +	# 		SetLeftMargin(x);
    +	# 		SetX(x);
    +	# 	end
    +	#
    +	# 	def AcceptPageBreak()
    +	# 		if (@col<2)
    +	# 			#Go to next column
    +	# 			SetCol(@col+1);
    +	# 			SetY(10);
    +	# 			return false;
    +	# 		end
    +	# 		else
    +	# 			#Go back to first column and issue page break
    +	# 			SetCol(0);
    +	# 			return true;
    +	# 		end
    +	# 	end
    +	# }
    +	#
    +	# :pdf=new PDF();
    +	# :pdf->Open();
    +	# :pdf->AddPage();
    +	# :pdf->SetFont('Arial','',12);
    +	# for(i=1;:i<=300;:i++)
    +	#     :pdf->Cell(0,5,"Line :i",0,1);
    +	# }
    +	# :pdf->Output();
    +	# 
    + # @return boolean + # @since 1.4 + # @see SetAutoPageBreak() + # + def AcceptPageBreak() + #Accept automatic page break or not + return @auto_page_break; + end + alias_method :accept_page_break, :AcceptPageBreak + + def BreakThePage?(h) + if ((@y + h) > @page_break_trigger and !@in_footer and AcceptPageBreak()) + true + else + false + end + end + alias_method :break_the_page?, :BreakThePage? + # + # Prints a cell (rectangular area) with optional borders, background color and character string. The upper-left corner of the cell corresponds to the current position. The text can be aligned or centered. After the call, the current position moves to the right or to the next line. It is possible to put a link on the text.
    + # If automatic page breaking is enabled and the cell goes beyond the limit, a page break is done before outputting. + # @param float :w Cell width. If 0, the cell extends up to the right margin. + # @param float :h Cell height. Default value: 0. + # @param string :txt String to print. Default value: empty string. + # @param mixed :border Indicates if borders must be drawn around the cell. The value can be either a number:
    • 0: no border (default)
    • 1: frame
    or a string containing some or all of the following characters (in any order):
    • L: left
    • T: top
    • R: right
    • B: bottom
    + # @param int :ln Indicates where the current position should go after the call. Possible values are:
    • 0: to the right
    • 1: to the beginning of the next line
    • 2: below
    + # Putting 1 is equivalent to putting 0 and calling Ln() just after. Default value: 0. + # @param string :align Allows to center or align the text. Possible values are:
    • L or empty string: left align (default value)
    • C: center
    • R: right align
    + # @param int :fill Indicates if the cell background must be painted (1) or transparent (0). Default value: 0. + # @param mixed :link URL or identifier returned by AddLink(). + # @since 1.0 + # @see SetFont(), SetDrawColor(), SetFillColor(), SetTextColor(), SetLineWidth(), AddLink(), Ln(), MultiCell(), Write(), SetAutoPageBreak() + # + def Cell(w, h=0, txt='', border=0, ln=0, align='', fill=0, link=nil) + #Output a cell + k=@k; + if ((@y + h) > @page_break_trigger and !@in_footer and AcceptPageBreak()) + #Automatic page break + x = @x; + ws = @ws; + if (ws > 0) + @ws = 0; + out('0 Tw'); + end + AddPage(@cur_orientation); + @x = x; + if (ws > 0) + @ws = ws; + out(sprintf('%.3f Tw', ws * k)); + end + end + if (w == 0) + w = @w - @r_margin - @x; + end + s = ''; + if ((fill.to_i == 1) or (border.to_i == 1)) + if (fill.to_i == 1) + op = (border.to_i == 1) ? 'B' : 'f'; + else + op = 'S'; + end + s = sprintf('%.2f %.2f %.2f %.2f re %s ', @x * k, (@h - @y) * k, w * k, -h * k, op); + end + if (border.is_a?(String)) + x=@x; + y=@y; + if (border.include?('L')) + s<0) + # Go to next line + @y += h; + if (ln == 1) + @x = @l_margin; + end + else + @x += w; + end + end + alias_method :cell, :Cell + + # + # This method allows printing text with line breaks. They can be automatic (as soon as the text reaches the right border of the cell) or explicit (via the \n character). As many cells as necessary are output, one below the other.
    + # Text can be aligned, centered or justified. The cell block can be framed and the background painted. + # @param float :w Width of cells. If 0, they extend up to the right margin of the page. + # @param float :h Height of cells. + # @param string :txt String to print + # @param mixed :border Indicates if borders must be drawn around the cell block. The value can be either a number:
    • 0: no border (default)
    • 1: frame
    or a string containing some or all of the following characters (in any order):
    • L: left
    • T: top
    • R: right
    • B: bottom
    + # @param string :align Allows to center or align the text. Possible values are:
    • L or empty string: left align
    • C: center
    • R: right align
    • J: justification (default value)
    + # @param int :fill Indicates if the cell background must be painted (1) or transparent (0). Default value: 0. + # @param int :ln Indicates where the current position should go after the call. Possible values are:
    • 0: to the right
    • 1: to the beginning of the next line [DEFAULT]
    • 2: below
    + # @since 1.3 + # @see SetFont(), SetDrawColor(), SetFillColor(), SetTextColor(), SetLineWidth(), Cell(), Write(), SetAutoPageBreak() + # + def MultiCell(w, h, txt, border=0, align='J', fill=0, ln=1) + + # save current position + prevx = @x; + prevy = @y; + + #Output text with automatic or explicit line breaks + + if (w == 0) + w = @w - @r_margin - @x; + end + + wmax = (w - 2 * @c_margin); + + s = txt.gsub("\r", ''); # remove carriage returns + nb = s.length; + + b=0; + if (border) + if (border==1) + border='LTRB'; + b='LRT'; + b2='LR'; + elsif border.is_a?(String) + b2=''; + if (border.include?('L')) + b2<<'L'; + end + if (border.include?('R')) + b2<<'R'; + end + b=(border.include?('T')) ? b2 + 'T' : b2; + end + end + sep=-1; + to_index=0; + from_j=0; + l=0; + ns=0; + nl=1; + + while to_index < nb + #Get next character + c = s[to_index]; + if c == "\n"[0] + #Explicit line break + if @ws > 0 + @ws = 0 + out('0 Tw') + end + #Ed Moss - change begin + end_i = to_index == 0 ? 0 : to_index - 1 + # Changed from s[from_j..to_index] to fix bug reported by Hans Allis. + from_j = to_index == 0 ? 1 : from_j + Cell(w, h, s[from_j..end_i], b, 2, align, fill) + #change end + to_index += 1 + sep=-1 + from_j=to_index + l=0 + ns=0 + nl += 1 + b = b2 if border and nl==2 + next + end + if (c == " "[0]) + sep = to_index; + ls = l; + ns += 1; + end + + l = GetStringWidth(s[from_j, to_index-from_j]); + + if (l > wmax) + #Automatic line break + if (sep == -1) + if (to_index == from_j) + to_index += 1; + end + if (@ws > 0) + @ws = 0; + out('0 Tw'); + end + Cell(w, h, s[from_j..to_index-1], b, 2, align, fill) # my FPDF version + else + if (align=='J' || align=='justify' || align=='justified') + @ws = (ns>1) ? (wmax-ls)/(ns-1) : 0; + out(sprintf('%.3f Tw', @ws * @k)); + end + Cell(w, h, s[from_j..sep], b, 2, align, fill); + to_index = sep + 1; + end + sep=-1; + from_j = to_index; + l=0; + ns=0; + nl += 1; + if (border and (nl==2)) + b = b2; + end + else + to_index += 1; + end + end + #Last chunk + if (@ws>0) + @ws=0; + out('0 Tw'); + end + if (border.is_a?(String) and border.include?('B')) + b<<'B'; + end + Cell(w, h, s[from_j, to_index-from_j], b, 2, align, fill); + + # move cursor to specified position + # since 2007-03-03 + if (ln == 1) + # go to the beginning of the next line + @x = @l_margin; + elsif (ln == 0) + # go to the top-right of the cell + @y = prevy; + @x = prevx + w; + elsif (ln == 2) + # go to the bottom-left of the cell + @x = prevx; + end + end + alias_method :multi_cell, :MultiCell + + # + # This method prints text from the current position. When the right margin is reached (or the \n character is met) a line break occurs and text continues from the left margin. Upon method exit, the current position is left just at the end of the text. It is possible to put a link on the text.
    + # Example:
    + #
    +	# #Begin with regular font
    +	# :pdf->SetFont('Arial','',14);
    +	# :pdf->Write(5,'Visit ');
    +	# #Then put a blue underlined link
    +	# :pdf->SetTextColor(0,0,255);
    +	# :pdf->SetFont('','U');
    +	# :pdf->Write(5,'www.tecnick.com','http://www.tecnick.com');
    +	# 
    + # @param float :h Line height + # @param string :txt String to print + # @param mixed :link URL or identifier returned by AddLink() + # @param int :fill Indicates if the background must be painted (1) or transparent (0). Default value: 0. + # @since 1.5 + # @see SetFont(), SetTextColor(), AddLink(), MultiCell(), SetAutoPageBreak() + # + def Write(h, txt, link=nil, fill=0) + + #Output text in flowing mode + w = @w - @r_margin - @x; + wmax = (w - 2 * @c_margin); + + s = txt.gsub("\r", ''); + nb = s.length; + + # handle single space character + if ((nb==1) and (s == " ")) + @x += GetStringWidth(s); + return; + end + + sep=-1; + i=0; + j=0; + l=0; + nl=1; + while(i wmax) + #Automatic line break (word wrapping) + if (sep == -1) + if (@x > @l_margin) + #Move to next line + @x = @l_margin; + @y += h; + w=@w - @r_margin - @x; + wmax=(w - 2 * @c_margin); + i += 1 + nl += 1 + next + end + if (i == j) + i += 1 + end + Cell(w, h, s[j, (i-1)], 0, 2, '', fill, link); + else + Cell(w, h, s[j, (sep-j)], 0, 2, '', fill, link); + i = sep+1; + end + sep = -1; + j = i; + l = 0; + if (nl==1) + @x = @l_margin; + w = @w - @r_margin - @x; + wmax = (w - 2 * @c_margin); + end + nl += 1; + else + i += 1; + end + end + #Last chunk + if (i != j) + Cell(GetStringWidth(s[j..i]), h, s[j..i], 0, 0, '', fill, link); + end + end + alias_method :write, :Write + + # + # Puts an image in the page. The upper-left corner must be given. The dimensions can be specified in different ways:
    • explicit width and height (expressed in user unit)
    • one explicit dimension, the other being calculated automatically in order to keep the original proportions
    • no explicit dimension, in which case the image is put at 72 dpi
    + # Supported formats are JPEG and PNG. + # For JPEG, all flavors are allowed:
    • gray scales
    • true colors (24 bits)
    • CMYK (32 bits)
    + # For PNG, are allowed:
    • gray scales on at most 8 bits (256 levels)
    • indexed colors
    • true colors (24 bits)
    + # but are not supported:
    • Interlacing
    • Alpha channel
    + # If a transparent color is defined, it will be taken into account (but will be only interpreted by Acrobat 4 and above).
    + # The format can be specified explicitly or inferred from the file extension.
    + # It is possible to put a link on the image.
    + # Remark: if an image is used several times, only one copy will be embedded in the file.
    + # @param string :file Name of the file containing the image. + # @param float :x Abscissa of the upper-left corner. + # @param float :y Ordinate of the upper-left corner. + # @param float :w Width of the image in the page. If not specified or equal to zero, it is automatically calculated. + # @param float :h Height of the image in the page. If not specified or equal to zero, it is automatically calculated. + # @param string :type Image format. Possible values are (case insensitive): JPG, JPEG, PNG. If not specified, the type is inferred from the file extension. + # @param mixed :link URL or identifier returned by AddLink(). + # @since 1.1 + # @see AddLink() + # + def Image(file, x, y, w=0, h=0, type='', link=nil) + #Put an image on the page + if (@images[file].nil?) + #First use of image, get info + if (type == '') + pos = file.rindex('.'); + if (pos == 0) + Error('Image file has no extension and no type was specified: ' + file); + end + type = file[pos+1..-1]; + end + type.downcase! + if (type == 'jpg' or type == 'jpeg') + info=parsejpg(file); + elsif (type == 'png') + info=parsepng(file); + else + #Allow for additional formats + mtd='parse' + type; + if (!self.respond_to?(mtd)) + Error('Unsupported image type: ' + type); + end + info=send(mtd, file); + end + info['i']=@images.length+1; + @images[file] = info; + else + info=@images[file]; + end + #Automatic width and height calculation if needed + if ((w == 0) and (h == 0)) + #Put image at 72 dpi + # 2004-06-14 :: Nicola Asuni, scale factor where added + w = info['w'] / (@img_scale * @k); + h = info['h'] / (@img_scale * @k); + end + if (w == 0) + w = h * info['w'] / info['h']; + end + if (h == 0) + h = w * info['h'] / info['w']; + end + out(sprintf('q %.2f 0 0 %.2f %.2f %.2f cm /I%d Do Q', w*@k, h*@k, x*@k, (@h-(y+h))*@k, info['i'])); + if (link) + Link(x, y, w, h, link); + end + + #2002-07-31 - Nicola Asuni + # set right-bottom corner coordinates + @img_rb_x = x + w; + @img_rb_y = y + h; + end + alias_method :image, :Image + + # + # Performs a line break. The current abscissa goes back to the left margin and the ordinate increases by the amount passed in parameter. + # @param float :h The height of the break. By default, the value equals the height of the last printed cell. + # @since 1.0 + # @see Cell() + # + def Ln(h='') + #Line feed; default value is last cell height + @x=@l_margin; + if (h.is_a?(String)) + @y += @lasth; + else + @y += h; + end + end + alias_method :ln, :Ln + + # + # Returns the abscissa of the current position. + # @return float + # @since 1.2 + # @see SetX(), GetY(), SetY() + # + def GetX() + #Get x position + return @x; + end + alias_method :get_x, :GetX + + # + # Defines the abscissa of the current position. If the passed value is negative, it is relative to the right of the page. + # @param float :x The value of the abscissa. + # @since 1.2 + # @see GetX(), GetY(), SetY(), SetXY() + # + def SetX(x) + #Set x position + if (x>=0) + @x = x; + else + @x=@w+x; + end + end + alias_method :set_x, :SetX + + # + # Returns the ordinate of the current position. + # @return float + # @since 1.0 + # @see SetY(), GetX(), SetX() + # + def GetY() + #Get y position + return @y; + end + alias_method :get_y, :GetY + + # + # Moves the current abscissa back to the left margin and sets the ordinate. If the passed value is negative, it is relative to the bottom of the page. + # @param float :y The value of the ordinate. + # @since 1.0 + # @see GetX(), GetY(), SetY(), SetXY() + # + def SetY(y) + #Set y position and reset x + @x=@l_margin; + if (y>=0) + @y = y; + else + @y=@h+y; + end + end + alias_method :set_y, :SetY + + # + # Defines the abscissa and ordinate of the current position. If the passed values are negative, they are relative respectively to the right and bottom of the page. + # @param float :x The value of the abscissa + # @param float :y The value of the ordinate + # @since 1.2 + # @see SetX(), SetY() + # + def SetXY(x, y) + #Set x and y positions + SetY(y); + SetX(x); + end + alias_method :set_xy, :SetXY + + # + # Send the document to a given destination: string, local file or browser. In the last case, the plug-in may be used (if present) or a download ("Save as" dialog box) may be forced.
    + # The method first calls Close() if necessary to terminate the document. + # @param string :name The name of the file. If not given, the document will be sent to the browser (destination I) with the name doc.pdf. + # @param string :dest Destination where to send the document. It can take one of the following values:
    • I: send the file inline to the browser. The plug-in is used if available. The name given by name is used when one selects the "Save as" option on the link generating the PDF.
    • D: send to the browser and force a file download with the name given by name.
    • F: save to a local file with the name given by name.
    • S: return the document as a string. name is ignored.
    If the parameter is not specified but a name is given, destination is F. If no parameter is specified at all, destination is I.
    + # @since 1.0 + # @see Close() + # + def Output(name='', dest='') + #Output PDF to some destination + #Finish document if necessary + if (@state < 3) + Close(); + end + #Normalize parameters + # Boolean no longer supported + # if (dest.is_a?(Boolean)) + # dest = dest ? 'D' : 'F'; + # end + dest = dest.upcase + if (dest=='') + if (name=='') + name='doc.pdf'; + dest='I'; + else + dest='F'; + end + end + case (dest) + when 'I' + # This is PHP specific code + ##Send to standard output + # if (ob_get_contents()) + # Error('Some data has already been output, can\'t send PDF file'); + # end + # if (php_sapi_name()!='cli') + # #We send to a browser + # header('Content-Type: application/pdf'); + # if (headers_sent()) + # Error('Some data has already been output to browser, can\'t send PDF file'); + # end + # header('Content-Length: ' + @buffer.length); + # header('Content-disposition: inline; filename="' + name + '"'); + # end + return @buffer; + + when 'D' + # PHP specific + #Download file + # if (ob_get_contents()) + # Error('Some data has already been output, can\'t send PDF file'); + # end + # if (!_SERVER['HTTP_USER_AGENT'].nil? && SERVER['HTTP_USER_AGENT'].include?('MSIE')) + # header('Content-Type: application/force-download'); + # else + # header('Content-Type: application/octet-stream'); + # end + # if (headers_sent()) + # Error('Some data has already been output to browser, can\'t send PDF file'); + # end + # header('Content-Length: '+ @buffer.length); + # header('Content-disposition: attachment; filename="' + name + '"'); + return @buffer; + + when 'F' + open(name,'wb') do |f| + f.write(@buffer) + end + # PHP code + # #Save to local file + # f=open(name,'wb'); + # if (!f) + # Error('Unable to create output file: ' + name); + # end + # fwrite(f,@buffer,@buffer.length); + # f.close + + when 'S' + #Return as a string + return @buffer; + else + Error('Incorrect output destination: ' + dest); + + end + return ''; + end + alias_method :output, :Output + + # Protected methods + + # + # Check for locale-related bug + # @access protected + # + def dochecks() + #Check for locale-related bug + if (1.1==1) + Error('Don\'t alter the locale before including class file'); + end + #Check for decimal separator + if (sprintf('%.1f',1.0)!='1.0') + setlocale(LC_NUMERIC,'C'); + end + end + + # + # Return fonts path + # @access protected + # + def getfontpath(file) + # Is it in the @@font_path? + if @@font_path + fpath = File.join @@font_path, file + if File.exists?(fpath) + return fpath + end + end + # Is it in this plugin's font folder? + fpath = File.join File.dirname(__FILE__), 'fonts', file + if File.exists?(fpath) + return fpath + end + # Could not find it. + nil + end + + # + # Start document + # @access protected + # + def begindoc() + #Start document + @state=1; + out('%PDF-1.3'); + end + + # + # putpages + # @access protected + # + def putpages() + nb = @page; + if (@alias_nb_pages) + nbstr = UTF8ToUTF16BE(nb, false); + #Replace number of pages + 1.upto(nb) do |n| + @pages[n].gsub!(@alias_nb_pages, nbstr) + end + end + if @def_orientation=='P' + w_pt=@fw_pt + h_pt=@fh_pt + else + w_pt=@fh_pt + h_pt=@fw_pt + end + filter=(@compress) ? '/Filter /FlateDecode ' : '' + 1.upto(nb) do |n| + #Page + newobj + out('<>>>'; + else + l=@links[pl[4]]; + h=!@orientation_changes[l[0]].nil? ? w_pt : h_pt; + annots<>',1+2*l[0], h-l[1]*@k); + end + end + out(annots + ']'); + end + out('/Contents ' + (@n+1).to_s + ' 0 R>>'); + out('endobj'); + #Page content + p=(@compress) ? gzcompress(@pages[n]) : @pages[n]; + newobj(); + out('<<' + filter + '/Length '+ p.length.to_s + '>>'); + putstream(p); + out('endobj'); + end + #Pages root + @offsets[1]=@buffer.length; + out('1 0 obj'); + out('<>'); + out('endobj'); + end + + # + # Adds fonts + # putfonts + # @access protected + # + def putfonts() + nf=@n; + @diffs.each do |diff| + #Encodings + newobj(); + out('<>'); + out('endobj'); + end + @font_files.each do |file, info| + #Font file embedding + newobj(); + @font_files[file]['n']=@n; + font=''; + open(getfontpath(file),'rb') do |f| + font = f.read(); + end + compressed=(file[-2,2]=='.z'); + if (!compressed && !info['length2'].nil?) + header=((font[0][0])==128); + if (header) + #Strip first binary header + font=font[6]; + end + if header && (font[info['length1']][0] == 128) + #Strip second binary header + font=font[0..info['length1']] + font[info['length1']+6]; + end + end + out('<>'); + open(getfontpath(file),'rb') do |f| + putstream(font) + end + out('endobj'); + end + @fonts.each do |k, font| + #Font objects + @fonts[k]['n']=@n+1; + type = font['type']; + name = font['name']; + if (type=='core') + #Standard font + newobj(); + out('<>'); + out('endobj'); + elsif type == 'Type0' + putType0(font) + elsif (type=='Type1' || type=='TrueType') + #Additional Type1 or TrueType font + newobj(); + out('<>'); + out('endobj'); + #Widths + newobj(); + cw=font['cw']; # & + s='['; + 32.upto(255) do |i| + s << cw[i.chr] + ' '; + end + out(s + ']'); + out('endobj'); + #Descriptor + newobj(); + s='<>'); + out('endobj'); + else + #Allow for additional types + mtd='put' + type.downcase; + if (!self.respond_to?(mtd)) + Error('Unsupported font type: ' + type) + else + self.send(mtd,font) + end + end + end + end + + def putType0(font) + #Type0 + out('<>') + out('endobj') + #CIDFont + newobj() + out('<>') + out('/FontDescriptor '+(@n+1).to_s+' 0 R') + w='/W [1 [' + font['cw'].keys.sort.each {|key| + w+=font['cw'][key].to_s + " " +# ActionController::Base::logger.debug key.to_s +# ActionController::Base::logger.debug font['cw'][key].to_s + } + out(w+'] 231 325 500 631 [500] 326 389 500]') + out('>>') + out('endobj') + #Font descriptor + newobj() + out('<>') + out('endobj') + end + + # + # putimages + # @access protected + # + def putimages() + filter=(@compress) ? '/Filter /FlateDecode ' : ''; + @images.each do |file, info| # was while(list(file, info)=each(@images)) + newobj(); + @images[file]['n']=@n; + out('<>'); + putstream(info['data']); + @images[file]['data']=nil + out('endobj'); + #Palette + if (info['cs']=='Indexed') + newobj(); + pal=(@compress) ? gzcompress(info['pal']) : :info['pal']; + out('<<' + filter + '/Length ' + pal.length.to_s + '>>'); + putstream(pal); + out('endobj'); + end + end + end + + # + # putxobjectdict + # @access protected + # + def putxobjectdict() + @images.each_value do |image| + out('/I' + image['i'].to_s + ' ' + image['n'].to_s + ' 0 R'); + end + end + + # + # putresourcedict + # @access protected + # + def putresourcedict() + out('/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]'); + out('/Font <<'); + @fonts.each_value do |font| + out('/F' + font['i'].to_s + ' ' + font['n'].to_s + ' 0 R'); + end + out('>>'); + out('/XObject <<'); + putxobjectdict(); + out('>>'); + end + + # + # putresources + # @access protected + # + def putresources() + putfonts(); + putimages(); + #Resource dictionary + @offsets[2]=@buffer.length; + out('2 0 obj'); + out('<<'); + putresourcedict(); + out('>>'); + out('endobj'); + end + + # + # putinfo + # @access protected + # + def putinfo() + out('/Producer ' + textstring(PDF_PRODUCER)); + if (!@title.nil?) + out('/Title ' + textstring(@title)); + end + if (!@subject.nil?) + out('/Subject ' + textstring(@subject)); + end + if (!@author.nil?) + out('/Author ' + textstring(@author)); + end + if (!@keywords.nil?) + out('/Keywords ' + textstring(@keywords)); + end + if (!@creator.nil?) + out('/Creator ' + textstring(@creator)); + end + out('/CreationDate ' + textstring('D:' + Time.now.strftime('%Y%m%d%H%M%S'))); + end + + # + # putcatalog + # @access protected + # + def putcatalog() + out('/Type /Catalog'); + out('/Pages 1 0 R'); + if (@zoom_mode=='fullpage') + out('/OpenAction [3 0 R /Fit]'); + elsif (@zoom_mode=='fullwidth') + out('/OpenAction [3 0 R /FitH null]'); + elsif (@zoom_mode=='real') + out('/OpenAction [3 0 R /XYZ null null 1]'); + elsif (!@zoom_mode.is_a?(String)) + out('/OpenAction [3 0 R /XYZ null null ' + (@zoom_mode/100) + ']'); + end + if (@layout_mode=='single') + out('/PageLayout /SinglePage'); + elsif (@layout_mode=='continuous') + out('/PageLayout /OneColumn'); + elsif (@layout_mode=='two') + out('/PageLayout /TwoColumnLeft'); + end + end + + # + # puttrailer + # @access protected + # + def puttrailer() + out('/Size ' + (@n+1).to_s); + out('/Root ' + @n.to_s + ' 0 R'); + out('/Info ' + (@n-1).to_s + ' 0 R'); + end + + # + # putheader + # @access protected + # + def putheader() + out('%PDF-' + @pdf_version); + end + + # + # enddoc + # @access protected + # + def enddoc() + putheader(); + putpages(); + putresources(); + #Info + newobj(); + out('<<'); + putinfo(); + out('>>'); + out('endobj'); + #Catalog + newobj(); + out('<<'); + putcatalog(); + out('>>'); + out('endobj'); + #Cross-ref + o=@buffer.length; + out('xref'); + out('0 ' + (@n+1).to_s); + out('0000000000 65535 f '); + 1.upto(@n) do |i| + out(sprintf('%010d 00000 n ',@offsets[i])); + end + #Trailer + out('trailer'); + out('<<'); + puttrailer(); + out('>>'); + out('startxref'); + out(o); + out('%%EOF'); + @state=3; + end + + # + # beginpage + # @access protected + # + def beginpage(orientation) + @page += 1; + @pages[@page]=''; + @state=2; + @x=@l_margin; + @y=@t_margin; + @font_family=''; + #Page orientation + if (orientation.empty?) + orientation=@def_orientation; + else + orientation.upcase! + if (orientation!=@def_orientation) + @orientation_changes[@page]=true; + end + end + if (orientation!=@cur_orientation) + #Change orientation + if (orientation=='P') + @w_pt=@fw_pt; + @h_pt=@fh_pt; + @w=@fw; + @h=@fh; + else + @w_pt=@fh_pt; + @h_pt=@fw_pt; + @w=@fh; + @h=@fw; + end + @page_break_trigger=@h-@b_margin; + @cur_orientation = orientation; + end + end + + # + # End of page contents + # @access protected + # + def endpage() + @state=1; + end + + # + # Begin a new object + # @access protected + # + def newobj() + @n += 1; + @offsets[@n]=@buffer.length; + out(@n.to_s + ' 0 obj'); + end + + # + # Underline text + # @access protected + # + def dounderline(x, y, txt) + up = @current_font['up']; + ut = @current_font['ut']; + w = GetStringWidth(txt) + @ws * txt.count(' '); + sprintf('%.2f %.2f %.2f %.2f re f', x * @k, (@h - (y - up / 1000.0 * @font_size)) * @k, w * @k, -ut / 1000.0 * @font_size_pt); + end + + # + # Extract info from a JPEG file + # @access protected + # + def parsejpg(file) + a=getimagesize(file); + if (a.empty?) + Error('Missing or incorrect image file: ' + file); + end + if (a[2]!='JPEG') + Error('Not a JPEG file: ' + file); + end + if (a['channels'].nil? or a['channels']==3) + colspace='DeviceRGB'; + elsif (a['channels']==4) + colspace='DeviceCMYK'; + else + colspace='DeviceGray'; + end + bpc=!a['bits'].nil? ? a['bits'] : 8; + #Read whole file + data=''; + open(file,'rb') do |f| + data< a[0],'h' => a[1],'cs' => colspace,'bpc' => bpc,'f'=>'DCTDecode','data' => data} + end + + # + # Extract info from a PNG file + # @access protected + # + def parsepng(file) + f=open(file,'rb'); + #Check signature + if (f.read(8)!=137.chr + 'PNG' + 13.chr + 10.chr + 26.chr + 10.chr) + Error('Not a PNG file: ' + file); + end + #Read header chunk + f.read(4); + if (f.read(4)!='IHDR') + Error('Incorrect PNG file: ' + file); + end + w=freadint(f); + h=freadint(f); + bpc=f.read(1)[0]; + if (bpc>8) + Error('16-bit depth not supported: ' + file); + end + ct=f.read(1)[0]; + if (ct==0) + colspace='DeviceGray'; + elsif (ct==2) + colspace='DeviceRGB'; + elsif (ct==3) + colspace='Indexed'; + else + Error('Alpha channel not supported: ' + file); + end + if (f.read(1)[0] != 0) + Error('Unknown compression method: ' + file); + end + if (f.read(1)[0]!=0) + Error('Unknown filter method: ' + file); + end + if (f.read(1)[0]!=0) + Error('Interlacing not supported: ' + file); + end + f.read(4); + parms='/DecodeParms <>'; + #Scan chunks looking for palette, transparency and image data + pal=''; + trns=''; + data=''; + begin + n=freadint(f); + type=f.read(4); + if (type=='PLTE') + #Read palette + pal=f.read( n); + f.read(4); + elsif (type=='tRNS') + #Read transparency info + t=f.read( n); + if (ct==0) + trns = t[1][0] + elsif (ct==2) + trns = t[[1][0], t[3][0], t[5][0]] + else + pos=t.include?(0.chr); + if (pos!=false) + trns = [pos] + end + end + f.read(4); + elsif (type=='IDAT') + #Read image data block + data< w, 'h' => h, 'cs' => colspace, 'bpc' => bpc, 'f'=>'FlateDecode', 'parms' => parms, 'pal' => pal, 'trns' => trns, 'data' => data} + end + + # + # Read a 4-byte integer from file + # @access protected + # + def freadint(f) + # Read a 4-byte integer from file + a = f.read(4).unpack('N') + return a[0] + end + + # + # Format a text string + # @access protected + # + def textstring(s) + if (@is_unicode) + #Convert string to UTF-16BE + s = UTF8ToUTF16BE(s, true); + end + return '(' + escape(s) + ')'; + end + + # + # Format a text string + # @access protected + # + def escapetext(s) + if (@is_unicode) + #Convert string to UTF-16BE + s = UTF8ToUTF16BE(s, false); + end + return escape(s); + end + + # + # Add \ before \, ( and ) + # @access protected + # + def escape(s) + # Add \ before \, ( and ) + s.gsub('\\','\\\\\\').gsub('(','\\(').gsub(')','\\)').gsub(13.chr, '\r') + end + + # + # + # @access protected + # + def putstream(s) + out('stream'); + out(s); + out('endstream'); + end + + # + # Add a line to the document + # @access protected + # + def out(s) + if (@state==2) + @pages[@page] << s.to_s + "\n"; + else + @buffer << s.to_s + "\n"; + end + end + + # + # Adds unicode fonts.
    + # Based on PDF Reference 1.3 (section 5) + # @access protected + # @author Nicola Asuni + # @since 1.52.0.TC005 (2005-01-05) + # + def puttruetypeunicode(font) + # Type0 Font + # A composite font composed of other fonts, organized hierarchically + newobj(); + out('<>'); + out('endobj'); + + # CIDFontType2 + # A CIDFont whose glyph descriptions are based on TrueType font technology + newobj(); + out('<>'); + out('endobj'); + + # ToUnicode + # is a stream object that contains the definition of the CMap + # (PDF Reference 1.3 chap. 5.9) + newobj(); + out('<>'); + out('stream'); + out('/CIDInit /ProcSet findresource begin'); + out('12 dict begin'); + out('begincmap'); + out('/CIDSystemInfo'); + out('<> def'); + out('/CMapName /Adobe-Identity-UCS def'); + out('/CMapType 2 def'); + out('1 begincodespacerange'); + out('<0000> '); + out('endcodespacerange'); + out('1 beginbfrange'); + out('<0000> <0000>'); + out('endbfrange'); + out('endcmap'); + out('CMapName currentdict /CMap defineresource pop'); + out('end'); + out('end'); + out('endstream'); + out('endobj'); + + # CIDSystemInfo dictionary + # A dictionary containing entries that define the character collection of the CIDFont. + newobj(); + out('<>'); + out('endobj'); + + # Font descriptor + # A font descriptor describing the CIDFont default metrics other than its glyph widths + newobj(); + out('<>'); + out('endobj'); + + # Embed CIDToGIDMap + # A specification of the mapping from CIDs to glyph indices + newobj(); + ctgfile = getfontpath(font['ctg']) + if (!ctgfile) + Error('Font file not found: ' + ctgfile); + end + size = File.size(ctgfile); + out('<>'); + open(ctgfile, "rb") do |f| + putstream(f.read()) + end + out('endobj'); + end + + # + # Converts UTF-8 strings to codepoints array.
    + # Invalid byte sequences will be replaced with 0xFFFD (replacement character)
    + # Based on: http://www.faqs.org/rfcs/rfc3629.html + #
    +	# 	  Char. number range  |        UTF-8 octet sequence
    +	#       (hexadecimal)    |              (binary)
    +	#    --------------------+-----------------------------------------------
    +	#    0000 0000-0000 007F | 0xxxxxxx
    +	#    0000 0080-0000 07FF | 110xxxxx 10xxxxxx
    +	#    0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
    +	#    0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
    +	#    ---------------------------------------------------------------------
    +	#
    +	#   ABFN notation:
    +	#   ---------------------------------------------------------------------
    +	#   UTF8-octets =#( UTF8-char )
    +	#   UTF8-char   = UTF8-1 / UTF8-2 / UTF8-3 / UTF8-4
    +	#   UTF8-1      = %x00-7F
    +	#   UTF8-2      = %xC2-DF UTF8-tail
    +	#
    +	#   UTF8-3      = %xE0 %xA0-BF UTF8-tail / %xE1-EC 2( UTF8-tail ) /
    +	#                 %xED %x80-9F UTF8-tail / %xEE-EF 2( UTF8-tail )
    +	#   UTF8-4      = %xF0 %x90-BF 2( UTF8-tail ) / %xF1-F3 3( UTF8-tail ) /
    +	#                 %xF4 %x80-8F 2( UTF8-tail )
    +	#   UTF8-tail   = %x80-BF
    +	#   ---------------------------------------------------------------------
    +	# 
    + # @param string :str string to process. + # @return array containing codepoints (UTF-8 characters values) + # @access protected + # @author Nicola Asuni + # @since 1.53.0.TC005 (2005-01-05) + # + def UTF8StringToArray(str) + if (!@is_unicode) + return str; # string is not in unicode + end + + unicode = [] # array containing unicode values + bytes = [] # array containing single character byte sequences + numbytes = 1; # number of octetc needed to represent the UTF-8 character + + str = str.to_s; # force :str to be a string + + str.each_byte do |char| + if (bytes.length == 0) # get starting octect + if (char <= 0x7F) + unicode << char # use the character "as is" because is ASCII + numbytes = 1 + elsif ((char >> 0x05) == 0x06) # 2 bytes character (0x06 = 110 BIN) + bytes << ((char - 0xC0) << 0x06) + numbytes = 2 + elsif ((char >> 0x04) == 0x0E) # 3 bytes character (0x0E = 1110 BIN) + bytes << ((char - 0xE0) << 0x0C) + numbytes = 3 + elsif ((char >> 0x03) == 0x1E) # 4 bytes character (0x1E = 11110 BIN) + bytes << ((char - 0xF0) << 0x12) + numbytes = 4 + else + # use replacement character for other invalid sequences + unicode << 0xFFFD + bytes = [] + numbytes = 1 + end + elsif ((char >> 0x06) == 0x02) # bytes 2, 3 and 4 must start with 0x02 = 10 BIN + bytes << (char - 0x80) + if (bytes.length == numbytes) + # compose UTF-8 bytes to a single unicode value + char = bytes[0] + 1.upto(numbytes-1) do |j| + char += (bytes[j] << ((numbytes - j - 1) * 0x06)) + end + if (((char >= 0xD800) and (char <= 0xDFFF)) or (char >= 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 << char; # add char to array + end + # reset data for next char + bytes = [] + numbytes = 1; + end + else + # use replacement character for other invalid sequences + unicode << 0xFFFD; + bytes = [] + numbytes = 1; + end + end + return unicode; + end + + # + # Converts UTF-8 strings to UTF16-BE.
    + # Based on: http://www.faqs.org/rfcs/rfc2781.html + #
    +	#   Encoding UTF-16:
    +	# 
    +		#   Encoding of a single character from an ISO 10646 character value to
    +	#    UTF-16 proceeds as follows. Let U be the character number, no greater
    +	#    than 0x10FFFF.
    +	# 
    +	#    1) If U < 0x10000, encode U as a 16-bit unsigned integer and
    +	#       terminate.
    +	# 
    +	#    2) Let U' = U - 0x10000. Because U is less than or equal to 0x10FFFF,
    +	#       U' must be less than or equal to 0xFFFFF. That is, U' can be
    +	#       represented in 20 bits.
    +	# 
    +	#    3) Initialize two 16-bit unsigned integers, W1 and W2, to 0xD800 and
    +	#       0xDC00, respectively. These integers each have 10 bits free to
    +	#       encode the character value, for a total of 20 bits.
    +	# 
    +	#    4) Assign the 10 high-order bits of the 20-bit U' to the 10 low-order
    +	#       bits of W1 and the 10 low-order bits of U' to the 10 low-order
    +	#       bits of W2. Terminate.
    +	# 
    +	#    Graphically, steps 2 through 4 look like:
    +	#    U' = yyyyyyyyyyxxxxxxxxxx
    +	#    W1 = 110110yyyyyyyyyy
    +	#    W2 = 110111xxxxxxxxxx
    +	# 
    + # @param string :str string to process. + # @param boolean :setbom if true set the Byte Order Mark (BOM = 0xFEFF) + # @return string + # @access protected + # @author Nicola Asuni + # @since 1.53.0.TC005 (2005-01-05) + # @uses UTF8StringToArray + # + def UTF8ToUTF16BE(str, setbom=true) + if (!@is_unicode) + return str; # string is not in unicode + end + outstr = ""; # string to be returned + unicode = UTF8StringToArray(str); # array containing UTF-8 unicode values + numitems = unicode.length; + + if (setbom) + outstr << "\xFE\xFF"; # Byte Order Mark (BOM) + end + unicode.each do |char| + if (char == 0xFFFD) + outstr << "\xFF\xFD"; # replacement character + elsif (char < 0x10000) + outstr << (char >> 0x08).chr; + outstr << (char & 0xFF).chr; + else + char -= 0x10000; + w1 = 0xD800 | (char >> 0x10); + w2 = 0xDC00 | (char & 0x3FF); + outstr << (w1 >> 0x08).chr; + outstr << (w1 & 0xFF).chr; + outstr << (w2 >> 0x08).chr; + outstr << (w2 & 0xFF).chr; + end + end + return outstr; + end + + # ==================================================== + + # + # Set header font. + # @param array :font font + # @since 1.1 + # + def SetHeaderFont(font) + @header_font = font; + end + alias_method :set_header_font, :SetHeaderFont + + # + # Set footer font. + # @param array :font font + # @since 1.1 + # + def SetFooterFont(font) + @footer_font = font; + end + alias_method :set_footer_font, :SetFooterFont + + # + # Set language array. + # @param array :language + # @since 1.1 + # + def SetLanguageArray(language) + @l = language; + end + alias_method :set_language_array, :SetLanguageArray + # + # Set document barcode. + # @param string :bc barcode + # + def SetBarcode(bc="") + @barcode = bc; + end + + # + # Print Barcode. + # @param int :x x position in user units + # @param int :y y position in user units + # @param int :w width in user units + # @param int :h height position in user units + # @param string :type type of barcode (I25, C128A, C128B, C128C, C39) + # @param string :style barcode style + # @param string :font font for text + # @param int :xres x resolution + # @param string :code code to print + # + def writeBarcode(x, y, w, h, type, style, font, xres, code) + require(File.dirname(__FILE__) + "/barcode/barcode.rb"); + require(File.dirname(__FILE__) + "/barcode/i25object.rb"); + require(File.dirname(__FILE__) + "/barcode/c39object.rb"); + require(File.dirname(__FILE__) + "/barcode/c128aobject.rb"); + require(File.dirname(__FILE__) + "/barcode/c128bobject.rb"); + require(File.dirname(__FILE__) + "/barcode/c128cobject.rb"); + + if (code.empty?) + return; + end + + if (style.empty?) + style = BCS_ALIGN_LEFT; + style |= BCS_IMAGE_PNG; + style |= BCS_TRANSPARENT; + #:style |= BCS_BORDER; + #:style |= BCS_DRAW_TEXT; + #:style |= BCS_STRETCH_TEXT; + #:style |= BCS_REVERSE_COLOR; + end + if (font.empty?) then font = BCD_DEFAULT_FONT; end + if (xres.empty?) then xres = BCD_DEFAULT_XRES; end + + scale_factor = 1.5 * xres * @k; + bc_w = (w * scale_factor).round #width in points + bc_h = (h * scale_factor).round #height in points + + case (type.upcase) + when "I25" + obj = I25Object.new(bc_w, bc_h, style, code); + when "C128A" + obj = C128AObject.new(bc_w, bc_h, style, code); + when "C128B" + obj = C128BObject.new(bc_w, bc_h, style, code); + when "C128C" + obj = C128CObject.new(bc_w, bc_h, style, code); + when "C39" + obj = C39Object.new(bc_w, bc_h, style, code); + end + + obj.SetFont(font); + obj.DrawObject(xres); + + #use a temporary file.... + tmpName = tempnam(@@k_path_cache,'img'); + imagepng(obj.getImage(), tmpName); + Image(tmpName, x, y, w, h, 'png'); + obj.DestroyObject(); + obj = nil + unlink(tmpName); + end + + # + # Returns the PDF data. + # + def GetPDFData() + if (@state < 3) + Close(); + end + return @buffer; + end + + # --- HTML PARSER FUNCTIONS --- + + # + # Allows to preserve some HTML formatting.
    + # Supports: h1, h2, h3, h4, h5, h6, b, u, i, a, img, p, br, strong, em, font, blockquote, li, ul, ol, hr, td, th, tr, table, sup, sub, small + # @param string :html text to display + # @param boolean :ln if true add a new line after text (default = true) + # @param int :fill Indicates if the background must be painted (1) or transparent (0). Default value: 0. + # + def writeHTML(html, ln=true, fill=0, h=0) + + @lasth = h if h > 0 + if (@lasth == 0) + #set row height + @lasth = @font_size * @@k_cell_height_ratio; + end + + @href = nil + @style = {} + html.gsub!(/[\t\r\n\f]/, "")#\0\x0B + html.split(/(<[^>]+>)/).each do |element| + if "<" == element[0,1] + #Tag + if (element[1, 1] == '/') + closedHTMLTagHandler(element[2..-2].downcase); + else + #Extract attributes + # get tag name + tag = element.scan(/([a-zA-Z0-9]*)/).flatten.delete_if {|x| x.length == 0} + tag = tag[0].downcase; + + # get attributes + attr_array = element.scan(/([^=\s]*)=["\']?([^"\']*)["\']?/) + attrs = {} + attr_array.each do |name, value| + attrs[name.downcase] = value; + end + openHTMLTagHandler(tag, attrs, fill); + end + + else + #Text + if (@href) + addHtmlLink(@href, element, fill); + elsif (@tdbegin) + if ((element.strip.length > 0) and (element != " ")) + Cell(@tdwidth, @tdheight, unhtmlentities(element.strip), @tableborder, 0, @tdalign, @tdfill); + elsif (element == " ") + Cell(@tdwidth, @tdheight, '', @tableborder, 0, @tdalign, @tdfill); + end + elsif ((element.strip.length > 0) and (element != " ")) + Write(@lasth, unhtmlentities(element), '', fill); + end + end + end + + if (ln) + Ln(@lasth); + end + end + alias_method :write_html, :writeHTML + + # + # Prints a cell (rectangular area) with optional borders, background color and html text string. The upper-left corner of the cell corresponds to the current position. After the call, the current position moves to the right or to the next line.
    + # If automatic page breaking is enabled and the cell goes beyond the limit, a page break is done before outputting. + # @param float :w Cell width. If 0, the cell extends up to the right margin. + # @param float :h Cell minimum height. The cell extends automatically if needed. + # @param float :x upper-left corner X coordinate + # @param float :y upper-left corner Y coordinate + # @param string :html html text to print. Default value: empty string. + # @param mixed :border Indicates if borders must be drawn around the cell. The value can be either a number:
    • 0: no border (default)
    • 1: frame
    or a string containing some or all of the following characters (in any order):
    • L: left
    • T: top
    • R: right
    • B: bottom
    + # @param int :ln Indicates where the current position should go after the call. Possible values are:
    • 0: to the right
    • 1: to the beginning of the next line
    • 2: below
    +# Putting 1 is equivalent to putting 0 and calling Ln() just after. Default value: 0. + # @param int :fill Indicates if the cell background must be painted (1) or transparent (0). Default value: 0. + # @see Cell() + # + def writeHTMLCell(w, h, x, y, html='', border=0, ln=0, fill=0) + + if (@lasth == 0) + #set row height + @lasth = @font_size * @@k_cell_height_ratio; + end + + if (x == 0) + x = GetX(); + end + if (y == 0) + y = GetY(); + end + + # get current page number + pagenum = @page; + + SetX(x); + SetY(y); + + if (w == 0) + w = @fw - x - @r_margin; + end + + # store original margin values + l_margin = @l_margin; + r_margin = @r_margin; + + # set new margin values + SetLeftMargin(x); + SetRightMargin(@fw - x - w); + + # calculate remaining vertical space on page + restspace = GetPageHeight() - GetY() - GetBreakMargin(); + + writeHTML(html, true, fill); # write html text + + currentY = GetY(); + + # check if a new page has been created + if (@page > pagenum) + # design a cell around the text on first page + currentpage = @page; + @page = pagenum; + SetY(GetPageHeight() - restspace - GetBreakMargin()); + h = restspace - 1; + Cell(w, h, "", border, ln, 'L', 0); + # design a cell around the text on last page + @page = currentpage; + h = currentY - @t_margin; + SetY(@t_margin); # put cursor at the beginning of text + Cell(w, h, "", border, ln, 'L', 0); + else + h = [h, (currentY - y)].max; + SetY(y); # put cursor at the beginning of text + # design a cell around the text + Cell(w, h, "", border, ln, 'L', 0); + end + + # restore original margin values + SetLeftMargin(l_margin); + SetRightMargin(r_margin); + + if (ln) + Ln(0); + end + end + alias_method :write_html_cell, :writeHTMLCell + + # + # Process opening tags. + # @param string :tag tag name (in upcase) + # @param string :attr tag attribute (in upcase) + # @param int :fill Indicates if the cell background must be painted (1) or transparent (0). Default value: 0. + # @access private + # + def openHTMLTagHandler(tag, attrs, fill=0) + #Opening tag + case (tag) + when 'table' + if attrs['border'].nil? or attrs['border'] == '' + @tableborder = 0; + else + @tableborder = attrs['border']; + end + when 'tr', 'td', 'th' + # SetStyle('b', true) if tag == 'th' + + if ((!attrs['width'].nil?) and (attrs['width'] != '')) + @tdwidth = (attrs['width'].to_i/4); + else + @tdwidth = ((@w - @l_margin - @r_margin) / @default_table_columns); + end + if ((!attrs['height'].nil?) and (attrs['height'] != '')) + @tdheight=(attrs['height'].to_i / @k); + else + @tdheight = @lasth; + end + if ((!attrs['align'].nil?) and (attrs['align'] != '')) + case (attrs['align']) + when 'center' + @tdalign = "C"; + when 'right' + @tdalign = "R"; + when 'left' + @tdalign = "L"; + end + end + if ((!attrs['bgcolor'].nil?) and (attrs['bgcolor'] != '')) + coul = convertColorHexToDec(attrs['bgcolor']); + SetFillColor(coul['R'], coul['G'], coul['B']); + @tdfill=1; + end + @tdbegin=true; + + when 'hr' + Ln(); + if ((!attrs['width'].nil?) and (attrs['width'] != '')) + hrWidth = attrs['width']; + else + hrWidth = @w - @l_margin - @r_margin; + end + x = GetX(); + y = GetY(); + SetLineWidth(0.2); + Line(x, y, x + hrWidth, y); + SetLineWidth(0.2); + Ln(); + + when 'strong' + SetStyle('b', true); + + when 'em' + SetStyle('i', true); + + when 'b', 'i', 'u' + SetStyle(tag, true); + + when 'a' + @href = attrs['href']; + + when 'img' + if (!attrs['src'].nil?) + # replace relative path with real server path + attrs['src'] = attrs['src'].gsub(@@k_path_url_cache, @@k_path_cache); + if (attrs['width'].nil?) + attrs['width'] = 0; + end + if (attrs['height'].nil?) + attrs['height'] = 0; + end + + Image(attrs['src'], GetX(),GetY(), pixelsToMillimeters(attrs['width']), pixelsToMillimeters(attrs['height'])); + #SetX(@img_rb_x); + SetY(@img_rb_y); + + end + + when 'ul' + @listordered = false; + @listcount = 0; + + when 'ol' + @listordered = true; + @listcount = 0; + + when 'li' + Ln(); + if (@listordered) + @listcount += 1 + @lispacer = " " + (@listcount).to_s + ". "; + else + #unordered list simbol + @lispacer = " - "; + end + Write(@lasth, @lispacer, '', fill); + + when 'blockquote', 'br' + Ln(); + if (@lispacer.length > 0) + @x += GetStringWidth(@lispacer); + end + + when 'p' + Ln(); + Ln(); + + when 'sup' + currentfont_size = @font_size; + @tempfontsize = @font_size_pt; + SetFontSize(@font_size_pt * @@k_small_ratio); + SetXY(GetX(), GetY() - ((currentfont_size - @font_size)*(@@k_small_ratio))); + + when 'sub' + currentfont_size = @font_size; + @tempfontsize = @font_size_pt; + SetFontSize(@font_size_pt * @@k_small_ratio); + SetXY(GetX(), GetY() + ((currentfont_size - @font_size)*(@@k_small_ratio))); + + when 'small' + currentfont_size = @font_size; + @tempfontsize = @font_size_pt; + SetFontSize(@font_size_pt * @@k_small_ratio); + SetXY(GetX(), GetY() + ((currentfont_size - @font_size)/3)); + + when 'font' + if (!attrs['color'].nil? and attrs['color']!='') + coul = convertColorHexToDec(attrs['color']); + SetTextColor(coul['R'], coul['G'], coul['B']); + @issetcolor=true; + end + if (!attrs['face'].nil? and @fontlist.include?(attrs['face'].downcase)) + SetFont(attrs['face'].downcase); + @issetfont=true; + end + if (!attrs['size'].nil?) + headsize = attrs['size'].to_i; + else + headsize = 0; + end + currentfont_size = @font_size; + @tempfontsize = @font_size_pt; + SetFontSize(@font_size_pt + headsize); + @lasth = @font_size * @@k_cell_height_ratio; + + when 'h1', 'h2', 'h3', 'h4', 'h5', 'h6' + headsize = (4 - tag[1,1].to_f) * 2 + @tempfontsize = @font_size_pt; + SetFontSize(@font_size_pt + headsize); + SetStyle('b', true); + @lasth = @font_size * @@k_cell_height_ratio; + + end + end + + # + # Process closing tags. + # @param string :tag tag name (in upcase) + # @access private + # + def closedHTMLTagHandler(tag) + #Closing tag + case (tag) + when 'td','th' + @tdbegin = false; + @tdwidth = 0; + @tdheight = 0; + @tdalign = "L"; + @tdfill = 0; + SetFillColor(@prevfill_color[0], @prevfill_color[1], @prevfill_color[2]); + + when 'tr' + Ln(); + + when 'table' + @tableborder=0; + + when 'strong' + SetStyle('b', false); + + when 'em' + SetStyle('i', false); + + when 'b', 'i', 'u' + SetStyle(tag, false); + + when 'a' + @href = nil; + + when 'sup' + currentfont_size = @font_size; + SetFontSize(@tempfontsize); + @tempfontsize = @font_size_pt; + SetXY(GetX(), GetY() - ((currentfont_size - @font_size)*(@@k_small_ratio))); + + when 'sub' + currentfont_size = @font_size; + SetFontSize(@tempfontsize); + @tempfontsize = @font_size_pt; + SetXY(GetX(), GetY() + ((currentfont_size - @font_size)*(@@k_small_ratio))); + + when 'small' + currentfont_size = @font_size; + SetFontSize(@tempfontsize); + @tempfontsize = @font_size_pt; + SetXY(GetX(), GetY() - ((@font_size - currentfont_size)/3)); + + when 'font' + if (@issetcolor == true) + SetTextColor(@prevtext_color[0], @prevtext_color[1], @prevtext_color[2]); + end + if (@issetfont) + @font_family = @prevfont_family; + @font_style = @prevfont_style; + SetFont(@font_family); + @issetfont = false; + end + currentfont_size = @font_size; + SetFontSize(@tempfontsize); + @tempfontsize = @font_size_pt; + #@text_color = @prevtext_color; + @lasth = @font_size * @@k_cell_height_ratio; + + when 'ul' + Ln(); + + when 'ol' + Ln(); + + when 'li' + @lispacer = ""; + + when 'h1', 'h2', 'h3', 'h4', 'h5', 'h6' + SetFontSize(@tempfontsize); + @tempfontsize = @font_size_pt; + SetStyle('b', false); + Ln(); + @lasth = @font_size * @@k_cell_height_ratio; + + end + end + + # + # Sets font style. + # @param string :tag tag name (in lowercase) + # @param boolean :enable + # @access private + # + def SetStyle(tag, enable) + #Modify style and select corresponding font + style=''; + ['b', 'i', 'u'].each do |s| + style << s if tag.downcase == s and enable + end + SetFont('', style); + end + + # + # Output anchor link. + # @param string :url link URL + # @param string :name link name + # @param int :fill Indicates if the cell background must be painted (1) or transparent (0). Default value: 0. + # @access public + # + def addHtmlLink(url, name, fill=0) + #Put a hyperlink + SetTextColor(0, 0, 255); + SetStyle('u', true); + Write(@lasth, name, url, fill); + SetStyle('u', false); + SetTextColor(0); + end + + # + # Returns an associative array (keys: R,G,B) from + # a hex html code (e.g. #3FE5AA). + # @param string :color hexadecimal html color [#rrggbb] + # @return array + # @access private + # + def convertColorHexToDec(color = "#000000") + tbl_color = {} + tbl_color['R'] = color[1,2].hex.to_i; + tbl_color['G'] = color[3,2].hex.to_i; + tbl_color['B'] = color[5,2].hex.to_i; + return tbl_color; + end + + # + # Converts pixels to millimeters in 72 dpi. + # @param int :px pixels + # @return float millimeters + # @access private + # + def pixelsToMillimeters(px) + return px.to_f * 25.4 / 72; + end + + # + # Reverse function for htmlentities. + # Convert entities in UTF-8. + # + # @param :text_to_convert Text to convert. + # @return string converted + # + def unhtmlentities(string) + if @@decoder.nil? + CGI.unescapeHTML(string) + else + @@decoder.decode(string) + end + end + +end # END OF CLASS + +#TODO 2007-05-25 (EJM) Level=0 - +#Handle special IE contype request +# if (!_SERVER['HTTP_USER_AGENT'].nil? and (_SERVER['HTTP_USER_AGENT']=='contype')) +# header('Content-Type: application/pdf'); +# exit; +# } diff --git a/vendor/plugins/rfpdf/logo_example.png b/vendor/plugins/rfpdf/logo_example.png new file mode 100755 index 00000000..13799452 Binary files /dev/null and b/vendor/plugins/rfpdf/logo_example.png differ diff --git a/vendor/plugins/rfpdf/test_unicode.rfpdf b/vendor/plugins/rfpdf/test_unicode.rfpdf new file mode 100644 index 00000000..fa10127d --- /dev/null +++ b/vendor/plugins/rfpdf/test_unicode.rfpdf @@ -0,0 +1,115 @@ +<% + doc_title = "test title"; + doc_subject = "test description"; + doc_keywords = "test keywords"; + htmlcontent = "< € € € & è è © >

    heading 1

    heading 2

    heading 3

    heading 4

    heading 5
    heading 6
    ordered list:
    1. bold text
    2. italic text
    3. underlined text
    4. link to http://www.tecnick.com
    5. test break
      second line
      third line
    6. font + 3
    7. small text
    8. normal subscript superscript

    9. table:
      #AB
      1A1B1
      2A2 € € € & è è B2
      3A3B3

      image:
      \"test"; + + + # ENGLISH + + @l = {} + + # PAGE META DESCRIPTORS -------------------------------------- + + @l['a_meta_charset'] = "UTF-8"; + @l['a_meta_dir'] = "ltr"; + @l['a_meta_language'] = "en"; + + # TRANSLATIONS -------------------------------------- + @l['w_page'] = "page"; + + + # create new PDF document (document units are set by default to millimeters) + pdf = TCPDF.new + + # set document information + pdf.SetCreator("TCPDF"); + pdf.SetAuthor("TCPDF"); + pdf.SetTitle(doc_title); + pdf.SetSubject(doc_subject); + pdf.SetKeywords(doc_keywords); + + pdf.SetHeaderData("#{File.join(RAILS_ROOT, 'public')}/logo_example.png", 20, "header title", "first row\nsecond row\nthird row"); + + #set margins + pdf.SetMargins(15, 27, 15); + #set auto page breaks + pdf.SetAutoPageBreak(true, 25); + pdf.SetPrintHeader + pdf.SetPrintFooter + pdf.SetHeaderMargin(5); + pdf.SetFooterMargin(10); + pdf.SetImageScale(4); #set image scale factor + + pdf.SetHeaderFont(["FreeSans", '', 10]); + pdf.SetFooterFont(["FreeSans", '', 8]); + + pdf.SetLanguageArray(@l); #set language items + + + #initialize document + pdf.alias_nb_pages(); + + pdf.AddPage(); + + # set barcode + # pdf.SetBarcode(Time.now.strftime("Y-m-d H:i:s")); + + # output some HTML code + pdf.SetFont("vera", "", 10); + + pdf.writeHTML(htmlcontent, true, 0); + + # output two html columns + first_column_width = 80; + current_y_position = pdf.GetY(); + pdf.writeHTMLCell(first_column_width, 0, 0, current_y_position, "hello", 0, 0, 0); + pdf.writeHTMLCell(0, 0, first_column_width, current_y_position, "world", 0, 1, 0); + + # output some content + pdf.SetFont("vera", "BI", 20); + pdf.Cell(0,10,"TEST Bold-Italic Cell",1,1,'C'); + + # output some UTF-8 test content + pdf.AddPage(); + pdf.SetFont("FreeSans", "", 12); + utf8text = open(File.join(RAILS_ROOT, 'vendor/plugins/rfpdf',"utf8test.txt"), "rb").read; # get utf-8 text form file + pdf.SetFillColor(230, 240, 255, true); + pdf.Write(5, utf8text, '', 1); + + # remove page header/footer + pdf.SetPrintHeader(false); + pdf.SetPrintFooter(false); + + # Two HTML columns test + pdf.AddPage(); + right_column = "right column right column right column right column right column + right column right column right column right column right column right column + right column right column right column right column right column right column"; + left_column = "left column left column left column left column left column left + column left column left column left column left column left column left column + left column left column left column left column left column left column left + column"; + first_column_width = 80; + second_column_width = 80; + column_space = 20; + current_y_position = pdf.GetY(); + pdf.writeHTMLCell(first_column_width, 0, 0, 0, left_column, 1, 0, 0); + pdf.Cell(0); + pdf.writeHTMLCell(second_column_width, 0, first_column_width+column_space, current_y_position, right_column, 0, 0, 0); + + # add page header/footer + pdf.SetPrintHeader(true); + pdf.SetPrintFooter(true); + + pdf.AddPage(); + + # Multicell test + pdf.MultiCell(40, 5, "A test multicell line 1\ntest multicell line 2\ntest multicell line 3", 1, 'J', 0, 0); + pdf.MultiCell(40, 5, "B test multicell line 1\ntest multicell line 2\ntest multicell line 3", 1, 'J', 0); + pdf.MultiCell(40, 5, "C test multicell line 1\ntest multicell line 2\ntest multicell line 3", 1, 'J', 0, 0); + pdf.MultiCell(40, 5, "D test multicell line 1\ntest multicell line 2\ntest multicell line 3", 1, 'J', 0, 2); + pdf.MultiCell(40, 5, "F test multicell line 1\ntest multicell line 2\ntest multicell line 3", 1, 'J', 0); + + #Close and output PDF document +%><%=pdf.Output()%> \ No newline at end of file diff --git a/vendor/plugins/rfpdf/utf8test.txt b/vendor/plugins/rfpdf/utf8test.txt new file mode 100755 index 00000000..fd952da3 --- /dev/null +++ b/vendor/plugins/rfpdf/utf8test.txt @@ -0,0 +1,135 @@ +Sentences that contain all letters commonly used in a language +-------------------------------------------------------------- + +Markus Kuhn -- 2001-09-02 + +This file is UTF-8 encoded. + + +Danish (da) +--------- + + Quizdeltagerne spiste jordbær med fløde, mens cirkusklovnen + Wolther spillede på xylofon. + (= Quiz contestants were eating strawbery with cream while Wolther + the circus clown played on xylophone.) + +German (de) +----------- + + Falsches Üben von Xylophonmusik quält jeden größeren Zwerg + (= Wrongful practicing of xylophone music tortures every larger dwarf) + + Zwölf Boxkämpfer jagten Eva quer über den Sylter Deich + (= Twelve boxing fighters hunted Eva across the dike of Sylt) + + Heizölrückstoßabdämpfung + (= fuel oil recoil absorber) + (jqvwxy missing, but all non-ASCII letters in one word) + +English (en) +------------ + + The quick brown fox jumps over the lazy dog + +Spanish (es) +------------ + + El pingüino Wenceslao hizo kilómetros bajo exhaustiva lluvia y + frío, añoraba a su querido cachorro. + (Contains every letter and every accent, but not every combination + of vowel + acute.) + +French (fr) +----------- + + Portez ce vieux whisky au juge blond qui fume sur son île intérieure, à + côté de l'alcôve ovoïde, où les bûches se consument dans l'âtre, ce + qui lui permet de penser à la cænogenèse de l'être dont il est question + dans la cause ambiguë entendue à Moÿ, dans un capharnaüm qui, + pense-t-il, diminue çà et là la qualité de son œuvre. + + l'île exiguë + Où l'obèse jury mûr + Fête l'haï volapük, + Âne ex aéquo au whist, + Ôtez ce vœu déçu. + + Le cœur déçu mais l'âme plutôt naïve, Louÿs rêva de crapaüter en + canoë au delà des îles, près du mälström où brûlent les novæ. + +Irish Gaelic (ga) +----------------- + + D'fhuascail Íosa, Úrmhac na hÓighe Beannaithe, pór Éava agus Ádhaimh + +Hungarian (hu) +-------------- + + Árvíztűrő tükörfúrógép + (= flood-proof mirror-drilling machine, only all non-ASCII letters) + +Icelandic (is) +-------------- + + Kæmi ný öxi hér ykist þjófum nú bæði víl og ádrepa + + Sævör grét áðan því úlpan var ónýt + (some ASCII letters missing) + +Greek (el) +------------- + + Γαζέες καὶ μυρτιὲς δὲν θὰ βρῶ πιὰ στὸ χρυσαφὶ ξέφωτο + (= No more shall I see acacias or myrtles in the golden clearing) + + Ξεσκεπάζω τὴν ψυχοφθόρα βδελυγμία + (= I uncover the soul-destroying abhorrence) + +Japanese (jp) +------------- + + Hiragana: (Iroha) + + いろはにほへとちりぬるを + わかよたれそつねならむ + うゐのおくやまけふこえて + あさきゆめみしゑひもせす + + Katakana: + + イロハニホヘト チリヌルヲ ワカヨタレソ ツネナラム + ウヰノオクヤマ ケフコエテ アサキユメミシ ヱヒモセスン + +Hebrew (iw) +----------- + + ? דג סקרן שט בים מאוכזב ולפתע מצא לו חברה איך הקליטה + +Polish (pl) +----------- + + Pchnąć w tę łódź jeża lub ośm skrzyń fig + (= To push a hedgehog or eight bins of figs in this boat) + +Russian (ru) +------------ + + В чащах юга жил бы цитрус? Да, но фальшивый экземпляр! + (= Would a citrus live in the bushes of south? Yes, but only a fake one!) + +Thai (th) +--------- + + [--------------------------|------------------------] + ๏ เป็นมนุษย์สุดประเสริฐเลิศคุณค่า กว่าบรรดาฝูงสัตว์เดรัจฉาน + จงฝ่าฟันพัฒนาวิชาการ อย่าล้างผลาญฤๅเข่นฆ่าบีฑาใคร + ไม่ถือโทษโกรธแช่งซัดฮึดฮัดด่า หัดอภัยเหมือนกีฬาอัชฌาสัย + ปฏิบัติประพฤติกฎกำหนดใจ พูดจาให้จ๊ะๆ จ๋าๆ น่าฟังเอย ฯ + + [The copyright for the Thai example is owned by The Computer + Association of Thailand under the Royal Patronage of His Majesty the + King.] + +Please let me know if you find others! Special thanks to the people +from all over the world who contributed these sentences.