# tag of the current cell.
#
# In case of an array output, please note that if you need to define HTML attributes for all 's in a
# column, use +html+. Also note that if the method returns a hash with a :class or 'class'
# element, it will not overwrite the class defined in +html+, or classes added by the grid itself
# (+active-filter+ and +sorted+), instead they will be all concatenated:
#
#
# It is up to the developer to make sure that what in rendered in column cells
# corresponds to sorting and filtering specified by parameters :attribute and :model .
def column(opts = {}, &block)
options = {
allow_multiple_selection: ConfigurationProvider.value_for(:ALLOW_MULTIPLE_SELECTION),
assoc: nil,
attribute: nil,
auto_reload: ConfigurationProvider.value_for(:AUTO_RELOAD),
boolean_filter_false_label: NlMessage['boolean_filter_false_label'],
boolean_filter_true_label: NlMessage['boolean_filter_true_label'],
class: nil,
custom_filter: nil,
detach_with_id: nil,
filter: true,
filter_all_label: ConfigurationProvider.value_for(:CUSTOM_FILTER_ALL_LABEL),
filter_control_options: {},
filter_type: nil,
html: {},
in_csv: true,
in_html: true,
model: nil, # will throw an exception with instructions
name: '',
negation: ConfigurationProvider.value_for(:NEGATION_IN_STRING_FILTERS),
ordering: true,
table_alias: nil,
sort_by: nil,
}
opts.assert_valid_keys(options.keys)
options.merge!(opts)
assocs = nil
if options[:model]
raise WiceGridArgumentError.new('Instead of specifying a model of a joined table please use assoc: :name_of_association')
end
unless options[:assoc].nil?
unless options[:assoc].is_a?(Symbol) ||
(options[:assoc].is_a?(Array) && ! options[:assoc].empty? && options[:assoc].all?{ |assoc| assoc.is_a?(Symbol)})
raise WiceGridArgumentError.new('Option :assoc can only be a symbol or an array of symbols')
end
assocs = options[:assoc].is_a?(Symbol) ? [options[:assoc]] : options[:assoc]
options[:model] = get_model_from_associations(@grid.klass, assocs)
end
if options[:attribute].nil? && options[:model]
raise WiceGridArgumentError.new('Option :assoc is only used together with :attribute')
end
if options[:attribute] && options[:attribute].index('.')
raise WiceGridArgumentError.new("Invalid attribute name #{options[:attribute]}. An attribute name must not contain a table name!")
end
if options[:class]
options[:html] ||= {}
Wice::WgHash.add_or_append_class_value!(options[:html], options[:class])
options.delete(:class)
end
if block.nil?
if !options[:attribute].blank?
if assocs.nil?
block = ->(obj) { obj.send(options[:attribute]) }
else
messages = assocs + [ options[:attribute] ]
block = ->(obj) { obj.deep_send(*messages) }
end
else
raise WiceGridArgumentError.new(
'Missing column block without attribute defined. You can only omit the block if attribute is present.')
end
end
klass = Columns::ViewColumn
if options[:attribute] &&
col_type_and_table_name = @grid.declare_column(
column_name: options[:attribute],
model: options[:model],
custom_filter_active: options[:custom_filter],
table_alias: options[:table_alias],
filter_type: options[:filter_type],
assocs: assocs,
sort_by: options[:sort_by],
)
# [ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter::Column, String, Boolean]
db_column, table_name, main_table = col_type_and_table_name
col_type = db_column.type
if options[:custom_filter]
custom_filter = if options[:custom_filter] == :auto
-> { @grid.distinct_values_for_column(db_column) } # Thank God Ruby has higher order functions!!!
elsif options[:custom_filter].class == Symbol
-> { @grid.distinct_values_for_column_in_resultset([options[:custom_filter]]) }
elsif options[:custom_filter].class == Hash
options[:custom_filter].keys
options[:custom_filter].to_a
elsif options[:custom_filter].class == Array
if options[:custom_filter].empty?
[]
elsif Wice::WgEnumerable.all_items_are_of_class(options[:custom_filter], Symbol)
-> { @grid.distinct_values_for_column_in_resultset(options[:custom_filter]) }
elsif Wice::WgEnumerable.all_items_are_of_class(options[:custom_filter], String) || WgEnumerable.all_items_are_of_class(options[:custom_filter], Numeric)
options[:custom_filter].map { |i| [i, i] }
elsif Wice::WgEnumerable.all_items_are_of_class(options[:custom_filter], Array)
options[:custom_filter]
else
raise WiceGridArgumentError.new(
':custom_filter can equal :auto, an array of string and/or numbers (direct values for the dropdown), ' \
'a homogeneous array of symbols (a sequence of methods to send to AR objects in the result set to ' \
'retrieve unique values for the dropdown), a Symbol (a shortcut for a one member array of symbols), ' \
'a hash where keys are labels and values are values for the dropdown option, or an array of two-item arrays, ' \
'each of which contains the label (first element) and the value (second element) for a dropdown option'
)
end
end
klass = Columns.get_view_column_processor(:custom)
elsif options[:filter_type]
klass = Columns.get_view_column_processor(options[:filter_type])
else
col_type = case col_type
when :date
Wice::Defaults::DEFAULT_FILTER_FOR_DATE
when :datetime
Wice::Defaults::DEFAULT_FILTER_FOR_DATETIME
when :timestamp
Wice::Defaults::DEFAULT_FILTER_FOR_DATETIME
else
col_type
end
klass = Columns.get_view_column_processor(col_type)
end # custom_filter
end # attribute
vc = klass.new(block, options, @grid, table_name, main_table, custom_filter, @view)
vc.negation = options[:negation] if vc.respond_to? :negation=
vc.filter_all_label = options[:filter_all_label] if vc.is_a?(Columns.get_view_column_processor(:custom))
if vc.is_a?(Columns.get_view_column_processor(:boolean))
vc.boolean_filter_true_label = options[:boolean_filter_true_label]
vc.boolean_filter_false_label = options[:boolean_filter_false_label]
end
add_column(vc)
end
def get_model_from_associations(model, assocs) # :nodoc:
if assocs.empty?
model
else
head = assocs[0]
tail = assocs[1..-1]
if reflection = model.reflect_on_association(head)
next_model = reflection.klass
get_model_from_associations(next_model, tail)
else
raise WiceGridArgumentError.new("Association #{head} not found in #{model}")
end
end
end
# Optional method inside the +grid+ block, to which every ActiveRecord instance is injected, just like +column+.
# Unlike +column+, it returns a hash which will be used as HTML attributes for the row with the given ActiveRecord instance.
#
# Note that if the method returns a hash with a :class or 'class' element, it will not overwrite
# classes +even+ and +odd+, instead they will be concatenated:
def row_attributes(&block)
@row_attributes_handler = block
end
# Can be used to add HTML code (another row, for example) right after each grid row.
# Nothing is added if the block return +false+ or +nil+.
def after_row(&block)
@after_row_handler = block
end
# Can be used to add HTML code (another row, for example) right before each grid row.
# Nothing is added if the block return +false+ or +nil+.
def before_row(&block)
@before_row_handler = block
end
# Can be used to replace the HTML code (for example to make a multi-column spanning row) of a row.
# Nothing is replaced if the block return +false+ or +nil+.
def replace_row(&block)
@replace_row_handler = block
end
# Can be used to add HTML code (calculation results, for example) after all rows.
# Nothing is added if the block return +false+ or +nil+.
def last_row(&block)
@last_row_handler = block
end
# The output of the block submitted to +blank_slate+ is rendered instead of the whole grid if no filters are active
# and there are no records to render.
# In addition to the block style two other variants are accepted:
# * g.blank_slate "some text to be rendered"
# * g.blank_slate partial: "partial_name"
def blank_slate(opts = nil, &block)
if (opts.is_a?(Hash) && opts.key?(:partial) && block.nil?) || (opts.is_a?(String) && block.nil?)
@blank_slate_handler = opts
elsif opts.nil? && block
@blank_slate_handler = block
else
raise WiceGridArgumentError.new("blank_slate accepts only a string, a block, or template: 'path_to_template' ")
end
end
def get_row_attributes(ar_object) #:nodoc:
if @row_attributes_handler
row_attributes = @row_attributes_handler.call(ar_object)
row_attributes = {} if row_attributes.blank?
unless row_attributes.is_a?(Hash)
raise WiceGridArgumentError.new("row_attributes block must return a hash containing HTML attributes. The returned value is #{row_attributes.inspect}")
end
row_attributes
else
{}
end
end
def no_filter_needed? #:nodoc:
!@columns.inject(false) { |a, b| a || b.filter_shown? }
end
def no_filter_needed_in_main_table? #:nodoc:
!@columns.inject(false) { |a, b| a || b.filter_shown_in_main_table? }
end
def base_link_for_filter(controller, extra_parameters = {}) #:nodoc:
new_params = Wice::WgHash.deep_clone controller.params.to_unsafe_h
new_params.merge!(extra_parameters)
if new_params[@grid.name]
new_params[@grid.name].delete(:page) # we reset paging here
new_params[@grid.name].delete(:f) # no filter for the base url
new_params[@grid.name].delete(:foc) # nullify the focus
new_params[@grid.name].delete(:q) # and no request for the saved query
end
new_params[:only_path] = false
base_link_with_pp_info = omit_empty_query controller.url_for(new_params)
if new_params[@grid.name]
new_params[@grid.name].delete(:pp) # and reset back to pagination if show all mode is on
end
[base_link_with_pp_info, omit_empty_query(controller.url_for(new_params))]
end
def link_for_export(controller, format, extra_parameters = {}) #:nodoc:
new_params = Wice::WgHash.deep_clone controller.params.to_unsafe_h
new_params.merge!(extra_parameters)
new_params[@grid.name] = {} unless new_params[@grid.name]
new_params[@grid.name][:export] = format
new_params[:only_path] = false
controller.url_for(new_params)
end
def column_link(column, direction, params, extra_parameters = {}) #:nodoc:
column_attribute_name = if column.attribute.index('.') || column.main_table || column.table_alias_or_table_name.nil?
column.attribute
else
column.table_alias_or_table_name + '.' + column.attribute
end
query_params = { @grid.name => {
ORDER_PARAMETER_NAME => column_attribute_name,
ORDER_DIRECTION_PARAMETER_NAME => direction
} }
cleaned_params = Wice::WgHash.deep_clone params.to_unsafe_h
cleaned_params.merge!(extra_parameters)
cleaned_params.delete(:controller)
cleaned_params.delete(:action)
query_params = Wice::WgHash.rec_merge(cleaned_params, query_params)
if Rails.version.to_i >= 5
'?' + query_params.to_h.to_query
else
'?' + query_params.to_query
end
end
protected
def filter_columns(method_name = nil) #:nodoc:
method_name ? @columns.select(&method_name) : @columns
end
def omit_empty_query(url) #:nodoc:
# /foo? --> /foo
# /foo?grid= --> /foo
# /foo?grid=&page=1 --> /foo?page=1
# /foo?grid=some_value --> /foo?grid=some_value
empty_hash_rx = Regexp.new "([&?])#{Regexp.escape @grid.name}=([&?]|$)" # c.f., issue #140
url.gsub(empty_hash_rx, '\1').gsub(/\?+$/, '')
end
end
end
================================================
FILE: lib/wice/helpers/bs_calendar_helpers.rb
================================================
module Wice #:nodoc:
module BsCalendarHelpers #:nodoc:
# A struct containing all data for rendering a calendar
class CalendarData #:nodoc:
# :nodoc:
attr_accessor :name,
:date_string,
:dom_id,
:datepicker_placeholder_id,
:date_div_id,
:fire_event,
:close_calendar_event_name,
:the_other_datepicker_id_to,
:the_other_datepicker_id_from
end
def date_calendar_bs(calendar_data) #:nodoc:
placeholder =
if calendar_data.the_other_datepicker_id_to
I18n.t("wice_grid.date_selector_tooltip_from")
else
I18n.t("wice_grid.date_selector_tooltip_to")
end
text_field_tag_options = {
:id => calendar_data.dom_id,
'data-provide' => 'datepicker',
'data-date-language' => I18n.locale,
'data-date-autoclose' => true,
'data-date-format' => Wice::ConfigurationProvider.value_for(:DATE_FORMAT_BOOTSTRAP),
'placeholder' => placeholder
}
text_field_tag_options['class'] = 'form-control input-sm'
if Rails.env.development?
text_field_tag_options['class'] += ' check-for-bsdatepicker'
end
if calendar_data.fire_event
text_field_tag_options['data-close-calendar-event-name'] = calendar_data.close_calendar_event_name
end
if calendar_data.the_other_datepicker_id_to
text_field_tag_options['data-the-other-bsdatepicker-id-to'] = calendar_data.the_other_datepicker_id_to
end
if calendar_data.the_other_datepicker_id_from
text_field_tag_options['data-the-other-bsdatepicker-id-from'] = calendar_data.the_other_datepicker_id_from
end
date_picker = text_field_tag(calendar_data.name, calendar_data.date_string, text_field_tag_options)
"#{date_picker}
"
end
def prepare_data_for_bscalendar(options) #:nodoc:
date_format = Wice::ConfigurationProvider.value_for(:DATE_FORMAT)
CalendarData.new.tap do |calendar_data|
calendar_data.name = options[:name]
calendar_data.date_string = options[:initial_date].nil? ? '' : options[:initial_date].strftime(date_format)
calendar_data.dom_id = options[:name].gsub(/([\[\(])|(\]\[)/, '_').gsub(/[\]\)]/, '').gsub(/\./, '_').gsub(/_+/, '_')
calendar_data.datepicker_placeholder_id = calendar_data.dom_id + '_date_placeholder'
calendar_data.date_div_id = calendar_data.dom_id + '_date_view'
calendar_data.close_calendar_event_name = "wg:calendarChanged_#{options[:grid_name]}"
calendar_data.fire_event = options[:fire_event]
end
end
end
end
================================================
FILE: lib/wice/helpers/js_calendar_helpers.rb
================================================
module Wice #:nodoc:
module JsCalendarHelpers #:nodoc:
# A struct containing all data for rendering a calendar
class CalendarData
# :nodoc:
attr_accessor :name,
:date_string,
:dom_id,
:datepicker_placeholder_id,
:date_span_id,
:close_calendar_event_name,
:title,
:fire_event,
:the_other_datepicker_id_to,
:the_other_datepicker_id_from
end
def date_calendar_jquery(calendar_data) #:nodoc:
hidden_field_tag_options = {
:id => calendar_data.dom_id,
'data-locale' => I18n.locale,
'data-date-format' => Wice::ConfigurationProvider.value_for(:DATE_FORMAT_JQUERY),
'data-button-text' => calendar_data.title
}
if calendar_data.fire_event
hidden_field_tag_options['data-close-calendar-event-name'] = calendar_data.close_calendar_event_name
end
if Rails.env.development?
hidden_field_tag_options['class'] = 'check-for-datepicker'
end
if calendar_data.the_other_datepicker_id_to
hidden_field_tag_options['data-the-other-datepicker-id-to'] = calendar_data.the_other_datepicker_id_to
end
if calendar_data.the_other_datepicker_id_from
hidden_field_tag_options['data-the-other-datepicker-id-from'] = calendar_data.the_other_datepicker_id_from
end
if year_range = ConfigurationProvider.value_for(:DATEPICKER_YEAR_RANGE)
hidden_field_tag_options['data-date-year-range'] = year_range
end
date_picker = hidden_field_tag(calendar_data.name, calendar_data.date_string, hidden_field_tag_options) + ' ' +
link_to(
calendar_data.date_string,
'#',
:id => calendar_data.date_span_id,
:class => 'date-label',
:title => ::Wice::NlMessage['date_string_tooltip'],
'data-dom-id' => calendar_data.dom_id
)
content_tag(
:span,
date_picker,
id: calendar_data.datepicker_placeholder_id,
class: 'jq-datepicker-container'
)
end
def prepare_data_for_calendar(options) #:nodoc:
date_format = Wice::ConfigurationProvider.value_for(:DATE_FORMAT)
CalendarData.new.tap do |calendar_data|
calendar_data.name = options[:name]
calendar_data.date_string = options[:initial_date].nil? ? '' : options[:initial_date].strftime(date_format)
calendar_data.dom_id = options[:name].gsub(/([\[\(])|(\]\[)/, '_').gsub(/[\]\)]/, '').gsub(/\./, '_').gsub(/_+/, '_')
calendar_data.datepicker_placeholder_id = calendar_data.dom_id + '_date_placeholder'
calendar_data.date_span_id = calendar_data.dom_id + '_date_view'
calendar_data.close_calendar_event_name = "wg:calendarChanged_#{options[:grid_name]}"
calendar_data.title = options[:title]
calendar_data.fire_event = options[:fire_event]
end
end
end
end
================================================
FILE: lib/wice/helpers/wice_grid_misc_view_helpers.rb
================================================
module Wice
# Various grid related helpers
module GridViewHelper
# This method dumps all HTTP parameters related to filtering and ordering of a certain grid as hidden form fields.
# This might be required if you want to keep the state of a grid while reloading the page using other forms.
#
# The only parameter is a grid object returned by +initialize_grid+ in the controller.
def dump_filter_parameters_as_hidden_fields(grid)
unless grid.is_a? WiceGrid
raise WiceGridArgumentError.new('dump_filter_parameters_as_hidden_fields: the parameter must be a WiceGrid instance.')
end
grid.get_state_as_parameter_value_pairs(true).collect do|param_name, value|
hidden_field_tag(param_name, value, id: "hidden-#{param_name.gsub(/[\[\]]/, '-')}")
end.join("\n").html_safe
end
# This method dumps all HTTP parameters related to filtering of a certain grid in the form of a hash.
# This might be required if you want to keep the state of a grid while reloading the page using Rails routing helpers.
# Attention: this does not return parameters for ordering the grid, use +filter_and_order_state_as_hash+ if you
# need it.
#
# The only parameter is a grid object returned by +initialize_grid+ in the controller.
def filter_state_as_hash(grid)
{ grid.name => { 'f' => grid.status[:f] } }
end
# This method dumps all HTTP parameters related to filtering and ordering of a certain grid in the form of a hash.
# This might be required if you want to keep the state of a grid while reloading the page using Rails routing helpers.
#
# The only parameter is a grid object returned by +initialize_grid+ in the controller.
def filter_and_order_state_as_hash(grid)
{
grid.name => {
'f' => grid.status[:f],
'order' => grid.status[:order],
'order_direction' => grid.status[:order_direction]
}
}
end
# display the state of the grid
def dump_state(grid) #:nodoc:
debug(grid.get_state_as_parameter_value_pairs)
end
# secret but stupid weapon - takes an ActiveRecord and using reflection tries to build all the column clauses by itself.
# WiceGrid is not a scaffolding solution, I hate scaffolding and how certain idiots associate scaffolding with Rails,
# so I do not document this method to avoid contributing to this misunderstanding.
def scaffolded_grid(grid_obj, opts = {}) #:nodoc:
unless grid_obj.is_a? WiceGrid
raise WiceGridArgumentError.new('scaffolded_grid: the parameter must be a WiceGrid instance.')
end
# debug grid.klass.column_names
columns = grid_obj.klass.column_names
if opts[:reject_attributes].is_a? Proc
columns = columns.reject { |c| opts[:reject_attributes].call(c) }
opts.delete(:reject_attributes)
else
columns = columns.reject { |c| c =~ opts[:reject_attributes] }
opts.delete(:reject_attributes)
end
grid(grid_obj, opts) do |g|
columns.each do |column_name|
g.column name: column_name.humanize, attribute: column_name do |ar|
ar.send(column_name)
end
end
end
end
end
end
================================================
FILE: lib/wice/helpers/wice_grid_serialized_queries_view_helpers.rb
================================================
module Wice
module GridViewHelper
# View helper to render the list of saved queries and the form to create a new query.
# Parameters:
# * :extra_parameters - a hash of additional parameters to use when creating a new query object.
# * :confirm - A boolean value which turns on or off the JS confirm dialogs when deleting saved queries.
# Read section "Adding Application Specific Logic to Saving/Restoring Queries" in README for more details.
def saved_queries_panel(grid, opts = {})
unless grid.is_a? WiceGrid
raise WiceGridArgumentError.new('saved_queries_panel: the parameter must be a WiceGrid instance.')
end
options = { extra_parameters: {}, confirm: 1 }
opts.assert_valid_keys(options.keys)
options.merge!(opts)
grid_name = grid.name
input_field_name = "#{grid_name}_saved_query_name"
base_path_to_query_controller = create_serialized_query_url(grid_name: grid_name, confirm: options[:confirm])
parameters = grid.get_state_as_parameter_value_pairs
options[:extra_parameters].each do |k, v|
parameters << [CGI.unescape({ extra: { k => '' } }.to_query.sub(/=$/, '')), v.to_s]
end
parameters << ['authenticity_token', form_authenticity_token]
notification_messages_id = "#{grid_name}_notification_messages"
(%( #{NlMessage['saved_query_panel_title']} ) +
saved_queries_list(grid_name, grid.saved_query, options[:extra_parameters], options[:confirm]) +
%(
) +
if block_given?
view, ids = yield
view
else
''
end +
'
'
).html_safe
end
def saved_queries_list(grid_name, saved_query = nil, extra_parameters = {}, confirm = 1) #:nodoc:
link_title = NlMessage['saved_query_link_title']
deletion_confirmation = confirm ? NlMessage['saved_query_deletion_confirmation'] : nil
deletion_link_title = NlMessage['saved_query_deletion_link_title']
query_store_model = ::Wice.get_query_store_model
currently_loaded_query_id = saved_query ? saved_query.id : nil
# with = extra_parameters.nil? ? nil : "'" + {extra: extra_parameters}.to_query + "'"
%( ) +
query_store_model.list(grid_name, controller).collect do |sq|
link_opts = {
class: 'wice-grid-query-load-link',
title: "#{link_title} #{sq.name}",
'data-query-id' => sq.id,
'data-grid-name' => grid_name
}
link_opts[:class] += ' current' if saved_query == sq
'' + link_to(
content_tag(:i, '', class: 'fa-regular fa-trash-can delete-icon'),
delete_serialized_query_path(
grid_name: grid_name,
id: sq.id,
current: currently_loaded_query_id,
extra: extra_parameters,
confirm: confirm
),
class: 'wice-grid-delete-query',
'data-wg-confirm' => deletion_confirmation,
'data-grid-name' => grid_name,
title: "#{deletion_link_title} #{sq.name}"
) + ' ' +
link_to(h(sq.name), '#', link_opts) +
if sq.respond_to? :description
desc = sq.description
desc.blank? ? '' : " #{desc} "
else
''
end +
' '
end.join('') + ' '
end
end
end
================================================
FILE: lib/wice/helpers/wice_grid_view_helpers.rb
================================================
module Wice
module GridViewHelper
# View helper for rendering the grid.
#
# The first parameter is a grid object returned by +initialize_grid+ in the controller.
#
# The second parameter is a hash of options:
# * :html - a hash of HTML attributes to be included into the table tag.
# * :class - a shortcut for html: {class: 'css_class'}
# * :header_tr_html - a hash of HTML attributes to be included into the first tr tag
# (or two first tr 's if the filter row is present).
# * :show_filters - defines when the filter is shown. Possible values are:
# * :when_filtered - the filter is shown when the current table is the result of filtering
# * :always or true - show the filter always
# * :no or false - never show the filter
# * :upper_pagination_panel - a boolean value which defines whether there is an additional pagination
# panel on top of the table. By default it is false.
# * :extra_request_parameters - a hash which will be added as additional HTTP request parameters to all
# links generated by the grid, be it sorting links, filters, or the 'Reset Filter' icon.
# Please note that WiceGrid respects and retains all request parameters already present in the URL which
# formed the page, so there is no need to enumerate them in :extra_request_parameters . A typical
# usage of :extra_request_parameters is a page with javascript tabs - changing the active tab
# does not reload the page, but if one such tab contains a WiceGrid, it could be required that if the user
# orders or filters the grid, the result page should have the tab with the grid activated. For this we
# need to send an additional parameter specifying from which tab the request was generated.
# * :sorting_dependant_row_cycling - When set to true (by default it is false) the row styles +odd+
# and +even+ will be changed only when the content of the cell belonging to the sorted column changes.
# In other words, rows with identical values in the ordered column will have the same style (color).
# * :allow_showing_all_records - allow or prohibit the "All Records" mode.
# * :hide_reset_button - Do not show the default Filter Reset button.
# Useful when using a custom reset button.
# By default it is false.
# * :hide_submit_button - Do not show the default Filter Submit button.
# Useful when using a custom submit button
# By default it is false.
# * :hide_csv_button - a boolean value which defines whether the default Export To CSV button
# should be rendered. Useful when using a custom Export To CSV button.
# By default it is false.
# Please read README for more insights.
#
# The block contains definitions of grid columns using the +column+ method sent to the object yielded into
# the block. In other words, the value returned by each of the blocks defines the content of a cell, the
# first block is called for cells of the first column for each row (each ActiveRecord instance), the
# second block is called for cells of the second column, and so on. See the example:
#
# <%= grid(@accounts_grid, html: {class: 'grid_style', id: 'accounts_grid'}, header_tr_html: {class: 'grid_headers'}) do |g|
#
# g.column name: 'Username', attribute: 'username' do |account|
# account.username
# end
#
# g.column name: 'application_account.field.identity_id'._, attribute: 'firstname', model: Person do |account|
# link_to(account.identity.name, identity_path(account.identity))
# end
#
# g.column do |account|
# link_to('Edit', edit_account_path(account))
# end
#
# end -%>
#
#
# Defaults for parameters :show_filters and :upper_pagination_panel
# can be changed in lib/wice_grid_config.rb using constants Wice::Defaults::SHOW_FILTER and
# WiceGrid::Defaults::SHOW_UPPER_PAGINATION_PANEL , this is convenient if you want to set a project wide setting
# without having to repeat it for every grid instance.
#
# Pease read documentation about the +column+ method to achieve the enlightenment.
def grid(grid, opts = {}, &block)
raise WiceGridArgumentError.new('Missing block for the grid helper.' \
' For detached filters use first define_grid with the same API as grid, ' \
'then grid_filter to add filters, and then render_grid to actually show the grid') if block.nil?
define_grid(grid, opts, &block)
render_grid(grid)
end
# Has the same parameters as grid but does not output the grid. After define_grid
# render_grid can be used to output the grid HTML code.
# Usually used with detached filters: first define_grid , then grid_filter s, and then
# render_grid
def define_grid(grid, opts = {}, &block)
# strip the method from HTML stuff
unless grid.class == WiceGrid
raise WiceGridArgumentError.new('The first argument for the grid helper must be an instance of the WiceGrid class')
end
options = {
allow_showing_all_records: Defaults::ALLOW_SHOWING_ALL_RECORDS,
class: nil,
extra_request_parameters: {},
header_tr_html: {},
hide_reset_button: false,
hide_submit_button: false,
hide_csv_button: false,
show_filters: Defaults::SHOW_FILTER,
sorting_dependant_row_cycling: false,
html: {},
upper_pagination_panel: Defaults::SHOW_UPPER_PAGINATION_PANEL,
pagination_theme: ConfigurationProvider.value_for(:PAGINATION_THEME)
}
opts.assert_valid_keys(options.keys)
options.merge!(opts)
options[:show_filters] = :no if options[:show_filters] == false
options[:show_filters] = :always if options[:show_filters] == true
rendering = GridRenderer.new(grid, self)
block.call(rendering) # calling block containing column() calls
reuse_last_column_for_filter_buttons =
Defaults::REUSE_LAST_COLUMN_FOR_FILTER_ICONS && rendering.last_column_for_html.capable_of_hosting_filter_related_icons?
if grid.output_csv?
grid_csv(grid, rendering)
else
# If blank_slate is defined we don't show any grid at all
if rendering.blank_slate_handler && grid.resultset.size == 0 && !grid.filtering_on?
generate_blank_slate(grid, rendering)
else
grid_html(grid, options, rendering, reuse_last_column_for_filter_buttons)
end
end
grid.view_helper_finished = true
grid.csv_tempfile ? grid.csv_tempfile.path : nil
end
# Used after define_grid to actually output the grid HTML code.
# Usually used with detached filters: first define_grid , then grid_filter s, and then
# render_grid
def render_grid(grid)
if grid.output_buffer
grid.output_buffer
elsif grid.csv_tempfile
grid.csv_tempfile.path
else
raise WiceGridException.new("Attempt to use 'render_grid' without 'define_grid' before.")
end
end
def generate_blank_slate(grid, rendering) #:nodoc:
grid.output_buffer = GridOutputBuffer.new
grid.output_buffer << if rendering.blank_slate_handler.is_a?(Proc)
call_block(rendering.blank_slate_handler, nil)
elsif rendering.blank_slate_handler.is_a?(Hash)
render(rendering.blank_slate_handler)
else
rendering.blank_slate_handler
end
# rubocop:disable Style/SymbolProc
if rendering.find_one_for(:in_html) { |column| column.detach_with_id }
grid.output_buffer.return_empty_strings_for_nonexistent_filters = true
end
# rubocop:enable Style/SymbolProc
end
def call_block(block, ar, extra_argument = nil) #:nodoc:
extra_argument ? block.call(ar, extra_argument) : block.call(ar)
end
def get_row_content(rendering, ar, sorting_dependant_row_cycling) #:nodoc:
cell_value_of_the_ordered_column = nil
row_content = ''
rendering.each_column(:in_html) do |column|
cell_block = column.cell_rendering_block
opts = column.html
opts = opts ? opts.clone : {}
column_block_output = if column.class == Columns.get_view_column_processor(:action)
cell_block.call(ar, params)
else
call_block(cell_block, ar)
end
if column_block_output.is_a?(Array)
unless column_block_output.size == 2
raise WiceGridArgumentError.new('When WiceGrid column block returns an array it is expected to contain 2 elements only - ' \
'the first is the contents of the table cell and the second is a hash containing HTML attributes for the tag.')
end
column_block_output, additional_opts = column_block_output
unless additional_opts.is_a?(Hash)
raise WiceGridArgumentError.new('When WiceGrid column block returns an array its second element is expected to be a ' \
"hash containing HTML attributes for the tag. The returned value is #{additional_opts.inspect}. Read documentation.")
end
additional_css_class = nil
if additional_opts.key?(:class)
additional_css_class = additional_opts[:class]
additional_opts.delete(:class)
elsif additional_opts.key?('class')
additional_css_class = additional_opts['class']
additional_opts.delete('class')
end
opts.merge!(additional_opts)
Wice::WgHash.add_or_append_class_value!(opts, additional_css_class) unless additional_css_class.blank?
end
if sorting_dependant_row_cycling && column.attribute && grid.ordered_by?(column)
cell_value_of_the_ordered_column = column_block_output
end
row_content += content_tag(:td, column_block_output, opts)
end
[row_content, cell_value_of_the_ordered_column]
end
# the longest method? :(
def grid_html(grid, options, rendering, reuse_last_column_for_filter_buttons) #:nodoc:
table_html_attrs, header_tr_html = options[:html], options[:header_tr_html]
Wice::WgHash.add_or_append_class_value!(table_html_attrs, 'wice-grid', true)
if Array === Defaults::DEFAULT_TABLE_CLASSES
Defaults::DEFAULT_TABLE_CLASSES.each do |default_class|
Wice::WgHash.add_or_append_class_value!(table_html_attrs, default_class, true)
end
end
if options[:class]
Wice::WgHash.add_or_append_class_value!(table_html_attrs, options[:class])
options.delete(:class)
end
cycle_class = nil
sorting_dependant_row_cycling = options[:sorting_dependant_row_cycling]
grid.output_buffer = GridOutputBuffer.new
# Ruby 1.9.x
grid.output_buffer.force_encoding('UTF-8') if grid.output_buffer.respond_to?(:force_encoding)
grid.output_buffer << %()
grid.output_buffer << content_tag(:h3, grid.saved_query.name) if grid.saved_query
grid.output_buffer << "
"
grid.output_buffer << "#{rendering.kaption} " if rendering.kaption
grid.output_buffer << ''
no_filters_at_all = (options[:show_filters] == :no || rendering.no_filter_needed?)
if no_filters_at_all
no_rightmost_column = no_filter_row = no_filters_at_all
else
no_rightmost_column = no_filter_row = (options[:show_filters] == :no || rendering.no_filter_needed_in_main_table?) ? true : false
end
no_rightmost_column = true if reuse_last_column_for_filter_buttons
number_of_columns = rendering.number_of_columns(:in_html)
number_of_columns -= 1 if no_rightmost_column
number_of_columns_for_extra_rows = number_of_columns + 1
pagination_panel_content_html = nil
if options[:upper_pagination_panel]
grid.output_buffer << rendering.pagination_panel(number_of_columns, options[:hide_csv_button]) do
pagination_panel_content_html =
pagination_panel_content(grid, options[:extra_request_parameters], options[:allow_showing_all_records], options[:pagination_theme])
pagination_panel_content_html
end
end
title_row_attrs = header_tr_html.clone
Wice::WgHash.add_or_append_class_value!(title_row_attrs, 'wice-grid-title-row', true)
grid.output_buffer << %()
filter_row_id = grid.name + '_filter_row'
# first row of column labels with sorting links
filter_shown = if options[:show_filters] == :when_filtered
grid.filtering_on?
elsif options[:show_filters] == :always
true
end
rendering.each_column_aware_of_one_last_one(:in_html) do |column, last|
column_name = column.name
opts = column.html
opts = opts ? opts.clone : {}
Wice::WgHash.add_or_append_class_value!(opts, column.css_class)
if column.attribute && (column.ordering || column.sort_by)
column.add_css_class('active-filter') if grid.filtered_by?(column)
direction = 'asc'
link_style = nil
arrow_class = nil
if grid.ordered_by?(column)
column.add_css_class('sorted')
Wice::WgHash.add_or_append_class_value!(opts, 'sorted')
link_style = grid.order_direction
case grid.order_direction
when 'asc'
direction = 'desc'
arrow_class = 'down'
when 'desc'
direction = 'asc'
arrow_class = 'up'
end
end
col_link = link_to(
(column_name +
if arrow_class
' ' + content_tag(:i, '', class: "fa fa-arrow-#{arrow_class}")
else
''
end).html_safe,
rendering.column_link(
column,
direction,
params,
options[:extra_request_parameters]
),
class: link_style)
grid.output_buffer << content_tag(:th, col_link, opts)
else
if reuse_last_column_for_filter_buttons && last
grid.output_buffer << content_tag(:th,
hide_show_icon(filter_row_id, grid, filter_shown, no_filter_row, options[:show_filters], rendering), opts
)
else
grid.output_buffer << content_tag(:th, column_name, opts)
end
end
end
grid.output_buffer << content_tag(:th,
hide_show_icon(filter_row_id, grid, filter_shown, no_filter_row, options[:show_filters], rendering)
) unless no_rightmost_column
grid.output_buffer << ' '
# rendering first row end
unless no_filters_at_all # there are filters, we don't know where, in the table or detached
if no_filter_row # they are all detached
rendering.each_column(:in_html) do |column|
if column.filter_shown?
filter_html_code = column.render_filter.html_safe
grid.output_buffer.add_filter(column.detach_with_id, filter_html_code)
end
end
else # some filters are present in the table
filter_row_attrs = header_tr_html.clone
Wice::WgHash.add_or_append_class_value!(filter_row_attrs, 'wg-filter-row', true)
filter_row_attrs['id'] = filter_row_id
grid.output_buffer << %('
rendering.each_column_aware_of_one_last_one(:in_html) do |column, last|
opts = column.html ? column.html.clone : {}
Wice::WgHash.add_or_append_class_value!(opts, column.css_class)
if column.filter_shown?
filter_html_code = column.render_filter.html_safe
if column.detach_with_id
grid.output_buffer << content_tag(:th, '', opts)
grid.output_buffer.add_filter(column.detach_with_id, filter_html_code)
else
grid.output_buffer << content_tag(:th, filter_html_code, opts)
end
else
if reuse_last_column_for_filter_buttons && last
grid.output_buffer << content_tag(:th,
reset_submit_buttons(options, grid, rendering),
Wice::WgHash.add_or_append_class_value!(opts, 'filter_icons')
)
else
grid.output_buffer << content_tag(:th, '', opts)
end
end
end
unless no_rightmost_column
grid.output_buffer << content_tag(:th, reset_submit_buttons(options, grid, rendering), class: 'filter_icons')
end
grid.output_buffer << ' '
end
end
grid.output_buffer << ' '
grid.output_buffer << rendering.pagination_panel(number_of_columns, options[:hide_csv_button]) do
if pagination_panel_content_html
pagination_panel_content_html
else
pagination_panel_content_html =
pagination_panel_content(grid, options[:extra_request_parameters], options[:allow_showing_all_records], options[:pagination_theme])
pagination_panel_content_html
end
end
grid.output_buffer << ' '
# rendering rows
cell_value_of_the_ordered_column = nil
previous_cell_value_of_the_ordered_column = nil
grid.each do |ar| # rows
before_row_output = if rendering.before_row_handler
call_block(rendering.before_row_handler, ar, number_of_columns_for_extra_rows)
end
after_row_output = if rendering.after_row_handler
call_block(rendering.after_row_handler, ar, number_of_columns_for_extra_rows)
end
replace_row_output = if rendering.replace_row_handler
call_block(rendering.replace_row_handler, ar, number_of_columns_for_extra_rows)
end
row_content = if replace_row_output
no_rightmost_column = true
replace_row_output
else
row_content, tmp_cell_value_of_the_ordered_column = get_row_content(rendering, ar, sorting_dependant_row_cycling)
cell_value_of_the_ordered_column = tmp_cell_value_of_the_ordered_column if tmp_cell_value_of_the_ordered_column
row_content
end
row_attributes = rendering.get_row_attributes(ar)
if sorting_dependant_row_cycling
cycle_class = cycle('odd', 'even', name: grid.name) if cell_value_of_the_ordered_column != previous_cell_value_of_the_ordered_column
previous_cell_value_of_the_ordered_column = cell_value_of_the_ordered_column
else
cycle_class = cycle('odd', 'even', name: grid.name)
end
Wice::WgHash.add_or_append_class_value!(row_attributes, cycle_class)
grid.output_buffer << before_row_output if before_row_output
grid.output_buffer << "#{row_content}"
grid.output_buffer << content_tag(:td, '') unless no_rightmost_column
grid.output_buffer << ' '
grid.output_buffer << after_row_output if after_row_output
end
last_row_output = if rendering.last_row_handler
call_block(rendering.last_row_handler, number_of_columns_for_extra_rows)
end
grid.output_buffer << last_row_output if last_row_output
grid.output_buffer << '
'
base_link_for_filter, base_link_for_show_all_records = rendering.base_link_for_filter(controller, options[:extra_request_parameters])
link_for_export = rendering.link_for_export(controller, 'csv', options[:extra_request_parameters])
parameter_name_for_query_loading = { grid.name => { q: '' } }.to_query
parameter_name_for_focus = { grid.name => { foc: '' } }.to_query
processor_initializer_arguments = [
base_link_for_filter,
base_link_for_show_all_records,
link_for_export,
parameter_name_for_query_loading,
parameter_name_for_focus,
Rails.env
]
filter_declarations = if no_filters_at_all
[]
else
rendering.select_for(:in_html) do |vc|
vc.attribute && vc.filter
end.collect(&:yield_declaration)
end
wg_data = {
'data-processor-initializer-arguments' => processor_initializer_arguments.to_json,
'data-filter-declarations' => filter_declarations.to_json,
:class => 'wg-data'
}
wg_data['data-foc'] = grid.status['foc'] if grid.status['foc']
grid.output_buffer << content_tag(:div, '', wg_data)
grid.output_buffer << '
'
if Rails.env.development?
grid.output_buffer << javascript_tag(%/ document.ready = function(){ \n/ +
%$ if (typeof(WiceGridProcessor) == "undefined"){\n$ +
%$ alert("wice_grid.js not loaded, WiceGrid cannot proceed!\\n" +\n$ +
%( "Make sure that you have loaded wice_grid.js.\\n" + ) +
%( "Add line //= require wice_grid.js " + ) +
%$ "to app/javascript/application.js")\n$ +
%( } ) +
%$ } $)
end
grid.output_buffer
end
def hide_show_icon(_filter_row_id, _grid, filter_shown, no_filter_row, show_filters, _rendering) #:nodoc:
no_filter_opening_closing_icon = (show_filters == :always) || no_filter_row
styles = ['display: block;', 'display: none;']
styles.reverse! unless filter_shown
if no_filter_opening_closing_icon
''
else
content_tag(:div, content_tag(:i, '', class: 'fa-regular fa-eye-slash'),
title: NlMessage['hide_filter_tooltip'],
style: styles[0],
class: 'clickable wg-hide-filter'
) +
content_tag(:div, content_tag(:i, '', class: 'fa-regular fa-eye'),
title: NlMessage['show_filter_tooltip'],
style: styles[1],
class: 'clickable wg-show-filter'
)
end
end
def reset_submit_buttons(options, grid, _rendering) #:nodoc:
if options[:hide_submit_button]
''
else
content_tag(:div, content_tag(:i, '', class: 'fa fa-filter'),
title: NlMessage['filter_tooltip'],
id: grid.name + '_submit_grid_icon',
class: 'submit clickable'
)
end.html_safe + ' ' +
if options[:hide_reset_button]
''
else
content_tag(:div, content_tag(:i, '', class: 'fa fa-table'),
title: NlMessage['reset_filter_tooltip'],
id: grid.name + '_reset_grid_icon',
class: 'reset clickable'
)
end.html_safe
end
# Renders a detached filter. The parameters are:
# * +grid+ the WiceGrid object
# * +filter_key+ an identifier of the filter specified in the column declaration by parameter +:detach_with_id+
def grid_filter(grid, filter_key)
unless grid.is_a? WiceGrid
raise WiceGridArgumentError.new('grid_filter: the parameter must be a WiceGrid instance.')
end
if grid.output_buffer.nil?
raise WiceGridArgumentError.new("grid_filter: You have attempted to run 'grid_filter' before 'grid'. Read about detached filters in the documentation.")
end
if grid.output_buffer == true
raise WiceGridArgumentError.new('grid_filter: You have defined no detached filters, or you try use detached filters with' \
':show_filters => :no (set :show_filters to :always in this case). Read about detached filters in the documentation.')
end
content_tag :span,
grid.output_buffer.filter_for(filter_key),
class: "wg-detached-filter #{grid.name}_detached_filter",
'data-grid-name' => grid.name
end
def grid_csv(grid, rendering) #:nodoc:
spreadsheet = ::Wice::Spreadsheet.new(grid.name, grid.csv_field_separator, grid.csv_encoding)
# columns
spreadsheet << rendering.column_labels(:in_csv)
# rendering rows
grid.each do |ar| # rows
row = []
rendering.each_column(:in_csv) do |column|
cell_block = column.cell_rendering_block
column_block_output = call_block(cell_block, ar)
if column_block_output.is_a?(Array)
column_block_output, _additional_opts = column_block_output
end
row << column_block_output
end
spreadsheet << row
end
grid.csv_tempfile = spreadsheet.tempfile
end
def pagination_panel_content(grid, extra_request_parameters, allow_showing_all_records, pagination_theme) #:nodoc:
extra_request_parameters = extra_request_parameters.clone
if grid.saved_query
extra_request_parameters["#{grid.name}[q]"] = grid.saved_query.id
end
html = pagination_info(grid, allow_showing_all_records)
paginate(grid.resultset,
theme: pagination_theme,
param_name: "#{grid.name}[page]",
params: extra_request_parameters,
inner_window: 4,
outer_window: 2
) +
(' ').html_safe
end
def show_all_link(collection_total_entries, parameters, _grid_name) #:nodoc:
message = NlMessage['all_queries_warning']
confirmation = collection_total_entries > Defaults::START_SHOWING_WARNING_FROM ? message : nil
html = content_tag(:a, NlMessage['show_all_records_label'],
href: '#',
title: NlMessage['show_all_records_tooltip'],
class: 'wg-show-all-link',
'data-grid-state' => parameters.to_json,
'data-confim-message' => confirmation
)
[html, '']
end
def back_to_pagination_link(parameters, grid_name) #:nodoc:
pagination_override_parameter_name = "#{grid_name}[pp]"
parameters = parameters.reject { |k, _v| k == pagination_override_parameter_name }
content_tag(:a, NlMessage['switch_back_to_paginated_mode_label'],
href: '#',
title: NlMessage['switch_back_to_paginated_mode_tooltip'],
class: 'wg-back-to-pagination-link',
'data-grid-state' => parameters.to_json
)
end
def pagination_info(grid, allow_showing_all_records) #:nodoc:
collection = grid.resultset
if grid.all_record_mode?
collection_total_entries = collection.length
first = 1
last = collection.size
total_pages = 1
class << collection
def current_page
1
end
def total_pages
1
end
end
else
collection_total_entries = collection.total_count
first = collection.offset_value + 1
last = collection.last_page? ? collection.total_count : collection.offset_value + collection.limit_value
total_pages = collection.total_pages
end
parameters = grid.get_state_as_parameter_value_pairs
if total_pages < 2 && collection.length == 0
'0'
else
parameters << ["#{grid.name}[pp]", collection_total_entries]
show_all_records_link = allow_showing_all_records && collection_total_entries > collection.length
if show_all_records_link && limit = Wice::ConfigurationProvider.value_for(:SHOW_ALL_ALLOWED_UP_TO, strict: false)
show_all_records_link = limit > collection_total_entries
end
"#{first}-#{last} / #{collection_total_entries} " +
if show_all_records_link
res, _js = show_all_link(collection_total_entries, parameters, grid.name)
res
else
''
end
end +
if grid.all_record_mode?
back_to_pagination_link(parameters, grid.name)
else
''
end
end
end
end
================================================
FILE: lib/wice/kaminari_monkey_patching.rb
================================================
# Ugly monkey-patching Kaminari (https://github.com/amatsuda/kaminari/pull/267)
module Kaminari #:nodoc:
module Helpers #:nodoc:
class Tag #:nodoc:
def page_url_for(page) #:nodoc:
current_page_params_as_query_string = @param_name.to_s + '=' + (page <= 1 ? nil : page).to_s
current_page_params_as_hash = Rack::Utils.parse_nested_query(current_page_params_as_query_string)
@template.url_for Wice::WgHash.rec_merge(@params, current_page_params_as_hash).symbolize_keys
end
end
end
end
================================================
FILE: lib/wice/table_column_matrix.rb
================================================
module Wice
# a matrix for all declared columns
class TableColumnMatrix < Hash #:nodoc:
# returns the main ActiveRecord model class
attr_reader :default_model_class
# a structure to hold generates Arels for all column filters
attr_reader :generated_conditions
# init a matrix of all columns
def initialize #:nodoc:
super
@generated_conditions = []
@by_table_names = HashWithIndifferentAccess.new
end
# add an Arel for a column
def add_condition(column, conditions)
@generated_conditions << [column, conditions] unless conditions.blank?
end
# returns a list of all Arels
def conditions
@generated_conditions.collect { |_, cond| cond }
end
# sets the main ActiveRecord model class
def default_model_class=(model) #:nodoc:
init_columns_of_table(model) unless key?(model)
@default_model_class = model
end
# returns Arels for one model
alias_method :get, :[]
def [](model) #:nodoc:
init_columns_of_table(model) unless key?(model)
get(model)
end
def get_column_by_model_class_and_column_name(model_class, column_name) #:nodoc:
self[model_class][column_name]
end
def get_column_in_default_model_class_by_column_name(column_name) #:nodoc:
if @default_model_class.nil?
raise WiceGridException.new("Cannot search for this column(#{column_name}) in a default model(#{@default_model_class}) as the default model is not set")
end
self[@default_model_class][column_name]
end
def init_columns_of_table(model) #:nodoc:
self[model] =
HashWithIndifferentAccess.new(model.columns.map(&:dup).index_by(&:name))
@by_table_names[model.table_name] = self[model]
self[model].each_value { |c| c.model = model }
end
alias_method :<<, :init_columns_of_table
end
end
================================================
FILE: lib/wice/wice_grid_controller.rb
================================================
module Wice
module Controller #:nodoc:
def self.included(base) #:nodoc:
base.extend(ClassMethods)
end
module ClassMethods #:nodoc:
# Used to add query processing action methods into a controller.
# Read section "Saving Queries How-To" in README for more details.
def save_wice_grid_queries
include Wice::SerializedQueriesControllerMixin
end
end
protected
attr_accessor :wice_grid_instances #:nodoc:
# Creates a grid object to be used in the view. This is the main model, and the underlying table is the default table -
# if in other parameters a column name is mentioned without the name of the table, this table is implied.
# Just like in an ordinary ActiveRecord find you can use :joins , :include , and :conditions .
#
# The first parameter is an ActiveRecord class name or an ActiveRecord::Relation instance. The generated ActiveRecord call will use it as the
# receiver of the paginate method: klass.paginate(...)
#
# The second parameters is a hash of parameters:
# * :joins - ActiveRecord :joins option.
# * :include - ActiveRecord :include option.
# The value of `:include` can be an array of association names `include: [:category, :users, :status]`,
# If you need to join tables to joined tables, use hashes: `include: [:category, {users: :group}, :status]`
# * :conditions - ActiveRecord :conditions option.
# * :per_page - Number of rows per one page. The default is 10.
# * :page - The page to show when rendering the grid for the first time. The default is one, naturally.
# * :order - Name of the column to sort by. Can be of a short form (just the name of the column) if this
# is a column of the main table (the table of the main ActiveRecord model, the first parameter of initialize_grid ),
# or a fully qualified name with the name of the table.
# * :order_direction - :asc for ascending or :desc for descending. The default is :asc .
# * :name - name of the grid. Only needed if there is a second grid on a page. The name serves as the base name for
# HTTP parametes, DOM IDs, etc. The shorter the name, the shorter the GET request is. The name can only contain alphanumeruc characters.
# * :enable_export_to_csv - :csv_file_name - Name of the exported CSV file. If the parameter is missing, the name of the grid will be used instead.
# * :csv_field_separator - field separator for CSV files. The default is defined in +CSV_FIELD_SEPARATOR+ in the config file.
# * :custom_order - used for overriding the ORDER BY clause with custom sql code (for example, using an SQL
# function). A Hash with keys of the fully qualified names of database columns and with values that specify the
# ordering to be used, without specifying the direction (no ASC or DESC). The values of this Hash can any String
# of SQL that can be passed to the ActiveRecord order clause, an instance of Arel::Attributes::Attribute, or a
# Proc that receives the fully qualified column name and returns a String or Arel::Attributes::Attribute. See
# section 'Custom Ordering' in the README.
# * :saved_query - id of the saved query or the query object itself to load initially.
# Read section "Saving Queries How-To" in README for more details.
# * :after - defined a name of a controller method which would be called by the grid after all user input has been processed,
# with a single parameter which is a Proc object. Once called, the object returns a list of all records of the current selection
# throughout all pages. See section "Integration With The Application" in the README.
# * :select - ActiveRecord :select option. Please do not forget that :select is ignored
# when :include is present. It is unlikely you would need :select with WiceGrid, but if you do,
# use it with care :)
# * :group - ActiveRecord :group option. Use it if you are sure you know what you are doing :)
# * :with_paginated_resultset - a callback executed from within the plugin to process records of the current page.
# Can be a lambda object or a controller method name (symbol). The argument to the callback is the array of the records.
# * :with_resultset - a callback executed from within the plugin to process all records browsable through
# all pages with the current filters. Can be a lambda object or a controller method name (symbol). The argument to
# the callback is a lambda object which returns the list of records when called. See the README for the explanation.
#
# Defaults for parameters :per_page , :order_direction , and :name
# can be changed in lib/wice_grid_config.rb , this is convenient if you want to set a project wide setting
# without having to repeat it for every grid instance.
def initialize_grid(klass, opts = {})
wg = WiceGrid.new(klass, self, opts)
self.wice_grid_instances = [] if self.wice_grid_instances.nil?
self.wice_grid_instances << wg
wg
end
# +export_grid_if_requested+ is a controller method which should be called at the end of each action containing grids with enabled
# CSV export.
#
# CSV export will only work if each WiceGrid helper is placed in a partial of its own (requiring it from the master template
# of course for the usual flow).
# +export_grid_if_requested+ intercepts CSV export requests and evaluates the corresponding partial with the required grid helper.
# By default for each grid +export_grid_if_requested+ will look for a partial
# whose name follows the following pattern:
#
# _GRID_NAME_grid.html.erb
#
# For example, a grid named +orders+ is supposed to be found in a template called _orders_grid.html.erb ,
# Remember that the default name of grids is +grid+.
#
# This convention can be easily overridden by supplying a hash parameter to +export_grid_if_requested+ where each key is the name of
# a grid, and the value is the name of the template (like it is specified for +render+, i.e. without '_' and extensions):
#
# export_grid_if_requested('grid' => 'orders', 'grid2' => 'invoices')
#
# If the request is not a CSV export request, the method does nothing and returns +false+, if it is a CSV export request,
# the method returns +true+.
#
# If the action has no explicit +render+ call, it's OK to just place +export_grid_if_requested+ as the last line of the action. Otherwise,
# to avoid double rendering, use the return value of the method to conditionally call your +render+ :
#
# export_grid_if_requested || render(action: 'index')
#
# It's also possible to supply a block which will be called if no CSV export is requested:
#
# export_grid_if_requested do
# render(action: 'index')
# end
def export_grid_if_requested(opts = {})
grid = self.wice_grid_instances.detect(&:output_csv?)
if grid
template_name = opts[grid.name] || opts[grid.name.intern]
template_name ||= grid.name + '_grid'
temp_filename = render_to_string(partial: template_name)
temp_filename = temp_filename.strip
filename = (grid.csv_file_name || grid.name) + '.csv'
grid.csv_tempfile.close
send_file temp_filename, filename: filename, type: "text/csv; charset=#{get_output_encoding grid.csv_encoding}"
grid.csv_tempfile = nil
true
else
yield if block_given?
false
end
end
# +wice_grid_custom_filter_params+ generates HTTP parameters understood by WiceGrid custom filters.
# Combined with Rails route helpers it allows to generate links leading to
# grids with pre-selected custom filters.
#
# Parameters:
# * :grid_name - The name of the grid. Just like parameter :name of
# initialize_grid , the parameter is optional, and when absent, the name
# 'grid' is assumed
# * :attribute and :model - should be the same as :attribute and
# :model of the column declaration with the target custom filter.
# * :value - the value of the column filter.
def wice_grid_custom_filter_params(opts = {})
options = {
grid_name: 'grid',
attribute: nil,
model: nil,
value: nil
}
options.merge!(opts)
[:attribute, :value].each do |key|
raise ::Wice::WiceGridArgumentError.new("wice_grid_custom_filter_params: :#{key} is a mandatory argument") unless options[key]
end
attr_name = if options[:model]
unless options[:model].nil?
options[:model] = options[:model].constantize if options[:model].is_a? String
raise Wice::WiceGridArgumentError.new('Option :model can be either a class or a string instance') unless options[:model].is_a? Class
end
options[:model].table_name + '.' + options[:attribute]
else
options[:attribute]
end
{ "#{options[:grid_name]}[f][#{attr_name}][]" => options[:value] }
end
private
def get_output_encoding(csv_encoding)
if csv_encoding.blank?
'utf-8'
else
csv_encoding.split(':').first
end
end
end
end
================================================
FILE: lib/wice/wice_grid_core_ext.rb
================================================
module Wice
module WgHash #:nodoc:
class << self #:nodoc:
# if there's a hash of hashes, the original structure and the
# returned structure should not contain any shared deep hashes
def deep_clone(hash) #:nodoc:
cloned = hash.clone
cloned.keys.each do |k|
if cloned[k].is_a?(Hash)
cloned[k] = Wice::WgHash.deep_clone cloned[k]
end
end
cloned
end
# Used to modify options submitted to view helpers. If there is no :klass option,
# it will be added, if there is, the css class name will be appended to the existing
# class name(s)
def add_or_append_class_value!(hash, klass_value, prepend = false) #:nodoc:
if hash.key?('class')
hash[:class] = hash['class']
hash.delete('class')
end
hash[:class] = if hash.key?(:class)
if prepend
"#{klass_value} #{hash[:class]}"
else
"#{hash[:class]} #{klass_value}"
end
else
klass_value
end
hash
end
# Used mostly for submitting options to view helpers, that is, like this:
# content_tag(:th, col_link, Wice::WgHash.make_hash(:class, css_class))
# In some it is important that if the value is empty, no option
# is submitted at all. Thus, there's a check for an empty value
def make_hash(key, value) #:nodoc:
value.blank? ? {} : { key => value }
end
# A deep merge of two hashes.
# That is, if both hashes have the same key and the values are hashes, these two hashes should also be merged.
# Used for merging two sets of params.
def rec_merge(hash, other) #:nodoc:
res = hash.clone
other.each do |key, other_value|
value = res[key]
if value.is_a?(Hash) && other_value.is_a?(Hash)
res[key] = rec_merge value, other_value
else
res[key] = other_value
end
end
res
end
# Used to transform a traditional params hash
# into an array of two element arrays where element zero is a parameter name as it appears in HTTP requests,
# and the first element is the value:
# { a: { b: 3, c: 4, d: { e: 5 }} }.parameter_names_and_values #=> [["a[d][e]", 5], ["a[b]", 3], ["a[c]", 4]]
# The parameter is an optional array of parameter names to prepend:
# { a: { b: 3, c: 4, d: { e: 5 }} }.parameter_names_and_values(['foo', 'baz']) #=>
# [["foo[baz][a][d][e]", 5], ["foo[baz][a][b]", 3], ["foo[baz][a][c]", 4]]
def parameter_names_and_values(hash, initial = []) #:nodoc:
res = []
recursively_gather_finite_non_hash_values_with_key_path(hash, res, [])
res.collect do |parameter_struct|
parameter_struct[0] = initial + parameter_struct[0]
[Wice::WgArray.to_parameter_name(parameter_struct[0]), parameter_struct[1]]
end
end
protected
def recursively_gather_finite_non_hash_values_with_key_path(hash, res, stack = []) #:nodoc:
hash.each do |key, value|
if value.is_a?(Hash)
recursively_gather_finite_non_hash_values_with_key_path(value, res, stack + [key])
else
res << [stack + [key], value]
end
end
end
end
end
module WgEnumerable #:nodoc:
# Used to check the validity of :custom_filter parameter of column
def self.all_items_are_of_class(enumerable, klass) #:nodoc:
return false if enumerable.empty?
enumerable.inject(true) { |memo, o| (o.is_a? klass) && memo }
end
end
module WgArray #:nodoc:
# Only used by Hash#parameter_names_and_values
# Transforms ['foo', 'bar', 'baz'] to 'foo[bar][baz]'
def self.to_parameter_name(array) #:nodoc:
array[0].to_s + (array[1..-1] || []).collect { |k| '[' + k.to_s + ']' }.join('')
end
end
end
# tag_options is a Rails views private method that takes a hash op options for
# an HTM hash and produces a string ready to be added to the tag.
# Here we are changing its visibility in order to be able to use it.
module ActionView #:nodoc:
module Helpers #:nodoc:
module TagHelper #:nodoc:
def public_tag_options(options, escape = true) #:nodoc:
if respond_to?(:tag_options, true)
tag_options(options, escape)
else
tag_builder.tag_options(options, escape)
end
end
end
end
end
module WGObjectExtensions #:nodoc:
# takes a list of messages, sends message 1 to self, then message 2 is sent to the result of the first message, ans so on
# returns nil as soon as the current receiver does not respond to such a message
def deep_send(*messages) #:nodoc:
obj = self
messages.each do |message|
if obj.respond_to? message
obj = obj.send(message)
else
return nil
end
# return obj if obj.nil?
end
obj
end
end
class Object #:nodoc:
include WGObjectExtensions
end
================================================
FILE: lib/wice/wice_grid_misc.rb
================================================
module Wice
class << self
# a flag storing whether the saved query class is a valid storage for saved queries
@@model_validated = false
def assoc_list_to_hash(assocs) #:nodoc:
head = assocs[0]
tail = assocs[1..-1]
if tail.blank?
head
elsif tail.size == 1
{head => tail[0]}
else
{head => assoc_list_to_hash(tail)}
end
end
def build_includes(existing_includes, new_assocs) #:nodoc:
new_includes = if new_assocs.blank?
existing_includes
else
existing_includes = if existing_includes.is_a?(Symbol)
[existing_includes]
elsif existing_includes.nil?
[]
else
existing_includes
end
assocs_as_hash = assoc_list_to_hash(new_assocs)
build_includes_int(existing_includes, assocs_as_hash)
end
if new_includes.is_a?(Array) && new_includes.size == 1
new_includes[0]
else
new_includes
end
end
def build_includes_int(includes, assocs) #:nodoc:
if includes.is_a?(Array)
build_includes_includes_is_array(includes, assocs)
elsif includes.is_a?(Hash)
build_includes_includes_is_hash(includes, assocs)
end
end
# TODO: refactor
def build_includes_includes_is_hash(includes, assocs) #:nodoc:
includes_key = includes.keys[0]
includes_value = includes.values[0]
if assocs.is_a?(Hash)
assocs_key = assocs.keys[0]
assocs_value = assocs.values[0]
if includes_value.is_a?(Symbol) && includes_value == assocs_key
{includes_key => assocs}
elsif includes_value.is_a?(Hash)
if includes_value.keys[0] == assocs_key
if includes_value.values[0] == assocs_value
{includes_key => assocs}
else
{includes_key => [includes_value.values[0], assocs_value]}
end
end
end
elsif includes_value == assocs
{includes_key => assocs}
else
includes
end
end
def build_includes_includes_is_array(includes, assocs) #:nodoc:
hash_keys = Hash[
*(
includes
.each_with_index
.to_a
.select{ |e, _idx| e.is_a?(Hash)}
.map{ |hash, idx| [ hash.keys[0], idx ] }
.flatten
)
]
key_to_search, finished = if assocs.is_a?(Hash)
[assocs.keys[0], false]
else
[assocs, true]
end
if idx = includes.index(key_to_search)
if finished # [:a, :b, :c] vs :a
includes
else # [:a, :b, :c] vs {:a => x}
includes[idx] = assocs
includes
end
elsif hash_keys.key?(key_to_search)
if finished # [{a: :x}, :b, :c, :d, :e] vs :a
includes
else
hash_idx = hash_keys[key_to_search]
assocs_value = assocs[key_to_search]
includes[hash_idx] = build_includes_int(includes[hash_idx], assocs_value)
includes
end
else # [:a, :b, :c] vs :x
# [:a, :b, :c] vs {:x => y}
includes + [assocs]
end
end
# checks whether the class is a valid storage for saved queries
def validate_query_model(query_store_model) #:nodoc:
unless query_store_model.respond_to?(:list)
raise ::Wice::WiceGridArgumentError.new("Model for saving queries #{query_store_model.class.name} is invalid - there is no class method #list defined")
end
arit = query_store_model.method(:list).arity
unless arit == 2
raise ::Wice::WiceGridArgumentError.new("Method list in the model for saving queries #{query_store_model.class.name} has wrong arity - it should be 2 instead of #{arit}")
end
@@model_validated = true
end
# Retrieves and constantizes (if needed ) the Query Store model
def get_query_store_model #:nodoc:
query_store_model = Wice::ConfigurationProvider.value_for(:QUERY_STORE_MODEL)
query_store_model = query_store_model.constantize if query_store_model.is_a? String
raise ::Wice::WiceGridArgumentError.new('Defaults::QUERY_STORE_MODEL must be an ActiveRecord class or a string which can be constantized to an ActiveRecord class') unless query_store_model.is_a? Class
validate_query_model(query_store_model) unless @@model_validated
query_store_model
end
def get_string_matching_operators(model) #:nodoc:
if defined?(Wice::Defaults::STRING_MATCHING_OPERATORS) && (ops = Wice::ConfigurationProvider.value_for(:STRING_MATCHING_OPERATORS)) &&
ops.is_a?(Hash) && (str_matching_operator = ops[model.connection.class.to_s])
str_matching_operator
else
Wice::ConfigurationProvider.value_for(:STRING_MATCHING_OPERATOR)
end
end
def deprecated_call(old_name, new_name, opts) #:nodoc:
if opts[old_name] && !opts[new_name]
opts[new_name] = opts[old_name]
opts.delete(old_name)
STDERR.puts "WiceGrid: Parameter :#{old_name} is deprecated, use :#{new_name} instead!"
end
end
def log(message) #:nodoc:
ActiveRecord::Base.logger.info('WiceGrid: ' + message) if ActiveRecord::Base.logger
end
end
module NlMessage #:nodoc:
class << self
def [](key) #:nodoc:
I18n.t(key, scope: 'wice_grid')
end
end
end
module ConfigurationProvider #:nodoc:
class << self
def value_for(key, strict: true) #:nodoc:
if Wice::Defaults.const_defined?(key)
Wice::Defaults.const_get(key)
else
if strict
raise WiceGridMissingConfigurationConstantException.new("Could not find constant #{key} in the configuration file!" \
' It is possible that the version of WiceGrid you are using is newer than the installed configuration file in config/initializers. ' \
"Constant Wice::Defaults::#{key} is missing and you need to add it manually to wice_grid_config.rb or run the generator task=:\n" \
' rails g wice_grid:install')
end # else nil
end
end
end
end
module Defaults #:nodoc:
end
module ExceptionsMixin #:nodoc:
def initialize(str) #:nodoc:
super('WiceGrid: ' + str)
end
end
class WiceGridArgumentError < ArgumentError #:nodoc:
include ExceptionsMixin
end
class WiceGridException < Exception #:nodoc:
include ExceptionsMixin
end
class WiceGridMissingConfigurationConstantException < Exception #:nodoc:
include ExceptionsMixin
end
end
================================================
FILE: lib/wice/wice_grid_serialized_queries_controller.rb
================================================
module Wice
class <ActionDispatch::Routing::Mapper).
# Normally use +self+ for the first argument: Wice::define_routes(self, 'queries')
# * controller - name of the query processing controller, i.e. 'queries' if the controller is +QueriesController+ .
# Read section "Saving Queries How-To" in README for more details.
def define_routes(map, controller)
controller = controller.to_s
map.post '/wice_grid_serialized_queries/:grid_name',
to: "#{controller}#create_saved_query",
as: 'create_serialized_query'
map.post '/wice_grid_serialized_queries/:grid_name/:id',
to: "#{controller}#delete_saved_query",
as: 'delete_serialized_query'
end
end
module SerializedQueriesControllerMixin #:nodoc:
def delete_saved_query #:nodoc:
init
if sq = @query_store_model.find_by_id_and_grid_name(params[:id], @grid_name)
if sq.destroy
if params[:current]
@current = @query_store_model.find_by_id_and_grid_name(params[:current], @grid_name)
end
@notification_messages = NlMessage['query_deleted_message']
else
@error_messages = sq.errors.full_raw_messages.join(' ')
end
end
render_asyns_result
end
def create_saved_query #:nodoc:
init
query_params = if params[@grid_name]
params[@grid_name]
else
{}
end
query_params.delete(:page)
@saved_query = @query_store_model.new
@saved_query.grid_name = @grid_name
@saved_query.name = params[:query_name]
@saved_query.query = query_params
@saved_query.attributes = extra unless extra.nil?
if @saved_query.save
@grid_title_id = "#{@grid_name}_title"
@notification_messages = NlMessage['query_saved_message']
else
@error_messages = @saved_query.errors.map { |_, msg| msg }.join(' ')
end
render_asyns_result
end
def extra #:nodoc:
params[:extra].permit! unless params[:extra].nil?
end
protected
def render_asyns_result #:nodoc:
render json: {
'error_messages' => @error_messages,
'notification_messages' => @notification_messages,
'query_list' => render_to_string(inline: '<%=saved_queries_list(@grid_name, @saved_query, controller.extra, @confirm).html_safe%>')
}
end
def init #:nodoc:
@query_store_model = ::Wice.get_query_store_model
@confirm = params[:confirm] == '1' || params[:confirm] == 'true'
@grid_name = params[:grid_name]
end
end
end
================================================
FILE: lib/wice/wice_grid_serialized_query.rb
================================================
class WiceGridSerializedQuery < ActiveRecord::Base #:nodoc:
serialize :query
validates_uniqueness_of :name, scope: :grid_name, on: :create, message: 'A query with this name already exists'
validates_presence_of :name, message: 'Please submit the name of the custom query'
# returns a list of all serialized queries
def self.list(name, _controller)
conditions = { grid_name: name }
self.where(conditions).to_a
end
end
================================================
FILE: lib/wice/wice_grid_spreadsheet.rb
================================================
require 'csv'
module Wice
class Spreadsheet #:nodoc:
#:nodoc:
attr_reader :tempfile
def initialize(name, field_separator, encoding = nil) #:nodoc:
@tempfile = Tempfile.new(name)
@tempfile.set_encoding(encoding) unless encoding.blank?
@csv = CSV.new(@tempfile, col_sep: field_separator)
end
def << (row) #:nodoc:
@csv << row
end
end
end
================================================
FILE: lib/wice_grid.rb
================================================
require 'wice/wice_grid_misc.rb'
require 'wice/wice_grid_core_ext.rb'
require 'wice/grid_renderer.rb'
require 'wice/table_column_matrix.rb'
require 'wice/active_record_column_wrapper.rb'
require 'wice/helpers/wice_grid_view_helpers.rb'
require 'wice/helpers/wice_grid_misc_view_helpers.rb'
require 'wice/helpers/wice_grid_serialized_queries_view_helpers.rb'
require 'wice/helpers/wice_grid_view_helpers.rb'
require 'wice/helpers/bs_calendar_helpers.rb'
require 'wice/helpers/js_calendar_helpers.rb'
require 'wice/grid_output_buffer.rb'
require 'wice/wice_grid_controller.rb'
require 'wice/wice_grid_spreadsheet.rb'
require 'wice/wice_grid_serialized_queries_controller.rb'
require 'wice/columns/column_processor_index.rb'
require 'wice/columns.rb'
require 'wice/columns/common_date_datetime_mixin.rb'
require 'wice/columns/common_standard_helper_date_datetime_mixin.rb'
require 'wice/columns/common_js_date_datetime_mixin.rb'
require 'wice/columns/common_js_date_datetime_conditions_generator_mixin.rb'
require 'wice/columns/common_rails_date_datetime_conditions_generator_mixin.rb'
require 'kaminari.rb'
ActionController::Base.send(:helper_method, :wice_grid_custom_filter_params)
module Wice
def self.on_action_view_load #:nodoc:
::ActionView::Base.class_eval { include Wice::GridViewHelper }
[ActionView::Helpers::AssetTagHelper,
ActionView::Helpers::TagHelper,
ActionView::Helpers::JavaScriptHelper,
ActionView::Helpers::FormTagHelper].each do |m|
JsCalendarHelpers.send(:include, m)
end
Columns.load_column_processors
require 'wice/wice_grid_serialized_query.rb'
# It is here only because of this: https://github.com/amatsuda/kaminari/pull/267
require 'wice/kaminari_monkey_patching.rb'
end
class WiceGridEngine < ::Rails::Engine #:nodoc:
initializer 'wice_grid_railtie.configure_rails_initialization' do |_app|
ActiveSupport.on_load :action_controller do
ActionController::Base.send(:include, Wice::Controller)
end
ActiveSupport.on_load :active_record do
ActiveRecord::ConnectionAdapters::Column.send(:include, ::Wice::WiceGridExtentionToActiveRecordColumn)
end
ActiveSupport.on_load :action_view do
::Wice.on_action_view_load
end
end
initializer 'wice_grid_railtie.configure_rails_assets_precompilation' do |app|
app.config.assets.precompile << 'icons/grid/*'
end
end
# Main class responsible for keeping the state of the grid, building an ActiveRelation, and running queries
class WiceGrid
attr_reader :klass, :name, :resultset, :custom_order, :query_store_model #:nodoc:
attr_reader :ar_options, :status, :export_to_csv_enabled, :csv_file_name, :csv_field_separator, :csv_encoding, :saved_query #:nodoc:
attr_writer :renderer #:nodoc:
attr_accessor :output_buffer, :view_helper_finished, :csv_tempfile #:nodoc:
# core workflow methods START
def initialize(klass_or_relation, controller, opts = {}) #:nodoc:
@controller = controller
@relation = klass_or_relation
@klass = if @relation.is_a?(Class) && @relation.ancestors.index(ActiveRecord::Base)
klass_or_relation
else
klass_or_relation.klass
end
unless @klass.is_a?(Class) && @klass.ancestors.index(ActiveRecord::Base)
raise WiceGridArgumentError.new('ActiveRecord model class (second argument) must be a Class derived from ActiveRecord::Base')
end
# validate :with_resultset & :with_paginated_resultset
[:with_resultset, :with_paginated_resultset].each do |callback_symbol|
unless [NilClass, Symbol, Proc].index(opts[callback_symbol].class)
raise WiceGridArgumentError.new(":#{callback_symbol} must be either a Proc or Symbol object")
end
end
opts[:order_direction] = opts[:order_direction].downcase if opts[:order_direction].is_a?(String)
# validate :order_direction
if opts[:order_direction] && ! (opts[:order_direction] == 'asc' || opts[:order_direction] == :asc || opts[:order_direction] == 'desc' ||
opts[:order_direction] == :desc)
raise WiceGridArgumentError.new(":order_direction must be either 'asc' or 'desc'.")
end
begin
# options that are understood
@options = {
conditions: nil,
csv_file_name: nil,
csv_field_separator: ConfigurationProvider.value_for(:CSV_FIELD_SEPARATOR),
csv_encoding: ConfigurationProvider.value_for(:CSV_ENCODING),
custom_order: {},
enable_export_to_csv: ConfigurationProvider.value_for(:ENABLE_EXPORT_TO_CSV),
group: nil,
include: nil,
joins: nil,
name: ConfigurationProvider.value_for(:GRID_NAME),
order: nil,
order_direction: ConfigurationProvider.value_for(:ORDER_DIRECTION),
page: 1,
page_method_name: ConfigurationProvider.value_for(:PAGE_METHOD_NAME),
per_page: ConfigurationProvider.value_for(:PER_PAGE),
saved_query: nil,
with_paginated_resultset: nil,
with_resultset: nil,
use_default_scope: ConfigurationProvider.value_for(:USE_DEFAULT_SCOPE)
}
rescue NameError
raise NameError.new('A constant is missing in wice_grid_config.rb: ' + $ERROR_INFO.message +
'. This can happen when you upgrade the WiceGrid to a newer version with a new configuration constant. ' \
'Add the constant manually or re-run `bundle exec rails g wice_grid:install`.')
end
# validate parameters
opts.assert_valid_keys(@options.keys)
@options.merge!(opts)
@export_to_csv_enabled = @options[:enable_export_to_csv]
@csv_file_name = @options[:csv_file_name]
@csv_field_separator = @options[:csv_field_separator]
@csv_encoding = @options[:csv_encoding]
case @name = @options[:name]
when String
when Symbol
@name = @name.to_s
else
raise WiceGridArgumentError.new('name of the grid should be a string or a symbol')
end
raise WiceGridArgumentError.new('name of the grid can only contain alphanumeruc characters') unless @name =~ /^[a-zA-Z\d_]*$/
@table_column_matrix = TableColumnMatrix.new
@table_column_matrix.default_model_class = @klass
@ar_options = {}
@status = HashWithIndifferentAccess.new
if @options[:order]
@options[:order] = @options[:order].to_s
@options[:order_direction] = @options[:order_direction].to_s
@status[:order_direction] = @options[:order_direction]
@status[:order] = @options[:order]
end
@status[:per_page] = @options[:per_page]
@status[:page] = @options[:page]
@status[:conditions] = @options[:conditions]
@status[:f] = @options[:f]
fix_facebook_bug
process_loading_query
process_params
@ar_options_formed = false
end
# A block executed from within the plugin to process records of the current page.
# The argument to the callback is the array of the records. See the README for more details.
def with_paginated_resultset(&callback)
@options[:with_paginated_resultset] = callback
end
# A block executed from within the plugin to process all records browsable through
# all pages with the current filters. The argument to
# the callback is a lambda object which returns the list of records when called. See the README for the explanation.
def with_resultset(&callback)
@options[:with_resultset] = callback
end
def fix_facebook_bug
if params[name] and filter = params[name][:f]
params[name][:f] = filter.to_unsafe_h
.each_with_object({}) do |(key, value), hash|
if value.is_a?(Hash) and value.keys.all? {|key| key.to_s.match? /^[0-9]+$/}
hash[key] = value.values
else
hash[key] = value
end
end
end
end
def process_loading_query #:nodoc:
@saved_query = nil
if params[name] && params[name][:q]
@saved_query = load_query(params[name][:q])
params[name].delete(:q)
elsif @options[:saved_query]
if @options[:saved_query].is_a? ActiveRecord::Base
@saved_query = @options[:saved_query]
else
@saved_query = load_query(@options[:saved_query])
end
else
return
end
unless @saved_query.nil?
params[name] = HashWithIndifferentAccess.new if params[name].blank?
[:f, :order, :order_direction].each do |key|
if @saved_query.query[key].blank?
params[name].delete(key)
else
params[name][key] = @saved_query.query[key]
end
end
end
end
def process_params #:nodoc:
if this_grid_params
@status.merge!(this_grid_params)
@status.delete(:export) unless self.export_to_csv_enabled
end
end
# declare_column(String, ActiveRecord, CustomFilterSpec, nil | string, nil | Boolean)
def declare_column(
column_name: nil,
model: nil,
custom_filter_active: nil,
table_alias: nil,
filter_type: nil,
assocs: [],
sort_by: nil) #:nodoc:
@options[:include] = Wice.build_includes(@options[:include], assocs)
if model # this is an included table
column = @table_column_matrix.get_column_by_model_class_and_column_name(model, column_name)
raise WiceGridArgumentError.new("Column '#{column_name}' is not found in table '#{model.table_name}'!") if column.nil?
main_table = false
table_name = model.table_name
else
column = @table_column_matrix.get_column_in_default_model_class_by_column_name(column_name)
# Allow the column to not exist if we're doing a custom sort (calculated field)
if column.nil? && !sort_by
raise WiceGridArgumentError.new("Column '#{column_name}' is not found in table '#{@klass.table_name}'! " \
"If '#{column_name}' belongs to another table you should declare it in :include or :join when initialising " \
'the grid, and specify :model in column declaration.')
end
main_table = true
table_name = @table_column_matrix.default_model_class.table_name
end
if column
conditions_generator = ActiveRecordColumnWrapper.new(
column, @status[:f], main_table,
table_alias, custom_filter_active, filter_type
)
conditions, current_parameter_name =
conditions_generator.wg_initialize_request_parameters
if @status[:f] && conditions.blank?
@status[:f].delete(current_parameter_name)
end
@table_column_matrix.add_condition(column, conditions)
# [ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter::Column, String, Boolean]
[column, table_name, main_table]
end
end
def form_ar_options(opts = {}) #:nodoc:
return if @ar_options_formed
@ar_options_formed = true unless opts[:forget_generated_options]
# validate @status[:order_direction]
@status[:order_direction] = case @status[:order_direction]
when /desc/i
'desc'
when /asc/i
'asc'
else
''
end
# conditions
# do not delete for a while
# https://github.com/leikind/wice_grid/issues/144
# if @table_column_matrix.generated_conditions.size == 0
# @status.delete(:f)
# end
initial_conditions_active_relation = @klass.where(@status[:conditions])
@ar_options[:conditions] =
@table_column_matrix.conditions.reduce(initial_conditions_active_relation) do |active_relation_accu, cond|
conditions_active_relation = @klass.where(cond)
active_relation_accu.merge(conditions_active_relation)
end
# conditions processed
if (!opts[:skip_ordering]) && ! @status[:order].blank?
custom_order = get_custom_order_reference
if custom_order
@ar_options[:order] = custom_order
else
@ar_options[:order] = arel_column_reference(@status[:order])
end
if @ar_options[:order].is_a?(Arel::Attributes::Attribute) || @ar_options[:order].is_a?(Arel::Nodes::SqlLiteral)
if @status[:order_direction] == 'desc'
@ar_options[:order] = @ar_options[:order].desc
else
@ar_options[:order] = @ar_options[:order].asc
end
else
@ar_options[:order] += " #{@status[:order_direction]}"
end
end
@ar_options[:joins] = @options[:joins]
@ar_options[:include] = @options[:include]
@ar_options[:group] = @options[:group]
if self.output_html?
@ar_options[:per_page] = @status[:per_page]
@ar_options[:page] = @status[:page]
if (show_all_limit = Wice::ConfigurationProvider.value_for(:SHOW_ALL_ALLOWED_UP_TO, strict: false)) && all_record_mode?
if do_count > show_all_limit # force-reset SHOW-ALL to pagination
@status[:pp] = nil
end
end
end
end
def add_references(relation) #:nodoc:
if @ar_options[:include] && relation.respond_to?(:references)
# refs = [@ar_options[:include]] unless @ar_options[:include].is_a?(Array)
relation = relation.references(* @ar_options[:include])
end
relation
end
# Apply the sort_by option to the results.
def apply_sort_by(relation)
active_sort_by = nil
@renderer.find_one_for(->(c) {c.attribute == @status[:order]}) {|r| active_sort_by = r.sort_by}
return relation if !active_sort_by
relation = relation.sort_by(&active_sort_by)
relation = relation.reverse if @status[:order_direction] == 'desc'
return relation
end
# TO DO: what to do with other @ar_options values?
def read #:nodoc:
form_ar_options
use_default_or_unscoped do
relation = @relation
.includes(@ar_options[:include])
.joins(@ar_options[:joins])
.group(@ar_options[:group])
.merge(@ar_options[:conditions])
relation = add_references relation
relation = apply_sort_by relation
# If relation is an Array, it got the sort from apply_sort_by.
if @ar_options[:order].is_a? String
@ar_options[:order] = Arel.sql @ar_options[:order]
end
relation = relation.order(@ar_options[:order]) if !relation.is_a?(Array)
if !output_csv? && !all_record_mode?
if relation.is_a?(Array)
relation = Kaminari.paginate_array(relation, limit: @ar_options[:per_page], offset: @ar_options[:per_page].to_i * (@ar_options[:page].to_i - 1))
else
relation = relation
.send(@options[:page_method_name], @ar_options[:page])
.per(@ar_options[:per_page])
end
end
if all_record_mode? && relation.is_a?(Array)
# This still needs to be a Kaminari object as the paginator will read limit_value.
relation = Kaminari.paginate_array(relation, limit: relation.count)
end
@resultset = relation
end
invoke_resultset_callbacks
end
# core workflow methods END
# Getters
def filter_params(view_column) #:nodoc:
column_name = view_column.attribute_name_fully_qualified_for_all_but_main_table_columns
if @status[:f] && @status[:f][column_name]
@status[:f][column_name]
else
{}
end
end
def resultset #:nodoc:
self.read unless @resultset # database querying is late!
@resultset
end
def each #:nodoc:
self.read unless @resultset # database querying is late!
@resultset.each do |r|
yield r
end
end
# Returns true if the current results are ordered by the passed column.
def ordered_by?(column)
return nil if @status[:order].blank?
if column.main_table && ! @status[:order].index('.') || column.table_alias_or_table_name.nil?
@status[:order] == column.attribute
else
@status[:order] == column.table_alias_or_table_name + '.' + column.attribute
end
end
def ordered_by #:nodoc:
@status[:order]
end
def order_direction #:nodoc:
@status[:order_direction]
end
def filtering_on? #:nodoc:
!@status[:f].blank?
end
def filtered_by #:nodoc:
@status[:f].nil? ? [] : @status[:f].keys
end
def filtered_by?(view_column) #:nodoc:
@status[:f].nil? ? false : @status[:f].key?(view_column.attribute_name_fully_qualified_for_all_but_main_table_columns)
end
def get_state_as_parameter_value_pairs(including_saved_query_request = false) #:nodoc:
res = []
unless status[:f].blank?
Wice::WgHash.parameter_names_and_values(status[:f], [name, 'f']).collect do |param_name, value|
if value.is_a?(Array)
param_name_ar = param_name + '[]'
value.each do |v|
res << [param_name_ar, v]
end
else
res << [param_name, value]
end
end
end
if including_saved_query_request && @saved_query
res << ["#{name}[q]", @saved_query.id]
end
[:order, :order_direction].select do|parameter|
status[parameter]
end.collect do |parameter|
res << ["#{name}[#{parameter}]", status[parameter]]
end
res
end
def count #:nodoc:
form_ar_options(skip_ordering: true, forget_generated_options: true)
do_count
end
def do_count #:nodoc:
@relation
.all
.joins(@ar_options[:joins])
.includes(@ar_options[:include])
.group(@ar_options[:group])
.where(@options[:conditions])
.count
end
alias_method :size, :count
def empty? #:nodoc:
self.count == 0
end
# with this variant we get even those values which do not appear in the resultset
def distinct_values_for_column(column) #:nodoc:
column.model.select("distinct #{column.name}").order("#{column.name} asc").collect do|ar|
ar[column.name]
end.reject(&:blank?).map { |i| [i, i] }
end
def distinct_values_for_column_in_resultset(messages) #:nodoc:
uniq_vals = Set.new
resultset_without_paging_without_user_filters.each do |ar|
v = ar.deep_send(*messages)
uniq_vals << v unless v.nil?
end
uniq_vals.to_a.map do|i|
if i.is_a?(Array) && i.size == 2
i
elsif i.is_a?(Hash) && i.size == 1
i.to_a.flatten
else
[i, i]
end
end.sort { |a, b| a[0] <=> b[0] }
end
def output_csv? #:nodoc:
@status[:export] == 'csv'
end
def output_html? #:nodoc:
@status[:export].blank?
end
def all_record_mode? #:nodoc:
@status[:pp]
end
def dump_status #:nodoc:
" params: #{params[name].inspect}\n" + " status: #{@status.inspect}\n" \
" ar_options #{@ar_options.inspect}\n"
end
# Returns the list of objects browsable through all pages with the current filters.
# Should only be called after the +grid+ helper.
def all_pages_records
raise WiceGridException.new('all_pages_records can only be called only after the grid view helper') unless self.view_helper_finished
resultset_without_paging_with_user_filters
end
# Returns the list of objects displayed on current page. Should only be called after the +grid+ helper.
def current_page_records
raise WiceGridException.new('current_page_records can only be called only after the grid view helper') unless self.view_helper_finished
@resultset
end
protected
def invoke_resultset_callback(callback, argument) #:nodoc:
case callback
when Proc
callback.call(argument)
when Symbol
@controller.send(callback, argument)
end
end
def invoke_resultset_callbacks #:nodoc:
invoke_resultset_callback(@options[:with_paginated_resultset], @resultset)
invoke_resultset_callback(@options[:with_resultset], self.active_relation_for_resultset_without_paging_with_user_filters)
end
# If a custom order has been configured, gets the column/function to be ordered by. If no custom order, returns nil.
def get_custom_order_reference
# TODO Do we need to distinguish between no custom order and a custom order that defines no ordering? Both return nil.
fully_qualified_column_name = complete_column_name(@status[:order])
custom_order = if @options[:custom_order].key?(fully_qualified_column_name)
@options[:custom_order][fully_qualified_column_name]
else
if view_column = @renderer[fully_qualified_column_name]
view_column.custom_order
end
end
return custom_order if custom_order.nil? || custom_order.is_a?(Arel::Attributes::Attribute)
return custom_order.gsub(/\?/, fully_qualified_column_name) if custom_order.is_a?(String)
return custom_order.call(fully_qualified_column_name) if custom_order.is_a?(Proc)
raise WiceGridArgumentError.new("invalid custom order #{custom_order.inspect}")
end
# Returns an Arel::Attributes::Attribute for the passed column reference.
def arel_column_reference(col_name) #:nodoc:
if col_name.index('.') # already has a table name
table_name, col_name = col_name.split('.', 2)
Arel::Table.new(table_name)[col_name]
else # add the default table
@klass.arel_table[col_name]
end
end
# Returns tablename.columnname for the passed column reference.
def complete_column_name(col_name)
return col_name if col_name.index('.') # already has a table name
return "#{@klass.table_name}.#{col_name}"
end
def params #:nodoc:
@controller.params
end
def this_grid_params #:nodoc:
params[name].try(:to_unsafe_h) || params[name]
end
def resultset_without_paging_without_user_filters #:nodoc:
form_ar_options
use_default_or_unscoped do
relation = @relation.joins(@ar_options[:joins])
.includes(@ar_options[:include])
.group(@ar_options[:group])
.where(@options[:conditions])
relation = add_references relation
relation
end
end
# not used right now
# def count_resultset_without_paging_without_user_filters #:nodoc:
# form_ar_options
# @klass.unscoped do
# @relation.count(
# joins: @ar_options[:joins],
# include: @ar_options[:include],
# group: @ar_options[:group],
# conditions: @options[:conditions]
# )
# end
# end
def resultset_without_paging_with_user_filters #:nodoc:
active_relation_for_resultset_without_paging_with_user_filters.to_a
end
def active_relation_for_resultset_without_paging_with_user_filters #:nodoc:
form_ar_options
relation = nil
use_default_or_unscoped do
if @ar_options[:order].is_a? String
@ar_options[:order] = Arel.sql @ar_options[:order]
end
relation = @relation
.joins(@ar_options[:joins])
.includes(@ar_options[:include])
.order(@ar_options[:order])
.merge(@ar_options[:conditions])
relation = add_references relation
end
relation
end
def load_query(query_id) #:nodoc:
@query_store_model ||= Wice.get_query_store_model
query = @query_store_model.find_by_id_and_grid_name(query_id, self.name)
Wice.log("Query with id #{query_id} for grid '#{self.name}' not found!!!") if query.nil?
query
end
def use_default_or_unscoped #:nodoc:
if @options[:use_default_scope]
yield
else
@klass.unscoped { yield }
end
end
end
# routines called from WiceGridExtentionToActiveRecordColumn (ActiveRecord::ConnectionAdapters::Column) or ConditionsGeneratorColumn classes
module GridTools #:nodoc:
class << self
def special_value(str) #:nodoc:
str =~ /^\s*(not\s+)?null\s*$/i
end
# create a Time instance out of parameters
def params_2_datetime(par) #:nodoc:
return nil if par.blank?
params = [par[:year], par[:month], par[:day], par[:hour], par[:minute]].collect { |v| v.blank? ? nil : v.to_i }
begin
Time.local(*params)
rescue ArgumentError, TypeError
nil
end
end
# create a Date instance out of parameters
def params_2_date(par) #:nodoc:
return nil if par.blank?
params = [par[:year], par[:month], par[:day]].collect { |v| v.blank? ? nil : v.to_i }
begin
Date.civil(*params)
rescue ArgumentError, TypeError
nil
end
end
end
end
end
================================================
FILE: package.json
================================================
{
"name": "wice-grid",
"version": "4.1.0",
"description": "WiceGrid is a Rails grid plugin",
"main": "vendor/assets/javascripts/wice_grid.js",
"repository": {
"type": "git",
"url": "/home/dima/devel/github/wice_grid"
},
"author": "Dmitry Kulikov",
"license": "MIT",
"directories": {
"lib": "lib"
},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
}
}
================================================
FILE: spec/acceptance_helper.rb
================================================
# encoding: utf-8
require 'capybara/rspec'
# This file is copied to spec/ when you run 'rails generate rspec:install'
ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../support/test_app/config/environment', __FILE__)
require 'rspec/rails'
require 'faker'
if ENV['BROWSER']
Capybara.default_driver = :selenium
else
require 'capybara/poltergeist'
Capybara.javascript_driver = :poltergeist
require 'capybara-screenshot/rspec'
Capybara::Screenshot.prune_strategy = :keep_last_run
end
Capybara.server = :webrick
# Requires supporting ruby files with custom matchers and macros, etc,
# in spec/support/ and its subdirectories.
Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f }
ALL_TESTS = false
RSpec.configure do |config|
# config.mock_with :mocha
# config.mock_with :flexmock
# config.mock_with :rr
config.fixture_paths ||= []
config.fixture_paths << "spec/fixtures"
config.use_transactional_fixtures = true
# If true, the base class of anonymous controllers will be inferred
# automatically. This will be the default behavior in future versions of
# rspec-rails.
config.infer_base_class_for_anonymous_controllers = false
config.global_fixtures = :all
config.include Capybara::DSL
end
# Disable SQL logging
ActiveRecord::Base.logger = nil
require 'features/shared.rb'
require 'features/shared_detached_filters.rb'
================================================
FILE: spec/features/action_column_request_spec.rb
================================================
# encoding: utf-8
require 'acceptance_helper'
describe 'On the page /action_column WiceGrid', type: :request, js: true do
before :each do
visit '/action_column'
end
it 'allows to select all rows by clicking the checkbox in the header' do
510.upto(520).each do |i|
find(:css, %(input[type="checkbox"][value="#{i}"])).click
end
first(:css, 'button.btn', text: 'Process tasks').click
expect(page).to have_content('Selected tasks: 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, and 520')
end
it 'allows to select rows with the select all button and deselect them with the deselect button' do
find(:css, '.clickable.select-all').click
first(:css, 'button.btn', text: 'Process tasks').click
expect(page).to have_content('Selected tasks: 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, and 526')
find(:css, '.clickable.deselect-all').click
first(:css, 'button.btn', text: 'Process tasks').click
expect(page).to have_no_content('Selected tasks: 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, and 526')
end
it 'allows to filter by ID inside a form, two limits' do
fill_in('g_f_id_fr', with: 507)
fill_in('g_f_id_to', with: 509)
first(:css, 'button.btn', text: 'Process tasks').click
within '.pagination_status' do
expect(page).to have_content('1-3 / 3')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('507')
end
expect(page).to have_content('508')
expect(page).to have_content('509')
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'ID'
end
within '.pagination_status' do
expect(page).to have_content('1-3 / 3')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.sorted.active-filter' do
expect(page).to have_content('509')
end
expect(page).to have_content('508')
expect(page).to have_content('509')
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'ID'
end
within '.pagination_status' do
expect(page).to have_content('1-3 / 3')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.sorted' do
expect(page).to have_content('507')
end
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'Title'
end
within '.pagination_status' do
expect(page).to have_content('1-3 / 3')
end
end
it 'allows to filter by Archived inside a form' do
select 'yes', from: 'g_f_archived'
first(:css, 'button.btn', text: 'Process tasks').click
within '.pagination_status' do
expect(page).to have_content('1-4 / 4')
end
within first(:css, 'td.active-filter') do
expect(page).to have_content('Yes')
end
select 'no', from: 'g_f_archived'
first(:css, 'button.btn', text: 'Process tasks').click
within '.pagination_status' do
expect(page).to have_content('1-20 / 46')
end
within first(:css, 'td.active-filter') do
expect(page).to have_content('No')
end
within 'ul.grid.pagination' do
click_link '2'
end
within '.pagination_status' do
expect(page).to have_content('21-40 / 46')
end
within first(:css, 'td.active-filter') do
expect(page).to have_content('No')
end
end
it 'allows to filter by Added inside a form' do
set_datepicker(self, 'g_f_created_at_fr_date_placeholder', 2021, 5, 1)
set_datepicker(self, 'g_f_created_at_to_date_placeholder', 2021, 9, 1)
first(:css, 'button.btn', text: 'Process tasks').click
within '.pagination_status' do
expect(page).to have_content('1-20 / 29')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('2021-09-13 22:11:12')
end
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'ID'
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('2021-09-29 22:11:12')
end
within '.pagination_status' do
expect(page).to have_content('1-20 / 29')
end
within 'ul.grid.pagination' do
click_link '2'
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
# page.should have_content('2021-08-14 22:11:12')
expect(page).to have_content('2021-09-22 22:11:12')
end
end
it 'allows to filter by Due Date' do
set_datepicker(self, 'g_f_due_date_fr_date_placeholder', 2022, 0, 1)
set_datepicker(self, 'g_f_due_date_to_date_placeholder', 2023, 0, 1)
first(:css, 'button.btn', text: 'Process tasks').click
within '.pagination_status' do
expect(page).to have_content('1-20 / 35')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('2022-07-29')
end
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'ID'
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('2022-10-02')
end
within '.pagination_status' do
expect(page).to have_content('1-20 / 35')
end
within 'ul.grid.pagination' do
click_link '2'
end
within '.pagination_status' do
expect(page).to have_content('21-35 / 35')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('2022-07-02')
end
set_datepicker(self, 'g_f_due_date_fr_date_placeholder', 2022, 6, 28)
set_datepicker(self, 'g_f_due_date_to_date_placeholder', 2022, 6, 31)
first(:css, 'button.btn', text: 'Process tasks').click
within '.pagination_status' do
expect(page).to have_content('1-1 / 1')
end
find(:css, '#g_f_due_date_fr_date_view').click
first(:css, 'button.btn', text: 'Process tasks').click
within '.pagination_status' do
expect(page).to have_content('1-10 / 10')
end
find(:css, '#g_f_due_date_to_date_view').click
first(:css, 'button.btn', text: 'Process tasks').click
within '.pagination_status' do
expect(page).to have_content('1-20 / 50')
end
end
it 'allows to negate the semantics of the text filter inside a form' do
fill_in('g_f_title_v', with: 'sed')
select 'no', from: 'g_f_archived'
first(:css, 'button.btn', text: 'Process tasks').click
expect(page).to have_content('sed impedit iste')
find(:css, '#g_f_title_n').click
first(:css, 'button.btn', text: 'Process tasks').click
expect(page).to have_no_content('sed impedit iste')
end
it 'allows to reload the title filter' do
fill_in('g_f_title_v', with: 'ed')
first(:css, 'button.btn', text: 'Process tasks').click
within '.pagination_status' do
expect(page).to have_content('1-2 / 2')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('sed impedit iste')
end
expect(page).to have_content('corporis expedita vel')
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'Title'
end
within '.pagination_status' do
expect(page).to have_content('1-2 / 2')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('corporis expedita vel')
end
expect(page).to have_content('sed impedit iste')
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'ID'
end
within '.pagination_status' do
expect(page).to have_content('1-2 / 2')
end
expect(page).to have_content('corporis expedita vel')
expect(page).to have_content('sed impedit iste')
end
end
================================================
FILE: spec/features/adding_rows_request_spec.rb
================================================
# encoding: utf-8
require 'acceptance_helper'
describe 'On the page /adding_rows WiceGrid', type: :request, js: true do
before :each do
visit '/adding_rows'
end
it 'allows to filter the rows with the help of a custom filter renered as ' do
select 'Urgent', from: 'grid_f_priority_id'
find(:css, '#grid_submit_grid_icon').click
['inventore architecto aut', 'veniam tempora', 'doloremque', 'qui animi', 'dolor et corporis'].each do |title|
expect(page).to have_content(title)
expect(page).to have_content("Panic! \"#{title}\"")
end
expect(page).to have_content("Don't panic")
end
end
================================================
FILE: spec/features/all_records_request_spec.rb
================================================
# encoding: utf-8
require 'acceptance_helper'
describe 'On the page /all_records WiceGrid', type: :request, js: true do
before :each do
visit '/all_records'
end
it 'does not allow to show all records' do
within 'div.wice-grid-container table.wice-grid tbody' do
expect(page).to have_no_content('show all')
end
end
it 'shows the the range of the records on the current page together with the total number of records' do
within '.pagination_status' do
expect(page).to have_content('1-20 / 50')
end
end
end
================================================
FILE: spec/features/auto_reloads2_request_spec.rb
================================================
# encoding: utf-8
require 'acceptance_helper'
describe 'On the page /auto_reloads2 with detached filters WiceGrid', type: :feature, js: true do
before :each do
visit '/auto_reloads2'
end
it 'allows to filter immediately by changing Assigned custom filter' do
select 'Assigned', from: 'grid_f_status_id'
within '#grid .pagination_status' do
expect(page).to have_content('1-4 / 4')
end
end
it 'allows to filter immediately by changing Project custom filter' do
select 'Divine Firmware', from: 'grid_f_project_id'
within '#grid .pagination_status' do
expect(page).to have_content('1-15 / 15')
end
end
it 'allows to filter immediately by changing "Added" custom filter' do
set_datepicker(self, 'grid_f_created_at_fr_date_placeholder', 2021, 5, 1)
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('2021-09-13 22:11:12')
end
set_datepicker(self, 'grid_f_created_at_to_date_placeholder', 2021, 9, 1)
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('2021-09-13 22:11:12')
end
within '.pagination_status' do
expect(page).to have_content('1-20 / 29')
end
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'ID'
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('2021-09-29 22:11:12')
end
within '.pagination_status' do
expect(page).to have_content('1-20 / 29')
end
within 'ul.grid.pagination' do
click_link '2'
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('2021-09-22 22:11:12')
end
find(:css, '.wg-external-reset-button').click
within '.pagination_status' do
expect(page).to have_content('1-20 / 50')
end
end
it 'allows to filter immediately by changing "Archived" custom filter' do
select 'yes', from: 'grid_f_archived'
# find(:css, '#grid_submit_grid_icon').click
within '.pagination_status' do
expect(page).to have_content('1-4 / 4')
end
within first(:css, 'td.active-filter') do
expect(page).to have_content('Yes')
end
select 'no', from: 'grid_f_archived'
# find(:css, '#grid_submit_grid_icon').click
within '.pagination_status' do
expect(page).to have_content('1-20 / 46')
end
within first(:css, 'td.active-filter') do
expect(page).to have_content('No')
end
within 'ul.grid.pagination' do
click_link '2'
end
within '.pagination_status' do
expect(page).to have_content('21-40 / 46')
end
within first(:css, 'td.active-filter') do
expect(page).to have_content('No')
end
find(:css, '.wg-external-reset-button').click
within '.pagination_status' do
expect(page).to have_content('1-20 / 50')
end
end
it 'allows to filter immediately by changing the fields for ID two limits' do
fill_in('grid_f_id_fr', with: 507)
fill_in('grid_f_id_to', with: 509)
# find(:css, '#grid_submit_grid_icon').click
within '.pagination_status' do
expect(page).to have_content('1-3 / 3')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('507')
end
expect(page).to have_content('508')
expect(page).to have_content('509')
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'ID'
end
within '.pagination_status' do
expect(page).to have_content('1-3 / 3')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.sorted.active-filter' do
expect(page).to have_content('509')
end
expect(page).to have_content('507')
expect(page).to have_content('508')
expect(page).to have_content('509')
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'ID'
end
within '.pagination_status' do
expect(page).to have_content('1-3 / 3')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.sorted' do
expect(page).to have_content('507')
end
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'Title'
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.sorted' do
expect(page).to have_content('ab')
end
within '.pagination_status' do
expect(page).to have_content('1-3 / 3')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.sorted' do
expect(page).to have_content('ab')
end
expect(page).to have_content('507')
expect(page).to have_content('508')
expect(page).to have_content('509')
find(:css, '.wg-external-reset-button').click
within '.pagination_status' do
expect(page).to have_content('1-20 / 50')
end
end
it 'allows to filter immediately by changing the field for ID one limit' do
fill_in('grid_f_id_fr', with: 550)
# find(:css, '#grid_submit_grid_icon').click
within '.pagination_status' do
expect(page).to have_content('1-7 / 7')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('550')
end
551.upto(556) do |i|
expect(page).to have_content(i)
end
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'ID'
end
within '.pagination_status' do
expect(page).to have_content('1-7 / 7')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.sorted.active-filter' do
expect(page).to have_content('556')
end
551.upto(556) do |i|
expect(page).to have_content(i)
end
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'ID'
end
within '.pagination_status' do
expect(page).to have_content('1-7 / 7')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.sorted' do
expect(page).to have_content('550')
end
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'Title'
end
within '.pagination_status' do
expect(page).to have_content('1-7 / 7')
end
550.upto(556) do |i|
expect(page).to have_content(i)
end
find(:css, '.wg-external-reset-button').click
within '.pagination_status' do
expect(page).to have_content('1-20 / 50')
end
end
it 'allows to filter immediately by changing the field for Due Date' do
set_datepicker(self, 'grid_f_due_date_fr_date_placeholder', 2022, 0, 1)
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('2023-01-26')
end
set_datepicker(self, 'grid_f_due_date_to_date_placeholder', 2023, 0, 1)
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('2022-07-29')
end
within '.pagination_status' do
expect(page).to have_content('1-20 / 35')
end
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'ID'
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('2022-10-02')
end
within '.pagination_status' do
expect(page).to have_content('1-20 / 35')
end
within 'ul.grid.pagination' do
click_link '2'
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('2022-07-02')
end
set_datepicker(self, 'grid_f_due_date_fr_date_placeholder', 2022, 6, 28)
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('2022-10-02')
end
set_datepicker(self, 'grid_f_due_date_to_date_placeholder', 2022, 6, 31)
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('2022-07-29')
end
within '.pagination_status' do
expect(page).to have_content('1-1 / 1')
end
find(:css, '#grid_f_due_date_fr_date_view').click
within '.pagination_status' do
expect(page).to have_content('1-10 / 10')
end
find(:css, '#grid_f_due_date_to_date_view').click
within '.pagination_status' do
expect(page).to have_content('1-20 / 50')
end
end
it 'allows to negate filter by clickin the checkbox for "Title" filter' do
expect(page).to have_content('sequi')
expect(page).to have_content('sed impedit iste')
fill_in('grid_f_title_v', with: 'sed')
select 'no', from: 'grid_f_archived'
expect(page).to have_no_content('sequi')
expect(page).to have_content('sed impedit iste')
find(:css, '#grid_f_title_n').click
expect(page).to have_content('sequi')
expect(page).to have_no_content('sed impedit iste')
end
it 'allows to reload the title filter' do
fill_in('grid_f_title_v', with: 'ed')
within '.pagination_status' do
expect(page).to have_content('1-2 / 2')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('sed impedit iste')
end
expect(page).to have_content('corporis expedita vel')
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'Title'
end
within '.pagination_status' do
expect(page).to have_content('1-2 / 2')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('corporis expedita vel')
end
expect(page).to have_content('sed impedit iste')
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'ID'
end
within '.pagination_status' do
expect(page).to have_content('1-2 / 2')
end
expect(page).to have_content('corporis expedita vel')
expect(page).to have_content('sed impedit iste')
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('sed impedit iste')
end
find(:css, '.wg-external-reset-button').click
within '.pagination_status' do
expect(page).to have_content('1-20 / 50')
end
end
end
================================================
FILE: spec/features/auto_reloads3_request_spec.rb
================================================
# encoding: utf-8
require 'acceptance_helper'
describe 'On the page /auto_reloads3 with two tables and detached filters WiceGrid', type: :feature, js: true do
before :each do
visit '/auto_reloads3'
end
it 'allows to filter grid1 and grid 2 by changing Assigned custom filter independently' do
select 'yes', :from => 'grid_f_archived'
within 'div#grid.wice-grid-container .pagination_status' do
expect(page).to have_content('1-4 / 4')
end
within 'div#grid2.wice-grid-container .pagination_status' do
expect(page).to have_content('1-20 / 50')
end
select 'no', :from => 'grid2_f_archived'
within 'div#grid.wice-grid-container .pagination_status' do
expect(page).to have_content('1-4 / 4')
end
within 'div#grid2.wice-grid-container .pagination_status' do
expect(page).to have_content('1-20 / 46')
end
end
it 'allows to filter grid1 and grid 2 by changing Status custom filter independently' do
select 'Assigned', :from => 'grid_f_status_id'
within 'div#grid.wice-grid-container .pagination_status' do
expect(page).to have_content('1-4 / 4')
end
within 'div#grid2.wice-grid-container .pagination_status' do
expect(page).to have_content('1-20 / 50')
end
select 'Cancelled', :from => 'grid2_f_status_id'
within 'div#grid.wice-grid-container .pagination_status' do
expect(page).to have_content('1-4 / 4')
end
within 'div#grid2.wice-grid-container .pagination_status' do
expect(page).to have_content('1-8 / 8')
end
end
it 'allows to filter grid1 and grid 2 by changing Title custom filter independently' do
fill_in('grid_f_title_v', :with => 'sed')
within 'div#grid.wice-grid-container .pagination_status' do
expect(page).to have_content('1-1 / 1')
end
fill_in('grid2_f_title_v', :with => 'a')
within 'div#grid.wice-grid-container .pagination_status' do
expect(page).to have_content('1-1 / 1')
end
within 'div#grid2.wice-grid-container .pagination_status' do
expect(page).to have_content('1-20 / 31')
end
end
it 'allows to filter grid1 and grid 2 by changing Date custom filter independently' do
set_datepicker(self, 'grid_f_due_date_fr_date_placeholder', 2022, 0, 1)
within 'div#grid.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('2023-01-26')
end
set_datepicker(self, 'grid_f_due_date_to_date_placeholder', 2023, 0, 1)
within 'div#grid.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('2022-07-29')
end
within 'div#grid.wice-grid-container .pagination_status' do
expect(page).to have_content('1-20 / 35')
end
within 'div#grid2.wice-grid-container .pagination_status' do
expect(page).to have_content('1-20 / 50')
end
set_datepicker(self, 'grid2_f_due_date_fr_date_placeholder', 2022, 0, 1)
within 'div#grid2.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('2023-01-26')
end
set_datepicker(self, 'grid2_f_due_date_to_date_placeholder', 2023, 0, 1)
within 'div#grid2.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('2022-07-29')
end
within 'div#grid.wice-grid-container .pagination_status' do
expect(page).to have_content('1-20 / 35')
end
within 'div#grid2.wice-grid-container .pagination_status' do
expect(page).to have_content('1-20 / 35')
end
find(:css, '.grid1 .wg-external-reset-button').click
within 'div#grid.wice-grid-container .pagination_status' do
expect(page).to have_content('1-20 / 50')
end
within 'div#grid2.wice-grid-container .pagination_status' do
expect(page).to have_content('1-20 / 35')
end
find(:css, '.grid2 .wg-external-reset-button').click
within 'div#grid.wice-grid-container .pagination_status' do
expect(page).to have_content('1-20 / 50')
end
within 'div#grid2.wice-grid-container .pagination_status' do
expect(page).to have_content('1-20 / 50')
end
end
end
================================================
FILE: spec/features/auto_reloads_request_spec.rb
================================================
# encoding: utf-8
require 'acceptance_helper'
describe 'On the page /auto_reloads WiceGrid', type: :feature, js: true do
before :each do
visit '/auto_reloads'
end
it 'allows to filter immediately by changing Assigned custom filter' do
select 'Assigned', from: 'grid_f_status_id'
within '#grid .pagination_status' do
expect(page).to have_content('1-4 / 4')
end
end
it 'allows to filter immediately by changing "Project Name" custom filter' do
select 'Divine Firmware', from: 'grid_f_project_id'
within '#grid .pagination_status' do
expect(page).to have_content('1-15 / 15')
end
end
it 'allows to filter immediately by changing "Added" custom filter' do
set_datepicker(self, 'grid_f_created_at_fr_date_placeholder', 2021, 5, 1)
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('2021-09-13 22:11:12')
end
set_datepicker(self, 'grid_f_created_at_to_date_placeholder', 2021, 9, 1)
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('2021-09-13 22:11:12')
end
within '.pagination_status' do
expect(page).to have_content('1-20 / 29')
end
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'ID'
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('2021-09-29 22:11:12')
end
within '.pagination_status' do
expect(page).to have_content('1-20 / 29')
end
within 'ul.grid.pagination' do
click_link '2'
end
# WTF
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('2021-09-22 22:11:12')
end
find(:css, '#grid_reset_grid_icon').click
within '.pagination_status' do
expect(page).to have_content('1-20 / 50')
end
end
it 'allows to filter immediately by changing "Archived" custom filter' do
select 'yes', from: 'grid_f_archived'
# find(:css, '#grid_submit_grid_icon').click
within '.pagination_status' do
expect(page).to have_content('1-4 / 4')
end
within first(:css, 'td.active-filter') do
expect(page).to have_content('Yes')
end
select 'no', from: 'grid_f_archived'
# find(:css, '#grid_submit_grid_icon').click
within '.pagination_status' do
expect(page).to have_content('1-20 / 46')
end
within first(:css, 'td.active-filter') do
expect(page).to have_content('No')
end
within 'ul.grid.pagination' do
click_link '2'
end
within '.pagination_status' do
expect(page).to have_content('21-40 / 46')
end
within first(:css, 'td.active-filter') do
expect(page).to have_content('No')
end
find(:css, '#grid_reset_grid_icon').click
within '.pagination_status' do
expect(page).to have_content('1-20 / 50')
end
end
it 'allows to filter immediately by changing the fields for ID two limits' do
fill_in('grid_f_id_fr', with: 507)
fill_in('grid_f_id_to', with: 509)
within '.pagination_status' do
expect(page).to have_content('1-3 / 3')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('507')
end
expect(page).to have_content('508')
expect(page).to have_content('509')
# ID !!!!
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'ID'
end
within '.pagination_status' do
expect(page).to have_content('1-3 / 3')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.sorted.active-filter' do
expect(page).to have_content('509')
end
expect(page).to have_content('508')
expect(page).to have_content('509')
# ID !!!!
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'ID'
end
within '.pagination_status' do
expect(page).to have_content('1-3 / 3')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.sorted' do
expect(page).to have_content('507')
end
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'Title'
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.sorted' do
expect(page).to have_content('ab')
end
within '.pagination_status' do
expect(page).to have_content('1-3 / 3')
end
expect(page).to have_content('507')
expect(page).to have_content('508')
expect(page).to have_content('509')
find(:css, '#grid_reset_grid_icon').click
within '.pagination_status' do
expect(page).to have_content('1-20 / 50')
end
end
it 'allows to filter immediately by changing the field for ID one limit' do
fill_in('grid_f_id_fr', with: 550)
within '.pagination_status' do
expect(page).to have_content('1-7 / 7')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('550')
end
551.upto(556) do |i|
expect(page).to have_content(i)
end
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'ID'
end
within '.pagination_status' do
expect(page).to have_content('1-7 / 7')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.sorted.active-filter' do
expect(page).to have_content('556')
end
551.upto(556) do |i|
expect(page).to have_content(i)
end
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'ID'
end
within '.pagination_status' do
expect(page).to have_content('1-7 / 7')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.sorted' do
expect(page).to have_content('550')
end
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'Title'
end
within '.pagination_status' do
expect(page).to have_content('1-7 / 7')
end
550.upto(556) do |i|
expect(page).to have_content(i)
end
find(:css, '#grid_reset_grid_icon').click
within '.pagination_status' do
expect(page).to have_content('1-20 / 50')
end
end
it 'allows to filter immediately by changing the field for Due Date' do
set_datepicker(self, 'grid_f_due_date_fr_date_placeholder', 2022, 0, 1)
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('2023-01-26')
end
set_datepicker(self, 'grid_f_due_date_to_date_placeholder', 2023, 0, 1)
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('2022-07-29')
end
within '.pagination_status' do
expect(page).to have_content('1-20 / 35')
end
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'ID'
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('2022-10-02')
end
within '.pagination_status' do
expect(page).to have_content('1-20 / 35')
end
within 'ul.grid.pagination' do
click_link '2'
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('2022-07-02')
end
set_datepicker(self, 'grid_f_due_date_fr_date_placeholder', 2022, 6, 28)
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('2022-10-02')
end
set_datepicker(self, 'grid_f_due_date_to_date_placeholder', 2022, 6, 31)
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('2022-07-29')
end
within '.pagination_status' do
expect(page).to have_content('1-1 / 1')
end
find(:css, '#grid_f_due_date_fr_date_view').click
within '.pagination_status' do
expect(page).to have_content('1-10 / 10')
end
find(:css, '#grid_f_due_date_to_date_view').click
within '.pagination_status' do
expect(page).to have_content('1-20 / 50')
end
end
it 'allows to negate filter by clickin the checkbox for "Title" filter' do
fill_in('grid_f_title_v', with: 'sed')
expect(page).to have_content('sed impedit iste')
expect(page).to have_no_content('sequi')
select 'no', from: 'grid_f_archived'
# Does not change the visible rows, just highlights the archived column
expect(page).to have_selector('.wice-grid tbody tr td:nth-child(3).active-filter')
expect(page).to have_content('sed impedit iste')
expect(page).to have_no_content('sequi')
find(:css, '#grid_f_title_n').click
expect(page).to have_no_content('sed impedit iste')
expect(page).to have_content('sequi')
end
it 'allows to sort by columns' do
fill_in('grid_f_title_v', with: 'ed')
within '.pagination_status' do
expect(page).to have_content('1-2 / 2')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('sed impedit iste')
end
expect(page).to have_content('corporis expedita vel')
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'Title'
end
within '.pagination_status' do
expect(page).to have_content('1-2 / 2')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('corporis expedita vel')
end
expect(page).to have_content('sed impedit iste')
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'ID'
end
within '.pagination_status' do
expect(page).to have_content('1-2 / 2')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('sed impedit iste')
end
expect(page).to have_content('corporis expedita vel')
find(:css, '#grid_reset_grid_icon').click
within '.pagination_status' do
expect(page).to have_content('1-20 / 50')
end
end
end
================================================
FILE: spec/features/basics1_request_spec.rb
================================================
# encoding: utf-8
require 'acceptance_helper'
describe 'On the page /basics1 the most simple WiceGrid', js: true do
before :each do
visit '/basics1'
end
include_examples 'basic task table specs'
include_examples 'show all and back'
end
================================================
FILE: spec/features/basics2_request_spec.rb
================================================
# encoding: utf-8
require 'acceptance_helper'
describe 'On the page /basics2 with the parameter :name WiceGrid', js: true do
before :each do
visit '/basics2'
end
include_examples 'names of columns'
end
================================================
FILE: spec/features/basics3_request_spec.rb
================================================
# encoding: utf-8
require 'acceptance_helper'
describe 'On the page /basics3 with :attrubute parameter WiceGrid', js: true do
before :each do
visit '/basics3'
end
include_examples 'sorting ID'
include_examples 'sorting Title'
include_examples 'sorting Description'
include_examples 'sorting Archived'
include_examples 'sorting Due Date'
include_examples 'sorting ID in all records mode'
include_examples 'sorting Title in all records mode'
include_examples 'sorting Description in all records mode'
include_examples 'sorting Archived in all records mode'
include_examples 'sorting Due Date in all records mode'
include_examples 'Archived filtering'
include_examples 'Title filtering'
include_examples 'Due Date datepicker filtering'
include_examples 'Description filtering'
include_examples 'ID filtering'
include_examples 'Description and Title filtering'
end
================================================
FILE: spec/features/basics4_request_spec.rb
================================================
# encoding: utf-8
require 'acceptance_helper'
describe 'On the page /basics4 with filter: false WiceGrid', js: true do
before :each do
visit '/basics4'
end
it 'does not render filters' do
expect(page).to have_no_selector('#grid_f_id_fr')
expect(page).to have_no_selector('#grid_f_id_to')
expect(page).to have_no_selector('#grid_f_description')
expect(page).to have_no_selector('#grid_f_created_at_fr_year')
expect(page).to have_no_selector('#grid_f_created_at_fr_month')
expect(page).to have_no_selector('#grid_f_created_at_to_year')
expect(page).to have_no_selector('#grid_f_created_at_to_month')
end
end
================================================
FILE: spec/features/basics5_request_spec.rb
================================================
# encoding: utf-8
require 'acceptance_helper'
describe 'On the page /basics5 with allow_ordering: false WiceGrid', js: true do
before :each do
visit '/basics5'
end
it 'does not allow to order columns' do
expect { click_link 'Description' }.to raise_error(Capybara::ElementNotFound)
expect { click_link 'Archived' }.to raise_error(Capybara::ElementNotFound)
end
end
================================================
FILE: spec/features/basics6_request_spec.rb
================================================
# encoding: utf-8
require 'acceptance_helper'
describe 'On the page /basics6 with the parameters :order and :order_direction in initialize_grid WiceGrid', js: true do
before :each do
visit '/basics6'
end
it 'initailly sorded the rows sorted by Title' do
within 'div.wice-grid-container table.wice-grid thead th.sorted a.desc' do
expect(page).to have_content('Title')
end
end
it 'the table does not have records with Archived==no' do
click_on 'show all'
within 'div.wice-grid-container table.wice-grid tbody' do
expect(page).to have_no_content('Yes')
end
end
end
================================================
FILE: spec/features/blockless_column_definition_spec.rb
================================================
# encoding: utf-8
require 'acceptance_helper'
describe 'On the page /blockless_column_definition it is possible to render without block and WiceGrid', type: :request, js: true do
before :each do
visit '/blockless_column_definition'
end
include_examples 'sorting ID'
include_examples 'sorting Title'
include_examples 'sorting Description'
include_examples 'sorting Archived'
include_examples 'sorting Due Date'
include_examples 'sorting ID in all records mode'
include_examples 'sorting Title in all records mode'
include_examples 'sorting Description in all records mode'
include_examples 'sorting Archived in all records mode'
include_examples 'sorting Due Date in all records mode'
include_examples 'Archived filtering'
include_examples 'Title filtering'
include_examples 'Due Date datepicker filtering'
include_examples 'Description filtering'
include_examples 'ID filtering'
include_examples 'Description and Title filtering'
end
================================================
FILE: spec/features/buttons_request_spec.rb
================================================
# encoding: utf-8
require 'acceptance_helper'
describe 'On the page /buttons with external buttons for Submit and Reset filters WiceGrid', type: :request, js: true do
before :each do
visit '/buttons'
end
it 'allows to filter by Archived' do
select 'yes', from: 'grid_f_archived'
click_button('Submit')
within '.pagination_status' do
expect(page).to have_content('1-4 / 4')
end
within first(:css, 'td.active-filter') do
expect(page).to have_content('Yes')
end
select 'no', from: 'grid_f_archived'
click_button('Submit')
within '.pagination_status' do
expect(page).to have_content('1-20 / 46')
end
within first(:css, 'td.active-filter') do
expect(page).to have_content('No')
end
within 'ul.grid.pagination' do
click_link '2'
end
within '.pagination_status' do
expect(page).to have_content('21-40 / 46')
end
within first(:css, 'td.active-filter') do
expect(page).to have_content('No')
end
click_button('Reset')
within '.pagination_status' do
expect(page).to have_content('1-20 / 50')
end
end
it 'allows to filter by Ttile' do
fill_in('grid_f_title', with: 'ed')
click_button('Submit')
within '.pagination_status' do
expect(page).to have_content('1-2 / 2')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('sed impedit iste')
end
expect(page).to have_content('corporis expedita vel')
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'Title'
end
within '.pagination_status' do
expect(page).to have_content('1-2 / 2')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('corporis expedita vel')
end
expect(page).to have_content('sed impedit iste')
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'ID'
end
within '.pagination_status' do
expect(page).to have_content('1-2 / 2')
end
expect(page).to have_content('corporis expedita vel')
expect(page).to have_content('sed impedit iste')
click_button('Reset')
within '.pagination_status' do
expect(page).to have_content('1-20 / 50')
end
end
it 'allows to filter by Description' do
fill_in('grid_f_description', with: 've')
click_button('Submit')
within '.pagination_status' do
expect(page).to have_content('1-12 / 12')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('Velit atque sapiente aspernatur sint fuga.')
end
expect(page).to have_content('Vero sit voluptate sed tempora et provident sequi nihil.')
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'Description'
end
within '.pagination_status' do
expect(page).to have_content('1-12 / 12')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('Ad sunt vel maxime labore temporibus incidunt quidem.')
end
expect(page).to have_content('Adipisci voluptate sed esse velit.')
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'ID'
end
within '.pagination_status' do
expect(page).to have_content('1-12 / 12')
end
expect(page).to have_content('Adipisci voluptate sed esse velit.')
expect(page).to have_content('Ad sunt vel maxime labore temporibus incidunt quidem.')
click_button('Reset')
within '.pagination_status' do
expect(page).to have_content('1-20 / 50')
end
end
it 'allows to filter by multiple columns' do
fill_in('grid_f_description', with: 'v')
fill_in('grid_f_title', with: 's')
select 'no', from: 'grid_f_archived'
click_button('Submit')
within '.pagination_status' do
expect(page).to have_content('1-11 / 11')
end
expect(page).to have_content('Inventore iure eos labore ipsum.')
expect(page).to have_content('Velit atque sapiente aspernatur sint fuga.')
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'Description'
end
within '.pagination_status' do
expect(page).to have_content('1-11 / 11')
end
expect(page).to have_content('Inventore iure eos labore ipsum.')
expect(page).to have_content('Velit atque sapiente aspernatur sint fuga.')
click_button('Reset')
within '.pagination_status' do
expect(page).to have_content('1-20 / 50')
end
end
end
================================================
FILE: spec/features/csv_and_detached_filters_spec.rb
================================================
# encoding: utf-8
require 'acceptance_helper'
describe 'On the page /csv_and_detached_filters with external buttons and the button "Export to CSV" WiceGrid', type: :request, js: true do
before :each do
visit '/csv_and_detached_filters'
end
include_examples 'detached_filters'
end
================================================
FILE: spec/features/csv_export_request_spec.rb
================================================
# encoding: utf-8
require 'acceptance_helper'
describe 'On the page /csv_export with enabled CSV export WiceGrid', type: :request, js: true do
before :each do
visit '/csv_export'
end
it 'allows to export csv' do
skip "This test should be run with BROWSER=y in environment" unless ENV['BROWSER']
button = find(:css, 'button.wg-external-csv-export-button')
button.click
expect(DownloadHelpers::download_content)
.to start_with('ID;Title;Priority;Status;Project Name;')
end
end
================================================
FILE: spec/features/custom_filter_params_request_spec.rb
================================================
# encoding: utf-8
require 'acceptance_helper'
describe 'On the page /custom_filter_params with helper :wice_grid_custom_filter_params WiceGrid', type: :request, js: true do
before :each do
visit '/custom_filter_params'
end
it 'renders a grid with the project custom filter activated to Ultimate Website' do
click_on 'Ultimate Website'
within '.pagination_status' do
expect(page).to have_content('1-18 / 18')
end
end
it 'renders a grid with the project custom filter activated to Super Game' do
click_on 'Super Game'
within '.pagination_status' do
expect(page).to have_content('1-17 / 17')
end
end
it 'renders a grid with the project custom filter activated to Divine Firmware' do
click_on 'Divine Firmware'
within '.pagination_status' do
expect(page).to have_content('1-15 / 15')
end
end
end
================================================
FILE: spec/features/custom_filters1_request_spec.rb
================================================
# encoding: utf-8
require 'acceptance_helper'
describe 'On the page /custom_filters1 with one table and custom filters WiceGrid', type: :feature, js: true do
before :each do
visit '/custom_filters1'
end
it 'shows all options' do
expect(page).to have_select('g1_f_status', options: %w(-- Development Testing Production))
expect(page).to have_select('g2_f_status', options: %w(-- Development Testing Production))
expect(page).to have_select('g3_f_status', options: %w(-- development testing production))
expect(page).to have_select('g4_f_status', options: %w(-- development testing production))
end
it 'allows to expand/collapse' do
find(:css, '#g1 .expand-multi-select-icon').click
find(:css, '#g1 .collapse-multi-select-icon').click
find(:css, '#g1 .expand-multi-select-icon').click
find(:css, '#g2 .expand-multi-select-icon').click
find(:css, '#g2 .collapse-multi-select-icon').click
find(:css, '#g2 .expand-multi-select-icon').click
find(:css, '#g3 .expand-multi-select-icon').click
find(:css, '#g3 .collapse-multi-select-icon').click
find(:css, '#g3 .expand-multi-select-icon').click
find(:css, '#g4 .expand-multi-select-icon').click
find(:css, '#g4 .collapse-multi-select-icon').click
find(:css, '#g4 .expand-multi-select-icon').click
end
it 'allows to filter by custom filter' do
select 'Development', from: 'g1_f_status'
find(:css, '#g1_submit_grid_icon').click
expect(page).to have_selector('#g1 .pagination_status', text: '1-3 / 3')
select 'Development', from: 'g2_f_status'
find(:css, '#g2_submit_grid_icon').click
expect(page).to have_selector('#g1 .pagination_status', text: '1-3 / 3')
expect(page).to have_selector('#g2 .pagination_status', text: '1-3 / 3')
select 'development', from: 'g3_f_status'
find(:css, '#g3_submit_grid_icon').click
expect(page).to have_selector('#g1 .pagination_status', text: '1-3 / 3')
expect(page).to have_selector('#g2 .pagination_status', text: '1-3 / 3')
expect(page).to have_selector('#g3 .pagination_status', text: '1-3 / 3')
select 'development', from: 'g4_f_status'
find(:css, '#g4_submit_grid_icon').click
expect(page).to have_selector('#g1 .pagination_status', text: '1-3 / 3')
expect(page).to have_selector('#g2 .pagination_status', text: '1-3 / 3')
expect(page).to have_selector('#g3 .pagination_status', text: '1-3 / 3')
expect(page).to have_selector('#g4 .pagination_status', text: '1-3 / 3')
end
it 'allows to filter by custom filter with multiselect' do
find(:css, '#g1 .expand-multi-select-icon').click
select('Testing', from: 'g1_f_status')
select('Production', from: 'g1_f_status')
find(:css, '#g1_submit_grid_icon').click
within '#g1 .pagination_status' do
expect(page).to have_content('1-5 / 8')
end
###
find(:css, '#g2 .expand-multi-select-icon').click
select('Testing', from: 'g2_f_status')
select('Production', from: 'g2_f_status')
find(:css, '#g2_submit_grid_icon').click
within '#g2 .pagination_status' do
expect(page).to have_content('1-5 / 8')
end
###
find(:css, '#g3 .expand-multi-select-icon').click
select('testing', from: 'g3_f_status')
select('production', from: 'g3_f_status')
find(:css, '#g3_submit_grid_icon').click
within '#g3 .pagination_status' do
expect(page).to have_content('1-5 / 8')
end
###
find(:css, '#g4 .expand-multi-select-icon').click
select('testing', from: 'g4_f_status')
select('production', from: 'g4_f_status')
find(:css, '#g4_submit_grid_icon').click
within '#g4 .pagination_status' do
expect(page).to have_content('1-5 / 8')
end
##
find(:css, '#g1 .collapse-multi-select-icon').click
select 'Testing', from: 'g1_f_status'
find(:css, '#g1_submit_grid_icon').click
within '#g1 .pagination_status' do
expect(page).to have_content('1-3 / 3')
end
find(:css, '#g2 .collapse-multi-select-icon').click
select 'Testing', from: 'g2_f_status'
find(:css, '#g2_submit_grid_icon').click
within '#g2 .pagination_status' do
expect(page).to have_content('1-3 / 3')
end
find(:css, '#g3 .collapse-multi-select-icon').click
select 'testing', from: 'g3_f_status'
find(:css, '#g3_submit_grid_icon').click
within '#g3 .pagination_status' do
expect(page).to have_content('1-3 / 3')
end
find(:css, '#g4 .collapse-multi-select-icon').click
select 'testing', from: 'g4_f_status'
find(:css, '#g4_submit_grid_icon').click
within '#g4 .pagination_status' do
expect(page).to have_content('1-3 / 3')
end
end
end
================================================
FILE: spec/features/custom_filters2_request_spec.rb
================================================
# encoding: utf-8
require 'acceptance_helper'
describe 'On the page /custom_filters2 with joined tables and custom filters WiceGrid', type: :feature, js: true do
before :each do
visit '/custom_filters2'
end
it 'shows all options' do
expect(page).to have_select('grid_f_priorities_name', options: %w(-- Anecdotic High Low Normal Urgent))
expect(page).to have_select('grid_f_status_id', options: %w(-- Assigned Cancelled Closed Duplicate New Postponed Resolved Started Verified))
expect(page).to have_select('grid_f_project_id', options: ['--', 'Divine Firmware', 'Super Game', 'Ultimate Website'])
end
it 'allows to filter by custom filters' do
first(:css, '.expand-multi-select-icon').click
select('Normal', from: 'grid_f_priorities_name')
select('Urgent', from: 'grid_f_priorities_name')
select 'Duplicate', from: 'grid_f_status_id'
select 'Ultimate Website', from: 'grid_f_project_id'
find(:css, '#grid_submit_grid_icon').click
within '.pagination_status' do
expect(page).to have_content('1-2 / 2')
end
end
end
================================================
FILE: spec/features/custom_filters3_request_spec.rb
================================================
# encoding: utf-8
require 'acceptance_helper'
describe 'On the page /custom_filters3 with method chains and custom filters WiceGrid', type: :feature, js: true do
before :each do
visit '/custom_filters3'
end
it 'shows all options' do
expect(page).to have_select('grid_f_expected_version_id', options: %w(-- 1.0 2.0 1.2))
expect(page).to have_select('grid_f_versions_name', options: %w(-- 1.0 1.1 1.2 2.0 3.0 6.0 7.1 8.0 88.1 99.0))
end
it 'allows to filter by custom fields' do
first(:css, '.expand-multi-select-icon').click
select('1.0', from: 'grid_f_versions_name')
select('1.1', from: 'grid_f_versions_name')
find(:css, '#grid_submit_grid_icon').click
within '.pagination_status' do
expect(page).to have_content('1-5 / 5')
end
select '1.0', from: 'grid_f_expected_version_id'
find(:css, '#grid_submit_grid_icon').click
within '.pagination_status' do
expect(page).to have_content('1-2 / 2')
end
end
end
================================================
FILE: spec/features/custom_filters4_request_spec.rb
================================================
# encoding: utf-8
require 'acceptance_helper'
describe 'On the page /custom_filters4 with allow_multiple_selection: false WiceGrid', type: :feature, js: true do
before :each do
visit '/custom_filters4'
end
it 'does not allow to expand custom filters' do
expect(page).to have_no_selector('.expand-multi-select-icon')
expect(page).to have_no_selector('.collapse-multi-select-icon')
end
end
================================================
FILE: spec/features/custom_ordering_on_calculated_request_spec.rb
================================================
# encoding: utf-8
require 'acceptance_helper'
describe 'On the page /custom_ordering_on_calculated with sort_by: as a Proc WiceGrid', type: :request, js: true do
before :each do
visit '/custom_ordering_on_calculated'
end
it 'allows to sort by the result of the Proc' do
within 'div#grid.wice-grid-container table.wice-grid' do
expect(page).to have_selector('tbody tr:first-child', text: 'New')
within 'thead' do
click_on 'Task Count'
expect(page).to have_selector('i.fa-arrow-down')
end
expect(page).to have_selector('tbody tr:first-child', text: 'New')
expect(page).to have_selector('tbody tr:first-child td.sorted', text: '3')
within 'thead' do
click_on 'Task Count'
expect(page).to have_selector('i.fa-arrow-up')
end
expect(page).to have_selector('tbody tr:first-child', text: 'Duplicate')
expect(page).to have_selector('tbody tr:first-child td.sorted', text: '10')
end
end
end
================================================
FILE: spec/features/custom_ordering_request_spec.rb
================================================
# encoding: utf-8
require 'acceptance_helper'
describe 'On the page /custom_ordering with custom_ordering in controler with Strings WiceGrid', type: :request, js: true do
before :each do
visit '/custom_ordering'
end
context 'when "statuses.name" => "length( ? )"' do
it 'sorts by the length of the word' do
within 'div#grid.wice-grid-container table.wice-grid tbody tr:first-child td.sorted' do
expect(page).to have_content('New')
end
within 'div#grid.wice-grid-container table.wice-grid thead' do
click_on 'Status Name'
end
within 'div#grid.wice-grid-container table.wice-grid tbody tr:first-child td.sorted' do
expect(page).to have_content('Duplicate')
end
end
end
context 'when "statuses.name" => "statuses.position"' do
it 'sorts by the position of the status' do
within 'div#g2.wice-grid-container table.wice-grid tbody tr:first-child td.sorted' do
expect(page).to have_content('New')
end
within 'div#g2.wice-grid-container table.wice-grid thead' do
click_on 'Status Name'
end
within 'div#g2.wice-grid-container table.wice-grid tbody tr:first-child td.sorted' do
expect(page).to have_content('Verified')
end
end
end
end
================================================
FILE: spec/features/custom_ordering_with_arel_request_spec.rb
================================================
# encoding: utf-8
require 'acceptance_helper'
describe 'On the page /custom_ordering_with_arel with custom_ordering in controler with Arel WiceGrid', type: :request, js: true do
before :each do
visit '/custom_ordering_with_arel'
end
context 'when "statuses.name" => Arel.sql("length( ? )")' do
it 'sorts by the length of the word' do
within 'div#grid.wice-grid-container table.wice-grid tbody tr:first-child td.sorted' do
expect(page).to have_content('New')
end
within 'div#grid.wice-grid-container table.wice-grid thead' do
click_on 'Status Name'
end
within 'div#grid.wice-grid-container table.wice-grid tbody tr:first-child td.sorted' do
expect(page).to have_content('Duplicate')
end
end
end
context 'when "statuses.name" => Status.arel_table[:position]' do
it 'sorts by the position of the status' do
within 'div#g2.wice-grid-container table.wice-grid tbody tr:first-child td.sorted' do
expect(page).to have_content('New')
end
within 'div#g2.wice-grid-container table.wice-grid thead' do
click_on 'Status Name'
end
within 'div#g2.wice-grid-container table.wice-grid tbody tr:first-child td.sorted' do
expect(page).to have_content('Verified')
end
end
end
end
================================================
FILE: spec/features/custom_ordering_with_proc_request_spec.rb
================================================
# encoding: utf-8
require 'acceptance_helper'
describe 'On the page /custom_ordering_with_proc with custom_ordering in controler with Procs WiceGrid', type: :request, js: true do
context 'when "statuses.name" => ->(column_name) { params[:sort_by_length] ? "length(#{column_name})" : column_name }' do
context 'with no special param' do
before :each do
visit '/custom_ordering_with_proc'
end
it 'sorts alphabetically' do
within 'div#grid.wice-grid-container table.wice-grid tbody tr:first-child td.sorted' do
expect(page).to have_content('Assigned')
end
within 'div#grid.wice-grid-container table.wice-grid thead' do
click_on 'Status Name'
end
within 'div#grid.wice-grid-container table.wice-grid tbody tr:first-child td.sorted' do
expect(page).to have_content('Verified')
end
end
end
context 'with the :sort_by_length param' do
before :each do
visit '/custom_ordering_with_proc?sort_by_length=1'
end
it 'sorts by length of the #name' do
within 'div#grid.wice-grid-container table.wice-grid tbody tr:first-child td.sorted' do
expect(page).to have_content('New')
end
within 'div#grid.wice-grid-container table.wice-grid thead' do
click_on 'Status Name'
end
within 'div#grid.wice-grid-container table.wice-grid tbody tr:first-child td.sorted' do
expect(page).to have_content('Duplicate')
end
end
end
end
end
================================================
FILE: spec/features/custom_ordering_with_ruby_request_spec.rb
================================================
# encoding: utf-8
require 'acceptance_helper'
describe 'On the page /custom_ordering_with_ruby with custom_ordering in view with Ruby code WiceGrid', type: :request, js: true do
before :each do
visit '/custom_ordering_with_ruby'
end
context 'when in the columnt sort_by: ->(status) { [status.number_of_vowels, status] }' do
it 'should be sorted by the number of vowels' do
within 'div#grid.wice-grid-container table.wice-grid' do
within 'tbody tr:first-child' do
expect(page).to have_content('New')
end
within 'thead' do
click_on 'Status Name'
expect(page).to have_selector('i.fa-arrow-down')
end
expect(page).to have_selector('tbody tr:first-child td.sorted', text: 'New')
within 'thead' do
click_on 'Status Name'
expect(page).to have_selector('i.fa-arrow-up')
end
expect(page).to have_selector('tbody tr:first-child td.sorted', text: 'Verified')
end
end
end
end
================================================
FILE: spec/features/dates_request_spec.rb
================================================
# encoding: utf-8
require 'acceptance_helper'
describe 'On the page /dates with filter_type: :rails_datetime_helper WiceGrid', type: :request, js: true do
before :each do
visit '/dates'
end
include_examples 'sorting Title'
include_examples 'sorting Archived'
include_examples 'sorting Due Date'
include_examples 'sorting Title in all records mode'
include_examples 'sorting Archived in all records mode'
include_examples 'sorting Due Date in all records mode'
include_examples 'Archived filtering'
include_examples 'Title filtering'
include_examples 'Due Date datepicker filtering'
include_examples 'Added datepicker filtering'
include_examples 'Created At standard filtering'
it 'filters by multiple fields' do
select '2021', from: 'grid_f_updated_at_fr_year'
select 'January', from: 'grid_f_updated_at_fr_month'
select '8', from: 'grid_f_updated_at_fr_day'
select '00', from: 'grid_f_updated_at_fr_hour'
select '00', from: 'grid_f_updated_at_fr_minute'
select '2021', from: 'grid_f_updated_at_to_year'
select 'December', from: 'grid_f_updated_at_to_month'
select '10', from: 'grid_f_updated_at_to_day'
select '00', from: 'grid_f_updated_at_to_hour'
select '00', from: 'grid_f_updated_at_to_minute'
set_datepicker(self, 'grid_f_created_at_fr_date_placeholder', 2021, 8, 1)
set_datepicker(self, 'grid_f_created_at_to_date_placeholder', 2021, 8, 30)
find(:css, '#grid_submit_grid_icon').click
within '.pagination_status' do
expect(page).to have_content('1-4 / 4')
end
fill_in('grid_f_title', with: 'at')
find(:css, '#grid_submit_grid_icon').click
within '.pagination_status' do
expect(page).to have_content('1-1 / 1')
end
end
end
================================================
FILE: spec/features/detached_filters_spec.rb
================================================
# encoding: utf-8
require 'acceptance_helper'
describe 'On the page /detached_filters with detached filters WiceGrid', type: :feature, js: true do
before :each do
visit '/detached_filters'
end
include_examples 'detached_filters'
end
================================================
FILE: spec/features/detached_filters_two_grids_spec.rb
================================================
# encoding: utf-8
require 'acceptance_helper'
describe 'On the page /detached_filters_two_grids with detached filters and 2 grids WiceGrid', type: :feature, js: true do
before :each do
visit '/detached_filters_two_grids'
end
it 'the filters are independent of each other' do
select 'yes', from: 'grid_f_archived'
find(:css, '.external-buttons-grid1 .wg-external-submit-button').click
within 'div#grid.wice-grid-container .pagination_status' do
expect(page).to have_content('1-4 / 4')
end
select 'no', from: 'grid2_f_archived'
find(:css, '.external-buttons-grid2 .wg-external-submit-button').click
# stays the same
within 'div#grid.wice-grid-container .pagination_status' do
expect(page).to have_content('1-4 / 4')
end
within 'div#grid2.wice-grid-container .pagination_status' do
expect(page).to have_content('1-20 / 46')
end
set_datepicker(self, 'grid_f_due_date_fr_date_placeholder', 2022, 11, 1)
set_datepicker(self, 'grid_f_due_date_to_date_placeholder', 2022, 11, 31)
find(:css, '.external-buttons-grid1 .wg-external-submit-button').click
within 'div#grid.wice-grid-container .pagination_status' do
expect(page).to have_content('1-3 / 3')
end
set_datepicker(self, 'grid2_f_due_date_fr_date_placeholder', 2023, 0, 1)
set_datepicker(self, 'grid2_f_due_date_to_date_placeholder', 2023, 11, 31)
find(:css, '.external-buttons-grid2 .wg-external-submit-button').click
# stays the same
within 'div#grid.wice-grid-container .pagination_status' do
expect(page).to have_content('1-3 / 3')
end
within 'div#grid2.wice-grid-container .pagination_status' do
expect(page).to have_content('1-15 / 15')
end
find(:css, '.external-buttons-grid1 .wg-external-reset-button').click
expect(page).to have_select('grid_f_archived', selected: '--')
expect(page).to have_selector('#grid_f_due_date_fr_date_placeholder:not([value])')
expect(page).to have_selector('#grid_f_due_date_to_date_placeholder:not([value])')
within 'div#grid.wice-grid-container .pagination_status' do
expect(page).to have_content('1-20 / 50')
end
within 'div#grid2.wice-grid-container .pagination_status' do
expect(page).to have_content('1-15 / 15')
end
find(:css, '.external-buttons-grid2 .wg-external-reset-button').click
expect(page).to have_select('grid2_f_archived', selected: '--')
expect(page).to have_selector('#grid2_f_due_date_fr_date_placeholder:not([value])')
expect(page).to have_selector('#grid2_f_due_date_to_date_placeholder:not([value])')
within 'div#grid.wice-grid-container .pagination_status' do
expect(page).to have_content('1-20 / 50')
end
within 'div#grid2.wice-grid-container .pagination_status' do
expect(page).to have_content('1-20 / 50')
end
fill_in('grid_f_title', with: 'ed')
find(:css, '.external-buttons-grid1 .wg-external-submit-button').click
within 'div#grid.wice-grid-container .pagination_status' do
expect(page).to have_content('1-2 / 2')
end
within 'div#grid2.wice-grid-container .pagination_status' do
expect(page).to have_content('1-20 / 50')
end
within 'div#grid.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('sed impedit iste')
end
fill_in('grid2_f_title', with: 'qui')
find(:css, '.external-buttons-grid2 .wg-external-submit-button').click
within 'div#grid.wice-grid-container .pagination_status' do
expect(page).to have_content('1-2 / 2')
end
within 'div#grid2.wice-grid-container .pagination_status' do
expect(page).to have_content('1-5 / 5')
end
within 'div#grid.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('sed impedit iste')
end
within 'div#grid2.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('sequi')
end
fill_in('grid2_f_description', with: 'in')
find(:css, '.external-buttons-grid2 .wg-external-submit-button').click
within 'div#grid.wice-grid-container .pagination_status' do
expect(page).to have_content('1-2 / 2')
end
within 'div#grid2.wice-grid-container .pagination_status' do
expect(page).to have_content('1-2 / 2')
end
within 'div#grid.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('sed impedit iste')
end
within first(:css, 'div#grid2.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter') do
expect(page).to have_content('sequi')
end
end
end
================================================
FILE: spec/features/disable_all_filters_spec.rb
================================================
# encoding: utf-8
require 'acceptance_helper'
describe 'On the page /disable_all_filters with show_filters: :no as a grid parameter WiceGrid', type: :request, js: true do
before :each do
visit '/disable_all_filters'
end
it 'does not render filters' do
expect(page).to have_no_selector('#grid_f_id_fr')
expect(page).to have_no_selector('#grid_f_id_to')
expect(page).to have_no_selector('#grid_f_description')
expect(page).to have_no_selector('#grid_f_created_at_fr_year')
expect(page).to have_no_selector('#grid_f_created_at_fr_month')
expect(page).to have_no_selector('#grid_f_created_at_to_year')
expect(page).to have_no_selector('#grid_f_created_at_to_month')
expect(page).to have_no_selector('#grid_f_title')
expect(page).to have_no_selector('#grid_f_archived')
end
end
================================================
FILE: spec/features/hiding_checkboxes_in_action_column_request_spec.rb
================================================
# encoding: utf-8
require 'acceptance_helper'
describe 'On the page /hiding_checkboxes_in_action_column with g.action_column html_check_box: false and a block that return status.name != "Assigned" WiceGrid', type: :request, js: true do
before :each do
visit '/hiding_checkboxes_in_action_column'
end
it 'does not render checkboxes for tasks with the Assigned status' do
select 'Assigned', from: 'g_f_status_id'
find(:css, '#g_submit_grid_icon').click
expect(page).to have_content('1-4 / 4')
expect(page).to have_no_selector('tbody input[type=checkbox]')
end
it 'allows to select rows' do
510.upto(520).each do |i|
find(:css, %(input[type="checkbox"][value="#{i}"])).click unless i == 519
end
first(:css, 'button.btn', text: 'Process tasks').click
expect(page).to have_content('Selected tasks: 510, 511, 512, 513, 514, 515, 516, 517, 518, and 520')
end
it 'allows to select rows with the select all button and deselect them with the deselect button' do
find(:css, %(.clickable.select-all)).click
first(:css, 'button.btn', text: 'Process tasks').click
expect(page).to have_content('Selected tasks: 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 520, 521, 522, 523, 524, 525, and 526')
find(:css, %(.clickable.deselect-all)).click
first(:css, 'button.btn', text: 'Process tasks').click
expect(page).to have_no_content('Selected tasks: 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 520, 521, 522, 523, 524, 525, and 526')
end
it 'allows to keep the state of filter inside a form' do
end
it 'allows to filter by ID inside a form, two limits' do
fill_in('g_f_id_fr', with: 507)
fill_in('g_f_id_to', with: 509)
first(:css, 'button.btn', text: 'Process tasks').click
within '.pagination_status' do
expect(page).to have_content('1-3 / 3')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('507')
end
expect(page).to have_content('508')
expect(page).to have_content('509')
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'ID'
end
within '.pagination_status' do
expect(page).to have_content('1-3 / 3')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.sorted.active-filter' do
expect(page).to have_content('509')
end
expect(page).to have_content('508')
expect(page).to have_content('509')
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'ID'
end
within '.pagination_status' do
expect(page).to have_content('1-3 / 3')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.sorted' do
expect(page).to have_content('507')
end
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'Title'
end
within '.pagination_status' do
expect(page).to have_content('1-3 / 3')
end
end
it 'allows to filter by Archived inside a form' do
select 'yes', from: 'g_f_archived'
first(:css, 'button.btn', text: 'Process tasks').click
within '.pagination_status' do
expect(page).to have_content('1-4 / 4')
end
within first(:css, 'td.active-filter') do
expect(page).to have_content('Yes')
end
select 'no', from: 'g_f_archived'
first(:css, 'button.btn', text: 'Process tasks').click
within '.pagination_status' do
expect(page).to have_content('1-20 / 46')
end
within first(:css, 'td.active-filter') do
expect(page).to have_content('No')
end
within 'ul.grid.pagination' do
click_link '2'
end
within '.pagination_status' do
expect(page).to have_content('21-40 / 46')
end
within first(:css, 'td.active-filter') do
expect(page).to have_content('No')
end
end
it 'allows to filter by Added inside a form' do
set_datepicker(self, 'g_f_created_at_fr_date_placeholder', 2021, 5, 1)
set_datepicker(self, 'g_f_created_at_to_date_placeholder', 2021, 9, 1)
first(:css, 'button.btn', text: 'Process tasks').click
within '.pagination_status' do
expect(page).to have_content('1-20 / 29')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('2021-09-13 22:11:12')
end
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'ID'
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('2021-09-29 22:11:12')
end
within '.pagination_status' do
expect(page).to have_content('1-20 / 29')
end
within 'ul.grid.pagination' do
click_link '2'
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('2021-09-22 22:11:12')
end
end
it 'allows to filter by Due Date' do
set_datepicker(self, 'g_f_due_date_fr_date_placeholder', 2022, 0, 1)
set_datepicker(self, 'g_f_due_date_to_date_placeholder', 2023, 0, 1)
first(:css, 'button.btn', text: 'Process tasks').click
within '.pagination_status' do
expect(page).to have_content('1-20 / 35')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('2022-07-29')
end
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'ID'
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('2022-10-02')
end
within '.pagination_status' do
expect(page).to have_content('1-20 / 35')
end
within 'ul.grid.pagination' do
click_link '2'
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('2022-07-02')
end
set_datepicker(self, 'g_f_due_date_fr_date_placeholder', 2022, 6, 28)
set_datepicker(self, 'g_f_due_date_to_date_placeholder', 2022, 6, 31)
first(:css, 'button.btn', text: 'Process tasks').click
within '.pagination_status' do
expect(page).to have_content('1-1 / 1')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('2022-07-29')
end
find(:css, '#g_f_due_date_fr_date_view').click
first(:css, 'button.btn', text: 'Process tasks').click
within '.pagination_status' do
expect(page).to have_content('1-10 / 10')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('2022-07-29')
end
find(:css, '#g_f_due_date_to_date_view').click
first(:css, 'button.btn', text: 'Process tasks').click
within '.pagination_status' do
expect(page).to have_content('1-20 / 50')
end
end
it 'allows to negate the semantics of the text filter inside a form' do
fill_in('g_f_title_v', with: 'sed')
select 'no', from: 'g_f_archived'
first(:css, 'button.btn', text: 'Process tasks').click
expect(page).to have_content('sed impedit iste')
find(:css, '#g_f_title_n').click
first(:css, 'button.btn', text: 'Process tasks').click
expect(page).to have_no_content('sed impedit iste')
end
it 'allows to reload the title filter' do
fill_in('g_f_title_v', with: 'ed')
first(:css, 'button.btn', text: 'Process tasks').click
within '.pagination_status' do
expect(page).to have_content('1-2 / 2')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('sed impedit iste')
end
expect(page).to have_content('corporis expedita vel')
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'Title'
end
within '.pagination_status' do
expect(page).to have_content('1-2 / 2')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('corporis expedita vel')
end
expect(page).to have_content('sed impedit iste')
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'ID'
end
within '.pagination_status' do
expect(page).to have_content('1-2 / 2')
end
expect(page).to have_content('corporis expedita vel')
expect(page).to have_content('sed impedit iste')
end
end
================================================
FILE: spec/features/integration_with_application_view_request_spec.rb
================================================
# encoding: utf-8
require 'acceptance_helper'
describe 'On the page /integration_with_application_view with the methods #current_page_records & #all_pages_records WiceGrid', type: :request, js: true do
before :each do
visit '/integration_with_application_view'
end
it 'returns records displayed on the page and throughout all pages' do
all_records_current_page_text = '10 records on the current page: 507, 519, 537, 540, 511, 515, 523, 524, 527, and 531'
all_records_all_pages_text = '50 records throughout all pages: 507, 519, 537, 540, 511, 515, 523, 524, 527, 531, 542, 551, 518, 520, 532, 535, 539, 512, 514, 516, 521, 522, 543, 544, 546, 550, 552, 510, 541, 553, 508, 513, 528, 529, 548, 556, 525, 534, 547, 555, 509, 517, 526, 536, 538, 545, 549, 530, 533, and 554'
expect(page).to have_content(all_records_current_page_text)
expect(page).to have_content(all_records_all_pages_text)
fill_in('g_f_title', with: 'ed')
expect(page).to have_content('2 records throughout all pages: 507 and 534')
expect(page).to have_content('2 records on the current page: 507 and 534')
find(:css, '#g_reset_grid_icon').click
expect(page).to have_field('g_f_title', with: '')
expect(page).to have_content(all_records_current_page_text)
expect(page).to have_content(all_records_all_pages_text)
select 'Cancelled', from: 'g_f_status_id'
expect(page).to have_content('8 records on the current page: 511, 515, 523, 524, 527, 531, 542, and 551')
expect(page).to have_content('8 records throughout all pages: 511, 515, 523, 524, 527, 531, 542, and 551')
find(:css, '#g_reset_grid_icon').click
expect(page).to have_select('g_f_status_id', selected: '--')
expect(page).to have_content(all_records_current_page_text)
expect(page).to have_content(all_records_all_pages_text)
select 'no', from: 'g_f_archived'
expect(page).to have_content('10 records on the current page: 507, 519, 537, 540, 511, 515, 523, 527, 531, and 542')
expect(page).to have_content('46 records throughout all pages: 507, 519, 537, 540, 511, 515, 523, 527, 531, 542, 551, 518, 520, 532, 535, 539, 512, 514, 516, 521, 522, 543, 544, 546, 552, 510, 541, 553, 508, 528, 529, 548, 556, 525, 534, 547, 555, 509, 517, 526, 536, 538, 545, 549, 530, and 554')
end
end
================================================
FILE: spec/features/integration_with_forms_request_spec.rb
================================================
# encoding: utf-8
require 'acceptance_helper'
context 'On the page /integration_with_forms with another form on the page that uses the helper dump_filter_parameters_as_hidden_fields' do
describe '(on /integration_with_form) WiceGrid', type: :request, js: true do
before :each do
visit '/integration_with_forms'
end
it 'reloads the page when the value in the form is changed' do
within '.pagination_status' do
expect(page).to have_content('1-20 / 46')
end
select 'View archived tasks', from: 'archived'
within '.pagination_status' do
expect(page).to have_content('1-4 / 4')
end
select 'View active tasks', from: 'archived'
within '.pagination_status' do
expect(page).to have_content('1-20 / 46')
end
end
it 'keeps the state of an integer filter while reloading another form' do
fill_in('g_f_id_fr', with: 507)
fill_in('g_f_id_to', with: 509)
find(:css, '#g_submit_grid_icon').click
within '.pagination_status' do
expect(page).to have_content('1-3 / 3')
end
select 'View archived tasks', from: 'archived'
within '.pagination_status' do
expect(page).to have_content('0')
end
select 'View active tasks', from: 'archived'
within '.pagination_status' do
expect(page).to have_content('1-3 / 3')
end
end
it 'keeps the state of a string filter while reloading another form' do
fill_in('g_f_title_v', with: 'ed')
find(:css, '#g_submit_grid_icon').click
within '.pagination_status' do
expect(page).to have_content('1-2 / 2')
end
select 'View archived tasks', from: 'archived'
within '.pagination_status' do
expect(page).to have_content('0')
end
select 'View active tasks', from: 'archived'
within '.pagination_status' do
expect(page).to have_content('1-2 / 2')
end
end
it 'keeps the state of a string filter with negation while reloading another form' do
fill_in('g_f_title_v', with: 'ed')
find(:css, '#g_f_title_n').click
find(:css, '#g_submit_grid_icon').click
within '.pagination_status' do
expect(page).to have_content('1-20 / 44')
end
select 'View archived tasks', from: 'archived'
within '.pagination_status' do
expect(page).to have_content('1-4 / 4')
end
select 'View active tasks', from: 'archived'
within '.pagination_status' do
expect(page).to have_content('1-20 / 44')
end
end
it 'keeps the state of a custom filter with negation while reloading another form' do
select 'Cancelled', from: 'g_f_status_id'
select 'Super Game', from: 'g_f_project_id'
find(:css, '#g_submit_grid_icon').click
within '.pagination_status' do
expect(page).to have_content('1-4 / 4')
end
select 'View archived tasks', from: 'archived'
within '.pagination_status' do
expect(page).to have_content('0')
end
select 'View active tasks', from: 'archived'
within '.pagination_status' do
expect(page).to have_content('1-4 / 4')
end
end
it 'keeps the state of a date filter while reloading another form' do
set_datepicker(self, 'g_f_due_date_fr_date_placeholder', 2023, 0, 1)
set_datepicker(self, 'g_f_due_date_to_date_placeholder', 2025, 0, 1)
find(:css, '#g_submit_grid_icon').click
within '.pagination_status' do
expect(page).to have_content('1-15 / 15')
end
select 'View archived tasks', from: 'archived'
within '.pagination_status' do
expect(page).to have_content('0')
end
select 'View active tasks', from: 'archived'
within '.pagination_status' do
expect(page).to have_content('1-15 / 15')
end
end
end
end
================================================
FILE: spec/features/joining_tables_spec.rb
================================================
# encoding: utf-8
require 'acceptance_helper'
describe 'On the page /joining_tables with :include in :initialize_grid to include associated tables WiceGrid', type: :request, js: true do
before :each do
visit '/joining_tables'
end
it 'has filters for joined tables' do
expect(page).to have_field('grid[f][priorities.name]')
expect(page).to have_field('grid[f][statuses.name]')
expect(page).to have_field('grid[f][projects.name]')
expect(page).to have_field('grid[f][users.name]')
end
it 'allows to filter based on joined tables' do
fill_in('grid_f_priorities_name', with: 'Normal')
fill_in('grid_f_statuses_name', with: 'Postponed')
fill_in('grid_f_projects_name', with: 'Super')
fill_in('grid_f_users_name', with: 'Koobus')
find(:css, '#grid_submit_grid_icon').click
within '.pagination_status' do
expect(page).to have_content('1-1 / 1')
end
within first(:css, 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter') do
expect(page).to have_content('Normal')
end
within first(:css, 'div.wice-grid-container table.wice-grid tbody tr:first-child td') do
expect(page).to have_content('508')
end
within 'div.wice-grid-container table.wice-grid tbody' do
expect(page).to have_content('sequi')
end
end
end
================================================
FILE: spec/features/localization_request_spec.rb
================================================
# encoding: UTF-8
require 'acceptance_helper'
describe 'On the page /localization with the proper use of I18n WiceGrid', type: :request, js: true do
before :each do
visit '/localization'
end
it 'allows to switch to different languages' do
click_on('en')
expect(page).to have_content('show all')
click_on('nl')
expect(page).to have_content('Alle rijen tonen')
click_on('fr')
expect(page).to have_content('Voir tous')
click_on('is')
expect(page).to have_content('Sýna all')
click_on('en')
end
end
================================================
FILE: spec/features/many_grids_on_page_request_spec.rb
================================================
# encoding: utf-8
require 'acceptance_helper'
describe 'On the page /many_grids_on_page with multiple girds on the page WiceGrid', type: :request, js: true do
before :each do
visit '/many_grids_on_page'
end
it 'allows to sort independantly' do
within 'div#g1.wice-grid-container table.wice-grid thead' do
click_on 'Title'
end
within 'div#g1.wice-grid-container table.wice-grid tbody tr:first-child td.sorted' do
expect(page).to have_content('ab')
end
within 'div#g2.wice-grid-container table.wice-grid thead' do
click_on 'Description'
end
within 'div#g1.wice-grid-container table.wice-grid thead th.sorted a.asc' do
expect(page).to have_content('Title')
end
within 'div#g2.wice-grid-container table.wice-grid thead th.sorted a.asc' do
expect(page).to have_content('Description')
end
within 'div#g1.wice-grid-container table.wice-grid tbody tr:first-child td.sorted' do
expect(page).to have_content('ab')
end
within 'div#g2.wice-grid-container table.wice-grid tbody tr:first-child td.sorted' do
expect(page).to have_content('Accusamus voluptas sunt deleniti iusto dolorem repudiandae.')
end
end
it 'allows to paginate independantly' do
within '#g1 ul.pagination' do
click_link '2'
end
expect(page).to have_selector('#g1 ul.pagination li.active', text: '2')
within '#g2 ul.pagination' do
click_link '3'
end
expect(page).to have_selector('#g2 ul.pagination li.active', text: '3')
end
it 'allows to show all records independantly for the two grids' do
within '#g1' do
click_on 'show all'
end
within 'div#g1.wice-grid-container table.wice-grid' do
expect(page).to have_selector('a.wg-back-to-pagination-link')
end
within '#g1 .pagination_status' do
expect(page).to have_content('1-50 / 50')
end
within '#g2 .pagination_status' do
expect(page).to have_content('1-20 / 50')
end
end
it 'allows to filter independantly' do
fill_in('g1_f_description', with: 've')
find(:css, '#g1_submit_grid_icon').click
within '#g1 .pagination_status' do
expect(page).to have_content('1-12 / 12')
end
within 'div#g1.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('Velit atque sapiente aspernatur sint fuga.')
end
fill_in('g2_f_description', with: 'voluptas')
find(:css, '#g2_submit_grid_icon').click
within '#g2 .pagination_status' do
expect(page).to have_content('1-1 / 1')
end
within 'div#g2.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('Accusamus voluptas sunt deleniti iusto dolorem repudiandae.')
end
within '#g1 .pagination_status' do
expect(page).to have_content('1-12 / 12')
end
within 'div#g1.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('Velit atque sapiente aspernatur sint fuga.')
end
end
end
================================================
FILE: spec/features/negation_request_spec.rb
================================================
# encoding: utf-8
require 'acceptance_helper'
describe 'On the page /negation with negation: true WiceGrid', type: :request, js: true do
before :each do
visit '/negation'
end
it 'allows to negate the semantics of the filter for the field' do
fill_in('grid_f_title_v', with: 'sed')
select 'no', from: 'grid_f_archived'
find(:css, '#grid_submit_grid_icon').click
expect(page).to have_content('sed impedit iste')
expect(page).to have_no_content('ut ipsum excepturi')
find(:css, '#grid_f_title_n').click
find(:css, '#grid_submit_grid_icon').click
expect(page).to have_no_content('sed impedit iste')
expect(page).to have_content('ut ipsum excepturi')
end
end
================================================
FILE: spec/features/no_records_request_spec.rb
================================================
# encoding: utf-8
require 'acceptance_helper'
context 'On the page /no_records when there is no records to show' do
describe 'with the grid helper :blank_slate WiceGrid', type: :request, js: true do
before :each do
visit '/no_records'
end
it 'allows to show the message "No Records" in a block for example 1' do
within '.example1' do
expect(page).to have_content('No records found')
end
end
it 'allows to show the message "No Records" in a block for example 2' do
within '.example2' do
expect(page).to have_content('No records found')
end
end
it 'allows to show the message "No Records" in a block for example 3' do
within '.example3' do
expect(page).to have_content('No records found')
end
end
end
end
================================================
FILE: spec/features/numeric_filters_request_spec.rb
================================================
# encoding: utf-8
require 'acceptance_helper'
describe 'On the page /numeric_filters with filter_type: :range WiceGrid', type: :request, js: true do
before :each do
visit '/numeric_filters'
end
include_examples 'ID filtering, range'
include_examples 'ID two limits filtering'
end
================================================
FILE: spec/features/resultset_processings2_request_spec.rb
================================================
# encoding: utf-8
require 'acceptance_helper'
describe 'On the page /resultset_processings2 with the helper :with_resultset that defines a callback on a resultset as an ActiveRelation', type: :request, js: true do
describe 'WiceGrid' do
before :each do
visit '/resultset_processings2'
end
it 'shows records displayed on all pages' do
find(:css, '#process').click
expect(page).to have_content('50 records on all pages: 507, 519, 537, 540, 511, 515, 523, 524, 527, 531, 542, 551, 518, 520, 532, 535, 539, 512, 514, 516, 521, 522, 543, 544, 546, 550, 552, 510, 541, 553, 508, 513, 528, 529, 548, 556, 525, 534, 547, 555, 509, 517, 526, 536, 538, 545, 549, 530, 533, and 554')
end
it 'shows records displayed on all pages with a text filter selection' do
fill_in('g_f_title', with: 'ed')
expect(page).to have_content('1-2 / 2')
find(:css, '#process').click
expect(page).to have_content('2 records on all pages: 507 and 534')
end
it 'shows records displayed on all pages with a custom filter selection' do
select 'Cancelled', from: 'g_f_status_id'
expect(page).to have_content('1-5 / 8')
find(:css, '#process').click
expect(page).to have_content('8 records on all pages: 511, 515, 523, 524, 527, 531, 542, and 551')
end
end
end
================================================
FILE: spec/features/resultset_processings_request_spec.rb
================================================
# encoding: utf-8
require 'acceptance_helper'
describe 'On the page /resultset_processings with the helper :with_paginated_resultset that defines a callback on a resultset as an Array', type: :request, js: true do
before :each do
visit '/resultset_processings'
end
describe 'the callback' do
it 'returns the records displayed on the page' do
expect(page).to have_content('10 records on the current page: 507, 519, 537, 540, 511, 515, 523, 524, 527, and 531')
end
end
describe 'WiceGrid' do
it 'shows records displayed on all pages with a text filter selection' do
fill_in('g_f_title', with: 'ed')
expect(page).to have_content('1-2 / 2')
expect(page).to have_content('2 records on the current page: 507 and 534')
end
it 'shows records displayed on all pages with a filter selection' do
select 'no', from: 'g_f_archived'
expect(page).to have_content('1-10 / 46')
expect(page).to have_content('10 records on the current page: 507, 519, 537, 540, 511, 515, 523, 527, 531, and 542')
end
it 'shows records displayed on all pages with a custom filter selection' do
select 'Cancelled', from: 'g_f_status_id'
expect(page).to have_content('1-8 / 8')
expect(page).to have_content('8 records on the current page: 511, 515, 523, 524, 527, 531, 542, and 551')
end
end
end
================================================
FILE: spec/features/saved_queries_request_spec.rb
================================================
# encoding: utf-8
require 'acceptance_helper'
describe 'On the page /saved_queries when saved queries are configured WiceGrid', type: :request, js: true do
before :each do
visit '/saved_queries'
end
def delete_all_saved_queries(context)
while delete_link = context.find(:css, '.wice-grid-delete-query')
delete_link.click
expect(page).to have_selector('#grid_notification_messages', text: 'Saved query deleted.')
end
rescue Capybara::ElementNotFound
true
end
it 'allows to filter by Added' do
check_saved_query = lambda do
within '.pagination_status' do
expect(page).to have_content('1-20 / 29')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('2021-08-13 22:11:12')
end
end
delete_all_saved_queries self
set_datepicker(self, 'grid_f_created_at_fr_date_placeholder', 2021, 5, 1)
set_datepicker(self, 'grid_f_created_at_to_date_placeholder', 2021, 9, 1)
find(:css, '#grid_submit_grid_icon').click
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('2021-09-13 22:11:12')
end
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'Title'
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('2021-08-13 22:11:12')
end
check_saved_query.call
fill_in('grid_saved_query_name', with: 'test query 1')
click_on 'Save the state of filters'
expect(page).to have_content('Query saved.')
expect(page).to have_content('test query 1')
find(:css, '#grid_reset_grid_icon').click
within '.pagination_status' do
expect(page).to have_content('1-20 / 50')
end
expect(page).to have_content('test query 1')
find(:css, '.wice-grid-query-load-link[title="Load query test query 1"]').click
check_saved_query.call
within '.wice-grid-container' do
expect(page).to have_content('test query 1')
end
delete_all_saved_queries self
expect(page).to have_content('Saved query deleted.')
end
it 'allows to filter by Archived and Project Name' do
check_saved_query = lambda do
within '.pagination_status' do
expect(page).to have_content('1-2 / 2')
end
within first(:css, 'td.active-filter') do
expect(page).to have_content('Ultimate Website')
end
end
delete_all_saved_queries self
select 'yes', from: 'grid_f_archived'
select 'Ultimate Website', from: 'grid_f_project_id'
find(:css, '#grid_submit_grid_icon').click
check_saved_query.call
fill_in('grid_saved_query_name', with: 'test query 2')
click_on 'Save the state of filters'
expect(page).to have_content('Query saved.')
expect(page).to have_content('test query 2')
find(:css, '#grid_reset_grid_icon').click
within '.pagination_status' do
expect(page).to have_content('1-20 / 50')
end
expect(page).to have_content('test query 2')
find(:css, '.wice-grid-query-load-link[title="Load query test query 2"]').click
check_saved_query.call
within '.wice-grid-container' do
expect(page).to have_content('test query 2')
end
delete_all_saved_queries self
expect(page).to have_content('Saved query deleted.')
end
end
================================================
FILE: spec/features/shared.rb
================================================
# encoding: utf-8
shared_examples 'basic task table specs' do
it 'is present on the page' do
expect(page).to have_selector('div.wice-grid-container table.wice-grid')
end
it 'has "show all" link' do
within 'div.wice-grid-container table.wice-grid' do
expect(page).to have_selector('a.wg-show-all-link')
end
end
it 'allows to navigate through the pages' do
within 'ul.grid.pagination' do
click_link '2'
end
within '.wice-grid li.active' do
expect(page).to have_content('2')
end
within '.pagination_status' do
expect(page).to have_content('21-40 / 50')
end
within 'ul.grid.pagination' do
click_link '3'
end
within '.wice-grid li.active' do
expect(page).to have_content('3')
end
within '.pagination_status' do
expect(page).to have_content('41-50 / 50')
end
end
it 'shows the pagination status with page 1 as the current page' do
within 'div.wice-grid-container table.wice-grid' do
expect(page).to have_selector('div.pagination')
within 'div.pagination' do
expect(page).to have_selector('li.active')
within 'li.active' do
expect(page).to have_content('1')
end
expect(page).to have_content('2')
expect(page).to have_content('3')
expect(page).to have_no_content('4')
end
end
end
end
shared_examples 'show all and back' do
it 'shows all records when the button "show all" is clicked' do
click_on 'show all'
within 'div.wice-grid-container table.wice-grid' do
expect(page).to have_selector('a.wg-back-to-pagination-link')
end
within '.pagination_status' do
expect(page).to have_content('1-50 / 50')
end
click_on 'back to paginated view'
within '.pagination_status' do
expect(page).to have_content('1-20 / 50')
end
end
end
shared_examples 'names of columns' do
it 'shows the names of columns' do
within 'div.wice-grid-container table.wice-grid thead' do
expect(page).to have_content('ID')
expect(page).to have_content('Title')
expect(page).to have_content('Description')
expect(page).to have_content('Archived')
expect(page).to have_content('Added')
end
end
end
shared_examples 'sorting ID' do
it 'allows to sort column ID' do
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'ID'
end
within 'div.wice-grid-container table.wice-grid thead th.sorted a.desc' do
expect(page).to have_content('ID')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.sorted' do
expect(page).to have_content('556')
end
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'ID'
end
within 'div.wice-grid-container table.wice-grid thead th.sorted a.asc' do
expect(page).to have_content('ID')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.sorted' do
expect(page).to have_content('507')
end
within 'ul.grid.pagination' do
click_link '2'
end
within '.wice-grid li.active' do
expect(page).to have_content('2')
end
within 'div.wice-grid-container table.wice-grid thead th.sorted a.asc' do
expect(page).to have_content('ID')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.sorted' do
expect(page).to have_content('527')
end
end
end
shared_examples 'sorting Title' do
it 'allows to sort column Title' do
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'Title'
end
within 'div.wice-grid-container table.wice-grid thead th.sorted a.asc' do
expect(page).to have_content('Title')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.sorted' do
expect(page).to have_content('ab')
end
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'Title'
end
within 'div.wice-grid-container table.wice-grid thead th.sorted a.desc' do
expect(page).to have_content('Title')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.sorted' do
expect(page).to have_content('voluptatum non')
end
within 'ul.grid.pagination' do
click_link '2'
end
within '.wice-grid li.active' do
expect(page).to have_content('2')
end
within 'div.wice-grid-container table.wice-grid thead th.sorted a.desc' do
expect(page).to have_content('Title')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.sorted' do
expect(page).to have_content('quia dignissimos maiores')
end
end
end
shared_examples 'sorting Description' do
it 'allows to sort column Description' do
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'Description'
end
within 'div.wice-grid-container table.wice-grid thead th.sorted a.asc' do
expect(page).to have_content('Description')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.sorted' do
expect(page).to have_content('Accusamus voluptas sunt deleniti iusto dolorem repudiandae.')
end
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'Description'
end
within 'div.wice-grid-container table.wice-grid thead th.sorted a.desc' do
expect(page).to have_content('Description')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.sorted' do
expect(page).to have_content('Voluptate occaecati quisquam in et qui nostrum eos minus.')
end
within 'ul.grid.pagination' do
click_link '2'
end
within '.wice-grid li.active' do
expect(page).to have_content('2')
end
within 'div.wice-grid-container table.wice-grid thead th.sorted a.desc' do
expect(page).to have_content('Description')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.sorted' do
expect(page).to have_content('Iure tenetur cum aut optio et quia similique debitis.')
end
end
end
shared_examples 'sorting Archived' do
it 'allows to sort column Archived' do
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'Archived'
end
within 'div.wice-grid-container table.wice-grid thead th.sorted a.asc' do
expect(page).to have_content('Archived')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.sorted' do
expect(page).to have_content('No')
end
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'Archived'
end
within 'div.wice-grid-container table.wice-grid thead th.sorted a.desc' do
expect(page).to have_content('Archived')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.sorted' do
expect(page).to have_content('Yes')
end
within 'ul.grid.pagination' do
click_link '2'
end
within '.wice-grid li.active' do
expect(page).to have_content('2')
end
within 'div.wice-grid-container table.wice-grid thead th.sorted a.desc' do
expect(page).to have_content('Archived')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.sorted' do
expect(page).to have_content('No')
end
end
end
shared_examples 'sorting Due Date' do
it 'allows to sort column Due Date' do
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'Due Date'
end
within 'div.wice-grid-container table.wice-grid thead th.sorted a.asc' do
expect(page).to have_content('Due Date')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.sorted' do
expect(page).to have_content('2022-06-12')
end
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'Due Date'
end
within 'div.wice-grid-container table.wice-grid thead th.sorted a.desc' do
expect(page).to have_content('Due Date')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.sorted' do
expect(page).to have_content('2023-03-30')
end
within 'ul.grid.pagination' do
click_link '2'
end
within '.wice-grid li.active' do
expect(page).to have_content('2')
end
within 'div.wice-grid-container table.wice-grid thead th.sorted a.desc' do
expect(page).to have_content('Due Date')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.sorted' do
expect(page).to have_content('2022-12-13')
end
end
end
shared_examples 'sorting ID in all records mode' do
it 'allows to sort column ID' do
click_on 'show all'
within '.pagination_status' do
expect(page).to have_content('1-50 / 50')
end
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'ID'
end
within 'div.wice-grid-container table.wice-grid thead th.sorted a.desc' do
expect(page).to have_content('ID')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.sorted' do
expect(page).to have_content('556')
end
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'ID'
end
within 'div.wice-grid-container table.wice-grid thead th.sorted a.asc' do
expect(page).to have_content('ID')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.sorted' do
expect(page).to have_content('507')
end
end
end
shared_examples 'sorting Title in all records mode' do
it 'allows to sort column Title' do
click_on 'show all'
within '.pagination_status' do
expect(page).to have_content('1-50 / 50')
end
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'Title'
end
within 'div.wice-grid-container table.wice-grid thead th.sorted a.asc' do
expect(page).to have_content('Title')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.sorted' do
expect(page).to have_content('ab')
end
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'Title'
end
within 'div.wice-grid-container table.wice-grid thead th.sorted a.desc' do
expect(page).to have_content('Title')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.sorted' do
expect(page).to have_content('voluptatum non')
end
end
end
shared_examples 'sorting Description in all records mode' do
it 'allows to sort column Description' do
click_on 'show all'
within '.pagination_status' do
expect(page).to have_content('1-50 / 50')
end
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'Description'
end
within 'div.wice-grid-container table.wice-grid thead th.sorted a.asc' do
expect(page).to have_content('Description')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.sorted' do
expect(page).to have_content('Accusamus voluptas sunt deleniti iusto dolorem repudiandae.')
end
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'Description'
end
within 'div.wice-grid-container table.wice-grid thead th.sorted a.desc' do
expect(page).to have_content('Description')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.sorted' do
expect(page).to have_content('Voluptate occaecati quisquam in et qui nostrum eos minus.')
end
end
end
shared_examples 'sorting Archived in all records mode' do
it 'allows to sort column Archived' do
click_on 'show all'
within '.pagination_status' do
expect(page).to have_content('back to paginated view')
expect(page).to have_content('1-50 / 50')
end
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'Archived'
end
within 'div.wice-grid-container table.wice-grid thead th.sorted a.asc' do
expect(page).to have_content('Archived')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.sorted' do
expect(page).to have_content('No')
end
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'Archived'
end
within 'div.wice-grid-container table.wice-grid thead th.sorted a.desc' do
expect(page).to have_content('Archived')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.sorted' do
expect(page).to have_content('Yes')
end
end
end
shared_examples 'sorting Due Date in all records mode' do
it 'allows to sort column Due Date' do
click_on 'show all'
within '.pagination_status' do
expect(page).to have_content('1-50 / 50')
end
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'Due Date'
end
within 'div.wice-grid-container table.wice-grid thead th.sorted a.asc' do
expect(page).to have_content('Due Date')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.sorted' do
expect(page).to have_content('2022-06-12')
end
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'Due Date'
end
within 'div.wice-grid-container table.wice-grid thead th.sorted a.desc' do
expect(page).to have_content('Due Date')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.sorted' do
expect(page).to have_content('2023-03-30')
end
end
end
MONTH_NAMES = %w(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)
def set_datepicker(context, picker, year, month, day)
context.find(:css, "##{picker} .ui-datepicker-trigger").click
year_select = context.find(:css, '.ui-datepicker-year')
year_select.select(year.to_s)
month_select = context.find(:css, '.ui-datepicker-month')
month_select.select(MONTH_NAMES[month])
context.within '.ui-datepicker-calendar' do
context.click_on(day.to_s)
end
end
shared_examples 'Due Date datepicker filtering' do
it 'allows to filter by Due Date' do
set_datepicker(self, 'grid_f_due_date_fr_date_placeholder', 2022, 0, 1)
set_datepicker(self, 'grid_f_due_date_to_date_placeholder', 2023, 0, 1)
find(:css, '#grid_submit_grid_icon').click
within '.pagination_status' do
expect(page).to have_content('1-20 / 35')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('2022-07-29')
end
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'ID'
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('2022-10-02')
end
within '.pagination_status' do
expect(page).to have_content('1-20 / 35')
end
within 'ul.grid.pagination' do
click_link '2'
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('2022-07-02')
end
set_datepicker(self, 'grid_f_due_date_fr_date_placeholder', 2022, 6, 28)
set_datepicker(self, 'grid_f_due_date_to_date_placeholder', 2022, 6, 31)
find(:css, '#grid_submit_grid_icon').click
within '.pagination_status' do
expect(page).to have_content('1-1 / 1')
end
find(:css, '#grid_f_due_date_fr_date_view').click
find(:css, '#grid_submit_grid_icon').click
within '.pagination_status' do
expect(page).to have_content('1-10 / 10')
end
find(:css, '#grid_f_due_date_to_date_view').click
find(:css, '#grid_submit_grid_icon').click
within '.pagination_status' do
expect(page).to have_content('1-20 / 50')
end
end
end
shared_examples 'Added datepicker filtering' do
it 'allows to filter by Added' do
set_datepicker(self, 'grid_f_created_at_fr_date_placeholder', 2021, 5, 1)
set_datepicker(self, 'grid_f_created_at_to_date_placeholder', 2021, 9, 1)
find(:css, '#grid_submit_grid_icon').click
within '.pagination_status' do
expect(page).to have_content('1-20 / 29')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('2021-09-13 22:11:12')
end
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'ID'
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('2021-09-29 22:11:12')
end
within '.pagination_status' do
expect(page).to have_content('1-20 / 29')
end
within 'ul.grid.pagination' do
click_link '2'
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('2021-09-22 22:11:12')
end
find(:css, '#grid_reset_grid_icon').click
within '.pagination_status' do
expect(page).to have_content('1-20 / 50')
end
end
end
# !!!
shared_examples 'Due Date standard filtering' do
it 'allows to filter by Due Date (standard filter)' do
select '2021', from: 'grid_f_created_at_fr_year'
select 'February', from: 'grid_f_created_at_fr_month'
select '8', from: 'grid_f_created_at_fr_day'
select '00', from: 'grid_f_created_at_fr_hour'
select '00', from: 'grid_f_created_at_fr_minute'
select '2021', from: 'grid_f_created_at_to_year'
select 'September', from: 'grid_f_created_at_to_month'
select '10', from: 'grid_f_created_at_to_day'
select '00', from: 'grid_f_created_at_to_hour'
select '00', from: 'grid_f_created_at_to_minute'
find(:css, '#grid_submit_grid_icon').click
within '.pagination_status' do
expect(page).to have_content('1-16 / 16')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('13 Aug 22:11')
end
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'ID'
end
within '.pagination_status' do
expect(page).to have_content('1-16 / 16')
end
find(:css, '#grid_reset_grid_icon').click
within '.pagination_status' do
expect(page).to have_content('1-20 / 50')
end
end
end
shared_examples 'Created At standard filtering' do
it 'allows to filter by created_at' do
select '2021', from: 'grid_f_updated_at_fr_year'
select 'January', from: 'grid_f_updated_at_fr_month'
select '8', from: 'grid_f_updated_at_fr_day'
select '00', from: 'grid_f_updated_at_fr_hour'
select '00', from: 'grid_f_updated_at_fr_minute'
select '2021', from: 'grid_f_updated_at_to_year'
select 'December', from: 'grid_f_updated_at_to_month'
select '10', from: 'grid_f_updated_at_to_day'
select '00', from: 'grid_f_updated_at_to_hour'
select '00', from: 'grid_f_updated_at_to_minute'
find(:css, '#grid_submit_grid_icon').click
within '.pagination_status' do
expect(page).to have_content('1-14 / 14')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('2021-11-26 22:11:12')
end
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'ID'
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('2021-12-07 22:11:12')
end
within '.pagination_status' do
expect(page).to have_content('1-14 / 14')
end
find(:css, '#grid_reset_grid_icon').click
within '.pagination_status' do
expect(page).to have_content('1-20 / 50')
end
end
end
shared_examples 'Description filtering' do
it 'allows to filter by Description' do
fill_in('grid_f_description', with: 've')
find(:css, '#grid_submit_grid_icon').click
within '.pagination_status' do
expect(page).to have_content('1-12 / 12')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('Velit atque sapiente aspernatur sint fuga.')
end
expect(page).to have_content('Vero sit voluptate sed tempora et provident sequi nihil.')
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'Description'
end
within '.pagination_status' do
expect(page).to have_content('1-12 / 12')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('Ad sunt vel maxime labore temporibus incidunt quidem.')
end
expect(page).to have_content('Adipisci voluptate sed esse velit.')
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'ID'
end
within '.pagination_status' do
expect(page).to have_content('1-12 / 12')
end
expect(page).to have_content('Adipisci voluptate sed esse velit.')
expect(page).to have_content('Ad sunt vel maxime labore temporibus incidunt quidem.')
find(:css, '#grid_reset_grid_icon').click
within '.pagination_status' do
expect(page).to have_content('1-20 / 50')
end
end
end
shared_examples 'ID filtering' do
it 'allows to filter by ID, one limit' do
fill_in('grid_f_id_eq', with: 550)
find(:css, '#grid_submit_grid_icon').click
within '.pagination_status' do
expect(page).to have_content('1-1 / 1')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('550')
end
end
end
shared_examples 'ID filtering, range' do
it 'allows to filter by ID, one limit' do
fill_in('grid_f_id_fr', with: 550)
find(:css, '#grid_submit_grid_icon').click
within '.pagination_status' do
expect(page).to have_content('1-7 / 7')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('550')
end
551.upto(556) do |i|
expect(page).to have_content(i)
end
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'ID'
end
within '.pagination_status' do
expect(page).to have_content('1-7 / 7')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.sorted.active-filter' do
expect(page).to have_content('550')
end
551.upto(556) do |i|
expect(page).to have_content(i)
end
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'ID'
end
within '.pagination_status' do
expect(page).to have_content('1-7 / 7')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.sorted' do
expect(page).to have_content('556')
end
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'Title'
end
within '.pagination_status' do
expect(page).to have_content('1-7 / 7')
end
550.upto(556) do |i|
expect(page).to have_content(i)
end
find(:css, '#grid_reset_grid_icon').click
within '.pagination_status' do
expect(page).to have_content('1-20 / 50')
end
end
end
shared_examples 'ID two limits filtering' do
it 'allows to filter by ID, two limits' do
fill_in('grid_f_id_fr', with: 507)
fill_in('grid_f_id_to', with: 509)
find(:css, '#grid_submit_grid_icon').click
within '.pagination_status' do
expect(page).to have_content('1-3 / 3')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('507')
end
expect(page).to have_content('508')
expect(page).to have_content('509')
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'ID'
end
within '.pagination_status' do
expect(page).to have_content('1-3 / 3')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.sorted.active-filter' do
expect(page).to have_content('507')
end
expect(page).to have_content('508')
expect(page).to have_content('509')
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'ID'
end
within '.pagination_status' do
expect(page).to have_content('1-3 / 3')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.sorted' do
expect(page).to have_content('509')
end
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'Title'
end
within '.pagination_status' do
expect(page).to have_content('1-3 / 3')
end
expect(page).to have_content('507')
expect(page).to have_content('508')
expect(page).to have_content('509')
find(:css, '#grid_reset_grid_icon').click
within '.pagination_status' do
expect(page).to have_content('1-20 / 50')
end
end
end
shared_examples 'Description and Title filtering' do
it 'allows to filter by multiple columns' do
fill_in('grid_f_description', with: 'v')
fill_in('grid_f_title', with: 's')
select 'no', from: 'grid_f_archived'
find(:css, '#grid_submit_grid_icon').click
within '.pagination_status' do
expect(page).to have_content('1-11 / 11')
end
expect(page).to have_content('Inventore iure eos labore ipsum.')
expect(page).to have_content('Velit atque sapiente aspernatur sint fuga.')
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'Description'
end
within '.pagination_status' do
expect(page).to have_content('1-11 / 11')
end
expect(page).to have_content('Inventore iure eos labore ipsum.')
expect(page).to have_content('Velit atque sapiente aspernatur sint fuga.')
find(:css, '#grid_reset_grid_icon').click
within '.pagination_status' do
expect(page).to have_content('1-20 / 50')
end
end
end
shared_examples 'Archived filtering' do
it 'allows to filter by Archived' do
select 'yes', from: 'grid_f_archived'
find(:css, '#grid_submit_grid_icon').click
within '.pagination_status' do
expect(page).to have_content('1-4 / 4')
end
within first(:css, 'td.active-filter') do
expect(page).to have_content('Yes')
end
select 'no', from: 'grid_f_archived'
find(:css, '#grid_submit_grid_icon').click
within '.pagination_status' do
expect(page).to have_content('1-20 / 46')
end
within first(:css, 'td.active-filter') do
expect(page).to have_content('No')
end
within 'ul.grid.pagination' do
click_link '2'
end
within '.pagination_status' do
expect(page).to have_content('21-40 / 46')
end
within(first(:css, 'td.active-filter')) do
expect(page).to have_content('No')
end
find(:css, '#grid_reset_grid_icon').click
within '.pagination_status' do
expect(page).to have_content('1-20 / 50')
end
end
end
shared_examples 'Title filtering' do
it 'allows to filter by Title' do
fill_in('grid_f_title', with: 'ed')
find(:css, '#grid_submit_grid_icon').click
within '.pagination_status' do
expect(page).to have_content('1-2 / 2')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('sed impedit iste')
end
expect(page).to have_content('corporis expedita vel')
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'Title'
end
within '.pagination_status' do
expect(page).to have_content('1-2 / 2')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('corporis expedita vel')
end
expect(page).to have_content('sed impedit iste')
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'ID'
end
within '.pagination_status' do
expect(page).to have_content('1-2 / 2')
end
expect(page).to have_content('corporis expedita vel')
expect(page).to have_content('sed impedit iste')
find(:css, '#grid_reset_grid_icon').click
within '.pagination_status' do
expect(page).to have_content('1-20 / 50')
end
end
end
================================================
FILE: spec/features/shared_detached_filters.rb
================================================
# encoding: utf-8
shared_examples "detached_filters" do
it "allows to filter by Archived" do
select 'yes', :from => 'grid_f_archived'
click_button('Submit')
within '.pagination_status' do
expect(page).to have_content('1-4 / 4')
end
within first(:css, 'td.active-filter') do
expect(page).to have_content('Yes')
end
select 'no', :from => 'grid_f_archived'
click_button('Submit')
within '.pagination_status' do
expect(page).to have_content('1-20 / 46')
end
within first(:css, 'td.active-filter') do
expect(page).to have_content('No')
end
within 'ul.grid.pagination' do
click_link '2'
end
within '.pagination_status' do
expect(page).to have_content('21-40 / 46')
end
within first(:css, 'td.active-filter') do
expect(page).to have_content('No')
end
click_button('Reset')
within '.pagination_status' do
expect(page).to have_content('1-20 / 50')
end
end
it "allows to filter by Title" do
fill_in('grid_f_title', :with => 'ed')
click_button('Submit')
within '.pagination_status' do
expect(page).to have_content('1-2 / 2')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('sed impedit iste')
end
expect(page).to have_content('corporis expedita vel')
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'Title'
end
within '.pagination_status' do
expect(page).to have_content('1-2 / 2')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('corporis expedita vel')
end
expect(page).to have_content('sed impedit iste')
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'ID'
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('sed impedit iste')
end
within '.pagination_status' do
expect(page).to have_content('1-2 / 2')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('sed impedit iste')
end
expect(page).to have_content('corporis expedita vel')
click_button('Reset')
within '.pagination_status' do
expect(page).to have_content('1-20 / 50')
end
end
it "allows to filter by Description" do
fill_in('grid_f_description', :with => 've')
click_button('Submit')
expect(page).to have_selector('.pagination_status', text: '1-12 / 12')
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('Velit atque sapiente aspernatur sint fuga.')
end
expect(page).to have_content('Vero sit voluptate sed tempora et provident sequi nihil.')
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'Description'
end
expect(page).to have_selector('.pagination_status', text: '1-12 / 12')
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('Ad sunt vel maxime labore temporibus incidunt quidem.')
end
expect(page).to have_content('Adipisci voluptate sed esse velit.')
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'ID'
end
expect(page).to have_selector('.pagination_status', text: '1-12 / 12')
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('Velit atque sapiente aspernatur sint fuga.')
end
expect(page).to have_content('Adipisci voluptate sed esse velit.')
expect(page).to have_content('Ad sunt vel maxime labore temporibus incidunt quidem.')
click_button('Reset')
expect(page).to have_selector('.pagination_status', text: '1-20 / 50')
end
it "allows to filter by multiple columns" do
fill_in('grid_f_description', :with => 'v')
fill_in('grid_f_title', :with => 's')
select 'no', :from => 'grid_f_archived'
click_button('Submit')
within '.pagination_status' do
expect(page).to have_content('1-11 / 11')
end
expect(page).to have_content('Inventore iure eos labore ipsum.')
expect(page).to have_content('Velit atque sapiente aspernatur sint fuga.')
expect(page).to have_no_content('Eos qui est quis.')
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'Description'
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child' do
expect(page).to have_content('Accusamus voluptas sunt deleniti iusto dolorem repudiandae.')
end
within '.pagination_status' do
expect(page).to have_content('1-11 / 11')
end
expect(page).to have_content('Inventore iure eos labore ipsum.')
expect(page).to have_content('Velit atque sapiente aspernatur sint fuga.')
expect(page).to have_no_content('Eos qui est quis.')
click_button('Reset')
within '.pagination_status' do
expect(page).to have_content('1-20 / 50')
end
end
end
================================================
FILE: spec/features/styling_spec.rb
================================================
require 'acceptance_helper'
describe "On the page /styling with the :html helper in the grid WiceGrid", :type => :request, :js => true do
before :each do
visit '/styling'
end
it "allows to have custom css classes" do
expect(page).to have_selector('.wice-grid-container table.wice-grid.my-grid')
expect(page).to have_selector('.wice-grid-container thead tr.wice-grid-title-row.my-header')
end
end
================================================
FILE: spec/features/two_associations_spec.rb
================================================
require 'acceptance_helper'
context 'On the page /two_associations when two associations referring to the same model are joined' do
describe "with the help of :table_alias WiceGrid", :type => :request, :js => true do
before :each do
visit '/two_associations'
end
it "allows to filter the two associations independantly" do
fill_in('grid_f_companies_name', :with => 'MNU')
find(:css, '#grid_submit_grid_icon').click
within '.pagination_status' do
expect(page).to have_content('1-2 / 2')
end
fill_in('grid_f_suppliers_projects_name', :with => 'Coders')
find(:css, '#grid_submit_grid_icon').click
within '.pagination_status' do
expect(page).to have_content('1-1 / 1')
end
fill_in('grid_f_companies_name', :with => '')
find(:css, '#grid_submit_grid_icon').click
within '.pagination_status' do
expect(page).to have_content('1-2 / 2')
end
fill_in('grid_f_companies_name', :with => 'foo')
find(:css, '#grid_submit_grid_icon').click
within '.pagination_status' do
expect(page).to have_content('0')
end
end
end
end
================================================
FILE: spec/features/upper_pagination_panel_request_spec.rb
================================================
require 'acceptance_helper'
describe "On the page /upper_pagination_panel with the upper_pagination_panel parameter for the grid WiceGrid", :type => :request do
before :each do
visit '/upper_pagination_panel'
end
if ALL_TESTS
include_examples "basic task table specs"
include_examples "names of columns"
end
it "shows the upper pagination panel" do
skip "This test should be run with BROWSER=y in environment" unless ENV['BROWSER']
expect(page).to have_selector('table.wice-grid thead tr td .pagination li.active')
within 'table.wice-grid thead tr td .pagination_status' do
expect(page).to have_content('1-20 / 50')
end
end
end
================================================
FILE: spec/features/when_filtered_spec.rb
================================================
require 'acceptance_helper'
describe "On the page /when_filtered whith the parameter show_filters: :when_filtered in grid WiceGrid", :js => true do
before :each do
visit '/when_filtered'
end
it "hides the filter panel by default" do
expect{
fill_in('grid_f_description', :with => 've')
}.to raise_error(Capybara::ElementNotFound)
end
context 'when the icon "Show filter is clicked"' do
before do
find(:css, '.wg-show-filter').click
end
it "allows to filter by Description" do
fill_in('grid_f_description', :with => 've')
find(:css, '#grid_submit_grid_icon').click
within '.pagination_status' do
expect(page).to have_content('1-12 / 12')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('Velit atque sapiente aspernatur sint fuga.')
end
expect(page).to have_content('Vero sit voluptate sed tempora et provident sequi nihil.')
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'Description'
end
within '.pagination_status' do
expect(page).to have_content('1-12 / 12')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('Ad sunt vel maxime labore temporibus incidunt quidem.')
end
expect(page).to have_content('Adipisci voluptate sed esse velit.')
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'ID'
end
within '.pagination_status' do
expect(page).to have_content('1-12 / 12')
end
expect(page).to have_content('Adipisci voluptate sed esse velit.')
expect(page).to have_content('Ad sunt vel maxime labore temporibus incidunt quidem.')
find(:css, '#grid_reset_grid_icon').click
within '.pagination_status' do
expect(page).to have_content('1-20 / 50')
end
end
it "allows to filter by multiple columns" do
fill_in('grid_f_description', :with => 'v')
fill_in('grid_f_title', :with => 's')
select 'no', :from => 'grid_f_archived'
find(:css, '#grid_submit_grid_icon').click
within '.pagination_status' do
expect(page).to have_content('1-11 / 11')
end
expect(page).to have_content('Inventore iure eos labore ipsum.')
expect(page).to have_content('Velit atque sapiente aspernatur sint fuga.')
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'Description'
end
within '.pagination_status' do
expect(page).to have_content('1-11 / 11')
end
expect(page).to have_content('Inventore iure eos labore ipsum.')
expect(page).to have_content('Velit atque sapiente aspernatur sint fuga.')
find(:css, '#grid_reset_grid_icon').click
within '.pagination_status' do
expect(page).to have_content('1-20 / 50')
end
end
it "allows to filter by Archived" do
select 'yes', :from => 'grid_f_archived'
find(:css, '#grid_submit_grid_icon').click
within '.pagination_status' do
expect(page).to have_content('1-4 / 4')
end
within first(:css, 'td.active-filter') do
expect(page).to have_content('Yes')
end
select 'no', :from => 'grid_f_archived'
find(:css, '#grid_submit_grid_icon').click
within '.pagination_status' do
expect(page).to have_content('1-20 / 46')
end
within first(:css, 'td.active-filter') do
expect(page).to have_content('No')
end
within 'ul.grid.pagination' do
click_link '2'
end
within '.pagination_status' do
expect(page).to have_content('21-40 / 46')
end
within first(:css, 'td.active-filter') do
expect(page).to have_content('No')
end
find(:css, '#grid_reset_grid_icon').click
within '.pagination_status' do
expect(page).to have_content('1-20 / 50')
end
end
it "allows to filter by Title" do
fill_in('grid_f_title', :with => 'ed')
find(:css, '#grid_submit_grid_icon').click
within '.pagination_status' do
expect(page).to have_content('1-2 / 2')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('sed impedit iste')
end
expect(page).to have_content('corporis expedita vel')
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'Title'
end
within '.pagination_status' do
expect(page).to have_content('1-2 / 2')
end
within 'div.wice-grid-container table.wice-grid tbody tr:first-child td.active-filter' do
expect(page).to have_content('corporis expedita vel')
end
expect(page).to have_content('sed impedit iste')
within 'div.wice-grid-container table.wice-grid thead' do
click_on 'ID'
end
within '.pagination_status' do
expect(page).to have_content('1-2 / 2')
end
expect(page).to have_content('corporis expedita vel')
expect(page).to have_content('sed impedit iste')
find(:css, '#grid_reset_grid_icon').click
within '.pagination_status' do
expect(page).to have_content('1-20 / 50')
end
end
end
end
================================================
FILE: spec/fixtures/.gitkeep
================================================
================================================
FILE: spec/fixtures/companies.yml
================================================
---
company_00005:
id: 5
name: MNU
created_at: 2022-02-26 22:11:12.000000000 Z
updated_at: 2022-02-26 22:11:12.000000000 Z
company_00006:
id: 6
name: SkyNet
created_at: 2022-02-26 22:11:12.000000000 Z
updated_at: 2022-02-26 22:11:12.000000000 Z
company_00007:
id: 7
name: Coders Unlimited
created_at: 2022-02-26 22:11:12.000000000 Z
updated_at: 2022-02-26 22:11:12.000000000 Z
company_00008:
id: 8
name: Shift-Command-4 Limited
created_at: 2022-02-26 22:11:12.000000000 Z
updated_at: 2022-02-26 22:11:12.000000000 Z
================================================
FILE: spec/fixtures/priorities.yml
================================================
---
priority_00006:
id: 6
name: Urgent
position: 0
created_at: 2022-02-26 22:11:12.000000000 Z
updated_at: 2022-02-26 22:11:12.000000000 Z
priority_00007:
id: 7
name: High
position: 1
created_at: 2022-02-26 22:11:12.000000000 Z
updated_at: 2022-02-26 22:11:12.000000000 Z
priority_00008:
id: 8
name: Normal
position: 2
created_at: 2022-02-26 22:11:12.000000000 Z
updated_at: 2022-02-26 22:11:12.000000000 Z
priority_00009:
id: 9
name: Low
position: 3
created_at: 2022-02-26 22:11:12.000000000 Z
updated_at: 2022-02-26 22:11:12.000000000 Z
priority_00010:
id: 10
name: Anecdotic
position: 4
created_at: 2022-02-26 22:11:12.000000000 Z
updated_at: 2022-02-26 22:11:12.000000000 Z
================================================
FILE: spec/fixtures/project_roles.yml
================================================
---
project_role_00005:
id: 5
name: Manager
can_close_tasks: true
created_at: 2022-02-26 22:11:12.000000000 Z
updated_at: 2022-02-26 22:11:12.000000000 Z
project_role_00006:
id: 6
name: Customer
can_close_tasks: true
created_at: 2022-02-26 22:11:12.000000000 Z
updated_at: 2022-02-26 22:11:12.000000000 Z
project_role_00007:
id: 7
name: Developer
can_close_tasks: false
created_at: 2022-02-26 22:11:12.000000000 Z
updated_at: 2022-02-26 22:11:12.000000000 Z
project_role_00008:
id: 8
name: QualityAssurance
can_close_tasks: false
created_at: 2022-02-26 22:11:12.000000000 Z
updated_at: 2022-02-26 22:11:12.000000000 Z
================================================
FILE: spec/fixtures/projects.yml
================================================
---
project_00004:
id: 4
name: Ultimate Website
customer_id: 5
supplier_id: 7
created_at: 2022-02-26 22:11:12.000000000 Z
updated_at: 2022-02-26 22:11:12.000000000 Z
project_00005:
id: 5
name: Super Game
customer_id: 5
supplier_id: 8
created_at: 2022-02-26 22:11:12.000000000 Z
updated_at: 2022-02-26 22:11:12.000000000 Z
project_00006:
id: 6
name: Divine Firmware
customer_id: 6
supplier_id: 7
created_at: 2022-02-26 22:11:12.000000000 Z
updated_at: 2022-02-26 22:11:12.000000000 Z
================================================
FILE: spec/fixtures/statuses.yml
================================================
---
status_00010:
id: 10
name: New
position: 0
created_at: 2022-02-26 22:11:12.000000000 Z
updated_at: 2022-02-26 22:11:12.000000000 Z
status_00011:
id: 11
name: Assigned
position: 1
created_at: 2022-02-26 22:11:12.000000000 Z
updated_at: 2022-02-26 22:11:12.000000000 Z
status_00012:
id: 12
name: Started
position: 2
created_at: 2022-02-26 22:11:12.000000000 Z
updated_at: 2022-02-26 22:11:12.000000000 Z
status_00013:
id: 13
name: Resolved
position: 3
created_at: 2022-02-26 22:11:12.000000000 Z
updated_at: 2022-02-26 22:11:12.000000000 Z
status_00014:
id: 14
name: Duplicate
position: 4
created_at: 2022-02-26 22:11:12.000000000 Z
updated_at: 2022-02-26 22:11:12.000000000 Z
status_00015:
id: 15
name: Cancelled
position: 5
created_at: 2022-02-26 22:11:12.000000000 Z
updated_at: 2022-02-26 22:11:12.000000000 Z
status_00016:
id: 16
name: Postponed
position: 6
created_at: 2022-02-26 22:11:12.000000000 Z
updated_at: 2022-02-26 22:11:12.000000000 Z
status_00017:
id: 17
name: Closed
position: 7
created_at: 2022-02-26 22:11:12.000000000 Z
updated_at: 2022-02-26 22:11:12.000000000 Z
status_00018:
id: 18
name: Verified
position: 8
created_at: 2022-02-26 22:11:12.000000000 Z
updated_at: 2022-02-26 22:11:12.000000000 Z
================================================
FILE: spec/fixtures/tasks.yml
================================================
---
task_00507:
id: 507
title: sed impedit iste
description: Velit atque sapiente aspernatur sint fuga.
created_by_id: 13
project_id: 4
due_date: 2023-01-26
priority_id:
status_id: 11
relevant_version_id: 15
expected_version_id: 14
estimated_time: 2.0
archived: false
created_at: 2021-09-13 22:11:12.000000000 Z
updated_at: 2022-01-14 22:11:12.000000000 Z
task_00508:
id: 508
title: sequi
description: In recusandae quibusdam consequatur odio dicta sit.
created_by_id: 21
project_id: 5
due_date: 2022-07-29
priority_id: 8
status_id: 16
relevant_version_id: 17
expected_version_id: 18
estimated_time: 10.0
archived: false
created_at: 2021-11-09 22:11:12.000000000 Z
updated_at: 2021-11-26 22:11:12.000000000 Z
task_00509:
id: 509
title: ab
description: Repudiandae voluptatibus sed perferendis quia sit voluptates ea delectus.
created_by_id: 14
project_id: 5
due_date: 2023-03-18
priority_id: 10
status_id: 12
relevant_version_id:
expected_version_id: 18
estimated_time: 8.0
archived: false
created_at: 2021-08-13 22:11:12.000000000 Z
updated_at: 2021-12-07 22:11:12.000000000 Z
task_00510:
id: 510
title: sint voluptatem
description: Eos qui est quis.
created_by_id: 20
project_id: 6
due_date: 2022-07-02
priority_id: 7
status_id: 10
relevant_version_id: 22
expected_version_id: 21
estimated_time: 19.0
archived: false
created_at: 2021-09-25 22:11:12.000000000 Z
updated_at: 2022-02-19 22:11:12.000000000 Z
task_00511:
id: 511
title: est maiores delectus
description: In occaecati at facilis ut consectetur dolorum officia.
created_by_id: 21
project_id: 5
due_date: 2022-11-07
priority_id: 8
status_id: 15
relevant_version_id: 18
expected_version_id:
estimated_time: 18.0
archived: false
created_at: 2021-10-25 22:11:12.000000000 Z
updated_at: 2021-11-25 22:11:12.000000000 Z
task_00512:
id: 512
title: dolore ad
description: Asperiores odio repellendus ut voluptate.
created_by_id: 18
project_id: 5
due_date: 2023-01-24
priority_id: 6
status_id: 14
relevant_version_id:
expected_version_id: 19
estimated_time: 4.0
archived: false
created_at: 2021-10-30 22:11:12.000000000 Z
updated_at: 2022-02-11 22:11:12.000000000 Z
task_00513:
id: 513
title: nihil
description: Ut ex ipsam a.
created_by_id: 14
project_id: 5
due_date: 2022-12-24
priority_id: 8
status_id: 16
relevant_version_id:
expected_version_id:
estimated_time: 13.0
archived: true
created_at: 2021-08-18 22:11:12.000000000 Z
updated_at: 2022-01-05 22:11:12.000000000 Z
task_00514:
id: 514
title: quia dignissimos maiores
description: Mollitia aliquam ratione perferendis reprehenderit dolor quod.
created_by_id: 17
project_id: 6
due_date: 2022-12-14
priority_id: 6
status_id: 14
relevant_version_id: 20
expected_version_id:
estimated_time: 6.0
archived: false
created_at: 2021-08-11 22:11:12.000000000 Z
updated_at: 2021-12-19 22:11:12.000000000 Z
task_00515:
id: 515
title: voluptatum non
description: Vero sit voluptate sed tempora et provident sequi nihil.
created_by_id: 22
project_id: 5
due_date: 2022-11-05
priority_id: 7
status_id: 15
relevant_version_id:
expected_version_id: 19
estimated_time: 8.0
archived: false
created_at: 2021-09-29 22:11:12.000000000 Z
updated_at: 2022-02-02 22:11:12.000000000 Z
task_00516:
id: 516
title: dolorem
description: Et vel ipsa illo aut error voluptatem autem qui.
created_by_id: 22
project_id: 5
due_date: 2023-01-14
priority_id: 7
status_id: 14
relevant_version_id:
expected_version_id:
estimated_time: 20.0
archived: false
created_at: 2021-11-08 22:11:12.000000000 Z
updated_at: 2021-11-29 22:11:12.000000000 Z
task_00517:
id: 517
title: repellat voluptates
description: Commodi et et nisi ipsam corporis.
created_by_id: 16
project_id: 6
due_date: 2022-06-30
priority_id: 10
status_id: 12
relevant_version_id:
expected_version_id:
estimated_time: 10.0
archived: false
created_at: 2021-09-06 22:11:12.000000000 Z
updated_at: 2021-12-18 22:11:12.000000000 Z
task_00518:
id: 518
title: sunt et ipsa
description: Id sunt et pariatur quis quaerat veritatis distinctio voluptate.
created_by_id: 20
project_id: 6
due_date: 2023-01-27
priority_id: 7
status_id: 17
relevant_version_id:
expected_version_id: 21
estimated_time: 17.0
archived: false
created_at: 2021-08-30 22:11:12.000000000 Z
updated_at: 2022-01-30 22:11:12.000000000 Z
task_00519:
id: 519
title: consequatur minus et
description: Corporis facilis eos magni repellendus.
created_by_id: 17
project_id: 4
due_date: 2022-11-22
priority_id: 9
status_id: 11
relevant_version_id: 12
expected_version_id: 12
estimated_time: 12.0
archived: false
created_at: 2021-09-22 22:11:12.000000000 Z
updated_at: 2022-01-15 22:11:12.000000000 Z
task_00520:
id: 520
title: odit
description: Id sint quidem esse blanditiis.
created_by_id: 14
project_id: 6
due_date: 2022-11-18
priority_id:
status_id: 17
relevant_version_id:
expected_version_id:
estimated_time: 8.0
archived: false
created_at: 2021-09-28 22:11:12.000000000 Z
updated_at: 2021-11-21 22:11:12.000000000 Z
task_00521:
id: 521
title: tempora
description: Assumenda illo quia molestiae nihil quis nulla.
created_by_id: 18
project_id: 5
due_date: 2022-12-25
priority_id: 9
status_id: 14
relevant_version_id:
expected_version_id: 18
estimated_time: 13.0
archived: false
created_at: 2021-09-03 22:11:12.000000000 Z
updated_at: 2021-12-28 22:11:12.000000000 Z
task_00522:
id: 522
title: rerum
description: Aut et eos nostrum et recusandae ab.
created_by_id: 18
project_id: 4
due_date: 2023-01-07
priority_id: 6
status_id: 14
relevant_version_id:
expected_version_id:
estimated_time: 17.0
archived: false
created_at: 2021-09-25 22:11:12.000000000 Z
updated_at: 2022-01-26 22:11:12.000000000 Z
task_00523:
id: 523
title: dolores delectus
description: Iure tenetur cum aut optio et quia similique debitis.
created_by_id: 19
project_id: 4
due_date: 2022-10-11
priority_id:
status_id: 15
relevant_version_id:
expected_version_id: 14
estimated_time: 8.0
archived: false
created_at: 2021-11-16 22:11:12.000000000 Z
updated_at: 2021-11-20 22:11:12.000000000 Z
task_00524:
id: 524
title: quod dolor inventore
description: Atque omnis fugiat totam dolorum.
created_by_id: 13
project_id: 4
due_date: 2022-12-29
priority_id: 9
status_id: 15
relevant_version_id: 16
expected_version_id: 15
estimated_time: 8.0
archived: true
created_at: 2021-10-07 22:11:12.000000000 Z
updated_at: 2022-01-25 22:11:12.000000000 Z
task_00525:
id: 525
title: at et
description: Aut unde porro veritatis debitis sint.
created_by_id: 18
project_id: 4
due_date: 2022-11-05
priority_id:
status_id: 13
relevant_version_id: 12
expected_version_id: 14
estimated_time: 17.0
archived: false
created_at: 2021-09-16 22:11:12.000000000 Z
updated_at: 2021-12-08 22:11:12.000000000 Z
task_00526:
id: 526
title: quibusdam temporibus et
description: Amet laudantium aut labore ut consequatur sunt.
created_by_id: 15
project_id: 4
due_date: 2022-08-14
priority_id:
status_id: 12
relevant_version_id:
expected_version_id:
estimated_time: 14.0
archived: false
created_at: 2021-11-05 22:11:12.000000000 Z
updated_at: 2022-01-22 22:11:12.000000000 Z
task_00527:
id: 527
title: voluptates corporis velit
description: Ratione ea amet quam enim illo.
created_by_id: 14
project_id: 5
due_date: 2023-03-24
priority_id:
status_id: 15
relevant_version_id:
expected_version_id: 18
estimated_time: 3.0
archived: false
created_at: 2021-10-11 22:11:12.000000000 Z
updated_at: 2022-01-06 22:11:12.000000000 Z
task_00528:
id: 528
title: omnis perferendis et
description: Aut nobis quod dolore.
created_by_id: 16
project_id: 6
due_date: 2022-07-02
priority_id: 9
status_id: 16
relevant_version_id:
expected_version_id: 21
estimated_time: 19.0
archived: false
created_at: 2021-10-04 22:11:12.000000000 Z
updated_at: 2021-11-22 22:11:12.000000000 Z
task_00529:
id: 529
title: dolor et corporis
description: Voluptate occaecati quisquam in et qui nostrum eos minus.
created_by_id: 20
project_id: 6
due_date: 2022-08-19
priority_id: 6
status_id: 16
relevant_version_id: 22
expected_version_id:
estimated_time: 16.0
archived: false
created_at: 2021-09-27 22:11:12.000000000 Z
updated_at: 2022-01-26 22:11:12.000000000 Z
task_00530:
id: 530
title: sint adipisci
description: Consequatur omnis similique quidem quia a.
created_by_id: 22
project_id: 5
due_date: 2023-01-16
priority_id: 10
status_id: 18
relevant_version_id:
expected_version_id: 19
estimated_time: 16.0
archived: false
created_at: 2021-09-09 22:11:12.000000000 Z
updated_at: 2021-11-26 22:11:12.000000000 Z
task_00531:
id: 531
title: veniam tempora
description: Rerum magni similique eum architecto ea aspernatur.
created_by_id: 18
project_id: 5
due_date: 2022-10-13
priority_id: 6
status_id: 15
relevant_version_id:
expected_version_id:
estimated_time: 12.0
archived: false
created_at: 2021-08-18 22:11:12.000000000 Z
updated_at: 2022-01-30 22:11:12.000000000 Z
task_00532:
id: 532
title: ducimus
description: Tempore nesciunt ullam consequatur est magnam deserunt voluptatem nam.
created_by_id: 21
project_id: 5
due_date: 2022-06-12
priority_id:
status_id: 17
relevant_version_id: 18
expected_version_id:
estimated_time: 4.0
archived: false
created_at: 2021-11-05 22:11:12.000000000 Z
updated_at: 2022-01-04 22:11:12.000000000 Z
task_00533:
id: 533
title: fugit unde eligendi
description: Et nobis occaecati impedit fugit.
created_by_id: 13
project_id: 4
due_date: 2022-12-10
priority_id:
status_id: 18
relevant_version_id: 14
expected_version_id: 12
estimated_time: 1.0
archived: true
created_at: 2021-11-09 22:11:12.000000000 Z
updated_at: 2022-01-30 22:11:12.000000000 Z
task_00534:
id: 534
title: corporis expedita vel
description: Dolore quibusdam et eos earum expedita veniam excepturi.
created_by_id: 13
project_id: 4
due_date: 2022-11-19
priority_id:
status_id: 13
relevant_version_id:
expected_version_id: 12
estimated_time: 10.0
archived: false
created_at: 2021-11-13 22:11:12.000000000 Z
updated_at: 2022-01-23 22:11:12.000000000 Z
task_00535:
id: 535
title: temporibus et
description: Quia quasi maiores suscipit fugit ipsam.
created_by_id: 22
project_id: 5
due_date: 2022-07-15
priority_id: 9
status_id: 17
relevant_version_id: 17
expected_version_id:
estimated_time: 20.0
archived: false
created_at: 2021-09-23 22:11:12.000000000 Z
updated_at: 2022-02-16 22:11:12.000000000 Z
task_00536:
id: 536
title: et
description: Est et mollitia sed et possimus.
created_by_id: 23
project_id: 4
due_date: 2023-03-29
priority_id: 8
status_id: 12
relevant_version_id:
expected_version_id: 15
estimated_time: 10.0
archived: false
created_at: 2021-11-15 22:11:12.000000000 Z
updated_at: 2021-12-31 22:11:12.000000000 Z
task_00537:
id: 537
title: ut ipsum excepturi
description: Cumque repellat dignissimos voluptatem aspernatur perspiciatis quis.
created_by_id: 22
project_id: 4
due_date: 2022-11-09
priority_id:
status_id: 11
relevant_version_id: 12
expected_version_id:
estimated_time: 8.0
archived: false
created_at: 2021-10-02 22:11:12.000000000 Z
updated_at: 2021-12-17 22:11:12.000000000 Z
task_00538:
id: 538
title: commodi neque aut
description: Vel magnam minus aut modi voluptatem consequuntur molestias.
created_by_id: 20
project_id: 6
due_date: 2022-07-11
priority_id: 10
status_id: 12
relevant_version_id:
expected_version_id: 22
estimated_time: 20.0
archived: false
created_at: 2021-09-10 22:11:12.000000000 Z
updated_at: 2022-02-11 22:11:12.000000000 Z
task_00539:
id: 539
title: mollitia veritatis
description: Cum dolorum iusto quia.
created_by_id: 16
project_id: 4
due_date: 2023-01-29
priority_id: 10
status_id: 17
relevant_version_id: 16
expected_version_id: 14
estimated_time: 6.0
archived: false
created_at: 2021-08-11 22:11:12.000000000 Z
updated_at: 2021-12-24 22:11:12.000000000 Z
task_00540:
id: 540
title: inventore architecto aut
description: Possimus quia dolores tenetur voluptatem ipsa ipsum est.
created_by_id: 13
project_id: 4
due_date: 2022-12-13
priority_id: 6
status_id: 11
relevant_version_id: 14
expected_version_id:
estimated_time: 14.0
archived: false
created_at: 2021-08-22 22:11:12.000000000 Z
updated_at: 2021-11-30 22:11:12.000000000 Z
task_00541:
id: 541
title: fuga dolorem placeat
description: Molestiae voluptates accusamus quo aut rerum et eum.
created_by_id: 24
project_id: 5
due_date: 2023-03-30
priority_id:
status_id: 10
relevant_version_id: 17
expected_version_id: 19
estimated_time: 7.0
archived: false
created_at: 2021-08-14 22:11:12.000000000 Z
updated_at: 2022-01-30 22:11:12.000000000 Z
task_00542:
id: 542
title: accusantium
description: Odio ut ipsam aut dolorem in quod dicta hic.
created_by_id: 16
project_id: 4
due_date: 2022-12-31
priority_id: 10
status_id: 15
relevant_version_id: 12
expected_version_id: 12
estimated_time: 16.0
archived: false
created_at: 2021-09-06 22:11:12.000000000 Z
updated_at: 2021-12-01 22:11:12.000000000 Z
task_00543:
id: 543
title: velit quasi aperiam
description: In libero assumenda qui.
created_by_id: 16
project_id: 6
due_date: 2022-09-13
priority_id:
status_id: 14
relevant_version_id: 21
expected_version_id:
estimated_time: 6.0
archived: false
created_at: 2021-10-08 22:11:12.000000000 Z
updated_at: 2021-11-20 22:11:12.000000000 Z
task_00544:
id: 544
title: maiores nesciunt
description: Ullam doloremque nisi rerum non non itaque esse adipisci.
created_by_id: 16
project_id: 6
due_date: 2022-06-14
priority_id: 9
status_id: 14
relevant_version_id: 22
expected_version_id: 21
estimated_time: 12.0
archived: false
created_at: 2021-08-29 22:11:12.000000000 Z
updated_at: 2021-12-21 22:11:12.000000000 Z
task_00545:
id: 545
title: velit sit
description: Officia quam odit voluptatem delectus debitis velit quibusdam eum.
created_by_id: 23
project_id: 4
due_date: 2022-08-18
priority_id: 8
status_id: 12
relevant_version_id: 12
expected_version_id:
estimated_time: 12.0
archived: false
created_at: 2021-08-27 22:11:12.000000000 Z
updated_at: 2022-01-07 22:11:12.000000000 Z
task_00546:
id: 546
title: qui animi
description: Quaerat aperiam in distinctio.
created_by_id: 18
project_id: 4
due_date: 2023-03-16
priority_id: 6
status_id: 14
relevant_version_id:
expected_version_id:
estimated_time: 3.0
archived: false
created_at: 2021-11-09 22:11:12.000000000 Z
updated_at: 2022-01-10 22:11:12.000000000 Z
task_00547:
id: 547
title: dolores
description: Ad sunt vel maxime labore temporibus incidunt quidem.
created_by_id: 21
project_id: 5
due_date: 2023-02-23
priority_id: 8
status_id: 13
relevant_version_id:
expected_version_id:
estimated_time: 1.0
archived: false
created_at: 2021-11-13 22:11:12.000000000 Z
updated_at: 2022-01-26 22:11:12.000000000 Z
task_00548:
id: 548
title: adipisci ullam
description: Vel quas dolores nobis.
created_by_id: 16
project_id: 6
due_date: 2022-11-22
priority_id:
status_id: 16
relevant_version_id:
expected_version_id:
estimated_time: 7.0
archived: false
created_at: 2021-11-16 22:11:12.000000000 Z
updated_at: 2021-12-24 22:11:12.000000000 Z
task_00549:
id: 549
title: alias
description: Dicta sit necessitatibus ut dolorem.
created_by_id: 14
project_id: 5
due_date: 2022-07-27
priority_id: 7
status_id: 12
relevant_version_id:
expected_version_id:
estimated_time: 16.0
archived: false
created_at: 2021-10-08 22:11:12.000000000 Z
updated_at: 2021-12-24 22:11:12.000000000 Z
task_00550:
id: 550
title: velit aliquam
description: Ut quidem neque qui.
created_by_id: 14
project_id: 5
due_date: 2022-08-29
priority_id:
status_id: 14
relevant_version_id: 18
expected_version_id: 19
estimated_time: 11.0
archived: true
created_at: 2021-10-09 22:11:12.000000000 Z
updated_at: 2021-12-30 22:11:12.000000000 Z
task_00551:
id: 551
title: doloremque
description: Adipisci illo alias eos reprehenderit.
created_by_id: 20
project_id: 6
due_date: 2022-06-30
priority_id: 6
status_id: 15
relevant_version_id:
expected_version_id: 20
estimated_time: 1.0
archived: false
created_at: 2021-09-25 22:11:12.000000000 Z
updated_at: 2022-01-15 22:11:12.000000000 Z
task_00552:
id: 552
title: est
description: Totam aut ex quia repudiandae dolor.
created_by_id: 17
project_id: 6
due_date: 2022-08-05
priority_id:
status_id: 14
relevant_version_id:
expected_version_id:
estimated_time: 10.0
archived: false
created_at: 2021-10-19 22:11:12.000000000 Z
updated_at: 2021-11-30 22:11:12.000000000 Z
task_00553:
id: 553
title: voluptas id
description: Accusamus voluptas sunt deleniti iusto dolorem repudiandae.
created_by_id: 20
project_id: 6
due_date: 2022-09-26
priority_id:
status_id: 10
relevant_version_id: 22
expected_version_id:
estimated_time: 7.0
archived: false
created_at: 2021-08-28 22:11:12.000000000 Z
updated_at: 2022-01-06 22:11:12.000000000 Z
task_00554:
id: 554
title: necessitatibus in
description: Inventore iure eos labore ipsum.
created_by_id: 22
project_id: 4
due_date: 2022-10-02
priority_id: 8
status_id: 18
relevant_version_id:
expected_version_id:
estimated_time: 20.0
archived: false
created_at: 2021-08-18 22:11:12.000000000 Z
updated_at: 2021-12-07 22:11:12.000000000 Z
task_00555:
id: 555
title: numquam nisi vero
description: Dolorum consequatur non molestias.
created_by_id: 17
project_id: 4
due_date: 2023-02-09
priority_id:
status_id: 13
relevant_version_id: 15
expected_version_id: 14
estimated_time: 3.0
archived: false
created_at: 2021-08-27 22:11:12.000000000 Z
updated_at: 2022-02-10 22:11:12.000000000 Z
task_00556:
id: 556
title: quia exercitationem
description: Adipisci voluptate sed esse velit.
created_by_id: 20
project_id: 6
due_date: 2023-02-02
priority_id: 10
status_id: 16
relevant_version_id:
expected_version_id: 20
estimated_time: 8.0
archived: false
created_at: 2021-09-29 22:11:12.000000000 Z
updated_at: 2022-01-23 22:11:12.000000000 Z
================================================
FILE: spec/fixtures/tasks_users.yml
================================================
---
join_00000:
task_id: 1
user_id: 10
join_00001:
task_id: 2
user_id: 5
join_00002:
task_id: 2
user_id: 4
join_00003:
task_id: 3
user_id: 1
join_00004:
task_id: 7
user_id: 6
join_00005:
task_id: 7
user_id: 7
join_00006:
task_id: 9
user_id: 6
join_00007:
task_id: 9
user_id: 7
join_00008:
task_id: 10
user_id: 1
join_00009:
task_id: 11
user_id: 7
join_00010:
task_id: 13
user_id: 10
join_00011:
task_id: 14
user_id: 5
join_00012:
task_id: 15
user_id: 6
join_00013:
task_id: 17
user_id: 6
join_00014:
task_id: 17
user_id: 10
join_00015:
task_id: 18
user_id: 1
join_00016:
task_id: 19
user_id: 9
join_00017:
task_id: 20
user_id: 8
join_00018:
task_id: 20
user_id: 1
join_00019:
task_id: 22
user_id: 6
join_00020:
task_id: 22
user_id: 12
join_00021:
task_id: 23
user_id: 8
join_00022:
task_id: 23
user_id: 11
join_00023:
task_id: 23
user_id: 4
join_00024:
task_id: 25
user_id: 10
join_00025:
task_id: 26
user_id: 10
join_00026:
task_id: 26
user_id: 4
join_00027:
task_id: 28
user_id: 5
join_00028:
task_id: 30
user_id: 7
join_00029:
task_id: 30
user_id: 12
join_00030:
task_id: 30
user_id: 10
join_00031:
task_id: 33
user_id: 9
join_00032:
task_id: 34
user_id: 5
join_00033:
task_id: 35
user_id: 5
join_00034:
task_id: 35
user_id: 1
join_00035:
task_id: 35
user_id: 6
join_00036:
task_id: 37
user_id: 8
join_00037:
task_id: 40
user_id: 5
join_00038:
task_id: 43
user_id: 11
join_00039:
task_id: 43
user_id: 2
join_00040:
task_id: 44
user_id: 6
join_00041:
task_id: 44
user_id: 8
join_00042:
task_id: 45
user_id: 10
join_00043:
task_id: 45
user_id: 1
join_00044:
task_id: 46
user_id: 12
join_00045:
task_id: 46
user_id: 3
join_00046:
task_id: 46
user_id: 7
join_00047:
task_id: 48
user_id: 6
join_00048:
task_id: 49
user_id: 6
join_00049:
task_id: 49
user_id: 7
join_00050:
task_id: 49
user_id: 3
join_00051:
task_id: 51
user_id: 5
join_00052:
task_id: 51
user_id: 2
join_00053:
task_id: 52
user_id: 10
join_00054:
task_id: 55
user_id: 10
join_00055:
task_id: 57
user_id: 8
join_00056:
task_id: 60
user_id: 8
join_00057:
task_id: 61
user_id: 9
join_00058:
task_id: 61
user_id: 8
join_00059:
task_id: 61
user_id: 3
join_00060:
task_id: 62
user_id: 1
join_00061:
task_id: 63
user_id: 8
join_00062:
task_id: 64
user_id: 8
join_00063:
task_id: 64
user_id: 5
join_00064:
task_id: 65
user_id: 7
join_00065:
task_id: 65
user_id: 6
join_00066:
task_id: 69
user_id: 12
join_00067:
task_id: 69
user_id: 10
join_00068:
task_id: 70
user_id: 3
join_00069:
task_id: 70
user_id: 9
join_00070:
task_id: 70
user_id: 6
join_00071:
task_id: 73
user_id: 8
join_00072:
task_id: 75
user_id: 3
join_00073:
task_id: 78
user_id: 1
join_00074:
task_id: 78
user_id: 8
join_00075:
task_id: 79
user_id: 8
join_00076:
task_id: 79
user_id: 11
join_00077:
task_id: 81
user_id: 5
join_00078:
task_id: 82
user_id: 8
join_00079:
task_id: 82
user_id: 1
join_00080:
task_id: 83
user_id: 3
join_00081:
task_id: 83
user_id: 6
join_00082:
task_id: 84
user_id: 2
join_00083:
task_id: 85
user_id: 2
join_00084:
task_id: 88
user_id: 7
join_00085:
task_id: 88
user_id: 3
join_00086:
task_id: 90
user_id: 12
join_00087:
task_id: 90
user_id: 6
join_00088:
task_id: 92
user_id: 8
join_00089:
task_id: 92
user_id: 11
join_00090:
task_id: 92
user_id: 2
join_00091:
task_id: 93
user_id: 2
join_00092:
task_id: 94
user_id: 12
join_00093:
task_id: 94
user_id: 10
join_00094:
task_id: 95
user_id: 6
join_00095:
task_id: 95
user_id: 3
join_00096:
task_id: 95
user_id: 10
join_00097:
task_id: 96
user_id: 6
join_00098:
task_id: 98
user_id: 5
join_00099:
task_id: 98
user_id: 8
join_00100:
task_id: 99
user_id: 3
join_00101:
task_id: 99
user_id: 10
join_00102:
task_id: 99
user_id: 6
join_00103:
task_id: 101
user_id: 12
join_00104:
task_id: 101
user_id: 10
join_00105:
task_id: 101
user_id: 6
join_00106:
task_id: 102
user_id: 11
join_00107:
task_id: 102
user_id: 5
join_00108:
task_id: 104
user_id: 8
join_00109:
task_id: 104
user_id: 6
join_00110:
task_id: 105
user_id: 8
join_00111:
task_id: 105
user_id: 4
join_00112:
task_id: 105
user_id: 5
join_00113:
task_id: 106
user_id: 5
join_00114:
task_id: 106
user_id: 8
join_00115:
task_id: 107
user_id: 6
join_00116:
task_id: 107
user_id: 8
join_00117:
task_id: 108
user_id: 7
join_00118:
task_id: 108
user_id: 10
join_00119:
task_id: 110
user_id: 7
join_00120:
task_id: 110
user_id: 6
join_00121:
task_id: 112
user_id: 6
join_00122:
task_id: 112
user_id: 10
join_00123:
task_id: 113
user_id: 5
join_00124:
task_id: 113
user_id: 10
join_00125:
task_id: 113
user_id: 11
join_00126:
task_id: 115
user_id: 8
join_00127:
task_id: 115
user_id: 9
join_00128:
task_id: 116
user_id: 4
join_00129:
task_id: 117
user_id: 6
join_00130:
task_id: 117
user_id: 7
join_00131:
task_id: 117
user_id: 3
join_00132:
task_id: 119
user_id: 6
join_00133:
task_id: 119
user_id: 10
join_00134:
task_id: 119
user_id: 3
join_00135:
task_id: 120
user_id: 12
join_00136:
task_id: 120
user_id: 6
join_00137:
task_id: 120
user_id: 10
join_00138:
task_id: 121
user_id: 8
join_00139:
task_id: 121
user_id: 5
join_00140:
task_id: 122
user_id: 10
join_00141:
task_id: 122
user_id: 6
join_00142:
task_id: 123
user_id: 7
join_00143:
task_id: 124
user_id: 4
join_00144:
task_id: 124
user_id: 11
join_00145:
task_id: 124
user_id: 5
join_00146:
task_id: 125
user_id: 11
join_00147:
task_id: 125
user_id: 10
join_00148:
task_id: 128
user_id: 11
join_00149:
task_id: 128
user_id: 8
join_00150:
task_id: 129
user_id: 7
join_00151:
task_id: 132
user_id: 8
join_00152:
task_id: 133
user_id: 7
join_00153:
task_id: 133
user_id: 12
join_00154:
task_id: 134
user_id: 11
join_00155:
task_id: 134
user_id: 4
join_00156:
task_id: 136
user_id: 12
join_00157:
task_id: 138
user_id: 6
join_00158:
task_id: 138
user_id: 9
join_00159:
task_id: 139
user_id: 4
join_00160:
task_id: 141
user_id: 8
join_00161:
task_id: 142
user_id: 8
join_00162:
task_id: 142
user_id: 5
join_00163:
task_id: 143
user_id: 8
join_00164:
task_id: 143
user_id: 4
join_00165:
task_id: 144
user_id: 2
join_00166:
task_id: 145
user_id: 8
join_00167:
task_id: 145
user_id: 1
join_00168:
task_id: 146
user_id: 5
join_00169:
task_id: 147
user_id: 1
join_00170:
task_id: 147
user_id: 9
join_00171:
task_id: 148
user_id: 2
join_00172:
task_id: 148
user_id: 11
join_00173:
task_id: 149
user_id: 3
join_00174:
task_id: 149
user_id: 10
join_00175:
task_id: 149
user_id: 12
join_00176:
task_id: 150
user_id: 6
join_00177:
task_id: 150
user_id: 10
join_00178:
task_id: 151
user_id: 10
join_00179:
task_id: 152
user_id: 8
join_00180:
task_id: 152
user_id: 11
join_00181:
task_id: 153
user_id: 7
join_00182:
task_id: 154
user_id: 6
join_00183:
task_id: 155
user_id: 6
join_00184:
task_id: 155
user_id: 10
join_00185:
task_id: 155
user_id: 3
join_00186:
task_id: 156
user_id: 11
join_00187:
task_id: 156
user_id: 4
join_00188:
task_id: 157
user_id: 6
join_00189:
task_id: 157
user_id: 1
join_00190:
task_id: 158
user_id: 6
join_00191:
task_id: 159
user_id: 9
join_00192:
task_id: 159
user_id: 8
join_00193:
task_id: 160
user_id: 6
join_00194:
task_id: 161
user_id: 5
join_00195:
task_id: 161
user_id: 6
join_00196:
task_id: 164
user_id: 8
join_00197:
task_id: 164
user_id: 5
join_00198:
task_id: 165
user_id: 8
join_00199:
task_id: 165
user_id: 1
join_00200:
task_id: 165
user_id: 5
join_00201:
task_id: 166
user_id: 11
join_00202:
task_id: 166
user_id: 8
join_00203:
task_id: 167
user_id: 10
join_00204:
task_id: 167
user_id: 8
join_00205:
task_id: 167
user_id: 9
join_00206:
task_id: 168
user_id: 7
join_00207:
task_id: 168
user_id: 6
join_00208:
task_id: 168
user_id: 12
join_00209:
task_id: 169
user_id: 12
join_00210:
task_id: 169
user_id: 6
join_00211:
task_id: 170
user_id: 3
join_00212:
task_id: 170
user_id: 6
join_00213:
task_id: 171
user_id: 11
join_00214:
task_id: 171
user_id: 8
join_00215:
task_id: 171
user_id: 2
join_00216:
task_id: 172
user_id: 11
join_00217:
task_id: 172
user_id: 8
join_00218:
task_id: 173
user_id: 10
join_00219:
task_id: 173
user_id: 7
join_00220:
task_id: 174
user_id: 1
join_00221:
task_id: 175
user_id: 9
join_00222:
task_id: 176
user_id: 8
join_00223:
task_id: 176
user_id: 3
join_00224:
task_id: 176
user_id: 5
join_00225:
task_id: 178
user_id: 6
join_00226:
task_id: 182
user_id: 8
join_00227:
task_id: 182
user_id: 9
join_00228:
task_id: 183
user_id: 6
join_00229:
task_id: 183
user_id: 7
join_00230:
task_id: 183
user_id: 10
join_00231:
task_id: 184
user_id: 8
join_00232:
task_id: 184
user_id: 4
join_00233:
task_id: 185
user_id: 10
join_00234:
task_id: 185
user_id: 5
join_00235:
task_id: 185
user_id: 4
join_00236:
task_id: 186
user_id: 10
join_00237:
task_id: 188
user_id: 6
join_00238:
task_id: 190
user_id: 1
join_00239:
task_id: 190
user_id: 10
join_00240:
task_id: 190
user_id: 5
join_00241:
task_id: 191
user_id: 3
join_00242:
task_id: 191
user_id: 9
join_00243:
task_id: 192
user_id: 1
join_00244:
task_id: 194
user_id: 6
join_00245:
task_id: 196
user_id: 12
join_00246:
task_id: 197
user_id: 3
join_00247:
task_id: 198
user_id: 1
join_00248:
task_id: 198
user_id: 3
join_00249:
task_id: 199
user_id: 10
join_00250:
task_id: 200
user_id: 11
join_00251:
task_id: 201
user_id: 3
join_00252:
task_id: 201
user_id: 7
join_00253:
task_id: 201
user_id: 6
join_00254:
task_id: 203
user_id: 4
join_00255:
task_id: 203
user_id: 8
join_00256:
task_id: 205
user_id: 11
join_00257:
task_id: 206
user_id: 12
join_00258:
task_id: 206
user_id: 7
join_00259:
task_id: 206
user_id: 6
join_00260:
task_id: 207
user_id: 6
join_00261:
task_id: 207
user_id: 10
join_00262:
task_id: 209
user_id: 12
join_00263:
task_id: 209
user_id: 3
join_00264:
task_id: 210
user_id: 9
join_00265:
task_id: 211
user_id: 6
join_00266:
task_id: 211
user_id: 8
join_00267:
task_id: 212
user_id: 7
join_00268:
task_id: 212
user_id: 10
join_00269:
task_id: 212
user_id: 3
join_00270:
task_id: 213
user_id: 8
join_00271:
task_id: 213
user_id: 11
join_00272:
task_id: 215
user_id: 7
join_00273:
task_id: 216
user_id: 8
join_00274:
task_id: 216
user_id: 10
join_00275:
task_id: 216
user_id: 11
join_00276:
task_id: 217
user_id: 9
join_00277:
task_id: 217
user_id: 1
join_00278:
task_id: 217
user_id: 6
join_00279:
task_id: 218
user_id: 3
join_00280:
task_id: 218
user_id: 6
join_00281:
task_id: 220
user_id: 3
join_00282:
task_id: 220
user_id: 8
join_00283:
task_id: 221
user_id: 1
join_00284:
task_id: 222
user_id: 6
join_00285:
task_id: 222
user_id: 10
join_00286:
task_id: 223
user_id: 7
join_00287:
task_id: 225
user_id: 10
join_00288:
task_id: 226
user_id: 10
join_00289:
task_id: 227
user_id: 7
join_00290:
task_id: 227
user_id: 3
join_00291:
task_id: 228
user_id: 8
join_00292:
task_id: 231
user_id: 7
join_00293:
task_id: 233
user_id: 11
join_00294:
task_id: 235
user_id: 11
join_00295:
task_id: 235
user_id: 4
join_00296:
task_id: 235
user_id: 10
join_00297:
task_id: 236
user_id: 5
join_00298:
task_id: 236
user_id: 6
join_00299:
task_id: 237
user_id: 9
join_00300:
task_id: 237
user_id: 8
join_00301:
task_id: 238
user_id: 7
join_00302:
task_id: 239
user_id: 12
join_00303:
task_id: 239
user_id: 10
join_00304:
task_id: 241
user_id: 8
join_00305:
task_id: 242
user_id: 11
join_00306:
task_id: 242
user_id: 8
join_00307:
task_id: 244
user_id: 7
join_00308:
task_id: 245
user_id: 5
join_00309:
task_id: 245
user_id: 10
join_00310:
task_id: 246
user_id: 3
join_00311:
task_id: 248
user_id: 6
join_00312:
task_id: 249
user_id: 6
join_00313:
task_id: 249
user_id: 10
join_00314:
task_id: 250
user_id: 12
join_00315:
task_id: 252
user_id: 7
join_00316:
task_id: 254
user_id: 10
join_00317:
task_id: 254
user_id: 2
join_00318:
task_id: 254
user_id: 4
join_00319:
task_id: 255
user_id: 6
join_00320:
task_id: 256
user_id: 6
join_00321:
task_id: 257
user_id: 6
join_00322:
task_id: 258
user_id: 7
join_00323:
task_id: 258
user_id: 6
join_00324:
task_id: 260
user_id: 6
join_00325:
task_id: 261
user_id: 10
join_00326:
task_id: 261
user_id: 4
join_00327:
task_id: 262
user_id: 3
join_00328:
task_id: 262
user_id: 5
join_00329:
task_id: 262
user_id: 8
join_00330:
task_id: 263
user_id: 4
join_00331:
task_id: 264
user_id: 10
join_00332:
task_id: 264
user_id: 5
join_00333:
task_id: 264
user_id: 4
join_00334:
task_id: 265
user_id: 5
join_00335:
task_id: 266
user_id: 10
join_00336:
task_id: 269
user_id: 3
join_00337:
task_id: 270
user_id: 10
join_00338:
task_id: 270
user_id: 5
join_00339:
task_id: 272
user_id: 3
join_00340:
task_id: 273
user_id: 1
join_00341:
task_id: 273
user_id: 6
join_00342:
task_id: 274
user_id: 4
join_00343:
task_id: 274
user_id: 8
join_00344:
task_id: 277
user_id: 10
join_00345:
task_id: 278
user_id: 1
join_00346:
task_id: 278
user_id: 6
join_00347:
task_id: 279
user_id: 1
join_00348:
task_id: 280
user_id: 2
join_00349:
task_id: 280
user_id: 4
join_00350:
task_id: 281
user_id: 6
join_00351:
task_id: 281
user_id: 7
join_00352:
task_id: 282
user_id: 6
join_00353:
task_id: 282
user_id: 9
join_00354:
task_id: 282
user_id: 1
join_00355:
task_id: 285
user_id: 1
join_00356:
task_id: 287
user_id: 3
join_00357:
task_id: 287
user_id: 7
join_00358:
task_id: 289
user_id: 3
join_00359:
task_id: 290
user_id: 10
join_00360:
task_id: 291
user_id: 2
join_00361:
task_id: 291
user_id: 8
join_00362:
task_id: 291
user_id: 10
join_00363:
task_id: 294
user_id: 9
join_00364:
task_id: 294
user_id: 1
join_00365:
task_id: 296
user_id: 1
join_00366:
task_id: 296
user_id: 6
join_00367:
task_id: 298
user_id: 8
join_00368:
task_id: 298
user_id: 11
join_00369:
task_id: 298
user_id: 2
join_00370:
task_id: 301
user_id: 8
join_00371:
task_id: 302
user_id: 6
join_00372:
task_id: 303
user_id: 6
join_00373:
task_id: 304
user_id: 8
join_00374:
task_id: 304
user_id: 11
join_00375:
task_id: 305
user_id: 8
join_00376:
task_id: 306
user_id: 1
join_00377:
task_id: 306
user_id: 9
join_00378:
task_id: 307
user_id: 5
join_00379:
task_id: 307
user_id: 6
join_00380:
task_id: 307
user_id: 1
join_00381:
task_id: 308
user_id: 6
join_00382:
task_id: 309
user_id: 11
join_00383:
task_id: 309
user_id: 10
join_00384:
task_id: 310
user_id: 3
join_00385:
task_id: 310
user_id: 7
join_00386:
task_id: 311
user_id: 7
join_00387:
task_id: 311
user_id: 10
join_00388:
task_id: 314
user_id: 5
join_00389:
task_id: 315
user_id: 7
join_00390:
task_id: 317
user_id: 10
join_00391:
task_id: 317
user_id: 3
join_00392:
task_id: 318
user_id: 10
join_00393:
task_id: 319
user_id: 8
join_00394:
task_id: 321
user_id: 6
join_00395:
task_id: 321
user_id: 3
join_00396:
task_id: 321
user_id: 10
join_00397:
task_id: 322
user_id: 5
join_00398:
task_id: 322
user_id: 11
join_00399:
task_id: 323
user_id: 8
join_00400:
task_id: 324
user_id: 6
join_00401:
task_id: 324
user_id: 3
join_00402:
task_id: 326
user_id: 3
join_00403:
task_id: 326
user_id: 6
join_00404:
task_id: 327
user_id: 11
join_00405:
task_id: 327
user_id: 5
join_00406:
task_id: 327
user_id: 8
join_00407:
task_id: 328
user_id: 5
join_00408:
task_id: 328
user_id: 10
join_00409:
task_id: 328
user_id: 8
join_00410:
task_id: 330
user_id: 2
join_00411:
task_id: 331
user_id: 3
join_00412:
task_id: 334
user_id: 8
join_00413:
task_id: 334
user_id: 11
join_00414:
task_id: 334
user_id: 4
join_00415:
task_id: 336
user_id: 8
join_00416:
task_id: 337
user_id: 7
join_00417:
task_id: 340
user_id: 8
join_00418:
task_id: 340
user_id: 11
join_00419:
task_id: 341
user_id: 4
join_00420:
task_id: 341
user_id: 8
join_00421:
task_id: 343
user_id: 5
join_00422:
task_id: 344
user_id: 3
join_00423:
task_id: 344
user_id: 10
join_00424:
task_id: 346
user_id: 8
join_00425:
task_id: 346
user_id: 1
join_00426:
task_id: 346
user_id: 6
join_00427:
task_id: 347
user_id: 7
join_00428:
task_id: 347
user_id: 12
join_00429:
task_id: 347
user_id: 3
join_00430:
task_id: 348
user_id: 8
join_00431:
task_id: 349
user_id: 1
join_00432:
task_id: 349
user_id: 3
join_00433:
task_id: 349
user_id: 6
join_00434:
task_id: 353
user_id: 11
join_00435:
task_id: 353
user_id: 2
join_00436:
task_id: 354
user_id: 10
join_00437:
task_id: 356
user_id: 5
join_00438:
task_id: 356
user_id: 2
join_00439:
task_id: 356
user_id: 8
join_00440:
task_id: 357
user_id: 7
join_00441:
task_id: 358
user_id: 6
join_00442:
task_id: 358
user_id: 1
join_00443:
task_id: 359
user_id: 1
join_00444:
task_id: 360
user_id: 10
join_00445:
task_id: 361
user_id: 3
join_00446:
task_id: 364
user_id: 5
join_00447:
task_id: 367
user_id: 7
join_00448:
task_id: 367
user_id: 6
join_00449:
task_id: 367
user_id: 3
join_00450:
task_id: 370
user_id: 9
join_00451:
task_id: 370
user_id: 5
join_00452:
task_id: 371
user_id: 7
join_00453:
task_id: 371
user_id: 6
join_00454:
task_id: 372
user_id: 1
join_00455:
task_id: 373
user_id: 3
join_00456:
task_id: 374
user_id: 11
join_00457:
task_id: 375
user_id: 1
join_00458:
task_id: 375
user_id: 6
join_00459:
task_id: 376
user_id: 11
join_00460:
task_id: 376
user_id: 10
join_00461:
task_id: 377
user_id: 1
join_00462:
task_id: 378
user_id: 3
join_00463:
task_id: 378
user_id: 7
join_00464:
task_id: 379
user_id: 6
join_00465:
task_id: 380
user_id: 7
join_00466:
task_id: 380
user_id: 12
join_00467:
task_id: 381
user_id: 10
join_00468:
task_id: 381
user_id: 9
join_00469:
task_id: 381
user_id: 6
join_00470:
task_id: 382
user_id: 9
join_00471:
task_id: 382
user_id: 8
join_00472:
task_id: 383
user_id: 7
join_00473:
task_id: 384
user_id: 7
join_00474:
task_id: 385
user_id: 9
join_00475:
task_id: 387
user_id: 1
join_00476:
task_id: 387
user_id: 8
join_00477:
task_id: 387
user_id: 6
join_00478:
task_id: 391
user_id: 2
join_00479:
task_id: 392
user_id: 6
join_00480:
task_id: 393
user_id: 11
join_00481:
task_id: 393
user_id: 4
join_00482:
task_id: 395
user_id: 12
join_00483:
task_id: 395
user_id: 10
join_00484:
task_id: 396
user_id: 10
join_00485:
task_id: 398
user_id: 3
join_00486:
task_id: 399
user_id: 6
join_00487:
task_id: 399
user_id: 10
join_00488:
task_id: 400
user_id: 8
join_00489:
task_id: 400
user_id: 5
join_00490:
task_id: 401
user_id: 3
join_00491:
task_id: 401
user_id: 6
join_00492:
task_id: 402
user_id: 2
join_00493:
task_id: 402
user_id: 5
join_00494:
task_id: 402
user_id: 4
join_00495:
task_id: 403
user_id: 9
join_00496:
task_id: 403
user_id: 1
join_00497:
task_id: 403
user_id: 8
join_00498:
task_id: 404
user_id: 9
join_00499:
task_id: 405
user_id: 11
join_00500:
task_id: 405
user_id: 8
join_00501:
task_id: 406
user_id: 6
join_00502:
task_id: 406
user_id: 5
join_00503:
task_id: 406
user_id: 9
join_00504:
task_id: 407
user_id: 3
join_00505:
task_id: 407
user_id: 7
join_00506:
task_id: 408
user_id: 7
join_00507:
task_id: 408
user_id: 3
join_00508:
task_id: 409
user_id: 4
join_00509:
task_id: 410
user_id: 8
join_00510:
task_id: 410
user_id: 3
join_00511:
task_id: 411
user_id: 6
join_00512:
task_id: 411
user_id: 12
join_00513:
task_id: 412
user_id: 7
join_00514:
task_id: 412
user_id: 3
join_00515:
task_id: 414
user_id: 9
join_00516:
task_id: 414
user_id: 1
join_00517:
task_id: 414
user_id: 5
join_00518:
task_id: 415
user_id: 8
join_00519:
task_id: 415
user_id: 10
join_00520:
task_id: 417
user_id: 9
join_00521:
task_id: 418
user_id: 5
join_00522:
task_id: 418
user_id: 4
join_00523:
task_id: 418
user_id: 11
join_00524:
task_id: 420
user_id: 10
join_00525:
task_id: 420
user_id: 7
join_00526:
task_id: 421
user_id: 10
join_00527:
task_id: 421
user_id: 8
join_00528:
task_id: 422
user_id: 5
join_00529:
task_id: 422
user_id: 8
join_00530:
task_id: 422
user_id: 2
join_00531:
task_id: 423
user_id: 12
join_00532:
task_id: 425
user_id: 8
join_00533:
task_id: 426
user_id: 11
join_00534:
task_id: 427
user_id: 3
join_00535:
task_id: 427
user_id: 6
join_00536:
task_id: 430
user_id: 11
join_00537:
task_id: 430
user_id: 10
join_00538:
task_id: 431
user_id: 8
join_00539:
task_id: 434
user_id: 4
join_00540:
task_id: 435
user_id: 3
join_00541:
task_id: 438
user_id: 10
join_00542:
task_id: 440
user_id: 3
join_00543:
task_id: 440
user_id: 7
join_00544:
task_id: 442
user_id: 7
join_00545:
task_id: 442
user_id: 3
join_00546:
task_id: 443
user_id: 7
join_00547:
task_id: 444
user_id: 8
join_00548:
task_id: 444
user_id: 2
join_00549:
task_id: 448
user_id: 3
join_00550:
task_id: 448
user_id: 7
join_00551:
task_id: 449
user_id: 1
join_00552:
task_id: 449
user_id: 6
join_00553:
task_id: 450
user_id: 10
join_00554:
task_id: 450
user_id: 7
join_00555:
task_id: 451
user_id: 7
join_00556:
task_id: 452
user_id: 5
join_00557:
task_id: 454
user_id: 8
join_00558:
task_id: 456
user_id: 10
join_00559:
task_id: 458
user_id: 3
join_00560:
task_id: 459
user_id: 5
join_00561:
task_id: 461
user_id: 10
join_00562:
task_id: 461
user_id: 11
join_00563:
task_id: 462
user_id: 11
join_00564:
task_id: 463
user_id: 8
join_00565:
task_id: 463
user_id: 5
join_00566:
task_id: 465
user_id: 12
join_00567:
task_id: 465
user_id: 10
join_00568:
task_id: 465
user_id: 7
join_00569:
task_id: 466
user_id: 6
join_00570:
task_id: 466
user_id: 8
join_00571:
task_id: 466
user_id: 1
join_00572:
task_id: 467
user_id: 7
join_00573:
task_id: 468
user_id: 8
join_00574:
task_id: 468
user_id: 5
join_00575:
task_id: 469
user_id: 8
join_00576:
task_id: 469
user_id: 10
join_00577:
task_id: 469
user_id: 6
join_00578:
task_id: 470
user_id: 10
join_00579:
task_id: 470
user_id: 1
join_00580:
task_id: 470
user_id: 3
join_00581:
task_id: 471
user_id: 8
join_00582:
task_id: 471
user_id: 11
join_00583:
task_id: 472
user_id: 5
join_00584:
task_id: 472
user_id: 1
join_00585:
task_id: 473
user_id: 8
join_00586:
task_id: 473
user_id: 2
join_00587:
task_id: 473
user_id: 4
join_00588:
task_id: 475
user_id: 10
join_00589:
task_id: 475
user_id: 6
join_00590:
task_id: 476
user_id: 10
join_00591:
task_id: 476
user_id: 1
join_00592:
task_id: 476
user_id: 3
join_00593:
task_id: 479
user_id: 9
join_00594:
task_id: 479
user_id: 10
join_00595:
task_id: 480
user_id: 2
join_00596:
task_id: 480
user_id: 11
join_00597:
task_id: 481
user_id: 8
join_00598:
task_id: 481
user_id: 3
join_00599:
task_id: 483
user_id: 1
join_00600:
task_id: 483
user_id: 3
join_00601:
task_id: 484
user_id: 10
join_00602:
task_id: 486
user_id: 6
join_00603:
task_id: 487
user_id: 6
join_00604:
task_id: 488
user_id: 12
join_00605:
task_id: 488
user_id: 10
join_00606:
task_id: 490
user_id: 8
join_00607:
task_id: 491
user_id: 12
join_00608:
task_id: 491
user_id: 3
join_00609:
task_id: 491
user_id: 10
join_00610:
task_id: 492
user_id: 10
join_00611:
task_id: 492
user_id: 8
join_00612:
task_id: 493
user_id: 8
join_00613:
task_id: 493
user_id: 10
join_00614:
task_id: 494
user_id: 8
join_00615:
task_id: 494
user_id: 11
join_00616:
task_id: 497
user_id: 10
join_00617:
task_id: 498
user_id: 11
join_00618:
task_id: 498
user_id: 4
join_00619:
task_id: 500
user_id: 5
join_00620:
task_id: 500
user_id: 4
join_00621:
task_id: 501
user_id: 3
join_00622:
task_id: 501
user_id: 7
join_00623:
task_id: 502
user_id: 6
join_00624:
task_id: 503
user_id: 6
join_00625:
task_id: 505
user_id: 5
join_00626:
task_id: 505
user_id: 2
join_00627:
task_id: 506
user_id: 7
join_00628:
task_id: 508
user_id: 22
join_00629:
task_id: 510
user_id: 16
join_00630:
task_id: 510
user_id: 14
join_00631:
task_id: 511
user_id: 22
join_00632:
task_id: 512
user_id: 18
join_00633:
task_id: 512
user_id: 21
join_00634:
task_id: 513
user_id: 22
join_00635:
task_id: 513
user_id: 14
join_00636:
task_id: 514
user_id: 14
join_00637:
task_id: 515
user_id: 18
join_00638:
task_id: 517
user_id: 16
join_00639:
task_id: 518
user_id: 20
join_00640:
task_id: 519
user_id: 16
join_00641:
task_id: 520
user_id: 14
join_00642:
task_id: 520
user_id: 16
join_00643:
task_id: 522
user_id: 23
join_00644:
task_id: 522
user_id: 18
join_00645:
task_id: 522
user_id: 13
join_00646:
task_id: 523
user_id: 13
join_00647:
task_id: 524
user_id: 19
join_00648:
task_id: 525
user_id: 22
join_00649:
task_id: 526
user_id: 15
join_00650:
task_id: 526
user_id: 19
join_00651:
task_id: 527
user_id: 18
join_00652:
task_id: 527
user_id: 22
join_00653:
task_id: 528
user_id: 20
join_00654:
task_id: 528
user_id: 14
join_00655:
task_id: 528
user_id: 17
join_00656:
task_id: 529
user_id: 16
join_00657:
task_id: 529
user_id: 17
join_00658:
task_id: 531
user_id: 14
join_00659:
task_id: 532
user_id: 14
join_00660:
task_id: 532
user_id: 22
join_00661:
task_id: 532
user_id: 21
join_00662:
task_id: 534
user_id: 13
join_00663:
task_id: 534
user_id: 22
join_00664:
task_id: 534
user_id: 15
join_00665:
task_id: 535
user_id: 21
join_00666:
task_id: 535
user_id: 22
join_00667:
task_id: 536
user_id: 15
join_00668:
task_id: 536
user_id: 13
join_00669:
task_id: 536
user_id: 17
join_00670:
task_id: 537
user_id: 15
join_00671:
task_id: 537
user_id: 16
join_00672:
task_id: 538
user_id: 14
join_00673:
task_id: 538
user_id: 17
join_00674:
task_id: 538
user_id: 16
join_00675:
task_id: 539
user_id: 16
join_00676:
task_id: 539
user_id: 23
join_00677:
task_id: 539
user_id: 13
join_00678:
task_id: 540
user_id: 17
join_00679:
task_id: 541
user_id: 22
join_00680:
task_id: 541
user_id: 14
join_00681:
task_id: 541
user_id: 18
join_00682:
task_id: 542
user_id: 17
join_00683:
task_id: 542
user_id: 18
join_00684:
task_id: 543
user_id: 17
join_00685:
task_id: 545
user_id: 17
join_00686:
task_id: 546
user_id: 17
join_00687:
task_id: 546
user_id: 13
join_00688:
task_id: 548
user_id: 20
join_00689:
task_id: 549
user_id: 21
join_00690:
task_id: 549
user_id: 24
join_00691:
task_id: 551
user_id: 20
join_00692:
task_id: 554
user_id: 22
join_00693:
task_id: 554
user_id: 19
join_00694:
task_id: 555
user_id: 18
join_00695:
task_id: 555
user_id: 23
================================================
FILE: spec/fixtures/users.yml
================================================
---
user_00013:
id: 13
name: Wikus van de Merwe
created_at: 2022-02-26 22:11:12.000000000 Z
updated_at: 2022-02-26 22:11:12.000000000 Z
user_00014:
id: 14
name: Grey Bradnam
created_at: 2022-02-26 22:11:12.000000000 Z
updated_at: 2022-02-26 22:11:12.000000000 Z
user_00015:
id: 15
name: Christopher Johnson
created_at: 2022-02-26 22:11:12.000000000 Z
updated_at: 2022-02-26 22:11:12.000000000 Z
user_00016:
id: 16
name: Piet Smit
created_at: 2022-02-26 22:11:12.000000000 Z
updated_at: 2022-02-26 22:11:12.000000000 Z
user_00017:
id: 17
name: Fundiswa Mhlanga
created_at: 2022-02-26 22:11:12.000000000 Z
updated_at: 2022-02-26 22:11:12.000000000 Z
user_00018:
id: 18
name: Tania van de Merwe
created_at: 2022-02-26 22:11:12.000000000 Z
updated_at: 2022-02-26 22:11:12.000000000 Z
user_00019:
id: 19
name: Obesandjo
created_at: 2022-02-26 22:11:12.000000000 Z
updated_at: 2022-02-26 22:11:12.000000000 Z
user_00020:
id: 20
name: Dirk Michaels
created_at: 2022-02-26 22:11:12.000000000 Z
updated_at: 2022-02-26 22:11:12.000000000 Z
user_00021:
id: 21
name: Ross Pienaar
created_at: 2022-02-26 22:11:12.000000000 Z
updated_at: 2022-02-26 22:11:12.000000000 Z
user_00022:
id: 22
name: Koobus Venter
created_at: 2022-02-26 22:11:12.000000000 Z
updated_at: 2022-02-26 22:11:12.000000000 Z
user_00023:
id: 23
name: Dirk Michaels
created_at: 2022-02-26 22:11:12.000000000 Z
updated_at: 2022-02-26 22:11:12.000000000 Z
user_00024:
id: 24
name: Sarah Livingstone
created_at: 2022-02-26 22:11:12.000000000 Z
updated_at: 2022-02-26 22:11:12.000000000 Z
================================================
FILE: spec/fixtures/versions.yml
================================================
---
version_00012:
id: 12
name: '1.0'
project_id: 4
status: development
created_at: 2022-02-26 22:11:12.000000000 Z
updated_at: 2022-02-26 22:11:12.000000000 Z
version_00013:
id: 13
name: '1.1'
project_id: 4
status: development
created_at: 2022-02-26 22:11:12.000000000 Z
updated_at: 2022-02-26 22:11:12.000000000 Z
version_00014:
id: 14
name: '1.2'
project_id: 4
status: production
created_at: 2022-02-26 22:11:12.000000000 Z
updated_at: 2022-02-26 22:11:12.000000000 Z
version_00015:
id: 15
name: '2.0'
project_id: 4
status: testing
created_at: 2022-02-26 22:11:12.000000000 Z
updated_at: 2022-02-26 22:11:12.000000000 Z
version_00016:
id: 16
name: '3.0'
project_id: 4
status: production
created_at: 2022-02-26 22:11:12.000000000 Z
updated_at: 2022-02-26 22:11:12.000000000 Z
version_00017:
id: 17
name: '1.0'
project_id: 5
status: development
created_at: 2022-02-26 22:11:12.000000000 Z
updated_at: 2022-02-26 22:11:12.000000000 Z
version_00018:
id: 18
name: '88.1'
project_id: 5
status: production
created_at: 2022-02-26 22:11:12.000000000 Z
updated_at: 2022-02-26 22:11:12.000000000 Z
version_00019:
id: 19
name: '99.0'
project_id: 5
status: production
created_at: 2022-02-26 22:11:12.000000000 Z
updated_at: 2022-02-26 22:11:12.000000000 Z
version_00020:
id: 20
name: '6.0'
project_id: 6
status: testing
created_at: 2022-02-26 22:11:12.000000000 Z
updated_at: 2022-02-26 22:11:12.000000000 Z
version_00021:
id: 21
name: '7.1'
project_id: 6
status: production
created_at: 2022-02-26 22:11:12.000000000 Z
updated_at: 2022-02-26 22:11:12.000000000 Z
version_00022:
id: 22
name: '8.0'
project_id: 6
status: testing
created_at: 2022-02-26 22:11:12.000000000 Z
updated_at: 2022-02-26 22:11:12.000000000 Z
================================================
FILE: spec/models/company_spec.rb
================================================
require 'rails_helper'
describe Company do
it { is_expected.to have_many(:supplier_projects)}
it { is_expected.to have_many(:customer_projects)}
end
================================================
FILE: spec/models/priority_spec.rb
================================================
require 'rails_helper'
describe Priority do
it { is_expected.to have_many(:tasks)}
end
================================================
FILE: spec/models/project_spec.rb
================================================
require 'rails_helper'
describe Project do
it {is_expected.to have_many(:tasks)}
it { is_expected.to have_many(:tasks)}
it { is_expected.to have_many(:user_project_participations)}
it { is_expected.to have_many(:users)}
it { is_expected.to have_many(:versions)}
it { is_expected.to belong_to(:customer)}
it { is_expected.to belong_to(:supplier)}
end
================================================
FILE: spec/models/status_spec.rb
================================================
require 'rails_helper'
describe Status do
it {is_expected.to have_many(:tasks) }
end
================================================
FILE: spec/models/task_spec.rb
================================================
require 'rails_helper'
describe Task do
it { is_expected.to belong_to(:created_by)}
it { is_expected.to belong_to(:project)}
it { is_expected.to belong_to(:priority)}
it { is_expected.to belong_to(:status)}
it { is_expected.to belong_to(:relevant_version)}
it { is_expected.to belong_to(:expected_version)}
it { is_expected.to have_and_belong_to_many(:assigned_users)}
end
================================================
FILE: spec/models/user_project_participation_spec.rb
================================================
require 'rails_helper'
describe UserProjectParticipation do
it { is_expected.to belong_to(:user)}
it { is_expected.to belong_to(:project)}
it { is_expected.to belong_to(:project_role)}
end
================================================
FILE: spec/models/user_spec.rb
================================================
require 'rails_helper'
describe User do
it { is_expected.to have_many(:created_tasks)}
it { is_expected.to have_and_belong_to_many(:assigned_tasks)}
it { is_expected.to have_many(:user_project_participations)}
it { is_expected.to have_many(:projects)}
end
================================================
FILE: spec/models/version_spec.rb
================================================
require 'rails_helper'
describe Version do
it { is_expected.to belong_to(:project)}
end
================================================
FILE: spec/rails_helper.rb
================================================
require 'rails/all'
require 'spec_helper'
require 'shoulda/matchers'
require 'support/test_app/config/environment'
require 'support/download_helper'
require 'rspec/rails'
require 'selenium-webdriver' if ENV['BROWSER']
ActiveRecord::Migration.maintain_test_schema!
# set up db
# be sure to update the schema if required by doing
# - cd spec/support/rails_app
# - rake db:migrate
ActiveRecord::Schema.verbose = false
load 'support/test_app/db/schema.rb' # db agnostic
RSpec.configure do |config|
# If you're not using ActiveRecord, or you'd prefer not to run each of your
# examples within a transaction, remove the following line or assign false
# instead of true.
config.use_transactional_fixtures = true
# You can uncomment this line to turn off ActiveRecord support entirely.
# config.use_active_record = false
# RSpec Rails can automatically mix in different behaviours to your tests
# based on their file location, for example enabling you to call `get` and
# `post` in specs under `spec/controllers`.
#
# You can disable this behaviour by removing the line below, and instead
# explicitly tag your specs with their type, e.g.:
#
# RSpec.describe UsersController, type: :controller do
# # ...
# end
#
# The different available types are documented in the features, such as in
# https://rspec.info/features/6-0/rspec-rails
config.infer_spec_type_from_file_location!
# Filter lines from Rails gems in backtraces.
config.filter_rails_from_backtrace!
# arbitrary gems may also be filtered via:
# config.filter_gems_from_backtrace("gem name")
config.include Shoulda::Matchers::ActiveModel, type: :model
config.include Shoulda::Matchers::ActiveRecord, type: :model
end
Capybara.register_driver :selenium do |app|
profile = Selenium::WebDriver::Firefox::Profile.new
profile['browser.download.dir'] = DownloadHelpers::PATH.to_s
profile['browser.download.folderList'] = 2
# Suppress "open with" dialog
profile['browser.helperApps.neverAsk.saveToDisk'] = 'text/csv'
profile['browser.startup.homepage'] = 'about:blank' # workaround bug in Selenium 4 alpha4-7
profile['accessibility.tabfocus'] = 7 # make tab move over links too
options = Selenium::WebDriver::Firefox::Options.new
options.profile = profile
version = Capybara::Selenium::Driver.load_selenium
options_key = Capybara::Selenium::Driver::CAPS_VERSION.satisfied_by?(version) ? :capabilities : :options
driver_options = { browser: :firefox, timeout: 31 }.tap do |opts|
opts[options_key] = options
# Get a trace level log from geckodriver
# :driver_opts => { args: ['-vv'] }
end
Capybara::Selenium::Driver.new(app, **driver_options)
end
================================================
FILE: spec/schema.rb
================================================
ActiveRecord::Schema.define(version: 20150713103513) do
create_table 'dummies', force: :cascade do |t|
t.string 'name'
t.datetime 'created_at'
t.datetime 'updated_at'
end
end
================================================
FILE: spec/spec_helper.rb
================================================
# This file was generated by the `rspec --init` command. Conventionally, all
# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
# The generated `.rspec` file contains `--require spec_helper` which will cause
# this file to always be loaded, without a need to explicitly require it in any
# files.
#
# Given that it is always loaded, you are encouraged to keep this file as
# light-weight as possible. Requiring heavyweight dependencies from this file
# will add to the boot time of your test suite on EVERY test run, even for an
# individual file that may not need all of that loaded. Instead, consider making
# a separate helper file that requires the additional dependencies and performs
# the additional setup, and require it from the spec files that actually need
# it.
#
# The `.rspec` file also contains a few flags that are not defaults but that
# users commonly want.
#
# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
require 'rspec'
require 'simplecov'
require 'byebug'
SimpleCov.start do
formatter = SimpleCov::Formatter::MultiFormatter.new([
SimpleCov::Formatter::HTMLFormatter
])
add_filter "/spec/"
minimum_coverage 87.53
end
begin
require 'support/active_record'
require 'action_controller'
require 'action_view'
require 'csv'
ActiveRecord::Base.logger = Logger.new(STDOUT)
rescue LoadError
puts 'LoadError'
end
$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__) + '/../lib'))
require 'wice_grid'
ActiveRecord::ConnectionAdapters::Column.send(:include, ::Wice::WiceGridExtentionToActiveRecordColumn)
::Wice.on_action_view_load
RSpec.configure do |config|
# rspec-expectations config goes here. You can use an alternate
# assertion/expectation library such as wrong or the stdlib/minitest
# assertions if you prefer.
config.expect_with :rspec do |expectations|
# This option will default to `true` in RSpec 4. It makes the `description`
# and `failure_message` of custom matchers include text for helper methods
# defined using `chain`, e.g.:
# be_bigger_than(2).and_smaller_than(4).description
# # => "be bigger than 2 and smaller than 4"
# ...rather than:
# # => "be bigger than 2"
expectations.include_chain_clauses_in_custom_matcher_descriptions = true
end
# rspec-mocks config goes here. You can use an alternate test double
# library (such as bogus or mocha) by changing the `mock_with` option here.
config.mock_with :rspec do |mocks|
# Prevents you from mocking or stubbing a method that does not exist on
# a real object. This is generally recommended, and will default to
# `true` in RSpec 4.
mocks.verify_partial_doubles = true
end
config.before(:each) do
DownloadHelpers::clear_downloads
end
end
================================================
FILE: spec/support/active_record.rb
================================================
require 'active_record'
ActiveRecord::Base.establish_connection adapter: 'sqlite3', database: ':memory:'
load 'spec/schema.rb'
class Dummy < ActiveRecord::Base
end
Dummy.create(name: 'test')
================================================
FILE: spec/support/download_helper.rb
================================================
module DownloadHelpers
TIMEOUT = 1
PATH = Rails.root.join("tmp/downloads")
extend self
def downloads
Dir[PATH.join("*")]
end
def download
downloads.first
end
def download_content
wait_for_download
File.read(download)
end
def wait_for_download
Timeout.timeout(TIMEOUT) do
sleep 0.1 until downloaded?
end
end
def downloaded?
!downloading? && downloads.any?
end
def downloading?
downloads.grep(/\.part$/).any?
end
def clear_downloads
FileUtils.rm_f(downloads)
end
end
================================================
FILE: spec/support/test_app/Rakefile
================================================
require_relative 'config/application'
Examples::TestApp.load_tasks
================================================
FILE: spec/support/test_app/app/assets/builds/.keep
================================================
================================================
FILE: spec/support/test_app/app/assets/builds/application.css
================================================
@charset "UTF-8";
/*
* This is a manifest file that'll be compiled into application.css, which will include all the files
* listed below.
*
* Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
* or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path.
*
* You're free to add application-wide styles to this file and they'll appear at the top of the
* compiled file, but it's generally better to create a new file per style scope.
*
*= require_self
*= require_tree .
*= require jquery-ui/humanity
*/
/*!
* Bootstrap v5.3.3 (https://getbootstrap.com/)
* Copyright 2011-2024 The Bootstrap Authors
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/
:root,
[data-bs-theme=light] {
--bs-blue: #0d6efd;
--bs-indigo: #6610f2;
--bs-purple: #6f42c1;
--bs-pink: #d63384;
--bs-red: #dc3545;
--bs-orange: #fd7e14;
--bs-yellow: #ffc107;
--bs-green: #198754;
--bs-teal: #20c997;
--bs-cyan: #0dcaf0;
--bs-black: #000;
--bs-white: #fff;
--bs-gray: #6c757d;
--bs-gray-dark: #343a40;
--bs-gray-100: #f8f9fa;
--bs-gray-200: #e9ecef;
--bs-gray-300: #dee2e6;
--bs-gray-400: #ced4da;
--bs-gray-500: #adb5bd;
--bs-gray-600: #6c757d;
--bs-gray-700: #495057;
--bs-gray-800: #343a40;
--bs-gray-900: #212529;
--bs-primary: #0d6efd;
--bs-secondary: #6c757d;
--bs-success: #198754;
--bs-info: #0dcaf0;
--bs-warning: #ffc107;
--bs-danger: #dc3545;
--bs-light: #f8f9fa;
--bs-dark: #212529;
--bs-primary-rgb: 13, 110, 253;
--bs-secondary-rgb: 108, 117, 125;
--bs-success-rgb: 25, 135, 84;
--bs-info-rgb: 13, 202, 240;
--bs-warning-rgb: 255, 193, 7;
--bs-danger-rgb: 220, 53, 69;
--bs-light-rgb: 248, 249, 250;
--bs-dark-rgb: 33, 37, 41;
--bs-primary-text-emphasis: #052c65;
--bs-secondary-text-emphasis: #2b2f32;
--bs-success-text-emphasis: #0a3622;
--bs-info-text-emphasis: #055160;
--bs-warning-text-emphasis: #664d03;
--bs-danger-text-emphasis: #58151c;
--bs-light-text-emphasis: #495057;
--bs-dark-text-emphasis: #495057;
--bs-primary-bg-subtle: #cfe2ff;
--bs-secondary-bg-subtle: #e2e3e5;
--bs-success-bg-subtle: #d1e7dd;
--bs-info-bg-subtle: #cff4fc;
--bs-warning-bg-subtle: #fff3cd;
--bs-danger-bg-subtle: #f8d7da;
--bs-light-bg-subtle: #fcfcfd;
--bs-dark-bg-subtle: #ced4da;
--bs-primary-border-subtle: #9ec5fe;
--bs-secondary-border-subtle: #c4c8cb;
--bs-success-border-subtle: #a3cfbb;
--bs-info-border-subtle: #9eeaf9;
--bs-warning-border-subtle: #ffe69c;
--bs-danger-border-subtle: #f1aeb5;
--bs-light-border-subtle: #e9ecef;
--bs-dark-border-subtle: #adb5bd;
--bs-white-rgb: 255, 255, 255;
--bs-black-rgb: 0, 0, 0;
--bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
--bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
--bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));
--bs-body-font-family: var(--bs-font-sans-serif);
--bs-body-font-size: 1rem;
--bs-body-font-weight: 400;
--bs-body-line-height: 1.5;
--bs-body-color: #212529;
--bs-body-color-rgb: 33, 37, 41;
--bs-body-bg: #fff;
--bs-body-bg-rgb: 255, 255, 255;
--bs-emphasis-color: #000;
--bs-emphasis-color-rgb: 0, 0, 0;
--bs-secondary-color: rgba(33, 37, 41, 0.75);
--bs-secondary-color-rgb: 33, 37, 41;
--bs-secondary-bg: #e9ecef;
--bs-secondary-bg-rgb: 233, 236, 239;
--bs-tertiary-color: rgba(33, 37, 41, 0.5);
--bs-tertiary-color-rgb: 33, 37, 41;
--bs-tertiary-bg: #f8f9fa;
--bs-tertiary-bg-rgb: 248, 249, 250;
--bs-heading-color: inherit;
--bs-link-color: #0d6efd;
--bs-link-color-rgb: 13, 110, 253;
--bs-link-decoration: underline;
--bs-link-hover-color: #0a58ca;
--bs-link-hover-color-rgb: 10, 88, 202;
--bs-code-color: #d63384;
--bs-highlight-color: #212529;
--bs-highlight-bg: #fff3cd;
--bs-border-width: 1px;
--bs-border-style: solid;
--bs-border-color: #dee2e6;
--bs-border-color-translucent: rgba(0, 0, 0, 0.175);
--bs-border-radius: 0.375rem;
--bs-border-radius-sm: 0.25rem;
--bs-border-radius-lg: 0.5rem;
--bs-border-radius-xl: 1rem;
--bs-border-radius-xxl: 2rem;
--bs-border-radius-2xl: var(--bs-border-radius-xxl);
--bs-border-radius-pill: 50rem;
--bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
--bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);
--bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175);
--bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);
--bs-focus-ring-width: 0.25rem;
--bs-focus-ring-opacity: 0.25;
--bs-focus-ring-color: rgba(13, 110, 253, 0.25);
--bs-form-valid-color: #198754;
--bs-form-valid-border-color: #198754;
--bs-form-invalid-color: #dc3545;
--bs-form-invalid-border-color: #dc3545;
}
[data-bs-theme=dark] {
color-scheme: dark;
--bs-body-color: #dee2e6;
--bs-body-color-rgb: 222, 226, 230;
--bs-body-bg: #212529;
--bs-body-bg-rgb: 33, 37, 41;
--bs-emphasis-color: #fff;
--bs-emphasis-color-rgb: 255, 255, 255;
--bs-secondary-color: rgba(222, 226, 230, 0.75);
--bs-secondary-color-rgb: 222, 226, 230;
--bs-secondary-bg: #343a40;
--bs-secondary-bg-rgb: 52, 58, 64;
--bs-tertiary-color: rgba(222, 226, 230, 0.5);
--bs-tertiary-color-rgb: 222, 226, 230;
--bs-tertiary-bg: #2b3035;
--bs-tertiary-bg-rgb: 43, 48, 53;
--bs-primary-text-emphasis: #6ea8fe;
--bs-secondary-text-emphasis: #a7acb1;
--bs-success-text-emphasis: #75b798;
--bs-info-text-emphasis: #6edff6;
--bs-warning-text-emphasis: #ffda6a;
--bs-danger-text-emphasis: #ea868f;
--bs-light-text-emphasis: #f8f9fa;
--bs-dark-text-emphasis: #dee2e6;
--bs-primary-bg-subtle: #031633;
--bs-secondary-bg-subtle: #161719;
--bs-success-bg-subtle: #051b11;
--bs-info-bg-subtle: #032830;
--bs-warning-bg-subtle: #332701;
--bs-danger-bg-subtle: #2c0b0e;
--bs-light-bg-subtle: #343a40;
--bs-dark-bg-subtle: #1a1d20;
--bs-primary-border-subtle: #084298;
--bs-secondary-border-subtle: #41464b;
--bs-success-border-subtle: #0f5132;
--bs-info-border-subtle: #087990;
--bs-warning-border-subtle: #997404;
--bs-danger-border-subtle: #842029;
--bs-light-border-subtle: #495057;
--bs-dark-border-subtle: #343a40;
--bs-heading-color: inherit;
--bs-link-color: #6ea8fe;
--bs-link-hover-color: #8bb9fe;
--bs-link-color-rgb: 110, 168, 254;
--bs-link-hover-color-rgb: 139, 185, 254;
--bs-code-color: #e685b5;
--bs-highlight-color: #dee2e6;
--bs-highlight-bg: #664d03;
--bs-border-color: #495057;
--bs-border-color-translucent: rgba(255, 255, 255, 0.15);
--bs-form-valid-color: #75b798;
--bs-form-valid-border-color: #75b798;
--bs-form-invalid-color: #ea868f;
--bs-form-invalid-border-color: #ea868f;
}
*,
*::before,
*::after {
box-sizing: border-box;
}
@media (prefers-reduced-motion: no-preference) {
:root {
scroll-behavior: smooth;
}
}
body {
margin: 0;
font-family: var(--bs-body-font-family);
font-size: var(--bs-body-font-size);
font-weight: var(--bs-body-font-weight);
line-height: var(--bs-body-line-height);
color: var(--bs-body-color);
text-align: var(--bs-body-text-align);
background-color: var(--bs-body-bg);
-webkit-text-size-adjust: 100%;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
hr {
margin: 1rem 0;
color: inherit;
border: 0;
border-top: var(--bs-border-width) solid;
opacity: 0.25;
}
h6, .h6, h5, .h5, h4, .h4, h3, .h3, h2, .h2, h1, .h1 {
margin-top: 0;
margin-bottom: 0.5rem;
font-weight: 500;
line-height: 1.2;
color: var(--bs-heading-color);
}
h1, .h1 {
font-size: calc(1.375rem + 1.5vw);
}
@media (min-width: 1200px) {
h1, .h1 {
font-size: 2.5rem;
}
}
h2, .h2 {
font-size: calc(1.325rem + 0.9vw);
}
@media (min-width: 1200px) {
h2, .h2 {
font-size: 2rem;
}
}
h3, .h3 {
font-size: calc(1.3rem + 0.6vw);
}
@media (min-width: 1200px) {
h3, .h3 {
font-size: 1.75rem;
}
}
h4, .h4 {
font-size: calc(1.275rem + 0.3vw);
}
@media (min-width: 1200px) {
h4, .h4 {
font-size: 1.5rem;
}
}
h5, .h5 {
font-size: 1.25rem;
}
h6, .h6 {
font-size: 1rem;
}
p {
margin-top: 0;
margin-bottom: 1rem;
}
abbr[title] {
text-decoration: underline dotted;
cursor: help;
text-decoration-skip-ink: none;
}
address {
margin-bottom: 1rem;
font-style: normal;
line-height: inherit;
}
ol,
ul {
padding-left: 2rem;
}
ol,
ul,
dl {
margin-top: 0;
margin-bottom: 1rem;
}
ol ol,
ul ul,
ol ul,
ul ol {
margin-bottom: 0;
}
dt {
font-weight: 700;
}
dd {
margin-bottom: 0.5rem;
margin-left: 0;
}
blockquote {
margin: 0 0 1rem;
}
b,
strong {
font-weight: bolder;
}
small, .small {
font-size: 0.875em;
}
mark, .mark {
padding: 0.1875em;
color: var(--bs-highlight-color);
background-color: var(--bs-highlight-bg);
}
sub,
sup {
position: relative;
font-size: 0.75em;
line-height: 0;
vertical-align: baseline;
}
sub {
bottom: -0.25em;
}
sup {
top: -0.5em;
}
a {
color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1));
text-decoration: underline;
}
a:hover {
--bs-link-color-rgb: var(--bs-link-hover-color-rgb);
}
a:not([href]):not([class]), a:not([href]):not([class]):hover {
color: inherit;
text-decoration: none;
}
pre,
code,
kbd,
samp {
font-family: var(--bs-font-monospace);
font-size: 1em;
}
pre {
display: block;
margin-top: 0;
margin-bottom: 1rem;
overflow: auto;
font-size: 0.875em;
}
pre code {
font-size: inherit;
color: inherit;
word-break: normal;
}
code {
font-size: 0.875em;
color: var(--bs-code-color);
word-wrap: break-word;
}
a > code {
color: inherit;
}
kbd {
padding: 0.1875rem 0.375rem;
font-size: 0.875em;
color: var(--bs-body-bg);
background-color: var(--bs-body-color);
border-radius: 0.25rem;
}
kbd kbd {
padding: 0;
font-size: 1em;
}
figure {
margin: 0 0 1rem;
}
img,
svg {
vertical-align: middle;
}
table {
caption-side: bottom;
border-collapse: collapse;
}
caption {
padding-top: 0.5rem;
padding-bottom: 0.5rem;
color: var(--bs-secondary-color);
text-align: left;
}
th {
text-align: inherit;
text-align: -webkit-match-parent;
}
thead,
tbody,
tfoot,
tr,
td,
th {
border-color: inherit;
border-style: solid;
border-width: 0;
}
label {
display: inline-block;
}
button {
border-radius: 0;
}
button:focus:not(:focus-visible) {
outline: 0;
}
input,
button,
select,
optgroup,
textarea {
margin: 0;
font-family: inherit;
font-size: inherit;
line-height: inherit;
}
button,
select {
text-transform: none;
}
[role=button] {
cursor: pointer;
}
select {
word-wrap: normal;
}
select:disabled {
opacity: 1;
}
[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator {
display: none !important;
}
button,
[type=button],
[type=reset],
[type=submit] {
-webkit-appearance: button;
}
button:not(:disabled),
[type=button]:not(:disabled),
[type=reset]:not(:disabled),
[type=submit]:not(:disabled) {
cursor: pointer;
}
::-moz-focus-inner {
padding: 0;
border-style: none;
}
textarea {
resize: vertical;
}
fieldset {
min-width: 0;
padding: 0;
margin: 0;
border: 0;
}
legend {
float: left;
width: 100%;
padding: 0;
margin-bottom: 0.5rem;
font-size: calc(1.275rem + 0.3vw);
line-height: inherit;
}
@media (min-width: 1200px) {
legend {
font-size: 1.5rem;
}
}
legend + * {
clear: left;
}
::-webkit-datetime-edit-fields-wrapper,
::-webkit-datetime-edit-text,
::-webkit-datetime-edit-minute,
::-webkit-datetime-edit-hour-field,
::-webkit-datetime-edit-day-field,
::-webkit-datetime-edit-month-field,
::-webkit-datetime-edit-year-field {
padding: 0;
}
::-webkit-inner-spin-button {
height: auto;
}
[type=search] {
-webkit-appearance: textfield;
outline-offset: -2px;
}
/* rtl:raw:
[type="tel"],
[type="url"],
[type="email"],
[type="number"] {
direction: ltr;
}
*/
::-webkit-search-decoration {
-webkit-appearance: none;
}
::-webkit-color-swatch-wrapper {
padding: 0;
}
::file-selector-button {
font: inherit;
-webkit-appearance: button;
}
output {
display: inline-block;
}
iframe {
border: 0;
}
summary {
display: list-item;
cursor: pointer;
}
progress {
vertical-align: baseline;
}
[hidden] {
display: none !important;
}
.lead {
font-size: 1.25rem;
font-weight: 300;
}
.display-1 {
font-size: calc(1.625rem + 4.5vw);
font-weight: 300;
line-height: 1.2;
}
@media (min-width: 1200px) {
.display-1 {
font-size: 5rem;
}
}
.display-2 {
font-size: calc(1.575rem + 3.9vw);
font-weight: 300;
line-height: 1.2;
}
@media (min-width: 1200px) {
.display-2 {
font-size: 4.5rem;
}
}
.display-3 {
font-size: calc(1.525rem + 3.3vw);
font-weight: 300;
line-height: 1.2;
}
@media (min-width: 1200px) {
.display-3 {
font-size: 4rem;
}
}
.display-4 {
font-size: calc(1.475rem + 2.7vw);
font-weight: 300;
line-height: 1.2;
}
@media (min-width: 1200px) {
.display-4 {
font-size: 3.5rem;
}
}
.display-5 {
font-size: calc(1.425rem + 2.1vw);
font-weight: 300;
line-height: 1.2;
}
@media (min-width: 1200px) {
.display-5 {
font-size: 3rem;
}
}
.display-6 {
font-size: calc(1.375rem + 1.5vw);
font-weight: 300;
line-height: 1.2;
}
@media (min-width: 1200px) {
.display-6 {
font-size: 2.5rem;
}
}
.list-unstyled {
padding-left: 0;
list-style: none;
}
.list-inline {
padding-left: 0;
list-style: none;
}
.list-inline-item {
display: inline-block;
}
.list-inline-item:not(:last-child) {
margin-right: 0.5rem;
}
.initialism {
font-size: 0.875em;
text-transform: uppercase;
}
.blockquote {
margin-bottom: 1rem;
font-size: 1.25rem;
}
.blockquote > :last-child {
margin-bottom: 0;
}
.blockquote-footer {
margin-top: -1rem;
margin-bottom: 1rem;
font-size: 0.875em;
color: #6c757d;
}
.blockquote-footer::before {
content: "— ";
}
.img-fluid {
max-width: 100%;
height: auto;
}
.img-thumbnail {
padding: 0.25rem;
background-color: var(--bs-body-bg);
border: var(--bs-border-width) solid var(--bs-border-color);
border-radius: var(--bs-border-radius);
max-width: 100%;
height: auto;
}
.figure {
display: inline-block;
}
.figure-img {
margin-bottom: 0.5rem;
line-height: 1;
}
.figure-caption {
font-size: 0.875em;
color: var(--bs-secondary-color);
}
.container,
.container-fluid,
.container-xxl,
.container-xl,
.container-lg,
.container-md,
.container-sm {
--bs-gutter-x: 1.5rem;
--bs-gutter-y: 0;
width: 100%;
padding-right: calc(var(--bs-gutter-x) * 0.5);
padding-left: calc(var(--bs-gutter-x) * 0.5);
margin-right: auto;
margin-left: auto;
}
@media (min-width: 576px) {
.container-sm, .container {
max-width: 540px;
}
}
@media (min-width: 768px) {
.container-md, .container-sm, .container {
max-width: 720px;
}
}
@media (min-width: 992px) {
.container-lg, .container-md, .container-sm, .container {
max-width: 960px;
}
}
@media (min-width: 1200px) {
.container-xl, .container-lg, .container-md, .container-sm, .container {
max-width: 1140px;
}
}
@media (min-width: 1400px) {
.container-xxl, .container-xl, .container-lg, .container-md, .container-sm, .container {
max-width: 1320px;
}
}
:root {
--bs-breakpoint-xs: 0;
--bs-breakpoint-sm: 576px;
--bs-breakpoint-md: 768px;
--bs-breakpoint-lg: 992px;
--bs-breakpoint-xl: 1200px;
--bs-breakpoint-xxl: 1400px;
}
.row {
--bs-gutter-x: 1.5rem;
--bs-gutter-y: 0;
display: flex;
flex-wrap: wrap;
margin-top: calc(-1 * var(--bs-gutter-y));
margin-right: calc(-0.5 * var(--bs-gutter-x));
margin-left: calc(-0.5 * var(--bs-gutter-x));
}
.row > * {
flex-shrink: 0;
width: 100%;
max-width: 100%;
padding-right: calc(var(--bs-gutter-x) * 0.5);
padding-left: calc(var(--bs-gutter-x) * 0.5);
margin-top: var(--bs-gutter-y);
}
.col {
flex: 1 0 0%;
}
.row-cols-auto > * {
flex: 0 0 auto;
width: auto;
}
.row-cols-1 > * {
flex: 0 0 auto;
width: 100%;
}
.row-cols-2 > * {
flex: 0 0 auto;
width: 50%;
}
.row-cols-3 > * {
flex: 0 0 auto;
width: 33.33333333%;
}
.row-cols-4 > * {
flex: 0 0 auto;
width: 25%;
}
.row-cols-5 > * {
flex: 0 0 auto;
width: 20%;
}
.row-cols-6 > * {
flex: 0 0 auto;
width: 16.66666667%;
}
.col-auto {
flex: 0 0 auto;
width: auto;
}
.col-1 {
flex: 0 0 auto;
width: 8.33333333%;
}
.col-2 {
flex: 0 0 auto;
width: 16.66666667%;
}
.col-3 {
flex: 0 0 auto;
width: 25%;
}
.col-4 {
flex: 0 0 auto;
width: 33.33333333%;
}
.col-5 {
flex: 0 0 auto;
width: 41.66666667%;
}
.col-6 {
flex: 0 0 auto;
width: 50%;
}
.col-7 {
flex: 0 0 auto;
width: 58.33333333%;
}
.col-8 {
flex: 0 0 auto;
width: 66.66666667%;
}
.col-9 {
flex: 0 0 auto;
width: 75%;
}
.col-10 {
flex: 0 0 auto;
width: 83.33333333%;
}
.col-11 {
flex: 0 0 auto;
width: 91.66666667%;
}
.col-12 {
flex: 0 0 auto;
width: 100%;
}
.offset-1 {
margin-left: 8.33333333%;
}
.offset-2 {
margin-left: 16.66666667%;
}
.offset-3 {
margin-left: 25%;
}
.offset-4 {
margin-left: 33.33333333%;
}
.offset-5 {
margin-left: 41.66666667%;
}
.offset-6 {
margin-left: 50%;
}
.offset-7 {
margin-left: 58.33333333%;
}
.offset-8 {
margin-left: 66.66666667%;
}
.offset-9 {
margin-left: 75%;
}
.offset-10 {
margin-left: 83.33333333%;
}
.offset-11 {
margin-left: 91.66666667%;
}
.g-0,
.gx-0 {
--bs-gutter-x: 0;
}
.g-0,
.gy-0 {
--bs-gutter-y: 0;
}
.g-1,
.gx-1 {
--bs-gutter-x: 0.25rem;
}
.g-1,
.gy-1 {
--bs-gutter-y: 0.25rem;
}
.g-2,
.gx-2 {
--bs-gutter-x: 0.5rem;
}
.g-2,
.gy-2 {
--bs-gutter-y: 0.5rem;
}
.g-3,
.gx-3 {
--bs-gutter-x: 1rem;
}
.g-3,
.gy-3 {
--bs-gutter-y: 1rem;
}
.g-4,
.gx-4 {
--bs-gutter-x: 1.5rem;
}
.g-4,
.gy-4 {
--bs-gutter-y: 1.5rem;
}
.g-5,
.gx-5 {
--bs-gutter-x: 3rem;
}
.g-5,
.gy-5 {
--bs-gutter-y: 3rem;
}
@media (min-width: 576px) {
.col-sm {
flex: 1 0 0%;
}
.row-cols-sm-auto > * {
flex: 0 0 auto;
width: auto;
}
.row-cols-sm-1 > * {
flex: 0 0 auto;
width: 100%;
}
.row-cols-sm-2 > * {
flex: 0 0 auto;
width: 50%;
}
.row-cols-sm-3 > * {
flex: 0 0 auto;
width: 33.33333333%;
}
.row-cols-sm-4 > * {
flex: 0 0 auto;
width: 25%;
}
.row-cols-sm-5 > * {
flex: 0 0 auto;
width: 20%;
}
.row-cols-sm-6 > * {
flex: 0 0 auto;
width: 16.66666667%;
}
.col-sm-auto {
flex: 0 0 auto;
width: auto;
}
.col-sm-1 {
flex: 0 0 auto;
width: 8.33333333%;
}
.col-sm-2 {
flex: 0 0 auto;
width: 16.66666667%;
}
.col-sm-3 {
flex: 0 0 auto;
width: 25%;
}
.col-sm-4 {
flex: 0 0 auto;
width: 33.33333333%;
}
.col-sm-5 {
flex: 0 0 auto;
width: 41.66666667%;
}
.col-sm-6 {
flex: 0 0 auto;
width: 50%;
}
.col-sm-7 {
flex: 0 0 auto;
width: 58.33333333%;
}
.col-sm-8 {
flex: 0 0 auto;
width: 66.66666667%;
}
.col-sm-9 {
flex: 0 0 auto;
width: 75%;
}
.col-sm-10 {
flex: 0 0 auto;
width: 83.33333333%;
}
.col-sm-11 {
flex: 0 0 auto;
width: 91.66666667%;
}
.col-sm-12 {
flex: 0 0 auto;
width: 100%;
}
.offset-sm-0 {
margin-left: 0;
}
.offset-sm-1 {
margin-left: 8.33333333%;
}
.offset-sm-2 {
margin-left: 16.66666667%;
}
.offset-sm-3 {
margin-left: 25%;
}
.offset-sm-4 {
margin-left: 33.33333333%;
}
.offset-sm-5 {
margin-left: 41.66666667%;
}
.offset-sm-6 {
margin-left: 50%;
}
.offset-sm-7 {
margin-left: 58.33333333%;
}
.offset-sm-8 {
margin-left: 66.66666667%;
}
.offset-sm-9 {
margin-left: 75%;
}
.offset-sm-10 {
margin-left: 83.33333333%;
}
.offset-sm-11 {
margin-left: 91.66666667%;
}
.g-sm-0,
.gx-sm-0 {
--bs-gutter-x: 0;
}
.g-sm-0,
.gy-sm-0 {
--bs-gutter-y: 0;
}
.g-sm-1,
.gx-sm-1 {
--bs-gutter-x: 0.25rem;
}
.g-sm-1,
.gy-sm-1 {
--bs-gutter-y: 0.25rem;
}
.g-sm-2,
.gx-sm-2 {
--bs-gutter-x: 0.5rem;
}
.g-sm-2,
.gy-sm-2 {
--bs-gutter-y: 0.5rem;
}
.g-sm-3,
.gx-sm-3 {
--bs-gutter-x: 1rem;
}
.g-sm-3,
.gy-sm-3 {
--bs-gutter-y: 1rem;
}
.g-sm-4,
.gx-sm-4 {
--bs-gutter-x: 1.5rem;
}
.g-sm-4,
.gy-sm-4 {
--bs-gutter-y: 1.5rem;
}
.g-sm-5,
.gx-sm-5 {
--bs-gutter-x: 3rem;
}
.g-sm-5,
.gy-sm-5 {
--bs-gutter-y: 3rem;
}
}
@media (min-width: 768px) {
.col-md {
flex: 1 0 0%;
}
.row-cols-md-auto > * {
flex: 0 0 auto;
width: auto;
}
.row-cols-md-1 > * {
flex: 0 0 auto;
width: 100%;
}
.row-cols-md-2 > * {
flex: 0 0 auto;
width: 50%;
}
.row-cols-md-3 > * {
flex: 0 0 auto;
width: 33.33333333%;
}
.row-cols-md-4 > * {
flex: 0 0 auto;
width: 25%;
}
.row-cols-md-5 > * {
flex: 0 0 auto;
width: 20%;
}
.row-cols-md-6 > * {
flex: 0 0 auto;
width: 16.66666667%;
}
.col-md-auto {
flex: 0 0 auto;
width: auto;
}
.col-md-1 {
flex: 0 0 auto;
width: 8.33333333%;
}
.col-md-2 {
flex: 0 0 auto;
width: 16.66666667%;
}
.col-md-3 {
flex: 0 0 auto;
width: 25%;
}
.col-md-4 {
flex: 0 0 auto;
width: 33.33333333%;
}
.col-md-5 {
flex: 0 0 auto;
width: 41.66666667%;
}
.col-md-6 {
flex: 0 0 auto;
width: 50%;
}
.col-md-7 {
flex: 0 0 auto;
width: 58.33333333%;
}
.col-md-8 {
flex: 0 0 auto;
width: 66.66666667%;
}
.col-md-9 {
flex: 0 0 auto;
width: 75%;
}
.col-md-10 {
flex: 0 0 auto;
width: 83.33333333%;
}
.col-md-11 {
flex: 0 0 auto;
width: 91.66666667%;
}
.col-md-12 {
flex: 0 0 auto;
width: 100%;
}
.offset-md-0 {
margin-left: 0;
}
.offset-md-1 {
margin-left: 8.33333333%;
}
.offset-md-2 {
margin-left: 16.66666667%;
}
.offset-md-3 {
margin-left: 25%;
}
.offset-md-4 {
margin-left: 33.33333333%;
}
.offset-md-5 {
margin-left: 41.66666667%;
}
.offset-md-6 {
margin-left: 50%;
}
.offset-md-7 {
margin-left: 58.33333333%;
}
.offset-md-8 {
margin-left: 66.66666667%;
}
.offset-md-9 {
margin-left: 75%;
}
.offset-md-10 {
margin-left: 83.33333333%;
}
.offset-md-11 {
margin-left: 91.66666667%;
}
.g-md-0,
.gx-md-0 {
--bs-gutter-x: 0;
}
.g-md-0,
.gy-md-0 {
--bs-gutter-y: 0;
}
.g-md-1,
.gx-md-1 {
--bs-gutter-x: 0.25rem;
}
.g-md-1,
.gy-md-1 {
--bs-gutter-y: 0.25rem;
}
.g-md-2,
.gx-md-2 {
--bs-gutter-x: 0.5rem;
}
.g-md-2,
.gy-md-2 {
--bs-gutter-y: 0.5rem;
}
.g-md-3,
.gx-md-3 {
--bs-gutter-x: 1rem;
}
.g-md-3,
.gy-md-3 {
--bs-gutter-y: 1rem;
}
.g-md-4,
.gx-md-4 {
--bs-gutter-x: 1.5rem;
}
.g-md-4,
.gy-md-4 {
--bs-gutter-y: 1.5rem;
}
.g-md-5,
.gx-md-5 {
--bs-gutter-x: 3rem;
}
.g-md-5,
.gy-md-5 {
--bs-gutter-y: 3rem;
}
}
@media (min-width: 992px) {
.col-lg {
flex: 1 0 0%;
}
.row-cols-lg-auto > * {
flex: 0 0 auto;
width: auto;
}
.row-cols-lg-1 > * {
flex: 0 0 auto;
width: 100%;
}
.row-cols-lg-2 > * {
flex: 0 0 auto;
width: 50%;
}
.row-cols-lg-3 > * {
flex: 0 0 auto;
width: 33.33333333%;
}
.row-cols-lg-4 > * {
flex: 0 0 auto;
width: 25%;
}
.row-cols-lg-5 > * {
flex: 0 0 auto;
width: 20%;
}
.row-cols-lg-6 > * {
flex: 0 0 auto;
width: 16.66666667%;
}
.col-lg-auto {
flex: 0 0 auto;
width: auto;
}
.col-lg-1 {
flex: 0 0 auto;
width: 8.33333333%;
}
.col-lg-2 {
flex: 0 0 auto;
width: 16.66666667%;
}
.col-lg-3 {
flex: 0 0 auto;
width: 25%;
}
.col-lg-4 {
flex: 0 0 auto;
width: 33.33333333%;
}
.col-lg-5 {
flex: 0 0 auto;
width: 41.66666667%;
}
.col-lg-6 {
flex: 0 0 auto;
width: 50%;
}
.col-lg-7 {
flex: 0 0 auto;
width: 58.33333333%;
}
.col-lg-8 {
flex: 0 0 auto;
width: 66.66666667%;
}
.col-lg-9 {
flex: 0 0 auto;
width: 75%;
}
.col-lg-10 {
flex: 0 0 auto;
width: 83.33333333%;
}
.col-lg-11 {
flex: 0 0 auto;
width: 91.66666667%;
}
.col-lg-12 {
flex: 0 0 auto;
width: 100%;
}
.offset-lg-0 {
margin-left: 0;
}
.offset-lg-1 {
margin-left: 8.33333333%;
}
.offset-lg-2 {
margin-left: 16.66666667%;
}
.offset-lg-3 {
margin-left: 25%;
}
.offset-lg-4 {
margin-left: 33.33333333%;
}
.offset-lg-5 {
margin-left: 41.66666667%;
}
.offset-lg-6 {
margin-left: 50%;
}
.offset-lg-7 {
margin-left: 58.33333333%;
}
.offset-lg-8 {
margin-left: 66.66666667%;
}
.offset-lg-9 {
margin-left: 75%;
}
.offset-lg-10 {
margin-left: 83.33333333%;
}
.offset-lg-11 {
margin-left: 91.66666667%;
}
.g-lg-0,
.gx-lg-0 {
--bs-gutter-x: 0;
}
.g-lg-0,
.gy-lg-0 {
--bs-gutter-y: 0;
}
.g-lg-1,
.gx-lg-1 {
--bs-gutter-x: 0.25rem;
}
.g-lg-1,
.gy-lg-1 {
--bs-gutter-y: 0.25rem;
}
.g-lg-2,
.gx-lg-2 {
--bs-gutter-x: 0.5rem;
}
.g-lg-2,
.gy-lg-2 {
--bs-gutter-y: 0.5rem;
}
.g-lg-3,
.gx-lg-3 {
--bs-gutter-x: 1rem;
}
.g-lg-3,
.gy-lg-3 {
--bs-gutter-y: 1rem;
}
.g-lg-4,
.gx-lg-4 {
--bs-gutter-x: 1.5rem;
}
.g-lg-4,
.gy-lg-4 {
--bs-gutter-y: 1.5rem;
}
.g-lg-5,
.gx-lg-5 {
--bs-gutter-x: 3rem;
}
.g-lg-5,
.gy-lg-5 {
--bs-gutter-y: 3rem;
}
}
@media (min-width: 1200px) {
.col-xl {
flex: 1 0 0%;
}
.row-cols-xl-auto > * {
flex: 0 0 auto;
width: auto;
}
.row-cols-xl-1 > * {
flex: 0 0 auto;
width: 100%;
}
.row-cols-xl-2 > * {
flex: 0 0 auto;
width: 50%;
}
.row-cols-xl-3 > * {
flex: 0 0 auto;
width: 33.33333333%;
}
.row-cols-xl-4 > * {
flex: 0 0 auto;
width: 25%;
}
.row-cols-xl-5 > * {
flex: 0 0 auto;
width: 20%;
}
.row-cols-xl-6 > * {
flex: 0 0 auto;
width: 16.66666667%;
}
.col-xl-auto {
flex: 0 0 auto;
width: auto;
}
.col-xl-1 {
flex: 0 0 auto;
width: 8.33333333%;
}
.col-xl-2 {
flex: 0 0 auto;
width: 16.66666667%;
}
.col-xl-3 {
flex: 0 0 auto;
width: 25%;
}
.col-xl-4 {
flex: 0 0 auto;
width: 33.33333333%;
}
.col-xl-5 {
flex: 0 0 auto;
width: 41.66666667%;
}
.col-xl-6 {
flex: 0 0 auto;
width: 50%;
}
.col-xl-7 {
flex: 0 0 auto;
width: 58.33333333%;
}
.col-xl-8 {
flex: 0 0 auto;
width: 66.66666667%;
}
.col-xl-9 {
flex: 0 0 auto;
width: 75%;
}
.col-xl-10 {
flex: 0 0 auto;
width: 83.33333333%;
}
.col-xl-11 {
flex: 0 0 auto;
width: 91.66666667%;
}
.col-xl-12 {
flex: 0 0 auto;
width: 100%;
}
.offset-xl-0 {
margin-left: 0;
}
.offset-xl-1 {
margin-left: 8.33333333%;
}
.offset-xl-2 {
margin-left: 16.66666667%;
}
.offset-xl-3 {
margin-left: 25%;
}
.offset-xl-4 {
margin-left: 33.33333333%;
}
.offset-xl-5 {
margin-left: 41.66666667%;
}
.offset-xl-6 {
margin-left: 50%;
}
.offset-xl-7 {
margin-left: 58.33333333%;
}
.offset-xl-8 {
margin-left: 66.66666667%;
}
.offset-xl-9 {
margin-left: 75%;
}
.offset-xl-10 {
margin-left: 83.33333333%;
}
.offset-xl-11 {
margin-left: 91.66666667%;
}
.g-xl-0,
.gx-xl-0 {
--bs-gutter-x: 0;
}
.g-xl-0,
.gy-xl-0 {
--bs-gutter-y: 0;
}
.g-xl-1,
.gx-xl-1 {
--bs-gutter-x: 0.25rem;
}
.g-xl-1,
.gy-xl-1 {
--bs-gutter-y: 0.25rem;
}
.g-xl-2,
.gx-xl-2 {
--bs-gutter-x: 0.5rem;
}
.g-xl-2,
.gy-xl-2 {
--bs-gutter-y: 0.5rem;
}
.g-xl-3,
.gx-xl-3 {
--bs-gutter-x: 1rem;
}
.g-xl-3,
.gy-xl-3 {
--bs-gutter-y: 1rem;
}
.g-xl-4,
.gx-xl-4 {
--bs-gutter-x: 1.5rem;
}
.g-xl-4,
.gy-xl-4 {
--bs-gutter-y: 1.5rem;
}
.g-xl-5,
.gx-xl-5 {
--bs-gutter-x: 3rem;
}
.g-xl-5,
.gy-xl-5 {
--bs-gutter-y: 3rem;
}
}
@media (min-width: 1400px) {
.col-xxl {
flex: 1 0 0%;
}
.row-cols-xxl-auto > * {
flex: 0 0 auto;
width: auto;
}
.row-cols-xxl-1 > * {
flex: 0 0 auto;
width: 100%;
}
.row-cols-xxl-2 > * {
flex: 0 0 auto;
width: 50%;
}
.row-cols-xxl-3 > * {
flex: 0 0 auto;
width: 33.33333333%;
}
.row-cols-xxl-4 > * {
flex: 0 0 auto;
width: 25%;
}
.row-cols-xxl-5 > * {
flex: 0 0 auto;
width: 20%;
}
.row-cols-xxl-6 > * {
flex: 0 0 auto;
width: 16.66666667%;
}
.col-xxl-auto {
flex: 0 0 auto;
width: auto;
}
.col-xxl-1 {
flex: 0 0 auto;
width: 8.33333333%;
}
.col-xxl-2 {
flex: 0 0 auto;
width: 16.66666667%;
}
.col-xxl-3 {
flex: 0 0 auto;
width: 25%;
}
.col-xxl-4 {
flex: 0 0 auto;
width: 33.33333333%;
}
.col-xxl-5 {
flex: 0 0 auto;
width: 41.66666667%;
}
.col-xxl-6 {
flex: 0 0 auto;
width: 50%;
}
.col-xxl-7 {
flex: 0 0 auto;
width: 58.33333333%;
}
.col-xxl-8 {
flex: 0 0 auto;
width: 66.66666667%;
}
.col-xxl-9 {
flex: 0 0 auto;
width: 75%;
}
.col-xxl-10 {
flex: 0 0 auto;
width: 83.33333333%;
}
.col-xxl-11 {
flex: 0 0 auto;
width: 91.66666667%;
}
.col-xxl-12 {
flex: 0 0 auto;
width: 100%;
}
.offset-xxl-0 {
margin-left: 0;
}
.offset-xxl-1 {
margin-left: 8.33333333%;
}
.offset-xxl-2 {
margin-left: 16.66666667%;
}
.offset-xxl-3 {
margin-left: 25%;
}
.offset-xxl-4 {
margin-left: 33.33333333%;
}
.offset-xxl-5 {
margin-left: 41.66666667%;
}
.offset-xxl-6 {
margin-left: 50%;
}
.offset-xxl-7 {
margin-left: 58.33333333%;
}
.offset-xxl-8 {
margin-left: 66.66666667%;
}
.offset-xxl-9 {
margin-left: 75%;
}
.offset-xxl-10 {
margin-left: 83.33333333%;
}
.offset-xxl-11 {
margin-left: 91.66666667%;
}
.g-xxl-0,
.gx-xxl-0 {
--bs-gutter-x: 0;
}
.g-xxl-0,
.gy-xxl-0 {
--bs-gutter-y: 0;
}
.g-xxl-1,
.gx-xxl-1 {
--bs-gutter-x: 0.25rem;
}
.g-xxl-1,
.gy-xxl-1 {
--bs-gutter-y: 0.25rem;
}
.g-xxl-2,
.gx-xxl-2 {
--bs-gutter-x: 0.5rem;
}
.g-xxl-2,
.gy-xxl-2 {
--bs-gutter-y: 0.5rem;
}
.g-xxl-3,
.gx-xxl-3 {
--bs-gutter-x: 1rem;
}
.g-xxl-3,
.gy-xxl-3 {
--bs-gutter-y: 1rem;
}
.g-xxl-4,
.gx-xxl-4 {
--bs-gutter-x: 1.5rem;
}
.g-xxl-4,
.gy-xxl-4 {
--bs-gutter-y: 1.5rem;
}
.g-xxl-5,
.gx-xxl-5 {
--bs-gutter-x: 3rem;
}
.g-xxl-5,
.gy-xxl-5 {
--bs-gutter-y: 3rem;
}
}
.table {
--bs-table-color-type: initial;
--bs-table-bg-type: initial;
--bs-table-color-state: initial;
--bs-table-bg-state: initial;
--bs-table-color: var(--bs-emphasis-color);
--bs-table-bg: var(--bs-body-bg);
--bs-table-border-color: var(--bs-border-color);
--bs-table-accent-bg: transparent;
--bs-table-striped-color: var(--bs-emphasis-color);
--bs-table-striped-bg: rgba(var(--bs-emphasis-color-rgb), 0.05);
--bs-table-active-color: var(--bs-emphasis-color);
--bs-table-active-bg: rgba(var(--bs-emphasis-color-rgb), 0.1);
--bs-table-hover-color: var(--bs-emphasis-color);
--bs-table-hover-bg: rgba(var(--bs-emphasis-color-rgb), 0.075);
width: 100%;
margin-bottom: 1rem;
vertical-align: top;
border-color: var(--bs-table-border-color);
}
.table > :not(caption) > * > * {
padding: 0.5rem 0.5rem;
color: var(--bs-table-color-state, var(--bs-table-color-type, var(--bs-table-color)));
background-color: var(--bs-table-bg);
border-bottom-width: var(--bs-border-width);
box-shadow: inset 0 0 0 9999px var(--bs-table-bg-state, var(--bs-table-bg-type, var(--bs-table-accent-bg)));
}
.table > tbody {
vertical-align: inherit;
}
.table > thead {
vertical-align: bottom;
}
.table-group-divider {
border-top: calc(var(--bs-border-width) * 2) solid currentcolor;
}
.caption-top {
caption-side: top;
}
.table-sm > :not(caption) > * > * {
padding: 0.25rem 0.25rem;
}
.table-bordered > :not(caption) > * {
border-width: var(--bs-border-width) 0;
}
.table-bordered > :not(caption) > * > * {
border-width: 0 var(--bs-border-width);
}
.table-borderless > :not(caption) > * > * {
border-bottom-width: 0;
}
.table-borderless > :not(:first-child) {
border-top-width: 0;
}
.table-striped > tbody > tr:nth-of-type(odd) > * {
--bs-table-color-type: var(--bs-table-striped-color);
--bs-table-bg-type: var(--bs-table-striped-bg);
}
.table-striped-columns > :not(caption) > tr > :nth-child(even) {
--bs-table-color-type: var(--bs-table-striped-color);
--bs-table-bg-type: var(--bs-table-striped-bg);
}
.table-active {
--bs-table-color-state: var(--bs-table-active-color);
--bs-table-bg-state: var(--bs-table-active-bg);
}
.table-hover > tbody > tr:hover > * {
--bs-table-color-state: var(--bs-table-hover-color);
--bs-table-bg-state: var(--bs-table-hover-bg);
}
.table-primary {
--bs-table-color: #000;
--bs-table-bg: #cfe2ff;
--bs-table-border-color: #a6b5cc;
--bs-table-striped-bg: #c5d7f2;
--bs-table-striped-color: #000;
--bs-table-active-bg: #bacbe6;
--bs-table-active-color: #000;
--bs-table-hover-bg: #bfd1ec;
--bs-table-hover-color: #000;
color: var(--bs-table-color);
border-color: var(--bs-table-border-color);
}
.table-secondary {
--bs-table-color: #000;
--bs-table-bg: #e2e3e5;
--bs-table-border-color: #b5b6b7;
--bs-table-striped-bg: #d7d8da;
--bs-table-striped-color: #000;
--bs-table-active-bg: #cbccce;
--bs-table-active-color: #000;
--bs-table-hover-bg: #d1d2d4;
--bs-table-hover-color: #000;
color: var(--bs-table-color);
border-color: var(--bs-table-border-color);
}
.table-success {
--bs-table-color: #000;
--bs-table-bg: #d1e7dd;
--bs-table-border-color: #a7b9b1;
--bs-table-striped-bg: #c7dbd2;
--bs-table-striped-color: #000;
--bs-table-active-bg: #bcd0c7;
--bs-table-active-color: #000;
--bs-table-hover-bg: #c1d6cc;
--bs-table-hover-color: #000;
color: var(--bs-table-color);
border-color: var(--bs-table-border-color);
}
.table-info {
--bs-table-color: #000;
--bs-table-bg: #cff4fc;
--bs-table-border-color: #a6c3ca;
--bs-table-striped-bg: #c5e8ef;
--bs-table-striped-color: #000;
--bs-table-active-bg: #badce3;
--bs-table-active-color: #000;
--bs-table-hover-bg: #bfe2e9;
--bs-table-hover-color: #000;
color: var(--bs-table-color);
border-color: var(--bs-table-border-color);
}
.table-warning {
--bs-table-color: #000;
--bs-table-bg: #fff3cd;
--bs-table-border-color: #ccc2a4;
--bs-table-striped-bg: #f2e7c3;
--bs-table-striped-color: #000;
--bs-table-active-bg: #e6dbb9;
--bs-table-active-color: #000;
--bs-table-hover-bg: #ece1be;
--bs-table-hover-color: #000;
color: var(--bs-table-color);
border-color: var(--bs-table-border-color);
}
.table-danger {
--bs-table-color: #000;
--bs-table-bg: #f8d7da;
--bs-table-border-color: #c6acae;
--bs-table-striped-bg: #eccccf;
--bs-table-striped-color: #000;
--bs-table-active-bg: #dfc2c4;
--bs-table-active-color: #000;
--bs-table-hover-bg: #e5c7ca;
--bs-table-hover-color: #000;
color: var(--bs-table-color);
border-color: var(--bs-table-border-color);
}
.table-light {
--bs-table-color: #000;
--bs-table-bg: #f8f9fa;
--bs-table-border-color: #c6c7c8;
--bs-table-striped-bg: #ecedee;
--bs-table-striped-color: #000;
--bs-table-active-bg: #dfe0e1;
--bs-table-active-color: #000;
--bs-table-hover-bg: #e5e6e7;
--bs-table-hover-color: #000;
color: var(--bs-table-color);
border-color: var(--bs-table-border-color);
}
.table-dark {
--bs-table-color: #fff;
--bs-table-bg: #212529;
--bs-table-border-color: #4d5154;
--bs-table-striped-bg: #2c3034;
--bs-table-striped-color: #fff;
--bs-table-active-bg: #373b3e;
--bs-table-active-color: #fff;
--bs-table-hover-bg: #323539;
--bs-table-hover-color: #fff;
color: var(--bs-table-color);
border-color: var(--bs-table-border-color);
}
.table-responsive {
overflow-x: auto;
-webkit-overflow-scrolling: touch;
}
@media (max-width: 575.98px) {
.table-responsive-sm {
overflow-x: auto;
-webkit-overflow-scrolling: touch;
}
}
@media (max-width: 767.98px) {
.table-responsive-md {
overflow-x: auto;
-webkit-overflow-scrolling: touch;
}
}
@media (max-width: 991.98px) {
.table-responsive-lg {
overflow-x: auto;
-webkit-overflow-scrolling: touch;
}
}
@media (max-width: 1199.98px) {
.table-responsive-xl {
overflow-x: auto;
-webkit-overflow-scrolling: touch;
}
}
@media (max-width: 1399.98px) {
.table-responsive-xxl {
overflow-x: auto;
-webkit-overflow-scrolling: touch;
}
}
.form-label {
margin-bottom: 0.5rem;
}
.col-form-label {
padding-top: calc(0.375rem + var(--bs-border-width));
padding-bottom: calc(0.375rem + var(--bs-border-width));
margin-bottom: 0;
font-size: inherit;
line-height: 1.5;
}
.col-form-label-lg {
padding-top: calc(0.5rem + var(--bs-border-width));
padding-bottom: calc(0.5rem + var(--bs-border-width));
font-size: 1.25rem;
}
.col-form-label-sm {
padding-top: calc(0.25rem + var(--bs-border-width));
padding-bottom: calc(0.25rem + var(--bs-border-width));
font-size: 0.875rem;
}
.form-text {
margin-top: 0.25rem;
font-size: 0.875em;
color: var(--bs-secondary-color);
}
.form-control {
display: block;
width: 100%;
padding: 0.375rem 0.75rem;
font-size: 1rem;
font-weight: 400;
line-height: 1.5;
color: var(--bs-body-color);
appearance: none;
background-color: var(--bs-body-bg);
background-clip: padding-box;
border: var(--bs-border-width) solid var(--bs-border-color);
border-radius: var(--bs-border-radius);
transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
}
@media (prefers-reduced-motion: reduce) {
.form-control {
transition: none;
}
}
.form-control[type=file] {
overflow: hidden;
}
.form-control[type=file]:not(:disabled):not([readonly]) {
cursor: pointer;
}
.form-control:focus {
color: var(--bs-body-color);
background-color: var(--bs-body-bg);
border-color: #86b7fe;
outline: 0;
box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);
}
.form-control::-webkit-date-and-time-value {
min-width: 85px;
height: 1.5em;
margin: 0;
}
.form-control::-webkit-datetime-edit {
display: block;
padding: 0;
}
.form-control::placeholder {
color: var(--bs-secondary-color);
opacity: 1;
}
.form-control:disabled {
background-color: var(--bs-secondary-bg);
opacity: 1;
}
.form-control::file-selector-button {
padding: 0.375rem 0.75rem;
margin: -0.375rem -0.75rem;
margin-inline-end: 0.75rem;
color: var(--bs-body-color);
background-color: var(--bs-tertiary-bg);
pointer-events: none;
border-color: inherit;
border-style: solid;
border-width: 0;
border-inline-end-width: var(--bs-border-width);
border-radius: 0;
transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
}
@media (prefers-reduced-motion: reduce) {
.form-control::file-selector-button {
transition: none;
}
}
.form-control:hover:not(:disabled):not([readonly])::file-selector-button {
background-color: var(--bs-secondary-bg);
}
.form-control-plaintext {
display: block;
width: 100%;
padding: 0.375rem 0;
margin-bottom: 0;
line-height: 1.5;
color: var(--bs-body-color);
background-color: transparent;
border: solid transparent;
border-width: var(--bs-border-width) 0;
}
.form-control-plaintext:focus {
outline: 0;
}
.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg {
padding-right: 0;
padding-left: 0;
}
.form-control-sm {
min-height: calc(1.5em + 0.5rem + calc(var(--bs-border-width) * 2));
padding: 0.25rem 0.5rem;
font-size: 0.875rem;
border-radius: var(--bs-border-radius-sm);
}
.form-control-sm::file-selector-button {
padding: 0.25rem 0.5rem;
margin: -0.25rem -0.5rem;
margin-inline-end: 0.5rem;
}
.form-control-lg {
min-height: calc(1.5em + 1rem + calc(var(--bs-border-width) * 2));
padding: 0.5rem 1rem;
font-size: 1.25rem;
border-radius: var(--bs-border-radius-lg);
}
.form-control-lg::file-selector-button {
padding: 0.5rem 1rem;
margin: -0.5rem -1rem;
margin-inline-end: 1rem;
}
textarea.form-control {
min-height: calc(1.5em + 0.75rem + calc(var(--bs-border-width) * 2));
}
textarea.form-control-sm {
min-height: calc(1.5em + 0.5rem + calc(var(--bs-border-width) * 2));
}
textarea.form-control-lg {
min-height: calc(1.5em + 1rem + calc(var(--bs-border-width) * 2));
}
.form-control-color {
width: 3rem;
height: calc(1.5em + 0.75rem + calc(var(--bs-border-width) * 2));
padding: 0.375rem;
}
.form-control-color:not(:disabled):not([readonly]) {
cursor: pointer;
}
.form-control-color::-moz-color-swatch {
border: 0 !important;
border-radius: var(--bs-border-radius);
}
.form-control-color::-webkit-color-swatch {
border: 0 !important;
border-radius: var(--bs-border-radius);
}
.form-control-color.form-control-sm {
height: calc(1.5em + 0.5rem + calc(var(--bs-border-width) * 2));
}
.form-control-color.form-control-lg {
height: calc(1.5em + 1rem + calc(var(--bs-border-width) * 2));
}
.form-select {
--bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");
display: block;
width: 100%;
padding: 0.375rem 2.25rem 0.375rem 0.75rem;
font-size: 1rem;
font-weight: 400;
line-height: 1.5;
color: var(--bs-body-color);
appearance: none;
background-color: var(--bs-body-bg);
background-image: var(--bs-form-select-bg-img), var(--bs-form-select-bg-icon, none);
background-repeat: no-repeat;
background-position: right 0.75rem center;
background-size: 16px 12px;
border: var(--bs-border-width) solid var(--bs-border-color);
border-radius: var(--bs-border-radius);
transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
}
@media (prefers-reduced-motion: reduce) {
.form-select {
transition: none;
}
}
.form-select:focus {
border-color: #86b7fe;
outline: 0;
box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);
}
.form-select[multiple], .form-select[size]:not([size="1"]) {
padding-right: 0.75rem;
background-image: none;
}
.form-select:disabled {
background-color: var(--bs-secondary-bg);
}
.form-select:-moz-focusring {
color: transparent;
text-shadow: 0 0 0 var(--bs-body-color);
}
.form-select-sm {
padding-top: 0.25rem;
padding-bottom: 0.25rem;
padding-left: 0.5rem;
font-size: 0.875rem;
border-radius: var(--bs-border-radius-sm);
}
.form-select-lg {
padding-top: 0.5rem;
padding-bottom: 0.5rem;
padding-left: 1rem;
font-size: 1.25rem;
border-radius: var(--bs-border-radius-lg);
}
[data-bs-theme=dark] .form-select {
--bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23dee2e6' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");
}
.form-check {
display: block;
min-height: 1.5rem;
padding-left: 1.5em;
margin-bottom: 0.125rem;
}
.form-check .form-check-input {
float: left;
margin-left: -1.5em;
}
.form-check-reverse {
padding-right: 1.5em;
padding-left: 0;
text-align: right;
}
.form-check-reverse .form-check-input {
float: right;
margin-right: -1.5em;
margin-left: 0;
}
.form-check-input {
--bs-form-check-bg: var(--bs-body-bg);
flex-shrink: 0;
width: 1em;
height: 1em;
margin-top: 0.25em;
vertical-align: top;
appearance: none;
background-color: var(--bs-form-check-bg);
background-image: var(--bs-form-check-bg-image);
background-repeat: no-repeat;
background-position: center;
background-size: contain;
border: var(--bs-border-width) solid var(--bs-border-color);
print-color-adjust: exact;
}
.form-check-input[type=checkbox] {
border-radius: 0.25em;
}
.form-check-input[type=radio] {
border-radius: 50%;
}
.form-check-input:active {
filter: brightness(90%);
}
.form-check-input:focus {
border-color: #86b7fe;
outline: 0;
box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);
}
.form-check-input:checked {
background-color: #0d6efd;
border-color: #0d6efd;
}
.form-check-input:checked[type=checkbox] {
--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e");
}
.form-check-input:checked[type=radio] {
--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e");
}
.form-check-input[type=checkbox]:indeterminate {
background-color: #0d6efd;
border-color: #0d6efd;
--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e");
}
.form-check-input:disabled {
pointer-events: none;
filter: none;
opacity: 0.5;
}
.form-check-input[disabled] ~ .form-check-label, .form-check-input:disabled ~ .form-check-label {
cursor: default;
opacity: 0.5;
}
.form-switch {
padding-left: 2.5em;
}
.form-switch .form-check-input {
--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");
width: 2em;
margin-left: -2.5em;
background-image: var(--bs-form-switch-bg);
background-position: left center;
border-radius: 2em;
transition: background-position 0.15s ease-in-out;
}
@media (prefers-reduced-motion: reduce) {
.form-switch .form-check-input {
transition: none;
}
}
.form-switch .form-check-input:focus {
--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e");
}
.form-switch .form-check-input:checked {
background-position: right center;
--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e");
}
.form-switch.form-check-reverse {
padding-right: 2.5em;
padding-left: 0;
}
.form-switch.form-check-reverse .form-check-input {
margin-right: -2.5em;
margin-left: 0;
}
.form-check-inline {
display: inline-block;
margin-right: 1rem;
}
.btn-check {
position: absolute;
clip: rect(0, 0, 0, 0);
pointer-events: none;
}
.btn-check[disabled] + .btn, .btn-check:disabled + .btn {
pointer-events: none;
filter: none;
opacity: 0.65;
}
[data-bs-theme=dark] .form-switch .form-check-input:not(:checked):not(:focus) {
--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e");
}
.form-range {
width: 100%;
height: 1.5rem;
padding: 0;
appearance: none;
background-color: transparent;
}
.form-range:focus {
outline: 0;
}
.form-range:focus::-webkit-slider-thumb {
box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(13, 110, 253, 0.25);
}
.form-range:focus::-moz-range-thumb {
box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(13, 110, 253, 0.25);
}
.form-range::-moz-focus-outer {
border: 0;
}
.form-range::-webkit-slider-thumb {
width: 1rem;
height: 1rem;
margin-top: -0.25rem;
appearance: none;
background-color: #0d6efd;
border: 0;
border-radius: 1rem;
transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
}
@media (prefers-reduced-motion: reduce) {
.form-range::-webkit-slider-thumb {
transition: none;
}
}
.form-range::-webkit-slider-thumb:active {
background-color: #b6d4fe;
}
.form-range::-webkit-slider-runnable-track {
width: 100%;
height: 0.5rem;
color: transparent;
cursor: pointer;
background-color: var(--bs-secondary-bg);
border-color: transparent;
border-radius: 1rem;
}
.form-range::-moz-range-thumb {
width: 1rem;
height: 1rem;
appearance: none;
background-color: #0d6efd;
border: 0;
border-radius: 1rem;
transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
}
@media (prefers-reduced-motion: reduce) {
.form-range::-moz-range-thumb {
transition: none;
}
}
.form-range::-moz-range-thumb:active {
background-color: #b6d4fe;
}
.form-range::-moz-range-track {
width: 100%;
height: 0.5rem;
color: transparent;
cursor: pointer;
background-color: var(--bs-secondary-bg);
border-color: transparent;
border-radius: 1rem;
}
.form-range:disabled {
pointer-events: none;
}
.form-range:disabled::-webkit-slider-thumb {
background-color: var(--bs-secondary-color);
}
.form-range:disabled::-moz-range-thumb {
background-color: var(--bs-secondary-color);
}
.form-floating {
position: relative;
}
.form-floating > .form-control,
.form-floating > .form-control-plaintext,
.form-floating > .form-select {
height: calc(3.5rem + calc(var(--bs-border-width) * 2));
min-height: calc(3.5rem + calc(var(--bs-border-width) * 2));
line-height: 1.25;
}
.form-floating > label {
position: absolute;
top: 0;
left: 0;
z-index: 2;
height: 100%;
padding: 1rem 0.75rem;
overflow: hidden;
text-align: start;
text-overflow: ellipsis;
white-space: nowrap;
pointer-events: none;
border: var(--bs-border-width) solid transparent;
transform-origin: 0 0;
transition: opacity 0.1s ease-in-out, transform 0.1s ease-in-out;
}
@media (prefers-reduced-motion: reduce) {
.form-floating > label {
transition: none;
}
}
.form-floating > .form-control,
.form-floating > .form-control-plaintext {
padding: 1rem 0.75rem;
}
.form-floating > .form-control::placeholder,
.form-floating > .form-control-plaintext::placeholder {
color: transparent;
}
.form-floating > .form-control:focus, .form-floating > .form-control:not(:placeholder-shown),
.form-floating > .form-control-plaintext:focus,
.form-floating > .form-control-plaintext:not(:placeholder-shown) {
padding-top: 1.625rem;
padding-bottom: 0.625rem;
}
.form-floating > .form-control:-webkit-autofill,
.form-floating > .form-control-plaintext:-webkit-autofill {
padding-top: 1.625rem;
padding-bottom: 0.625rem;
}
.form-floating > .form-select {
padding-top: 1.625rem;
padding-bottom: 0.625rem;
}
.form-floating > .form-control:focus ~ label,
.form-floating > .form-control:not(:placeholder-shown) ~ label,
.form-floating > .form-control-plaintext ~ label,
.form-floating > .form-select ~ label {
color: rgba(var(--bs-body-color-rgb), 0.65);
transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem);
}
.form-floating > .form-control:focus ~ label::after,
.form-floating > .form-control:not(:placeholder-shown) ~ label::after,
.form-floating > .form-control-plaintext ~ label::after,
.form-floating > .form-select ~ label::after {
position: absolute;
inset: 1rem 0.375rem;
z-index: -1;
height: 1.5em;
content: "";
background-color: var(--bs-body-bg);
border-radius: var(--bs-border-radius);
}
.form-floating > .form-control:-webkit-autofill ~ label {
color: rgba(var(--bs-body-color-rgb), 0.65);
transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem);
}
.form-floating > .form-control-plaintext ~ label {
border-width: var(--bs-border-width) 0;
}
.form-floating > :disabled ~ label,
.form-floating > .form-control:disabled ~ label {
color: #6c757d;
}
.form-floating > :disabled ~ label::after,
.form-floating > .form-control:disabled ~ label::after {
background-color: var(--bs-secondary-bg);
}
.input-group {
position: relative;
display: flex;
flex-wrap: wrap;
align-items: stretch;
width: 100%;
}
.input-group > .form-control,
.input-group > .form-select,
.input-group > .form-floating {
position: relative;
flex: 1 1 auto;
width: 1%;
min-width: 0;
}
.input-group > .form-control:focus,
.input-group > .form-select:focus,
.input-group > .form-floating:focus-within {
z-index: 5;
}
.input-group .btn {
position: relative;
z-index: 2;
}
.input-group .btn:focus {
z-index: 5;
}
.input-group-text {
display: flex;
align-items: center;
padding: 0.375rem 0.75rem;
font-size: 1rem;
font-weight: 400;
line-height: 1.5;
color: var(--bs-body-color);
text-align: center;
white-space: nowrap;
background-color: var(--bs-tertiary-bg);
border: var(--bs-border-width) solid var(--bs-border-color);
border-radius: var(--bs-border-radius);
}
.input-group-lg > .form-control,
.input-group-lg > .form-select,
.input-group-lg > .input-group-text,
.input-group-lg > .btn {
padding: 0.5rem 1rem;
font-size: 1.25rem;
border-radius: var(--bs-border-radius-lg);
}
.input-group-sm > .form-control,
.input-group-sm > .form-select,
.input-group-sm > .input-group-text,
.input-group-sm > .btn {
padding: 0.25rem 0.5rem;
font-size: 0.875rem;
border-radius: var(--bs-border-radius-sm);
}
.input-group-lg > .form-select,
.input-group-sm > .form-select {
padding-right: 3rem;
}
.input-group:not(.has-validation) > :not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),
.input-group:not(.has-validation) > .dropdown-toggle:nth-last-child(n+3),
.input-group:not(.has-validation) > .form-floating:not(:last-child) > .form-control,
.input-group:not(.has-validation) > .form-floating:not(:last-child) > .form-select {
border-top-right-radius: 0;
border-bottom-right-radius: 0;
}
.input-group.has-validation > :nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),
.input-group.has-validation > .dropdown-toggle:nth-last-child(n+4),
.input-group.has-validation > .form-floating:nth-last-child(n+3) > .form-control,
.input-group.has-validation > .form-floating:nth-last-child(n+3) > .form-select {
border-top-right-radius: 0;
border-bottom-right-radius: 0;
}
.input-group > :not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback) {
margin-left: calc(var(--bs-border-width) * -1);
border-top-left-radius: 0;
border-bottom-left-radius: 0;
}
.input-group > .form-floating:not(:first-child) > .form-control,
.input-group > .form-floating:not(:first-child) > .form-select {
border-top-left-radius: 0;
border-bottom-left-radius: 0;
}
.valid-feedback {
display: none;
width: 100%;
margin-top: 0.25rem;
font-size: 0.875em;
color: var(--bs-form-valid-color);
}
.valid-tooltip {
position: absolute;
top: 100%;
z-index: 5;
display: none;
max-width: 100%;
padding: 0.25rem 0.5rem;
margin-top: 0.1rem;
font-size: 0.875rem;
color: #fff;
background-color: var(--bs-success);
border-radius: var(--bs-border-radius);
}
.was-validated :valid ~ .valid-feedback,
.was-validated :valid ~ .valid-tooltip,
.is-valid ~ .valid-feedback,
.is-valid ~ .valid-tooltip {
display: block;
}
.was-validated .form-control:valid, .form-control.is-valid {
border-color: var(--bs-form-valid-border-color);
padding-right: calc(1.5em + 0.75rem);
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");
background-repeat: no-repeat;
background-position: right calc(0.375em + 0.1875rem) center;
background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
}
.was-validated .form-control:valid:focus, .form-control.is-valid:focus {
border-color: var(--bs-form-valid-border-color);
box-shadow: 0 0 0 0.25rem rgba(var(--bs-success-rgb), 0.25);
}
.was-validated textarea.form-control:valid, textarea.form-control.is-valid {
padding-right: calc(1.5em + 0.75rem);
background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);
}
.was-validated .form-select:valid, .form-select.is-valid {
border-color: var(--bs-form-valid-border-color);
}
.was-validated .form-select:valid:not([multiple]):not([size]), .was-validated .form-select:valid:not([multiple])[size="1"], .form-select.is-valid:not([multiple]):not([size]), .form-select.is-valid:not([multiple])[size="1"] {
--bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");
padding-right: 4.125rem;
background-position: right 0.75rem center, center right 2.25rem;
background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
}
.was-validated .form-select:valid:focus, .form-select.is-valid:focus {
border-color: var(--bs-form-valid-border-color);
box-shadow: 0 0 0 0.25rem rgba(var(--bs-success-rgb), 0.25);
}
.was-validated .form-control-color:valid, .form-control-color.is-valid {
width: calc(3rem + calc(1.5em + 0.75rem));
}
.was-validated .form-check-input:valid, .form-check-input.is-valid {
border-color: var(--bs-form-valid-border-color);
}
.was-validated .form-check-input:valid:checked, .form-check-input.is-valid:checked {
background-color: var(--bs-form-valid-color);
}
.was-validated .form-check-input:valid:focus, .form-check-input.is-valid:focus {
box-shadow: 0 0 0 0.25rem rgba(var(--bs-success-rgb), 0.25);
}
.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label {
color: var(--bs-form-valid-color);
}
.form-check-inline .form-check-input ~ .valid-feedback {
margin-left: 0.5em;
}
.was-validated .input-group > .form-control:not(:focus):valid, .input-group > .form-control:not(:focus).is-valid,
.was-validated .input-group > .form-select:not(:focus):valid,
.input-group > .form-select:not(:focus).is-valid,
.was-validated .input-group > .form-floating:not(:focus-within):valid,
.input-group > .form-floating:not(:focus-within).is-valid {
z-index: 3;
}
.invalid-feedback {
display: none;
width: 100%;
margin-top: 0.25rem;
font-size: 0.875em;
color: var(--bs-form-invalid-color);
}
.invalid-tooltip {
position: absolute;
top: 100%;
z-index: 5;
display: none;
max-width: 100%;
padding: 0.25rem 0.5rem;
margin-top: 0.1rem;
font-size: 0.875rem;
color: #fff;
background-color: var(--bs-danger);
border-radius: var(--bs-border-radius);
}
.was-validated :invalid ~ .invalid-feedback,
.was-validated :invalid ~ .invalid-tooltip,
.is-invalid ~ .invalid-feedback,
.is-invalid ~ .invalid-tooltip {
display: block;
}
.was-validated .form-control:invalid, .form-control.is-invalid {
border-color: var(--bs-form-invalid-border-color);
padding-right: calc(1.5em + 0.75rem);
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");
background-repeat: no-repeat;
background-position: right calc(0.375em + 0.1875rem) center;
background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
}
.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus {
border-color: var(--bs-form-invalid-border-color);
box-shadow: 0 0 0 0.25rem rgba(var(--bs-danger-rgb), 0.25);
}
.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid {
padding-right: calc(1.5em + 0.75rem);
background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);
}
.was-validated .form-select:invalid, .form-select.is-invalid {
border-color: var(--bs-form-invalid-border-color);
}
.was-validated .form-select:invalid:not([multiple]):not([size]), .was-validated .form-select:invalid:not([multiple])[size="1"], .form-select.is-invalid:not([multiple]):not([size]), .form-select.is-invalid:not([multiple])[size="1"] {
--bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");
padding-right: 4.125rem;
background-position: right 0.75rem center, center right 2.25rem;
background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
}
.was-validated .form-select:invalid:focus, .form-select.is-invalid:focus {
border-color: var(--bs-form-invalid-border-color);
box-shadow: 0 0 0 0.25rem rgba(var(--bs-danger-rgb), 0.25);
}
.was-validated .form-control-color:invalid, .form-control-color.is-invalid {
width: calc(3rem + calc(1.5em + 0.75rem));
}
.was-validated .form-check-input:invalid, .form-check-input.is-invalid {
border-color: var(--bs-form-invalid-border-color);
}
.was-validated .form-check-input:invalid:checked, .form-check-input.is-invalid:checked {
background-color: var(--bs-form-invalid-color);
}
.was-validated .form-check-input:invalid:focus, .form-check-input.is-invalid:focus {
box-shadow: 0 0 0 0.25rem rgba(var(--bs-danger-rgb), 0.25);
}
.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label {
color: var(--bs-form-invalid-color);
}
.form-check-inline .form-check-input ~ .invalid-feedback {
margin-left: 0.5em;
}
.was-validated .input-group > .form-control:not(:focus):invalid, .input-group > .form-control:not(:focus).is-invalid,
.was-validated .input-group > .form-select:not(:focus):invalid,
.input-group > .form-select:not(:focus).is-invalid,
.was-validated .input-group > .form-floating:not(:focus-within):invalid,
.input-group > .form-floating:not(:focus-within).is-invalid {
z-index: 4;
}
.btn {
--bs-btn-padding-x: 0.75rem;
--bs-btn-padding-y: 0.375rem;
--bs-btn-font-family: ;
--bs-btn-font-size: 1rem;
--bs-btn-font-weight: 400;
--bs-btn-line-height: 1.5;
--bs-btn-color: var(--bs-body-color);
--bs-btn-bg: transparent;
--bs-btn-border-width: var(--bs-border-width);
--bs-btn-border-color: transparent;
--bs-btn-border-radius: var(--bs-border-radius);
--bs-btn-hover-border-color: transparent;
--bs-btn-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);
--bs-btn-disabled-opacity: 0.65;
--bs-btn-focus-box-shadow: 0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .5);
display: inline-block;
padding: var(--bs-btn-padding-y) var(--bs-btn-padding-x);
font-family: var(--bs-btn-font-family);
font-size: var(--bs-btn-font-size);
font-weight: var(--bs-btn-font-weight);
line-height: var(--bs-btn-line-height);
color: var(--bs-btn-color);
text-align: center;
text-decoration: none;
vertical-align: middle;
cursor: pointer;
user-select: none;
border: var(--bs-btn-border-width) solid var(--bs-btn-border-color);
border-radius: var(--bs-btn-border-radius);
background-color: var(--bs-btn-bg);
transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
}
@media (prefers-reduced-motion: reduce) {
.btn {
transition: none;
}
}
.btn:hover {
color: var(--bs-btn-hover-color);
background-color: var(--bs-btn-hover-bg);
border-color: var(--bs-btn-hover-border-color);
}
.btn-check + .btn:hover {
color: var(--bs-btn-color);
background-color: var(--bs-btn-bg);
border-color: var(--bs-btn-border-color);
}
.btn:focus-visible {
color: var(--bs-btn-hover-color);
background-color: var(--bs-btn-hover-bg);
border-color: var(--bs-btn-hover-border-color);
outline: 0;
box-shadow: var(--bs-btn-focus-box-shadow);
}
.btn-check:focus-visible + .btn {
border-color: var(--bs-btn-hover-border-color);
outline: 0;
box-shadow: var(--bs-btn-focus-box-shadow);
}
.btn-check:checked + .btn, :not(.btn-check) + .btn:active, .btn:first-child:active, .btn.active, .btn.show {
color: var(--bs-btn-active-color);
background-color: var(--bs-btn-active-bg);
border-color: var(--bs-btn-active-border-color);
}
.btn-check:checked + .btn:focus-visible, :not(.btn-check) + .btn:active:focus-visible, .btn:first-child:active:focus-visible, .btn.active:focus-visible, .btn.show:focus-visible {
box-shadow: var(--bs-btn-focus-box-shadow);
}
.btn-check:checked:focus-visible + .btn {
box-shadow: var(--bs-btn-focus-box-shadow);
}
.btn:disabled, .btn.disabled, fieldset:disabled .btn {
color: var(--bs-btn-disabled-color);
pointer-events: none;
background-color: var(--bs-btn-disabled-bg);
border-color: var(--bs-btn-disabled-border-color);
opacity: var(--bs-btn-disabled-opacity);
}
.btn-primary {
--bs-btn-color: #fff;
--bs-btn-bg: #0d6efd;
--bs-btn-border-color: #0d6efd;
--bs-btn-hover-color: #fff;
--bs-btn-hover-bg: #0b5ed7;
--bs-btn-hover-border-color: #0a58ca;
--bs-btn-focus-shadow-rgb: 49, 132, 253;
--bs-btn-active-color: #fff;
--bs-btn-active-bg: #0a58ca;
--bs-btn-active-border-color: #0a53be;
--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
--bs-btn-disabled-color: #fff;
--bs-btn-disabled-bg: #0d6efd;
--bs-btn-disabled-border-color: #0d6efd;
}
.btn-secondary {
--bs-btn-color: #fff;
--bs-btn-bg: #6c757d;
--bs-btn-border-color: #6c757d;
--bs-btn-hover-color: #fff;
--bs-btn-hover-bg: #5c636a;
--bs-btn-hover-border-color: #565e64;
--bs-btn-focus-shadow-rgb: 130, 138, 145;
--bs-btn-active-color: #fff;
--bs-btn-active-bg: #565e64;
--bs-btn-active-border-color: #51585e;
--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
--bs-btn-disabled-color: #fff;
--bs-btn-disabled-bg: #6c757d;
--bs-btn-disabled-border-color: #6c757d;
}
.btn-success {
--bs-btn-color: #fff;
--bs-btn-bg: #198754;
--bs-btn-border-color: #198754;
--bs-btn-hover-color: #fff;
--bs-btn-hover-bg: #157347;
--bs-btn-hover-border-color: #146c43;
--bs-btn-focus-shadow-rgb: 60, 153, 110;
--bs-btn-active-color: #fff;
--bs-btn-active-bg: #146c43;
--bs-btn-active-border-color: #13653f;
--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
--bs-btn-disabled-color: #fff;
--bs-btn-disabled-bg: #198754;
--bs-btn-disabled-border-color: #198754;
}
.btn-info {
--bs-btn-color: #000;
--bs-btn-bg: #0dcaf0;
--bs-btn-border-color: #0dcaf0;
--bs-btn-hover-color: #000;
--bs-btn-hover-bg: #31d2f2;
--bs-btn-hover-border-color: #25cff2;
--bs-btn-focus-shadow-rgb: 11, 172, 204;
--bs-btn-active-color: #000;
--bs-btn-active-bg: #3dd5f3;
--bs-btn-active-border-color: #25cff2;
--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
--bs-btn-disabled-color: #000;
--bs-btn-disabled-bg: #0dcaf0;
--bs-btn-disabled-border-color: #0dcaf0;
}
.btn-warning {
--bs-btn-color: #000;
--bs-btn-bg: #ffc107;
--bs-btn-border-color: #ffc107;
--bs-btn-hover-color: #000;
--bs-btn-hover-bg: #ffca2c;
--bs-btn-hover-border-color: #ffc720;
--bs-btn-focus-shadow-rgb: 217, 164, 6;
--bs-btn-active-color: #000;
--bs-btn-active-bg: #ffcd39;
--bs-btn-active-border-color: #ffc720;
--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
--bs-btn-disabled-color: #000;
--bs-btn-disabled-bg: #ffc107;
--bs-btn-disabled-border-color: #ffc107;
}
.btn-danger {
--bs-btn-color: #fff;
--bs-btn-bg: #dc3545;
--bs-btn-border-color: #dc3545;
--bs-btn-hover-color: #fff;
--bs-btn-hover-bg: #bb2d3b;
--bs-btn-hover-border-color: #b02a37;
--bs-btn-focus-shadow-rgb: 225, 83, 97;
--bs-btn-active-color: #fff;
--bs-btn-active-bg: #b02a37;
--bs-btn-active-border-color: #a52834;
--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
--bs-btn-disabled-color: #fff;
--bs-btn-disabled-bg: #dc3545;
--bs-btn-disabled-border-color: #dc3545;
}
.btn-light {
--bs-btn-color: #000;
--bs-btn-bg: #f8f9fa;
--bs-btn-border-color: #f8f9fa;
--bs-btn-hover-color: #000;
--bs-btn-hover-bg: #d3d4d5;
--bs-btn-hover-border-color: #c6c7c8;
--bs-btn-focus-shadow-rgb: 211, 212, 213;
--bs-btn-active-color: #000;
--bs-btn-active-bg: #c6c7c8;
--bs-btn-active-border-color: #babbbc;
--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
--bs-btn-disabled-color: #000;
--bs-btn-disabled-bg: #f8f9fa;
--bs-btn-disabled-border-color: #f8f9fa;
}
.btn-dark {
--bs-btn-color: #fff;
--bs-btn-bg: #212529;
--bs-btn-border-color: #212529;
--bs-btn-hover-color: #fff;
--bs-btn-hover-bg: #424649;
--bs-btn-hover-border-color: #373b3e;
--bs-btn-focus-shadow-rgb: 66, 70, 73;
--bs-btn-active-color: #fff;
--bs-btn-active-bg: #4d5154;
--bs-btn-active-border-color: #373b3e;
--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
--bs-btn-disabled-color: #fff;
--bs-btn-disabled-bg: #212529;
--bs-btn-disabled-border-color: #212529;
}
.btn-outline-primary {
--bs-btn-color: #0d6efd;
--bs-btn-border-color: #0d6efd;
--bs-btn-hover-color: #fff;
--bs-btn-hover-bg: #0d6efd;
--bs-btn-hover-border-color: #0d6efd;
--bs-btn-focus-shadow-rgb: 13, 110, 253;
--bs-btn-active-color: #fff;
--bs-btn-active-bg: #0d6efd;
--bs-btn-active-border-color: #0d6efd;
--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
--bs-btn-disabled-color: #0d6efd;
--bs-btn-disabled-bg: transparent;
--bs-btn-disabled-border-color: #0d6efd;
--bs-gradient: none;
}
.btn-outline-secondary {
--bs-btn-color: #6c757d;
--bs-btn-border-color: #6c757d;
--bs-btn-hover-color: #fff;
--bs-btn-hover-bg: #6c757d;
--bs-btn-hover-border-color: #6c757d;
--bs-btn-focus-shadow-rgb: 108, 117, 125;
--bs-btn-active-color: #fff;
--bs-btn-active-bg: #6c757d;
--bs-btn-active-border-color: #6c757d;
--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
--bs-btn-disabled-color: #6c757d;
--bs-btn-disabled-bg: transparent;
--bs-btn-disabled-border-color: #6c757d;
--bs-gradient: none;
}
.btn-outline-success {
--bs-btn-color: #198754;
--bs-btn-border-color: #198754;
--bs-btn-hover-color: #fff;
--bs-btn-hover-bg: #198754;
--bs-btn-hover-border-color: #198754;
--bs-btn-focus-shadow-rgb: 25, 135, 84;
--bs-btn-active-color: #fff;
--bs-btn-active-bg: #198754;
--bs-btn-active-border-color: #198754;
--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
--bs-btn-disabled-color: #198754;
--bs-btn-disabled-bg: transparent;
--bs-btn-disabled-border-color: #198754;
--bs-gradient: none;
}
.btn-outline-info {
--bs-btn-color: #0dcaf0;
--bs-btn-border-color: #0dcaf0;
--bs-btn-hover-color: #000;
--bs-btn-hover-bg: #0dcaf0;
--bs-btn-hover-border-color: #0dcaf0;
--bs-btn-focus-shadow-rgb: 13, 202, 240;
--bs-btn-active-color: #000;
--bs-btn-active-bg: #0dcaf0;
--bs-btn-active-border-color: #0dcaf0;
--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
--bs-btn-disabled-color: #0dcaf0;
--bs-btn-disabled-bg: transparent;
--bs-btn-disabled-border-color: #0dcaf0;
--bs-gradient: none;
}
.btn-outline-warning {
--bs-btn-color: #ffc107;
--bs-btn-border-color: #ffc107;
--bs-btn-hover-color: #000;
--bs-btn-hover-bg: #ffc107;
--bs-btn-hover-border-color: #ffc107;
--bs-btn-focus-shadow-rgb: 255, 193, 7;
--bs-btn-active-color: #000;
--bs-btn-active-bg: #ffc107;
--bs-btn-active-border-color: #ffc107;
--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
--bs-btn-disabled-color: #ffc107;
--bs-btn-disabled-bg: transparent;
--bs-btn-disabled-border-color: #ffc107;
--bs-gradient: none;
}
.btn-outline-danger {
--bs-btn-color: #dc3545;
--bs-btn-border-color: #dc3545;
--bs-btn-hover-color: #fff;
--bs-btn-hover-bg: #dc3545;
--bs-btn-hover-border-color: #dc3545;
--bs-btn-focus-shadow-rgb: 220, 53, 69;
--bs-btn-active-color: #fff;
--bs-btn-active-bg: #dc3545;
--bs-btn-active-border-color: #dc3545;
--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
--bs-btn-disabled-color: #dc3545;
--bs-btn-disabled-bg: transparent;
--bs-btn-disabled-border-color: #dc3545;
--bs-gradient: none;
}
.btn-outline-light {
--bs-btn-color: #f8f9fa;
--bs-btn-border-color: #f8f9fa;
--bs-btn-hover-color: #000;
--bs-btn-hover-bg: #f8f9fa;
--bs-btn-hover-border-color: #f8f9fa;
--bs-btn-focus-shadow-rgb: 248, 249, 250;
--bs-btn-active-color: #000;
--bs-btn-active-bg: #f8f9fa;
--bs-btn-active-border-color: #f8f9fa;
--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
--bs-btn-disabled-color: #f8f9fa;
--bs-btn-disabled-bg: transparent;
--bs-btn-disabled-border-color: #f8f9fa;
--bs-gradient: none;
}
.btn-outline-dark {
--bs-btn-color: #212529;
--bs-btn-border-color: #212529;
--bs-btn-hover-color: #fff;
--bs-btn-hover-bg: #212529;
--bs-btn-hover-border-color: #212529;
--bs-btn-focus-shadow-rgb: 33, 37, 41;
--bs-btn-active-color: #fff;
--bs-btn-active-bg: #212529;
--bs-btn-active-border-color: #212529;
--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
--bs-btn-disabled-color: #212529;
--bs-btn-disabled-bg: transparent;
--bs-btn-disabled-border-color: #212529;
--bs-gradient: none;
}
.btn-link {
--bs-btn-font-weight: 400;
--bs-btn-color: var(--bs-link-color);
--bs-btn-bg: transparent;
--bs-btn-border-color: transparent;
--bs-btn-hover-color: var(--bs-link-hover-color);
--bs-btn-hover-border-color: transparent;
--bs-btn-active-color: var(--bs-link-hover-color);
--bs-btn-active-border-color: transparent;
--bs-btn-disabled-color: #6c757d;
--bs-btn-disabled-border-color: transparent;
--bs-btn-box-shadow: 0 0 0 #000;
--bs-btn-focus-shadow-rgb: 49, 132, 253;
text-decoration: underline;
}
.btn-link:focus-visible {
color: var(--bs-btn-color);
}
.btn-link:hover {
color: var(--bs-btn-hover-color);
}
.btn-lg, .btn-group-lg > .btn {
--bs-btn-padding-y: 0.5rem;
--bs-btn-padding-x: 1rem;
--bs-btn-font-size: 1.25rem;
--bs-btn-border-radius: var(--bs-border-radius-lg);
}
.btn-sm, .btn-group-sm > .btn {
--bs-btn-padding-y: 0.25rem;
--bs-btn-padding-x: 0.5rem;
--bs-btn-font-size: 0.875rem;
--bs-btn-border-radius: var(--bs-border-radius-sm);
}
.fade {
transition: opacity 0.15s linear;
}
@media (prefers-reduced-motion: reduce) {
.fade {
transition: none;
}
}
.fade:not(.show) {
opacity: 0;
}
.collapse:not(.show) {
display: none;
}
.collapsing {
height: 0;
overflow: hidden;
transition: height 0.35s ease;
}
@media (prefers-reduced-motion: reduce) {
.collapsing {
transition: none;
}
}
.collapsing.collapse-horizontal {
width: 0;
height: auto;
transition: width 0.35s ease;
}
@media (prefers-reduced-motion: reduce) {
.collapsing.collapse-horizontal {
transition: none;
}
}
.dropup,
.dropend,
.dropdown,
.dropstart,
.dropup-center,
.dropdown-center {
position: relative;
}
.dropdown-toggle {
white-space: nowrap;
}
.dropdown-toggle::after {
display: inline-block;
margin-left: 0.255em;
vertical-align: 0.255em;
content: "";
border-top: 0.3em solid;
border-right: 0.3em solid transparent;
border-bottom: 0;
border-left: 0.3em solid transparent;
}
.dropdown-toggle:empty::after {
margin-left: 0;
}
.dropdown-menu {
--bs-dropdown-zindex: 1000;
--bs-dropdown-min-width: 10rem;
--bs-dropdown-padding-x: 0;
--bs-dropdown-padding-y: 0.5rem;
--bs-dropdown-spacer: 0.125rem;
--bs-dropdown-font-size: 1rem;
--bs-dropdown-color: var(--bs-body-color);
--bs-dropdown-bg: var(--bs-body-bg);
--bs-dropdown-border-color: var(--bs-border-color-translucent);
--bs-dropdown-border-radius: var(--bs-border-radius);
--bs-dropdown-border-width: var(--bs-border-width);
--bs-dropdown-inner-border-radius: calc(var(--bs-border-radius) - var(--bs-border-width));
--bs-dropdown-divider-bg: var(--bs-border-color-translucent);
--bs-dropdown-divider-margin-y: 0.5rem;
--bs-dropdown-box-shadow: var(--bs-box-shadow);
--bs-dropdown-link-color: var(--bs-body-color);
--bs-dropdown-link-hover-color: var(--bs-body-color);
--bs-dropdown-link-hover-bg: var(--bs-tertiary-bg);
--bs-dropdown-link-active-color: #fff;
--bs-dropdown-link-active-bg: #0d6efd;
--bs-dropdown-link-disabled-color: var(--bs-tertiary-color);
--bs-dropdown-item-padding-x: 1rem;
--bs-dropdown-item-padding-y: 0.25rem;
--bs-dropdown-header-color: #6c757d;
--bs-dropdown-header-padding-x: 1rem;
--bs-dropdown-header-padding-y: 0.5rem;
position: absolute;
z-index: var(--bs-dropdown-zindex);
display: none;
min-width: var(--bs-dropdown-min-width);
padding: var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x);
margin: 0;
font-size: var(--bs-dropdown-font-size);
color: var(--bs-dropdown-color);
text-align: left;
list-style: none;
background-color: var(--bs-dropdown-bg);
background-clip: padding-box;
border: var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color);
border-radius: var(--bs-dropdown-border-radius);
}
.dropdown-menu[data-bs-popper] {
top: 100%;
left: 0;
margin-top: var(--bs-dropdown-spacer);
}
.dropdown-menu-start {
--bs-position: start;
}
.dropdown-menu-start[data-bs-popper] {
right: auto;
left: 0;
}
.dropdown-menu-end {
--bs-position: end;
}
.dropdown-menu-end[data-bs-popper] {
right: 0;
left: auto;
}
@media (min-width: 576px) {
.dropdown-menu-sm-start {
--bs-position: start;
}
.dropdown-menu-sm-start[data-bs-popper] {
right: auto;
left: 0;
}
.dropdown-menu-sm-end {
--bs-position: end;
}
.dropdown-menu-sm-end[data-bs-popper] {
right: 0;
left: auto;
}
}
@media (min-width: 768px) {
.dropdown-menu-md-start {
--bs-position: start;
}
.dropdown-menu-md-start[data-bs-popper] {
right: auto;
left: 0;
}
.dropdown-menu-md-end {
--bs-position: end;
}
.dropdown-menu-md-end[data-bs-popper] {
right: 0;
left: auto;
}
}
@media (min-width: 992px) {
.dropdown-menu-lg-start {
--bs-position: start;
}
.dropdown-menu-lg-start[data-bs-popper] {
right: auto;
left: 0;
}
.dropdown-menu-lg-end {
--bs-position: end;
}
.dropdown-menu-lg-end[data-bs-popper] {
right: 0;
left: auto;
}
}
@media (min-width: 1200px) {
.dropdown-menu-xl-start {
--bs-position: start;
}
.dropdown-menu-xl-start[data-bs-popper] {
right: auto;
left: 0;
}
.dropdown-menu-xl-end {
--bs-position: end;
}
.dropdown-menu-xl-end[data-bs-popper] {
right: 0;
left: auto;
}
}
@media (min-width: 1400px) {
.dropdown-menu-xxl-start {
--bs-position: start;
}
.dropdown-menu-xxl-start[data-bs-popper] {
right: auto;
left: 0;
}
.dropdown-menu-xxl-end {
--bs-position: end;
}
.dropdown-menu-xxl-end[data-bs-popper] {
right: 0;
left: auto;
}
}
.dropup .dropdown-menu[data-bs-popper] {
top: auto;
bottom: 100%;
margin-top: 0;
margin-bottom: var(--bs-dropdown-spacer);
}
.dropup .dropdown-toggle::after {
display: inline-block;
margin-left: 0.255em;
vertical-align: 0.255em;
content: "";
border-top: 0;
border-right: 0.3em solid transparent;
border-bottom: 0.3em solid;
border-left: 0.3em solid transparent;
}
.dropup .dropdown-toggle:empty::after {
margin-left: 0;
}
.dropend .dropdown-menu[data-bs-popper] {
top: 0;
right: auto;
left: 100%;
margin-top: 0;
margin-left: var(--bs-dropdown-spacer);
}
.dropend .dropdown-toggle::after {
display: inline-block;
margin-left: 0.255em;
vertical-align: 0.255em;
content: "";
border-top: 0.3em solid transparent;
border-right: 0;
border-bottom: 0.3em solid transparent;
border-left: 0.3em solid;
}
.dropend .dropdown-toggle:empty::after {
margin-left: 0;
}
.dropend .dropdown-toggle::after {
vertical-align: 0;
}
.dropstart .dropdown-menu[data-bs-popper] {
top: 0;
right: 100%;
left: auto;
margin-top: 0;
margin-right: var(--bs-dropdown-spacer);
}
.dropstart .dropdown-toggle::after {
display: inline-block;
margin-left: 0.255em;
vertical-align: 0.255em;
content: "";
}
.dropstart .dropdown-toggle::after {
display: none;
}
.dropstart .dropdown-toggle::before {
display: inline-block;
margin-right: 0.255em;
vertical-align: 0.255em;
content: "";
border-top: 0.3em solid transparent;
border-right: 0.3em solid;
border-bottom: 0.3em solid transparent;
}
.dropstart .dropdown-toggle:empty::after {
margin-left: 0;
}
.dropstart .dropdown-toggle::before {
vertical-align: 0;
}
.dropdown-divider {
height: 0;
margin: var(--bs-dropdown-divider-margin-y) 0;
overflow: hidden;
border-top: 1px solid var(--bs-dropdown-divider-bg);
opacity: 1;
}
.dropdown-item {
display: block;
width: 100%;
padding: var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);
clear: both;
font-weight: 400;
color: var(--bs-dropdown-link-color);
text-align: inherit;
text-decoration: none;
white-space: nowrap;
background-color: transparent;
border: 0;
border-radius: var(--bs-dropdown-item-border-radius, 0);
}
.dropdown-item:hover, .dropdown-item:focus {
color: var(--bs-dropdown-link-hover-color);
background-color: var(--bs-dropdown-link-hover-bg);
}
.dropdown-item.active, .dropdown-item:active {
color: var(--bs-dropdown-link-active-color);
text-decoration: none;
background-color: var(--bs-dropdown-link-active-bg);
}
.dropdown-item.disabled, .dropdown-item:disabled {
color: var(--bs-dropdown-link-disabled-color);
pointer-events: none;
background-color: transparent;
}
.dropdown-menu.show {
display: block;
}
.dropdown-header {
display: block;
padding: var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x);
margin-bottom: 0;
font-size: 0.875rem;
color: var(--bs-dropdown-header-color);
white-space: nowrap;
}
.dropdown-item-text {
display: block;
padding: var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);
color: var(--bs-dropdown-link-color);
}
.dropdown-menu-dark {
--bs-dropdown-color: #dee2e6;
--bs-dropdown-bg: #343a40;
--bs-dropdown-border-color: var(--bs-border-color-translucent);
--bs-dropdown-box-shadow: ;
--bs-dropdown-link-color: #dee2e6;
--bs-dropdown-link-hover-color: #fff;
--bs-dropdown-divider-bg: var(--bs-border-color-translucent);
--bs-dropdown-link-hover-bg: rgba(255, 255, 255, 0.15);
--bs-dropdown-link-active-color: #fff;
--bs-dropdown-link-active-bg: #0d6efd;
--bs-dropdown-link-disabled-color: #adb5bd;
--bs-dropdown-header-color: #adb5bd;
}
.btn-group,
.btn-group-vertical {
position: relative;
display: inline-flex;
vertical-align: middle;
}
.btn-group > .btn,
.btn-group-vertical > .btn {
position: relative;
flex: 1 1 auto;
}
.btn-group > .btn-check:checked + .btn,
.btn-group > .btn-check:focus + .btn,
.btn-group > .btn:hover,
.btn-group > .btn:focus,
.btn-group > .btn:active,
.btn-group > .btn.active,
.btn-group-vertical > .btn-check:checked + .btn,
.btn-group-vertical > .btn-check:focus + .btn,
.btn-group-vertical > .btn:hover,
.btn-group-vertical > .btn:focus,
.btn-group-vertical > .btn:active,
.btn-group-vertical > .btn.active {
z-index: 1;
}
.btn-toolbar {
display: flex;
flex-wrap: wrap;
justify-content: flex-start;
}
.btn-toolbar .input-group {
width: auto;
}
.btn-group {
border-radius: var(--bs-border-radius);
}
.btn-group > :not(.btn-check:first-child) + .btn,
.btn-group > .btn-group:not(:first-child) {
margin-left: calc(var(--bs-border-width) * -1);
}
.btn-group > .btn:not(:last-child):not(.dropdown-toggle),
.btn-group > .btn.dropdown-toggle-split:first-child,
.btn-group > .btn-group:not(:last-child) > .btn {
border-top-right-radius: 0;
border-bottom-right-radius: 0;
}
.btn-group > .btn:nth-child(n+3),
.btn-group > :not(.btn-check) + .btn,
.btn-group > .btn-group:not(:first-child) > .btn {
border-top-left-radius: 0;
border-bottom-left-radius: 0;
}
.dropdown-toggle-split {
padding-right: 0.5625rem;
padding-left: 0.5625rem;
}
.dropdown-toggle-split::after, .dropup .dropdown-toggle-split::after, .dropend .dropdown-toggle-split::after {
margin-left: 0;
}
.dropstart .dropdown-toggle-split::before {
margin-right: 0;
}
.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split {
padding-right: 0.375rem;
padding-left: 0.375rem;
}
.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split {
padding-right: 0.75rem;
padding-left: 0.75rem;
}
.btn-group-vertical {
flex-direction: column;
align-items: flex-start;
justify-content: center;
}
.btn-group-vertical > .btn,
.btn-group-vertical > .btn-group {
width: 100%;
}
.btn-group-vertical > .btn:not(:first-child),
.btn-group-vertical > .btn-group:not(:first-child) {
margin-top: calc(var(--bs-border-width) * -1);
}
.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle),
.btn-group-vertical > .btn-group:not(:last-child) > .btn {
border-bottom-right-radius: 0;
border-bottom-left-radius: 0;
}
.btn-group-vertical > .btn ~ .btn,
.btn-group-vertical > .btn-group:not(:first-child) > .btn {
border-top-left-radius: 0;
border-top-right-radius: 0;
}
.nav {
--bs-nav-link-padding-x: 1rem;
--bs-nav-link-padding-y: 0.5rem;
--bs-nav-link-font-weight: ;
--bs-nav-link-color: var(--bs-link-color);
--bs-nav-link-hover-color: var(--bs-link-hover-color);
--bs-nav-link-disabled-color: var(--bs-secondary-color);
display: flex;
flex-wrap: wrap;
padding-left: 0;
margin-bottom: 0;
list-style: none;
}
.nav-link {
display: block;
padding: var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);
font-size: var(--bs-nav-link-font-size);
font-weight: var(--bs-nav-link-font-weight);
color: var(--bs-nav-link-color);
text-decoration: none;
background: none;
border: 0;
transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out;
}
@media (prefers-reduced-motion: reduce) {
.nav-link {
transition: none;
}
}
.nav-link:hover, .nav-link:focus {
color: var(--bs-nav-link-hover-color);
}
.nav-link:focus-visible {
outline: 0;
box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);
}
.nav-link.disabled, .nav-link:disabled {
color: var(--bs-nav-link-disabled-color);
pointer-events: none;
cursor: default;
}
.nav-tabs {
--bs-nav-tabs-border-width: var(--bs-border-width);
--bs-nav-tabs-border-color: var(--bs-border-color);
--bs-nav-tabs-border-radius: var(--bs-border-radius);
--bs-nav-tabs-link-hover-border-color: var(--bs-secondary-bg) var(--bs-secondary-bg) var(--bs-border-color);
--bs-nav-tabs-link-active-color: var(--bs-emphasis-color);
--bs-nav-tabs-link-active-bg: var(--bs-body-bg);
--bs-nav-tabs-link-active-border-color: var(--bs-border-color) var(--bs-border-color) var(--bs-body-bg);
border-bottom: var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color);
}
.nav-tabs .nav-link {
margin-bottom: calc(-1 * var(--bs-nav-tabs-border-width));
border: var(--bs-nav-tabs-border-width) solid transparent;
border-top-left-radius: var(--bs-nav-tabs-border-radius);
border-top-right-radius: var(--bs-nav-tabs-border-radius);
}
.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus {
isolation: isolate;
border-color: var(--bs-nav-tabs-link-hover-border-color);
}
.nav-tabs .nav-link.active,
.nav-tabs .nav-item.show .nav-link {
color: var(--bs-nav-tabs-link-active-color);
background-color: var(--bs-nav-tabs-link-active-bg);
border-color: var(--bs-nav-tabs-link-active-border-color);
}
.nav-tabs .dropdown-menu {
margin-top: calc(-1 * var(--bs-nav-tabs-border-width));
border-top-left-radius: 0;
border-top-right-radius: 0;
}
.nav-pills {
--bs-nav-pills-border-radius: var(--bs-border-radius);
--bs-nav-pills-link-active-color: #fff;
--bs-nav-pills-link-active-bg: #0d6efd;
}
.nav-pills .nav-link {
border-radius: var(--bs-nav-pills-border-radius);
}
.nav-pills .nav-link.active,
.nav-pills .show > .nav-link {
color: var(--bs-nav-pills-link-active-color);
background-color: var(--bs-nav-pills-link-active-bg);
}
.nav-underline {
--bs-nav-underline-gap: 1rem;
--bs-nav-underline-border-width: 0.125rem;
--bs-nav-underline-link-active-color: var(--bs-emphasis-color);
gap: var(--bs-nav-underline-gap);
}
.nav-underline .nav-link {
padding-right: 0;
padding-left: 0;
border-bottom: var(--bs-nav-underline-border-width) solid transparent;
}
.nav-underline .nav-link:hover, .nav-underline .nav-link:focus {
border-bottom-color: currentcolor;
}
.nav-underline .nav-link.active,
.nav-underline .show > .nav-link {
font-weight: 700;
color: var(--bs-nav-underline-link-active-color);
border-bottom-color: currentcolor;
}
.nav-fill > .nav-link,
.nav-fill .nav-item {
flex: 1 1 auto;
text-align: center;
}
.nav-justified > .nav-link,
.nav-justified .nav-item {
flex-basis: 0;
flex-grow: 1;
text-align: center;
}
.nav-fill .nav-item .nav-link,
.nav-justified .nav-item .nav-link {
width: 100%;
}
.tab-content > .tab-pane {
display: none;
}
.tab-content > .active {
display: block;
}
.navbar {
--bs-navbar-padding-x: 0;
--bs-navbar-padding-y: 0.5rem;
--bs-navbar-color: rgba(var(--bs-emphasis-color-rgb), 0.65);
--bs-navbar-hover-color: rgba(var(--bs-emphasis-color-rgb), 0.8);
--bs-navbar-disabled-color: rgba(var(--bs-emphasis-color-rgb), 0.3);
--bs-navbar-active-color: rgba(var(--bs-emphasis-color-rgb), 1);
--bs-navbar-brand-padding-y: 0.3125rem;
--bs-navbar-brand-margin-end: 1rem;
--bs-navbar-brand-font-size: 1.25rem;
--bs-navbar-brand-color: rgba(var(--bs-emphasis-color-rgb), 1);
--bs-navbar-brand-hover-color: rgba(var(--bs-emphasis-color-rgb), 1);
--bs-navbar-nav-link-padding-x: 0.5rem;
--bs-navbar-toggler-padding-y: 0.25rem;
--bs-navbar-toggler-padding-x: 0.75rem;
--bs-navbar-toggler-font-size: 1.25rem;
--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%2833, 37, 41, 0.75%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");
--bs-navbar-toggler-border-color: rgba(var(--bs-emphasis-color-rgb), 0.15);
--bs-navbar-toggler-border-radius: var(--bs-border-radius);
--bs-navbar-toggler-focus-width: 0.25rem;
--bs-navbar-toggler-transition: box-shadow 0.15s ease-in-out;
position: relative;
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: space-between;
padding: var(--bs-navbar-padding-y) var(--bs-navbar-padding-x);
}
.navbar > .container,
.navbar > .container-fluid,
.navbar > .container-sm,
.navbar > .container-md,
.navbar > .container-lg,
.navbar > .container-xl,
.navbar > .container-xxl {
display: flex;
flex-wrap: inherit;
align-items: center;
justify-content: space-between;
}
.navbar-brand {
padding-top: var(--bs-navbar-brand-padding-y);
padding-bottom: var(--bs-navbar-brand-padding-y);
margin-right: var(--bs-navbar-brand-margin-end);
font-size: var(--bs-navbar-brand-font-size);
color: var(--bs-navbar-brand-color);
text-decoration: none;
white-space: nowrap;
}
.navbar-brand:hover, .navbar-brand:focus {
color: var(--bs-navbar-brand-hover-color);
}
.navbar-nav {
--bs-nav-link-padding-x: 0;
--bs-nav-link-padding-y: 0.5rem;
--bs-nav-link-font-weight: ;
--bs-nav-link-color: var(--bs-navbar-color);
--bs-nav-link-hover-color: var(--bs-navbar-hover-color);
--bs-nav-link-disabled-color: var(--bs-navbar-disabled-color);
display: flex;
flex-direction: column;
padding-left: 0;
margin-bottom: 0;
list-style: none;
}
.navbar-nav .nav-link.active, .navbar-nav .nav-link.show {
color: var(--bs-navbar-active-color);
}
.navbar-nav .dropdown-menu {
position: static;
}
.navbar-text {
padding-top: 0.5rem;
padding-bottom: 0.5rem;
color: var(--bs-navbar-color);
}
.navbar-text a,
.navbar-text a:hover,
.navbar-text a:focus {
color: var(--bs-navbar-active-color);
}
.navbar-collapse {
flex-basis: 100%;
flex-grow: 1;
align-items: center;
}
.navbar-toggler {
padding: var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x);
font-size: var(--bs-navbar-toggler-font-size);
line-height: 1;
color: var(--bs-navbar-color);
background-color: transparent;
border: var(--bs-border-width) solid var(--bs-navbar-toggler-border-color);
border-radius: var(--bs-navbar-toggler-border-radius);
transition: var(--bs-navbar-toggler-transition);
}
@media (prefers-reduced-motion: reduce) {
.navbar-toggler {
transition: none;
}
}
.navbar-toggler:hover {
text-decoration: none;
}
.navbar-toggler:focus {
text-decoration: none;
outline: 0;
box-shadow: 0 0 0 var(--bs-navbar-toggler-focus-width);
}
.navbar-toggler-icon {
display: inline-block;
width: 1.5em;
height: 1.5em;
vertical-align: middle;
background-image: var(--bs-navbar-toggler-icon-bg);
background-repeat: no-repeat;
background-position: center;
background-size: 100%;
}
.navbar-nav-scroll {
max-height: var(--bs-scroll-height, 75vh);
overflow-y: auto;
}
@media (min-width: 576px) {
.navbar-expand-sm {
flex-wrap: nowrap;
justify-content: flex-start;
}
.navbar-expand-sm .navbar-nav {
flex-direction: row;
}
.navbar-expand-sm .navbar-nav .dropdown-menu {
position: absolute;
}
.navbar-expand-sm .navbar-nav .nav-link {
padding-right: var(--bs-navbar-nav-link-padding-x);
padding-left: var(--bs-navbar-nav-link-padding-x);
}
.navbar-expand-sm .navbar-nav-scroll {
overflow: visible;
}
.navbar-expand-sm .navbar-collapse {
display: flex !important;
flex-basis: auto;
}
.navbar-expand-sm .navbar-toggler {
display: none;
}
.navbar-expand-sm .offcanvas {
position: static;
z-index: auto;
flex-grow: 1;
width: auto !important;
height: auto !important;
visibility: visible !important;
background-color: transparent !important;
border: 0 !important;
transform: none !important;
transition: none;
}
.navbar-expand-sm .offcanvas .offcanvas-header {
display: none;
}
.navbar-expand-sm .offcanvas .offcanvas-body {
display: flex;
flex-grow: 0;
padding: 0;
overflow-y: visible;
}
}
@media (min-width: 768px) {
.navbar-expand-md {
flex-wrap: nowrap;
justify-content: flex-start;
}
.navbar-expand-md .navbar-nav {
flex-direction: row;
}
.navbar-expand-md .navbar-nav .dropdown-menu {
position: absolute;
}
.navbar-expand-md .navbar-nav .nav-link {
padding-right: var(--bs-navbar-nav-link-padding-x);
padding-left: var(--bs-navbar-nav-link-padding-x);
}
.navbar-expand-md .navbar-nav-scroll {
overflow: visible;
}
.navbar-expand-md .navbar-collapse {
display: flex !important;
flex-basis: auto;
}
.navbar-expand-md .navbar-toggler {
display: none;
}
.navbar-expand-md .offcanvas {
position: static;
z-index: auto;
flex-grow: 1;
width: auto !important;
height: auto !important;
visibility: visible !important;
background-color: transparent !important;
border: 0 !important;
transform: none !important;
transition: none;
}
.navbar-expand-md .offcanvas .offcanvas-header {
display: none;
}
.navbar-expand-md .offcanvas .offcanvas-body {
display: flex;
flex-grow: 0;
padding: 0;
overflow-y: visible;
}
}
@media (min-width: 992px) {
.navbar-expand-lg {
flex-wrap: nowrap;
justify-content: flex-start;
}
.navbar-expand-lg .navbar-nav {
flex-direction: row;
}
.navbar-expand-lg .navbar-nav .dropdown-menu {
position: absolute;
}
.navbar-expand-lg .navbar-nav .nav-link {
padding-right: var(--bs-navbar-nav-link-padding-x);
padding-left: var(--bs-navbar-nav-link-padding-x);
}
.navbar-expand-lg .navbar-nav-scroll {
overflow: visible;
}
.navbar-expand-lg .navbar-collapse {
display: flex !important;
flex-basis: auto;
}
.navbar-expand-lg .navbar-toggler {
display: none;
}
.navbar-expand-lg .offcanvas {
position: static;
z-index: auto;
flex-grow: 1;
width: auto !important;
height: auto !important;
visibility: visible !important;
background-color: transparent !important;
border: 0 !important;
transform: none !important;
transition: none;
}
.navbar-expand-lg .offcanvas .offcanvas-header {
display: none;
}
.navbar-expand-lg .offcanvas .offcanvas-body {
display: flex;
flex-grow: 0;
padding: 0;
overflow-y: visible;
}
}
@media (min-width: 1200px) {
.navbar-expand-xl {
flex-wrap: nowrap;
justify-content: flex-start;
}
.navbar-expand-xl .navbar-nav {
flex-direction: row;
}
.navbar-expand-xl .navbar-nav .dropdown-menu {
position: absolute;
}
.navbar-expand-xl .navbar-nav .nav-link {
padding-right: var(--bs-navbar-nav-link-padding-x);
padding-left: var(--bs-navbar-nav-link-padding-x);
}
.navbar-expand-xl .navbar-nav-scroll {
overflow: visible;
}
.navbar-expand-xl .navbar-collapse {
display: flex !important;
flex-basis: auto;
}
.navbar-expand-xl .navbar-toggler {
display: none;
}
.navbar-expand-xl .offcanvas {
position: static;
z-index: auto;
flex-grow: 1;
width: auto !important;
height: auto !important;
visibility: visible !important;
background-color: transparent !important;
border: 0 !important;
transform: none !important;
transition: none;
}
.navbar-expand-xl .offcanvas .offcanvas-header {
display: none;
}
.navbar-expand-xl .offcanvas .offcanvas-body {
display: flex;
flex-grow: 0;
padding: 0;
overflow-y: visible;
}
}
@media (min-width: 1400px) {
.navbar-expand-xxl {
flex-wrap: nowrap;
justify-content: flex-start;
}
.navbar-expand-xxl .navbar-nav {
flex-direction: row;
}
.navbar-expand-xxl .navbar-nav .dropdown-menu {
position: absolute;
}
.navbar-expand-xxl .navbar-nav .nav-link {
padding-right: var(--bs-navbar-nav-link-padding-x);
padding-left: var(--bs-navbar-nav-link-padding-x);
}
.navbar-expand-xxl .navbar-nav-scroll {
overflow: visible;
}
.navbar-expand-xxl .navbar-collapse {
display: flex !important;
flex-basis: auto;
}
.navbar-expand-xxl .navbar-toggler {
display: none;
}
.navbar-expand-xxl .offcanvas {
position: static;
z-index: auto;
flex-grow: 1;
width: auto !important;
height: auto !important;
visibility: visible !important;
background-color: transparent !important;
border: 0 !important;
transform: none !important;
transition: none;
}
.navbar-expand-xxl .offcanvas .offcanvas-header {
display: none;
}
.navbar-expand-xxl .offcanvas .offcanvas-body {
display: flex;
flex-grow: 0;
padding: 0;
overflow-y: visible;
}
}
.navbar-expand {
flex-wrap: nowrap;
justify-content: flex-start;
}
.navbar-expand .navbar-nav {
flex-direction: row;
}
.navbar-expand .navbar-nav .dropdown-menu {
position: absolute;
}
.navbar-expand .navbar-nav .nav-link {
padding-right: var(--bs-navbar-nav-link-padding-x);
padding-left: var(--bs-navbar-nav-link-padding-x);
}
.navbar-expand .navbar-nav-scroll {
overflow: visible;
}
.navbar-expand .navbar-collapse {
display: flex !important;
flex-basis: auto;
}
.navbar-expand .navbar-toggler {
display: none;
}
.navbar-expand .offcanvas {
position: static;
z-index: auto;
flex-grow: 1;
width: auto !important;
height: auto !important;
visibility: visible !important;
background-color: transparent !important;
border: 0 !important;
transform: none !important;
transition: none;
}
.navbar-expand .offcanvas .offcanvas-header {
display: none;
}
.navbar-expand .offcanvas .offcanvas-body {
display: flex;
flex-grow: 0;
padding: 0;
overflow-y: visible;
}
.navbar-dark,
.navbar[data-bs-theme=dark] {
--bs-navbar-color: rgba(255, 255, 255, 0.55);
--bs-navbar-hover-color: rgba(255, 255, 255, 0.75);
--bs-navbar-disabled-color: rgba(255, 255, 255, 0.25);
--bs-navbar-active-color: #fff;
--bs-navbar-brand-color: #fff;
--bs-navbar-brand-hover-color: #fff;
--bs-navbar-toggler-border-color: rgba(255, 255, 255, 0.1);
--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");
}
[data-bs-theme=dark] .navbar-toggler-icon {
--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");
}
.card {
--bs-card-spacer-y: 1rem;
--bs-card-spacer-x: 1rem;
--bs-card-title-spacer-y: 0.5rem;
--bs-card-title-color: ;
--bs-card-subtitle-color: ;
--bs-card-border-width: var(--bs-border-width);
--bs-card-border-color: var(--bs-border-color-translucent);
--bs-card-border-radius: var(--bs-border-radius);
--bs-card-box-shadow: ;
--bs-card-inner-border-radius: calc(var(--bs-border-radius) - (var(--bs-border-width)));
--bs-card-cap-padding-y: 0.5rem;
--bs-card-cap-padding-x: 1rem;
--bs-card-cap-bg: rgba(var(--bs-body-color-rgb), 0.03);
--bs-card-cap-color: ;
--bs-card-height: ;
--bs-card-color: ;
--bs-card-bg: var(--bs-body-bg);
--bs-card-img-overlay-padding: 1rem;
--bs-card-group-margin: 0.75rem;
position: relative;
display: flex;
flex-direction: column;
min-width: 0;
height: var(--bs-card-height);
color: var(--bs-body-color);
word-wrap: break-word;
background-color: var(--bs-card-bg);
background-clip: border-box;
border: var(--bs-card-border-width) solid var(--bs-card-border-color);
border-radius: var(--bs-card-border-radius);
}
.card > hr {
margin-right: 0;
margin-left: 0;
}
.card > .list-group {
border-top: inherit;
border-bottom: inherit;
}
.card > .list-group:first-child {
border-top-width: 0;
border-top-left-radius: var(--bs-card-inner-border-radius);
border-top-right-radius: var(--bs-card-inner-border-radius);
}
.card > .list-group:last-child {
border-bottom-width: 0;
border-bottom-right-radius: var(--bs-card-inner-border-radius);
border-bottom-left-radius: var(--bs-card-inner-border-radius);
}
.card > .card-header + .list-group,
.card > .list-group + .card-footer {
border-top: 0;
}
.card-body {
flex: 1 1 auto;
padding: var(--bs-card-spacer-y) var(--bs-card-spacer-x);
color: var(--bs-card-color);
}
.card-title {
margin-bottom: var(--bs-card-title-spacer-y);
color: var(--bs-card-title-color);
}
.card-subtitle {
margin-top: calc(-0.5 * var(--bs-card-title-spacer-y));
margin-bottom: 0;
color: var(--bs-card-subtitle-color);
}
.card-text:last-child {
margin-bottom: 0;
}
.card-link + .card-link {
margin-left: var(--bs-card-spacer-x);
}
.card-header {
padding: var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);
margin-bottom: 0;
color: var(--bs-card-cap-color);
background-color: var(--bs-card-cap-bg);
border-bottom: var(--bs-card-border-width) solid var(--bs-card-border-color);
}
.card-header:first-child {
border-radius: var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0;
}
.card-footer {
padding: var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);
color: var(--bs-card-cap-color);
background-color: var(--bs-card-cap-bg);
border-top: var(--bs-card-border-width) solid var(--bs-card-border-color);
}
.card-footer:last-child {
border-radius: 0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius);
}
.card-header-tabs {
margin-right: calc(-0.5 * var(--bs-card-cap-padding-x));
margin-bottom: calc(-1 * var(--bs-card-cap-padding-y));
margin-left: calc(-0.5 * var(--bs-card-cap-padding-x));
border-bottom: 0;
}
.card-header-tabs .nav-link.active {
background-color: var(--bs-card-bg);
border-bottom-color: var(--bs-card-bg);
}
.card-header-pills {
margin-right: calc(-0.5 * var(--bs-card-cap-padding-x));
margin-left: calc(-0.5 * var(--bs-card-cap-padding-x));
}
.card-img-overlay {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
padding: var(--bs-card-img-overlay-padding);
border-radius: var(--bs-card-inner-border-radius);
}
.card-img,
.card-img-top,
.card-img-bottom {
width: 100%;
}
.card-img,
.card-img-top {
border-top-left-radius: var(--bs-card-inner-border-radius);
border-top-right-radius: var(--bs-card-inner-border-radius);
}
.card-img,
.card-img-bottom {
border-bottom-right-radius: var(--bs-card-inner-border-radius);
border-bottom-left-radius: var(--bs-card-inner-border-radius);
}
.card-group > .card {
margin-bottom: var(--bs-card-group-margin);
}
@media (min-width: 576px) {
.card-group {
display: flex;
flex-flow: row wrap;
}
.card-group > .card {
flex: 1 0 0%;
margin-bottom: 0;
}
.card-group > .card + .card {
margin-left: 0;
border-left: 0;
}
.card-group > .card:not(:last-child) {
border-top-right-radius: 0;
border-bottom-right-radius: 0;
}
.card-group > .card:not(:last-child) .card-img-top,
.card-group > .card:not(:last-child) .card-header {
border-top-right-radius: 0;
}
.card-group > .card:not(:last-child) .card-img-bottom,
.card-group > .card:not(:last-child) .card-footer {
border-bottom-right-radius: 0;
}
.card-group > .card:not(:first-child) {
border-top-left-radius: 0;
border-bottom-left-radius: 0;
}
.card-group > .card:not(:first-child) .card-img-top,
.card-group > .card:not(:first-child) .card-header {
border-top-left-radius: 0;
}
.card-group > .card:not(:first-child) .card-img-bottom,
.card-group > .card:not(:first-child) .card-footer {
border-bottom-left-radius: 0;
}
}
.accordion {
--bs-accordion-color: var(--bs-body-color);
--bs-accordion-bg: var(--bs-body-bg);
--bs-accordion-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, border-radius 0.15s ease;
--bs-accordion-border-color: var(--bs-border-color);
--bs-accordion-border-width: var(--bs-border-width);
--bs-accordion-border-radius: var(--bs-border-radius);
--bs-accordion-inner-border-radius: calc(var(--bs-border-radius) - (var(--bs-border-width)));
--bs-accordion-btn-padding-x: 1.25rem;
--bs-accordion-btn-padding-y: 1rem;
--bs-accordion-btn-color: var(--bs-body-color);
--bs-accordion-btn-bg: var(--bs-accordion-bg);
--bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23212529' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='M2 5L8 11L14 5'/%3e%3c/svg%3e");
--bs-accordion-btn-icon-width: 1.25rem;
--bs-accordion-btn-icon-transform: rotate(-180deg);
--bs-accordion-btn-icon-transition: transform 0.2s ease-in-out;
--bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23052c65' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='M2 5L8 11L14 5'/%3e%3c/svg%3e");
--bs-accordion-btn-focus-box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);
--bs-accordion-body-padding-x: 1.25rem;
--bs-accordion-body-padding-y: 1rem;
--bs-accordion-active-color: var(--bs-primary-text-emphasis);
--bs-accordion-active-bg: var(--bs-primary-bg-subtle);
}
.accordion-button {
position: relative;
display: flex;
align-items: center;
width: 100%;
padding: var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x);
font-size: 1rem;
color: var(--bs-accordion-btn-color);
text-align: left;
background-color: var(--bs-accordion-btn-bg);
border: 0;
border-radius: 0;
overflow-anchor: none;
transition: var(--bs-accordion-transition);
}
@media (prefers-reduced-motion: reduce) {
.accordion-button {
transition: none;
}
}
.accordion-button:not(.collapsed) {
color: var(--bs-accordion-active-color);
background-color: var(--bs-accordion-active-bg);
box-shadow: inset 0 calc(-1 * var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color);
}
.accordion-button:not(.collapsed)::after {
background-image: var(--bs-accordion-btn-active-icon);
transform: var(--bs-accordion-btn-icon-transform);
}
.accordion-button::after {
flex-shrink: 0;
width: var(--bs-accordion-btn-icon-width);
height: var(--bs-accordion-btn-icon-width);
margin-left: auto;
content: "";
background-image: var(--bs-accordion-btn-icon);
background-repeat: no-repeat;
background-size: var(--bs-accordion-btn-icon-width);
transition: var(--bs-accordion-btn-icon-transition);
}
@media (prefers-reduced-motion: reduce) {
.accordion-button::after {
transition: none;
}
}
.accordion-button:hover {
z-index: 2;
}
.accordion-button:focus {
z-index: 3;
outline: 0;
box-shadow: var(--bs-accordion-btn-focus-box-shadow);
}
.accordion-header {
margin-bottom: 0;
}
.accordion-item {
color: var(--bs-accordion-color);
background-color: var(--bs-accordion-bg);
border: var(--bs-accordion-border-width) solid var(--bs-accordion-border-color);
}
.accordion-item:first-of-type {
border-top-left-radius: var(--bs-accordion-border-radius);
border-top-right-radius: var(--bs-accordion-border-radius);
}
.accordion-item:first-of-type > .accordion-header .accordion-button {
border-top-left-radius: var(--bs-accordion-inner-border-radius);
border-top-right-radius: var(--bs-accordion-inner-border-radius);
}
.accordion-item:not(:first-of-type) {
border-top: 0;
}
.accordion-item:last-of-type {
border-bottom-right-radius: var(--bs-accordion-border-radius);
border-bottom-left-radius: var(--bs-accordion-border-radius);
}
.accordion-item:last-of-type > .accordion-header .accordion-button.collapsed {
border-bottom-right-radius: var(--bs-accordion-inner-border-radius);
border-bottom-left-radius: var(--bs-accordion-inner-border-radius);
}
.accordion-item:last-of-type > .accordion-collapse {
border-bottom-right-radius: var(--bs-accordion-border-radius);
border-bottom-left-radius: var(--bs-accordion-border-radius);
}
.accordion-body {
padding: var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x);
}
.accordion-flush > .accordion-item {
border-right: 0;
border-left: 0;
border-radius: 0;
}
.accordion-flush > .accordion-item:first-child {
border-top: 0;
}
.accordion-flush > .accordion-item:last-child {
border-bottom: 0;
}
.accordion-flush > .accordion-item > .accordion-header .accordion-button, .accordion-flush > .accordion-item > .accordion-header .accordion-button.collapsed {
border-radius: 0;
}
.accordion-flush > .accordion-item > .accordion-collapse {
border-radius: 0;
}
[data-bs-theme=dark] .accordion-button::after {
--bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236ea8fe'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");
--bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236ea8fe'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");
}
.breadcrumb {
--bs-breadcrumb-padding-x: 0;
--bs-breadcrumb-padding-y: 0;
--bs-breadcrumb-margin-bottom: 1rem;
--bs-breadcrumb-bg: ;
--bs-breadcrumb-border-radius: ;
--bs-breadcrumb-divider-color: var(--bs-secondary-color);
--bs-breadcrumb-item-padding-x: 0.5rem;
--bs-breadcrumb-item-active-color: var(--bs-secondary-color);
display: flex;
flex-wrap: wrap;
padding: var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x);
margin-bottom: var(--bs-breadcrumb-margin-bottom);
font-size: var(--bs-breadcrumb-font-size);
list-style: none;
background-color: var(--bs-breadcrumb-bg);
border-radius: var(--bs-breadcrumb-border-radius);
}
.breadcrumb-item + .breadcrumb-item {
padding-left: var(--bs-breadcrumb-item-padding-x);
}
.breadcrumb-item + .breadcrumb-item::before {
float: left;
padding-right: var(--bs-breadcrumb-item-padding-x);
color: var(--bs-breadcrumb-divider-color);
content: var(--bs-breadcrumb-divider, "/") /* rtl: var(--bs-breadcrumb-divider, "/") */;
}
.breadcrumb-item.active {
color: var(--bs-breadcrumb-item-active-color);
}
.pagination {
--bs-pagination-padding-x: 0.75rem;
--bs-pagination-padding-y: 0.375rem;
--bs-pagination-font-size: 1rem;
--bs-pagination-color: var(--bs-link-color);
--bs-pagination-bg: var(--bs-body-bg);
--bs-pagination-border-width: var(--bs-border-width);
--bs-pagination-border-color: var(--bs-border-color);
--bs-pagination-border-radius: var(--bs-border-radius);
--bs-pagination-hover-color: var(--bs-link-hover-color);
--bs-pagination-hover-bg: var(--bs-tertiary-bg);
--bs-pagination-hover-border-color: var(--bs-border-color);
--bs-pagination-focus-color: var(--bs-link-hover-color);
--bs-pagination-focus-bg: var(--bs-secondary-bg);
--bs-pagination-focus-box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);
--bs-pagination-active-color: #fff;
--bs-pagination-active-bg: #0d6efd;
--bs-pagination-active-border-color: #0d6efd;
--bs-pagination-disabled-color: var(--bs-secondary-color);
--bs-pagination-disabled-bg: var(--bs-secondary-bg);
--bs-pagination-disabled-border-color: var(--bs-border-color);
display: flex;
padding-left: 0;
list-style: none;
}
.page-link {
position: relative;
display: block;
padding: var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);
font-size: var(--bs-pagination-font-size);
color: var(--bs-pagination-color);
text-decoration: none;
background-color: var(--bs-pagination-bg);
border: var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);
transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
}
@media (prefers-reduced-motion: reduce) {
.page-link {
transition: none;
}
}
.page-link:hover {
z-index: 2;
color: var(--bs-pagination-hover-color);
background-color: var(--bs-pagination-hover-bg);
border-color: var(--bs-pagination-hover-border-color);
}
.page-link:focus {
z-index: 3;
color: var(--bs-pagination-focus-color);
background-color: var(--bs-pagination-focus-bg);
outline: 0;
box-shadow: var(--bs-pagination-focus-box-shadow);
}
.page-link.active, .active > .page-link {
z-index: 3;
color: var(--bs-pagination-active-color);
background-color: var(--bs-pagination-active-bg);
border-color: var(--bs-pagination-active-border-color);
}
.page-link.disabled, .disabled > .page-link {
color: var(--bs-pagination-disabled-color);
pointer-events: none;
background-color: var(--bs-pagination-disabled-bg);
border-color: var(--bs-pagination-disabled-border-color);
}
.page-item:not(:first-child) .page-link {
margin-left: calc(var(--bs-border-width) * -1);
}
.page-item:first-child .page-link {
border-top-left-radius: var(--bs-pagination-border-radius);
border-bottom-left-radius: var(--bs-pagination-border-radius);
}
.page-item:last-child .page-link {
border-top-right-radius: var(--bs-pagination-border-radius);
border-bottom-right-radius: var(--bs-pagination-border-radius);
}
.pagination-lg {
--bs-pagination-padding-x: 1.5rem;
--bs-pagination-padding-y: 0.75rem;
--bs-pagination-font-size: 1.25rem;
--bs-pagination-border-radius: var(--bs-border-radius-lg);
}
.pagination-sm {
--bs-pagination-padding-x: 0.5rem;
--bs-pagination-padding-y: 0.25rem;
--bs-pagination-font-size: 0.875rem;
--bs-pagination-border-radius: var(--bs-border-radius-sm);
}
.badge {
--bs-badge-padding-x: 0.65em;
--bs-badge-padding-y: 0.35em;
--bs-badge-font-size: 0.75em;
--bs-badge-font-weight: 700;
--bs-badge-color: #fff;
--bs-badge-border-radius: var(--bs-border-radius);
display: inline-block;
padding: var(--bs-badge-padding-y) var(--bs-badge-padding-x);
font-size: var(--bs-badge-font-size);
font-weight: var(--bs-badge-font-weight);
line-height: 1;
color: var(--bs-badge-color);
text-align: center;
white-space: nowrap;
vertical-align: baseline;
border-radius: var(--bs-badge-border-radius);
}
.badge:empty {
display: none;
}
.btn .badge {
position: relative;
top: -1px;
}
.alert {
--bs-alert-bg: transparent;
--bs-alert-padding-x: 1rem;
--bs-alert-padding-y: 1rem;
--bs-alert-margin-bottom: 1rem;
--bs-alert-color: inherit;
--bs-alert-border-color: transparent;
--bs-alert-border: var(--bs-border-width) solid var(--bs-alert-border-color);
--bs-alert-border-radius: var(--bs-border-radius);
--bs-alert-link-color: inherit;
position: relative;
padding: var(--bs-alert-padding-y) var(--bs-alert-padding-x);
margin-bottom: var(--bs-alert-margin-bottom);
color: var(--bs-alert-color);
background-color: var(--bs-alert-bg);
border: var(--bs-alert-border);
border-radius: var(--bs-alert-border-radius);
}
.alert-heading {
color: inherit;
}
.alert-link {
font-weight: 700;
color: var(--bs-alert-link-color);
}
.alert-dismissible {
padding-right: 3rem;
}
.alert-dismissible .btn-close {
position: absolute;
top: 0;
right: 0;
z-index: 2;
padding: 1.25rem 1rem;
}
.alert-primary {
--bs-alert-color: var(--bs-primary-text-emphasis);
--bs-alert-bg: var(--bs-primary-bg-subtle);
--bs-alert-border-color: var(--bs-primary-border-subtle);
--bs-alert-link-color: var(--bs-primary-text-emphasis);
}
.alert-secondary {
--bs-alert-color: var(--bs-secondary-text-emphasis);
--bs-alert-bg: var(--bs-secondary-bg-subtle);
--bs-alert-border-color: var(--bs-secondary-border-subtle);
--bs-alert-link-color: var(--bs-secondary-text-emphasis);
}
.alert-success {
--bs-alert-color: var(--bs-success-text-emphasis);
--bs-alert-bg: var(--bs-success-bg-subtle);
--bs-alert-border-color: var(--bs-success-border-subtle);
--bs-alert-link-color: var(--bs-success-text-emphasis);
}
.alert-info {
--bs-alert-color: var(--bs-info-text-emphasis);
--bs-alert-bg: var(--bs-info-bg-subtle);
--bs-alert-border-color: var(--bs-info-border-subtle);
--bs-alert-link-color: var(--bs-info-text-emphasis);
}
.alert-warning {
--bs-alert-color: var(--bs-warning-text-emphasis);
--bs-alert-bg: var(--bs-warning-bg-subtle);
--bs-alert-border-color: var(--bs-warning-border-subtle);
--bs-alert-link-color: var(--bs-warning-text-emphasis);
}
.alert-danger {
--bs-alert-color: var(--bs-danger-text-emphasis);
--bs-alert-bg: var(--bs-danger-bg-subtle);
--bs-alert-border-color: var(--bs-danger-border-subtle);
--bs-alert-link-color: var(--bs-danger-text-emphasis);
}
.alert-light {
--bs-alert-color: var(--bs-light-text-emphasis);
--bs-alert-bg: var(--bs-light-bg-subtle);
--bs-alert-border-color: var(--bs-light-border-subtle);
--bs-alert-link-color: var(--bs-light-text-emphasis);
}
.alert-dark {
--bs-alert-color: var(--bs-dark-text-emphasis);
--bs-alert-bg: var(--bs-dark-bg-subtle);
--bs-alert-border-color: var(--bs-dark-border-subtle);
--bs-alert-link-color: var(--bs-dark-text-emphasis);
}
@keyframes progress-bar-stripes {
0% {
background-position-x: 1rem;
}
}
.progress,
.progress-stacked {
--bs-progress-height: 1rem;
--bs-progress-font-size: 0.75rem;
--bs-progress-bg: var(--bs-secondary-bg);
--bs-progress-border-radius: var(--bs-border-radius);
--bs-progress-box-shadow: var(--bs-box-shadow-inset);
--bs-progress-bar-color: #fff;
--bs-progress-bar-bg: #0d6efd;
--bs-progress-bar-transition: width 0.6s ease;
display: flex;
height: var(--bs-progress-height);
overflow: hidden;
font-size: var(--bs-progress-font-size);
background-color: var(--bs-progress-bg);
border-radius: var(--bs-progress-border-radius);
}
.progress-bar {
display: flex;
flex-direction: column;
justify-content: center;
overflow: hidden;
color: var(--bs-progress-bar-color);
text-align: center;
white-space: nowrap;
background-color: var(--bs-progress-bar-bg);
transition: var(--bs-progress-bar-transition);
}
@media (prefers-reduced-motion: reduce) {
.progress-bar {
transition: none;
}
}
.progress-bar-striped {
background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
background-size: var(--bs-progress-height) var(--bs-progress-height);
}
.progress-stacked > .progress {
overflow: visible;
}
.progress-stacked > .progress > .progress-bar {
width: 100%;
}
.progress-bar-animated {
animation: 1s linear infinite progress-bar-stripes;
}
@media (prefers-reduced-motion: reduce) {
.progress-bar-animated {
animation: none;
}
}
.list-group {
--bs-list-group-color: var(--bs-body-color);
--bs-list-group-bg: var(--bs-body-bg);
--bs-list-group-border-color: var(--bs-border-color);
--bs-list-group-border-width: var(--bs-border-width);
--bs-list-group-border-radius: var(--bs-border-radius);
--bs-list-group-item-padding-x: 1rem;
--bs-list-group-item-padding-y: 0.5rem;
--bs-list-group-action-color: var(--bs-secondary-color);
--bs-list-group-action-hover-color: var(--bs-emphasis-color);
--bs-list-group-action-hover-bg: var(--bs-tertiary-bg);
--bs-list-group-action-active-color: var(--bs-body-color);
--bs-list-group-action-active-bg: var(--bs-secondary-bg);
--bs-list-group-disabled-color: var(--bs-secondary-color);
--bs-list-group-disabled-bg: var(--bs-body-bg);
--bs-list-group-active-color: #fff;
--bs-list-group-active-bg: #0d6efd;
--bs-list-group-active-border-color: #0d6efd;
display: flex;
flex-direction: column;
padding-left: 0;
margin-bottom: 0;
border-radius: var(--bs-list-group-border-radius);
}
.list-group-numbered {
list-style-type: none;
counter-reset: section;
}
.list-group-numbered > .list-group-item::before {
content: counters(section, ".") ". ";
counter-increment: section;
}
.list-group-item-action {
width: 100%;
color: var(--bs-list-group-action-color);
text-align: inherit;
}
.list-group-item-action:hover, .list-group-item-action:focus {
z-index: 1;
color: var(--bs-list-group-action-hover-color);
text-decoration: none;
background-color: var(--bs-list-group-action-hover-bg);
}
.list-group-item-action:active {
color: var(--bs-list-group-action-active-color);
background-color: var(--bs-list-group-action-active-bg);
}
.list-group-item {
position: relative;
display: block;
padding: var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x);
color: var(--bs-list-group-color);
text-decoration: none;
background-color: var(--bs-list-group-bg);
border: var(--bs-list-group-border-width) solid var(--bs-list-group-border-color);
}
.list-group-item:first-child {
border-top-left-radius: inherit;
border-top-right-radius: inherit;
}
.list-group-item:last-child {
border-bottom-right-radius: inherit;
border-bottom-left-radius: inherit;
}
.list-group-item.disabled, .list-group-item:disabled {
color: var(--bs-list-group-disabled-color);
pointer-events: none;
background-color: var(--bs-list-group-disabled-bg);
}
.list-group-item.active {
z-index: 2;
color: var(--bs-list-group-active-color);
background-color: var(--bs-list-group-active-bg);
border-color: var(--bs-list-group-active-border-color);
}
.list-group-item + .list-group-item {
border-top-width: 0;
}
.list-group-item + .list-group-item.active {
margin-top: calc(-1 * var(--bs-list-group-border-width));
border-top-width: var(--bs-list-group-border-width);
}
.list-group-horizontal {
flex-direction: row;
}
.list-group-horizontal > .list-group-item:first-child:not(:last-child) {
border-bottom-left-radius: var(--bs-list-group-border-radius);
border-top-right-radius: 0;
}
.list-group-horizontal > .list-group-item:last-child:not(:first-child) {
border-top-right-radius: var(--bs-list-group-border-radius);
border-bottom-left-radius: 0;
}
.list-group-horizontal > .list-group-item.active {
margin-top: 0;
}
.list-group-horizontal > .list-group-item + .list-group-item {
border-top-width: var(--bs-list-group-border-width);
border-left-width: 0;
}
.list-group-horizontal > .list-group-item + .list-group-item.active {
margin-left: calc(-1 * var(--bs-list-group-border-width));
border-left-width: var(--bs-list-group-border-width);
}
@media (min-width: 576px) {
.list-group-horizontal-sm {
flex-direction: row;
}
.list-group-horizontal-sm > .list-group-item:first-child:not(:last-child) {
border-bottom-left-radius: var(--bs-list-group-border-radius);
border-top-right-radius: 0;
}
.list-group-horizontal-sm > .list-group-item:last-child:not(:first-child) {
border-top-right-radius: var(--bs-list-group-border-radius);
border-bottom-left-radius: 0;
}
.list-group-horizontal-sm > .list-group-item.active {
margin-top: 0;
}
.list-group-horizontal-sm > .list-group-item + .list-group-item {
border-top-width: var(--bs-list-group-border-width);
border-left-width: 0;
}
.list-group-horizontal-sm > .list-group-item + .list-group-item.active {
margin-left: calc(-1 * var(--bs-list-group-border-width));
border-left-width: var(--bs-list-group-border-width);
}
}
@media (min-width: 768px) {
.list-group-horizontal-md {
flex-direction: row;
}
.list-group-horizontal-md > .list-group-item:first-child:not(:last-child) {
border-bottom-left-radius: var(--bs-list-group-border-radius);
border-top-right-radius: 0;
}
.list-group-horizontal-md > .list-group-item:last-child:not(:first-child) {
border-top-right-radius: var(--bs-list-group-border-radius);
border-bottom-left-radius: 0;
}
.list-group-horizontal-md > .list-group-item.active {
margin-top: 0;
}
.list-group-horizontal-md > .list-group-item + .list-group-item {
border-top-width: var(--bs-list-group-border-width);
border-left-width: 0;
}
.list-group-horizontal-md > .list-group-item + .list-group-item.active {
margin-left: calc(-1 * var(--bs-list-group-border-width));
border-left-width: var(--bs-list-group-border-width);
}
}
@media (min-width: 992px) {
.list-group-horizontal-lg {
flex-direction: row;
}
.list-group-horizontal-lg > .list-group-item:first-child:not(:last-child) {
border-bottom-left-radius: var(--bs-list-group-border-radius);
border-top-right-radius: 0;
}
.list-group-horizontal-lg > .list-group-item:last-child:not(:first-child) {
border-top-right-radius: var(--bs-list-group-border-radius);
border-bottom-left-radius: 0;
}
.list-group-horizontal-lg > .list-group-item.active {
margin-top: 0;
}
.list-group-horizontal-lg > .list-group-item + .list-group-item {
border-top-width: var(--bs-list-group-border-width);
border-left-width: 0;
}
.list-group-horizontal-lg > .list-group-item + .list-group-item.active {
margin-left: calc(-1 * var(--bs-list-group-border-width));
border-left-width: var(--bs-list-group-border-width);
}
}
@media (min-width: 1200px) {
.list-group-horizontal-xl {
flex-direction: row;
}
.list-group-horizontal-xl > .list-group-item:first-child:not(:last-child) {
border-bottom-left-radius: var(--bs-list-group-border-radius);
border-top-right-radius: 0;
}
.list-group-horizontal-xl > .list-group-item:last-child:not(:first-child) {
border-top-right-radius: var(--bs-list-group-border-radius);
border-bottom-left-radius: 0;
}
.list-group-horizontal-xl > .list-group-item.active {
margin-top: 0;
}
.list-group-horizontal-xl > .list-group-item + .list-group-item {
border-top-width: var(--bs-list-group-border-width);
border-left-width: 0;
}
.list-group-horizontal-xl > .list-group-item + .list-group-item.active {
margin-left: calc(-1 * var(--bs-list-group-border-width));
border-left-width: var(--bs-list-group-border-width);
}
}
@media (min-width: 1400px) {
.list-group-horizontal-xxl {
flex-direction: row;
}
.list-group-horizontal-xxl > .list-group-item:first-child:not(:last-child) {
border-bottom-left-radius: var(--bs-list-group-border-radius);
border-top-right-radius: 0;
}
.list-group-horizontal-xxl > .list-group-item:last-child:not(:first-child) {
border-top-right-radius: var(--bs-list-group-border-radius);
border-bottom-left-radius: 0;
}
.list-group-horizontal-xxl > .list-group-item.active {
margin-top: 0;
}
.list-group-horizontal-xxl > .list-group-item + .list-group-item {
border-top-width: var(--bs-list-group-border-width);
border-left-width: 0;
}
.list-group-horizontal-xxl > .list-group-item + .list-group-item.active {
margin-left: calc(-1 * var(--bs-list-group-border-width));
border-left-width: var(--bs-list-group-border-width);
}
}
.list-group-flush {
border-radius: 0;
}
.list-group-flush > .list-group-item {
border-width: 0 0 var(--bs-list-group-border-width);
}
.list-group-flush > .list-group-item:last-child {
border-bottom-width: 0;
}
.list-group-item-primary {
--bs-list-group-color: var(--bs-primary-text-emphasis);
--bs-list-group-bg: var(--bs-primary-bg-subtle);
--bs-list-group-border-color: var(--bs-primary-border-subtle);
--bs-list-group-action-hover-color: var(--bs-emphasis-color);
--bs-list-group-action-hover-bg: var(--bs-primary-border-subtle);
--bs-list-group-action-active-color: var(--bs-emphasis-color);
--bs-list-group-action-active-bg: var(--bs-primary-border-subtle);
--bs-list-group-active-color: var(--bs-primary-bg-subtle);
--bs-list-group-active-bg: var(--bs-primary-text-emphasis);
--bs-list-group-active-border-color: var(--bs-primary-text-emphasis);
}
.list-group-item-secondary {
--bs-list-group-color: var(--bs-secondary-text-emphasis);
--bs-list-group-bg: var(--bs-secondary-bg-subtle);
--bs-list-group-border-color: var(--bs-secondary-border-subtle);
--bs-list-group-action-hover-color: var(--bs-emphasis-color);
--bs-list-group-action-hover-bg: var(--bs-secondary-border-subtle);
--bs-list-group-action-active-color: var(--bs-emphasis-color);
--bs-list-group-action-active-bg: var(--bs-secondary-border-subtle);
--bs-list-group-active-color: var(--bs-secondary-bg-subtle);
--bs-list-group-active-bg: var(--bs-secondary-text-emphasis);
--bs-list-group-active-border-color: var(--bs-secondary-text-emphasis);
}
.list-group-item-success {
--bs-list-group-color: var(--bs-success-text-emphasis);
--bs-list-group-bg: var(--bs-success-bg-subtle);
--bs-list-group-border-color: var(--bs-success-border-subtle);
--bs-list-group-action-hover-color: var(--bs-emphasis-color);
--bs-list-group-action-hover-bg: var(--bs-success-border-subtle);
--bs-list-group-action-active-color: var(--bs-emphasis-color);
--bs-list-group-action-active-bg: var(--bs-success-border-subtle);
--bs-list-group-active-color: var(--bs-success-bg-subtle);
--bs-list-group-active-bg: var(--bs-success-text-emphasis);
--bs-list-group-active-border-color: var(--bs-success-text-emphasis);
}
.list-group-item-info {
--bs-list-group-color: var(--bs-info-text-emphasis);
--bs-list-group-bg: var(--bs-info-bg-subtle);
--bs-list-group-border-color: var(--bs-info-border-subtle);
--bs-list-group-action-hover-color: var(--bs-emphasis-color);
--bs-list-group-action-hover-bg: var(--bs-info-border-subtle);
--bs-list-group-action-active-color: var(--bs-emphasis-color);
--bs-list-group-action-active-bg: var(--bs-info-border-subtle);
--bs-list-group-active-color: var(--bs-info-bg-subtle);
--bs-list-group-active-bg: var(--bs-info-text-emphasis);
--bs-list-group-active-border-color: var(--bs-info-text-emphasis);
}
.list-group-item-warning {
--bs-list-group-color: var(--bs-warning-text-emphasis);
--bs-list-group-bg: var(--bs-warning-bg-subtle);
--bs-list-group-border-color: var(--bs-warning-border-subtle);
--bs-list-group-action-hover-color: var(--bs-emphasis-color);
--bs-list-group-action-hover-bg: var(--bs-warning-border-subtle);
--bs-list-group-action-active-color: var(--bs-emphasis-color);
--bs-list-group-action-active-bg: var(--bs-warning-border-subtle);
--bs-list-group-active-color: var(--bs-warning-bg-subtle);
--bs-list-group-active-bg: var(--bs-warning-text-emphasis);
--bs-list-group-active-border-color: var(--bs-warning-text-emphasis);
}
.list-group-item-danger {
--bs-list-group-color: var(--bs-danger-text-emphasis);
--bs-list-group-bg: var(--bs-danger-bg-subtle);
--bs-list-group-border-color: var(--bs-danger-border-subtle);
--bs-list-group-action-hover-color: var(--bs-emphasis-color);
--bs-list-group-action-hover-bg: var(--bs-danger-border-subtle);
--bs-list-group-action-active-color: var(--bs-emphasis-color);
--bs-list-group-action-active-bg: var(--bs-danger-border-subtle);
--bs-list-group-active-color: var(--bs-danger-bg-subtle);
--bs-list-group-active-bg: var(--bs-danger-text-emphasis);
--bs-list-group-active-border-color: var(--bs-danger-text-emphasis);
}
.list-group-item-light {
--bs-list-group-color: var(--bs-light-text-emphasis);
--bs-list-group-bg: var(--bs-light-bg-subtle);
--bs-list-group-border-color: var(--bs-light-border-subtle);
--bs-list-group-action-hover-color: var(--bs-emphasis-color);
--bs-list-group-action-hover-bg: var(--bs-light-border-subtle);
--bs-list-group-action-active-color: var(--bs-emphasis-color);
--bs-list-group-action-active-bg: var(--bs-light-border-subtle);
--bs-list-group-active-color: var(--bs-light-bg-subtle);
--bs-list-group-active-bg: var(--bs-light-text-emphasis);
--bs-list-group-active-border-color: var(--bs-light-text-emphasis);
}
.list-group-item-dark {
--bs-list-group-color: var(--bs-dark-text-emphasis);
--bs-list-group-bg: var(--bs-dark-bg-subtle);
--bs-list-group-border-color: var(--bs-dark-border-subtle);
--bs-list-group-action-hover-color: var(--bs-emphasis-color);
--bs-list-group-action-hover-bg: var(--bs-dark-border-subtle);
--bs-list-group-action-active-color: var(--bs-emphasis-color);
--bs-list-group-action-active-bg: var(--bs-dark-border-subtle);
--bs-list-group-active-color: var(--bs-dark-bg-subtle);
--bs-list-group-active-bg: var(--bs-dark-text-emphasis);
--bs-list-group-active-border-color: var(--bs-dark-text-emphasis);
}
.btn-close {
--bs-btn-close-color: #000;
--bs-btn-close-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e");
--bs-btn-close-opacity: 0.5;
--bs-btn-close-hover-opacity: 0.75;
--bs-btn-close-focus-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);
--bs-btn-close-focus-opacity: 1;
--bs-btn-close-disabled-opacity: 0.25;
--bs-btn-close-white-filter: invert(1) grayscale(100%) brightness(200%);
box-sizing: content-box;
width: 1em;
height: 1em;
padding: 0.25em 0.25em;
color: var(--bs-btn-close-color);
background: transparent var(--bs-btn-close-bg) center/1em auto no-repeat;
border: 0;
border-radius: 0.375rem;
opacity: var(--bs-btn-close-opacity);
}
.btn-close:hover {
color: var(--bs-btn-close-color);
text-decoration: none;
opacity: var(--bs-btn-close-hover-opacity);
}
.btn-close:focus {
outline: 0;
box-shadow: var(--bs-btn-close-focus-shadow);
opacity: var(--bs-btn-close-focus-opacity);
}
.btn-close:disabled, .btn-close.disabled {
pointer-events: none;
user-select: none;
opacity: var(--bs-btn-close-disabled-opacity);
}
.btn-close-white {
filter: var(--bs-btn-close-white-filter);
}
[data-bs-theme=dark] .btn-close {
filter: var(--bs-btn-close-white-filter);
}
.toast {
--bs-toast-zindex: 1090;
--bs-toast-padding-x: 0.75rem;
--bs-toast-padding-y: 0.5rem;
--bs-toast-spacing: 1.5rem;
--bs-toast-max-width: 350px;
--bs-toast-font-size: 0.875rem;
--bs-toast-color: ;
--bs-toast-bg: rgba(var(--bs-body-bg-rgb), 0.85);
--bs-toast-border-width: var(--bs-border-width);
--bs-toast-border-color: var(--bs-border-color-translucent);
--bs-toast-border-radius: var(--bs-border-radius);
--bs-toast-box-shadow: var(--bs-box-shadow);
--bs-toast-header-color: var(--bs-secondary-color);
--bs-toast-header-bg: rgba(var(--bs-body-bg-rgb), 0.85);
--bs-toast-header-border-color: var(--bs-border-color-translucent);
width: var(--bs-toast-max-width);
max-width: 100%;
font-size: var(--bs-toast-font-size);
color: var(--bs-toast-color);
pointer-events: auto;
background-color: var(--bs-toast-bg);
background-clip: padding-box;
border: var(--bs-toast-border-width) solid var(--bs-toast-border-color);
box-shadow: var(--bs-toast-box-shadow);
border-radius: var(--bs-toast-border-radius);
}
.toast.showing {
opacity: 0;
}
.toast:not(.show) {
display: none;
}
.toast-container {
--bs-toast-zindex: 1090;
position: absolute;
z-index: var(--bs-toast-zindex);
width: max-content;
max-width: 100%;
pointer-events: none;
}
.toast-container > :not(:last-child) {
margin-bottom: var(--bs-toast-spacing);
}
.toast-header {
display: flex;
align-items: center;
padding: var(--bs-toast-padding-y) var(--bs-toast-padding-x);
color: var(--bs-toast-header-color);
background-color: var(--bs-toast-header-bg);
background-clip: padding-box;
border-bottom: var(--bs-toast-border-width) solid var(--bs-toast-header-border-color);
border-top-left-radius: calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));
border-top-right-radius: calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));
}
.toast-header .btn-close {
margin-right: calc(-0.5 * var(--bs-toast-padding-x));
margin-left: var(--bs-toast-padding-x);
}
.toast-body {
padding: var(--bs-toast-padding-x);
word-wrap: break-word;
}
.modal {
--bs-modal-zindex: 1055;
--bs-modal-width: 500px;
--bs-modal-padding: 1rem;
--bs-modal-margin: 0.5rem;
--bs-modal-color: ;
--bs-modal-bg: var(--bs-body-bg);
--bs-modal-border-color: var(--bs-border-color-translucent);
--bs-modal-border-width: var(--bs-border-width);
--bs-modal-border-radius: var(--bs-border-radius-lg);
--bs-modal-box-shadow: var(--bs-box-shadow-sm);
--bs-modal-inner-border-radius: calc(var(--bs-border-radius-lg) - (var(--bs-border-width)));
--bs-modal-header-padding-x: 1rem;
--bs-modal-header-padding-y: 1rem;
--bs-modal-header-padding: 1rem 1rem;
--bs-modal-header-border-color: var(--bs-border-color);
--bs-modal-header-border-width: var(--bs-border-width);
--bs-modal-title-line-height: 1.5;
--bs-modal-footer-gap: 0.5rem;
--bs-modal-footer-bg: ;
--bs-modal-footer-border-color: var(--bs-border-color);
--bs-modal-footer-border-width: var(--bs-border-width);
position: fixed;
top: 0;
left: 0;
z-index: var(--bs-modal-zindex);
display: none;
width: 100%;
height: 100%;
overflow-x: hidden;
overflow-y: auto;
outline: 0;
}
.modal-dialog {
position: relative;
width: auto;
margin: var(--bs-modal-margin);
pointer-events: none;
}
.modal.fade .modal-dialog {
transition: transform 0.3s ease-out;
transform: translate(0, -50px);
}
@media (prefers-reduced-motion: reduce) {
.modal.fade .modal-dialog {
transition: none;
}
}
.modal.show .modal-dialog {
transform: none;
}
.modal.modal-static .modal-dialog {
transform: scale(1.02);
}
.modal-dialog-scrollable {
height: calc(100% - var(--bs-modal-margin) * 2);
}
.modal-dialog-scrollable .modal-content {
max-height: 100%;
overflow: hidden;
}
.modal-dialog-scrollable .modal-body {
overflow-y: auto;
}
.modal-dialog-centered {
display: flex;
align-items: center;
min-height: calc(100% - var(--bs-modal-margin) * 2);
}
.modal-content {
position: relative;
display: flex;
flex-direction: column;
width: 100%;
color: var(--bs-modal-color);
pointer-events: auto;
background-color: var(--bs-modal-bg);
background-clip: padding-box;
border: var(--bs-modal-border-width) solid var(--bs-modal-border-color);
border-radius: var(--bs-modal-border-radius);
outline: 0;
}
.modal-backdrop {
--bs-backdrop-zindex: 1050;
--bs-backdrop-bg: #000;
--bs-backdrop-opacity: 0.5;
position: fixed;
top: 0;
left: 0;
z-index: var(--bs-backdrop-zindex);
width: 100vw;
height: 100vh;
background-color: var(--bs-backdrop-bg);
}
.modal-backdrop.fade {
opacity: 0;
}
.modal-backdrop.show {
opacity: var(--bs-backdrop-opacity);
}
.modal-header {
display: flex;
flex-shrink: 0;
align-items: center;
padding: var(--bs-modal-header-padding);
border-bottom: var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color);
border-top-left-radius: var(--bs-modal-inner-border-radius);
border-top-right-radius: var(--bs-modal-inner-border-radius);
}
.modal-header .btn-close {
padding: calc(var(--bs-modal-header-padding-y) * 0.5) calc(var(--bs-modal-header-padding-x) * 0.5);
margin: calc(-0.5 * var(--bs-modal-header-padding-y)) calc(-0.5 * var(--bs-modal-header-padding-x)) calc(-0.5 * var(--bs-modal-header-padding-y)) auto;
}
.modal-title {
margin-bottom: 0;
line-height: var(--bs-modal-title-line-height);
}
.modal-body {
position: relative;
flex: 1 1 auto;
padding: var(--bs-modal-padding);
}
.modal-footer {
display: flex;
flex-shrink: 0;
flex-wrap: wrap;
align-items: center;
justify-content: flex-end;
padding: calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap) * 0.5);
background-color: var(--bs-modal-footer-bg);
border-top: var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color);
border-bottom-right-radius: var(--bs-modal-inner-border-radius);
border-bottom-left-radius: var(--bs-modal-inner-border-radius);
}
.modal-footer > * {
margin: calc(var(--bs-modal-footer-gap) * 0.5);
}
@media (min-width: 576px) {
.modal {
--bs-modal-margin: 1.75rem;
--bs-modal-box-shadow: var(--bs-box-shadow);
}
.modal-dialog {
max-width: var(--bs-modal-width);
margin-right: auto;
margin-left: auto;
}
.modal-sm {
--bs-modal-width: 300px;
}
}
@media (min-width: 992px) {
.modal-lg,
.modal-xl {
--bs-modal-width: 800px;
}
}
@media (min-width: 1200px) {
.modal-xl {
--bs-modal-width: 1140px;
}
}
.modal-fullscreen {
width: 100vw;
max-width: none;
height: 100%;
margin: 0;
}
.modal-fullscreen .modal-content {
height: 100%;
border: 0;
border-radius: 0;
}
.modal-fullscreen .modal-header,
.modal-fullscreen .modal-footer {
border-radius: 0;
}
.modal-fullscreen .modal-body {
overflow-y: auto;
}
@media (max-width: 575.98px) {
.modal-fullscreen-sm-down {
width: 100vw;
max-width: none;
height: 100%;
margin: 0;
}
.modal-fullscreen-sm-down .modal-content {
height: 100%;
border: 0;
border-radius: 0;
}
.modal-fullscreen-sm-down .modal-header,
.modal-fullscreen-sm-down .modal-footer {
border-radius: 0;
}
.modal-fullscreen-sm-down .modal-body {
overflow-y: auto;
}
}
@media (max-width: 767.98px) {
.modal-fullscreen-md-down {
width: 100vw;
max-width: none;
height: 100%;
margin: 0;
}
.modal-fullscreen-md-down .modal-content {
height: 100%;
border: 0;
border-radius: 0;
}
.modal-fullscreen-md-down .modal-header,
.modal-fullscreen-md-down .modal-footer {
border-radius: 0;
}
.modal-fullscreen-md-down .modal-body {
overflow-y: auto;
}
}
@media (max-width: 991.98px) {
.modal-fullscreen-lg-down {
width: 100vw;
max-width: none;
height: 100%;
margin: 0;
}
.modal-fullscreen-lg-down .modal-content {
height: 100%;
border: 0;
border-radius: 0;
}
.modal-fullscreen-lg-down .modal-header,
.modal-fullscreen-lg-down .modal-footer {
border-radius: 0;
}
.modal-fullscreen-lg-down .modal-body {
overflow-y: auto;
}
}
@media (max-width: 1199.98px) {
.modal-fullscreen-xl-down {
width: 100vw;
max-width: none;
height: 100%;
margin: 0;
}
.modal-fullscreen-xl-down .modal-content {
height: 100%;
border: 0;
border-radius: 0;
}
.modal-fullscreen-xl-down .modal-header,
.modal-fullscreen-xl-down .modal-footer {
border-radius: 0;
}
.modal-fullscreen-xl-down .modal-body {
overflow-y: auto;
}
}
@media (max-width: 1399.98px) {
.modal-fullscreen-xxl-down {
width: 100vw;
max-width: none;
height: 100%;
margin: 0;
}
.modal-fullscreen-xxl-down .modal-content {
height: 100%;
border: 0;
border-radius: 0;
}
.modal-fullscreen-xxl-down .modal-header,
.modal-fullscreen-xxl-down .modal-footer {
border-radius: 0;
}
.modal-fullscreen-xxl-down .modal-body {
overflow-y: auto;
}
}
.tooltip {
--bs-tooltip-zindex: 1080;
--bs-tooltip-max-width: 200px;
--bs-tooltip-padding-x: 0.5rem;
--bs-tooltip-padding-y: 0.25rem;
--bs-tooltip-margin: ;
--bs-tooltip-font-size: 0.875rem;
--bs-tooltip-color: var(--bs-body-bg);
--bs-tooltip-bg: var(--bs-emphasis-color);
--bs-tooltip-border-radius: var(--bs-border-radius);
--bs-tooltip-opacity: 0.9;
--bs-tooltip-arrow-width: 0.8rem;
--bs-tooltip-arrow-height: 0.4rem;
z-index: var(--bs-tooltip-zindex);
display: block;
margin: var(--bs-tooltip-margin);
font-family: var(--bs-font-sans-serif);
font-style: normal;
font-weight: 400;
line-height: 1.5;
text-align: left;
text-align: start;
text-decoration: none;
text-shadow: none;
text-transform: none;
letter-spacing: normal;
word-break: normal;
white-space: normal;
word-spacing: normal;
line-break: auto;
font-size: var(--bs-tooltip-font-size);
word-wrap: break-word;
opacity: 0;
}
.tooltip.show {
opacity: var(--bs-tooltip-opacity);
}
.tooltip .tooltip-arrow {
display: block;
width: var(--bs-tooltip-arrow-width);
height: var(--bs-tooltip-arrow-height);
}
.tooltip .tooltip-arrow::before {
position: absolute;
content: "";
border-color: transparent;
border-style: solid;
}
.bs-tooltip-top .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow {
bottom: calc(-1 * var(--bs-tooltip-arrow-height));
}
.bs-tooltip-top .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before {
top: -1px;
border-width: var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * 0.5) 0;
border-top-color: var(--bs-tooltip-bg);
}
/* rtl:begin:ignore */
.bs-tooltip-end .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow {
left: calc(-1 * var(--bs-tooltip-arrow-height));
width: var(--bs-tooltip-arrow-height);
height: var(--bs-tooltip-arrow-width);
}
.bs-tooltip-end .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before {
right: -1px;
border-width: calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * 0.5) 0;
border-right-color: var(--bs-tooltip-bg);
}
/* rtl:end:ignore */
.bs-tooltip-bottom .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow {
top: calc(-1 * var(--bs-tooltip-arrow-height));
}
.bs-tooltip-bottom .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before {
bottom: -1px;
border-width: 0 calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height);
border-bottom-color: var(--bs-tooltip-bg);
}
/* rtl:begin:ignore */
.bs-tooltip-start .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow {
right: calc(-1 * var(--bs-tooltip-arrow-height));
width: var(--bs-tooltip-arrow-height);
height: var(--bs-tooltip-arrow-width);
}
.bs-tooltip-start .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before {
left: -1px;
border-width: calc(var(--bs-tooltip-arrow-width) * 0.5) 0 calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height);
border-left-color: var(--bs-tooltip-bg);
}
/* rtl:end:ignore */
.tooltip-inner {
max-width: var(--bs-tooltip-max-width);
padding: var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x);
color: var(--bs-tooltip-color);
text-align: center;
background-color: var(--bs-tooltip-bg);
border-radius: var(--bs-tooltip-border-radius);
}
.popover {
--bs-popover-zindex: 1070;
--bs-popover-max-width: 276px;
--bs-popover-font-size: 0.875rem;
--bs-popover-bg: var(--bs-body-bg);
--bs-popover-border-width: var(--bs-border-width);
--bs-popover-border-color: var(--bs-border-color-translucent);
--bs-popover-border-radius: var(--bs-border-radius-lg);
--bs-popover-inner-border-radius: calc(var(--bs-border-radius-lg) - var(--bs-border-width));
--bs-popover-box-shadow: var(--bs-box-shadow);
--bs-popover-header-padding-x: 1rem;
--bs-popover-header-padding-y: 0.5rem;
--bs-popover-header-font-size: 1rem;
--bs-popover-header-color: inherit;
--bs-popover-header-bg: var(--bs-secondary-bg);
--bs-popover-body-padding-x: 1rem;
--bs-popover-body-padding-y: 1rem;
--bs-popover-body-color: var(--bs-body-color);
--bs-popover-arrow-width: 1rem;
--bs-popover-arrow-height: 0.5rem;
--bs-popover-arrow-border: var(--bs-popover-border-color);
z-index: var(--bs-popover-zindex);
display: block;
max-width: var(--bs-popover-max-width);
font-family: var(--bs-font-sans-serif);
font-style: normal;
font-weight: 400;
line-height: 1.5;
text-align: left;
text-align: start;
text-decoration: none;
text-shadow: none;
text-transform: none;
letter-spacing: normal;
word-break: normal;
white-space: normal;
word-spacing: normal;
line-break: auto;
font-size: var(--bs-popover-font-size);
word-wrap: break-word;
background-color: var(--bs-popover-bg);
background-clip: padding-box;
border: var(--bs-popover-border-width) solid var(--bs-popover-border-color);
border-radius: var(--bs-popover-border-radius);
}
.popover .popover-arrow {
display: block;
width: var(--bs-popover-arrow-width);
height: var(--bs-popover-arrow-height);
}
.popover .popover-arrow::before, .popover .popover-arrow::after {
position: absolute;
display: block;
content: "";
border-color: transparent;
border-style: solid;
border-width: 0;
}
.bs-popover-top > .popover-arrow, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow {
bottom: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));
}
.bs-popover-top > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::before, .bs-popover-top > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::after {
border-width: var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * 0.5) 0;
}
.bs-popover-top > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::before {
bottom: 0;
border-top-color: var(--bs-popover-arrow-border);
}
.bs-popover-top > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::after {
bottom: var(--bs-popover-border-width);
border-top-color: var(--bs-popover-bg);
}
/* rtl:begin:ignore */
.bs-popover-end > .popover-arrow, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow {
left: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));
width: var(--bs-popover-arrow-height);
height: var(--bs-popover-arrow-width);
}
.bs-popover-end > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::before, .bs-popover-end > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::after {
border-width: calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * 0.5) 0;
}
.bs-popover-end > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::before {
left: 0;
border-right-color: var(--bs-popover-arrow-border);
}
.bs-popover-end > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::after {
left: var(--bs-popover-border-width);
border-right-color: var(--bs-popover-bg);
}
/* rtl:end:ignore */
.bs-popover-bottom > .popover-arrow, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow {
top: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));
}
.bs-popover-bottom > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::before, .bs-popover-bottom > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::after {
border-width: 0 calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height);
}
.bs-popover-bottom > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::before {
top: 0;
border-bottom-color: var(--bs-popover-arrow-border);
}
.bs-popover-bottom > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::after {
top: var(--bs-popover-border-width);
border-bottom-color: var(--bs-popover-bg);
}
.bs-popover-bottom .popover-header::before, .bs-popover-auto[data-popper-placement^=bottom] .popover-header::before {
position: absolute;
top: 0;
left: 50%;
display: block;
width: var(--bs-popover-arrow-width);
margin-left: calc(-0.5 * var(--bs-popover-arrow-width));
content: "";
border-bottom: var(--bs-popover-border-width) solid var(--bs-popover-header-bg);
}
/* rtl:begin:ignore */
.bs-popover-start > .popover-arrow, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow {
right: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));
width: var(--bs-popover-arrow-height);
height: var(--bs-popover-arrow-width);
}
.bs-popover-start > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::before, .bs-popover-start > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::after {
border-width: calc(var(--bs-popover-arrow-width) * 0.5) 0 calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height);
}
.bs-popover-start > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::before {
right: 0;
border-left-color: var(--bs-popover-arrow-border);
}
.bs-popover-start > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::after {
right: var(--bs-popover-border-width);
border-left-color: var(--bs-popover-bg);
}
/* rtl:end:ignore */
.popover-header {
padding: var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x);
margin-bottom: 0;
font-size: var(--bs-popover-header-font-size);
color: var(--bs-popover-header-color);
background-color: var(--bs-popover-header-bg);
border-bottom: var(--bs-popover-border-width) solid var(--bs-popover-border-color);
border-top-left-radius: var(--bs-popover-inner-border-radius);
border-top-right-radius: var(--bs-popover-inner-border-radius);
}
.popover-header:empty {
display: none;
}
.popover-body {
padding: var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x);
color: var(--bs-popover-body-color);
}
.carousel {
position: relative;
}
.carousel.pointer-event {
touch-action: pan-y;
}
.carousel-inner {
position: relative;
width: 100%;
overflow: hidden;
}
.carousel-inner::after {
display: block;
clear: both;
content: "";
}
.carousel-item {
position: relative;
display: none;
float: left;
width: 100%;
margin-right: -100%;
backface-visibility: hidden;
transition: transform 0.6s ease-in-out;
}
@media (prefers-reduced-motion: reduce) {
.carousel-item {
transition: none;
}
}
.carousel-item.active,
.carousel-item-next,
.carousel-item-prev {
display: block;
}
.carousel-item-next:not(.carousel-item-start),
.active.carousel-item-end {
transform: translateX(100%);
}
.carousel-item-prev:not(.carousel-item-end),
.active.carousel-item-start {
transform: translateX(-100%);
}
.carousel-fade .carousel-item {
opacity: 0;
transition-property: opacity;
transform: none;
}
.carousel-fade .carousel-item.active,
.carousel-fade .carousel-item-next.carousel-item-start,
.carousel-fade .carousel-item-prev.carousel-item-end {
z-index: 1;
opacity: 1;
}
.carousel-fade .active.carousel-item-start,
.carousel-fade .active.carousel-item-end {
z-index: 0;
opacity: 0;
transition: opacity 0s 0.6s;
}
@media (prefers-reduced-motion: reduce) {
.carousel-fade .active.carousel-item-start,
.carousel-fade .active.carousel-item-end {
transition: none;
}
}
.carousel-control-prev,
.carousel-control-next {
position: absolute;
top: 0;
bottom: 0;
z-index: 1;
display: flex;
align-items: center;
justify-content: center;
width: 15%;
padding: 0;
color: #fff;
text-align: center;
background: none;
border: 0;
opacity: 0.5;
transition: opacity 0.15s ease;
}
@media (prefers-reduced-motion: reduce) {
.carousel-control-prev,
.carousel-control-next {
transition: none;
}
}
.carousel-control-prev:hover, .carousel-control-prev:focus,
.carousel-control-next:hover,
.carousel-control-next:focus {
color: #fff;
text-decoration: none;
outline: 0;
opacity: 0.9;
}
.carousel-control-prev {
left: 0;
}
.carousel-control-next {
right: 0;
}
.carousel-control-prev-icon,
.carousel-control-next-icon {
display: inline-block;
width: 2rem;
height: 2rem;
background-repeat: no-repeat;
background-position: 50%;
background-size: 100% 100%;
}
.carousel-control-prev-icon {
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e") /*rtl:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")*/;
}
.carousel-control-next-icon {
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e") /*rtl:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")*/;
}
.carousel-indicators {
position: absolute;
right: 0;
bottom: 0;
left: 0;
z-index: 2;
display: flex;
justify-content: center;
padding: 0;
margin-right: 15%;
margin-bottom: 1rem;
margin-left: 15%;
}
.carousel-indicators [data-bs-target] {
box-sizing: content-box;
flex: 0 1 auto;
width: 30px;
height: 3px;
padding: 0;
margin-right: 3px;
margin-left: 3px;
text-indent: -999px;
cursor: pointer;
background-color: #fff;
background-clip: padding-box;
border: 0;
border-top: 10px solid transparent;
border-bottom: 10px solid transparent;
opacity: 0.5;
transition: opacity 0.6s ease;
}
@media (prefers-reduced-motion: reduce) {
.carousel-indicators [data-bs-target] {
transition: none;
}
}
.carousel-indicators .active {
opacity: 1;
}
.carousel-caption {
position: absolute;
right: 15%;
bottom: 1.25rem;
left: 15%;
padding-top: 1.25rem;
padding-bottom: 1.25rem;
color: #fff;
text-align: center;
}
.carousel-dark .carousel-control-prev-icon,
.carousel-dark .carousel-control-next-icon {
filter: invert(1) grayscale(100);
}
.carousel-dark .carousel-indicators [data-bs-target] {
background-color: #000;
}
.carousel-dark .carousel-caption {
color: #000;
}
[data-bs-theme=dark] .carousel .carousel-control-prev-icon,
[data-bs-theme=dark] .carousel .carousel-control-next-icon, [data-bs-theme=dark].carousel .carousel-control-prev-icon,
[data-bs-theme=dark].carousel .carousel-control-next-icon {
filter: invert(1) grayscale(100);
}
[data-bs-theme=dark] .carousel .carousel-indicators [data-bs-target], [data-bs-theme=dark].carousel .carousel-indicators [data-bs-target] {
background-color: #000;
}
[data-bs-theme=dark] .carousel .carousel-caption, [data-bs-theme=dark].carousel .carousel-caption {
color: #000;
}
.spinner-grow,
.spinner-border {
display: inline-block;
width: var(--bs-spinner-width);
height: var(--bs-spinner-height);
vertical-align: var(--bs-spinner-vertical-align);
border-radius: 50%;
animation: var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name);
}
@keyframes spinner-border {
to {
transform: rotate(360deg) /* rtl:ignore */;
}
}
.spinner-border {
--bs-spinner-width: 2rem;
--bs-spinner-height: 2rem;
--bs-spinner-vertical-align: -0.125em;
--bs-spinner-border-width: 0.25em;
--bs-spinner-animation-speed: 0.75s;
--bs-spinner-animation-name: spinner-border;
border: var(--bs-spinner-border-width) solid currentcolor;
border-right-color: transparent;
}
.spinner-border-sm {
--bs-spinner-width: 1rem;
--bs-spinner-height: 1rem;
--bs-spinner-border-width: 0.2em;
}
@keyframes spinner-grow {
0% {
transform: scale(0);
}
50% {
opacity: 1;
transform: none;
}
}
.spinner-grow {
--bs-spinner-width: 2rem;
--bs-spinner-height: 2rem;
--bs-spinner-vertical-align: -0.125em;
--bs-spinner-animation-speed: 0.75s;
--bs-spinner-animation-name: spinner-grow;
background-color: currentcolor;
opacity: 0;
}
.spinner-grow-sm {
--bs-spinner-width: 1rem;
--bs-spinner-height: 1rem;
}
@media (prefers-reduced-motion: reduce) {
.spinner-border,
.spinner-grow {
--bs-spinner-animation-speed: 1.5s;
}
}
.offcanvas, .offcanvas-xxl, .offcanvas-xl, .offcanvas-lg, .offcanvas-md, .offcanvas-sm {
--bs-offcanvas-zindex: 1045;
--bs-offcanvas-width: 400px;
--bs-offcanvas-height: 30vh;
--bs-offcanvas-padding-x: 1rem;
--bs-offcanvas-padding-y: 1rem;
--bs-offcanvas-color: var(--bs-body-color);
--bs-offcanvas-bg: var(--bs-body-bg);
--bs-offcanvas-border-width: var(--bs-border-width);
--bs-offcanvas-border-color: var(--bs-border-color-translucent);
--bs-offcanvas-box-shadow: var(--bs-box-shadow-sm);
--bs-offcanvas-transition: transform 0.3s ease-in-out;
--bs-offcanvas-title-line-height: 1.5;
}
@media (max-width: 575.98px) {
.offcanvas-sm {
position: fixed;
bottom: 0;
z-index: var(--bs-offcanvas-zindex);
display: flex;
flex-direction: column;
max-width: 100%;
color: var(--bs-offcanvas-color);
visibility: hidden;
background-color: var(--bs-offcanvas-bg);
background-clip: padding-box;
outline: 0;
transition: var(--bs-offcanvas-transition);
}
}
@media (max-width: 575.98px) and (prefers-reduced-motion: reduce) {
.offcanvas-sm {
transition: none;
}
}
@media (max-width: 575.98px) {
.offcanvas-sm.offcanvas-start {
top: 0;
left: 0;
width: var(--bs-offcanvas-width);
border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
transform: translateX(-100%);
}
.offcanvas-sm.offcanvas-end {
top: 0;
right: 0;
width: var(--bs-offcanvas-width);
border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
transform: translateX(100%);
}
.offcanvas-sm.offcanvas-top {
top: 0;
right: 0;
left: 0;
height: var(--bs-offcanvas-height);
max-height: 100%;
border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
transform: translateY(-100%);
}
.offcanvas-sm.offcanvas-bottom {
right: 0;
left: 0;
height: var(--bs-offcanvas-height);
max-height: 100%;
border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
transform: translateY(100%);
}
.offcanvas-sm.showing, .offcanvas-sm.show:not(.hiding) {
transform: none;
}
.offcanvas-sm.showing, .offcanvas-sm.hiding, .offcanvas-sm.show {
visibility: visible;
}
}
@media (min-width: 576px) {
.offcanvas-sm {
--bs-offcanvas-height: auto;
--bs-offcanvas-border-width: 0;
background-color: transparent !important;
}
.offcanvas-sm .offcanvas-header {
display: none;
}
.offcanvas-sm .offcanvas-body {
display: flex;
flex-grow: 0;
padding: 0;
overflow-y: visible;
background-color: transparent !important;
}
}
@media (max-width: 767.98px) {
.offcanvas-md {
position: fixed;
bottom: 0;
z-index: var(--bs-offcanvas-zindex);
display: flex;
flex-direction: column;
max-width: 100%;
color: var(--bs-offcanvas-color);
visibility: hidden;
background-color: var(--bs-offcanvas-bg);
background-clip: padding-box;
outline: 0;
transition: var(--bs-offcanvas-transition);
}
}
@media (max-width: 767.98px) and (prefers-reduced-motion: reduce) {
.offcanvas-md {
transition: none;
}
}
@media (max-width: 767.98px) {
.offcanvas-md.offcanvas-start {
top: 0;
left: 0;
width: var(--bs-offcanvas-width);
border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
transform: translateX(-100%);
}
.offcanvas-md.offcanvas-end {
top: 0;
right: 0;
width: var(--bs-offcanvas-width);
border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
transform: translateX(100%);
}
.offcanvas-md.offcanvas-top {
top: 0;
right: 0;
left: 0;
height: var(--bs-offcanvas-height);
max-height: 100%;
border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
transform: translateY(-100%);
}
.offcanvas-md.offcanvas-bottom {
right: 0;
left: 0;
height: var(--bs-offcanvas-height);
max-height: 100%;
border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
transform: translateY(100%);
}
.offcanvas-md.showing, .offcanvas-md.show:not(.hiding) {
transform: none;
}
.offcanvas-md.showing, .offcanvas-md.hiding, .offcanvas-md.show {
visibility: visible;
}
}
@media (min-width: 768px) {
.offcanvas-md {
--bs-offcanvas-height: auto;
--bs-offcanvas-border-width: 0;
background-color: transparent !important;
}
.offcanvas-md .offcanvas-header {
display: none;
}
.offcanvas-md .offcanvas-body {
display: flex;
flex-grow: 0;
padding: 0;
overflow-y: visible;
background-color: transparent !important;
}
}
@media (max-width: 991.98px) {
.offcanvas-lg {
position: fixed;
bottom: 0;
z-index: var(--bs-offcanvas-zindex);
display: flex;
flex-direction: column;
max-width: 100%;
color: var(--bs-offcanvas-color);
visibility: hidden;
background-color: var(--bs-offcanvas-bg);
background-clip: padding-box;
outline: 0;
transition: var(--bs-offcanvas-transition);
}
}
@media (max-width: 991.98px) and (prefers-reduced-motion: reduce) {
.offcanvas-lg {
transition: none;
}
}
@media (max-width: 991.98px) {
.offcanvas-lg.offcanvas-start {
top: 0;
left: 0;
width: var(--bs-offcanvas-width);
border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
transform: translateX(-100%);
}
.offcanvas-lg.offcanvas-end {
top: 0;
right: 0;
width: var(--bs-offcanvas-width);
border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
transform: translateX(100%);
}
.offcanvas-lg.offcanvas-top {
top: 0;
right: 0;
left: 0;
height: var(--bs-offcanvas-height);
max-height: 100%;
border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
transform: translateY(-100%);
}
.offcanvas-lg.offcanvas-bottom {
right: 0;
left: 0;
height: var(--bs-offcanvas-height);
max-height: 100%;
border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
transform: translateY(100%);
}
.offcanvas-lg.showing, .offcanvas-lg.show:not(.hiding) {
transform: none;
}
.offcanvas-lg.showing, .offcanvas-lg.hiding, .offcanvas-lg.show {
visibility: visible;
}
}
@media (min-width: 992px) {
.offcanvas-lg {
--bs-offcanvas-height: auto;
--bs-offcanvas-border-width: 0;
background-color: transparent !important;
}
.offcanvas-lg .offcanvas-header {
display: none;
}
.offcanvas-lg .offcanvas-body {
display: flex;
flex-grow: 0;
padding: 0;
overflow-y: visible;
background-color: transparent !important;
}
}
@media (max-width: 1199.98px) {
.offcanvas-xl {
position: fixed;
bottom: 0;
z-index: var(--bs-offcanvas-zindex);
display: flex;
flex-direction: column;
max-width: 100%;
color: var(--bs-offcanvas-color);
visibility: hidden;
background-color: var(--bs-offcanvas-bg);
background-clip: padding-box;
outline: 0;
transition: var(--bs-offcanvas-transition);
}
}
@media (max-width: 1199.98px) and (prefers-reduced-motion: reduce) {
.offcanvas-xl {
transition: none;
}
}
@media (max-width: 1199.98px) {
.offcanvas-xl.offcanvas-start {
top: 0;
left: 0;
width: var(--bs-offcanvas-width);
border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
transform: translateX(-100%);
}
.offcanvas-xl.offcanvas-end {
top: 0;
right: 0;
width: var(--bs-offcanvas-width);
border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
transform: translateX(100%);
}
.offcanvas-xl.offcanvas-top {
top: 0;
right: 0;
left: 0;
height: var(--bs-offcanvas-height);
max-height: 100%;
border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
transform: translateY(-100%);
}
.offcanvas-xl.offcanvas-bottom {
right: 0;
left: 0;
height: var(--bs-offcanvas-height);
max-height: 100%;
border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
transform: translateY(100%);
}
.offcanvas-xl.showing, .offcanvas-xl.show:not(.hiding) {
transform: none;
}
.offcanvas-xl.showing, .offcanvas-xl.hiding, .offcanvas-xl.show {
visibility: visible;
}
}
@media (min-width: 1200px) {
.offcanvas-xl {
--bs-offcanvas-height: auto;
--bs-offcanvas-border-width: 0;
background-color: transparent !important;
}
.offcanvas-xl .offcanvas-header {
display: none;
}
.offcanvas-xl .offcanvas-body {
display: flex;
flex-grow: 0;
padding: 0;
overflow-y: visible;
background-color: transparent !important;
}
}
@media (max-width: 1399.98px) {
.offcanvas-xxl {
position: fixed;
bottom: 0;
z-index: var(--bs-offcanvas-zindex);
display: flex;
flex-direction: column;
max-width: 100%;
color: var(--bs-offcanvas-color);
visibility: hidden;
background-color: var(--bs-offcanvas-bg);
background-clip: padding-box;
outline: 0;
transition: var(--bs-offcanvas-transition);
}
}
@media (max-width: 1399.98px) and (prefers-reduced-motion: reduce) {
.offcanvas-xxl {
transition: none;
}
}
@media (max-width: 1399.98px) {
.offcanvas-xxl.offcanvas-start {
top: 0;
left: 0;
width: var(--bs-offcanvas-width);
border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
transform: translateX(-100%);
}
.offcanvas-xxl.offcanvas-end {
top: 0;
right: 0;
width: var(--bs-offcanvas-width);
border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
transform: translateX(100%);
}
.offcanvas-xxl.offcanvas-top {
top: 0;
right: 0;
left: 0;
height: var(--bs-offcanvas-height);
max-height: 100%;
border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
transform: translateY(-100%);
}
.offcanvas-xxl.offcanvas-bottom {
right: 0;
left: 0;
height: var(--bs-offcanvas-height);
max-height: 100%;
border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
transform: translateY(100%);
}
.offcanvas-xxl.showing, .offcanvas-xxl.show:not(.hiding) {
transform: none;
}
.offcanvas-xxl.showing, .offcanvas-xxl.hiding, .offcanvas-xxl.show {
visibility: visible;
}
}
@media (min-width: 1400px) {
.offcanvas-xxl {
--bs-offcanvas-height: auto;
--bs-offcanvas-border-width: 0;
background-color: transparent !important;
}
.offcanvas-xxl .offcanvas-header {
display: none;
}
.offcanvas-xxl .offcanvas-body {
display: flex;
flex-grow: 0;
padding: 0;
overflow-y: visible;
background-color: transparent !important;
}
}
.offcanvas {
position: fixed;
bottom: 0;
z-index: var(--bs-offcanvas-zindex);
display: flex;
flex-direction: column;
max-width: 100%;
color: var(--bs-offcanvas-color);
visibility: hidden;
background-color: var(--bs-offcanvas-bg);
background-clip: padding-box;
outline: 0;
transition: var(--bs-offcanvas-transition);
}
@media (prefers-reduced-motion: reduce) {
.offcanvas {
transition: none;
}
}
.offcanvas.offcanvas-start {
top: 0;
left: 0;
width: var(--bs-offcanvas-width);
border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
transform: translateX(-100%);
}
.offcanvas.offcanvas-end {
top: 0;
right: 0;
width: var(--bs-offcanvas-width);
border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
transform: translateX(100%);
}
.offcanvas.offcanvas-top {
top: 0;
right: 0;
left: 0;
height: var(--bs-offcanvas-height);
max-height: 100%;
border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
transform: translateY(-100%);
}
.offcanvas.offcanvas-bottom {
right: 0;
left: 0;
height: var(--bs-offcanvas-height);
max-height: 100%;
border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
transform: translateY(100%);
}
.offcanvas.showing, .offcanvas.show:not(.hiding) {
transform: none;
}
.offcanvas.showing, .offcanvas.hiding, .offcanvas.show {
visibility: visible;
}
.offcanvas-backdrop {
position: fixed;
top: 0;
left: 0;
z-index: 1040;
width: 100vw;
height: 100vh;
background-color: #000;
}
.offcanvas-backdrop.fade {
opacity: 0;
}
.offcanvas-backdrop.show {
opacity: 0.5;
}
.offcanvas-header {
display: flex;
align-items: center;
padding: var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);
}
.offcanvas-header .btn-close {
padding: calc(var(--bs-offcanvas-padding-y) * 0.5) calc(var(--bs-offcanvas-padding-x) * 0.5);
margin: calc(-0.5 * var(--bs-offcanvas-padding-y)) calc(-0.5 * var(--bs-offcanvas-padding-x)) calc(-0.5 * var(--bs-offcanvas-padding-y)) auto;
}
.offcanvas-title {
margin-bottom: 0;
line-height: var(--bs-offcanvas-title-line-height);
}
.offcanvas-body {
flex-grow: 1;
padding: var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);
overflow-y: auto;
}
.placeholder {
display: inline-block;
min-height: 1em;
vertical-align: middle;
cursor: wait;
background-color: currentcolor;
opacity: 0.5;
}
.placeholder.btn::before {
display: inline-block;
content: "";
}
.placeholder-xs {
min-height: 0.6em;
}
.placeholder-sm {
min-height: 0.8em;
}
.placeholder-lg {
min-height: 1.2em;
}
.placeholder-glow .placeholder {
animation: placeholder-glow 2s ease-in-out infinite;
}
@keyframes placeholder-glow {
50% {
opacity: 0.2;
}
}
.placeholder-wave {
mask-image: linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);
mask-size: 200% 100%;
animation: placeholder-wave 2s linear infinite;
}
@keyframes placeholder-wave {
100% {
mask-position: -200% 0%;
}
}
.clearfix::after {
display: block;
clear: both;
content: "";
}
.text-bg-primary {
color: #fff !important;
background-color: RGBA(var(--bs-primary-rgb), var(--bs-bg-opacity, 1)) !important;
}
.text-bg-secondary {
color: #fff !important;
background-color: RGBA(var(--bs-secondary-rgb), var(--bs-bg-opacity, 1)) !important;
}
.text-bg-success {
color: #fff !important;
background-color: RGBA(var(--bs-success-rgb), var(--bs-bg-opacity, 1)) !important;
}
.text-bg-info {
color: #000 !important;
background-color: RGBA(var(--bs-info-rgb), var(--bs-bg-opacity, 1)) !important;
}
.text-bg-warning {
color: #000 !important;
background-color: RGBA(var(--bs-warning-rgb), var(--bs-bg-opacity, 1)) !important;
}
.text-bg-danger {
color: #fff !important;
background-color: RGBA(var(--bs-danger-rgb), var(--bs-bg-opacity, 1)) !important;
}
.text-bg-light {
color: #000 !important;
background-color: RGBA(var(--bs-light-rgb), var(--bs-bg-opacity, 1)) !important;
}
.text-bg-dark {
color: #fff !important;
background-color: RGBA(var(--bs-dark-rgb), var(--bs-bg-opacity, 1)) !important;
}
.link-primary {
color: RGBA(var(--bs-primary-rgb), var(--bs-link-opacity, 1)) !important;
text-decoration-color: RGBA(var(--bs-primary-rgb), var(--bs-link-underline-opacity, 1)) !important;
}
.link-primary:hover, .link-primary:focus {
color: RGBA(10, 88, 202, var(--bs-link-opacity, 1)) !important;
text-decoration-color: RGBA(10, 88, 202, var(--bs-link-underline-opacity, 1)) !important;
}
.link-secondary {
color: RGBA(var(--bs-secondary-rgb), var(--bs-link-opacity, 1)) !important;
text-decoration-color: RGBA(var(--bs-secondary-rgb), var(--bs-link-underline-opacity, 1)) !important;
}
.link-secondary:hover, .link-secondary:focus {
color: RGBA(86, 94, 100, var(--bs-link-opacity, 1)) !important;
text-decoration-color: RGBA(86, 94, 100, var(--bs-link-underline-opacity, 1)) !important;
}
.link-success {
color: RGBA(var(--bs-success-rgb), var(--bs-link-opacity, 1)) !important;
text-decoration-color: RGBA(var(--bs-success-rgb), var(--bs-link-underline-opacity, 1)) !important;
}
.link-success:hover, .link-success:focus {
color: RGBA(20, 108, 67, var(--bs-link-opacity, 1)) !important;
text-decoration-color: RGBA(20, 108, 67, var(--bs-link-underline-opacity, 1)) !important;
}
.link-info {
color: RGBA(var(--bs-info-rgb), var(--bs-link-opacity, 1)) !important;
text-decoration-color: RGBA(var(--bs-info-rgb), var(--bs-link-underline-opacity, 1)) !important;
}
.link-info:hover, .link-info:focus {
color: RGBA(61, 213, 243, var(--bs-link-opacity, 1)) !important;
text-decoration-color: RGBA(61, 213, 243, var(--bs-link-underline-opacity, 1)) !important;
}
.link-warning {
color: RGBA(var(--bs-warning-rgb), var(--bs-link-opacity, 1)) !important;
text-decoration-color: RGBA(var(--bs-warning-rgb), var(--bs-link-underline-opacity, 1)) !important;
}
.link-warning:hover, .link-warning:focus {
color: RGBA(255, 205, 57, var(--bs-link-opacity, 1)) !important;
text-decoration-color: RGBA(255, 205, 57, var(--bs-link-underline-opacity, 1)) !important;
}
.link-danger {
color: RGBA(var(--bs-danger-rgb), var(--bs-link-opacity, 1)) !important;
text-decoration-color: RGBA(var(--bs-danger-rgb), var(--bs-link-underline-opacity, 1)) !important;
}
.link-danger:hover, .link-danger:focus {
color: RGBA(176, 42, 55, var(--bs-link-opacity, 1)) !important;
text-decoration-color: RGBA(176, 42, 55, var(--bs-link-underline-opacity, 1)) !important;
}
.link-light {
color: RGBA(var(--bs-light-rgb), var(--bs-link-opacity, 1)) !important;
text-decoration-color: RGBA(var(--bs-light-rgb), var(--bs-link-underline-opacity, 1)) !important;
}
.link-light:hover, .link-light:focus {
color: RGBA(249, 250, 251, var(--bs-link-opacity, 1)) !important;
text-decoration-color: RGBA(249, 250, 251, var(--bs-link-underline-opacity, 1)) !important;
}
.link-dark {
color: RGBA(var(--bs-dark-rgb), var(--bs-link-opacity, 1)) !important;
text-decoration-color: RGBA(var(--bs-dark-rgb), var(--bs-link-underline-opacity, 1)) !important;
}
.link-dark:hover, .link-dark:focus {
color: RGBA(26, 30, 33, var(--bs-link-opacity, 1)) !important;
text-decoration-color: RGBA(26, 30, 33, var(--bs-link-underline-opacity, 1)) !important;
}
.link-body-emphasis {
color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 1)) !important;
text-decoration-color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 1)) !important;
}
.link-body-emphasis:hover, .link-body-emphasis:focus {
color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 0.75)) !important;
text-decoration-color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 0.75)) !important;
}
.focus-ring:focus {
outline: 0;
box-shadow: var(--bs-focus-ring-x, 0) var(--bs-focus-ring-y, 0) var(--bs-focus-ring-blur, 0) var(--bs-focus-ring-width) var(--bs-focus-ring-color);
}
.icon-link {
display: inline-flex;
gap: 0.375rem;
align-items: center;
text-decoration-color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 0.5));
text-underline-offset: 0.25em;
backface-visibility: hidden;
}
.icon-link > .bi {
flex-shrink: 0;
width: 1em;
height: 1em;
fill: currentcolor;
transition: 0.2s ease-in-out transform;
}
@media (prefers-reduced-motion: reduce) {
.icon-link > .bi {
transition: none;
}
}
.icon-link-hover:hover > .bi, .icon-link-hover:focus-visible > .bi {
transform: var(--bs-icon-link-transform, translate3d(0.25em, 0, 0));
}
.ratio {
position: relative;
width: 100%;
}
.ratio::before {
display: block;
padding-top: var(--bs-aspect-ratio);
content: "";
}
.ratio > * {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
.ratio-1x1 {
--bs-aspect-ratio: 100%;
}
.ratio-4x3 {
--bs-aspect-ratio: 75%;
}
.ratio-16x9 {
--bs-aspect-ratio: 56.25%;
}
.ratio-21x9 {
--bs-aspect-ratio: 42.8571428571%;
}
.fixed-top {
position: fixed;
top: 0;
right: 0;
left: 0;
z-index: 1030;
}
.fixed-bottom {
position: fixed;
right: 0;
bottom: 0;
left: 0;
z-index: 1030;
}
.sticky-top {
position: sticky;
top: 0;
z-index: 1020;
}
.sticky-bottom {
position: sticky;
bottom: 0;
z-index: 1020;
}
@media (min-width: 576px) {
.sticky-sm-top {
position: sticky;
top: 0;
z-index: 1020;
}
.sticky-sm-bottom {
position: sticky;
bottom: 0;
z-index: 1020;
}
}
@media (min-width: 768px) {
.sticky-md-top {
position: sticky;
top: 0;
z-index: 1020;
}
.sticky-md-bottom {
position: sticky;
bottom: 0;
z-index: 1020;
}
}
@media (min-width: 992px) {
.sticky-lg-top {
position: sticky;
top: 0;
z-index: 1020;
}
.sticky-lg-bottom {
position: sticky;
bottom: 0;
z-index: 1020;
}
}
@media (min-width: 1200px) {
.sticky-xl-top {
position: sticky;
top: 0;
z-index: 1020;
}
.sticky-xl-bottom {
position: sticky;
bottom: 0;
z-index: 1020;
}
}
@media (min-width: 1400px) {
.sticky-xxl-top {
position: sticky;
top: 0;
z-index: 1020;
}
.sticky-xxl-bottom {
position: sticky;
bottom: 0;
z-index: 1020;
}
}
.hstack {
display: flex;
flex-direction: row;
align-items: center;
align-self: stretch;
}
.vstack {
display: flex;
flex: 1 1 auto;
flex-direction: column;
align-self: stretch;
}
.visually-hidden,
.visually-hidden-focusable:not(:focus):not(:focus-within) {
width: 1px !important;
height: 1px !important;
padding: 0 !important;
margin: -1px !important;
overflow: hidden !important;
clip: rect(0, 0, 0, 0) !important;
white-space: nowrap !important;
border: 0 !important;
}
.visually-hidden:not(caption),
.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption) {
position: absolute !important;
}
.stretched-link::after {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
z-index: 1;
content: "";
}
.text-truncate {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.vr {
display: inline-block;
align-self: stretch;
width: var(--bs-border-width);
min-height: 1em;
background-color: currentcolor;
opacity: 0.25;
}
.align-baseline {
vertical-align: baseline !important;
}
.align-top {
vertical-align: top !important;
}
.align-middle {
vertical-align: middle !important;
}
.align-bottom {
vertical-align: bottom !important;
}
.align-text-bottom {
vertical-align: text-bottom !important;
}
.align-text-top {
vertical-align: text-top !important;
}
.float-start {
float: left !important;
}
.float-end {
float: right !important;
}
.float-none {
float: none !important;
}
.object-fit-contain {
object-fit: contain !important;
}
.object-fit-cover {
object-fit: cover !important;
}
.object-fit-fill {
object-fit: fill !important;
}
.object-fit-scale {
object-fit: scale-down !important;
}
.object-fit-none {
object-fit: none !important;
}
.opacity-0 {
opacity: 0 !important;
}
.opacity-25 {
opacity: 0.25 !important;
}
.opacity-50 {
opacity: 0.5 !important;
}
.opacity-75 {
opacity: 0.75 !important;
}
.opacity-100 {
opacity: 1 !important;
}
.overflow-auto {
overflow: auto !important;
}
.overflow-hidden {
overflow: hidden !important;
}
.overflow-visible {
overflow: visible !important;
}
.overflow-scroll {
overflow: scroll !important;
}
.overflow-x-auto {
overflow-x: auto !important;
}
.overflow-x-hidden {
overflow-x: hidden !important;
}
.overflow-x-visible {
overflow-x: visible !important;
}
.overflow-x-scroll {
overflow-x: scroll !important;
}
.overflow-y-auto {
overflow-y: auto !important;
}
.overflow-y-hidden {
overflow-y: hidden !important;
}
.overflow-y-visible {
overflow-y: visible !important;
}
.overflow-y-scroll {
overflow-y: scroll !important;
}
.d-inline {
display: inline !important;
}
.d-inline-block {
display: inline-block !important;
}
.d-block {
display: block !important;
}
.d-grid {
display: grid !important;
}
.d-inline-grid {
display: inline-grid !important;
}
.d-table {
display: table !important;
}
.d-table-row {
display: table-row !important;
}
.d-table-cell {
display: table-cell !important;
}
.d-flex {
display: flex !important;
}
.d-inline-flex {
display: inline-flex !important;
}
.d-none {
display: none !important;
}
.shadow {
box-shadow: var(--bs-box-shadow) !important;
}
.shadow-sm {
box-shadow: var(--bs-box-shadow-sm) !important;
}
.shadow-lg {
box-shadow: var(--bs-box-shadow-lg) !important;
}
.shadow-none {
box-shadow: none !important;
}
.focus-ring-primary {
--bs-focus-ring-color: rgba(var(--bs-primary-rgb), var(--bs-focus-ring-opacity));
}
.focus-ring-secondary {
--bs-focus-ring-color: rgba(var(--bs-secondary-rgb), var(--bs-focus-ring-opacity));
}
.focus-ring-success {
--bs-focus-ring-color: rgba(var(--bs-success-rgb), var(--bs-focus-ring-opacity));
}
.focus-ring-info {
--bs-focus-ring-color: rgba(var(--bs-info-rgb), var(--bs-focus-ring-opacity));
}
.focus-ring-warning {
--bs-focus-ring-color: rgba(var(--bs-warning-rgb), var(--bs-focus-ring-opacity));
}
.focus-ring-danger {
--bs-focus-ring-color: rgba(var(--bs-danger-rgb), var(--bs-focus-ring-opacity));
}
.focus-ring-light {
--bs-focus-ring-color: rgba(var(--bs-light-rgb), var(--bs-focus-ring-opacity));
}
.focus-ring-dark {
--bs-focus-ring-color: rgba(var(--bs-dark-rgb), var(--bs-focus-ring-opacity));
}
.position-static {
position: static !important;
}
.position-relative {
position: relative !important;
}
.position-absolute {
position: absolute !important;
}
.position-fixed {
position: fixed !important;
}
.position-sticky {
position: sticky !important;
}
.top-0 {
top: 0 !important;
}
.top-50 {
top: 50% !important;
}
.top-100 {
top: 100% !important;
}
.bottom-0 {
bottom: 0 !important;
}
.bottom-50 {
bottom: 50% !important;
}
.bottom-100 {
bottom: 100% !important;
}
.start-0 {
left: 0 !important;
}
.start-50 {
left: 50% !important;
}
.start-100 {
left: 100% !important;
}
.end-0 {
right: 0 !important;
}
.end-50 {
right: 50% !important;
}
.end-100 {
right: 100% !important;
}
.translate-middle {
transform: translate(-50%, -50%) !important;
}
.translate-middle-x {
transform: translateX(-50%) !important;
}
.translate-middle-y {
transform: translateY(-50%) !important;
}
.border {
border: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;
}
.border-0 {
border: 0 !important;
}
.border-top {
border-top: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;
}
.border-top-0 {
border-top: 0 !important;
}
.border-end {
border-right: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;
}
.border-end-0 {
border-right: 0 !important;
}
.border-bottom {
border-bottom: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;
}
.border-bottom-0 {
border-bottom: 0 !important;
}
.border-start {
border-left: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;
}
.border-start-0 {
border-left: 0 !important;
}
.border-primary {
--bs-border-opacity: 1;
border-color: rgba(var(--bs-primary-rgb), var(--bs-border-opacity)) !important;
}
.border-secondary {
--bs-border-opacity: 1;
border-color: rgba(var(--bs-secondary-rgb), var(--bs-border-opacity)) !important;
}
.border-success {
--bs-border-opacity: 1;
border-color: rgba(var(--bs-success-rgb), var(--bs-border-opacity)) !important;
}
.border-info {
--bs-border-opacity: 1;
border-color: rgba(var(--bs-info-rgb), var(--bs-border-opacity)) !important;
}
.border-warning {
--bs-border-opacity: 1;
border-color: rgba(var(--bs-warning-rgb), var(--bs-border-opacity)) !important;
}
.border-danger {
--bs-border-opacity: 1;
border-color: rgba(var(--bs-danger-rgb), var(--bs-border-opacity)) !important;
}
.border-light {
--bs-border-opacity: 1;
border-color: rgba(var(--bs-light-rgb), var(--bs-border-opacity)) !important;
}
.border-dark {
--bs-border-opacity: 1;
border-color: rgba(var(--bs-dark-rgb), var(--bs-border-opacity)) !important;
}
.border-black {
--bs-border-opacity: 1;
border-color: rgba(var(--bs-black-rgb), var(--bs-border-opacity)) !important;
}
.border-white {
--bs-border-opacity: 1;
border-color: rgba(var(--bs-white-rgb), var(--bs-border-opacity)) !important;
}
.border-primary-subtle {
border-color: var(--bs-primary-border-subtle) !important;
}
.border-secondary-subtle {
border-color: var(--bs-secondary-border-subtle) !important;
}
.border-success-subtle {
border-color: var(--bs-success-border-subtle) !important;
}
.border-info-subtle {
border-color: var(--bs-info-border-subtle) !important;
}
.border-warning-subtle {
border-color: var(--bs-warning-border-subtle) !important;
}
.border-danger-subtle {
border-color: var(--bs-danger-border-subtle) !important;
}
.border-light-subtle {
border-color: var(--bs-light-border-subtle) !important;
}
.border-dark-subtle {
border-color: var(--bs-dark-border-subtle) !important;
}
.border-1 {
border-width: 1px !important;
}
.border-2 {
border-width: 2px !important;
}
.border-3 {
border-width: 3px !important;
}
.border-4 {
border-width: 4px !important;
}
.border-5 {
border-width: 5px !important;
}
.border-opacity-10 {
--bs-border-opacity: 0.1;
}
.border-opacity-25 {
--bs-border-opacity: 0.25;
}
.border-opacity-50 {
--bs-border-opacity: 0.5;
}
.border-opacity-75 {
--bs-border-opacity: 0.75;
}
.border-opacity-100 {
--bs-border-opacity: 1;
}
.w-25 {
width: 25% !important;
}
.w-50 {
width: 50% !important;
}
.w-75 {
width: 75% !important;
}
.w-100 {
width: 100% !important;
}
.w-auto {
width: auto !important;
}
.mw-100 {
max-width: 100% !important;
}
.vw-100 {
width: 100vw !important;
}
.min-vw-100 {
min-width: 100vw !important;
}
.h-25 {
height: 25% !important;
}
.h-50 {
height: 50% !important;
}
.h-75 {
height: 75% !important;
}
.h-100 {
height: 100% !important;
}
.h-auto {
height: auto !important;
}
.mh-100 {
max-height: 100% !important;
}
.vh-100 {
height: 100vh !important;
}
.min-vh-100 {
min-height: 100vh !important;
}
.flex-fill {
flex: 1 1 auto !important;
}
.flex-row {
flex-direction: row !important;
}
.flex-column {
flex-direction: column !important;
}
.flex-row-reverse {
flex-direction: row-reverse !important;
}
.flex-column-reverse {
flex-direction: column-reverse !important;
}
.flex-grow-0 {
flex-grow: 0 !important;
}
.flex-grow-1 {
flex-grow: 1 !important;
}
.flex-shrink-0 {
flex-shrink: 0 !important;
}
.flex-shrink-1 {
flex-shrink: 1 !important;
}
.flex-wrap {
flex-wrap: wrap !important;
}
.flex-nowrap {
flex-wrap: nowrap !important;
}
.flex-wrap-reverse {
flex-wrap: wrap-reverse !important;
}
.justify-content-start {
justify-content: flex-start !important;
}
.justify-content-end {
justify-content: flex-end !important;
}
.justify-content-center {
justify-content: center !important;
}
.justify-content-between {
justify-content: space-between !important;
}
.justify-content-around {
justify-content: space-around !important;
}
.justify-content-evenly {
justify-content: space-evenly !important;
}
.align-items-start {
align-items: flex-start !important;
}
.align-items-end {
align-items: flex-end !important;
}
.align-items-center {
align-items: center !important;
}
.align-items-baseline {
align-items: baseline !important;
}
.align-items-stretch {
align-items: stretch !important;
}
.align-content-start {
align-content: flex-start !important;
}
.align-content-end {
align-content: flex-end !important;
}
.align-content-center {
align-content: center !important;
}
.align-content-between {
align-content: space-between !important;
}
.align-content-around {
align-content: space-around !important;
}
.align-content-stretch {
align-content: stretch !important;
}
.align-self-auto {
align-self: auto !important;
}
.align-self-start {
align-self: flex-start !important;
}
.align-self-end {
align-self: flex-end !important;
}
.align-self-center {
align-self: center !important;
}
.align-self-baseline {
align-self: baseline !important;
}
.align-self-stretch {
align-self: stretch !important;
}
.order-first {
order: -1 !important;
}
.order-0 {
order: 0 !important;
}
.order-1 {
order: 1 !important;
}
.order-2 {
order: 2 !important;
}
.order-3 {
order: 3 !important;
}
.order-4 {
order: 4 !important;
}
.order-5 {
order: 5 !important;
}
.order-last {
order: 6 !important;
}
.m-0 {
margin: 0 !important;
}
.m-1 {
margin: 0.25rem !important;
}
.m-2 {
margin: 0.5rem !important;
}
.m-3 {
margin: 1rem !important;
}
.m-4 {
margin: 1.5rem !important;
}
.m-5 {
margin: 3rem !important;
}
.m-auto {
margin: auto !important;
}
.mx-0 {
margin-right: 0 !important;
margin-left: 0 !important;
}
.mx-1 {
margin-right: 0.25rem !important;
margin-left: 0.25rem !important;
}
.mx-2 {
margin-right: 0.5rem !important;
margin-left: 0.5rem !important;
}
.mx-3 {
margin-right: 1rem !important;
margin-left: 1rem !important;
}
.mx-4 {
margin-right: 1.5rem !important;
margin-left: 1.5rem !important;
}
.mx-5 {
margin-right: 3rem !important;
margin-left: 3rem !important;
}
.mx-auto {
margin-right: auto !important;
margin-left: auto !important;
}
.my-0 {
margin-top: 0 !important;
margin-bottom: 0 !important;
}
.my-1 {
margin-top: 0.25rem !important;
margin-bottom: 0.25rem !important;
}
.my-2 {
margin-top: 0.5rem !important;
margin-bottom: 0.5rem !important;
}
.my-3 {
margin-top: 1rem !important;
margin-bottom: 1rem !important;
}
.my-4 {
margin-top: 1.5rem !important;
margin-bottom: 1.5rem !important;
}
.my-5 {
margin-top: 3rem !important;
margin-bottom: 3rem !important;
}
.my-auto {
margin-top: auto !important;
margin-bottom: auto !important;
}
.mt-0 {
margin-top: 0 !important;
}
.mt-1 {
margin-top: 0.25rem !important;
}
.mt-2 {
margin-top: 0.5rem !important;
}
.mt-3 {
margin-top: 1rem !important;
}
.mt-4 {
margin-top: 1.5rem !important;
}
.mt-5 {
margin-top: 3rem !important;
}
.mt-auto {
margin-top: auto !important;
}
.me-0 {
margin-right: 0 !important;
}
.me-1 {
margin-right: 0.25rem !important;
}
.me-2 {
margin-right: 0.5rem !important;
}
.me-3 {
margin-right: 1rem !important;
}
.me-4 {
margin-right: 1.5rem !important;
}
.me-5 {
margin-right: 3rem !important;
}
.me-auto {
margin-right: auto !important;
}
.mb-0 {
margin-bottom: 0 !important;
}
.mb-1 {
margin-bottom: 0.25rem !important;
}
.mb-2 {
margin-bottom: 0.5rem !important;
}
.mb-3 {
margin-bottom: 1rem !important;
}
.mb-4 {
margin-bottom: 1.5rem !important;
}
.mb-5 {
margin-bottom: 3rem !important;
}
.mb-auto {
margin-bottom: auto !important;
}
.ms-0 {
margin-left: 0 !important;
}
.ms-1 {
margin-left: 0.25rem !important;
}
.ms-2 {
margin-left: 0.5rem !important;
}
.ms-3 {
margin-left: 1rem !important;
}
.ms-4 {
margin-left: 1.5rem !important;
}
.ms-5 {
margin-left: 3rem !important;
}
.ms-auto {
margin-left: auto !important;
}
.p-0 {
padding: 0 !important;
}
.p-1 {
padding: 0.25rem !important;
}
.p-2 {
padding: 0.5rem !important;
}
.p-3 {
padding: 1rem !important;
}
.p-4 {
padding: 1.5rem !important;
}
.p-5 {
padding: 3rem !important;
}
.px-0 {
padding-right: 0 !important;
padding-left: 0 !important;
}
.px-1 {
padding-right: 0.25rem !important;
padding-left: 0.25rem !important;
}
.px-2 {
padding-right: 0.5rem !important;
padding-left: 0.5rem !important;
}
.px-3 {
padding-right: 1rem !important;
padding-left: 1rem !important;
}
.px-4 {
padding-right: 1.5rem !important;
padding-left: 1.5rem !important;
}
.px-5 {
padding-right: 3rem !important;
padding-left: 3rem !important;
}
.py-0 {
padding-top: 0 !important;
padding-bottom: 0 !important;
}
.py-1 {
padding-top: 0.25rem !important;
padding-bottom: 0.25rem !important;
}
.py-2 {
padding-top: 0.5rem !important;
padding-bottom: 0.5rem !important;
}
.py-3 {
padding-top: 1rem !important;
padding-bottom: 1rem !important;
}
.py-4 {
padding-top: 1.5rem !important;
padding-bottom: 1.5rem !important;
}
.py-5 {
padding-top: 3rem !important;
padding-bottom: 3rem !important;
}
.pt-0 {
padding-top: 0 !important;
}
.pt-1 {
padding-top: 0.25rem !important;
}
.pt-2 {
padding-top: 0.5rem !important;
}
.pt-3 {
padding-top: 1rem !important;
}
.pt-4 {
padding-top: 1.5rem !important;
}
.pt-5 {
padding-top: 3rem !important;
}
.pe-0 {
padding-right: 0 !important;
}
.pe-1 {
padding-right: 0.25rem !important;
}
.pe-2 {
padding-right: 0.5rem !important;
}
.pe-3 {
padding-right: 1rem !important;
}
.pe-4 {
padding-right: 1.5rem !important;
}
.pe-5 {
padding-right: 3rem !important;
}
.pb-0 {
padding-bottom: 0 !important;
}
.pb-1 {
padding-bottom: 0.25rem !important;
}
.pb-2 {
padding-bottom: 0.5rem !important;
}
.pb-3 {
padding-bottom: 1rem !important;
}
.pb-4 {
padding-bottom: 1.5rem !important;
}
.pb-5 {
padding-bottom: 3rem !important;
}
.ps-0 {
padding-left: 0 !important;
}
.ps-1 {
padding-left: 0.25rem !important;
}
.ps-2 {
padding-left: 0.5rem !important;
}
.ps-3 {
padding-left: 1rem !important;
}
.ps-4 {
padding-left: 1.5rem !important;
}
.ps-5 {
padding-left: 3rem !important;
}
.gap-0 {
gap: 0 !important;
}
.gap-1 {
gap: 0.25rem !important;
}
.gap-2 {
gap: 0.5rem !important;
}
.gap-3 {
gap: 1rem !important;
}
.gap-4 {
gap: 1.5rem !important;
}
.gap-5 {
gap: 3rem !important;
}
.row-gap-0 {
row-gap: 0 !important;
}
.row-gap-1 {
row-gap: 0.25rem !important;
}
.row-gap-2 {
row-gap: 0.5rem !important;
}
.row-gap-3 {
row-gap: 1rem !important;
}
.row-gap-4 {
row-gap: 1.5rem !important;
}
.row-gap-5 {
row-gap: 3rem !important;
}
.column-gap-0 {
column-gap: 0 !important;
}
.column-gap-1 {
column-gap: 0.25rem !important;
}
.column-gap-2 {
column-gap: 0.5rem !important;
}
.column-gap-3 {
column-gap: 1rem !important;
}
.column-gap-4 {
column-gap: 1.5rem !important;
}
.column-gap-5 {
column-gap: 3rem !important;
}
.font-monospace {
font-family: var(--bs-font-monospace) !important;
}
.fs-1 {
font-size: calc(1.375rem + 1.5vw) !important;
}
.fs-2 {
font-size: calc(1.325rem + 0.9vw) !important;
}
.fs-3 {
font-size: calc(1.3rem + 0.6vw) !important;
}
.fs-4 {
font-size: calc(1.275rem + 0.3vw) !important;
}
.fs-5 {
font-size: 1.25rem !important;
}
.fs-6 {
font-size: 1rem !important;
}
.fst-italic {
font-style: italic !important;
}
.fst-normal {
font-style: normal !important;
}
.fw-lighter {
font-weight: lighter !important;
}
.fw-light {
font-weight: 300 !important;
}
.fw-normal {
font-weight: 400 !important;
}
.fw-medium {
font-weight: 500 !important;
}
.fw-semibold {
font-weight: 600 !important;
}
.fw-bold {
font-weight: 700 !important;
}
.fw-bolder {
font-weight: bolder !important;
}
.lh-1 {
line-height: 1 !important;
}
.lh-sm {
line-height: 1.25 !important;
}
.lh-base {
line-height: 1.5 !important;
}
.lh-lg {
line-height: 2 !important;
}
.text-start {
text-align: left !important;
}
.text-end {
text-align: right !important;
}
.text-center {
text-align: center !important;
}
.text-decoration-none {
text-decoration: none !important;
}
.text-decoration-underline {
text-decoration: underline !important;
}
.text-decoration-line-through {
text-decoration: line-through !important;
}
.text-lowercase {
text-transform: lowercase !important;
}
.text-uppercase {
text-transform: uppercase !important;
}
.text-capitalize {
text-transform: capitalize !important;
}
.text-wrap {
white-space: normal !important;
}
.text-nowrap {
white-space: nowrap !important;
}
/* rtl:begin:remove */
.text-break {
word-wrap: break-word !important;
word-break: break-word !important;
}
/* rtl:end:remove */
.text-primary {
--bs-text-opacity: 1;
color: rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important;
}
.text-secondary {
--bs-text-opacity: 1;
color: rgba(var(--bs-secondary-rgb), var(--bs-text-opacity)) !important;
}
.text-success {
--bs-text-opacity: 1;
color: rgba(var(--bs-success-rgb), var(--bs-text-opacity)) !important;
}
.text-info {
--bs-text-opacity: 1;
color: rgba(var(--bs-info-rgb), var(--bs-text-opacity)) !important;
}
.text-warning {
--bs-text-opacity: 1;
color: rgba(var(--bs-warning-rgb), var(--bs-text-opacity)) !important;
}
.text-danger {
--bs-text-opacity: 1;
color: rgba(var(--bs-danger-rgb), var(--bs-text-opacity)) !important;
}
.text-light {
--bs-text-opacity: 1;
color: rgba(var(--bs-light-rgb), var(--bs-text-opacity)) !important;
}
.text-dark {
--bs-text-opacity: 1;
color: rgba(var(--bs-dark-rgb), var(--bs-text-opacity)) !important;
}
.text-black {
--bs-text-opacity: 1;
color: rgba(var(--bs-black-rgb), var(--bs-text-opacity)) !important;
}
.text-white {
--bs-text-opacity: 1;
color: rgba(var(--bs-white-rgb), var(--bs-text-opacity)) !important;
}
.text-body {
--bs-text-opacity: 1;
color: rgba(var(--bs-body-color-rgb), var(--bs-text-opacity)) !important;
}
.text-muted {
--bs-text-opacity: 1;
color: var(--bs-secondary-color) !important;
}
.text-black-50 {
--bs-text-opacity: 1;
color: rgba(0, 0, 0, 0.5) !important;
}
.text-white-50 {
--bs-text-opacity: 1;
color: rgba(255, 255, 255, 0.5) !important;
}
.text-body-secondary {
--bs-text-opacity: 1;
color: var(--bs-secondary-color) !important;
}
.text-body-tertiary {
--bs-text-opacity: 1;
color: var(--bs-tertiary-color) !important;
}
.text-body-emphasis {
--bs-text-opacity: 1;
color: var(--bs-emphasis-color) !important;
}
.text-reset {
--bs-text-opacity: 1;
color: inherit !important;
}
.text-opacity-25 {
--bs-text-opacity: 0.25;
}
.text-opacity-50 {
--bs-text-opacity: 0.5;
}
.text-opacity-75 {
--bs-text-opacity: 0.75;
}
.text-opacity-100 {
--bs-text-opacity: 1;
}
.text-primary-emphasis {
color: var(--bs-primary-text-emphasis) !important;
}
.text-secondary-emphasis {
color: var(--bs-secondary-text-emphasis) !important;
}
.text-success-emphasis {
color: var(--bs-success-text-emphasis) !important;
}
.text-info-emphasis {
color: var(--bs-info-text-emphasis) !important;
}
.text-warning-emphasis {
color: var(--bs-warning-text-emphasis) !important;
}
.text-danger-emphasis {
color: var(--bs-danger-text-emphasis) !important;
}
.text-light-emphasis {
color: var(--bs-light-text-emphasis) !important;
}
.text-dark-emphasis {
color: var(--bs-dark-text-emphasis) !important;
}
.link-opacity-10 {
--bs-link-opacity: 0.1;
}
.link-opacity-10-hover:hover {
--bs-link-opacity: 0.1;
}
.link-opacity-25 {
--bs-link-opacity: 0.25;
}
.link-opacity-25-hover:hover {
--bs-link-opacity: 0.25;
}
.link-opacity-50 {
--bs-link-opacity: 0.5;
}
.link-opacity-50-hover:hover {
--bs-link-opacity: 0.5;
}
.link-opacity-75 {
--bs-link-opacity: 0.75;
}
.link-opacity-75-hover:hover {
--bs-link-opacity: 0.75;
}
.link-opacity-100 {
--bs-link-opacity: 1;
}
.link-opacity-100-hover:hover {
--bs-link-opacity: 1;
}
.link-offset-1 {
text-underline-offset: 0.125em !important;
}
.link-offset-1-hover:hover {
text-underline-offset: 0.125em !important;
}
.link-offset-2 {
text-underline-offset: 0.25em !important;
}
.link-offset-2-hover:hover {
text-underline-offset: 0.25em !important;
}
.link-offset-3 {
text-underline-offset: 0.375em !important;
}
.link-offset-3-hover:hover {
text-underline-offset: 0.375em !important;
}
.link-underline-primary {
--bs-link-underline-opacity: 1;
text-decoration-color: rgba(var(--bs-primary-rgb), var(--bs-link-underline-opacity)) !important;
}
.link-underline-secondary {
--bs-link-underline-opacity: 1;
text-decoration-color: rgba(var(--bs-secondary-rgb), var(--bs-link-underline-opacity)) !important;
}
.link-underline-success {
--bs-link-underline-opacity: 1;
text-decoration-color: rgba(var(--bs-success-rgb), var(--bs-link-underline-opacity)) !important;
}
.link-underline-info {
--bs-link-underline-opacity: 1;
text-decoration-color: rgba(var(--bs-info-rgb), var(--bs-link-underline-opacity)) !important;
}
.link-underline-warning {
--bs-link-underline-opacity: 1;
text-decoration-color: rgba(var(--bs-warning-rgb), var(--bs-link-underline-opacity)) !important;
}
.link-underline-danger {
--bs-link-underline-opacity: 1;
text-decoration-color: rgba(var(--bs-danger-rgb), var(--bs-link-underline-opacity)) !important;
}
.link-underline-light {
--bs-link-underline-opacity: 1;
text-decoration-color: rgba(var(--bs-light-rgb), var(--bs-link-underline-opacity)) !important;
}
.link-underline-dark {
--bs-link-underline-opacity: 1;
text-decoration-color: rgba(var(--bs-dark-rgb), var(--bs-link-underline-opacity)) !important;
}
.link-underline {
--bs-link-underline-opacity: 1;
text-decoration-color: rgba(var(--bs-link-color-rgb), var(--bs-link-underline-opacity, 1)) !important;
}
.link-underline-opacity-0 {
--bs-link-underline-opacity: 0;
}
.link-underline-opacity-0-hover:hover {
--bs-link-underline-opacity: 0;
}
.link-underline-opacity-10 {
--bs-link-underline-opacity: 0.1;
}
.link-underline-opacity-10-hover:hover {
--bs-link-underline-opacity: 0.1;
}
.link-underline-opacity-25 {
--bs-link-underline-opacity: 0.25;
}
.link-underline-opacity-25-hover:hover {
--bs-link-underline-opacity: 0.25;
}
.link-underline-opacity-50 {
--bs-link-underline-opacity: 0.5;
}
.link-underline-opacity-50-hover:hover {
--bs-link-underline-opacity: 0.5;
}
.link-underline-opacity-75 {
--bs-link-underline-opacity: 0.75;
}
.link-underline-opacity-75-hover:hover {
--bs-link-underline-opacity: 0.75;
}
.link-underline-opacity-100 {
--bs-link-underline-opacity: 1;
}
.link-underline-opacity-100-hover:hover {
--bs-link-underline-opacity: 1;
}
.bg-primary {
--bs-bg-opacity: 1;
background-color: rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important;
}
.bg-secondary {
--bs-bg-opacity: 1;
background-color: rgba(var(--bs-secondary-rgb), var(--bs-bg-opacity)) !important;
}
.bg-success {
--bs-bg-opacity: 1;
background-color: rgba(var(--bs-success-rgb), var(--bs-bg-opacity)) !important;
}
.bg-info {
--bs-bg-opacity: 1;
background-color: rgba(var(--bs-info-rgb), var(--bs-bg-opacity)) !important;
}
.bg-warning {
--bs-bg-opacity: 1;
background-color: rgba(var(--bs-warning-rgb), var(--bs-bg-opacity)) !important;
}
.bg-danger {
--bs-bg-opacity: 1;
background-color: rgba(var(--bs-danger-rgb), var(--bs-bg-opacity)) !important;
}
.bg-light {
--bs-bg-opacity: 1;
background-color: rgba(var(--bs-light-rgb), var(--bs-bg-opacity)) !important;
}
.bg-dark {
--bs-bg-opacity: 1;
background-color: rgba(var(--bs-dark-rgb), var(--bs-bg-opacity)) !important;
}
.bg-black {
--bs-bg-opacity: 1;
background-color: rgba(var(--bs-black-rgb), var(--bs-bg-opacity)) !important;
}
.bg-white {
--bs-bg-opacity: 1;
background-color: rgba(var(--bs-white-rgb), var(--bs-bg-opacity)) !important;
}
.bg-body {
--bs-bg-opacity: 1;
background-color: rgba(var(--bs-body-bg-rgb), var(--bs-bg-opacity)) !important;
}
.bg-transparent {
--bs-bg-opacity: 1;
background-color: transparent !important;
}
.bg-body-secondary {
--bs-bg-opacity: 1;
background-color: rgba(var(--bs-secondary-bg-rgb), var(--bs-bg-opacity)) !important;
}
.bg-body-tertiary {
--bs-bg-opacity: 1;
background-color: rgba(var(--bs-tertiary-bg-rgb), var(--bs-bg-opacity)) !important;
}
.bg-opacity-10 {
--bs-bg-opacity: 0.1;
}
.bg-opacity-25 {
--bs-bg-opacity: 0.25;
}
.bg-opacity-50 {
--bs-bg-opacity: 0.5;
}
.bg-opacity-75 {
--bs-bg-opacity: 0.75;
}
.bg-opacity-100 {
--bs-bg-opacity: 1;
}
.bg-primary-subtle {
background-color: var(--bs-primary-bg-subtle) !important;
}
.bg-secondary-subtle {
background-color: var(--bs-secondary-bg-subtle) !important;
}
.bg-success-subtle {
background-color: var(--bs-success-bg-subtle) !important;
}
.bg-info-subtle {
background-color: var(--bs-info-bg-subtle) !important;
}
.bg-warning-subtle {
background-color: var(--bs-warning-bg-subtle) !important;
}
.bg-danger-subtle {
background-color: var(--bs-danger-bg-subtle) !important;
}
.bg-light-subtle {
background-color: var(--bs-light-bg-subtle) !important;
}
.bg-dark-subtle {
background-color: var(--bs-dark-bg-subtle) !important;
}
.bg-gradient {
background-image: var(--bs-gradient) !important;
}
.user-select-all {
user-select: all !important;
}
.user-select-auto {
user-select: auto !important;
}
.user-select-none {
user-select: none !important;
}
.pe-none {
pointer-events: none !important;
}
.pe-auto {
pointer-events: auto !important;
}
.rounded {
border-radius: var(--bs-border-radius) !important;
}
.rounded-0 {
border-radius: 0 !important;
}
.rounded-1 {
border-radius: var(--bs-border-radius-sm) !important;
}
.rounded-2 {
border-radius: var(--bs-border-radius) !important;
}
.rounded-3 {
border-radius: var(--bs-border-radius-lg) !important;
}
.rounded-4 {
border-radius: var(--bs-border-radius-xl) !important;
}
.rounded-5 {
border-radius: var(--bs-border-radius-xxl) !important;
}
.rounded-circle {
border-radius: 50% !important;
}
.rounded-pill {
border-radius: var(--bs-border-radius-pill) !important;
}
.rounded-top {
border-top-left-radius: var(--bs-border-radius) !important;
border-top-right-radius: var(--bs-border-radius) !important;
}
.rounded-top-0 {
border-top-left-radius: 0 !important;
border-top-right-radius: 0 !important;
}
.rounded-top-1 {
border-top-left-radius: var(--bs-border-radius-sm) !important;
border-top-right-radius: var(--bs-border-radius-sm) !important;
}
.rounded-top-2 {
border-top-left-radius: var(--bs-border-radius) !important;
border-top-right-radius: var(--bs-border-radius) !important;
}
.rounded-top-3 {
border-top-left-radius: var(--bs-border-radius-lg) !important;
border-top-right-radius: var(--bs-border-radius-lg) !important;
}
.rounded-top-4 {
border-top-left-radius: var(--bs-border-radius-xl) !important;
border-top-right-radius: var(--bs-border-radius-xl) !important;
}
.rounded-top-5 {
border-top-left-radius: var(--bs-border-radius-xxl) !important;
border-top-right-radius: var(--bs-border-radius-xxl) !important;
}
.rounded-top-circle {
border-top-left-radius: 50% !important;
border-top-right-radius: 50% !important;
}
.rounded-top-pill {
border-top-left-radius: var(--bs-border-radius-pill) !important;
border-top-right-radius: var(--bs-border-radius-pill) !important;
}
.rounded-end {
border-top-right-radius: var(--bs-border-radius) !important;
border-bottom-right-radius: var(--bs-border-radius) !important;
}
.rounded-end-0 {
border-top-right-radius: 0 !important;
border-bottom-right-radius: 0 !important;
}
.rounded-end-1 {
border-top-right-radius: var(--bs-border-radius-sm) !important;
border-bottom-right-radius: var(--bs-border-radius-sm) !important;
}
.rounded-end-2 {
border-top-right-radius: var(--bs-border-radius) !important;
border-bottom-right-radius: var(--bs-border-radius) !important;
}
.rounded-end-3 {
border-top-right-radius: var(--bs-border-radius-lg) !important;
border-bottom-right-radius: var(--bs-border-radius-lg) !important;
}
.rounded-end-4 {
border-top-right-radius: var(--bs-border-radius-xl) !important;
border-bottom-right-radius: var(--bs-border-radius-xl) !important;
}
.rounded-end-5 {
border-top-right-radius: var(--bs-border-radius-xxl) !important;
border-bottom-right-radius: var(--bs-border-radius-xxl) !important;
}
.rounded-end-circle {
border-top-right-radius: 50% !important;
border-bottom-right-radius: 50% !important;
}
.rounded-end-pill {
border-top-right-radius: var(--bs-border-radius-pill) !important;
border-bottom-right-radius: var(--bs-border-radius-pill) !important;
}
.rounded-bottom {
border-bottom-right-radius: var(--bs-border-radius) !important;
border-bottom-left-radius: var(--bs-border-radius) !important;
}
.rounded-bottom-0 {
border-bottom-right-radius: 0 !important;
border-bottom-left-radius: 0 !important;
}
.rounded-bottom-1 {
border-bottom-right-radius: var(--bs-border-radius-sm) !important;
border-bottom-left-radius: var(--bs-border-radius-sm) !important;
}
.rounded-bottom-2 {
border-bottom-right-radius: var(--bs-border-radius) !important;
border-bottom-left-radius: var(--bs-border-radius) !important;
}
.rounded-bottom-3 {
border-bottom-right-radius: var(--bs-border-radius-lg) !important;
border-bottom-left-radius: var(--bs-border-radius-lg) !important;
}
.rounded-bottom-4 {
border-bottom-right-radius: var(--bs-border-radius-xl) !important;
border-bottom-left-radius: var(--bs-border-radius-xl) !important;
}
.rounded-bottom-5 {
border-bottom-right-radius: var(--bs-border-radius-xxl) !important;
border-bottom-left-radius: var(--bs-border-radius-xxl) !important;
}
.rounded-bottom-circle {
border-bottom-right-radius: 50% !important;
border-bottom-left-radius: 50% !important;
}
.rounded-bottom-pill {
border-bottom-right-radius: var(--bs-border-radius-pill) !important;
border-bottom-left-radius: var(--bs-border-radius-pill) !important;
}
.rounded-start {
border-bottom-left-radius: var(--bs-border-radius) !important;
border-top-left-radius: var(--bs-border-radius) !important;
}
.rounded-start-0 {
border-bottom-left-radius: 0 !important;
border-top-left-radius: 0 !important;
}
.rounded-start-1 {
border-bottom-left-radius: var(--bs-border-radius-sm) !important;
border-top-left-radius: var(--bs-border-radius-sm) !important;
}
.rounded-start-2 {
border-bottom-left-radius: var(--bs-border-radius) !important;
border-top-left-radius: var(--bs-border-radius) !important;
}
.rounded-start-3 {
border-bottom-left-radius: var(--bs-border-radius-lg) !important;
border-top-left-radius: var(--bs-border-radius-lg) !important;
}
.rounded-start-4 {
border-bottom-left-radius: var(--bs-border-radius-xl) !important;
border-top-left-radius: var(--bs-border-radius-xl) !important;
}
.rounded-start-5 {
border-bottom-left-radius: var(--bs-border-radius-xxl) !important;
border-top-left-radius: var(--bs-border-radius-xxl) !important;
}
.rounded-start-circle {
border-bottom-left-radius: 50% !important;
border-top-left-radius: 50% !important;
}
.rounded-start-pill {
border-bottom-left-radius: var(--bs-border-radius-pill) !important;
border-top-left-radius: var(--bs-border-radius-pill) !important;
}
.visible {
visibility: visible !important;
}
.invisible {
visibility: hidden !important;
}
.z-n1 {
z-index: -1 !important;
}
.z-0 {
z-index: 0 !important;
}
.z-1 {
z-index: 1 !important;
}
.z-2 {
z-index: 2 !important;
}
.z-3 {
z-index: 3 !important;
}
@media (min-width: 576px) {
.float-sm-start {
float: left !important;
}
.float-sm-end {
float: right !important;
}
.float-sm-none {
float: none !important;
}
.object-fit-sm-contain {
object-fit: contain !important;
}
.object-fit-sm-cover {
object-fit: cover !important;
}
.object-fit-sm-fill {
object-fit: fill !important;
}
.object-fit-sm-scale {
object-fit: scale-down !important;
}
.object-fit-sm-none {
object-fit: none !important;
}
.d-sm-inline {
display: inline !important;
}
.d-sm-inline-block {
display: inline-block !important;
}
.d-sm-block {
display: block !important;
}
.d-sm-grid {
display: grid !important;
}
.d-sm-inline-grid {
display: inline-grid !important;
}
.d-sm-table {
display: table !important;
}
.d-sm-table-row {
display: table-row !important;
}
.d-sm-table-cell {
display: table-cell !important;
}
.d-sm-flex {
display: flex !important;
}
.d-sm-inline-flex {
display: inline-flex !important;
}
.d-sm-none {
display: none !important;
}
.flex-sm-fill {
flex: 1 1 auto !important;
}
.flex-sm-row {
flex-direction: row !important;
}
.flex-sm-column {
flex-direction: column !important;
}
.flex-sm-row-reverse {
flex-direction: row-reverse !important;
}
.flex-sm-column-reverse {
flex-direction: column-reverse !important;
}
.flex-sm-grow-0 {
flex-grow: 0 !important;
}
.flex-sm-grow-1 {
flex-grow: 1 !important;
}
.flex-sm-shrink-0 {
flex-shrink: 0 !important;
}
.flex-sm-shrink-1 {
flex-shrink: 1 !important;
}
.flex-sm-wrap {
flex-wrap: wrap !important;
}
.flex-sm-nowrap {
flex-wrap: nowrap !important;
}
.flex-sm-wrap-reverse {
flex-wrap: wrap-reverse !important;
}
.justify-content-sm-start {
justify-content: flex-start !important;
}
.justify-content-sm-end {
justify-content: flex-end !important;
}
.justify-content-sm-center {
justify-content: center !important;
}
.justify-content-sm-between {
justify-content: space-between !important;
}
.justify-content-sm-around {
justify-content: space-around !important;
}
.justify-content-sm-evenly {
justify-content: space-evenly !important;
}
.align-items-sm-start {
align-items: flex-start !important;
}
.align-items-sm-end {
align-items: flex-end !important;
}
.align-items-sm-center {
align-items: center !important;
}
.align-items-sm-baseline {
align-items: baseline !important;
}
.align-items-sm-stretch {
align-items: stretch !important;
}
.align-content-sm-start {
align-content: flex-start !important;
}
.align-content-sm-end {
align-content: flex-end !important;
}
.align-content-sm-center {
align-content: center !important;
}
.align-content-sm-between {
align-content: space-between !important;
}
.align-content-sm-around {
align-content: space-around !important;
}
.align-content-sm-stretch {
align-content: stretch !important;
}
.align-self-sm-auto {
align-self: auto !important;
}
.align-self-sm-start {
align-self: flex-start !important;
}
.align-self-sm-end {
align-self: flex-end !important;
}
.align-self-sm-center {
align-self: center !important;
}
.align-self-sm-baseline {
align-self: baseline !important;
}
.align-self-sm-stretch {
align-self: stretch !important;
}
.order-sm-first {
order: -1 !important;
}
.order-sm-0 {
order: 0 !important;
}
.order-sm-1 {
order: 1 !important;
}
.order-sm-2 {
order: 2 !important;
}
.order-sm-3 {
order: 3 !important;
}
.order-sm-4 {
order: 4 !important;
}
.order-sm-5 {
order: 5 !important;
}
.order-sm-last {
order: 6 !important;
}
.m-sm-0 {
margin: 0 !important;
}
.m-sm-1 {
margin: 0.25rem !important;
}
.m-sm-2 {
margin: 0.5rem !important;
}
.m-sm-3 {
margin: 1rem !important;
}
.m-sm-4 {
margin: 1.5rem !important;
}
.m-sm-5 {
margin: 3rem !important;
}
.m-sm-auto {
margin: auto !important;
}
.mx-sm-0 {
margin-right: 0 !important;
margin-left: 0 !important;
}
.mx-sm-1 {
margin-right: 0.25rem !important;
margin-left: 0.25rem !important;
}
.mx-sm-2 {
margin-right: 0.5rem !important;
margin-left: 0.5rem !important;
}
.mx-sm-3 {
margin-right: 1rem !important;
margin-left: 1rem !important;
}
.mx-sm-4 {
margin-right: 1.5rem !important;
margin-left: 1.5rem !important;
}
.mx-sm-5 {
margin-right: 3rem !important;
margin-left: 3rem !important;
}
.mx-sm-auto {
margin-right: auto !important;
margin-left: auto !important;
}
.my-sm-0 {
margin-top: 0 !important;
margin-bottom: 0 !important;
}
.my-sm-1 {
margin-top: 0.25rem !important;
margin-bottom: 0.25rem !important;
}
.my-sm-2 {
margin-top: 0.5rem !important;
margin-bottom: 0.5rem !important;
}
.my-sm-3 {
margin-top: 1rem !important;
margin-bottom: 1rem !important;
}
.my-sm-4 {
margin-top: 1.5rem !important;
margin-bottom: 1.5rem !important;
}
.my-sm-5 {
margin-top: 3rem !important;
margin-bottom: 3rem !important;
}
.my-sm-auto {
margin-top: auto !important;
margin-bottom: auto !important;
}
.mt-sm-0 {
margin-top: 0 !important;
}
.mt-sm-1 {
margin-top: 0.25rem !important;
}
.mt-sm-2 {
margin-top: 0.5rem !important;
}
.mt-sm-3 {
margin-top: 1rem !important;
}
.mt-sm-4 {
margin-top: 1.5rem !important;
}
.mt-sm-5 {
margin-top: 3rem !important;
}
.mt-sm-auto {
margin-top: auto !important;
}
.me-sm-0 {
margin-right: 0 !important;
}
.me-sm-1 {
margin-right: 0.25rem !important;
}
.me-sm-2 {
margin-right: 0.5rem !important;
}
.me-sm-3 {
margin-right: 1rem !important;
}
.me-sm-4 {
margin-right: 1.5rem !important;
}
.me-sm-5 {
margin-right: 3rem !important;
}
.me-sm-auto {
margin-right: auto !important;
}
.mb-sm-0 {
margin-bottom: 0 !important;
}
.mb-sm-1 {
margin-bottom: 0.25rem !important;
}
.mb-sm-2 {
margin-bottom: 0.5rem !important;
}
.mb-sm-3 {
margin-bottom: 1rem !important;
}
.mb-sm-4 {
margin-bottom: 1.5rem !important;
}
.mb-sm-5 {
margin-bottom: 3rem !important;
}
.mb-sm-auto {
margin-bottom: auto !important;
}
.ms-sm-0 {
margin-left: 0 !important;
}
.ms-sm-1 {
margin-left: 0.25rem !important;
}
.ms-sm-2 {
margin-left: 0.5rem !important;
}
.ms-sm-3 {
margin-left: 1rem !important;
}
.ms-sm-4 {
margin-left: 1.5rem !important;
}
.ms-sm-5 {
margin-left: 3rem !important;
}
.ms-sm-auto {
margin-left: auto !important;
}
.p-sm-0 {
padding: 0 !important;
}
.p-sm-1 {
padding: 0.25rem !important;
}
.p-sm-2 {
padding: 0.5rem !important;
}
.p-sm-3 {
padding: 1rem !important;
}
.p-sm-4 {
padding: 1.5rem !important;
}
.p-sm-5 {
padding: 3rem !important;
}
.px-sm-0 {
padding-right: 0 !important;
padding-left: 0 !important;
}
.px-sm-1 {
padding-right: 0.25rem !important;
padding-left: 0.25rem !important;
}
.px-sm-2 {
padding-right: 0.5rem !important;
padding-left: 0.5rem !important;
}
.px-sm-3 {
padding-right: 1rem !important;
padding-left: 1rem !important;
}
.px-sm-4 {
padding-right: 1.5rem !important;
padding-left: 1.5rem !important;
}
.px-sm-5 {
padding-right: 3rem !important;
padding-left: 3rem !important;
}
.py-sm-0 {
padding-top: 0 !important;
padding-bottom: 0 !important;
}
.py-sm-1 {
padding-top: 0.25rem !important;
padding-bottom: 0.25rem !important;
}
.py-sm-2 {
padding-top: 0.5rem !important;
padding-bottom: 0.5rem !important;
}
.py-sm-3 {
padding-top: 1rem !important;
padding-bottom: 1rem !important;
}
.py-sm-4 {
padding-top: 1.5rem !important;
padding-bottom: 1.5rem !important;
}
.py-sm-5 {
padding-top: 3rem !important;
padding-bottom: 3rem !important;
}
.pt-sm-0 {
padding-top: 0 !important;
}
.pt-sm-1 {
padding-top: 0.25rem !important;
}
.pt-sm-2 {
padding-top: 0.5rem !important;
}
.pt-sm-3 {
padding-top: 1rem !important;
}
.pt-sm-4 {
padding-top: 1.5rem !important;
}
.pt-sm-5 {
padding-top: 3rem !important;
}
.pe-sm-0 {
padding-right: 0 !important;
}
.pe-sm-1 {
padding-right: 0.25rem !important;
}
.pe-sm-2 {
padding-right: 0.5rem !important;
}
.pe-sm-3 {
padding-right: 1rem !important;
}
.pe-sm-4 {
padding-right: 1.5rem !important;
}
.pe-sm-5 {
padding-right: 3rem !important;
}
.pb-sm-0 {
padding-bottom: 0 !important;
}
.pb-sm-1 {
padding-bottom: 0.25rem !important;
}
.pb-sm-2 {
padding-bottom: 0.5rem !important;
}
.pb-sm-3 {
padding-bottom: 1rem !important;
}
.pb-sm-4 {
padding-bottom: 1.5rem !important;
}
.pb-sm-5 {
padding-bottom: 3rem !important;
}
.ps-sm-0 {
padding-left: 0 !important;
}
.ps-sm-1 {
padding-left: 0.25rem !important;
}
.ps-sm-2 {
padding-left: 0.5rem !important;
}
.ps-sm-3 {
padding-left: 1rem !important;
}
.ps-sm-4 {
padding-left: 1.5rem !important;
}
.ps-sm-5 {
padding-left: 3rem !important;
}
.gap-sm-0 {
gap: 0 !important;
}
.gap-sm-1 {
gap: 0.25rem !important;
}
.gap-sm-2 {
gap: 0.5rem !important;
}
.gap-sm-3 {
gap: 1rem !important;
}
.gap-sm-4 {
gap: 1.5rem !important;
}
.gap-sm-5 {
gap: 3rem !important;
}
.row-gap-sm-0 {
row-gap: 0 !important;
}
.row-gap-sm-1 {
row-gap: 0.25rem !important;
}
.row-gap-sm-2 {
row-gap: 0.5rem !important;
}
.row-gap-sm-3 {
row-gap: 1rem !important;
}
.row-gap-sm-4 {
row-gap: 1.5rem !important;
}
.row-gap-sm-5 {
row-gap: 3rem !important;
}
.column-gap-sm-0 {
column-gap: 0 !important;
}
.column-gap-sm-1 {
column-gap: 0.25rem !important;
}
.column-gap-sm-2 {
column-gap: 0.5rem !important;
}
.column-gap-sm-3 {
column-gap: 1rem !important;
}
.column-gap-sm-4 {
column-gap: 1.5rem !important;
}
.column-gap-sm-5 {
column-gap: 3rem !important;
}
.text-sm-start {
text-align: left !important;
}
.text-sm-end {
text-align: right !important;
}
.text-sm-center {
text-align: center !important;
}
}
@media (min-width: 768px) {
.float-md-start {
float: left !important;
}
.float-md-end {
float: right !important;
}
.float-md-none {
float: none !important;
}
.object-fit-md-contain {
object-fit: contain !important;
}
.object-fit-md-cover {
object-fit: cover !important;
}
.object-fit-md-fill {
object-fit: fill !important;
}
.object-fit-md-scale {
object-fit: scale-down !important;
}
.object-fit-md-none {
object-fit: none !important;
}
.d-md-inline {
display: inline !important;
}
.d-md-inline-block {
display: inline-block !important;
}
.d-md-block {
display: block !important;
}
.d-md-grid {
display: grid !important;
}
.d-md-inline-grid {
display: inline-grid !important;
}
.d-md-table {
display: table !important;
}
.d-md-table-row {
display: table-row !important;
}
.d-md-table-cell {
display: table-cell !important;
}
.d-md-flex {
display: flex !important;
}
.d-md-inline-flex {
display: inline-flex !important;
}
.d-md-none {
display: none !important;
}
.flex-md-fill {
flex: 1 1 auto !important;
}
.flex-md-row {
flex-direction: row !important;
}
.flex-md-column {
flex-direction: column !important;
}
.flex-md-row-reverse {
flex-direction: row-reverse !important;
}
.flex-md-column-reverse {
flex-direction: column-reverse !important;
}
.flex-md-grow-0 {
flex-grow: 0 !important;
}
.flex-md-grow-1 {
flex-grow: 1 !important;
}
.flex-md-shrink-0 {
flex-shrink: 0 !important;
}
.flex-md-shrink-1 {
flex-shrink: 1 !important;
}
.flex-md-wrap {
flex-wrap: wrap !important;
}
.flex-md-nowrap {
flex-wrap: nowrap !important;
}
.flex-md-wrap-reverse {
flex-wrap: wrap-reverse !important;
}
.justify-content-md-start {
justify-content: flex-start !important;
}
.justify-content-md-end {
justify-content: flex-end !important;
}
.justify-content-md-center {
justify-content: center !important;
}
.justify-content-md-between {
justify-content: space-between !important;
}
.justify-content-md-around {
justify-content: space-around !important;
}
.justify-content-md-evenly {
justify-content: space-evenly !important;
}
.align-items-md-start {
align-items: flex-start !important;
}
.align-items-md-end {
align-items: flex-end !important;
}
.align-items-md-center {
align-items: center !important;
}
.align-items-md-baseline {
align-items: baseline !important;
}
.align-items-md-stretch {
align-items: stretch !important;
}
.align-content-md-start {
align-content: flex-start !important;
}
.align-content-md-end {
align-content: flex-end !important;
}
.align-content-md-center {
align-content: center !important;
}
.align-content-md-between {
align-content: space-between !important;
}
.align-content-md-around {
align-content: space-around !important;
}
.align-content-md-stretch {
align-content: stretch !important;
}
.align-self-md-auto {
align-self: auto !important;
}
.align-self-md-start {
align-self: flex-start !important;
}
.align-self-md-end {
align-self: flex-end !important;
}
.align-self-md-center {
align-self: center !important;
}
.align-self-md-baseline {
align-self: baseline !important;
}
.align-self-md-stretch {
align-self: stretch !important;
}
.order-md-first {
order: -1 !important;
}
.order-md-0 {
order: 0 !important;
}
.order-md-1 {
order: 1 !important;
}
.order-md-2 {
order: 2 !important;
}
.order-md-3 {
order: 3 !important;
}
.order-md-4 {
order: 4 !important;
}
.order-md-5 {
order: 5 !important;
}
.order-md-last {
order: 6 !important;
}
.m-md-0 {
margin: 0 !important;
}
.m-md-1 {
margin: 0.25rem !important;
}
.m-md-2 {
margin: 0.5rem !important;
}
.m-md-3 {
margin: 1rem !important;
}
.m-md-4 {
margin: 1.5rem !important;
}
.m-md-5 {
margin: 3rem !important;
}
.m-md-auto {
margin: auto !important;
}
.mx-md-0 {
margin-right: 0 !important;
margin-left: 0 !important;
}
.mx-md-1 {
margin-right: 0.25rem !important;
margin-left: 0.25rem !important;
}
.mx-md-2 {
margin-right: 0.5rem !important;
margin-left: 0.5rem !important;
}
.mx-md-3 {
margin-right: 1rem !important;
margin-left: 1rem !important;
}
.mx-md-4 {
margin-right: 1.5rem !important;
margin-left: 1.5rem !important;
}
.mx-md-5 {
margin-right: 3rem !important;
margin-left: 3rem !important;
}
.mx-md-auto {
margin-right: auto !important;
margin-left: auto !important;
}
.my-md-0 {
margin-top: 0 !important;
margin-bottom: 0 !important;
}
.my-md-1 {
margin-top: 0.25rem !important;
margin-bottom: 0.25rem !important;
}
.my-md-2 {
margin-top: 0.5rem !important;
margin-bottom: 0.5rem !important;
}
.my-md-3 {
margin-top: 1rem !important;
margin-bottom: 1rem !important;
}
.my-md-4 {
margin-top: 1.5rem !important;
margin-bottom: 1.5rem !important;
}
.my-md-5 {
margin-top: 3rem !important;
margin-bottom: 3rem !important;
}
.my-md-auto {
margin-top: auto !important;
margin-bottom: auto !important;
}
.mt-md-0 {
margin-top: 0 !important;
}
.mt-md-1 {
margin-top: 0.25rem !important;
}
.mt-md-2 {
margin-top: 0.5rem !important;
}
.mt-md-3 {
margin-top: 1rem !important;
}
.mt-md-4 {
margin-top: 1.5rem !important;
}
.mt-md-5 {
margin-top: 3rem !important;
}
.mt-md-auto {
margin-top: auto !important;
}
.me-md-0 {
margin-right: 0 !important;
}
.me-md-1 {
margin-right: 0.25rem !important;
}
.me-md-2 {
margin-right: 0.5rem !important;
}
.me-md-3 {
margin-right: 1rem !important;
}
.me-md-4 {
margin-right: 1.5rem !important;
}
.me-md-5 {
margin-right: 3rem !important;
}
.me-md-auto {
margin-right: auto !important;
}
.mb-md-0 {
margin-bottom: 0 !important;
}
.mb-md-1 {
margin-bottom: 0.25rem !important;
}
.mb-md-2 {
margin-bottom: 0.5rem !important;
}
.mb-md-3 {
margin-bottom: 1rem !important;
}
.mb-md-4 {
margin-bottom: 1.5rem !important;
}
.mb-md-5 {
margin-bottom: 3rem !important;
}
.mb-md-auto {
margin-bottom: auto !important;
}
.ms-md-0 {
margin-left: 0 !important;
}
.ms-md-1 {
margin-left: 0.25rem !important;
}
.ms-md-2 {
margin-left: 0.5rem !important;
}
.ms-md-3 {
margin-left: 1rem !important;
}
.ms-md-4 {
margin-left: 1.5rem !important;
}
.ms-md-5 {
margin-left: 3rem !important;
}
.ms-md-auto {
margin-left: auto !important;
}
.p-md-0 {
padding: 0 !important;
}
.p-md-1 {
padding: 0.25rem !important;
}
.p-md-2 {
padding: 0.5rem !important;
}
.p-md-3 {
padding: 1rem !important;
}
.p-md-4 {
padding: 1.5rem !important;
}
.p-md-5 {
padding: 3rem !important;
}
.px-md-0 {
padding-right: 0 !important;
padding-left: 0 !important;
}
.px-md-1 {
padding-right: 0.25rem !important;
padding-left: 0.25rem !important;
}
.px-md-2 {
padding-right: 0.5rem !important;
padding-left: 0.5rem !important;
}
.px-md-3 {
padding-right: 1rem !important;
padding-left: 1rem !important;
}
.px-md-4 {
padding-right: 1.5rem !important;
padding-left: 1.5rem !important;
}
.px-md-5 {
padding-right: 3rem !important;
padding-left: 3rem !important;
}
.py-md-0 {
padding-top: 0 !important;
padding-bottom: 0 !important;
}
.py-md-1 {
padding-top: 0.25rem !important;
padding-bottom: 0.25rem !important;
}
.py-md-2 {
padding-top: 0.5rem !important;
padding-bottom: 0.5rem !important;
}
.py-md-3 {
padding-top: 1rem !important;
padding-bottom: 1rem !important;
}
.py-md-4 {
padding-top: 1.5rem !important;
padding-bottom: 1.5rem !important;
}
.py-md-5 {
padding-top: 3rem !important;
padding-bottom: 3rem !important;
}
.pt-md-0 {
padding-top: 0 !important;
}
.pt-md-1 {
padding-top: 0.25rem !important;
}
.pt-md-2 {
padding-top: 0.5rem !important;
}
.pt-md-3 {
padding-top: 1rem !important;
}
.pt-md-4 {
padding-top: 1.5rem !important;
}
.pt-md-5 {
padding-top: 3rem !important;
}
.pe-md-0 {
padding-right: 0 !important;
}
.pe-md-1 {
padding-right: 0.25rem !important;
}
.pe-md-2 {
padding-right: 0.5rem !important;
}
.pe-md-3 {
padding-right: 1rem !important;
}
.pe-md-4 {
padding-right: 1.5rem !important;
}
.pe-md-5 {
padding-right: 3rem !important;
}
.pb-md-0 {
padding-bottom: 0 !important;
}
.pb-md-1 {
padding-bottom: 0.25rem !important;
}
.pb-md-2 {
padding-bottom: 0.5rem !important;
}
.pb-md-3 {
padding-bottom: 1rem !important;
}
.pb-md-4 {
padding-bottom: 1.5rem !important;
}
.pb-md-5 {
padding-bottom: 3rem !important;
}
.ps-md-0 {
padding-left: 0 !important;
}
.ps-md-1 {
padding-left: 0.25rem !important;
}
.ps-md-2 {
padding-left: 0.5rem !important;
}
.ps-md-3 {
padding-left: 1rem !important;
}
.ps-md-4 {
padding-left: 1.5rem !important;
}
.ps-md-5 {
padding-left: 3rem !important;
}
.gap-md-0 {
gap: 0 !important;
}
.gap-md-1 {
gap: 0.25rem !important;
}
.gap-md-2 {
gap: 0.5rem !important;
}
.gap-md-3 {
gap: 1rem !important;
}
.gap-md-4 {
gap: 1.5rem !important;
}
.gap-md-5 {
gap: 3rem !important;
}
.row-gap-md-0 {
row-gap: 0 !important;
}
.row-gap-md-1 {
row-gap: 0.25rem !important;
}
.row-gap-md-2 {
row-gap: 0.5rem !important;
}
.row-gap-md-3 {
row-gap: 1rem !important;
}
.row-gap-md-4 {
row-gap: 1.5rem !important;
}
.row-gap-md-5 {
row-gap: 3rem !important;
}
.column-gap-md-0 {
column-gap: 0 !important;
}
.column-gap-md-1 {
column-gap: 0.25rem !important;
}
.column-gap-md-2 {
column-gap: 0.5rem !important;
}
.column-gap-md-3 {
column-gap: 1rem !important;
}
.column-gap-md-4 {
column-gap: 1.5rem !important;
}
.column-gap-md-5 {
column-gap: 3rem !important;
}
.text-md-start {
text-align: left !important;
}
.text-md-end {
text-align: right !important;
}
.text-md-center {
text-align: center !important;
}
}
@media (min-width: 992px) {
.float-lg-start {
float: left !important;
}
.float-lg-end {
float: right !important;
}
.float-lg-none {
float: none !important;
}
.object-fit-lg-contain {
object-fit: contain !important;
}
.object-fit-lg-cover {
object-fit: cover !important;
}
.object-fit-lg-fill {
object-fit: fill !important;
}
.object-fit-lg-scale {
object-fit: scale-down !important;
}
.object-fit-lg-none {
object-fit: none !important;
}
.d-lg-inline {
display: inline !important;
}
.d-lg-inline-block {
display: inline-block !important;
}
.d-lg-block {
display: block !important;
}
.d-lg-grid {
display: grid !important;
}
.d-lg-inline-grid {
display: inline-grid !important;
}
.d-lg-table {
display: table !important;
}
.d-lg-table-row {
display: table-row !important;
}
.d-lg-table-cell {
display: table-cell !important;
}
.d-lg-flex {
display: flex !important;
}
.d-lg-inline-flex {
display: inline-flex !important;
}
.d-lg-none {
display: none !important;
}
.flex-lg-fill {
flex: 1 1 auto !important;
}
.flex-lg-row {
flex-direction: row !important;
}
.flex-lg-column {
flex-direction: column !important;
}
.flex-lg-row-reverse {
flex-direction: row-reverse !important;
}
.flex-lg-column-reverse {
flex-direction: column-reverse !important;
}
.flex-lg-grow-0 {
flex-grow: 0 !important;
}
.flex-lg-grow-1 {
flex-grow: 1 !important;
}
.flex-lg-shrink-0 {
flex-shrink: 0 !important;
}
.flex-lg-shrink-1 {
flex-shrink: 1 !important;
}
.flex-lg-wrap {
flex-wrap: wrap !important;
}
.flex-lg-nowrap {
flex-wrap: nowrap !important;
}
.flex-lg-wrap-reverse {
flex-wrap: wrap-reverse !important;
}
.justify-content-lg-start {
justify-content: flex-start !important;
}
.justify-content-lg-end {
justify-content: flex-end !important;
}
.justify-content-lg-center {
justify-content: center !important;
}
.justify-content-lg-between {
justify-content: space-between !important;
}
.justify-content-lg-around {
justify-content: space-around !important;
}
.justify-content-lg-evenly {
justify-content: space-evenly !important;
}
.align-items-lg-start {
align-items: flex-start !important;
}
.align-items-lg-end {
align-items: flex-end !important;
}
.align-items-lg-center {
align-items: center !important;
}
.align-items-lg-baseline {
align-items: baseline !important;
}
.align-items-lg-stretch {
align-items: stretch !important;
}
.align-content-lg-start {
align-content: flex-start !important;
}
.align-content-lg-end {
align-content: flex-end !important;
}
.align-content-lg-center {
align-content: center !important;
}
.align-content-lg-between {
align-content: space-between !important;
}
.align-content-lg-around {
align-content: space-around !important;
}
.align-content-lg-stretch {
align-content: stretch !important;
}
.align-self-lg-auto {
align-self: auto !important;
}
.align-self-lg-start {
align-self: flex-start !important;
}
.align-self-lg-end {
align-self: flex-end !important;
}
.align-self-lg-center {
align-self: center !important;
}
.align-self-lg-baseline {
align-self: baseline !important;
}
.align-self-lg-stretch {
align-self: stretch !important;
}
.order-lg-first {
order: -1 !important;
}
.order-lg-0 {
order: 0 !important;
}
.order-lg-1 {
order: 1 !important;
}
.order-lg-2 {
order: 2 !important;
}
.order-lg-3 {
order: 3 !important;
}
.order-lg-4 {
order: 4 !important;
}
.order-lg-5 {
order: 5 !important;
}
.order-lg-last {
order: 6 !important;
}
.m-lg-0 {
margin: 0 !important;
}
.m-lg-1 {
margin: 0.25rem !important;
}
.m-lg-2 {
margin: 0.5rem !important;
}
.m-lg-3 {
margin: 1rem !important;
}
.m-lg-4 {
margin: 1.5rem !important;
}
.m-lg-5 {
margin: 3rem !important;
}
.m-lg-auto {
margin: auto !important;
}
.mx-lg-0 {
margin-right: 0 !important;
margin-left: 0 !important;
}
.mx-lg-1 {
margin-right: 0.25rem !important;
margin-left: 0.25rem !important;
}
.mx-lg-2 {
margin-right: 0.5rem !important;
margin-left: 0.5rem !important;
}
.mx-lg-3 {
margin-right: 1rem !important;
margin-left: 1rem !important;
}
.mx-lg-4 {
margin-right: 1.5rem !important;
margin-left: 1.5rem !important;
}
.mx-lg-5 {
margin-right: 3rem !important;
margin-left: 3rem !important;
}
.mx-lg-auto {
margin-right: auto !important;
margin-left: auto !important;
}
.my-lg-0 {
margin-top: 0 !important;
margin-bottom: 0 !important;
}
.my-lg-1 {
margin-top: 0.25rem !important;
margin-bottom: 0.25rem !important;
}
.my-lg-2 {
margin-top: 0.5rem !important;
margin-bottom: 0.5rem !important;
}
.my-lg-3 {
margin-top: 1rem !important;
margin-bottom: 1rem !important;
}
.my-lg-4 {
margin-top: 1.5rem !important;
margin-bottom: 1.5rem !important;
}
.my-lg-5 {
margin-top: 3rem !important;
margin-bottom: 3rem !important;
}
.my-lg-auto {
margin-top: auto !important;
margin-bottom: auto !important;
}
.mt-lg-0 {
margin-top: 0 !important;
}
.mt-lg-1 {
margin-top: 0.25rem !important;
}
.mt-lg-2 {
margin-top: 0.5rem !important;
}
.mt-lg-3 {
margin-top: 1rem !important;
}
.mt-lg-4 {
margin-top: 1.5rem !important;
}
.mt-lg-5 {
margin-top: 3rem !important;
}
.mt-lg-auto {
margin-top: auto !important;
}
.me-lg-0 {
margin-right: 0 !important;
}
.me-lg-1 {
margin-right: 0.25rem !important;
}
.me-lg-2 {
margin-right: 0.5rem !important;
}
.me-lg-3 {
margin-right: 1rem !important;
}
.me-lg-4 {
margin-right: 1.5rem !important;
}
.me-lg-5 {
margin-right: 3rem !important;
}
.me-lg-auto {
margin-right: auto !important;
}
.mb-lg-0 {
margin-bottom: 0 !important;
}
.mb-lg-1 {
margin-bottom: 0.25rem !important;
}
.mb-lg-2 {
margin-bottom: 0.5rem !important;
}
.mb-lg-3 {
margin-bottom: 1rem !important;
}
.mb-lg-4 {
margin-bottom: 1.5rem !important;
}
.mb-lg-5 {
margin-bottom: 3rem !important;
}
.mb-lg-auto {
margin-bottom: auto !important;
}
.ms-lg-0 {
margin-left: 0 !important;
}
.ms-lg-1 {
margin-left: 0.25rem !important;
}
.ms-lg-2 {
margin-left: 0.5rem !important;
}
.ms-lg-3 {
margin-left: 1rem !important;
}
.ms-lg-4 {
margin-left: 1.5rem !important;
}
.ms-lg-5 {
margin-left: 3rem !important;
}
.ms-lg-auto {
margin-left: auto !important;
}
.p-lg-0 {
padding: 0 !important;
}
.p-lg-1 {
padding: 0.25rem !important;
}
.p-lg-2 {
padding: 0.5rem !important;
}
.p-lg-3 {
padding: 1rem !important;
}
.p-lg-4 {
padding: 1.5rem !important;
}
.p-lg-5 {
padding: 3rem !important;
}
.px-lg-0 {
padding-right: 0 !important;
padding-left: 0 !important;
}
.px-lg-1 {
padding-right: 0.25rem !important;
padding-left: 0.25rem !important;
}
.px-lg-2 {
padding-right: 0.5rem !important;
padding-left: 0.5rem !important;
}
.px-lg-3 {
padding-right: 1rem !important;
padding-left: 1rem !important;
}
.px-lg-4 {
padding-right: 1.5rem !important;
padding-left: 1.5rem !important;
}
.px-lg-5 {
padding-right: 3rem !important;
padding-left: 3rem !important;
}
.py-lg-0 {
padding-top: 0 !important;
padding-bottom: 0 !important;
}
.py-lg-1 {
padding-top: 0.25rem !important;
padding-bottom: 0.25rem !important;
}
.py-lg-2 {
padding-top: 0.5rem !important;
padding-bottom: 0.5rem !important;
}
.py-lg-3 {
padding-top: 1rem !important;
padding-bottom: 1rem !important;
}
.py-lg-4 {
padding-top: 1.5rem !important;
padding-bottom: 1.5rem !important;
}
.py-lg-5 {
padding-top: 3rem !important;
padding-bottom: 3rem !important;
}
.pt-lg-0 {
padding-top: 0 !important;
}
.pt-lg-1 {
padding-top: 0.25rem !important;
}
.pt-lg-2 {
padding-top: 0.5rem !important;
}
.pt-lg-3 {
padding-top: 1rem !important;
}
.pt-lg-4 {
padding-top: 1.5rem !important;
}
.pt-lg-5 {
padding-top: 3rem !important;
}
.pe-lg-0 {
padding-right: 0 !important;
}
.pe-lg-1 {
padding-right: 0.25rem !important;
}
.pe-lg-2 {
padding-right: 0.5rem !important;
}
.pe-lg-3 {
padding-right: 1rem !important;
}
.pe-lg-4 {
padding-right: 1.5rem !important;
}
.pe-lg-5 {
padding-right: 3rem !important;
}
.pb-lg-0 {
padding-bottom: 0 !important;
}
.pb-lg-1 {
padding-bottom: 0.25rem !important;
}
.pb-lg-2 {
padding-bottom: 0.5rem !important;
}
.pb-lg-3 {
padding-bottom: 1rem !important;
}
.pb-lg-4 {
padding-bottom: 1.5rem !important;
}
.pb-lg-5 {
padding-bottom: 3rem !important;
}
.ps-lg-0 {
padding-left: 0 !important;
}
.ps-lg-1 {
padding-left: 0.25rem !important;
}
.ps-lg-2 {
padding-left: 0.5rem !important;
}
.ps-lg-3 {
padding-left: 1rem !important;
}
.ps-lg-4 {
padding-left: 1.5rem !important;
}
.ps-lg-5 {
padding-left: 3rem !important;
}
.gap-lg-0 {
gap: 0 !important;
}
.gap-lg-1 {
gap: 0.25rem !important;
}
.gap-lg-2 {
gap: 0.5rem !important;
}
.gap-lg-3 {
gap: 1rem !important;
}
.gap-lg-4 {
gap: 1.5rem !important;
}
.gap-lg-5 {
gap: 3rem !important;
}
.row-gap-lg-0 {
row-gap: 0 !important;
}
.row-gap-lg-1 {
row-gap: 0.25rem !important;
}
.row-gap-lg-2 {
row-gap: 0.5rem !important;
}
.row-gap-lg-3 {
row-gap: 1rem !important;
}
.row-gap-lg-4 {
row-gap: 1.5rem !important;
}
.row-gap-lg-5 {
row-gap: 3rem !important;
}
.column-gap-lg-0 {
column-gap: 0 !important;
}
.column-gap-lg-1 {
column-gap: 0.25rem !important;
}
.column-gap-lg-2 {
column-gap: 0.5rem !important;
}
.column-gap-lg-3 {
column-gap: 1rem !important;
}
.column-gap-lg-4 {
column-gap: 1.5rem !important;
}
.column-gap-lg-5 {
column-gap: 3rem !important;
}
.text-lg-start {
text-align: left !important;
}
.text-lg-end {
text-align: right !important;
}
.text-lg-center {
text-align: center !important;
}
}
@media (min-width: 1200px) {
.float-xl-start {
float: left !important;
}
.float-xl-end {
float: right !important;
}
.float-xl-none {
float: none !important;
}
.object-fit-xl-contain {
object-fit: contain !important;
}
.object-fit-xl-cover {
object-fit: cover !important;
}
.object-fit-xl-fill {
object-fit: fill !important;
}
.object-fit-xl-scale {
object-fit: scale-down !important;
}
.object-fit-xl-none {
object-fit: none !important;
}
.d-xl-inline {
display: inline !important;
}
.d-xl-inline-block {
display: inline-block !important;
}
.d-xl-block {
display: block !important;
}
.d-xl-grid {
display: grid !important;
}
.d-xl-inline-grid {
display: inline-grid !important;
}
.d-xl-table {
display: table !important;
}
.d-xl-table-row {
display: table-row !important;
}
.d-xl-table-cell {
display: table-cell !important;
}
.d-xl-flex {
display: flex !important;
}
.d-xl-inline-flex {
display: inline-flex !important;
}
.d-xl-none {
display: none !important;
}
.flex-xl-fill {
flex: 1 1 auto !important;
}
.flex-xl-row {
flex-direction: row !important;
}
.flex-xl-column {
flex-direction: column !important;
}
.flex-xl-row-reverse {
flex-direction: row-reverse !important;
}
.flex-xl-column-reverse {
flex-direction: column-reverse !important;
}
.flex-xl-grow-0 {
flex-grow: 0 !important;
}
.flex-xl-grow-1 {
flex-grow: 1 !important;
}
.flex-xl-shrink-0 {
flex-shrink: 0 !important;
}
.flex-xl-shrink-1 {
flex-shrink: 1 !important;
}
.flex-xl-wrap {
flex-wrap: wrap !important;
}
.flex-xl-nowrap {
flex-wrap: nowrap !important;
}
.flex-xl-wrap-reverse {
flex-wrap: wrap-reverse !important;
}
.justify-content-xl-start {
justify-content: flex-start !important;
}
.justify-content-xl-end {
justify-content: flex-end !important;
}
.justify-content-xl-center {
justify-content: center !important;
}
.justify-content-xl-between {
justify-content: space-between !important;
}
.justify-content-xl-around {
justify-content: space-around !important;
}
.justify-content-xl-evenly {
justify-content: space-evenly !important;
}
.align-items-xl-start {
align-items: flex-start !important;
}
.align-items-xl-end {
align-items: flex-end !important;
}
.align-items-xl-center {
align-items: center !important;
}
.align-items-xl-baseline {
align-items: baseline !important;
}
.align-items-xl-stretch {
align-items: stretch !important;
}
.align-content-xl-start {
align-content: flex-start !important;
}
.align-content-xl-end {
align-content: flex-end !important;
}
.align-content-xl-center {
align-content: center !important;
}
.align-content-xl-between {
align-content: space-between !important;
}
.align-content-xl-around {
align-content: space-around !important;
}
.align-content-xl-stretch {
align-content: stretch !important;
}
.align-self-xl-auto {
align-self: auto !important;
}
.align-self-xl-start {
align-self: flex-start !important;
}
.align-self-xl-end {
align-self: flex-end !important;
}
.align-self-xl-center {
align-self: center !important;
}
.align-self-xl-baseline {
align-self: baseline !important;
}
.align-self-xl-stretch {
align-self: stretch !important;
}
.order-xl-first {
order: -1 !important;
}
.order-xl-0 {
order: 0 !important;
}
.order-xl-1 {
order: 1 !important;
}
.order-xl-2 {
order: 2 !important;
}
.order-xl-3 {
order: 3 !important;
}
.order-xl-4 {
order: 4 !important;
}
.order-xl-5 {
order: 5 !important;
}
.order-xl-last {
order: 6 !important;
}
.m-xl-0 {
margin: 0 !important;
}
.m-xl-1 {
margin: 0.25rem !important;
}
.m-xl-2 {
margin: 0.5rem !important;
}
.m-xl-3 {
margin: 1rem !important;
}
.m-xl-4 {
margin: 1.5rem !important;
}
.m-xl-5 {
margin: 3rem !important;
}
.m-xl-auto {
margin: auto !important;
}
.mx-xl-0 {
margin-right: 0 !important;
margin-left: 0 !important;
}
.mx-xl-1 {
margin-right: 0.25rem !important;
margin-left: 0.25rem !important;
}
.mx-xl-2 {
margin-right: 0.5rem !important;
margin-left: 0.5rem !important;
}
.mx-xl-3 {
margin-right: 1rem !important;
margin-left: 1rem !important;
}
.mx-xl-4 {
margin-right: 1.5rem !important;
margin-left: 1.5rem !important;
}
.mx-xl-5 {
margin-right: 3rem !important;
margin-left: 3rem !important;
}
.mx-xl-auto {
margin-right: auto !important;
margin-left: auto !important;
}
.my-xl-0 {
margin-top: 0 !important;
margin-bottom: 0 !important;
}
.my-xl-1 {
margin-top: 0.25rem !important;
margin-bottom: 0.25rem !important;
}
.my-xl-2 {
margin-top: 0.5rem !important;
margin-bottom: 0.5rem !important;
}
.my-xl-3 {
margin-top: 1rem !important;
margin-bottom: 1rem !important;
}
.my-xl-4 {
margin-top: 1.5rem !important;
margin-bottom: 1.5rem !important;
}
.my-xl-5 {
margin-top: 3rem !important;
margin-bottom: 3rem !important;
}
.my-xl-auto {
margin-top: auto !important;
margin-bottom: auto !important;
}
.mt-xl-0 {
margin-top: 0 !important;
}
.mt-xl-1 {
margin-top: 0.25rem !important;
}
.mt-xl-2 {
margin-top: 0.5rem !important;
}
.mt-xl-3 {
margin-top: 1rem !important;
}
.mt-xl-4 {
margin-top: 1.5rem !important;
}
.mt-xl-5 {
margin-top: 3rem !important;
}
.mt-xl-auto {
margin-top: auto !important;
}
.me-xl-0 {
margin-right: 0 !important;
}
.me-xl-1 {
margin-right: 0.25rem !important;
}
.me-xl-2 {
margin-right: 0.5rem !important;
}
.me-xl-3 {
margin-right: 1rem !important;
}
.me-xl-4 {
margin-right: 1.5rem !important;
}
.me-xl-5 {
margin-right: 3rem !important;
}
.me-xl-auto {
margin-right: auto !important;
}
.mb-xl-0 {
margin-bottom: 0 !important;
}
.mb-xl-1 {
margin-bottom: 0.25rem !important;
}
.mb-xl-2 {
margin-bottom: 0.5rem !important;
}
.mb-xl-3 {
margin-bottom: 1rem !important;
}
.mb-xl-4 {
margin-bottom: 1.5rem !important;
}
.mb-xl-5 {
margin-bottom: 3rem !important;
}
.mb-xl-auto {
margin-bottom: auto !important;
}
.ms-xl-0 {
margin-left: 0 !important;
}
.ms-xl-1 {
margin-left: 0.25rem !important;
}
.ms-xl-2 {
margin-left: 0.5rem !important;
}
.ms-xl-3 {
margin-left: 1rem !important;
}
.ms-xl-4 {
margin-left: 1.5rem !important;
}
.ms-xl-5 {
margin-left: 3rem !important;
}
.ms-xl-auto {
margin-left: auto !important;
}
.p-xl-0 {
padding: 0 !important;
}
.p-xl-1 {
padding: 0.25rem !important;
}
.p-xl-2 {
padding: 0.5rem !important;
}
.p-xl-3 {
padding: 1rem !important;
}
.p-xl-4 {
padding: 1.5rem !important;
}
.p-xl-5 {
padding: 3rem !important;
}
.px-xl-0 {
padding-right: 0 !important;
padding-left: 0 !important;
}
.px-xl-1 {
padding-right: 0.25rem !important;
padding-left: 0.25rem !important;
}
.px-xl-2 {
padding-right: 0.5rem !important;
padding-left: 0.5rem !important;
}
.px-xl-3 {
padding-right: 1rem !important;
padding-left: 1rem !important;
}
.px-xl-4 {
padding-right: 1.5rem !important;
padding-left: 1.5rem !important;
}
.px-xl-5 {
padding-right: 3rem !important;
padding-left: 3rem !important;
}
.py-xl-0 {
padding-top: 0 !important;
padding-bottom: 0 !important;
}
.py-xl-1 {
padding-top: 0.25rem !important;
padding-bottom: 0.25rem !important;
}
.py-xl-2 {
padding-top: 0.5rem !important;
padding-bottom: 0.5rem !important;
}
.py-xl-3 {
padding-top: 1rem !important;
padding-bottom: 1rem !important;
}
.py-xl-4 {
padding-top: 1.5rem !important;
padding-bottom: 1.5rem !important;
}
.py-xl-5 {
padding-top: 3rem !important;
padding-bottom: 3rem !important;
}
.pt-xl-0 {
padding-top: 0 !important;
}
.pt-xl-1 {
padding-top: 0.25rem !important;
}
.pt-xl-2 {
padding-top: 0.5rem !important;
}
.pt-xl-3 {
padding-top: 1rem !important;
}
.pt-xl-4 {
padding-top: 1.5rem !important;
}
.pt-xl-5 {
padding-top: 3rem !important;
}
.pe-xl-0 {
padding-right: 0 !important;
}
.pe-xl-1 {
padding-right: 0.25rem !important;
}
.pe-xl-2 {
padding-right: 0.5rem !important;
}
.pe-xl-3 {
padding-right: 1rem !important;
}
.pe-xl-4 {
padding-right: 1.5rem !important;
}
.pe-xl-5 {
padding-right: 3rem !important;
}
.pb-xl-0 {
padding-bottom: 0 !important;
}
.pb-xl-1 {
padding-bottom: 0.25rem !important;
}
.pb-xl-2 {
padding-bottom: 0.5rem !important;
}
.pb-xl-3 {
padding-bottom: 1rem !important;
}
.pb-xl-4 {
padding-bottom: 1.5rem !important;
}
.pb-xl-5 {
padding-bottom: 3rem !important;
}
.ps-xl-0 {
padding-left: 0 !important;
}
.ps-xl-1 {
padding-left: 0.25rem !important;
}
.ps-xl-2 {
padding-left: 0.5rem !important;
}
.ps-xl-3 {
padding-left: 1rem !important;
}
.ps-xl-4 {
padding-left: 1.5rem !important;
}
.ps-xl-5 {
padding-left: 3rem !important;
}
.gap-xl-0 {
gap: 0 !important;
}
.gap-xl-1 {
gap: 0.25rem !important;
}
.gap-xl-2 {
gap: 0.5rem !important;
}
.gap-xl-3 {
gap: 1rem !important;
}
.gap-xl-4 {
gap: 1.5rem !important;
}
.gap-xl-5 {
gap: 3rem !important;
}
.row-gap-xl-0 {
row-gap: 0 !important;
}
.row-gap-xl-1 {
row-gap: 0.25rem !important;
}
.row-gap-xl-2 {
row-gap: 0.5rem !important;
}
.row-gap-xl-3 {
row-gap: 1rem !important;
}
.row-gap-xl-4 {
row-gap: 1.5rem !important;
}
.row-gap-xl-5 {
row-gap: 3rem !important;
}
.column-gap-xl-0 {
column-gap: 0 !important;
}
.column-gap-xl-1 {
column-gap: 0.25rem !important;
}
.column-gap-xl-2 {
column-gap: 0.5rem !important;
}
.column-gap-xl-3 {
column-gap: 1rem !important;
}
.column-gap-xl-4 {
column-gap: 1.5rem !important;
}
.column-gap-xl-5 {
column-gap: 3rem !important;
}
.text-xl-start {
text-align: left !important;
}
.text-xl-end {
text-align: right !important;
}
.text-xl-center {
text-align: center !important;
}
}
@media (min-width: 1400px) {
.float-xxl-start {
float: left !important;
}
.float-xxl-end {
float: right !important;
}
.float-xxl-none {
float: none !important;
}
.object-fit-xxl-contain {
object-fit: contain !important;
}
.object-fit-xxl-cover {
object-fit: cover !important;
}
.object-fit-xxl-fill {
object-fit: fill !important;
}
.object-fit-xxl-scale {
object-fit: scale-down !important;
}
.object-fit-xxl-none {
object-fit: none !important;
}
.d-xxl-inline {
display: inline !important;
}
.d-xxl-inline-block {
display: inline-block !important;
}
.d-xxl-block {
display: block !important;
}
.d-xxl-grid {
display: grid !important;
}
.d-xxl-inline-grid {
display: inline-grid !important;
}
.d-xxl-table {
display: table !important;
}
.d-xxl-table-row {
display: table-row !important;
}
.d-xxl-table-cell {
display: table-cell !important;
}
.d-xxl-flex {
display: flex !important;
}
.d-xxl-inline-flex {
display: inline-flex !important;
}
.d-xxl-none {
display: none !important;
}
.flex-xxl-fill {
flex: 1 1 auto !important;
}
.flex-xxl-row {
flex-direction: row !important;
}
.flex-xxl-column {
flex-direction: column !important;
}
.flex-xxl-row-reverse {
flex-direction: row-reverse !important;
}
.flex-xxl-column-reverse {
flex-direction: column-reverse !important;
}
.flex-xxl-grow-0 {
flex-grow: 0 !important;
}
.flex-xxl-grow-1 {
flex-grow: 1 !important;
}
.flex-xxl-shrink-0 {
flex-shrink: 0 !important;
}
.flex-xxl-shrink-1 {
flex-shrink: 1 !important;
}
.flex-xxl-wrap {
flex-wrap: wrap !important;
}
.flex-xxl-nowrap {
flex-wrap: nowrap !important;
}
.flex-xxl-wrap-reverse {
flex-wrap: wrap-reverse !important;
}
.justify-content-xxl-start {
justify-content: flex-start !important;
}
.justify-content-xxl-end {
justify-content: flex-end !important;
}
.justify-content-xxl-center {
justify-content: center !important;
}
.justify-content-xxl-between {
justify-content: space-between !important;
}
.justify-content-xxl-around {
justify-content: space-around !important;
}
.justify-content-xxl-evenly {
justify-content: space-evenly !important;
}
.align-items-xxl-start {
align-items: flex-start !important;
}
.align-items-xxl-end {
align-items: flex-end !important;
}
.align-items-xxl-center {
align-items: center !important;
}
.align-items-xxl-baseline {
align-items: baseline !important;
}
.align-items-xxl-stretch {
align-items: stretch !important;
}
.align-content-xxl-start {
align-content: flex-start !important;
}
.align-content-xxl-end {
align-content: flex-end !important;
}
.align-content-xxl-center {
align-content: center !important;
}
.align-content-xxl-between {
align-content: space-between !important;
}
.align-content-xxl-around {
align-content: space-around !important;
}
.align-content-xxl-stretch {
align-content: stretch !important;
}
.align-self-xxl-auto {
align-self: auto !important;
}
.align-self-xxl-start {
align-self: flex-start !important;
}
.align-self-xxl-end {
align-self: flex-end !important;
}
.align-self-xxl-center {
align-self: center !important;
}
.align-self-xxl-baseline {
align-self: baseline !important;
}
.align-self-xxl-stretch {
align-self: stretch !important;
}
.order-xxl-first {
order: -1 !important;
}
.order-xxl-0 {
order: 0 !important;
}
.order-xxl-1 {
order: 1 !important;
}
.order-xxl-2 {
order: 2 !important;
}
.order-xxl-3 {
order: 3 !important;
}
.order-xxl-4 {
order: 4 !important;
}
.order-xxl-5 {
order: 5 !important;
}
.order-xxl-last {
order: 6 !important;
}
.m-xxl-0 {
margin: 0 !important;
}
.m-xxl-1 {
margin: 0.25rem !important;
}
.m-xxl-2 {
margin: 0.5rem !important;
}
.m-xxl-3 {
margin: 1rem !important;
}
.m-xxl-4 {
margin: 1.5rem !important;
}
.m-xxl-5 {
margin: 3rem !important;
}
.m-xxl-auto {
margin: auto !important;
}
.mx-xxl-0 {
margin-right: 0 !important;
margin-left: 0 !important;
}
.mx-xxl-1 {
margin-right: 0.25rem !important;
margin-left: 0.25rem !important;
}
.mx-xxl-2 {
margin-right: 0.5rem !important;
margin-left: 0.5rem !important;
}
.mx-xxl-3 {
margin-right: 1rem !important;
margin-left: 1rem !important;
}
.mx-xxl-4 {
margin-right: 1.5rem !important;
margin-left: 1.5rem !important;
}
.mx-xxl-5 {
margin-right: 3rem !important;
margin-left: 3rem !important;
}
.mx-xxl-auto {
margin-right: auto !important;
margin-left: auto !important;
}
.my-xxl-0 {
margin-top: 0 !important;
margin-bottom: 0 !important;
}
.my-xxl-1 {
margin-top: 0.25rem !important;
margin-bottom: 0.25rem !important;
}
.my-xxl-2 {
margin-top: 0.5rem !important;
margin-bottom: 0.5rem !important;
}
.my-xxl-3 {
margin-top: 1rem !important;
margin-bottom: 1rem !important;
}
.my-xxl-4 {
margin-top: 1.5rem !important;
margin-bottom: 1.5rem !important;
}
.my-xxl-5 {
margin-top: 3rem !important;
margin-bottom: 3rem !important;
}
.my-xxl-auto {
margin-top: auto !important;
margin-bottom: auto !important;
}
.mt-xxl-0 {
margin-top: 0 !important;
}
.mt-xxl-1 {
margin-top: 0.25rem !important;
}
.mt-xxl-2 {
margin-top: 0.5rem !important;
}
.mt-xxl-3 {
margin-top: 1rem !important;
}
.mt-xxl-4 {
margin-top: 1.5rem !important;
}
.mt-xxl-5 {
margin-top: 3rem !important;
}
.mt-xxl-auto {
margin-top: auto !important;
}
.me-xxl-0 {
margin-right: 0 !important;
}
.me-xxl-1 {
margin-right: 0.25rem !important;
}
.me-xxl-2 {
margin-right: 0.5rem !important;
}
.me-xxl-3 {
margin-right: 1rem !important;
}
.me-xxl-4 {
margin-right: 1.5rem !important;
}
.me-xxl-5 {
margin-right: 3rem !important;
}
.me-xxl-auto {
margin-right: auto !important;
}
.mb-xxl-0 {
margin-bottom: 0 !important;
}
.mb-xxl-1 {
margin-bottom: 0.25rem !important;
}
.mb-xxl-2 {
margin-bottom: 0.5rem !important;
}
.mb-xxl-3 {
margin-bottom: 1rem !important;
}
.mb-xxl-4 {
margin-bottom: 1.5rem !important;
}
.mb-xxl-5 {
margin-bottom: 3rem !important;
}
.mb-xxl-auto {
margin-bottom: auto !important;
}
.ms-xxl-0 {
margin-left: 0 !important;
}
.ms-xxl-1 {
margin-left: 0.25rem !important;
}
.ms-xxl-2 {
margin-left: 0.5rem !important;
}
.ms-xxl-3 {
margin-left: 1rem !important;
}
.ms-xxl-4 {
margin-left: 1.5rem !important;
}
.ms-xxl-5 {
margin-left: 3rem !important;
}
.ms-xxl-auto {
margin-left: auto !important;
}
.p-xxl-0 {
padding: 0 !important;
}
.p-xxl-1 {
padding: 0.25rem !important;
}
.p-xxl-2 {
padding: 0.5rem !important;
}
.p-xxl-3 {
padding: 1rem !important;
}
.p-xxl-4 {
padding: 1.5rem !important;
}
.p-xxl-5 {
padding: 3rem !important;
}
.px-xxl-0 {
padding-right: 0 !important;
padding-left: 0 !important;
}
.px-xxl-1 {
padding-right: 0.25rem !important;
padding-left: 0.25rem !important;
}
.px-xxl-2 {
padding-right: 0.5rem !important;
padding-left: 0.5rem !important;
}
.px-xxl-3 {
padding-right: 1rem !important;
padding-left: 1rem !important;
}
.px-xxl-4 {
padding-right: 1.5rem !important;
padding-left: 1.5rem !important;
}
.px-xxl-5 {
padding-right: 3rem !important;
padding-left: 3rem !important;
}
.py-xxl-0 {
padding-top: 0 !important;
padding-bottom: 0 !important;
}
.py-xxl-1 {
padding-top: 0.25rem !important;
padding-bottom: 0.25rem !important;
}
.py-xxl-2 {
padding-top: 0.5rem !important;
padding-bottom: 0.5rem !important;
}
.py-xxl-3 {
padding-top: 1rem !important;
padding-bottom: 1rem !important;
}
.py-xxl-4 {
padding-top: 1.5rem !important;
padding-bottom: 1.5rem !important;
}
.py-xxl-5 {
padding-top: 3rem !important;
padding-bottom: 3rem !important;
}
.pt-xxl-0 {
padding-top: 0 !important;
}
.pt-xxl-1 {
padding-top: 0.25rem !important;
}
.pt-xxl-2 {
padding-top: 0.5rem !important;
}
.pt-xxl-3 {
padding-top: 1rem !important;
}
.pt-xxl-4 {
padding-top: 1.5rem !important;
}
.pt-xxl-5 {
padding-top: 3rem !important;
}
.pe-xxl-0 {
padding-right: 0 !important;
}
.pe-xxl-1 {
padding-right: 0.25rem !important;
}
.pe-xxl-2 {
padding-right: 0.5rem !important;
}
.pe-xxl-3 {
padding-right: 1rem !important;
}
.pe-xxl-4 {
padding-right: 1.5rem !important;
}
.pe-xxl-5 {
padding-right: 3rem !important;
}
.pb-xxl-0 {
padding-bottom: 0 !important;
}
.pb-xxl-1 {
padding-bottom: 0.25rem !important;
}
.pb-xxl-2 {
padding-bottom: 0.5rem !important;
}
.pb-xxl-3 {
padding-bottom: 1rem !important;
}
.pb-xxl-4 {
padding-bottom: 1.5rem !important;
}
.pb-xxl-5 {
padding-bottom: 3rem !important;
}
.ps-xxl-0 {
padding-left: 0 !important;
}
.ps-xxl-1 {
padding-left: 0.25rem !important;
}
.ps-xxl-2 {
padding-left: 0.5rem !important;
}
.ps-xxl-3 {
padding-left: 1rem !important;
}
.ps-xxl-4 {
padding-left: 1.5rem !important;
}
.ps-xxl-5 {
padding-left: 3rem !important;
}
.gap-xxl-0 {
gap: 0 !important;
}
.gap-xxl-1 {
gap: 0.25rem !important;
}
.gap-xxl-2 {
gap: 0.5rem !important;
}
.gap-xxl-3 {
gap: 1rem !important;
}
.gap-xxl-4 {
gap: 1.5rem !important;
}
.gap-xxl-5 {
gap: 3rem !important;
}
.row-gap-xxl-0 {
row-gap: 0 !important;
}
.row-gap-xxl-1 {
row-gap: 0.25rem !important;
}
.row-gap-xxl-2 {
row-gap: 0.5rem !important;
}
.row-gap-xxl-3 {
row-gap: 1rem !important;
}
.row-gap-xxl-4 {
row-gap: 1.5rem !important;
}
.row-gap-xxl-5 {
row-gap: 3rem !important;
}
.column-gap-xxl-0 {
column-gap: 0 !important;
}
.column-gap-xxl-1 {
column-gap: 0.25rem !important;
}
.column-gap-xxl-2 {
column-gap: 0.5rem !important;
}
.column-gap-xxl-3 {
column-gap: 1rem !important;
}
.column-gap-xxl-4 {
column-gap: 1.5rem !important;
}
.column-gap-xxl-5 {
column-gap: 3rem !important;
}
.text-xxl-start {
text-align: left !important;
}
.text-xxl-end {
text-align: right !important;
}
.text-xxl-center {
text-align: center !important;
}
}
@media (min-width: 1200px) {
.fs-1 {
font-size: 2.5rem !important;
}
.fs-2 {
font-size: 2rem !important;
}
.fs-3 {
font-size: 1.75rem !important;
}
.fs-4 {
font-size: 1.5rem !important;
}
}
@media print {
.d-print-inline {
display: inline !important;
}
.d-print-inline-block {
display: inline-block !important;
}
.d-print-block {
display: block !important;
}
.d-print-grid {
display: grid !important;
}
.d-print-inline-grid {
display: inline-grid !important;
}
.d-print-table {
display: table !important;
}
.d-print-table-row {
display: table-row !important;
}
.d-print-table-cell {
display: table-cell !important;
}
.d-print-flex {
display: flex !important;
}
.d-print-inline-flex {
display: inline-flex !important;
}
.d-print-none {
display: none !important;
}
}
/*!
* WiceGrid CSS
*
* @import "font-awesome"
*/
/*!
* Font Awesome Free 6.4.0 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
* Copyright 2022 Fonticons, Inc.
*/
.fa {
font-family: var(--fa-style-family, "Font Awesome 6 Free");
font-weight: var(--fa-style, 900);
}
.fa,
.fa-classic,
.fa-sharp,
.fas,
.fa-solid,
.far,
.fa-regular,
.fab,
.fa-brands {
-moz-osx-font-smoothing: grayscale;
-webkit-font-smoothing: antialiased;
display: var(--fa-display, inline-block);
font-style: normal;
font-variant: normal;
line-height: 1;
text-rendering: auto;
}
.fas,
.fa-classic,
.fa-solid,
.far,
.fa-regular {
font-family: "Font Awesome 6 Free";
}
.fab,
.fa-brands {
font-family: "Font Awesome 6 Brands";
}
.fa-1x {
font-size: 1em;
}
.fa-2x {
font-size: 2em;
}
.fa-3x {
font-size: 3em;
}
.fa-4x {
font-size: 4em;
}
.fa-5x {
font-size: 5em;
}
.fa-6x {
font-size: 6em;
}
.fa-7x {
font-size: 7em;
}
.fa-8x {
font-size: 8em;
}
.fa-9x {
font-size: 9em;
}
.fa-10x {
font-size: 10em;
}
.fa-2xs {
font-size: 0.625em;
line-height: 0.1em;
vertical-align: 0.225em;
}
.fa-xs {
font-size: 0.75em;
line-height: 0.0833333337em;
vertical-align: 0.125em;
}
.fa-sm {
font-size: 0.875em;
line-height: 0.0714285718em;
vertical-align: 0.0535714295em;
}
.fa-lg {
font-size: 1.25em;
line-height: 0.05em;
vertical-align: -0.075em;
}
.fa-xl {
font-size: 1.5em;
line-height: 0.0416666682em;
vertical-align: -0.125em;
}
.fa-2xl {
font-size: 2em;
line-height: 0.03125em;
vertical-align: -0.1875em;
}
.fa-fw {
text-align: center;
width: 1.25em;
}
.fa-ul {
list-style-type: none;
margin-left: var(--fa-li-margin, 2.5em);
padding-left: 0;
}
.fa-ul > li {
position: relative;
}
.fa-li {
left: calc(var(--fa-li-width, 2em) * -1);
position: absolute;
text-align: center;
width: var(--fa-li-width, 2em);
line-height: inherit;
}
.fa-border {
border-color: var(--fa-border-color, #eee);
border-radius: var(--fa-border-radius, 0.1em);
border-style: var(--fa-border-style, solid);
border-width: var(--fa-border-width, 0.08em);
padding: var(--fa-border-padding, 0.2em 0.25em 0.15em);
}
.fa-pull-left {
float: left;
margin-right: var(--fa-pull-margin, 0.3em);
}
.fa-pull-right {
float: right;
margin-left: var(--fa-pull-margin, 0.3em);
}
.fa-beat {
animation-name: fa-beat;
animation-delay: var(--fa-animation-delay, 0s);
animation-direction: var(--fa-animation-direction, normal);
animation-duration: var(--fa-animation-duration, 1s);
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
animation-timing-function: var(--fa-animation-timing, ease-in-out);
}
.fa-bounce {
animation-name: fa-bounce;
animation-delay: var(--fa-animation-delay, 0s);
animation-direction: var(--fa-animation-direction, normal);
animation-duration: var(--fa-animation-duration, 1s);
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1));
}
.fa-fade {
animation-name: fa-fade;
animation-delay: var(--fa-animation-delay, 0s);
animation-direction: var(--fa-animation-direction, normal);
animation-duration: var(--fa-animation-duration, 1s);
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1));
}
.fa-beat-fade {
animation-name: fa-beat-fade;
animation-delay: var(--fa-animation-delay, 0s);
animation-direction: var(--fa-animation-direction, normal);
animation-duration: var(--fa-animation-duration, 1s);
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1));
}
.fa-flip {
animation-name: fa-flip;
animation-delay: var(--fa-animation-delay, 0s);
animation-direction: var(--fa-animation-direction, normal);
animation-duration: var(--fa-animation-duration, 1s);
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
animation-timing-function: var(--fa-animation-timing, ease-in-out);
}
.fa-shake {
animation-name: fa-shake;
animation-delay: var(--fa-animation-delay, 0s);
animation-direction: var(--fa-animation-direction, normal);
animation-duration: var(--fa-animation-duration, 1s);
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
animation-timing-function: var(--fa-animation-timing, linear);
}
.fa-spin {
animation-name: fa-spin;
animation-delay: var(--fa-animation-delay, 0s);
animation-direction: var(--fa-animation-direction, normal);
animation-duration: var(--fa-animation-duration, 2s);
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
animation-timing-function: var(--fa-animation-timing, linear);
}
.fa-spin-reverse {
--fa-animation-direction: reverse;
}
.fa-pulse,
.fa-spin-pulse {
animation-name: fa-spin;
animation-direction: var(--fa-animation-direction, normal);
animation-duration: var(--fa-animation-duration, 1s);
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
animation-timing-function: var(--fa-animation-timing, steps(8));
}
@media (prefers-reduced-motion: reduce) {
.fa-beat,
.fa-bounce,
.fa-fade,
.fa-beat-fade,
.fa-flip,
.fa-pulse,
.fa-shake,
.fa-spin,
.fa-spin-pulse {
animation-delay: -1ms;
animation-duration: 1ms;
animation-iteration-count: 1;
transition-delay: 0s;
transition-duration: 0s;
}
}
@keyframes fa-beat {
0%, 90% {
transform: scale(1);
}
45% {
transform: scale(var(--fa-beat-scale, 1.25));
}
}
@keyframes fa-bounce {
0% {
transform: scale(1, 1) translateY(0);
}
10% {
transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0);
}
30% {
transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em));
}
50% {
transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0);
}
57% {
transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em));
}
64% {
transform: scale(1, 1) translateY(0);
}
100% {
transform: scale(1, 1) translateY(0);
}
}
@keyframes fa-fade {
50% {
opacity: var(--fa-fade-opacity, 0.4);
}
}
@keyframes fa-beat-fade {
0%, 100% {
opacity: var(--fa-beat-fade-opacity, 0.4);
transform: scale(1);
}
50% {
opacity: 1;
transform: scale(var(--fa-beat-fade-scale, 1.125));
}
}
@keyframes fa-flip {
50% {
transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg));
}
}
@keyframes fa-shake {
0% {
transform: rotate(-15deg);
}
4% {
transform: rotate(15deg);
}
8%, 24% {
transform: rotate(-18deg);
}
12%, 28% {
transform: rotate(18deg);
}
16% {
transform: rotate(-22deg);
}
20% {
transform: rotate(22deg);
}
32% {
transform: rotate(-12deg);
}
36% {
transform: rotate(12deg);
}
40%, 100% {
transform: rotate(0deg);
}
}
@keyframes fa-spin {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
.fa-rotate-90 {
transform: rotate(90deg);
}
.fa-rotate-180 {
transform: rotate(180deg);
}
.fa-rotate-270 {
transform: rotate(270deg);
}
.fa-flip-horizontal {
transform: scale(-1, 1);
}
.fa-flip-vertical {
transform: scale(1, -1);
}
.fa-flip-both,
.fa-flip-horizontal.fa-flip-vertical {
transform: scale(-1, -1);
}
.fa-rotate-by {
transform: rotate(var(--fa-rotate-angle, 0));
}
.fa-stack {
display: inline-block;
height: 2em;
line-height: 2em;
position: relative;
vertical-align: middle;
width: 2.5em;
}
.fa-stack-1x,
.fa-stack-2x {
left: 0;
position: absolute;
text-align: center;
width: 100%;
z-index: var(--fa-stack-z-index, auto);
}
.fa-stack-1x {
line-height: inherit;
}
.fa-stack-2x {
font-size: 2em;
}
.fa-inverse {
color: var(--fa-inverse, #fff);
}
/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
readers do not read off random characters that represent icons */
.fa-0::before {
content: "\30 ";
}
.fa-1::before {
content: "\31 ";
}
.fa-2::before {
content: "\32 ";
}
.fa-3::before {
content: "\33 ";
}
.fa-4::before {
content: "\34 ";
}
.fa-5::before {
content: "\35 ";
}
.fa-6::before {
content: "\36 ";
}
.fa-7::before {
content: "\37 ";
}
.fa-8::before {
content: "\38 ";
}
.fa-9::before {
content: "\39 ";
}
.fa-fill-drip::before {
content: "\f576";
}
.fa-arrows-to-circle::before {
content: "\e4bd";
}
.fa-circle-chevron-right::before {
content: "\f138";
}
.fa-chevron-circle-right::before {
content: "\f138";
}
.fa-at::before {
content: "\@";
}
.fa-trash-can::before {
content: "\f2ed";
}
.fa-trash-alt::before {
content: "\f2ed";
}
.fa-text-height::before {
content: "\f034";
}
.fa-user-xmark::before {
content: "\f235";
}
.fa-user-times::before {
content: "\f235";
}
.fa-stethoscope::before {
content: "\f0f1";
}
.fa-message::before {
content: "\f27a";
}
.fa-comment-alt::before {
content: "\f27a";
}
.fa-info::before {
content: "\f129";
}
.fa-down-left-and-up-right-to-center::before {
content: "\f422";
}
.fa-compress-alt::before {
content: "\f422";
}
.fa-explosion::before {
content: "\e4e9";
}
.fa-file-lines::before {
content: "\f15c";
}
.fa-file-alt::before {
content: "\f15c";
}
.fa-file-text::before {
content: "\f15c";
}
.fa-wave-square::before {
content: "\f83e";
}
.fa-ring::before {
content: "\f70b";
}
.fa-building-un::before {
content: "\e4d9";
}
.fa-dice-three::before {
content: "\f527";
}
.fa-calendar-days::before {
content: "\f073";
}
.fa-calendar-alt::before {
content: "\f073";
}
.fa-anchor-circle-check::before {
content: "\e4aa";
}
.fa-building-circle-arrow-right::before {
content: "\e4d1";
}
.fa-volleyball::before {
content: "\f45f";
}
.fa-volleyball-ball::before {
content: "\f45f";
}
.fa-arrows-up-to-line::before {
content: "\e4c2";
}
.fa-sort-down::before {
content: "\f0dd";
}
.fa-sort-desc::before {
content: "\f0dd";
}
.fa-circle-minus::before {
content: "\f056";
}
.fa-minus-circle::before {
content: "\f056";
}
.fa-door-open::before {
content: "\f52b";
}
.fa-right-from-bracket::before {
content: "\f2f5";
}
.fa-sign-out-alt::before {
content: "\f2f5";
}
.fa-atom::before {
content: "\f5d2";
}
.fa-soap::before {
content: "\e06e";
}
.fa-icons::before {
content: "\f86d";
}
.fa-heart-music-camera-bolt::before {
content: "\f86d";
}
.fa-microphone-lines-slash::before {
content: "\f539";
}
.fa-microphone-alt-slash::before {
content: "\f539";
}
.fa-bridge-circle-check::before {
content: "\e4c9";
}
.fa-pump-medical::before {
content: "\e06a";
}
.fa-fingerprint::before {
content: "\f577";
}
.fa-hand-point-right::before {
content: "\f0a4";
}
.fa-magnifying-glass-location::before {
content: "\f689";
}
.fa-search-location::before {
content: "\f689";
}
.fa-forward-step::before {
content: "\f051";
}
.fa-step-forward::before {
content: "\f051";
}
.fa-face-smile-beam::before {
content: "\f5b8";
}
.fa-smile-beam::before {
content: "\f5b8";
}
.fa-flag-checkered::before {
content: "\f11e";
}
.fa-football::before {
content: "\f44e";
}
.fa-football-ball::before {
content: "\f44e";
}
.fa-school-circle-exclamation::before {
content: "\e56c";
}
.fa-crop::before {
content: "\f125";
}
.fa-angles-down::before {
content: "\f103";
}
.fa-angle-double-down::before {
content: "\f103";
}
.fa-users-rectangle::before {
content: "\e594";
}
.fa-people-roof::before {
content: "\e537";
}
.fa-people-line::before {
content: "\e534";
}
.fa-beer-mug-empty::before {
content: "\f0fc";
}
.fa-beer::before {
content: "\f0fc";
}
.fa-diagram-predecessor::before {
content: "\e477";
}
.fa-arrow-up-long::before {
content: "\f176";
}
.fa-long-arrow-up::before {
content: "\f176";
}
.fa-fire-flame-simple::before {
content: "\f46a";
}
.fa-burn::before {
content: "\f46a";
}
.fa-person::before {
content: "\f183";
}
.fa-male::before {
content: "\f183";
}
.fa-laptop::before {
content: "\f109";
}
.fa-file-csv::before {
content: "\f6dd";
}
.fa-menorah::before {
content: "\f676";
}
.fa-truck-plane::before {
content: "\e58f";
}
.fa-record-vinyl::before {
content: "\f8d9";
}
.fa-face-grin-stars::before {
content: "\f587";
}
.fa-grin-stars::before {
content: "\f587";
}
.fa-bong::before {
content: "\f55c";
}
.fa-spaghetti-monster-flying::before {
content: "\f67b";
}
.fa-pastafarianism::before {
content: "\f67b";
}
.fa-arrow-down-up-across-line::before {
content: "\e4af";
}
.fa-spoon::before {
content: "\f2e5";
}
.fa-utensil-spoon::before {
content: "\f2e5";
}
.fa-jar-wheat::before {
content: "\e517";
}
.fa-envelopes-bulk::before {
content: "\f674";
}
.fa-mail-bulk::before {
content: "\f674";
}
.fa-file-circle-exclamation::before {
content: "\e4eb";
}
.fa-circle-h::before {
content: "\f47e";
}
.fa-hospital-symbol::before {
content: "\f47e";
}
.fa-pager::before {
content: "\f815";
}
.fa-address-book::before {
content: "\f2b9";
}
.fa-contact-book::before {
content: "\f2b9";
}
.fa-strikethrough::before {
content: "\f0cc";
}
.fa-k::before {
content: "K";
}
.fa-landmark-flag::before {
content: "\e51c";
}
.fa-pencil::before {
content: "\f303";
}
.fa-pencil-alt::before {
content: "\f303";
}
.fa-backward::before {
content: "\f04a";
}
.fa-caret-right::before {
content: "\f0da";
}
.fa-comments::before {
content: "\f086";
}
.fa-paste::before {
content: "\f0ea";
}
.fa-file-clipboard::before {
content: "\f0ea";
}
.fa-code-pull-request::before {
content: "\e13c";
}
.fa-clipboard-list::before {
content: "\f46d";
}
.fa-truck-ramp-box::before {
content: "\f4de";
}
.fa-truck-loading::before {
content: "\f4de";
}
.fa-user-check::before {
content: "\f4fc";
}
.fa-vial-virus::before {
content: "\e597";
}
.fa-sheet-plastic::before {
content: "\e571";
}
.fa-blog::before {
content: "\f781";
}
.fa-user-ninja::before {
content: "\f504";
}
.fa-person-arrow-up-from-line::before {
content: "\e539";
}
.fa-scroll-torah::before {
content: "\f6a0";
}
.fa-torah::before {
content: "\f6a0";
}
.fa-broom-ball::before {
content: "\f458";
}
.fa-quidditch::before {
content: "\f458";
}
.fa-quidditch-broom-ball::before {
content: "\f458";
}
.fa-toggle-off::before {
content: "\f204";
}
.fa-box-archive::before {
content: "\f187";
}
.fa-archive::before {
content: "\f187";
}
.fa-person-drowning::before {
content: "\e545";
}
.fa-arrow-down-9-1::before {
content: "\f886";
}
.fa-sort-numeric-desc::before {
content: "\f886";
}
.fa-sort-numeric-down-alt::before {
content: "\f886";
}
.fa-face-grin-tongue-squint::before {
content: "\f58a";
}
.fa-grin-tongue-squint::before {
content: "\f58a";
}
.fa-spray-can::before {
content: "\f5bd";
}
.fa-truck-monster::before {
content: "\f63b";
}
.fa-w::before {
content: "W";
}
.fa-earth-africa::before {
content: "\f57c";
}
.fa-globe-africa::before {
content: "\f57c";
}
.fa-rainbow::before {
content: "\f75b";
}
.fa-circle-notch::before {
content: "\f1ce";
}
.fa-tablet-screen-button::before {
content: "\f3fa";
}
.fa-tablet-alt::before {
content: "\f3fa";
}
.fa-paw::before {
content: "\f1b0";
}
.fa-cloud::before {
content: "\f0c2";
}
.fa-trowel-bricks::before {
content: "\e58a";
}
.fa-face-flushed::before {
content: "\f579";
}
.fa-flushed::before {
content: "\f579";
}
.fa-hospital-user::before {
content: "\f80d";
}
.fa-tent-arrow-left-right::before {
content: "\e57f";
}
.fa-gavel::before {
content: "\f0e3";
}
.fa-legal::before {
content: "\f0e3";
}
.fa-binoculars::before {
content: "\f1e5";
}
.fa-microphone-slash::before {
content: "\f131";
}
.fa-box-tissue::before {
content: "\e05b";
}
.fa-motorcycle::before {
content: "\f21c";
}
.fa-bell-concierge::before {
content: "\f562";
}
.fa-concierge-bell::before {
content: "\f562";
}
.fa-pen-ruler::before {
content: "\f5ae";
}
.fa-pencil-ruler::before {
content: "\f5ae";
}
.fa-people-arrows::before {
content: "\e068";
}
.fa-people-arrows-left-right::before {
content: "\e068";
}
.fa-mars-and-venus-burst::before {
content: "\e523";
}
.fa-square-caret-right::before {
content: "\f152";
}
.fa-caret-square-right::before {
content: "\f152";
}
.fa-scissors::before {
content: "\f0c4";
}
.fa-cut::before {
content: "\f0c4";
}
.fa-sun-plant-wilt::before {
content: "\e57a";
}
.fa-toilets-portable::before {
content: "\e584";
}
.fa-hockey-puck::before {
content: "\f453";
}
.fa-table::before {
content: "\f0ce";
}
.fa-magnifying-glass-arrow-right::before {
content: "\e521";
}
.fa-tachograph-digital::before {
content: "\f566";
}
.fa-digital-tachograph::before {
content: "\f566";
}
.fa-users-slash::before {
content: "\e073";
}
.fa-clover::before {
content: "\e139";
}
.fa-reply::before {
content: "\f3e5";
}
.fa-mail-reply::before {
content: "\f3e5";
}
.fa-star-and-crescent::before {
content: "\f699";
}
.fa-house-fire::before {
content: "\e50c";
}
.fa-square-minus::before {
content: "\f146";
}
.fa-minus-square::before {
content: "\f146";
}
.fa-helicopter::before {
content: "\f533";
}
.fa-compass::before {
content: "\f14e";
}
.fa-square-caret-down::before {
content: "\f150";
}
.fa-caret-square-down::before {
content: "\f150";
}
.fa-file-circle-question::before {
content: "\e4ef";
}
.fa-laptop-code::before {
content: "\f5fc";
}
.fa-swatchbook::before {
content: "\f5c3";
}
.fa-prescription-bottle::before {
content: "\f485";
}
.fa-bars::before {
content: "\f0c9";
}
.fa-navicon::before {
content: "\f0c9";
}
.fa-people-group::before {
content: "\e533";
}
.fa-hourglass-end::before {
content: "\f253";
}
.fa-hourglass-3::before {
content: "\f253";
}
.fa-heart-crack::before {
content: "\f7a9";
}
.fa-heart-broken::before {
content: "\f7a9";
}
.fa-square-up-right::before {
content: "\f360";
}
.fa-external-link-square-alt::before {
content: "\f360";
}
.fa-face-kiss-beam::before {
content: "\f597";
}
.fa-kiss-beam::before {
content: "\f597";
}
.fa-film::before {
content: "\f008";
}
.fa-ruler-horizontal::before {
content: "\f547";
}
.fa-people-robbery::before {
content: "\e536";
}
.fa-lightbulb::before {
content: "\f0eb";
}
.fa-caret-left::before {
content: "\f0d9";
}
.fa-circle-exclamation::before {
content: "\f06a";
}
.fa-exclamation-circle::before {
content: "\f06a";
}
.fa-school-circle-xmark::before {
content: "\e56d";
}
.fa-arrow-right-from-bracket::before {
content: "\f08b";
}
.fa-sign-out::before {
content: "\f08b";
}
.fa-circle-chevron-down::before {
content: "\f13a";
}
.fa-chevron-circle-down::before {
content: "\f13a";
}
.fa-unlock-keyhole::before {
content: "\f13e";
}
.fa-unlock-alt::before {
content: "\f13e";
}
.fa-cloud-showers-heavy::before {
content: "\f740";
}
.fa-headphones-simple::before {
content: "\f58f";
}
.fa-headphones-alt::before {
content: "\f58f";
}
.fa-sitemap::before {
content: "\f0e8";
}
.fa-circle-dollar-to-slot::before {
content: "\f4b9";
}
.fa-donate::before {
content: "\f4b9";
}
.fa-memory::before {
content: "\f538";
}
.fa-road-spikes::before {
content: "\e568";
}
.fa-fire-burner::before {
content: "\e4f1";
}
.fa-flag::before {
content: "\f024";
}
.fa-hanukiah::before {
content: "\f6e6";
}
.fa-feather::before {
content: "\f52d";
}
.fa-volume-low::before {
content: "\f027";
}
.fa-volume-down::before {
content: "\f027";
}
.fa-comment-slash::before {
content: "\f4b3";
}
.fa-cloud-sun-rain::before {
content: "\f743";
}
.fa-compress::before {
content: "\f066";
}
.fa-wheat-awn::before {
content: "\e2cd";
}
.fa-wheat-alt::before {
content: "\e2cd";
}
.fa-ankh::before {
content: "\f644";
}
.fa-hands-holding-child::before {
content: "\e4fa";
}
.fa-asterisk::before {
content: "\*";
}
.fa-square-check::before {
content: "\f14a";
}
.fa-check-square::before {
content: "\f14a";
}
.fa-peseta-sign::before {
content: "\e221";
}
.fa-heading::before {
content: "\f1dc";
}
.fa-header::before {
content: "\f1dc";
}
.fa-ghost::before {
content: "\f6e2";
}
.fa-list::before {
content: "\f03a";
}
.fa-list-squares::before {
content: "\f03a";
}
.fa-square-phone-flip::before {
content: "\f87b";
}
.fa-phone-square-alt::before {
content: "\f87b";
}
.fa-cart-plus::before {
content: "\f217";
}
.fa-gamepad::before {
content: "\f11b";
}
.fa-circle-dot::before {
content: "\f192";
}
.fa-dot-circle::before {
content: "\f192";
}
.fa-face-dizzy::before {
content: "\f567";
}
.fa-dizzy::before {
content: "\f567";
}
.fa-egg::before {
content: "\f7fb";
}
.fa-house-medical-circle-xmark::before {
content: "\e513";
}
.fa-campground::before {
content: "\f6bb";
}
.fa-folder-plus::before {
content: "\f65e";
}
.fa-futbol::before {
content: "\f1e3";
}
.fa-futbol-ball::before {
content: "\f1e3";
}
.fa-soccer-ball::before {
content: "\f1e3";
}
.fa-paintbrush::before {
content: "\f1fc";
}
.fa-paint-brush::before {
content: "\f1fc";
}
.fa-lock::before {
content: "\f023";
}
.fa-gas-pump::before {
content: "\f52f";
}
.fa-hot-tub-person::before {
content: "\f593";
}
.fa-hot-tub::before {
content: "\f593";
}
.fa-map-location::before {
content: "\f59f";
}
.fa-map-marked::before {
content: "\f59f";
}
.fa-house-flood-water::before {
content: "\e50e";
}
.fa-tree::before {
content: "\f1bb";
}
.fa-bridge-lock::before {
content: "\e4cc";
}
.fa-sack-dollar::before {
content: "\f81d";
}
.fa-pen-to-square::before {
content: "\f044";
}
.fa-edit::before {
content: "\f044";
}
.fa-car-side::before {
content: "\f5e4";
}
.fa-share-nodes::before {
content: "\f1e0";
}
.fa-share-alt::before {
content: "\f1e0";
}
.fa-heart-circle-minus::before {
content: "\e4ff";
}
.fa-hourglass-half::before {
content: "\f252";
}
.fa-hourglass-2::before {
content: "\f252";
}
.fa-microscope::before {
content: "\f610";
}
.fa-sink::before {
content: "\e06d";
}
.fa-bag-shopping::before {
content: "\f290";
}
.fa-shopping-bag::before {
content: "\f290";
}
.fa-arrow-down-z-a::before {
content: "\f881";
}
.fa-sort-alpha-desc::before {
content: "\f881";
}
.fa-sort-alpha-down-alt::before {
content: "\f881";
}
.fa-mitten::before {
content: "\f7b5";
}
.fa-person-rays::before {
content: "\e54d";
}
.fa-users::before {
content: "\f0c0";
}
.fa-eye-slash::before {
content: "\f070";
}
.fa-flask-vial::before {
content: "\e4f3";
}
.fa-hand::before {
content: "\f256";
}
.fa-hand-paper::before {
content: "\f256";
}
.fa-om::before {
content: "\f679";
}
.fa-worm::before {
content: "\e599";
}
.fa-house-circle-xmark::before {
content: "\e50b";
}
.fa-plug::before {
content: "\f1e6";
}
.fa-chevron-up::before {
content: "\f077";
}
.fa-hand-spock::before {
content: "\f259";
}
.fa-stopwatch::before {
content: "\f2f2";
}
.fa-face-kiss::before {
content: "\f596";
}
.fa-kiss::before {
content: "\f596";
}
.fa-bridge-circle-xmark::before {
content: "\e4cb";
}
.fa-face-grin-tongue::before {
content: "\f589";
}
.fa-grin-tongue::before {
content: "\f589";
}
.fa-chess-bishop::before {
content: "\f43a";
}
.fa-face-grin-wink::before {
content: "\f58c";
}
.fa-grin-wink::before {
content: "\f58c";
}
.fa-ear-deaf::before {
content: "\f2a4";
}
.fa-deaf::before {
content: "\f2a4";
}
.fa-deafness::before {
content: "\f2a4";
}
.fa-hard-of-hearing::before {
content: "\f2a4";
}
.fa-road-circle-check::before {
content: "\e564";
}
.fa-dice-five::before {
content: "\f523";
}
.fa-square-rss::before {
content: "\f143";
}
.fa-rss-square::before {
content: "\f143";
}
.fa-land-mine-on::before {
content: "\e51b";
}
.fa-i-cursor::before {
content: "\f246";
}
.fa-stamp::before {
content: "\f5bf";
}
.fa-stairs::before {
content: "\e289";
}
.fa-i::before {
content: "I";
}
.fa-hryvnia-sign::before {
content: "\f6f2";
}
.fa-hryvnia::before {
content: "\f6f2";
}
.fa-pills::before {
content: "\f484";
}
.fa-face-grin-wide::before {
content: "\f581";
}
.fa-grin-alt::before {
content: "\f581";
}
.fa-tooth::before {
content: "\f5c9";
}
.fa-v::before {
content: "V";
}
.fa-bangladeshi-taka-sign::before {
content: "\e2e6";
}
.fa-bicycle::before {
content: "\f206";
}
.fa-staff-snake::before {
content: "\e579";
}
.fa-rod-asclepius::before {
content: "\e579";
}
.fa-rod-snake::before {
content: "\e579";
}
.fa-staff-aesculapius::before {
content: "\e579";
}
.fa-head-side-cough-slash::before {
content: "\e062";
}
.fa-truck-medical::before {
content: "\f0f9";
}
.fa-ambulance::before {
content: "\f0f9";
}
.fa-wheat-awn-circle-exclamation::before {
content: "\e598";
}
.fa-snowman::before {
content: "\f7d0";
}
.fa-mortar-pestle::before {
content: "\f5a7";
}
.fa-road-barrier::before {
content: "\e562";
}
.fa-school::before {
content: "\f549";
}
.fa-igloo::before {
content: "\f7ae";
}
.fa-joint::before {
content: "\f595";
}
.fa-angle-right::before {
content: "\f105";
}
.fa-horse::before {
content: "\f6f0";
}
.fa-q::before {
content: "Q";
}
.fa-g::before {
content: "G";
}
.fa-notes-medical::before {
content: "\f481";
}
.fa-temperature-half::before {
content: "\f2c9";
}
.fa-temperature-2::before {
content: "\f2c9";
}
.fa-thermometer-2::before {
content: "\f2c9";
}
.fa-thermometer-half::before {
content: "\f2c9";
}
.fa-dong-sign::before {
content: "\e169";
}
.fa-capsules::before {
content: "\f46b";
}
.fa-poo-storm::before {
content: "\f75a";
}
.fa-poo-bolt::before {
content: "\f75a";
}
.fa-face-frown-open::before {
content: "\f57a";
}
.fa-frown-open::before {
content: "\f57a";
}
.fa-hand-point-up::before {
content: "\f0a6";
}
.fa-money-bill::before {
content: "\f0d6";
}
.fa-bookmark::before {
content: "\f02e";
}
.fa-align-justify::before {
content: "\f039";
}
.fa-umbrella-beach::before {
content: "\f5ca";
}
.fa-helmet-un::before {
content: "\e503";
}
.fa-bullseye::before {
content: "\f140";
}
.fa-bacon::before {
content: "\f7e5";
}
.fa-hand-point-down::before {
content: "\f0a7";
}
.fa-arrow-up-from-bracket::before {
content: "\e09a";
}
.fa-folder::before {
content: "\f07b";
}
.fa-folder-blank::before {
content: "\f07b";
}
.fa-file-waveform::before {
content: "\f478";
}
.fa-file-medical-alt::before {
content: "\f478";
}
.fa-radiation::before {
content: "\f7b9";
}
.fa-chart-simple::before {
content: "\e473";
}
.fa-mars-stroke::before {
content: "\f229";
}
.fa-vial::before {
content: "\f492";
}
.fa-gauge::before {
content: "\f624";
}
.fa-dashboard::before {
content: "\f624";
}
.fa-gauge-med::before {
content: "\f624";
}
.fa-tachometer-alt-average::before {
content: "\f624";
}
.fa-wand-magic-sparkles::before {
content: "\e2ca";
}
.fa-magic-wand-sparkles::before {
content: "\e2ca";
}
.fa-e::before {
content: "E";
}
.fa-pen-clip::before {
content: "\f305";
}
.fa-pen-alt::before {
content: "\f305";
}
.fa-bridge-circle-exclamation::before {
content: "\e4ca";
}
.fa-user::before {
content: "\f007";
}
.fa-school-circle-check::before {
content: "\e56b";
}
.fa-dumpster::before {
content: "\f793";
}
.fa-van-shuttle::before {
content: "\f5b6";
}
.fa-shuttle-van::before {
content: "\f5b6";
}
.fa-building-user::before {
content: "\e4da";
}
.fa-square-caret-left::before {
content: "\f191";
}
.fa-caret-square-left::before {
content: "\f191";
}
.fa-highlighter::before {
content: "\f591";
}
.fa-key::before {
content: "\f084";
}
.fa-bullhorn::before {
content: "\f0a1";
}
.fa-globe::before {
content: "\f0ac";
}
.fa-synagogue::before {
content: "\f69b";
}
.fa-person-half-dress::before {
content: "\e548";
}
.fa-road-bridge::before {
content: "\e563";
}
.fa-location-arrow::before {
content: "\f124";
}
.fa-c::before {
content: "C";
}
.fa-tablet-button::before {
content: "\f10a";
}
.fa-building-lock::before {
content: "\e4d6";
}
.fa-pizza-slice::before {
content: "\f818";
}
.fa-money-bill-wave::before {
content: "\f53a";
}
.fa-chart-area::before {
content: "\f1fe";
}
.fa-area-chart::before {
content: "\f1fe";
}
.fa-house-flag::before {
content: "\e50d";
}
.fa-person-circle-minus::before {
content: "\e540";
}
.fa-ban::before {
content: "\f05e";
}
.fa-cancel::before {
content: "\f05e";
}
.fa-camera-rotate::before {
content: "\e0d8";
}
.fa-spray-can-sparkles::before {
content: "\f5d0";
}
.fa-air-freshener::before {
content: "\f5d0";
}
.fa-star::before {
content: "\f005";
}
.fa-repeat::before {
content: "\f363";
}
.fa-cross::before {
content: "\f654";
}
.fa-box::before {
content: "\f466";
}
.fa-venus-mars::before {
content: "\f228";
}
.fa-arrow-pointer::before {
content: "\f245";
}
.fa-mouse-pointer::before {
content: "\f245";
}
.fa-maximize::before {
content: "\f31e";
}
.fa-expand-arrows-alt::before {
content: "\f31e";
}
.fa-charging-station::before {
content: "\f5e7";
}
.fa-shapes::before {
content: "\f61f";
}
.fa-triangle-circle-square::before {
content: "\f61f";
}
.fa-shuffle::before {
content: "\f074";
}
.fa-random::before {
content: "\f074";
}
.fa-person-running::before {
content: "\f70c";
}
.fa-running::before {
content: "\f70c";
}
.fa-mobile-retro::before {
content: "\e527";
}
.fa-grip-lines-vertical::before {
content: "\f7a5";
}
.fa-spider::before {
content: "\f717";
}
.fa-hands-bound::before {
content: "\e4f9";
}
.fa-file-invoice-dollar::before {
content: "\f571";
}
.fa-plane-circle-exclamation::before {
content: "\e556";
}
.fa-x-ray::before {
content: "\f497";
}
.fa-spell-check::before {
content: "\f891";
}
.fa-slash::before {
content: "\f715";
}
.fa-computer-mouse::before {
content: "\f8cc";
}
.fa-mouse::before {
content: "\f8cc";
}
.fa-arrow-right-to-bracket::before {
content: "\f090";
}
.fa-sign-in::before {
content: "\f090";
}
.fa-shop-slash::before {
content: "\e070";
}
.fa-store-alt-slash::before {
content: "\e070";
}
.fa-server::before {
content: "\f233";
}
.fa-virus-covid-slash::before {
content: "\e4a9";
}
.fa-shop-lock::before {
content: "\e4a5";
}
.fa-hourglass-start::before {
content: "\f251";
}
.fa-hourglass-1::before {
content: "\f251";
}
.fa-blender-phone::before {
content: "\f6b6";
}
.fa-building-wheat::before {
content: "\e4db";
}
.fa-person-breastfeeding::before {
content: "\e53a";
}
.fa-right-to-bracket::before {
content: "\f2f6";
}
.fa-sign-in-alt::before {
content: "\f2f6";
}
.fa-venus::before {
content: "\f221";
}
.fa-passport::before {
content: "\f5ab";
}
.fa-heart-pulse::before {
content: "\f21e";
}
.fa-heartbeat::before {
content: "\f21e";
}
.fa-people-carry-box::before {
content: "\f4ce";
}
.fa-people-carry::before {
content: "\f4ce";
}
.fa-temperature-high::before {
content: "\f769";
}
.fa-microchip::before {
content: "\f2db";
}
.fa-crown::before {
content: "\f521";
}
.fa-weight-hanging::before {
content: "\f5cd";
}
.fa-xmarks-lines::before {
content: "\e59a";
}
.fa-file-prescription::before {
content: "\f572";
}
.fa-weight-scale::before {
content: "\f496";
}
.fa-weight::before {
content: "\f496";
}
.fa-user-group::before {
content: "\f500";
}
.fa-user-friends::before {
content: "\f500";
}
.fa-arrow-up-a-z::before {
content: "\f15e";
}
.fa-sort-alpha-up::before {
content: "\f15e";
}
.fa-chess-knight::before {
content: "\f441";
}
.fa-face-laugh-squint::before {
content: "\f59b";
}
.fa-laugh-squint::before {
content: "\f59b";
}
.fa-wheelchair::before {
content: "\f193";
}
.fa-circle-arrow-up::before {
content: "\f0aa";
}
.fa-arrow-circle-up::before {
content: "\f0aa";
}
.fa-toggle-on::before {
content: "\f205";
}
.fa-person-walking::before {
content: "\f554";
}
.fa-walking::before {
content: "\f554";
}
.fa-l::before {
content: "L";
}
.fa-fire::before {
content: "\f06d";
}
.fa-bed-pulse::before {
content: "\f487";
}
.fa-procedures::before {
content: "\f487";
}
.fa-shuttle-space::before {
content: "\f197";
}
.fa-space-shuttle::before {
content: "\f197";
}
.fa-face-laugh::before {
content: "\f599";
}
.fa-laugh::before {
content: "\f599";
}
.fa-folder-open::before {
content: "\f07c";
}
.fa-heart-circle-plus::before {
content: "\e500";
}
.fa-code-fork::before {
content: "\e13b";
}
.fa-city::before {
content: "\f64f";
}
.fa-microphone-lines::before {
content: "\f3c9";
}
.fa-microphone-alt::before {
content: "\f3c9";
}
.fa-pepper-hot::before {
content: "\f816";
}
.fa-unlock::before {
content: "\f09c";
}
.fa-colon-sign::before {
content: "\e140";
}
.fa-headset::before {
content: "\f590";
}
.fa-store-slash::before {
content: "\e071";
}
.fa-road-circle-xmark::before {
content: "\e566";
}
.fa-user-minus::before {
content: "\f503";
}
.fa-mars-stroke-up::before {
content: "\f22a";
}
.fa-mars-stroke-v::before {
content: "\f22a";
}
.fa-champagne-glasses::before {
content: "\f79f";
}
.fa-glass-cheers::before {
content: "\f79f";
}
.fa-clipboard::before {
content: "\f328";
}
.fa-house-circle-exclamation::before {
content: "\e50a";
}
.fa-file-arrow-up::before {
content: "\f574";
}
.fa-file-upload::before {
content: "\f574";
}
.fa-wifi::before {
content: "\f1eb";
}
.fa-wifi-3::before {
content: "\f1eb";
}
.fa-wifi-strong::before {
content: "\f1eb";
}
.fa-bath::before {
content: "\f2cd";
}
.fa-bathtub::before {
content: "\f2cd";
}
.fa-underline::before {
content: "\f0cd";
}
.fa-user-pen::before {
content: "\f4ff";
}
.fa-user-edit::before {
content: "\f4ff";
}
.fa-signature::before {
content: "\f5b7";
}
.fa-stroopwafel::before {
content: "\f551";
}
.fa-bold::before {
content: "\f032";
}
.fa-anchor-lock::before {
content: "\e4ad";
}
.fa-building-ngo::before {
content: "\e4d7";
}
.fa-manat-sign::before {
content: "\e1d5";
}
.fa-not-equal::before {
content: "\f53e";
}
.fa-border-top-left::before {
content: "\f853";
}
.fa-border-style::before {
content: "\f853";
}
.fa-map-location-dot::before {
content: "\f5a0";
}
.fa-map-marked-alt::before {
content: "\f5a0";
}
.fa-jedi::before {
content: "\f669";
}
.fa-square-poll-vertical::before {
content: "\f681";
}
.fa-poll::before {
content: "\f681";
}
.fa-mug-hot::before {
content: "\f7b6";
}
.fa-car-battery::before {
content: "\f5df";
}
.fa-battery-car::before {
content: "\f5df";
}
.fa-gift::before {
content: "\f06b";
}
.fa-dice-two::before {
content: "\f528";
}
.fa-chess-queen::before {
content: "\f445";
}
.fa-glasses::before {
content: "\f530";
}
.fa-chess-board::before {
content: "\f43c";
}
.fa-building-circle-check::before {
content: "\e4d2";
}
.fa-person-chalkboard::before {
content: "\e53d";
}
.fa-mars-stroke-right::before {
content: "\f22b";
}
.fa-mars-stroke-h::before {
content: "\f22b";
}
.fa-hand-back-fist::before {
content: "\f255";
}
.fa-hand-rock::before {
content: "\f255";
}
.fa-square-caret-up::before {
content: "\f151";
}
.fa-caret-square-up::before {
content: "\f151";
}
.fa-cloud-showers-water::before {
content: "\e4e4";
}
.fa-chart-bar::before {
content: "\f080";
}
.fa-bar-chart::before {
content: "\f080";
}
.fa-hands-bubbles::before {
content: "\e05e";
}
.fa-hands-wash::before {
content: "\e05e";
}
.fa-less-than-equal::before {
content: "\f537";
}
.fa-train::before {
content: "\f238";
}
.fa-eye-low-vision::before {
content: "\f2a8";
}
.fa-low-vision::before {
content: "\f2a8";
}
.fa-crow::before {
content: "\f520";
}
.fa-sailboat::before {
content: "\e445";
}
.fa-window-restore::before {
content: "\f2d2";
}
.fa-square-plus::before {
content: "\f0fe";
}
.fa-plus-square::before {
content: "\f0fe";
}
.fa-torii-gate::before {
content: "\f6a1";
}
.fa-frog::before {
content: "\f52e";
}
.fa-bucket::before {
content: "\e4cf";
}
.fa-image::before {
content: "\f03e";
}
.fa-microphone::before {
content: "\f130";
}
.fa-cow::before {
content: "\f6c8";
}
.fa-caret-up::before {
content: "\f0d8";
}
.fa-screwdriver::before {
content: "\f54a";
}
.fa-folder-closed::before {
content: "\e185";
}
.fa-house-tsunami::before {
content: "\e515";
}
.fa-square-nfi::before {
content: "\e576";
}
.fa-arrow-up-from-ground-water::before {
content: "\e4b5";
}
.fa-martini-glass::before {
content: "\f57b";
}
.fa-glass-martini-alt::before {
content: "\f57b";
}
.fa-rotate-left::before {
content: "\f2ea";
}
.fa-rotate-back::before {
content: "\f2ea";
}
.fa-rotate-backward::before {
content: "\f2ea";
}
.fa-undo-alt::before {
content: "\f2ea";
}
.fa-table-columns::before {
content: "\f0db";
}
.fa-columns::before {
content: "\f0db";
}
.fa-lemon::before {
content: "\f094";
}
.fa-head-side-mask::before {
content: "\e063";
}
.fa-handshake::before {
content: "\f2b5";
}
.fa-gem::before {
content: "\f3a5";
}
.fa-dolly::before {
content: "\f472";
}
.fa-dolly-box::before {
content: "\f472";
}
.fa-smoking::before {
content: "\f48d";
}
.fa-minimize::before {
content: "\f78c";
}
.fa-compress-arrows-alt::before {
content: "\f78c";
}
.fa-monument::before {
content: "\f5a6";
}
.fa-snowplow::before {
content: "\f7d2";
}
.fa-angles-right::before {
content: "\f101";
}
.fa-angle-double-right::before {
content: "\f101";
}
.fa-cannabis::before {
content: "\f55f";
}
.fa-circle-play::before {
content: "\f144";
}
.fa-play-circle::before {
content: "\f144";
}
.fa-tablets::before {
content: "\f490";
}
.fa-ethernet::before {
content: "\f796";
}
.fa-euro-sign::before {
content: "\f153";
}
.fa-eur::before {
content: "\f153";
}
.fa-euro::before {
content: "\f153";
}
.fa-chair::before {
content: "\f6c0";
}
.fa-circle-check::before {
content: "\f058";
}
.fa-check-circle::before {
content: "\f058";
}
.fa-circle-stop::before {
content: "\f28d";
}
.fa-stop-circle::before {
content: "\f28d";
}
.fa-compass-drafting::before {
content: "\f568";
}
.fa-drafting-compass::before {
content: "\f568";
}
.fa-plate-wheat::before {
content: "\e55a";
}
.fa-icicles::before {
content: "\f7ad";
}
.fa-person-shelter::before {
content: "\e54f";
}
.fa-neuter::before {
content: "\f22c";
}
.fa-id-badge::before {
content: "\f2c1";
}
.fa-marker::before {
content: "\f5a1";
}
.fa-face-laugh-beam::before {
content: "\f59a";
}
.fa-laugh-beam::before {
content: "\f59a";
}
.fa-helicopter-symbol::before {
content: "\e502";
}
.fa-universal-access::before {
content: "\f29a";
}
.fa-circle-chevron-up::before {
content: "\f139";
}
.fa-chevron-circle-up::before {
content: "\f139";
}
.fa-lari-sign::before {
content: "\e1c8";
}
.fa-volcano::before {
content: "\f770";
}
.fa-person-walking-dashed-line-arrow-right::before {
content: "\e553";
}
.fa-sterling-sign::before {
content: "\f154";
}
.fa-gbp::before {
content: "\f154";
}
.fa-pound-sign::before {
content: "\f154";
}
.fa-viruses::before {
content: "\e076";
}
.fa-square-person-confined::before {
content: "\e577";
}
.fa-user-tie::before {
content: "\f508";
}
.fa-arrow-down-long::before {
content: "\f175";
}
.fa-long-arrow-down::before {
content: "\f175";
}
.fa-tent-arrow-down-to-line::before {
content: "\e57e";
}
.fa-certificate::before {
content: "\f0a3";
}
.fa-reply-all::before {
content: "\f122";
}
.fa-mail-reply-all::before {
content: "\f122";
}
.fa-suitcase::before {
content: "\f0f2";
}
.fa-person-skating::before {
content: "\f7c5";
}
.fa-skating::before {
content: "\f7c5";
}
.fa-filter-circle-dollar::before {
content: "\f662";
}
.fa-funnel-dollar::before {
content: "\f662";
}
.fa-camera-retro::before {
content: "\f083";
}
.fa-circle-arrow-down::before {
content: "\f0ab";
}
.fa-arrow-circle-down::before {
content: "\f0ab";
}
.fa-file-import::before {
content: "\f56f";
}
.fa-arrow-right-to-file::before {
content: "\f56f";
}
.fa-square-arrow-up-right::before {
content: "\f14c";
}
.fa-external-link-square::before {
content: "\f14c";
}
.fa-box-open::before {
content: "\f49e";
}
.fa-scroll::before {
content: "\f70e";
}
.fa-spa::before {
content: "\f5bb";
}
.fa-location-pin-lock::before {
content: "\e51f";
}
.fa-pause::before {
content: "\f04c";
}
.fa-hill-avalanche::before {
content: "\e507";
}
.fa-temperature-empty::before {
content: "\f2cb";
}
.fa-temperature-0::before {
content: "\f2cb";
}
.fa-thermometer-0::before {
content: "\f2cb";
}
.fa-thermometer-empty::before {
content: "\f2cb";
}
.fa-bomb::before {
content: "\f1e2";
}
.fa-registered::before {
content: "\f25d";
}
.fa-address-card::before {
content: "\f2bb";
}
.fa-contact-card::before {
content: "\f2bb";
}
.fa-vcard::before {
content: "\f2bb";
}
.fa-scale-unbalanced-flip::before {
content: "\f516";
}
.fa-balance-scale-right::before {
content: "\f516";
}
.fa-subscript::before {
content: "\f12c";
}
.fa-diamond-turn-right::before {
content: "\f5eb";
}
.fa-directions::before {
content: "\f5eb";
}
.fa-burst::before {
content: "\e4dc";
}
.fa-house-laptop::before {
content: "\e066";
}
.fa-laptop-house::before {
content: "\e066";
}
.fa-face-tired::before {
content: "\f5c8";
}
.fa-tired::before {
content: "\f5c8";
}
.fa-money-bills::before {
content: "\e1f3";
}
.fa-smog::before {
content: "\f75f";
}
.fa-crutch::before {
content: "\f7f7";
}
.fa-cloud-arrow-up::before {
content: "\f0ee";
}
.fa-cloud-upload::before {
content: "\f0ee";
}
.fa-cloud-upload-alt::before {
content: "\f0ee";
}
.fa-palette::before {
content: "\f53f";
}
.fa-arrows-turn-right::before {
content: "\e4c0";
}
.fa-vest::before {
content: "\e085";
}
.fa-ferry::before {
content: "\e4ea";
}
.fa-arrows-down-to-people::before {
content: "\e4b9";
}
.fa-seedling::before {
content: "\f4d8";
}
.fa-sprout::before {
content: "\f4d8";
}
.fa-left-right::before {
content: "\f337";
}
.fa-arrows-alt-h::before {
content: "\f337";
}
.fa-boxes-packing::before {
content: "\e4c7";
}
.fa-circle-arrow-left::before {
content: "\f0a8";
}
.fa-arrow-circle-left::before {
content: "\f0a8";
}
.fa-group-arrows-rotate::before {
content: "\e4f6";
}
.fa-bowl-food::before {
content: "\e4c6";
}
.fa-candy-cane::before {
content: "\f786";
}
.fa-arrow-down-wide-short::before {
content: "\f160";
}
.fa-sort-amount-asc::before {
content: "\f160";
}
.fa-sort-amount-down::before {
content: "\f160";
}
.fa-cloud-bolt::before {
content: "\f76c";
}
.fa-thunderstorm::before {
content: "\f76c";
}
.fa-text-slash::before {
content: "\f87d";
}
.fa-remove-format::before {
content: "\f87d";
}
.fa-face-smile-wink::before {
content: "\f4da";
}
.fa-smile-wink::before {
content: "\f4da";
}
.fa-file-word::before {
content: "\f1c2";
}
.fa-file-powerpoint::before {
content: "\f1c4";
}
.fa-arrows-left-right::before {
content: "\f07e";
}
.fa-arrows-h::before {
content: "\f07e";
}
.fa-house-lock::before {
content: "\e510";
}
.fa-cloud-arrow-down::before {
content: "\f0ed";
}
.fa-cloud-download::before {
content: "\f0ed";
}
.fa-cloud-download-alt::before {
content: "\f0ed";
}
.fa-children::before {
content: "\e4e1";
}
.fa-chalkboard::before {
content: "\f51b";
}
.fa-blackboard::before {
content: "\f51b";
}
.fa-user-large-slash::before {
content: "\f4fa";
}
.fa-user-alt-slash::before {
content: "\f4fa";
}
.fa-envelope-open::before {
content: "\f2b6";
}
.fa-handshake-simple-slash::before {
content: "\e05f";
}
.fa-handshake-alt-slash::before {
content: "\e05f";
}
.fa-mattress-pillow::before {
content: "\e525";
}
.fa-guarani-sign::before {
content: "\e19a";
}
.fa-arrows-rotate::before {
content: "\f021";
}
.fa-refresh::before {
content: "\f021";
}
.fa-sync::before {
content: "\f021";
}
.fa-fire-extinguisher::before {
content: "\f134";
}
.fa-cruzeiro-sign::before {
content: "\e152";
}
.fa-greater-than-equal::before {
content: "\f532";
}
.fa-shield-halved::before {
content: "\f3ed";
}
.fa-shield-alt::before {
content: "\f3ed";
}
.fa-book-atlas::before {
content: "\f558";
}
.fa-atlas::before {
content: "\f558";
}
.fa-virus::before {
content: "\e074";
}
.fa-envelope-circle-check::before {
content: "\e4e8";
}
.fa-layer-group::before {
content: "\f5fd";
}
.fa-arrows-to-dot::before {
content: "\e4be";
}
.fa-archway::before {
content: "\f557";
}
.fa-heart-circle-check::before {
content: "\e4fd";
}
.fa-house-chimney-crack::before {
content: "\f6f1";
}
.fa-house-damage::before {
content: "\f6f1";
}
.fa-file-zipper::before {
content: "\f1c6";
}
.fa-file-archive::before {
content: "\f1c6";
}
.fa-square::before {
content: "\f0c8";
}
.fa-martini-glass-empty::before {
content: "\f000";
}
.fa-glass-martini::before {
content: "\f000";
}
.fa-couch::before {
content: "\f4b8";
}
.fa-cedi-sign::before {
content: "\e0df";
}
.fa-italic::before {
content: "\f033";
}
.fa-table-cells-column-lock::before {
content: "\e678";
}
.fa-church::before {
content: "\f51d";
}
.fa-comments-dollar::before {
content: "\f653";
}
.fa-democrat::before {
content: "\f747";
}
.fa-z::before {
content: "Z";
}
.fa-person-skiing::before {
content: "\f7c9";
}
.fa-skiing::before {
content: "\f7c9";
}
.fa-road-lock::before {
content: "\e567";
}
.fa-a::before {
content: "A";
}
.fa-temperature-arrow-down::before {
content: "\e03f";
}
.fa-temperature-down::before {
content: "\e03f";
}
.fa-feather-pointed::before {
content: "\f56b";
}
.fa-feather-alt::before {
content: "\f56b";
}
.fa-p::before {
content: "P";
}
.fa-snowflake::before {
content: "\f2dc";
}
.fa-newspaper::before {
content: "\f1ea";
}
.fa-rectangle-ad::before {
content: "\f641";
}
.fa-ad::before {
content: "\f641";
}
.fa-circle-arrow-right::before {
content: "\f0a9";
}
.fa-arrow-circle-right::before {
content: "\f0a9";
}
.fa-filter-circle-xmark::before {
content: "\e17b";
}
.fa-locust::before {
content: "\e520";
}
.fa-sort::before {
content: "\f0dc";
}
.fa-unsorted::before {
content: "\f0dc";
}
.fa-list-ol::before {
content: "\f0cb";
}
.fa-list-1-2::before {
content: "\f0cb";
}
.fa-list-numeric::before {
content: "\f0cb";
}
.fa-person-dress-burst::before {
content: "\e544";
}
.fa-money-check-dollar::before {
content: "\f53d";
}
.fa-money-check-alt::before {
content: "\f53d";
}
.fa-vector-square::before {
content: "\f5cb";
}
.fa-bread-slice::before {
content: "\f7ec";
}
.fa-language::before {
content: "\f1ab";
}
.fa-face-kiss-wink-heart::before {
content: "\f598";
}
.fa-kiss-wink-heart::before {
content: "\f598";
}
.fa-filter::before {
content: "\f0b0";
}
.fa-question::before {
content: "\?";
}
.fa-file-signature::before {
content: "\f573";
}
.fa-up-down-left-right::before {
content: "\f0b2";
}
.fa-arrows-alt::before {
content: "\f0b2";
}
.fa-house-chimney-user::before {
content: "\e065";
}
.fa-hand-holding-heart::before {
content: "\f4be";
}
.fa-puzzle-piece::before {
content: "\f12e";
}
.fa-money-check::before {
content: "\f53c";
}
.fa-star-half-stroke::before {
content: "\f5c0";
}
.fa-star-half-alt::before {
content: "\f5c0";
}
.fa-code::before {
content: "\f121";
}
.fa-whiskey-glass::before {
content: "\f7a0";
}
.fa-glass-whiskey::before {
content: "\f7a0";
}
.fa-building-circle-exclamation::before {
content: "\e4d3";
}
.fa-magnifying-glass-chart::before {
content: "\e522";
}
.fa-arrow-up-right-from-square::before {
content: "\f08e";
}
.fa-external-link::before {
content: "\f08e";
}
.fa-cubes-stacked::before {
content: "\e4e6";
}
.fa-won-sign::before {
content: "\f159";
}
.fa-krw::before {
content: "\f159";
}
.fa-won::before {
content: "\f159";
}
.fa-virus-covid::before {
content: "\e4a8";
}
.fa-austral-sign::before {
content: "\e0a9";
}
.fa-f::before {
content: "F";
}
.fa-leaf::before {
content: "\f06c";
}
.fa-road::before {
content: "\f018";
}
.fa-taxi::before {
content: "\f1ba";
}
.fa-cab::before {
content: "\f1ba";
}
.fa-person-circle-plus::before {
content: "\e541";
}
.fa-chart-pie::before {
content: "\f200";
}
.fa-pie-chart::before {
content: "\f200";
}
.fa-bolt-lightning::before {
content: "\e0b7";
}
.fa-sack-xmark::before {
content: "\e56a";
}
.fa-file-excel::before {
content: "\f1c3";
}
.fa-file-contract::before {
content: "\f56c";
}
.fa-fish-fins::before {
content: "\e4f2";
}
.fa-building-flag::before {
content: "\e4d5";
}
.fa-face-grin-beam::before {
content: "\f582";
}
.fa-grin-beam::before {
content: "\f582";
}
.fa-object-ungroup::before {
content: "\f248";
}
.fa-poop::before {
content: "\f619";
}
.fa-location-pin::before {
content: "\f041";
}
.fa-map-marker::before {
content: "\f041";
}
.fa-kaaba::before {
content: "\f66b";
}
.fa-toilet-paper::before {
content: "\f71e";
}
.fa-helmet-safety::before {
content: "\f807";
}
.fa-hard-hat::before {
content: "\f807";
}
.fa-hat-hard::before {
content: "\f807";
}
.fa-eject::before {
content: "\f052";
}
.fa-circle-right::before {
content: "\f35a";
}
.fa-arrow-alt-circle-right::before {
content: "\f35a";
}
.fa-plane-circle-check::before {
content: "\e555";
}
.fa-face-rolling-eyes::before {
content: "\f5a5";
}
.fa-meh-rolling-eyes::before {
content: "\f5a5";
}
.fa-object-group::before {
content: "\f247";
}
.fa-chart-line::before {
content: "\f201";
}
.fa-line-chart::before {
content: "\f201";
}
.fa-mask-ventilator::before {
content: "\e524";
}
.fa-arrow-right::before {
content: "\f061";
}
.fa-signs-post::before {
content: "\f277";
}
.fa-map-signs::before {
content: "\f277";
}
.fa-cash-register::before {
content: "\f788";
}
.fa-person-circle-question::before {
content: "\e542";
}
.fa-h::before {
content: "H";
}
.fa-tarp::before {
content: "\e57b";
}
.fa-screwdriver-wrench::before {
content: "\f7d9";
}
.fa-tools::before {
content: "\f7d9";
}
.fa-arrows-to-eye::before {
content: "\e4bf";
}
.fa-plug-circle-bolt::before {
content: "\e55b";
}
.fa-heart::before {
content: "\f004";
}
.fa-mars-and-venus::before {
content: "\f224";
}
.fa-house-user::before {
content: "\e1b0";
}
.fa-home-user::before {
content: "\e1b0";
}
.fa-dumpster-fire::before {
content: "\f794";
}
.fa-house-crack::before {
content: "\e3b1";
}
.fa-martini-glass-citrus::before {
content: "\f561";
}
.fa-cocktail::before {
content: "\f561";
}
.fa-face-surprise::before {
content: "\f5c2";
}
.fa-surprise::before {
content: "\f5c2";
}
.fa-bottle-water::before {
content: "\e4c5";
}
.fa-circle-pause::before {
content: "\f28b";
}
.fa-pause-circle::before {
content: "\f28b";
}
.fa-toilet-paper-slash::before {
content: "\e072";
}
.fa-apple-whole::before {
content: "\f5d1";
}
.fa-apple-alt::before {
content: "\f5d1";
}
.fa-kitchen-set::before {
content: "\e51a";
}
.fa-r::before {
content: "R";
}
.fa-temperature-quarter::before {
content: "\f2ca";
}
.fa-temperature-1::before {
content: "\f2ca";
}
.fa-thermometer-1::before {
content: "\f2ca";
}
.fa-thermometer-quarter::before {
content: "\f2ca";
}
.fa-cube::before {
content: "\f1b2";
}
.fa-bitcoin-sign::before {
content: "\e0b4";
}
.fa-shield-dog::before {
content: "\e573";
}
.fa-solar-panel::before {
content: "\f5ba";
}
.fa-lock-open::before {
content: "\f3c1";
}
.fa-elevator::before {
content: "\e16d";
}
.fa-money-bill-transfer::before {
content: "\e528";
}
.fa-money-bill-trend-up::before {
content: "\e529";
}
.fa-house-flood-water-circle-arrow-right::before {
content: "\e50f";
}
.fa-square-poll-horizontal::before {
content: "\f682";
}
.fa-poll-h::before {
content: "\f682";
}
.fa-circle::before {
content: "\f111";
}
.fa-backward-fast::before {
content: "\f049";
}
.fa-fast-backward::before {
content: "\f049";
}
.fa-recycle::before {
content: "\f1b8";
}
.fa-user-astronaut::before {
content: "\f4fb";
}
.fa-plane-slash::before {
content: "\e069";
}
.fa-trademark::before {
content: "\f25c";
}
.fa-basketball::before {
content: "\f434";
}
.fa-basketball-ball::before {
content: "\f434";
}
.fa-satellite-dish::before {
content: "\f7c0";
}
.fa-circle-up::before {
content: "\f35b";
}
.fa-arrow-alt-circle-up::before {
content: "\f35b";
}
.fa-mobile-screen-button::before {
content: "\f3cd";
}
.fa-mobile-alt::before {
content: "\f3cd";
}
.fa-volume-high::before {
content: "\f028";
}
.fa-volume-up::before {
content: "\f028";
}
.fa-users-rays::before {
content: "\e593";
}
.fa-wallet::before {
content: "\f555";
}
.fa-clipboard-check::before {
content: "\f46c";
}
.fa-file-audio::before {
content: "\f1c7";
}
.fa-burger::before {
content: "\f805";
}
.fa-hamburger::before {
content: "\f805";
}
.fa-wrench::before {
content: "\f0ad";
}
.fa-bugs::before {
content: "\e4d0";
}
.fa-rupee-sign::before {
content: "\f156";
}
.fa-rupee::before {
content: "\f156";
}
.fa-file-image::before {
content: "\f1c5";
}
.fa-circle-question::before {
content: "\f059";
}
.fa-question-circle::before {
content: "\f059";
}
.fa-plane-departure::before {
content: "\f5b0";
}
.fa-handshake-slash::before {
content: "\e060";
}
.fa-book-bookmark::before {
content: "\e0bb";
}
.fa-code-branch::before {
content: "\f126";
}
.fa-hat-cowboy::before {
content: "\f8c0";
}
.fa-bridge::before {
content: "\e4c8";
}
.fa-phone-flip::before {
content: "\f879";
}
.fa-phone-alt::before {
content: "\f879";
}
.fa-truck-front::before {
content: "\e2b7";
}
.fa-cat::before {
content: "\f6be";
}
.fa-anchor-circle-exclamation::before {
content: "\e4ab";
}
.fa-truck-field::before {
content: "\e58d";
}
.fa-route::before {
content: "\f4d7";
}
.fa-clipboard-question::before {
content: "\e4e3";
}
.fa-panorama::before {
content: "\e209";
}
.fa-comment-medical::before {
content: "\f7f5";
}
.fa-teeth-open::before {
content: "\f62f";
}
.fa-file-circle-minus::before {
content: "\e4ed";
}
.fa-tags::before {
content: "\f02c";
}
.fa-wine-glass::before {
content: "\f4e3";
}
.fa-forward-fast::before {
content: "\f050";
}
.fa-fast-forward::before {
content: "\f050";
}
.fa-face-meh-blank::before {
content: "\f5a4";
}
.fa-meh-blank::before {
content: "\f5a4";
}
.fa-square-parking::before {
content: "\f540";
}
.fa-parking::before {
content: "\f540";
}
.fa-house-signal::before {
content: "\e012";
}
.fa-bars-progress::before {
content: "\f828";
}
.fa-tasks-alt::before {
content: "\f828";
}
.fa-faucet-drip::before {
content: "\e006";
}
.fa-cart-flatbed::before {
content: "\f474";
}
.fa-dolly-flatbed::before {
content: "\f474";
}
.fa-ban-smoking::before {
content: "\f54d";
}
.fa-smoking-ban::before {
content: "\f54d";
}
.fa-terminal::before {
content: "\f120";
}
.fa-mobile-button::before {
content: "\f10b";
}
.fa-house-medical-flag::before {
content: "\e514";
}
.fa-basket-shopping::before {
content: "\f291";
}
.fa-shopping-basket::before {
content: "\f291";
}
.fa-tape::before {
content: "\f4db";
}
.fa-bus-simple::before {
content: "\f55e";
}
.fa-bus-alt::before {
content: "\f55e";
}
.fa-eye::before {
content: "\f06e";
}
.fa-face-sad-cry::before {
content: "\f5b3";
}
.fa-sad-cry::before {
content: "\f5b3";
}
.fa-audio-description::before {
content: "\f29e";
}
.fa-person-military-to-person::before {
content: "\e54c";
}
.fa-file-shield::before {
content: "\e4f0";
}
.fa-user-slash::before {
content: "\f506";
}
.fa-pen::before {
content: "\f304";
}
.fa-tower-observation::before {
content: "\e586";
}
.fa-file-code::before {
content: "\f1c9";
}
.fa-signal::before {
content: "\f012";
}
.fa-signal-5::before {
content: "\f012";
}
.fa-signal-perfect::before {
content: "\f012";
}
.fa-bus::before {
content: "\f207";
}
.fa-heart-circle-xmark::before {
content: "\e501";
}
.fa-house-chimney::before {
content: "\e3af";
}
.fa-home-lg::before {
content: "\e3af";
}
.fa-window-maximize::before {
content: "\f2d0";
}
.fa-face-frown::before {
content: "\f119";
}
.fa-frown::before {
content: "\f119";
}
.fa-prescription::before {
content: "\f5b1";
}
.fa-shop::before {
content: "\f54f";
}
.fa-store-alt::before {
content: "\f54f";
}
.fa-floppy-disk::before {
content: "\f0c7";
}
.fa-save::before {
content: "\f0c7";
}
.fa-vihara::before {
content: "\f6a7";
}
.fa-scale-unbalanced::before {
content: "\f515";
}
.fa-balance-scale-left::before {
content: "\f515";
}
.fa-sort-up::before {
content: "\f0de";
}
.fa-sort-asc::before {
content: "\f0de";
}
.fa-comment-dots::before {
content: "\f4ad";
}
.fa-commenting::before {
content: "\f4ad";
}
.fa-plant-wilt::before {
content: "\e5aa";
}
.fa-diamond::before {
content: "\f219";
}
.fa-face-grin-squint::before {
content: "\f585";
}
.fa-grin-squint::before {
content: "\f585";
}
.fa-hand-holding-dollar::before {
content: "\f4c0";
}
.fa-hand-holding-usd::before {
content: "\f4c0";
}
.fa-bacterium::before {
content: "\e05a";
}
.fa-hand-pointer::before {
content: "\f25a";
}
.fa-drum-steelpan::before {
content: "\f56a";
}
.fa-hand-scissors::before {
content: "\f257";
}
.fa-hands-praying::before {
content: "\f684";
}
.fa-praying-hands::before {
content: "\f684";
}
.fa-arrow-rotate-right::before {
content: "\f01e";
}
.fa-arrow-right-rotate::before {
content: "\f01e";
}
.fa-arrow-rotate-forward::before {
content: "\f01e";
}
.fa-redo::before {
content: "\f01e";
}
.fa-biohazard::before {
content: "\f780";
}
.fa-location-crosshairs::before {
content: "\f601";
}
.fa-location::before {
content: "\f601";
}
.fa-mars-double::before {
content: "\f227";
}
.fa-child-dress::before {
content: "\e59c";
}
.fa-users-between-lines::before {
content: "\e591";
}
.fa-lungs-virus::before {
content: "\e067";
}
.fa-face-grin-tears::before {
content: "\f588";
}
.fa-grin-tears::before {
content: "\f588";
}
.fa-phone::before {
content: "\f095";
}
.fa-calendar-xmark::before {
content: "\f273";
}
.fa-calendar-times::before {
content: "\f273";
}
.fa-child-reaching::before {
content: "\e59d";
}
.fa-head-side-virus::before {
content: "\e064";
}
.fa-user-gear::before {
content: "\f4fe";
}
.fa-user-cog::before {
content: "\f4fe";
}
.fa-arrow-up-1-9::before {
content: "\f163";
}
.fa-sort-numeric-up::before {
content: "\f163";
}
.fa-door-closed::before {
content: "\f52a";
}
.fa-shield-virus::before {
content: "\e06c";
}
.fa-dice-six::before {
content: "\f526";
}
.fa-mosquito-net::before {
content: "\e52c";
}
.fa-bridge-water::before {
content: "\e4ce";
}
.fa-person-booth::before {
content: "\f756";
}
.fa-text-width::before {
content: "\f035";
}
.fa-hat-wizard::before {
content: "\f6e8";
}
.fa-pen-fancy::before {
content: "\f5ac";
}
.fa-person-digging::before {
content: "\f85e";
}
.fa-digging::before {
content: "\f85e";
}
.fa-trash::before {
content: "\f1f8";
}
.fa-gauge-simple::before {
content: "\f629";
}
.fa-gauge-simple-med::before {
content: "\f629";
}
.fa-tachometer-average::before {
content: "\f629";
}
.fa-book-medical::before {
content: "\f7e6";
}
.fa-poo::before {
content: "\f2fe";
}
.fa-quote-right::before {
content: "\f10e";
}
.fa-quote-right-alt::before {
content: "\f10e";
}
.fa-shirt::before {
content: "\f553";
}
.fa-t-shirt::before {
content: "\f553";
}
.fa-tshirt::before {
content: "\f553";
}
.fa-cubes::before {
content: "\f1b3";
}
.fa-divide::before {
content: "\f529";
}
.fa-tenge-sign::before {
content: "\f7d7";
}
.fa-tenge::before {
content: "\f7d7";
}
.fa-headphones::before {
content: "\f025";
}
.fa-hands-holding::before {
content: "\f4c2";
}
.fa-hands-clapping::before {
content: "\e1a8";
}
.fa-republican::before {
content: "\f75e";
}
.fa-arrow-left::before {
content: "\f060";
}
.fa-person-circle-xmark::before {
content: "\e543";
}
.fa-ruler::before {
content: "\f545";
}
.fa-align-left::before {
content: "\f036";
}
.fa-dice-d6::before {
content: "\f6d1";
}
.fa-restroom::before {
content: "\f7bd";
}
.fa-j::before {
content: "J";
}
.fa-users-viewfinder::before {
content: "\e595";
}
.fa-file-video::before {
content: "\f1c8";
}
.fa-up-right-from-square::before {
content: "\f35d";
}
.fa-external-link-alt::before {
content: "\f35d";
}
.fa-table-cells::before {
content: "\f00a";
}
.fa-th::before {
content: "\f00a";
}
.fa-file-pdf::before {
content: "\f1c1";
}
.fa-book-bible::before {
content: "\f647";
}
.fa-bible::before {
content: "\f647";
}
.fa-o::before {
content: "O";
}
.fa-suitcase-medical::before {
content: "\f0fa";
}
.fa-medkit::before {
content: "\f0fa";
}
.fa-user-secret::before {
content: "\f21b";
}
.fa-otter::before {
content: "\f700";
}
.fa-person-dress::before {
content: "\f182";
}
.fa-female::before {
content: "\f182";
}
.fa-comment-dollar::before {
content: "\f651";
}
.fa-business-time::before {
content: "\f64a";
}
.fa-briefcase-clock::before {
content: "\f64a";
}
.fa-table-cells-large::before {
content: "\f009";
}
.fa-th-large::before {
content: "\f009";
}
.fa-book-tanakh::before {
content: "\f827";
}
.fa-tanakh::before {
content: "\f827";
}
.fa-phone-volume::before {
content: "\f2a0";
}
.fa-volume-control-phone::before {
content: "\f2a0";
}
.fa-hat-cowboy-side::before {
content: "\f8c1";
}
.fa-clipboard-user::before {
content: "\f7f3";
}
.fa-child::before {
content: "\f1ae";
}
.fa-lira-sign::before {
content: "\f195";
}
.fa-satellite::before {
content: "\f7bf";
}
.fa-plane-lock::before {
content: "\e558";
}
.fa-tag::before {
content: "\f02b";
}
.fa-comment::before {
content: "\f075";
}
.fa-cake-candles::before {
content: "\f1fd";
}
.fa-birthday-cake::before {
content: "\f1fd";
}
.fa-cake::before {
content: "\f1fd";
}
.fa-envelope::before {
content: "\f0e0";
}
.fa-angles-up::before {
content: "\f102";
}
.fa-angle-double-up::before {
content: "\f102";
}
.fa-paperclip::before {
content: "\f0c6";
}
.fa-arrow-right-to-city::before {
content: "\e4b3";
}
.fa-ribbon::before {
content: "\f4d6";
}
.fa-lungs::before {
content: "\f604";
}
.fa-arrow-up-9-1::before {
content: "\f887";
}
.fa-sort-numeric-up-alt::before {
content: "\f887";
}
.fa-litecoin-sign::before {
content: "\e1d3";
}
.fa-border-none::before {
content: "\f850";
}
.fa-circle-nodes::before {
content: "\e4e2";
}
.fa-parachute-box::before {
content: "\f4cd";
}
.fa-indent::before {
content: "\f03c";
}
.fa-truck-field-un::before {
content: "\e58e";
}
.fa-hourglass::before {
content: "\f254";
}
.fa-hourglass-empty::before {
content: "\f254";
}
.fa-mountain::before {
content: "\f6fc";
}
.fa-user-doctor::before {
content: "\f0f0";
}
.fa-user-md::before {
content: "\f0f0";
}
.fa-circle-info::before {
content: "\f05a";
}
.fa-info-circle::before {
content: "\f05a";
}
.fa-cloud-meatball::before {
content: "\f73b";
}
.fa-camera::before {
content: "\f030";
}
.fa-camera-alt::before {
content: "\f030";
}
.fa-square-virus::before {
content: "\e578";
}
.fa-meteor::before {
content: "\f753";
}
.fa-car-on::before {
content: "\e4dd";
}
.fa-sleigh::before {
content: "\f7cc";
}
.fa-arrow-down-1-9::before {
content: "\f162";
}
.fa-sort-numeric-asc::before {
content: "\f162";
}
.fa-sort-numeric-down::before {
content: "\f162";
}
.fa-hand-holding-droplet::before {
content: "\f4c1";
}
.fa-hand-holding-water::before {
content: "\f4c1";
}
.fa-water::before {
content: "\f773";
}
.fa-calendar-check::before {
content: "\f274";
}
.fa-braille::before {
content: "\f2a1";
}
.fa-prescription-bottle-medical::before {
content: "\f486";
}
.fa-prescription-bottle-alt::before {
content: "\f486";
}
.fa-landmark::before {
content: "\f66f";
}
.fa-truck::before {
content: "\f0d1";
}
.fa-crosshairs::before {
content: "\f05b";
}
.fa-person-cane::before {
content: "\e53c";
}
.fa-tent::before {
content: "\e57d";
}
.fa-vest-patches::before {
content: "\e086";
}
.fa-check-double::before {
content: "\f560";
}
.fa-arrow-down-a-z::before {
content: "\f15d";
}
.fa-sort-alpha-asc::before {
content: "\f15d";
}
.fa-sort-alpha-down::before {
content: "\f15d";
}
.fa-money-bill-wheat::before {
content: "\e52a";
}
.fa-cookie::before {
content: "\f563";
}
.fa-arrow-rotate-left::before {
content: "\f0e2";
}
.fa-arrow-left-rotate::before {
content: "\f0e2";
}
.fa-arrow-rotate-back::before {
content: "\f0e2";
}
.fa-arrow-rotate-backward::before {
content: "\f0e2";
}
.fa-undo::before {
content: "\f0e2";
}
.fa-hard-drive::before {
content: "\f0a0";
}
.fa-hdd::before {
content: "\f0a0";
}
.fa-face-grin-squint-tears::before {
content: "\f586";
}
.fa-grin-squint-tears::before {
content: "\f586";
}
.fa-dumbbell::before {
content: "\f44b";
}
.fa-rectangle-list::before {
content: "\f022";
}
.fa-list-alt::before {
content: "\f022";
}
.fa-tarp-droplet::before {
content: "\e57c";
}
.fa-house-medical-circle-check::before {
content: "\e511";
}
.fa-person-skiing-nordic::before {
content: "\f7ca";
}
.fa-skiing-nordic::before {
content: "\f7ca";
}
.fa-calendar-plus::before {
content: "\f271";
}
.fa-plane-arrival::before {
content: "\f5af";
}
.fa-circle-left::before {
content: "\f359";
}
.fa-arrow-alt-circle-left::before {
content: "\f359";
}
.fa-train-subway::before {
content: "\f239";
}
.fa-subway::before {
content: "\f239";
}
.fa-chart-gantt::before {
content: "\e0e4";
}
.fa-indian-rupee-sign::before {
content: "\e1bc";
}
.fa-indian-rupee::before {
content: "\e1bc";
}
.fa-inr::before {
content: "\e1bc";
}
.fa-crop-simple::before {
content: "\f565";
}
.fa-crop-alt::before {
content: "\f565";
}
.fa-money-bill-1::before {
content: "\f3d1";
}
.fa-money-bill-alt::before {
content: "\f3d1";
}
.fa-left-long::before {
content: "\f30a";
}
.fa-long-arrow-alt-left::before {
content: "\f30a";
}
.fa-dna::before {
content: "\f471";
}
.fa-virus-slash::before {
content: "\e075";
}
.fa-minus::before {
content: "\f068";
}
.fa-subtract::before {
content: "\f068";
}
.fa-chess::before {
content: "\f439";
}
.fa-arrow-left-long::before {
content: "\f177";
}
.fa-long-arrow-left::before {
content: "\f177";
}
.fa-plug-circle-check::before {
content: "\e55c";
}
.fa-street-view::before {
content: "\f21d";
}
.fa-franc-sign::before {
content: "\e18f";
}
.fa-volume-off::before {
content: "\f026";
}
.fa-hands-asl-interpreting::before {
content: "\f2a3";
}
.fa-american-sign-language-interpreting::before {
content: "\f2a3";
}
.fa-asl-interpreting::before {
content: "\f2a3";
}
.fa-hands-american-sign-language-interpreting::before {
content: "\f2a3";
}
.fa-gear::before {
content: "\f013";
}
.fa-cog::before {
content: "\f013";
}
.fa-droplet-slash::before {
content: "\f5c7";
}
.fa-tint-slash::before {
content: "\f5c7";
}
.fa-mosque::before {
content: "\f678";
}
.fa-mosquito::before {
content: "\e52b";
}
.fa-star-of-david::before {
content: "\f69a";
}
.fa-person-military-rifle::before {
content: "\e54b";
}
.fa-cart-shopping::before {
content: "\f07a";
}
.fa-shopping-cart::before {
content: "\f07a";
}
.fa-vials::before {
content: "\f493";
}
.fa-plug-circle-plus::before {
content: "\e55f";
}
.fa-place-of-worship::before {
content: "\f67f";
}
.fa-grip-vertical::before {
content: "\f58e";
}
.fa-arrow-turn-up::before {
content: "\f148";
}
.fa-level-up::before {
content: "\f148";
}
.fa-u::before {
content: "U";
}
.fa-square-root-variable::before {
content: "\f698";
}
.fa-square-root-alt::before {
content: "\f698";
}
.fa-clock::before {
content: "\f017";
}
.fa-clock-four::before {
content: "\f017";
}
.fa-backward-step::before {
content: "\f048";
}
.fa-step-backward::before {
content: "\f048";
}
.fa-pallet::before {
content: "\f482";
}
.fa-faucet::before {
content: "\e005";
}
.fa-baseball-bat-ball::before {
content: "\f432";
}
.fa-s::before {
content: "S";
}
.fa-timeline::before {
content: "\e29c";
}
.fa-keyboard::before {
content: "\f11c";
}
.fa-caret-down::before {
content: "\f0d7";
}
.fa-house-chimney-medical::before {
content: "\f7f2";
}
.fa-clinic-medical::before {
content: "\f7f2";
}
.fa-temperature-three-quarters::before {
content: "\f2c8";
}
.fa-temperature-3::before {
content: "\f2c8";
}
.fa-thermometer-3::before {
content: "\f2c8";
}
.fa-thermometer-three-quarters::before {
content: "\f2c8";
}
.fa-mobile-screen::before {
content: "\f3cf";
}
.fa-mobile-android-alt::before {
content: "\f3cf";
}
.fa-plane-up::before {
content: "\e22d";
}
.fa-piggy-bank::before {
content: "\f4d3";
}
.fa-battery-half::before {
content: "\f242";
}
.fa-battery-3::before {
content: "\f242";
}
.fa-mountain-city::before {
content: "\e52e";
}
.fa-coins::before {
content: "\f51e";
}
.fa-khanda::before {
content: "\f66d";
}
.fa-sliders::before {
content: "\f1de";
}
.fa-sliders-h::before {
content: "\f1de";
}
.fa-folder-tree::before {
content: "\f802";
}
.fa-network-wired::before {
content: "\f6ff";
}
.fa-map-pin::before {
content: "\f276";
}
.fa-hamsa::before {
content: "\f665";
}
.fa-cent-sign::before {
content: "\e3f5";
}
.fa-flask::before {
content: "\f0c3";
}
.fa-person-pregnant::before {
content: "\e31e";
}
.fa-wand-sparkles::before {
content: "\f72b";
}
.fa-ellipsis-vertical::before {
content: "\f142";
}
.fa-ellipsis-v::before {
content: "\f142";
}
.fa-ticket::before {
content: "\f145";
}
.fa-power-off::before {
content: "\f011";
}
.fa-right-long::before {
content: "\f30b";
}
.fa-long-arrow-alt-right::before {
content: "\f30b";
}
.fa-flag-usa::before {
content: "\f74d";
}
.fa-laptop-file::before {
content: "\e51d";
}
.fa-tty::before {
content: "\f1e4";
}
.fa-teletype::before {
content: "\f1e4";
}
.fa-diagram-next::before {
content: "\e476";
}
.fa-person-rifle::before {
content: "\e54e";
}
.fa-house-medical-circle-exclamation::before {
content: "\e512";
}
.fa-closed-captioning::before {
content: "\f20a";
}
.fa-person-hiking::before {
content: "\f6ec";
}
.fa-hiking::before {
content: "\f6ec";
}
.fa-venus-double::before {
content: "\f226";
}
.fa-images::before {
content: "\f302";
}
.fa-calculator::before {
content: "\f1ec";
}
.fa-people-pulling::before {
content: "\e535";
}
.fa-n::before {
content: "N";
}
.fa-cable-car::before {
content: "\f7da";
}
.fa-tram::before {
content: "\f7da";
}
.fa-cloud-rain::before {
content: "\f73d";
}
.fa-building-circle-xmark::before {
content: "\e4d4";
}
.fa-ship::before {
content: "\f21a";
}
.fa-arrows-down-to-line::before {
content: "\e4b8";
}
.fa-download::before {
content: "\f019";
}
.fa-face-grin::before {
content: "\f580";
}
.fa-grin::before {
content: "\f580";
}
.fa-delete-left::before {
content: "\f55a";
}
.fa-backspace::before {
content: "\f55a";
}
.fa-eye-dropper::before {
content: "\f1fb";
}
.fa-eye-dropper-empty::before {
content: "\f1fb";
}
.fa-eyedropper::before {
content: "\f1fb";
}
.fa-file-circle-check::before {
content: "\e5a0";
}
.fa-forward::before {
content: "\f04e";
}
.fa-mobile::before {
content: "\f3ce";
}
.fa-mobile-android::before {
content: "\f3ce";
}
.fa-mobile-phone::before {
content: "\f3ce";
}
.fa-face-meh::before {
content: "\f11a";
}
.fa-meh::before {
content: "\f11a";
}
.fa-align-center::before {
content: "\f037";
}
.fa-book-skull::before {
content: "\f6b7";
}
.fa-book-dead::before {
content: "\f6b7";
}
.fa-id-card::before {
content: "\f2c2";
}
.fa-drivers-license::before {
content: "\f2c2";
}
.fa-outdent::before {
content: "\f03b";
}
.fa-dedent::before {
content: "\f03b";
}
.fa-heart-circle-exclamation::before {
content: "\e4fe";
}
.fa-house::before {
content: "\f015";
}
.fa-home::before {
content: "\f015";
}
.fa-home-alt::before {
content: "\f015";
}
.fa-home-lg-alt::before {
content: "\f015";
}
.fa-calendar-week::before {
content: "\f784";
}
.fa-laptop-medical::before {
content: "\f812";
}
.fa-b::before {
content: "B";
}
.fa-file-medical::before {
content: "\f477";
}
.fa-dice-one::before {
content: "\f525";
}
.fa-kiwi-bird::before {
content: "\f535";
}
.fa-arrow-right-arrow-left::before {
content: "\f0ec";
}
.fa-exchange::before {
content: "\f0ec";
}
.fa-rotate-right::before {
content: "\f2f9";
}
.fa-redo-alt::before {
content: "\f2f9";
}
.fa-rotate-forward::before {
content: "\f2f9";
}
.fa-utensils::before {
content: "\f2e7";
}
.fa-cutlery::before {
content: "\f2e7";
}
.fa-arrow-up-wide-short::before {
content: "\f161";
}
.fa-sort-amount-up::before {
content: "\f161";
}
.fa-mill-sign::before {
content: "\e1ed";
}
.fa-bowl-rice::before {
content: "\e2eb";
}
.fa-skull::before {
content: "\f54c";
}
.fa-tower-broadcast::before {
content: "\f519";
}
.fa-broadcast-tower::before {
content: "\f519";
}
.fa-truck-pickup::before {
content: "\f63c";
}
.fa-up-long::before {
content: "\f30c";
}
.fa-long-arrow-alt-up::before {
content: "\f30c";
}
.fa-stop::before {
content: "\f04d";
}
.fa-code-merge::before {
content: "\f387";
}
.fa-upload::before {
content: "\f093";
}
.fa-hurricane::before {
content: "\f751";
}
.fa-mound::before {
content: "\e52d";
}
.fa-toilet-portable::before {
content: "\e583";
}
.fa-compact-disc::before {
content: "\f51f";
}
.fa-file-arrow-down::before {
content: "\f56d";
}
.fa-file-download::before {
content: "\f56d";
}
.fa-caravan::before {
content: "\f8ff";
}
.fa-shield-cat::before {
content: "\e572";
}
.fa-bolt::before {
content: "\f0e7";
}
.fa-zap::before {
content: "\f0e7";
}
.fa-glass-water::before {
content: "\e4f4";
}
.fa-oil-well::before {
content: "\e532";
}
.fa-vault::before {
content: "\e2c5";
}
.fa-mars::before {
content: "\f222";
}
.fa-toilet::before {
content: "\f7d8";
}
.fa-plane-circle-xmark::before {
content: "\e557";
}
.fa-yen-sign::before {
content: "\f157";
}
.fa-cny::before {
content: "\f157";
}
.fa-jpy::before {
content: "\f157";
}
.fa-rmb::before {
content: "\f157";
}
.fa-yen::before {
content: "\f157";
}
.fa-ruble-sign::before {
content: "\f158";
}
.fa-rouble::before {
content: "\f158";
}
.fa-rub::before {
content: "\f158";
}
.fa-ruble::before {
content: "\f158";
}
.fa-sun::before {
content: "\f185";
}
.fa-guitar::before {
content: "\f7a6";
}
.fa-face-laugh-wink::before {
content: "\f59c";
}
.fa-laugh-wink::before {
content: "\f59c";
}
.fa-horse-head::before {
content: "\f7ab";
}
.fa-bore-hole::before {
content: "\e4c3";
}
.fa-industry::before {
content: "\f275";
}
.fa-circle-down::before {
content: "\f358";
}
.fa-arrow-alt-circle-down::before {
content: "\f358";
}
.fa-arrows-turn-to-dots::before {
content: "\e4c1";
}
.fa-florin-sign::before {
content: "\e184";
}
.fa-arrow-down-short-wide::before {
content: "\f884";
}
.fa-sort-amount-desc::before {
content: "\f884";
}
.fa-sort-amount-down-alt::before {
content: "\f884";
}
.fa-less-than::before {
content: "\<";
}
.fa-angle-down::before {
content: "\f107";
}
.fa-car-tunnel::before {
content: "\e4de";
}
.fa-head-side-cough::before {
content: "\e061";
}
.fa-grip-lines::before {
content: "\f7a4";
}
.fa-thumbs-down::before {
content: "\f165";
}
.fa-user-lock::before {
content: "\f502";
}
.fa-arrow-right-long::before {
content: "\f178";
}
.fa-long-arrow-right::before {
content: "\f178";
}
.fa-anchor-circle-xmark::before {
content: "\e4ac";
}
.fa-ellipsis::before {
content: "\f141";
}
.fa-ellipsis-h::before {
content: "\f141";
}
.fa-chess-pawn::before {
content: "\f443";
}
.fa-kit-medical::before {
content: "\f479";
}
.fa-first-aid::before {
content: "\f479";
}
.fa-person-through-window::before {
content: "\e5a9";
}
.fa-toolbox::before {
content: "\f552";
}
.fa-hands-holding-circle::before {
content: "\e4fb";
}
.fa-bug::before {
content: "\f188";
}
.fa-credit-card::before {
content: "\f09d";
}
.fa-credit-card-alt::before {
content: "\f09d";
}
.fa-car::before {
content: "\f1b9";
}
.fa-automobile::before {
content: "\f1b9";
}
.fa-hand-holding-hand::before {
content: "\e4f7";
}
.fa-book-open-reader::before {
content: "\f5da";
}
.fa-book-reader::before {
content: "\f5da";
}
.fa-mountain-sun::before {
content: "\e52f";
}
.fa-arrows-left-right-to-line::before {
content: "\e4ba";
}
.fa-dice-d20::before {
content: "\f6cf";
}
.fa-truck-droplet::before {
content: "\e58c";
}
.fa-file-circle-xmark::before {
content: "\e5a1";
}
.fa-temperature-arrow-up::before {
content: "\e040";
}
.fa-temperature-up::before {
content: "\e040";
}
.fa-medal::before {
content: "\f5a2";
}
.fa-bed::before {
content: "\f236";
}
.fa-square-h::before {
content: "\f0fd";
}
.fa-h-square::before {
content: "\f0fd";
}
.fa-podcast::before {
content: "\f2ce";
}
.fa-temperature-full::before {
content: "\f2c7";
}
.fa-temperature-4::before {
content: "\f2c7";
}
.fa-thermometer-4::before {
content: "\f2c7";
}
.fa-thermometer-full::before {
content: "\f2c7";
}
.fa-bell::before {
content: "\f0f3";
}
.fa-superscript::before {
content: "\f12b";
}
.fa-plug-circle-xmark::before {
content: "\e560";
}
.fa-star-of-life::before {
content: "\f621";
}
.fa-phone-slash::before {
content: "\f3dd";
}
.fa-paint-roller::before {
content: "\f5aa";
}
.fa-handshake-angle::before {
content: "\f4c4";
}
.fa-hands-helping::before {
content: "\f4c4";
}
.fa-location-dot::before {
content: "\f3c5";
}
.fa-map-marker-alt::before {
content: "\f3c5";
}
.fa-file::before {
content: "\f15b";
}
.fa-greater-than::before {
content: "\>";
}
.fa-person-swimming::before {
content: "\f5c4";
}
.fa-swimmer::before {
content: "\f5c4";
}
.fa-arrow-down::before {
content: "\f063";
}
.fa-droplet::before {
content: "\f043";
}
.fa-tint::before {
content: "\f043";
}
.fa-eraser::before {
content: "\f12d";
}
.fa-earth-americas::before {
content: "\f57d";
}
.fa-earth::before {
content: "\f57d";
}
.fa-earth-america::before {
content: "\f57d";
}
.fa-globe-americas::before {
content: "\f57d";
}
.fa-person-burst::before {
content: "\e53b";
}
.fa-dove::before {
content: "\f4ba";
}
.fa-battery-empty::before {
content: "\f244";
}
.fa-battery-0::before {
content: "\f244";
}
.fa-socks::before {
content: "\f696";
}
.fa-inbox::before {
content: "\f01c";
}
.fa-section::before {
content: "\e447";
}
.fa-gauge-high::before {
content: "\f625";
}
.fa-tachometer-alt::before {
content: "\f625";
}
.fa-tachometer-alt-fast::before {
content: "\f625";
}
.fa-envelope-open-text::before {
content: "\f658";
}
.fa-hospital::before {
content: "\f0f8";
}
.fa-hospital-alt::before {
content: "\f0f8";
}
.fa-hospital-wide::before {
content: "\f0f8";
}
.fa-wine-bottle::before {
content: "\f72f";
}
.fa-chess-rook::before {
content: "\f447";
}
.fa-bars-staggered::before {
content: "\f550";
}
.fa-reorder::before {
content: "\f550";
}
.fa-stream::before {
content: "\f550";
}
.fa-dharmachakra::before {
content: "\f655";
}
.fa-hotdog::before {
content: "\f80f";
}
.fa-person-walking-with-cane::before {
content: "\f29d";
}
.fa-blind::before {
content: "\f29d";
}
.fa-drum::before {
content: "\f569";
}
.fa-ice-cream::before {
content: "\f810";
}
.fa-heart-circle-bolt::before {
content: "\e4fc";
}
.fa-fax::before {
content: "\f1ac";
}
.fa-paragraph::before {
content: "\f1dd";
}
.fa-check-to-slot::before {
content: "\f772";
}
.fa-vote-yea::before {
content: "\f772";
}
.fa-star-half::before {
content: "\f089";
}
.fa-boxes-stacked::before {
content: "\f468";
}
.fa-boxes::before {
content: "\f468";
}
.fa-boxes-alt::before {
content: "\f468";
}
.fa-link::before {
content: "\f0c1";
}
.fa-chain::before {
content: "\f0c1";
}
.fa-ear-listen::before {
content: "\f2a2";
}
.fa-assistive-listening-systems::before {
content: "\f2a2";
}
.fa-tree-city::before {
content: "\e587";
}
.fa-play::before {
content: "\f04b";
}
.fa-font::before {
content: "\f031";
}
.fa-table-cells-row-lock::before {
content: "\e67a";
}
.fa-rupiah-sign::before {
content: "\e23d";
}
.fa-magnifying-glass::before {
content: "\f002";
}
.fa-search::before {
content: "\f002";
}
.fa-table-tennis-paddle-ball::before {
content: "\f45d";
}
.fa-ping-pong-paddle-ball::before {
content: "\f45d";
}
.fa-table-tennis::before {
content: "\f45d";
}
.fa-person-dots-from-line::before {
content: "\f470";
}
.fa-diagnoses::before {
content: "\f470";
}
.fa-trash-can-arrow-up::before {
content: "\f82a";
}
.fa-trash-restore-alt::before {
content: "\f82a";
}
.fa-naira-sign::before {
content: "\e1f6";
}
.fa-cart-arrow-down::before {
content: "\f218";
}
.fa-walkie-talkie::before {
content: "\f8ef";
}
.fa-file-pen::before {
content: "\f31c";
}
.fa-file-edit::before {
content: "\f31c";
}
.fa-receipt::before {
content: "\f543";
}
.fa-square-pen::before {
content: "\f14b";
}
.fa-pen-square::before {
content: "\f14b";
}
.fa-pencil-square::before {
content: "\f14b";
}
.fa-suitcase-rolling::before {
content: "\f5c1";
}
.fa-person-circle-exclamation::before {
content: "\e53f";
}
.fa-chevron-down::before {
content: "\f078";
}
.fa-battery-full::before {
content: "\f240";
}
.fa-battery::before {
content: "\f240";
}
.fa-battery-5::before {
content: "\f240";
}
.fa-skull-crossbones::before {
content: "\f714";
}
.fa-code-compare::before {
content: "\e13a";
}
.fa-list-ul::before {
content: "\f0ca";
}
.fa-list-dots::before {
content: "\f0ca";
}
.fa-school-lock::before {
content: "\e56f";
}
.fa-tower-cell::before {
content: "\e585";
}
.fa-down-long::before {
content: "\f309";
}
.fa-long-arrow-alt-down::before {
content: "\f309";
}
.fa-ranking-star::before {
content: "\e561";
}
.fa-chess-king::before {
content: "\f43f";
}
.fa-person-harassing::before {
content: "\e549";
}
.fa-brazilian-real-sign::before {
content: "\e46c";
}
.fa-landmark-dome::before {
content: "\f752";
}
.fa-landmark-alt::before {
content: "\f752";
}
.fa-arrow-up::before {
content: "\f062";
}
.fa-tv::before {
content: "\f26c";
}
.fa-television::before {
content: "\f26c";
}
.fa-tv-alt::before {
content: "\f26c";
}
.fa-shrimp::before {
content: "\e448";
}
.fa-list-check::before {
content: "\f0ae";
}
.fa-tasks::before {
content: "\f0ae";
}
.fa-jug-detergent::before {
content: "\e519";
}
.fa-circle-user::before {
content: "\f2bd";
}
.fa-user-circle::before {
content: "\f2bd";
}
.fa-user-shield::before {
content: "\f505";
}
.fa-wind::before {
content: "\f72e";
}
.fa-car-burst::before {
content: "\f5e1";
}
.fa-car-crash::before {
content: "\f5e1";
}
.fa-y::before {
content: "Y";
}
.fa-person-snowboarding::before {
content: "\f7ce";
}
.fa-snowboarding::before {
content: "\f7ce";
}
.fa-truck-fast::before {
content: "\f48b";
}
.fa-shipping-fast::before {
content: "\f48b";
}
.fa-fish::before {
content: "\f578";
}
.fa-user-graduate::before {
content: "\f501";
}
.fa-circle-half-stroke::before {
content: "\f042";
}
.fa-adjust::before {
content: "\f042";
}
.fa-clapperboard::before {
content: "\e131";
}
.fa-circle-radiation::before {
content: "\f7ba";
}
.fa-radiation-alt::before {
content: "\f7ba";
}
.fa-baseball::before {
content: "\f433";
}
.fa-baseball-ball::before {
content: "\f433";
}
.fa-jet-fighter-up::before {
content: "\e518";
}
.fa-diagram-project::before {
content: "\f542";
}
.fa-project-diagram::before {
content: "\f542";
}
.fa-copy::before {
content: "\f0c5";
}
.fa-volume-xmark::before {
content: "\f6a9";
}
.fa-volume-mute::before {
content: "\f6a9";
}
.fa-volume-times::before {
content: "\f6a9";
}
.fa-hand-sparkles::before {
content: "\e05d";
}
.fa-grip::before {
content: "\f58d";
}
.fa-grip-horizontal::before {
content: "\f58d";
}
.fa-share-from-square::before {
content: "\f14d";
}
.fa-share-square::before {
content: "\f14d";
}
.fa-child-combatant::before {
content: "\e4e0";
}
.fa-child-rifle::before {
content: "\e4e0";
}
.fa-gun::before {
content: "\e19b";
}
.fa-square-phone::before {
content: "\f098";
}
.fa-phone-square::before {
content: "\f098";
}
.fa-plus::before {
content: "\+";
}
.fa-add::before {
content: "\+";
}
.fa-expand::before {
content: "\f065";
}
.fa-computer::before {
content: "\e4e5";
}
.fa-xmark::before {
content: "\f00d";
}
.fa-close::before {
content: "\f00d";
}
.fa-multiply::before {
content: "\f00d";
}
.fa-remove::before {
content: "\f00d";
}
.fa-times::before {
content: "\f00d";
}
.fa-arrows-up-down-left-right::before {
content: "\f047";
}
.fa-arrows::before {
content: "\f047";
}
.fa-chalkboard-user::before {
content: "\f51c";
}
.fa-chalkboard-teacher::before {
content: "\f51c";
}
.fa-peso-sign::before {
content: "\e222";
}
.fa-building-shield::before {
content: "\e4d8";
}
.fa-baby::before {
content: "\f77c";
}
.fa-users-line::before {
content: "\e592";
}
.fa-quote-left::before {
content: "\f10d";
}
.fa-quote-left-alt::before {
content: "\f10d";
}
.fa-tractor::before {
content: "\f722";
}
.fa-trash-arrow-up::before {
content: "\f829";
}
.fa-trash-restore::before {
content: "\f829";
}
.fa-arrow-down-up-lock::before {
content: "\e4b0";
}
.fa-lines-leaning::before {
content: "\e51e";
}
.fa-ruler-combined::before {
content: "\f546";
}
.fa-copyright::before {
content: "\f1f9";
}
.fa-equals::before {
content: "\=";
}
.fa-blender::before {
content: "\f517";
}
.fa-teeth::before {
content: "\f62e";
}
.fa-shekel-sign::before {
content: "\f20b";
}
.fa-ils::before {
content: "\f20b";
}
.fa-shekel::before {
content: "\f20b";
}
.fa-sheqel::before {
content: "\f20b";
}
.fa-sheqel-sign::before {
content: "\f20b";
}
.fa-map::before {
content: "\f279";
}
.fa-rocket::before {
content: "\f135";
}
.fa-photo-film::before {
content: "\f87c";
}
.fa-photo-video::before {
content: "\f87c";
}
.fa-folder-minus::before {
content: "\f65d";
}
.fa-store::before {
content: "\f54e";
}
.fa-arrow-trend-up::before {
content: "\e098";
}
.fa-plug-circle-minus::before {
content: "\e55e";
}
.fa-sign-hanging::before {
content: "\f4d9";
}
.fa-sign::before {
content: "\f4d9";
}
.fa-bezier-curve::before {
content: "\f55b";
}
.fa-bell-slash::before {
content: "\f1f6";
}
.fa-tablet::before {
content: "\f3fb";
}
.fa-tablet-android::before {
content: "\f3fb";
}
.fa-school-flag::before {
content: "\e56e";
}
.fa-fill::before {
content: "\f575";
}
.fa-angle-up::before {
content: "\f106";
}
.fa-drumstick-bite::before {
content: "\f6d7";
}
.fa-holly-berry::before {
content: "\f7aa";
}
.fa-chevron-left::before {
content: "\f053";
}
.fa-bacteria::before {
content: "\e059";
}
.fa-hand-lizard::before {
content: "\f258";
}
.fa-notdef::before {
content: "\e1fe";
}
.fa-disease::before {
content: "\f7fa";
}
.fa-briefcase-medical::before {
content: "\f469";
}
.fa-genderless::before {
content: "\f22d";
}
.fa-chevron-right::before {
content: "\f054";
}
.fa-retweet::before {
content: "\f079";
}
.fa-car-rear::before {
content: "\f5de";
}
.fa-car-alt::before {
content: "\f5de";
}
.fa-pump-soap::before {
content: "\e06b";
}
.fa-video-slash::before {
content: "\f4e2";
}
.fa-battery-quarter::before {
content: "\f243";
}
.fa-battery-2::before {
content: "\f243";
}
.fa-radio::before {
content: "\f8d7";
}
.fa-baby-carriage::before {
content: "\f77d";
}
.fa-carriage-baby::before {
content: "\f77d";
}
.fa-traffic-light::before {
content: "\f637";
}
.fa-thermometer::before {
content: "\f491";
}
.fa-vr-cardboard::before {
content: "\f729";
}
.fa-hand-middle-finger::before {
content: "\f806";
}
.fa-percent::before {
content: "\%";
}
.fa-percentage::before {
content: "\%";
}
.fa-truck-moving::before {
content: "\f4df";
}
.fa-glass-water-droplet::before {
content: "\e4f5";
}
.fa-display::before {
content: "\e163";
}
.fa-face-smile::before {
content: "\f118";
}
.fa-smile::before {
content: "\f118";
}
.fa-thumbtack::before {
content: "\f08d";
}
.fa-thumb-tack::before {
content: "\f08d";
}
.fa-trophy::before {
content: "\f091";
}
.fa-person-praying::before {
content: "\f683";
}
.fa-pray::before {
content: "\f683";
}
.fa-hammer::before {
content: "\f6e3";
}
.fa-hand-peace::before {
content: "\f25b";
}
.fa-rotate::before {
content: "\f2f1";
}
.fa-sync-alt::before {
content: "\f2f1";
}
.fa-spinner::before {
content: "\f110";
}
.fa-robot::before {
content: "\f544";
}
.fa-peace::before {
content: "\f67c";
}
.fa-gears::before {
content: "\f085";
}
.fa-cogs::before {
content: "\f085";
}
.fa-warehouse::before {
content: "\f494";
}
.fa-arrow-up-right-dots::before {
content: "\e4b7";
}
.fa-splotch::before {
content: "\f5bc";
}
.fa-face-grin-hearts::before {
content: "\f584";
}
.fa-grin-hearts::before {
content: "\f584";
}
.fa-dice-four::before {
content: "\f524";
}
.fa-sim-card::before {
content: "\f7c4";
}
.fa-transgender::before {
content: "\f225";
}
.fa-transgender-alt::before {
content: "\f225";
}
.fa-mercury::before {
content: "\f223";
}
.fa-arrow-turn-down::before {
content: "\f149";
}
.fa-level-down::before {
content: "\f149";
}
.fa-person-falling-burst::before {
content: "\e547";
}
.fa-award::before {
content: "\f559";
}
.fa-ticket-simple::before {
content: "\f3ff";
}
.fa-ticket-alt::before {
content: "\f3ff";
}
.fa-building::before {
content: "\f1ad";
}
.fa-angles-left::before {
content: "\f100";
}
.fa-angle-double-left::before {
content: "\f100";
}
.fa-qrcode::before {
content: "\f029";
}
.fa-clock-rotate-left::before {
content: "\f1da";
}
.fa-history::before {
content: "\f1da";
}
.fa-face-grin-beam-sweat::before {
content: "\f583";
}
.fa-grin-beam-sweat::before {
content: "\f583";
}
.fa-file-export::before {
content: "\f56e";
}
.fa-arrow-right-from-file::before {
content: "\f56e";
}
.fa-shield::before {
content: "\f132";
}
.fa-shield-blank::before {
content: "\f132";
}
.fa-arrow-up-short-wide::before {
content: "\f885";
}
.fa-sort-amount-up-alt::before {
content: "\f885";
}
.fa-house-medical::before {
content: "\e3b2";
}
.fa-golf-ball-tee::before {
content: "\f450";
}
.fa-golf-ball::before {
content: "\f450";
}
.fa-circle-chevron-left::before {
content: "\f137";
}
.fa-chevron-circle-left::before {
content: "\f137";
}
.fa-house-chimney-window::before {
content: "\e00d";
}
.fa-pen-nib::before {
content: "\f5ad";
}
.fa-tent-arrow-turn-left::before {
content: "\e580";
}
.fa-tents::before {
content: "\e582";
}
.fa-wand-magic::before {
content: "\f0d0";
}
.fa-magic::before {
content: "\f0d0";
}
.fa-dog::before {
content: "\f6d3";
}
.fa-carrot::before {
content: "\f787";
}
.fa-moon::before {
content: "\f186";
}
.fa-wine-glass-empty::before {
content: "\f5ce";
}
.fa-wine-glass-alt::before {
content: "\f5ce";
}
.fa-cheese::before {
content: "\f7ef";
}
.fa-yin-yang::before {
content: "\f6ad";
}
.fa-music::before {
content: "\f001";
}
.fa-code-commit::before {
content: "\f386";
}
.fa-temperature-low::before {
content: "\f76b";
}
.fa-person-biking::before {
content: "\f84a";
}
.fa-biking::before {
content: "\f84a";
}
.fa-broom::before {
content: "\f51a";
}
.fa-shield-heart::before {
content: "\e574";
}
.fa-gopuram::before {
content: "\f664";
}
.fa-earth-oceania::before {
content: "\e47b";
}
.fa-globe-oceania::before {
content: "\e47b";
}
.fa-square-xmark::before {
content: "\f2d3";
}
.fa-times-square::before {
content: "\f2d3";
}
.fa-xmark-square::before {
content: "\f2d3";
}
.fa-hashtag::before {
content: "\#";
}
.fa-up-right-and-down-left-from-center::before {
content: "\f424";
}
.fa-expand-alt::before {
content: "\f424";
}
.fa-oil-can::before {
content: "\f613";
}
.fa-t::before {
content: "T";
}
.fa-hippo::before {
content: "\f6ed";
}
.fa-chart-column::before {
content: "\e0e3";
}
.fa-infinity::before {
content: "\f534";
}
.fa-vial-circle-check::before {
content: "\e596";
}
.fa-person-arrow-down-to-line::before {
content: "\e538";
}
.fa-voicemail::before {
content: "\f897";
}
.fa-fan::before {
content: "\f863";
}
.fa-person-walking-luggage::before {
content: "\e554";
}
.fa-up-down::before {
content: "\f338";
}
.fa-arrows-alt-v::before {
content: "\f338";
}
.fa-cloud-moon-rain::before {
content: "\f73c";
}
.fa-calendar::before {
content: "\f133";
}
.fa-trailer::before {
content: "\e041";
}
.fa-bahai::before {
content: "\f666";
}
.fa-haykal::before {
content: "\f666";
}
.fa-sd-card::before {
content: "\f7c2";
}
.fa-dragon::before {
content: "\f6d5";
}
.fa-shoe-prints::before {
content: "\f54b";
}
.fa-circle-plus::before {
content: "\f055";
}
.fa-plus-circle::before {
content: "\f055";
}
.fa-face-grin-tongue-wink::before {
content: "\f58b";
}
.fa-grin-tongue-wink::before {
content: "\f58b";
}
.fa-hand-holding::before {
content: "\f4bd";
}
.fa-plug-circle-exclamation::before {
content: "\e55d";
}
.fa-link-slash::before {
content: "\f127";
}
.fa-chain-broken::before {
content: "\f127";
}
.fa-chain-slash::before {
content: "\f127";
}
.fa-unlink::before {
content: "\f127";
}
.fa-clone::before {
content: "\f24d";
}
.fa-person-walking-arrow-loop-left::before {
content: "\e551";
}
.fa-arrow-up-z-a::before {
content: "\f882";
}
.fa-sort-alpha-up-alt::before {
content: "\f882";
}
.fa-fire-flame-curved::before {
content: "\f7e4";
}
.fa-fire-alt::before {
content: "\f7e4";
}
.fa-tornado::before {
content: "\f76f";
}
.fa-file-circle-plus::before {
content: "\e494";
}
.fa-book-quran::before {
content: "\f687";
}
.fa-quran::before {
content: "\f687";
}
.fa-anchor::before {
content: "\f13d";
}
.fa-border-all::before {
content: "\f84c";
}
.fa-face-angry::before {
content: "\f556";
}
.fa-angry::before {
content: "\f556";
}
.fa-cookie-bite::before {
content: "\f564";
}
.fa-arrow-trend-down::before {
content: "\e097";
}
.fa-rss::before {
content: "\f09e";
}
.fa-feed::before {
content: "\f09e";
}
.fa-draw-polygon::before {
content: "\f5ee";
}
.fa-scale-balanced::before {
content: "\f24e";
}
.fa-balance-scale::before {
content: "\f24e";
}
.fa-gauge-simple-high::before {
content: "\f62a";
}
.fa-tachometer::before {
content: "\f62a";
}
.fa-tachometer-fast::before {
content: "\f62a";
}
.fa-shower::before {
content: "\f2cc";
}
.fa-desktop::before {
content: "\f390";
}
.fa-desktop-alt::before {
content: "\f390";
}
.fa-m::before {
content: "M";
}
.fa-table-list::before {
content: "\f00b";
}
.fa-th-list::before {
content: "\f00b";
}
.fa-comment-sms::before {
content: "\f7cd";
}
.fa-sms::before {
content: "\f7cd";
}
.fa-book::before {
content: "\f02d";
}
.fa-user-plus::before {
content: "\f234";
}
.fa-check::before {
content: "\f00c";
}
.fa-battery-three-quarters::before {
content: "\f241";
}
.fa-battery-4::before {
content: "\f241";
}
.fa-house-circle-check::before {
content: "\e509";
}
.fa-angle-left::before {
content: "\f104";
}
.fa-diagram-successor::before {
content: "\e47a";
}
.fa-truck-arrow-right::before {
content: "\e58b";
}
.fa-arrows-split-up-and-left::before {
content: "\e4bc";
}
.fa-hand-fist::before {
content: "\f6de";
}
.fa-fist-raised::before {
content: "\f6de";
}
.fa-cloud-moon::before {
content: "\f6c3";
}
.fa-briefcase::before {
content: "\f0b1";
}
.fa-person-falling::before {
content: "\e546";
}
.fa-image-portrait::before {
content: "\f3e0";
}
.fa-portrait::before {
content: "\f3e0";
}
.fa-user-tag::before {
content: "\f507";
}
.fa-rug::before {
content: "\e569";
}
.fa-earth-europe::before {
content: "\f7a2";
}
.fa-globe-europe::before {
content: "\f7a2";
}
.fa-cart-flatbed-suitcase::before {
content: "\f59d";
}
.fa-luggage-cart::before {
content: "\f59d";
}
.fa-rectangle-xmark::before {
content: "\f410";
}
.fa-rectangle-times::before {
content: "\f410";
}
.fa-times-rectangle::before {
content: "\f410";
}
.fa-window-close::before {
content: "\f410";
}
.fa-baht-sign::before {
content: "\e0ac";
}
.fa-book-open::before {
content: "\f518";
}
.fa-book-journal-whills::before {
content: "\f66a";
}
.fa-journal-whills::before {
content: "\f66a";
}
.fa-handcuffs::before {
content: "\e4f8";
}
.fa-triangle-exclamation::before {
content: "\f071";
}
.fa-exclamation-triangle::before {
content: "\f071";
}
.fa-warning::before {
content: "\f071";
}
.fa-database::before {
content: "\f1c0";
}
.fa-share::before {
content: "\f064";
}
.fa-mail-forward::before {
content: "\f064";
}
.fa-bottle-droplet::before {
content: "\e4c4";
}
.fa-mask-face::before {
content: "\e1d7";
}
.fa-hill-rockslide::before {
content: "\e508";
}
.fa-right-left::before {
content: "\f362";
}
.fa-exchange-alt::before {
content: "\f362";
}
.fa-paper-plane::before {
content: "\f1d8";
}
.fa-road-circle-exclamation::before {
content: "\e565";
}
.fa-dungeon::before {
content: "\f6d9";
}
.fa-align-right::before {
content: "\f038";
}
.fa-money-bill-1-wave::before {
content: "\f53b";
}
.fa-money-bill-wave-alt::before {
content: "\f53b";
}
.fa-life-ring::before {
content: "\f1cd";
}
.fa-hands::before {
content: "\f2a7";
}
.fa-sign-language::before {
content: "\f2a7";
}
.fa-signing::before {
content: "\f2a7";
}
.fa-calendar-day::before {
content: "\f783";
}
.fa-water-ladder::before {
content: "\f5c5";
}
.fa-ladder-water::before {
content: "\f5c5";
}
.fa-swimming-pool::before {
content: "\f5c5";
}
.fa-arrows-up-down::before {
content: "\f07d";
}
.fa-arrows-v::before {
content: "\f07d";
}
.fa-face-grimace::before {
content: "\f57f";
}
.fa-grimace::before {
content: "\f57f";
}
.fa-wheelchair-move::before {
content: "\e2ce";
}
.fa-wheelchair-alt::before {
content: "\e2ce";
}
.fa-turn-down::before {
content: "\f3be";
}
.fa-level-down-alt::before {
content: "\f3be";
}
.fa-person-walking-arrow-right::before {
content: "\e552";
}
.fa-square-envelope::before {
content: "\f199";
}
.fa-envelope-square::before {
content: "\f199";
}
.fa-dice::before {
content: "\f522";
}
.fa-bowling-ball::before {
content: "\f436";
}
.fa-brain::before {
content: "\f5dc";
}
.fa-bandage::before {
content: "\f462";
}
.fa-band-aid::before {
content: "\f462";
}
.fa-calendar-minus::before {
content: "\f272";
}
.fa-circle-xmark::before {
content: "\f057";
}
.fa-times-circle::before {
content: "\f057";
}
.fa-xmark-circle::before {
content: "\f057";
}
.fa-gifts::before {
content: "\f79c";
}
.fa-hotel::before {
content: "\f594";
}
.fa-earth-asia::before {
content: "\f57e";
}
.fa-globe-asia::before {
content: "\f57e";
}
.fa-id-card-clip::before {
content: "\f47f";
}
.fa-id-card-alt::before {
content: "\f47f";
}
.fa-magnifying-glass-plus::before {
content: "\f00e";
}
.fa-search-plus::before {
content: "\f00e";
}
.fa-thumbs-up::before {
content: "\f164";
}
.fa-user-clock::before {
content: "\f4fd";
}
.fa-hand-dots::before {
content: "\f461";
}
.fa-allergies::before {
content: "\f461";
}
.fa-file-invoice::before {
content: "\f570";
}
.fa-window-minimize::before {
content: "\f2d1";
}
.fa-mug-saucer::before {
content: "\f0f4";
}
.fa-coffee::before {
content: "\f0f4";
}
.fa-brush::before {
content: "\f55d";
}
.fa-mask::before {
content: "\f6fa";
}
.fa-magnifying-glass-minus::before {
content: "\f010";
}
.fa-search-minus::before {
content: "\f010";
}
.fa-ruler-vertical::before {
content: "\f548";
}
.fa-user-large::before {
content: "\f406";
}
.fa-user-alt::before {
content: "\f406";
}
.fa-train-tram::before {
content: "\e5b4";
}
.fa-user-nurse::before {
content: "\f82f";
}
.fa-syringe::before {
content: "\f48e";
}
.fa-cloud-sun::before {
content: "\f6c4";
}
.fa-stopwatch-20::before {
content: "\e06f";
}
.fa-square-full::before {
content: "\f45c";
}
.fa-magnet::before {
content: "\f076";
}
.fa-jar::before {
content: "\e516";
}
.fa-note-sticky::before {
content: "\f249";
}
.fa-sticky-note::before {
content: "\f249";
}
.fa-bug-slash::before {
content: "\e490";
}
.fa-arrow-up-from-water-pump::before {
content: "\e4b6";
}
.fa-bone::before {
content: "\f5d7";
}
.fa-user-injured::before {
content: "\f728";
}
.fa-face-sad-tear::before {
content: "\f5b4";
}
.fa-sad-tear::before {
content: "\f5b4";
}
.fa-plane::before {
content: "\f072";
}
.fa-tent-arrows-down::before {
content: "\e581";
}
.fa-exclamation::before {
content: "\!";
}
.fa-arrows-spin::before {
content: "\e4bb";
}
.fa-print::before {
content: "\f02f";
}
.fa-turkish-lira-sign::before {
content: "\e2bb";
}
.fa-try::before {
content: "\e2bb";
}
.fa-turkish-lira::before {
content: "\e2bb";
}
.fa-dollar-sign::before {
content: "\$";
}
.fa-dollar::before {
content: "\$";
}
.fa-usd::before {
content: "\$";
}
.fa-x::before {
content: "X";
}
.fa-magnifying-glass-dollar::before {
content: "\f688";
}
.fa-search-dollar::before {
content: "\f688";
}
.fa-users-gear::before {
content: "\f509";
}
.fa-users-cog::before {
content: "\f509";
}
.fa-person-military-pointing::before {
content: "\e54a";
}
.fa-building-columns::before {
content: "\f19c";
}
.fa-bank::before {
content: "\f19c";
}
.fa-institution::before {
content: "\f19c";
}
.fa-museum::before {
content: "\f19c";
}
.fa-university::before {
content: "\f19c";
}
.fa-umbrella::before {
content: "\f0e9";
}
.fa-trowel::before {
content: "\e589";
}
.fa-d::before {
content: "D";
}
.fa-stapler::before {
content: "\e5af";
}
.fa-masks-theater::before {
content: "\f630";
}
.fa-theater-masks::before {
content: "\f630";
}
.fa-kip-sign::before {
content: "\e1c4";
}
.fa-hand-point-left::before {
content: "\f0a5";
}
.fa-handshake-simple::before {
content: "\f4c6";
}
.fa-handshake-alt::before {
content: "\f4c6";
}
.fa-jet-fighter::before {
content: "\f0fb";
}
.fa-fighter-jet::before {
content: "\f0fb";
}
.fa-square-share-nodes::before {
content: "\f1e1";
}
.fa-share-alt-square::before {
content: "\f1e1";
}
.fa-barcode::before {
content: "\f02a";
}
.fa-plus-minus::before {
content: "\e43c";
}
.fa-video::before {
content: "\f03d";
}
.fa-video-camera::before {
content: "\f03d";
}
.fa-graduation-cap::before {
content: "\f19d";
}
.fa-mortar-board::before {
content: "\f19d";
}
.fa-hand-holding-medical::before {
content: "\e05c";
}
.fa-person-circle-check::before {
content: "\e53e";
}
.fa-turn-up::before {
content: "\f3bf";
}
.fa-level-up-alt::before {
content: "\f3bf";
}
.sr-only,
.fa-sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border-width: 0;
}
.sr-only-focusable:not(:focus),
.fa-sr-only-focusable:not(:focus) {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border-width: 0;
}
/*!
* Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
* Copyright 2024 Fonticons, Inc.
*/
:root, :host {
--fa-style-family-classic: "Font Awesome 6 Free";
--fa-font-solid: normal 900 1em/1 "Font Awesome 6 Free";
}
@font-face {
font-family: "Font Awesome 6 Free";
font-style: normal;
font-weight: 900;
font-display: block;
src: url("font-awesome/fa-solid-900.woff2") format("woff2"), url("font-awesome/fa-solid-900.ttf") format("truetype");
}
.fas,
.fa-solid {
font-weight: 900;
}
/*!
* Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
* Copyright 2024 Fonticons, Inc.
*/
:root, :host {
--fa-style-family-classic: "Font Awesome 6 Free";
--fa-font-regular: normal 400 1em/1 "Font Awesome 6 Free";
}
@font-face {
font-family: "Font Awesome 6 Free";
font-style: normal;
font-weight: 400;
font-display: block;
src: url("font-awesome/fa-regular-400.woff2") format("woff2"), url("font-awesome/fa-regular-400.ttf") format("truetype");
}
.far,
.fa-regular {
font-weight: 400;
}
/*!
* Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
* Copyright 2024 Fonticons, Inc.
*/
:root, :host {
--fa-style-family-brands: "Font Awesome 6 Brands";
--fa-font-brands: normal 400 1em/1 "Font Awesome 6 Brands";
}
@font-face {
font-family: "Font Awesome 6 Brands";
font-style: normal;
font-weight: 400;
font-display: block;
src: url("font-awesome/fa-brands-400.woff2") format("woff2"), url("font-awesome/fa-brands-400.ttf") format("truetype");
}
.fab,
.fa-brands {
font-weight: 400;
}
.fa-monero:before {
content: "\f3d0";
}
.fa-hooli:before {
content: "\f427";
}
.fa-yelp:before {
content: "\f1e9";
}
.fa-cc-visa:before {
content: "\f1f0";
}
.fa-lastfm:before {
content: "\f202";
}
.fa-shopware:before {
content: "\f5b5";
}
.fa-creative-commons-nc:before {
content: "\f4e8";
}
.fa-aws:before {
content: "\f375";
}
.fa-redhat:before {
content: "\f7bc";
}
.fa-yoast:before {
content: "\f2b1";
}
.fa-cloudflare:before {
content: "\e07d";
}
.fa-ups:before {
content: "\f7e0";
}
.fa-pixiv:before {
content: "\e640";
}
.fa-wpexplorer:before {
content: "\f2de";
}
.fa-dyalog:before {
content: "\f399";
}
.fa-bity:before {
content: "\f37a";
}
.fa-stackpath:before {
content: "\f842";
}
.fa-buysellads:before {
content: "\f20d";
}
.fa-first-order:before {
content: "\f2b0";
}
.fa-modx:before {
content: "\f285";
}
.fa-guilded:before {
content: "\e07e";
}
.fa-vnv:before {
content: "\f40b";
}
.fa-square-js:before {
content: "\f3b9";
}
.fa-js-square:before {
content: "\f3b9";
}
.fa-microsoft:before {
content: "\f3ca";
}
.fa-qq:before {
content: "\f1d6";
}
.fa-orcid:before {
content: "\f8d2";
}
.fa-java:before {
content: "\f4e4";
}
.fa-invision:before {
content: "\f7b0";
}
.fa-creative-commons-pd-alt:before {
content: "\f4ed";
}
.fa-centercode:before {
content: "\f380";
}
.fa-glide-g:before {
content: "\f2a6";
}
.fa-drupal:before {
content: "\f1a9";
}
.fa-jxl:before {
content: "\e67b";
}
.fa-hire-a-helper:before {
content: "\f3b0";
}
.fa-creative-commons-by:before {
content: "\f4e7";
}
.fa-unity:before {
content: "\e049";
}
.fa-whmcs:before {
content: "\f40d";
}
.fa-rocketchat:before {
content: "\f3e8";
}
.fa-vk:before {
content: "\f189";
}
.fa-untappd:before {
content: "\f405";
}
.fa-mailchimp:before {
content: "\f59e";
}
.fa-css3-alt:before {
content: "\f38b";
}
.fa-square-reddit:before {
content: "\f1a2";
}
.fa-reddit-square:before {
content: "\f1a2";
}
.fa-vimeo-v:before {
content: "\f27d";
}
.fa-contao:before {
content: "\f26d";
}
.fa-square-font-awesome:before {
content: "\e5ad";
}
.fa-deskpro:before {
content: "\f38f";
}
.fa-brave:before {
content: "\e63c";
}
.fa-sistrix:before {
content: "\f3ee";
}
.fa-square-instagram:before {
content: "\e055";
}
.fa-instagram-square:before {
content: "\e055";
}
.fa-battle-net:before {
content: "\f835";
}
.fa-the-red-yeti:before {
content: "\f69d";
}
.fa-square-hacker-news:before {
content: "\f3af";
}
.fa-hacker-news-square:before {
content: "\f3af";
}
.fa-edge:before {
content: "\f282";
}
.fa-threads:before {
content: "\e618";
}
.fa-napster:before {
content: "\f3d2";
}
.fa-square-snapchat:before {
content: "\f2ad";
}
.fa-snapchat-square:before {
content: "\f2ad";
}
.fa-google-plus-g:before {
content: "\f0d5";
}
.fa-artstation:before {
content: "\f77a";
}
.fa-markdown:before {
content: "\f60f";
}
.fa-sourcetree:before {
content: "\f7d3";
}
.fa-google-plus:before {
content: "\f2b3";
}
.fa-diaspora:before {
content: "\f791";
}
.fa-foursquare:before {
content: "\f180";
}
.fa-stack-overflow:before {
content: "\f16c";
}
.fa-github-alt:before {
content: "\f113";
}
.fa-phoenix-squadron:before {
content: "\f511";
}
.fa-pagelines:before {
content: "\f18c";
}
.fa-algolia:before {
content: "\f36c";
}
.fa-red-river:before {
content: "\f3e3";
}
.fa-creative-commons-sa:before {
content: "\f4ef";
}
.fa-safari:before {
content: "\f267";
}
.fa-google:before {
content: "\f1a0";
}
.fa-square-font-awesome-stroke:before {
content: "\f35c";
}
.fa-font-awesome-alt:before {
content: "\f35c";
}
.fa-atlassian:before {
content: "\f77b";
}
.fa-linkedin-in:before {
content: "\f0e1";
}
.fa-digital-ocean:before {
content: "\f391";
}
.fa-nimblr:before {
content: "\f5a8";
}
.fa-chromecast:before {
content: "\f838";
}
.fa-evernote:before {
content: "\f839";
}
.fa-hacker-news:before {
content: "\f1d4";
}
.fa-creative-commons-sampling:before {
content: "\f4f0";
}
.fa-adversal:before {
content: "\f36a";
}
.fa-creative-commons:before {
content: "\f25e";
}
.fa-watchman-monitoring:before {
content: "\e087";
}
.fa-fonticons:before {
content: "\f280";
}
.fa-weixin:before {
content: "\f1d7";
}
.fa-shirtsinbulk:before {
content: "\f214";
}
.fa-codepen:before {
content: "\f1cb";
}
.fa-git-alt:before {
content: "\f841";
}
.fa-lyft:before {
content: "\f3c3";
}
.fa-rev:before {
content: "\f5b2";
}
.fa-windows:before {
content: "\f17a";
}
.fa-wizards-of-the-coast:before {
content: "\f730";
}
.fa-square-viadeo:before {
content: "\f2aa";
}
.fa-viadeo-square:before {
content: "\f2aa";
}
.fa-meetup:before {
content: "\f2e0";
}
.fa-centos:before {
content: "\f789";
}
.fa-adn:before {
content: "\f170";
}
.fa-cloudsmith:before {
content: "\f384";
}
.fa-opensuse:before {
content: "\e62b";
}
.fa-pied-piper-alt:before {
content: "\f1a8";
}
.fa-square-dribbble:before {
content: "\f397";
}
.fa-dribbble-square:before {
content: "\f397";
}
.fa-codiepie:before {
content: "\f284";
}
.fa-node:before {
content: "\f419";
}
.fa-mix:before {
content: "\f3cb";
}
.fa-steam:before {
content: "\f1b6";
}
.fa-cc-apple-pay:before {
content: "\f416";
}
.fa-scribd:before {
content: "\f28a";
}
.fa-debian:before {
content: "\e60b";
}
.fa-openid:before {
content: "\f19b";
}
.fa-instalod:before {
content: "\e081";
}
.fa-expeditedssl:before {
content: "\f23e";
}
.fa-sellcast:before {
content: "\f2da";
}
.fa-square-twitter:before {
content: "\f081";
}
.fa-twitter-square:before {
content: "\f081";
}
.fa-r-project:before {
content: "\f4f7";
}
.fa-delicious:before {
content: "\f1a5";
}
.fa-freebsd:before {
content: "\f3a4";
}
.fa-vuejs:before {
content: "\f41f";
}
.fa-accusoft:before {
content: "\f369";
}
.fa-ioxhost:before {
content: "\f208";
}
.fa-fonticons-fi:before {
content: "\f3a2";
}
.fa-app-store:before {
content: "\f36f";
}
.fa-cc-mastercard:before {
content: "\f1f1";
}
.fa-itunes-note:before {
content: "\f3b5";
}
.fa-golang:before {
content: "\e40f";
}
.fa-kickstarter:before {
content: "\f3bb";
}
.fa-square-kickstarter:before {
content: "\f3bb";
}
.fa-grav:before {
content: "\f2d6";
}
.fa-weibo:before {
content: "\f18a";
}
.fa-uncharted:before {
content: "\e084";
}
.fa-firstdraft:before {
content: "\f3a1";
}
.fa-square-youtube:before {
content: "\f431";
}
.fa-youtube-square:before {
content: "\f431";
}
.fa-wikipedia-w:before {
content: "\f266";
}
.fa-wpressr:before {
content: "\f3e4";
}
.fa-rendact:before {
content: "\f3e4";
}
.fa-angellist:before {
content: "\f209";
}
.fa-galactic-republic:before {
content: "\f50c";
}
.fa-nfc-directional:before {
content: "\e530";
}
.fa-skype:before {
content: "\f17e";
}
.fa-joget:before {
content: "\f3b7";
}
.fa-fedora:before {
content: "\f798";
}
.fa-stripe-s:before {
content: "\f42a";
}
.fa-meta:before {
content: "\e49b";
}
.fa-laravel:before {
content: "\f3bd";
}
.fa-hotjar:before {
content: "\f3b1";
}
.fa-bluetooth-b:before {
content: "\f294";
}
.fa-square-letterboxd:before {
content: "\e62e";
}
.fa-sticker-mule:before {
content: "\f3f7";
}
.fa-creative-commons-zero:before {
content: "\f4f3";
}
.fa-hips:before {
content: "\f452";
}
.fa-behance:before {
content: "\f1b4";
}
.fa-reddit:before {
content: "\f1a1";
}
.fa-discord:before {
content: "\f392";
}
.fa-chrome:before {
content: "\f268";
}
.fa-app-store-ios:before {
content: "\f370";
}
.fa-cc-discover:before {
content: "\f1f2";
}
.fa-wpbeginner:before {
content: "\f297";
}
.fa-confluence:before {
content: "\f78d";
}
.fa-shoelace:before {
content: "\e60c";
}
.fa-mdb:before {
content: "\f8ca";
}
.fa-dochub:before {
content: "\f394";
}
.fa-accessible-icon:before {
content: "\f368";
}
.fa-ebay:before {
content: "\f4f4";
}
.fa-amazon:before {
content: "\f270";
}
.fa-unsplash:before {
content: "\e07c";
}
.fa-yarn:before {
content: "\f7e3";
}
.fa-square-steam:before {
content: "\f1b7";
}
.fa-steam-square:before {
content: "\f1b7";
}
.fa-500px:before {
content: "\f26e";
}
.fa-square-vimeo:before {
content: "\f194";
}
.fa-vimeo-square:before {
content: "\f194";
}
.fa-asymmetrik:before {
content: "\f372";
}
.fa-font-awesome:before {
content: "\f2b4";
}
.fa-font-awesome-flag:before {
content: "\f2b4";
}
.fa-font-awesome-logo-full:before {
content: "\f2b4";
}
.fa-gratipay:before {
content: "\f184";
}
.fa-apple:before {
content: "\f179";
}
.fa-hive:before {
content: "\e07f";
}
.fa-gitkraken:before {
content: "\f3a6";
}
.fa-keybase:before {
content: "\f4f5";
}
.fa-apple-pay:before {
content: "\f415";
}
.fa-padlet:before {
content: "\e4a0";
}
.fa-amazon-pay:before {
content: "\f42c";
}
.fa-square-github:before {
content: "\f092";
}
.fa-github-square:before {
content: "\f092";
}
.fa-stumbleupon:before {
content: "\f1a4";
}
.fa-fedex:before {
content: "\f797";
}
.fa-phoenix-framework:before {
content: "\f3dc";
}
.fa-shopify:before {
content: "\e057";
}
.fa-neos:before {
content: "\f612";
}
.fa-square-threads:before {
content: "\e619";
}
.fa-hackerrank:before {
content: "\f5f7";
}
.fa-researchgate:before {
content: "\f4f8";
}
.fa-swift:before {
content: "\f8e1";
}
.fa-angular:before {
content: "\f420";
}
.fa-speakap:before {
content: "\f3f3";
}
.fa-angrycreative:before {
content: "\f36e";
}
.fa-y-combinator:before {
content: "\f23b";
}
.fa-empire:before {
content: "\f1d1";
}
.fa-envira:before {
content: "\f299";
}
.fa-google-scholar:before {
content: "\e63b";
}
.fa-square-gitlab:before {
content: "\e5ae";
}
.fa-gitlab-square:before {
content: "\e5ae";
}
.fa-studiovinari:before {
content: "\f3f8";
}
.fa-pied-piper:before {
content: "\f2ae";
}
.fa-wordpress:before {
content: "\f19a";
}
.fa-product-hunt:before {
content: "\f288";
}
.fa-firefox:before {
content: "\f269";
}
.fa-linode:before {
content: "\f2b8";
}
.fa-goodreads:before {
content: "\f3a8";
}
.fa-square-odnoklassniki:before {
content: "\f264";
}
.fa-odnoklassniki-square:before {
content: "\f264";
}
.fa-jsfiddle:before {
content: "\f1cc";
}
.fa-sith:before {
content: "\f512";
}
.fa-themeisle:before {
content: "\f2b2";
}
.fa-page4:before {
content: "\f3d7";
}
.fa-hashnode:before {
content: "\e499";
}
.fa-react:before {
content: "\f41b";
}
.fa-cc-paypal:before {
content: "\f1f4";
}
.fa-squarespace:before {
content: "\f5be";
}
.fa-cc-stripe:before {
content: "\f1f5";
}
.fa-creative-commons-share:before {
content: "\f4f2";
}
.fa-bitcoin:before {
content: "\f379";
}
.fa-keycdn:before {
content: "\f3ba";
}
.fa-opera:before {
content: "\f26a";
}
.fa-itch-io:before {
content: "\f83a";
}
.fa-umbraco:before {
content: "\f8e8";
}
.fa-galactic-senate:before {
content: "\f50d";
}
.fa-ubuntu:before {
content: "\f7df";
}
.fa-draft2digital:before {
content: "\f396";
}
.fa-stripe:before {
content: "\f429";
}
.fa-houzz:before {
content: "\f27c";
}
.fa-gg:before {
content: "\f260";
}
.fa-dhl:before {
content: "\f790";
}
.fa-square-pinterest:before {
content: "\f0d3";
}
.fa-pinterest-square:before {
content: "\f0d3";
}
.fa-xing:before {
content: "\f168";
}
.fa-blackberry:before {
content: "\f37b";
}
.fa-creative-commons-pd:before {
content: "\f4ec";
}
.fa-playstation:before {
content: "\f3df";
}
.fa-quinscape:before {
content: "\f459";
}
.fa-less:before {
content: "\f41d";
}
.fa-blogger-b:before {
content: "\f37d";
}
.fa-opencart:before {
content: "\f23d";
}
.fa-vine:before {
content: "\f1ca";
}
.fa-signal-messenger:before {
content: "\e663";
}
.fa-paypal:before {
content: "\f1ed";
}
.fa-gitlab:before {
content: "\f296";
}
.fa-typo3:before {
content: "\f42b";
}
.fa-reddit-alien:before {
content: "\f281";
}
.fa-yahoo:before {
content: "\f19e";
}
.fa-dailymotion:before {
content: "\e052";
}
.fa-affiliatetheme:before {
content: "\f36b";
}
.fa-pied-piper-pp:before {
content: "\f1a7";
}
.fa-bootstrap:before {
content: "\f836";
}
.fa-odnoklassniki:before {
content: "\f263";
}
.fa-nfc-symbol:before {
content: "\e531";
}
.fa-mintbit:before {
content: "\e62f";
}
.fa-ethereum:before {
content: "\f42e";
}
.fa-speaker-deck:before {
content: "\f83c";
}
.fa-creative-commons-nc-eu:before {
content: "\f4e9";
}
.fa-patreon:before {
content: "\f3d9";
}
.fa-avianex:before {
content: "\f374";
}
.fa-ello:before {
content: "\f5f1";
}
.fa-gofore:before {
content: "\f3a7";
}
.fa-bimobject:before {
content: "\f378";
}
.fa-brave-reverse:before {
content: "\e63d";
}
.fa-facebook-f:before {
content: "\f39e";
}
.fa-square-google-plus:before {
content: "\f0d4";
}
.fa-google-plus-square:before {
content: "\f0d4";
}
.fa-web-awesome:before {
content: "\e682";
}
.fa-mandalorian:before {
content: "\f50f";
}
.fa-first-order-alt:before {
content: "\f50a";
}
.fa-osi:before {
content: "\f41a";
}
.fa-google-wallet:before {
content: "\f1ee";
}
.fa-d-and-d-beyond:before {
content: "\f6ca";
}
.fa-periscope:before {
content: "\f3da";
}
.fa-fulcrum:before {
content: "\f50b";
}
.fa-cloudscale:before {
content: "\f383";
}
.fa-forumbee:before {
content: "\f211";
}
.fa-mizuni:before {
content: "\f3cc";
}
.fa-schlix:before {
content: "\f3ea";
}
.fa-square-xing:before {
content: "\f169";
}
.fa-xing-square:before {
content: "\f169";
}
.fa-bandcamp:before {
content: "\f2d5";
}
.fa-wpforms:before {
content: "\f298";
}
.fa-cloudversify:before {
content: "\f385";
}
.fa-usps:before {
content: "\f7e1";
}
.fa-megaport:before {
content: "\f5a3";
}
.fa-magento:before {
content: "\f3c4";
}
.fa-spotify:before {
content: "\f1bc";
}
.fa-optin-monster:before {
content: "\f23c";
}
.fa-fly:before {
content: "\f417";
}
.fa-aviato:before {
content: "\f421";
}
.fa-itunes:before {
content: "\f3b4";
}
.fa-cuttlefish:before {
content: "\f38c";
}
.fa-blogger:before {
content: "\f37c";
}
.fa-flickr:before {
content: "\f16e";
}
.fa-viber:before {
content: "\f409";
}
.fa-soundcloud:before {
content: "\f1be";
}
.fa-digg:before {
content: "\f1a6";
}
.fa-tencent-weibo:before {
content: "\f1d5";
}
.fa-letterboxd:before {
content: "\e62d";
}
.fa-symfony:before {
content: "\f83d";
}
.fa-maxcdn:before {
content: "\f136";
}
.fa-etsy:before {
content: "\f2d7";
}
.fa-facebook-messenger:before {
content: "\f39f";
}
.fa-audible:before {
content: "\f373";
}
.fa-think-peaks:before {
content: "\f731";
}
.fa-bilibili:before {
content: "\e3d9";
}
.fa-erlang:before {
content: "\f39d";
}
.fa-x-twitter:before {
content: "\e61b";
}
.fa-cotton-bureau:before {
content: "\f89e";
}
.fa-dashcube:before {
content: "\f210";
}
.fa-42-group:before {
content: "\e080";
}
.fa-innosoft:before {
content: "\e080";
}
.fa-stack-exchange:before {
content: "\f18d";
}
.fa-elementor:before {
content: "\f430";
}
.fa-square-pied-piper:before {
content: "\e01e";
}
.fa-pied-piper-square:before {
content: "\e01e";
}
.fa-creative-commons-nd:before {
content: "\f4eb";
}
.fa-palfed:before {
content: "\f3d8";
}
.fa-superpowers:before {
content: "\f2dd";
}
.fa-resolving:before {
content: "\f3e7";
}
.fa-xbox:before {
content: "\f412";
}
.fa-square-web-awesome-stroke:before {
content: "\e684";
}
.fa-searchengin:before {
content: "\f3eb";
}
.fa-tiktok:before {
content: "\e07b";
}
.fa-square-facebook:before {
content: "\f082";
}
.fa-facebook-square:before {
content: "\f082";
}
.fa-renren:before {
content: "\f18b";
}
.fa-linux:before {
content: "\f17c";
}
.fa-glide:before {
content: "\f2a5";
}
.fa-linkedin:before {
content: "\f08c";
}
.fa-hubspot:before {
content: "\f3b2";
}
.fa-deploydog:before {
content: "\f38e";
}
.fa-twitch:before {
content: "\f1e8";
}
.fa-ravelry:before {
content: "\f2d9";
}
.fa-mixer:before {
content: "\e056";
}
.fa-square-lastfm:before {
content: "\f203";
}
.fa-lastfm-square:before {
content: "\f203";
}
.fa-vimeo:before {
content: "\f40a";
}
.fa-mendeley:before {
content: "\f7b3";
}
.fa-uniregistry:before {
content: "\f404";
}
.fa-figma:before {
content: "\f799";
}
.fa-creative-commons-remix:before {
content: "\f4ee";
}
.fa-cc-amazon-pay:before {
content: "\f42d";
}
.fa-dropbox:before {
content: "\f16b";
}
.fa-instagram:before {
content: "\f16d";
}
.fa-cmplid:before {
content: "\e360";
}
.fa-upwork:before {
content: "\e641";
}
.fa-facebook:before {
content: "\f09a";
}
.fa-gripfire:before {
content: "\f3ac";
}
.fa-jedi-order:before {
content: "\f50e";
}
.fa-uikit:before {
content: "\f403";
}
.fa-fort-awesome-alt:before {
content: "\f3a3";
}
.fa-phabricator:before {
content: "\f3db";
}
.fa-ussunnah:before {
content: "\f407";
}
.fa-earlybirds:before {
content: "\f39a";
}
.fa-trade-federation:before {
content: "\f513";
}
.fa-autoprefixer:before {
content: "\f41c";
}
.fa-whatsapp:before {
content: "\f232";
}
.fa-square-upwork:before {
content: "\e67c";
}
.fa-slideshare:before {
content: "\f1e7";
}
.fa-google-play:before {
content: "\f3ab";
}
.fa-viadeo:before {
content: "\f2a9";
}
.fa-line:before {
content: "\f3c0";
}
.fa-google-drive:before {
content: "\f3aa";
}
.fa-servicestack:before {
content: "\f3ec";
}
.fa-simplybuilt:before {
content: "\f215";
}
.fa-bitbucket:before {
content: "\f171";
}
.fa-imdb:before {
content: "\f2d8";
}
.fa-deezer:before {
content: "\e077";
}
.fa-raspberry-pi:before {
content: "\f7bb";
}
.fa-jira:before {
content: "\f7b1";
}
.fa-docker:before {
content: "\f395";
}
.fa-screenpal:before {
content: "\e570";
}
.fa-bluetooth:before {
content: "\f293";
}
.fa-gitter:before {
content: "\f426";
}
.fa-d-and-d:before {
content: "\f38d";
}
.fa-microblog:before {
content: "\e01a";
}
.fa-cc-diners-club:before {
content: "\f24c";
}
.fa-gg-circle:before {
content: "\f261";
}
.fa-pied-piper-hat:before {
content: "\f4e5";
}
.fa-kickstarter-k:before {
content: "\f3bc";
}
.fa-yandex:before {
content: "\f413";
}
.fa-readme:before {
content: "\f4d5";
}
.fa-html5:before {
content: "\f13b";
}
.fa-sellsy:before {
content: "\f213";
}
.fa-square-web-awesome:before {
content: "\e683";
}
.fa-sass:before {
content: "\f41e";
}
.fa-wirsindhandwerk:before {
content: "\e2d0";
}
.fa-wsh:before {
content: "\e2d0";
}
.fa-buromobelexperte:before {
content: "\f37f";
}
.fa-salesforce:before {
content: "\f83b";
}
.fa-octopus-deploy:before {
content: "\e082";
}
.fa-medapps:before {
content: "\f3c6";
}
.fa-ns8:before {
content: "\f3d5";
}
.fa-pinterest-p:before {
content: "\f231";
}
.fa-apper:before {
content: "\f371";
}
.fa-fort-awesome:before {
content: "\f286";
}
.fa-waze:before {
content: "\f83f";
}
.fa-bluesky:before {
content: "\e671";
}
.fa-cc-jcb:before {
content: "\f24b";
}
.fa-snapchat:before {
content: "\f2ab";
}
.fa-snapchat-ghost:before {
content: "\f2ab";
}
.fa-fantasy-flight-games:before {
content: "\f6dc";
}
.fa-rust:before {
content: "\e07a";
}
.fa-wix:before {
content: "\f5cf";
}
.fa-square-behance:before {
content: "\f1b5";
}
.fa-behance-square:before {
content: "\f1b5";
}
.fa-supple:before {
content: "\f3f9";
}
.fa-webflow:before {
content: "\e65c";
}
.fa-rebel:before {
content: "\f1d0";
}
.fa-css3:before {
content: "\f13c";
}
.fa-staylinked:before {
content: "\f3f5";
}
.fa-kaggle:before {
content: "\f5fa";
}
.fa-space-awesome:before {
content: "\e5ac";
}
.fa-deviantart:before {
content: "\f1bd";
}
.fa-cpanel:before {
content: "\f388";
}
.fa-goodreads-g:before {
content: "\f3a9";
}
.fa-square-git:before {
content: "\f1d2";
}
.fa-git-square:before {
content: "\f1d2";
}
.fa-square-tumblr:before {
content: "\f174";
}
.fa-tumblr-square:before {
content: "\f174";
}
.fa-trello:before {
content: "\f181";
}
.fa-creative-commons-nc-jp:before {
content: "\f4ea";
}
.fa-get-pocket:before {
content: "\f265";
}
.fa-perbyte:before {
content: "\e083";
}
.fa-grunt:before {
content: "\f3ad";
}
.fa-weebly:before {
content: "\f5cc";
}
.fa-connectdevelop:before {
content: "\f20e";
}
.fa-leanpub:before {
content: "\f212";
}
.fa-black-tie:before {
content: "\f27e";
}
.fa-themeco:before {
content: "\f5c6";
}
.fa-python:before {
content: "\f3e2";
}
.fa-android:before {
content: "\f17b";
}
.fa-bots:before {
content: "\e340";
}
.fa-free-code-camp:before {
content: "\f2c5";
}
.fa-hornbill:before {
content: "\f592";
}
.fa-js:before {
content: "\f3b8";
}
.fa-ideal:before {
content: "\e013";
}
.fa-git:before {
content: "\f1d3";
}
.fa-dev:before {
content: "\f6cc";
}
.fa-sketch:before {
content: "\f7c6";
}
.fa-yandex-international:before {
content: "\f414";
}
.fa-cc-amex:before {
content: "\f1f3";
}
.fa-uber:before {
content: "\f402";
}
.fa-github:before {
content: "\f09b";
}
.fa-php:before {
content: "\f457";
}
.fa-alipay:before {
content: "\f642";
}
.fa-youtube:before {
content: "\f167";
}
.fa-skyatlas:before {
content: "\f216";
}
.fa-firefox-browser:before {
content: "\e007";
}
.fa-replyd:before {
content: "\f3e6";
}
.fa-suse:before {
content: "\f7d6";
}
.fa-jenkins:before {
content: "\f3b6";
}
.fa-twitter:before {
content: "\f099";
}
.fa-rockrms:before {
content: "\f3e9";
}
.fa-pinterest:before {
content: "\f0d2";
}
.fa-buffer:before {
content: "\f837";
}
.fa-npm:before {
content: "\f3d4";
}
.fa-yammer:before {
content: "\f840";
}
.fa-btc:before {
content: "\f15a";
}
.fa-dribbble:before {
content: "\f17d";
}
.fa-stumbleupon-circle:before {
content: "\f1a3";
}
.fa-internet-explorer:before {
content: "\f26b";
}
.fa-stubber:before {
content: "\e5c7";
}
.fa-telegram:before {
content: "\f2c6";
}
.fa-telegram-plane:before {
content: "\f2c6";
}
.fa-old-republic:before {
content: "\f510";
}
.fa-odysee:before {
content: "\e5c6";
}
.fa-square-whatsapp:before {
content: "\f40c";
}
.fa-whatsapp-square:before {
content: "\f40c";
}
.fa-node-js:before {
content: "\f3d3";
}
.fa-edge-legacy:before {
content: "\e078";
}
.fa-slack:before {
content: "\f198";
}
.fa-slack-hash:before {
content: "\f198";
}
.fa-medrt:before {
content: "\f3c8";
}
.fa-usb:before {
content: "\f287";
}
.fa-tumblr:before {
content: "\f173";
}
.fa-vaadin:before {
content: "\f408";
}
.fa-quora:before {
content: "\f2c4";
}
.fa-square-x-twitter:before {
content: "\e61a";
}
.fa-reacteurope:before {
content: "\f75d";
}
.fa-medium:before {
content: "\f23a";
}
.fa-medium-m:before {
content: "\f23a";
}
.fa-amilia:before {
content: "\f36d";
}
.fa-mixcloud:before {
content: "\f289";
}
.fa-flipboard:before {
content: "\f44d";
}
.fa-viacoin:before {
content: "\f237";
}
.fa-critical-role:before {
content: "\f6c9";
}
.fa-sitrox:before {
content: "\e44a";
}
.fa-discourse:before {
content: "\f393";
}
.fa-joomla:before {
content: "\f1aa";
}
.fa-mastodon:before {
content: "\f4f6";
}
.fa-airbnb:before {
content: "\f834";
}
.fa-wolf-pack-battalion:before {
content: "\f514";
}
.fa-buy-n-large:before {
content: "\f8a6";
}
.fa-gulp:before {
content: "\f3ae";
}
.fa-creative-commons-sampling-plus:before {
content: "\f4f1";
}
.fa-strava:before {
content: "\f428";
}
.fa-ember:before {
content: "\f423";
}
.fa-canadian-maple-leaf:before {
content: "\f785";
}
.fa-teamspeak:before {
content: "\f4f9";
}
.fa-pushed:before {
content: "\f3e1";
}
.fa-wordpress-simple:before {
content: "\f411";
}
.fa-nutritionix:before {
content: "\f3d6";
}
.fa-wodu:before {
content: "\e088";
}
.fa-google-pay:before {
content: "\e079";
}
.fa-intercom:before {
content: "\f7af";
}
.fa-zhihu:before {
content: "\f63f";
}
.fa-korvue:before {
content: "\f42f";
}
.fa-pix:before {
content: "\e43a";
}
.fa-steam-symbol:before {
content: "\f3f6";
}
/*!
* WiceGrid CSS
*
* @import "jquery-ui/core"
*/
/*!
* jQuery UI CSS Framework 1.13.3
* https://jqueryui.com
*
* Copyright OpenJS Foundation and other contributors
* Released under the MIT license.
* https://jquery.org/license
*
* https://api.jqueryui.com/category/theming/
*/
/*
*= require jquery-ui/theme
*/
/* Layout helpers
----------------------------------*/
.ui-helper-hidden {
display: none;
}
.ui-helper-hidden-accessible {
border: 0;
clip: rect(0 0 0 0);
height: 1px;
margin: -1px;
overflow: hidden;
padding: 0;
position: absolute;
width: 1px;
}
.ui-helper-reset {
margin: 0;
padding: 0;
border: 0;
outline: 0;
line-height: 1.3;
text-decoration: none;
font-size: 100%;
list-style: none;
}
.ui-helper-clearfix:before,
.ui-helper-clearfix:after {
content: "";
display: table;
border-collapse: collapse;
}
.ui-helper-clearfix:after {
clear: both;
}
.ui-helper-zfix {
width: 100%;
height: 100%;
top: 0;
left: 0;
position: absolute;
opacity: 0;
-ms-filter: "alpha(opacity=0)"; /* support: IE8 */
}
.ui-front {
z-index: 100;
}
/* Interaction Cues
----------------------------------*/
.ui-state-disabled {
cursor: default !important;
pointer-events: none;
}
/* Icons
----------------------------------*/
.ui-icon {
display: inline-block;
vertical-align: middle;
margin-top: -0.25em;
position: relative;
text-indent: -99999px;
overflow: hidden;
background-repeat: no-repeat;
}
.ui-widget-icon-block {
left: 50%;
margin-left: -8px;
display: block;
}
/* Misc visuals
----------------------------------*/
/* Overlays */
.ui-widget-overlay {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
/*!
* WiceGrid CSS
*
* @import "jquery-ui/theme"
*/
/*!
* jQuery UI CSS Framework 1.13.3
* https://jqueryui.com
*
* Copyright OpenJS Foundation and other contributors
* Released under the MIT license.
* https://jquery.org/license
*
* https://api.jqueryui.com/category/theming/
*
* To view and modify this theme, visit https://jqueryui.com/themeroller/
*/
/*
*= depend_on_asset "jquery-ui/ui-icons_444444_256x240.png"
*= depend_on_asset "jquery-ui/ui-icons_555555_256x240.png"
*= depend_on_asset "jquery-ui/ui-icons_ffffff_256x240.png"
*= depend_on_asset "jquery-ui/ui-icons_777620_256x240.png"
*= depend_on_asset "jquery-ui/ui-icons_cc0000_256x240.png"
*= depend_on_asset "jquery-ui/ui-icons_777777_256x240.png"
*/
/* Component containers
----------------------------------*/
.ui-widget {
font-family: Arial, Helvetica, sans-serif;
font-size: 1em;
}
.ui-widget .ui-widget {
font-size: 1em;
}
.ui-widget input,
.ui-widget select,
.ui-widget textarea,
.ui-widget button {
font-family: Arial, Helvetica, sans-serif;
font-size: 1em;
}
.ui-widget.ui-widget-content {
border: 1px solid #c5c5c5;
}
.ui-widget-content {
border: 1px solid #dddddd;
background: #ffffff;
color: #333333;
}
.ui-widget-content a {
color: #333333;
}
.ui-widget-header {
border: 1px solid #dddddd;
background: #e9e9e9;
color: #333333;
font-weight: bold;
}
.ui-widget-header a {
color: #333333;
}
/* Interaction states
----------------------------------*/
.ui-state-default,
.ui-widget-content .ui-state-default,
.ui-widget-header .ui-state-default,
.ui-button,
html .ui-button.ui-state-disabled:hover,
html .ui-button.ui-state-disabled:active {
border: 1px solid #c5c5c5;
background: #f6f6f6;
font-weight: normal;
color: #454545;
}
.ui-state-default a,
.ui-state-default a:link,
.ui-state-default a:visited,
a.ui-button,
a:link.ui-button,
a:visited.ui-button,
.ui-button {
color: #454545;
text-decoration: none;
}
.ui-state-hover,
.ui-widget-content .ui-state-hover,
.ui-widget-header .ui-state-hover,
.ui-state-focus,
.ui-widget-content .ui-state-focus,
.ui-widget-header .ui-state-focus,
.ui-button:hover,
.ui-button:focus {
border: 1px solid #cccccc;
background: #ededed;
font-weight: normal;
color: #2b2b2b;
}
.ui-state-hover a,
.ui-state-hover a:hover,
.ui-state-hover a:link,
.ui-state-hover a:visited,
.ui-state-focus a,
.ui-state-focus a:hover,
.ui-state-focus a:link,
.ui-state-focus a:visited,
a.ui-button:hover,
a.ui-button:focus {
color: #2b2b2b;
text-decoration: none;
}
.ui-visual-focus {
box-shadow: 0 0 3px 1px rgb(94, 158, 214);
}
.ui-state-active,
.ui-widget-content .ui-state-active,
.ui-widget-header .ui-state-active,
a.ui-button:active,
.ui-button:active,
.ui-button.ui-state-active:hover {
border: 1px solid #003eff;
background: #007fff;
font-weight: normal;
color: #ffffff;
}
.ui-icon-background,
.ui-state-active .ui-icon-background {
border: #003eff;
background-color: #ffffff;
}
.ui-state-active a,
.ui-state-active a:link,
.ui-state-active a:visited {
color: #ffffff;
text-decoration: none;
}
/* Interaction Cues
----------------------------------*/
.ui-state-highlight,
.ui-widget-content .ui-state-highlight,
.ui-widget-header .ui-state-highlight {
border: 1px solid #dad55e;
background: #fffa90;
color: #777620;
}
.ui-state-checked {
border: 1px solid #dad55e;
background: #fffa90;
}
.ui-state-highlight a,
.ui-widget-content .ui-state-highlight a,
.ui-widget-header .ui-state-highlight a {
color: #777620;
}
.ui-state-error,
.ui-widget-content .ui-state-error,
.ui-widget-header .ui-state-error {
border: 1px solid #f1a899;
background: #fddfdf;
color: #5f3f3f;
}
.ui-state-error a,
.ui-widget-content .ui-state-error a,
.ui-widget-header .ui-state-error a {
color: #5f3f3f;
}
.ui-state-error-text,
.ui-widget-content .ui-state-error-text,
.ui-widget-header .ui-state-error-text {
color: #5f3f3f;
}
.ui-priority-primary,
.ui-widget-content .ui-priority-primary,
.ui-widget-header .ui-priority-primary {
font-weight: bold;
}
.ui-priority-secondary,
.ui-widget-content .ui-priority-secondary,
.ui-widget-header .ui-priority-secondary {
opacity: 0.7;
-ms-filter: "alpha(opacity=70)"; /* support: IE8 */
font-weight: normal;
}
.ui-state-disabled,
.ui-widget-content .ui-state-disabled,
.ui-widget-header .ui-state-disabled {
opacity: 0.35;
-ms-filter: "alpha(opacity=35)"; /* support: IE8 */
background-image: none;
}
.ui-state-disabled .ui-icon {
-ms-filter: "alpha(opacity=35)"; /* support: IE8 - See #6059 */
}
/* Icons
----------------------------------*/
/* states and images */
.ui-icon {
width: 16px;
height: 16px;
}
.ui-icon,
.ui-widget-content .ui-icon {
background-image: url("jquery-ui/ui-icons_444444_256x240.png");
}
.ui-widget-header .ui-icon {
background-image: url("jquery-ui/ui-icons_444444_256x240.png");
}
.ui-state-hover .ui-icon,
.ui-state-focus .ui-icon,
.ui-button:hover .ui-icon,
.ui-button:focus .ui-icon {
background-image: url("jquery-ui/ui-icons_555555_256x240.png");
}
.ui-state-active .ui-icon,
.ui-button:active .ui-icon {
background-image: url("jquery-ui/ui-icons_ffffff_256x240.png");
}
.ui-state-highlight .ui-icon,
.ui-button .ui-state-highlight.ui-icon {
background-image: url("jquery-ui/ui-icons_777620_256x240.png");
}
.ui-state-error .ui-icon,
.ui-state-error-text .ui-icon {
background-image: url("jquery-ui/ui-icons_cc0000_256x240.png");
}
.ui-button .ui-icon {
background-image: url("jquery-ui/ui-icons_777777_256x240.png");
}
/* positioning */
/* Three classes needed to override `.ui-button:hover .ui-icon` */
.ui-icon-blank.ui-icon-blank.ui-icon-blank {
background-image: none;
}
.ui-icon-caret-1-n {
background-position: 0 0;
}
.ui-icon-caret-1-ne {
background-position: -16px 0;
}
.ui-icon-caret-1-e {
background-position: -32px 0;
}
.ui-icon-caret-1-se {
background-position: -48px 0;
}
.ui-icon-caret-1-s {
background-position: -65px 0;
}
.ui-icon-caret-1-sw {
background-position: -80px 0;
}
.ui-icon-caret-1-w {
background-position: -96px 0;
}
.ui-icon-caret-1-nw {
background-position: -112px 0;
}
.ui-icon-caret-2-n-s {
background-position: -128px 0;
}
.ui-icon-caret-2-e-w {
background-position: -144px 0;
}
.ui-icon-triangle-1-n {
background-position: 0 -16px;
}
.ui-icon-triangle-1-ne {
background-position: -16px -16px;
}
.ui-icon-triangle-1-e {
background-position: -32px -16px;
}
.ui-icon-triangle-1-se {
background-position: -48px -16px;
}
.ui-icon-triangle-1-s {
background-position: -65px -16px;
}
.ui-icon-triangle-1-sw {
background-position: -80px -16px;
}
.ui-icon-triangle-1-w {
background-position: -96px -16px;
}
.ui-icon-triangle-1-nw {
background-position: -112px -16px;
}
.ui-icon-triangle-2-n-s {
background-position: -128px -16px;
}
.ui-icon-triangle-2-e-w {
background-position: -144px -16px;
}
.ui-icon-arrow-1-n {
background-position: 0 -32px;
}
.ui-icon-arrow-1-ne {
background-position: -16px -32px;
}
.ui-icon-arrow-1-e {
background-position: -32px -32px;
}
.ui-icon-arrow-1-se {
background-position: -48px -32px;
}
.ui-icon-arrow-1-s {
background-position: -65px -32px;
}
.ui-icon-arrow-1-sw {
background-position: -80px -32px;
}
.ui-icon-arrow-1-w {
background-position: -96px -32px;
}
.ui-icon-arrow-1-nw {
background-position: -112px -32px;
}
.ui-icon-arrow-2-n-s {
background-position: -128px -32px;
}
.ui-icon-arrow-2-ne-sw {
background-position: -144px -32px;
}
.ui-icon-arrow-2-e-w {
background-position: -160px -32px;
}
.ui-icon-arrow-2-se-nw {
background-position: -176px -32px;
}
.ui-icon-arrowstop-1-n {
background-position: -192px -32px;
}
.ui-icon-arrowstop-1-e {
background-position: -208px -32px;
}
.ui-icon-arrowstop-1-s {
background-position: -224px -32px;
}
.ui-icon-arrowstop-1-w {
background-position: -240px -32px;
}
.ui-icon-arrowthick-1-n {
background-position: 1px -48px;
}
.ui-icon-arrowthick-1-ne {
background-position: -16px -48px;
}
.ui-icon-arrowthick-1-e {
background-position: -32px -48px;
}
.ui-icon-arrowthick-1-se {
background-position: -48px -48px;
}
.ui-icon-arrowthick-1-s {
background-position: -64px -48px;
}
.ui-icon-arrowthick-1-sw {
background-position: -80px -48px;
}
.ui-icon-arrowthick-1-w {
background-position: -96px -48px;
}
.ui-icon-arrowthick-1-nw {
background-position: -112px -48px;
}
.ui-icon-arrowthick-2-n-s {
background-position: -128px -48px;
}
.ui-icon-arrowthick-2-ne-sw {
background-position: -144px -48px;
}
.ui-icon-arrowthick-2-e-w {
background-position: -160px -48px;
}
.ui-icon-arrowthick-2-se-nw {
background-position: -176px -48px;
}
.ui-icon-arrowthickstop-1-n {
background-position: -192px -48px;
}
.ui-icon-arrowthickstop-1-e {
background-position: -208px -48px;
}
.ui-icon-arrowthickstop-1-s {
background-position: -224px -48px;
}
.ui-icon-arrowthickstop-1-w {
background-position: -240px -48px;
}
.ui-icon-arrowreturnthick-1-w {
background-position: 0 -64px;
}
.ui-icon-arrowreturnthick-1-n {
background-position: -16px -64px;
}
.ui-icon-arrowreturnthick-1-e {
background-position: -32px -64px;
}
.ui-icon-arrowreturnthick-1-s {
background-position: -48px -64px;
}
.ui-icon-arrowreturn-1-w {
background-position: -64px -64px;
}
.ui-icon-arrowreturn-1-n {
background-position: -80px -64px;
}
.ui-icon-arrowreturn-1-e {
background-position: -96px -64px;
}
.ui-icon-arrowreturn-1-s {
background-position: -112px -64px;
}
.ui-icon-arrowrefresh-1-w {
background-position: -128px -64px;
}
.ui-icon-arrowrefresh-1-n {
background-position: -144px -64px;
}
.ui-icon-arrowrefresh-1-e {
background-position: -160px -64px;
}
.ui-icon-arrowrefresh-1-s {
background-position: -176px -64px;
}
.ui-icon-arrow-4 {
background-position: 0 -80px;
}
.ui-icon-arrow-4-diag {
background-position: -16px -80px;
}
.ui-icon-extlink {
background-position: -32px -80px;
}
.ui-icon-newwin {
background-position: -48px -80px;
}
.ui-icon-refresh {
background-position: -64px -80px;
}
.ui-icon-shuffle {
background-position: -80px -80px;
}
.ui-icon-transfer-e-w {
background-position: -96px -80px;
}
.ui-icon-transferthick-e-w {
background-position: -112px -80px;
}
.ui-icon-folder-collapsed {
background-position: 0 -96px;
}
.ui-icon-folder-open {
background-position: -16px -96px;
}
.ui-icon-document {
background-position: -32px -96px;
}
.ui-icon-document-b {
background-position: -48px -96px;
}
.ui-icon-note {
background-position: -64px -96px;
}
.ui-icon-mail-closed {
background-position: -80px -96px;
}
.ui-icon-mail-open {
background-position: -96px -96px;
}
.ui-icon-suitcase {
background-position: -112px -96px;
}
.ui-icon-comment {
background-position: -128px -96px;
}
.ui-icon-person {
background-position: -144px -96px;
}
.ui-icon-print {
background-position: -160px -96px;
}
.ui-icon-trash {
background-position: -176px -96px;
}
.ui-icon-locked {
background-position: -192px -96px;
}
.ui-icon-unlocked {
background-position: -208px -96px;
}
.ui-icon-bookmark {
background-position: -224px -96px;
}
.ui-icon-tag {
background-position: -240px -96px;
}
.ui-icon-home {
background-position: 0 -112px;
}
.ui-icon-flag {
background-position: -16px -112px;
}
.ui-icon-calendar {
background-position: -32px -112px;
}
.ui-icon-cart {
background-position: -48px -112px;
}
.ui-icon-pencil {
background-position: -64px -112px;
}
.ui-icon-clock {
background-position: -80px -112px;
}
.ui-icon-disk {
background-position: -96px -112px;
}
.ui-icon-calculator {
background-position: -112px -112px;
}
.ui-icon-zoomin {
background-position: -128px -112px;
}
.ui-icon-zoomout {
background-position: -144px -112px;
}
.ui-icon-search {
background-position: -160px -112px;
}
.ui-icon-wrench {
background-position: -176px -112px;
}
.ui-icon-gear {
background-position: -192px -112px;
}
.ui-icon-heart {
background-position: -208px -112px;
}
.ui-icon-star {
background-position: -224px -112px;
}
.ui-icon-link {
background-position: -240px -112px;
}
.ui-icon-cancel {
background-position: 0 -128px;
}
.ui-icon-plus {
background-position: -16px -128px;
}
.ui-icon-plusthick {
background-position: -32px -128px;
}
.ui-icon-minus {
background-position: -48px -128px;
}
.ui-icon-minusthick {
background-position: -64px -128px;
}
.ui-icon-close {
background-position: -80px -128px;
}
.ui-icon-closethick {
background-position: -96px -128px;
}
.ui-icon-key {
background-position: -112px -128px;
}
.ui-icon-lightbulb {
background-position: -128px -128px;
}
.ui-icon-scissors {
background-position: -144px -128px;
}
.ui-icon-clipboard {
background-position: -160px -128px;
}
.ui-icon-copy {
background-position: -176px -128px;
}
.ui-icon-contact {
background-position: -192px -128px;
}
.ui-icon-image {
background-position: -208px -128px;
}
.ui-icon-video {
background-position: -224px -128px;
}
.ui-icon-script {
background-position: -240px -128px;
}
.ui-icon-alert {
background-position: 0 -144px;
}
.ui-icon-info {
background-position: -16px -144px;
}
.ui-icon-notice {
background-position: -32px -144px;
}
.ui-icon-help {
background-position: -48px -144px;
}
.ui-icon-check {
background-position: -64px -144px;
}
.ui-icon-bullet {
background-position: -80px -144px;
}
.ui-icon-radio-on {
background-position: -96px -144px;
}
.ui-icon-radio-off {
background-position: -112px -144px;
}
.ui-icon-pin-w {
background-position: -128px -144px;
}
.ui-icon-pin-s {
background-position: -144px -144px;
}
.ui-icon-play {
background-position: 0 -160px;
}
.ui-icon-pause {
background-position: -16px -160px;
}
.ui-icon-seek-next {
background-position: -32px -160px;
}
.ui-icon-seek-prev {
background-position: -48px -160px;
}
.ui-icon-seek-end {
background-position: -64px -160px;
}
.ui-icon-seek-start {
background-position: -80px -160px;
}
/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
.ui-icon-seek-first {
background-position: -80px -160px;
}
.ui-icon-stop {
background-position: -96px -160px;
}
.ui-icon-eject {
background-position: -112px -160px;
}
.ui-icon-volume-off {
background-position: -128px -160px;
}
.ui-icon-volume-on {
background-position: -144px -160px;
}
.ui-icon-power {
background-position: 0 -176px;
}
.ui-icon-signal-diag {
background-position: -16px -176px;
}
.ui-icon-signal {
background-position: -32px -176px;
}
.ui-icon-battery-0 {
background-position: -48px -176px;
}
.ui-icon-battery-1 {
background-position: -64px -176px;
}
.ui-icon-battery-2 {
background-position: -80px -176px;
}
.ui-icon-battery-3 {
background-position: -96px -176px;
}
.ui-icon-circle-plus {
background-position: 0 -192px;
}
.ui-icon-circle-minus {
background-position: -16px -192px;
}
.ui-icon-circle-close {
background-position: -32px -192px;
}
.ui-icon-circle-triangle-e {
background-position: -48px -192px;
}
.ui-icon-circle-triangle-s {
background-position: -64px -192px;
}
.ui-icon-circle-triangle-w {
background-position: -80px -192px;
}
.ui-icon-circle-triangle-n {
background-position: -96px -192px;
}
.ui-icon-circle-arrow-e {
background-position: -112px -192px;
}
.ui-icon-circle-arrow-s {
background-position: -128px -192px;
}
.ui-icon-circle-arrow-w {
background-position: -144px -192px;
}
.ui-icon-circle-arrow-n {
background-position: -160px -192px;
}
.ui-icon-circle-zoomin {
background-position: -176px -192px;
}
.ui-icon-circle-zoomout {
background-position: -192px -192px;
}
.ui-icon-circle-check {
background-position: -208px -192px;
}
.ui-icon-circlesmall-plus {
background-position: 0 -208px;
}
.ui-icon-circlesmall-minus {
background-position: -16px -208px;
}
.ui-icon-circlesmall-close {
background-position: -32px -208px;
}
.ui-icon-squaresmall-plus {
background-position: -48px -208px;
}
.ui-icon-squaresmall-minus {
background-position: -64px -208px;
}
.ui-icon-squaresmall-close {
background-position: -80px -208px;
}
.ui-icon-grip-dotted-vertical {
background-position: 0 -224px;
}
.ui-icon-grip-dotted-horizontal {
background-position: -16px -224px;
}
.ui-icon-grip-solid-vertical {
background-position: -32px -224px;
}
.ui-icon-grip-solid-horizontal {
background-position: -48px -224px;
}
.ui-icon-gripsmall-diagonal-se {
background-position: -64px -224px;
}
.ui-icon-grip-diagonal-se {
background-position: -80px -224px;
}
/* Misc visuals
----------------------------------*/
/* Corner radius */
.ui-corner-all,
.ui-corner-top,
.ui-corner-left,
.ui-corner-tl {
border-top-left-radius: 3px;
}
.ui-corner-all,
.ui-corner-top,
.ui-corner-right,
.ui-corner-tr {
border-top-right-radius: 3px;
}
.ui-corner-all,
.ui-corner-bottom,
.ui-corner-left,
.ui-corner-bl {
border-bottom-left-radius: 3px;
}
.ui-corner-all,
.ui-corner-bottom,
.ui-corner-right,
.ui-corner-br {
border-bottom-right-radius: 3px;
}
/* Overlays */
.ui-widget-overlay {
background: #aaaaaa;
opacity: 0.3;
-ms-filter: "alpha(opacity=30)"; /* support: IE8 */
}
.ui-widget-shadow {
-webkit-box-shadow: 0 0 5px #666666;
box-shadow: 0 0 5px #666666;
}
/*!
* WiceGrid CSS
*
* @import "jquery-ui/datepicker"
*/
/*!
* jQuery UI Datepicker 1.13.3
* https://jqueryui.com
*
* Copyright OpenJS Foundation and other contributors
* Released under the MIT license.
* https://jquery.org/license
*
* https://api.jqueryui.com/datepicker/#theming
*/
/*
*= require jquery-ui/theme
*/
.ui-datepicker {
width: 17em;
padding: 0.2em 0.2em 0;
display: none;
}
.ui-datepicker .ui-datepicker-header {
position: relative;
padding: 0.2em 0;
}
.ui-datepicker .ui-datepicker-prev,
.ui-datepicker .ui-datepicker-next {
position: absolute;
top: 2px;
width: 1.8em;
height: 1.8em;
}
.ui-datepicker .ui-datepicker-prev-hover,
.ui-datepicker .ui-datepicker-next-hover {
top: 1px;
}
.ui-datepicker .ui-datepicker-prev {
left: 2px;
}
.ui-datepicker .ui-datepicker-next {
right: 2px;
}
.ui-datepicker .ui-datepicker-prev-hover {
left: 1px;
}
.ui-datepicker .ui-datepicker-next-hover {
right: 1px;
}
.ui-datepicker .ui-datepicker-prev span,
.ui-datepicker .ui-datepicker-next span {
display: block;
position: absolute;
left: 50%;
margin-left: -8px;
top: 50%;
margin-top: -8px;
}
.ui-datepicker .ui-datepicker-title {
margin: 0 2.3em;
line-height: 1.8em;
text-align: center;
}
.ui-datepicker .ui-datepicker-title select {
font-size: 1em;
margin: 1px 0;
}
.ui-datepicker select.ui-datepicker-month,
.ui-datepicker select.ui-datepicker-year {
width: 45%;
}
.ui-datepicker table {
width: 100%;
font-size: 0.9em;
border-collapse: collapse;
margin: 0 0 0.4em;
}
.ui-datepicker th {
padding: 0.7em 0.3em;
text-align: center;
font-weight: bold;
border: 0;
}
.ui-datepicker td {
border: 0;
padding: 1px;
}
.ui-datepicker td span,
.ui-datepicker td a {
display: block;
padding: 0.2em;
text-align: right;
text-decoration: none;
}
.ui-datepicker .ui-datepicker-buttonpane {
background-image: none;
margin: 0.7em 0 0 0;
padding: 0 0.2em;
border-left: 0;
border-right: 0;
border-bottom: 0;
}
.ui-datepicker .ui-datepicker-buttonpane button {
float: right;
margin: 0.5em 0.2em 0.4em;
cursor: pointer;
padding: 0.2em 0.6em 0.3em 0.6em;
width: auto;
overflow: visible;
}
.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
float: left;
}
/* with multiple calendars */
.ui-datepicker.ui-datepicker-multi {
width: auto;
}
.ui-datepicker-multi .ui-datepicker-group {
float: left;
}
.ui-datepicker-multi .ui-datepicker-group table {
width: 95%;
margin: 0 auto 0.4em;
}
.ui-datepicker-multi-2 .ui-datepicker-group {
width: 50%;
}
.ui-datepicker-multi-3 .ui-datepicker-group {
width: 33.3%;
}
.ui-datepicker-multi-4 .ui-datepicker-group {
width: 25%;
}
.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
border-left-width: 0;
}
.ui-datepicker-multi .ui-datepicker-buttonpane {
clear: left;
}
.ui-datepicker-row-break {
clear: both;
width: 100%;
font-size: 0;
}
/* RTL support */
.ui-datepicker-rtl {
direction: rtl;
}
.ui-datepicker-rtl .ui-datepicker-prev {
right: 2px;
left: auto;
}
.ui-datepicker-rtl .ui-datepicker-next {
left: 2px;
right: auto;
}
.ui-datepicker-rtl .ui-datepicker-prev:hover {
right: 1px;
left: auto;
}
.ui-datepicker-rtl .ui-datepicker-next:hover {
left: 1px;
right: auto;
}
.ui-datepicker-rtl .ui-datepicker-buttonpane {
clear: right;
}
.ui-datepicker-rtl .ui-datepicker-buttonpane button {
float: left;
}
.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
.ui-datepicker-rtl .ui-datepicker-group {
float: right;
}
.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
border-right-width: 0;
border-left-width: 1px;
}
/* Icons */
.ui-datepicker .ui-icon {
display: block;
text-indent: -99999px;
overflow: hidden;
background-repeat: no-repeat;
left: 0.5em;
top: 0.3em;
}
/*!
* WiceGrid CSS
*
* self
*/
.wg-detached-filter .text-filter-container input, .wice-grid .text-filter-container input {
width: auto;
margin-right: 10px;
display: inline;
}
.wg-detached-filter thead th select, .wice-grid thead th select {
display: inline-block;
}
.wg-detached-filter a.date-label, .wice-grid a.date-label {
text-decoration: none;
}
.wg-detached-filter a.date-label:hover, .wice-grid a.date-label:hover {
text-decoration: line-through;
}
.wg-detached-filter .clickable, .wice-grid .clickable {
cursor: pointer;
margin-bottom: 2px;
margin-right: 2px;
}
.wg-detached-filter .ui-datepicker-trigger, .wg-detached-filter .wg-detached-filter .ui-datepicker-trigger, .wice-grid .ui-datepicker-trigger, .wice-grid .wg-detached-filter .ui-datepicker-trigger {
cursor: pointer;
}
.wg-detached-filter .custom-dropdown-container .expand-multi-select-icon, .wg-detached-filter .custom-dropdown-container .collapse-multi-select-icon, .wice-grid .custom-dropdown-container .expand-multi-select-icon, .wice-grid .custom-dropdown-container .collapse-multi-select-icon {
width: 10px;
height: 10px;
display: inline-block;
margin-left: 5px;
vertical-align: top;
}
.wice-grid {
/* in case of twitter bootstrap :) */
}
.wice-grid .desc, .wice-grid .asc {
padding-right: 18px;
text-decoration: none;
}
.wice-grid .clickable.select-all, .wice-grid .clickable.deselect-all {
float: left;
}
.wice-grid thead th select {
width: auto;
}
.wice-grid .pagination {
margin: 0px;
float: left;
}
.wice-grid tr.wg-filter-row input[type=text] {
width: 100px;
}
.wice-grid .pagination_status {
font-weight: bold;
float: right;
}
.wice-grid-query-panel li {
list-style-type: none;
}
.wice-grid-query-panel ul {
margin-left: 0;
}
input.wice-grid-save-query-field {
width: auto;
display: inline-block;
margin-right: 10px;
}
/*
* @import "font-awesome"
*/
/*!
* Font Awesome Free 6.4.0 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
* Copyright 2022 Fonticons, Inc.
*/
.fa {
font-family: var(--fa-style-family, "Font Awesome 6 Free");
font-weight: var(--fa-style, 900);
}
.fa,
.fa-classic,
.fa-sharp,
.fas,
.fa-solid,
.far,
.fa-regular,
.fab,
.fa-brands {
-moz-osx-font-smoothing: grayscale;
-webkit-font-smoothing: antialiased;
display: var(--fa-display, inline-block);
font-style: normal;
font-variant: normal;
line-height: 1;
text-rendering: auto;
}
.fas,
.fa-classic,
.fa-solid,
.far,
.fa-regular {
font-family: "Font Awesome 6 Free";
}
.fab,
.fa-brands {
font-family: "Font Awesome 6 Brands";
}
.fa-1x {
font-size: 1em;
}
.fa-2x {
font-size: 2em;
}
.fa-3x {
font-size: 3em;
}
.fa-4x {
font-size: 4em;
}
.fa-5x {
font-size: 5em;
}
.fa-6x {
font-size: 6em;
}
.fa-7x {
font-size: 7em;
}
.fa-8x {
font-size: 8em;
}
.fa-9x {
font-size: 9em;
}
.fa-10x {
font-size: 10em;
}
.fa-2xs {
font-size: 0.625em;
line-height: 0.1em;
vertical-align: 0.225em;
}
.fa-xs {
font-size: 0.75em;
line-height: 0.0833333337em;
vertical-align: 0.125em;
}
.fa-sm {
font-size: 0.875em;
line-height: 0.0714285718em;
vertical-align: 0.0535714295em;
}
.fa-lg {
font-size: 1.25em;
line-height: 0.05em;
vertical-align: -0.075em;
}
.fa-xl {
font-size: 1.5em;
line-height: 0.0416666682em;
vertical-align: -0.125em;
}
.fa-2xl {
font-size: 2em;
line-height: 0.03125em;
vertical-align: -0.1875em;
}
.fa-fw {
text-align: center;
width: 1.25em;
}
.fa-ul {
list-style-type: none;
margin-left: var(--fa-li-margin, 2.5em);
padding-left: 0;
}
.fa-ul > li {
position: relative;
}
.fa-li {
left: calc(var(--fa-li-width, 2em) * -1);
position: absolute;
text-align: center;
width: var(--fa-li-width, 2em);
line-height: inherit;
}
.fa-border {
border-color: var(--fa-border-color, #eee);
border-radius: var(--fa-border-radius, 0.1em);
border-style: var(--fa-border-style, solid);
border-width: var(--fa-border-width, 0.08em);
padding: var(--fa-border-padding, 0.2em 0.25em 0.15em);
}
.fa-pull-left {
float: left;
margin-right: var(--fa-pull-margin, 0.3em);
}
.fa-pull-right {
float: right;
margin-left: var(--fa-pull-margin, 0.3em);
}
.fa-beat {
animation-name: fa-beat;
animation-delay: var(--fa-animation-delay, 0s);
animation-direction: var(--fa-animation-direction, normal);
animation-duration: var(--fa-animation-duration, 1s);
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
animation-timing-function: var(--fa-animation-timing, ease-in-out);
}
.fa-bounce {
animation-name: fa-bounce;
animation-delay: var(--fa-animation-delay, 0s);
animation-direction: var(--fa-animation-direction, normal);
animation-duration: var(--fa-animation-duration, 1s);
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1));
}
.fa-fade {
animation-name: fa-fade;
animation-delay: var(--fa-animation-delay, 0s);
animation-direction: var(--fa-animation-direction, normal);
animation-duration: var(--fa-animation-duration, 1s);
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1));
}
.fa-beat-fade {
animation-name: fa-beat-fade;
animation-delay: var(--fa-animation-delay, 0s);
animation-direction: var(--fa-animation-direction, normal);
animation-duration: var(--fa-animation-duration, 1s);
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1));
}
.fa-flip {
animation-name: fa-flip;
animation-delay: var(--fa-animation-delay, 0s);
animation-direction: var(--fa-animation-direction, normal);
animation-duration: var(--fa-animation-duration, 1s);
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
animation-timing-function: var(--fa-animation-timing, ease-in-out);
}
.fa-shake {
animation-name: fa-shake;
animation-delay: var(--fa-animation-delay, 0s);
animation-direction: var(--fa-animation-direction, normal);
animation-duration: var(--fa-animation-duration, 1s);
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
animation-timing-function: var(--fa-animation-timing, linear);
}
.fa-spin {
animation-name: fa-spin;
animation-delay: var(--fa-animation-delay, 0s);
animation-direction: var(--fa-animation-direction, normal);
animation-duration: var(--fa-animation-duration, 2s);
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
animation-timing-function: var(--fa-animation-timing, linear);
}
.fa-spin-reverse {
--fa-animation-direction: reverse;
}
.fa-pulse,
.fa-spin-pulse {
animation-name: fa-spin;
animation-direction: var(--fa-animation-direction, normal);
animation-duration: var(--fa-animation-duration, 1s);
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
animation-timing-function: var(--fa-animation-timing, steps(8));
}
@media (prefers-reduced-motion: reduce) {
.fa-beat,
.fa-bounce,
.fa-fade,
.fa-beat-fade,
.fa-flip,
.fa-pulse,
.fa-shake,
.fa-spin,
.fa-spin-pulse {
animation-delay: -1ms;
animation-duration: 1ms;
animation-iteration-count: 1;
transition-delay: 0s;
transition-duration: 0s;
}
}
@keyframes fa-beat {
0%, 90% {
transform: scale(1);
}
45% {
transform: scale(var(--fa-beat-scale, 1.25));
}
}
@keyframes fa-bounce {
0% {
transform: scale(1, 1) translateY(0);
}
10% {
transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0);
}
30% {
transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em));
}
50% {
transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0);
}
57% {
transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em));
}
64% {
transform: scale(1, 1) translateY(0);
}
100% {
transform: scale(1, 1) translateY(0);
}
}
@keyframes fa-fade {
50% {
opacity: var(--fa-fade-opacity, 0.4);
}
}
@keyframes fa-beat-fade {
0%, 100% {
opacity: var(--fa-beat-fade-opacity, 0.4);
transform: scale(1);
}
50% {
opacity: 1;
transform: scale(var(--fa-beat-fade-scale, 1.125));
}
}
@keyframes fa-flip {
50% {
transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg));
}
}
@keyframes fa-shake {
0% {
transform: rotate(-15deg);
}
4% {
transform: rotate(15deg);
}
8%, 24% {
transform: rotate(-18deg);
}
12%, 28% {
transform: rotate(18deg);
}
16% {
transform: rotate(-22deg);
}
20% {
transform: rotate(22deg);
}
32% {
transform: rotate(-12deg);
}
36% {
transform: rotate(12deg);
}
40%, 100% {
transform: rotate(0deg);
}
}
@keyframes fa-spin {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
.fa-rotate-90 {
transform: rotate(90deg);
}
.fa-rotate-180 {
transform: rotate(180deg);
}
.fa-rotate-270 {
transform: rotate(270deg);
}
.fa-flip-horizontal {
transform: scale(-1, 1);
}
.fa-flip-vertical {
transform: scale(1, -1);
}
.fa-flip-both,
.fa-flip-horizontal.fa-flip-vertical {
transform: scale(-1, -1);
}
.fa-rotate-by {
transform: rotate(var(--fa-rotate-angle, 0));
}
.fa-stack {
display: inline-block;
height: 2em;
line-height: 2em;
position: relative;
vertical-align: middle;
width: 2.5em;
}
.fa-stack-1x,
.fa-stack-2x {
left: 0;
position: absolute;
text-align: center;
width: 100%;
z-index: var(--fa-stack-z-index, auto);
}
.fa-stack-1x {
line-height: inherit;
}
.fa-stack-2x {
font-size: 2em;
}
.fa-inverse {
color: var(--fa-inverse, #fff);
}
/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
readers do not read off random characters that represent icons */
.fa-0::before {
content: "\30 ";
}
.fa-1::before {
content: "\31 ";
}
.fa-2::before {
content: "\32 ";
}
.fa-3::before {
content: "\33 ";
}
.fa-4::before {
content: "\34 ";
}
.fa-5::before {
content: "\35 ";
}
.fa-6::before {
content: "\36 ";
}
.fa-7::before {
content: "\37 ";
}
.fa-8::before {
content: "\38 ";
}
.fa-9::before {
content: "\39 ";
}
.fa-fill-drip::before {
content: "\f576";
}
.fa-arrows-to-circle::before {
content: "\e4bd";
}
.fa-circle-chevron-right::before {
content: "\f138";
}
.fa-chevron-circle-right::before {
content: "\f138";
}
.fa-at::before {
content: "\@";
}
.fa-trash-can::before {
content: "\f2ed";
}
.fa-trash-alt::before {
content: "\f2ed";
}
.fa-text-height::before {
content: "\f034";
}
.fa-user-xmark::before {
content: "\f235";
}
.fa-user-times::before {
content: "\f235";
}
.fa-stethoscope::before {
content: "\f0f1";
}
.fa-message::before {
content: "\f27a";
}
.fa-comment-alt::before {
content: "\f27a";
}
.fa-info::before {
content: "\f129";
}
.fa-down-left-and-up-right-to-center::before {
content: "\f422";
}
.fa-compress-alt::before {
content: "\f422";
}
.fa-explosion::before {
content: "\e4e9";
}
.fa-file-lines::before {
content: "\f15c";
}
.fa-file-alt::before {
content: "\f15c";
}
.fa-file-text::before {
content: "\f15c";
}
.fa-wave-square::before {
content: "\f83e";
}
.fa-ring::before {
content: "\f70b";
}
.fa-building-un::before {
content: "\e4d9";
}
.fa-dice-three::before {
content: "\f527";
}
.fa-calendar-days::before {
content: "\f073";
}
.fa-calendar-alt::before {
content: "\f073";
}
.fa-anchor-circle-check::before {
content: "\e4aa";
}
.fa-building-circle-arrow-right::before {
content: "\e4d1";
}
.fa-volleyball::before {
content: "\f45f";
}
.fa-volleyball-ball::before {
content: "\f45f";
}
.fa-arrows-up-to-line::before {
content: "\e4c2";
}
.fa-sort-down::before {
content: "\f0dd";
}
.fa-sort-desc::before {
content: "\f0dd";
}
.fa-circle-minus::before {
content: "\f056";
}
.fa-minus-circle::before {
content: "\f056";
}
.fa-door-open::before {
content: "\f52b";
}
.fa-right-from-bracket::before {
content: "\f2f5";
}
.fa-sign-out-alt::before {
content: "\f2f5";
}
.fa-atom::before {
content: "\f5d2";
}
.fa-soap::before {
content: "\e06e";
}
.fa-icons::before {
content: "\f86d";
}
.fa-heart-music-camera-bolt::before {
content: "\f86d";
}
.fa-microphone-lines-slash::before {
content: "\f539";
}
.fa-microphone-alt-slash::before {
content: "\f539";
}
.fa-bridge-circle-check::before {
content: "\e4c9";
}
.fa-pump-medical::before {
content: "\e06a";
}
.fa-fingerprint::before {
content: "\f577";
}
.fa-hand-point-right::before {
content: "\f0a4";
}
.fa-magnifying-glass-location::before {
content: "\f689";
}
.fa-search-location::before {
content: "\f689";
}
.fa-forward-step::before {
content: "\f051";
}
.fa-step-forward::before {
content: "\f051";
}
.fa-face-smile-beam::before {
content: "\f5b8";
}
.fa-smile-beam::before {
content: "\f5b8";
}
.fa-flag-checkered::before {
content: "\f11e";
}
.fa-football::before {
content: "\f44e";
}
.fa-football-ball::before {
content: "\f44e";
}
.fa-school-circle-exclamation::before {
content: "\e56c";
}
.fa-crop::before {
content: "\f125";
}
.fa-angles-down::before {
content: "\f103";
}
.fa-angle-double-down::before {
content: "\f103";
}
.fa-users-rectangle::before {
content: "\e594";
}
.fa-people-roof::before {
content: "\e537";
}
.fa-people-line::before {
content: "\e534";
}
.fa-beer-mug-empty::before {
content: "\f0fc";
}
.fa-beer::before {
content: "\f0fc";
}
.fa-diagram-predecessor::before {
content: "\e477";
}
.fa-arrow-up-long::before {
content: "\f176";
}
.fa-long-arrow-up::before {
content: "\f176";
}
.fa-fire-flame-simple::before {
content: "\f46a";
}
.fa-burn::before {
content: "\f46a";
}
.fa-person::before {
content: "\f183";
}
.fa-male::before {
content: "\f183";
}
.fa-laptop::before {
content: "\f109";
}
.fa-file-csv::before {
content: "\f6dd";
}
.fa-menorah::before {
content: "\f676";
}
.fa-truck-plane::before {
content: "\e58f";
}
.fa-record-vinyl::before {
content: "\f8d9";
}
.fa-face-grin-stars::before {
content: "\f587";
}
.fa-grin-stars::before {
content: "\f587";
}
.fa-bong::before {
content: "\f55c";
}
.fa-spaghetti-monster-flying::before {
content: "\f67b";
}
.fa-pastafarianism::before {
content: "\f67b";
}
.fa-arrow-down-up-across-line::before {
content: "\e4af";
}
.fa-spoon::before {
content: "\f2e5";
}
.fa-utensil-spoon::before {
content: "\f2e5";
}
.fa-jar-wheat::before {
content: "\e517";
}
.fa-envelopes-bulk::before {
content: "\f674";
}
.fa-mail-bulk::before {
content: "\f674";
}
.fa-file-circle-exclamation::before {
content: "\e4eb";
}
.fa-circle-h::before {
content: "\f47e";
}
.fa-hospital-symbol::before {
content: "\f47e";
}
.fa-pager::before {
content: "\f815";
}
.fa-address-book::before {
content: "\f2b9";
}
.fa-contact-book::before {
content: "\f2b9";
}
.fa-strikethrough::before {
content: "\f0cc";
}
.fa-k::before {
content: "K";
}
.fa-landmark-flag::before {
content: "\e51c";
}
.fa-pencil::before {
content: "\f303";
}
.fa-pencil-alt::before {
content: "\f303";
}
.fa-backward::before {
content: "\f04a";
}
.fa-caret-right::before {
content: "\f0da";
}
.fa-comments::before {
content: "\f086";
}
.fa-paste::before {
content: "\f0ea";
}
.fa-file-clipboard::before {
content: "\f0ea";
}
.fa-code-pull-request::before {
content: "\e13c";
}
.fa-clipboard-list::before {
content: "\f46d";
}
.fa-truck-ramp-box::before {
content: "\f4de";
}
.fa-truck-loading::before {
content: "\f4de";
}
.fa-user-check::before {
content: "\f4fc";
}
.fa-vial-virus::before {
content: "\e597";
}
.fa-sheet-plastic::before {
content: "\e571";
}
.fa-blog::before {
content: "\f781";
}
.fa-user-ninja::before {
content: "\f504";
}
.fa-person-arrow-up-from-line::before {
content: "\e539";
}
.fa-scroll-torah::before {
content: "\f6a0";
}
.fa-torah::before {
content: "\f6a0";
}
.fa-broom-ball::before {
content: "\f458";
}
.fa-quidditch::before {
content: "\f458";
}
.fa-quidditch-broom-ball::before {
content: "\f458";
}
.fa-toggle-off::before {
content: "\f204";
}
.fa-box-archive::before {
content: "\f187";
}
.fa-archive::before {
content: "\f187";
}
.fa-person-drowning::before {
content: "\e545";
}
.fa-arrow-down-9-1::before {
content: "\f886";
}
.fa-sort-numeric-desc::before {
content: "\f886";
}
.fa-sort-numeric-down-alt::before {
content: "\f886";
}
.fa-face-grin-tongue-squint::before {
content: "\f58a";
}
.fa-grin-tongue-squint::before {
content: "\f58a";
}
.fa-spray-can::before {
content: "\f5bd";
}
.fa-truck-monster::before {
content: "\f63b";
}
.fa-w::before {
content: "W";
}
.fa-earth-africa::before {
content: "\f57c";
}
.fa-globe-africa::before {
content: "\f57c";
}
.fa-rainbow::before {
content: "\f75b";
}
.fa-circle-notch::before {
content: "\f1ce";
}
.fa-tablet-screen-button::before {
content: "\f3fa";
}
.fa-tablet-alt::before {
content: "\f3fa";
}
.fa-paw::before {
content: "\f1b0";
}
.fa-cloud::before {
content: "\f0c2";
}
.fa-trowel-bricks::before {
content: "\e58a";
}
.fa-face-flushed::before {
content: "\f579";
}
.fa-flushed::before {
content: "\f579";
}
.fa-hospital-user::before {
content: "\f80d";
}
.fa-tent-arrow-left-right::before {
content: "\e57f";
}
.fa-gavel::before {
content: "\f0e3";
}
.fa-legal::before {
content: "\f0e3";
}
.fa-binoculars::before {
content: "\f1e5";
}
.fa-microphone-slash::before {
content: "\f131";
}
.fa-box-tissue::before {
content: "\e05b";
}
.fa-motorcycle::before {
content: "\f21c";
}
.fa-bell-concierge::before {
content: "\f562";
}
.fa-concierge-bell::before {
content: "\f562";
}
.fa-pen-ruler::before {
content: "\f5ae";
}
.fa-pencil-ruler::before {
content: "\f5ae";
}
.fa-people-arrows::before {
content: "\e068";
}
.fa-people-arrows-left-right::before {
content: "\e068";
}
.fa-mars-and-venus-burst::before {
content: "\e523";
}
.fa-square-caret-right::before {
content: "\f152";
}
.fa-caret-square-right::before {
content: "\f152";
}
.fa-scissors::before {
content: "\f0c4";
}
.fa-cut::before {
content: "\f0c4";
}
.fa-sun-plant-wilt::before {
content: "\e57a";
}
.fa-toilets-portable::before {
content: "\e584";
}
.fa-hockey-puck::before {
content: "\f453";
}
.fa-table::before {
content: "\f0ce";
}
.fa-magnifying-glass-arrow-right::before {
content: "\e521";
}
.fa-tachograph-digital::before {
content: "\f566";
}
.fa-digital-tachograph::before {
content: "\f566";
}
.fa-users-slash::before {
content: "\e073";
}
.fa-clover::before {
content: "\e139";
}
.fa-reply::before {
content: "\f3e5";
}
.fa-mail-reply::before {
content: "\f3e5";
}
.fa-star-and-crescent::before {
content: "\f699";
}
.fa-house-fire::before {
content: "\e50c";
}
.fa-square-minus::before {
content: "\f146";
}
.fa-minus-square::before {
content: "\f146";
}
.fa-helicopter::before {
content: "\f533";
}
.fa-compass::before {
content: "\f14e";
}
.fa-square-caret-down::before {
content: "\f150";
}
.fa-caret-square-down::before {
content: "\f150";
}
.fa-file-circle-question::before {
content: "\e4ef";
}
.fa-laptop-code::before {
content: "\f5fc";
}
.fa-swatchbook::before {
content: "\f5c3";
}
.fa-prescription-bottle::before {
content: "\f485";
}
.fa-bars::before {
content: "\f0c9";
}
.fa-navicon::before {
content: "\f0c9";
}
.fa-people-group::before {
content: "\e533";
}
.fa-hourglass-end::before {
content: "\f253";
}
.fa-hourglass-3::before {
content: "\f253";
}
.fa-heart-crack::before {
content: "\f7a9";
}
.fa-heart-broken::before {
content: "\f7a9";
}
.fa-square-up-right::before {
content: "\f360";
}
.fa-external-link-square-alt::before {
content: "\f360";
}
.fa-face-kiss-beam::before {
content: "\f597";
}
.fa-kiss-beam::before {
content: "\f597";
}
.fa-film::before {
content: "\f008";
}
.fa-ruler-horizontal::before {
content: "\f547";
}
.fa-people-robbery::before {
content: "\e536";
}
.fa-lightbulb::before {
content: "\f0eb";
}
.fa-caret-left::before {
content: "\f0d9";
}
.fa-circle-exclamation::before {
content: "\f06a";
}
.fa-exclamation-circle::before {
content: "\f06a";
}
.fa-school-circle-xmark::before {
content: "\e56d";
}
.fa-arrow-right-from-bracket::before {
content: "\f08b";
}
.fa-sign-out::before {
content: "\f08b";
}
.fa-circle-chevron-down::before {
content: "\f13a";
}
.fa-chevron-circle-down::before {
content: "\f13a";
}
.fa-unlock-keyhole::before {
content: "\f13e";
}
.fa-unlock-alt::before {
content: "\f13e";
}
.fa-cloud-showers-heavy::before {
content: "\f740";
}
.fa-headphones-simple::before {
content: "\f58f";
}
.fa-headphones-alt::before {
content: "\f58f";
}
.fa-sitemap::before {
content: "\f0e8";
}
.fa-circle-dollar-to-slot::before {
content: "\f4b9";
}
.fa-donate::before {
content: "\f4b9";
}
.fa-memory::before {
content: "\f538";
}
.fa-road-spikes::before {
content: "\e568";
}
.fa-fire-burner::before {
content: "\e4f1";
}
.fa-flag::before {
content: "\f024";
}
.fa-hanukiah::before {
content: "\f6e6";
}
.fa-feather::before {
content: "\f52d";
}
.fa-volume-low::before {
content: "\f027";
}
.fa-volume-down::before {
content: "\f027";
}
.fa-comment-slash::before {
content: "\f4b3";
}
.fa-cloud-sun-rain::before {
content: "\f743";
}
.fa-compress::before {
content: "\f066";
}
.fa-wheat-awn::before {
content: "\e2cd";
}
.fa-wheat-alt::before {
content: "\e2cd";
}
.fa-ankh::before {
content: "\f644";
}
.fa-hands-holding-child::before {
content: "\e4fa";
}
.fa-asterisk::before {
content: "\*";
}
.fa-square-check::before {
content: "\f14a";
}
.fa-check-square::before {
content: "\f14a";
}
.fa-peseta-sign::before {
content: "\e221";
}
.fa-heading::before {
content: "\f1dc";
}
.fa-header::before {
content: "\f1dc";
}
.fa-ghost::before {
content: "\f6e2";
}
.fa-list::before {
content: "\f03a";
}
.fa-list-squares::before {
content: "\f03a";
}
.fa-square-phone-flip::before {
content: "\f87b";
}
.fa-phone-square-alt::before {
content: "\f87b";
}
.fa-cart-plus::before {
content: "\f217";
}
.fa-gamepad::before {
content: "\f11b";
}
.fa-circle-dot::before {
content: "\f192";
}
.fa-dot-circle::before {
content: "\f192";
}
.fa-face-dizzy::before {
content: "\f567";
}
.fa-dizzy::before {
content: "\f567";
}
.fa-egg::before {
content: "\f7fb";
}
.fa-house-medical-circle-xmark::before {
content: "\e513";
}
.fa-campground::before {
content: "\f6bb";
}
.fa-folder-plus::before {
content: "\f65e";
}
.fa-futbol::before {
content: "\f1e3";
}
.fa-futbol-ball::before {
content: "\f1e3";
}
.fa-soccer-ball::before {
content: "\f1e3";
}
.fa-paintbrush::before {
content: "\f1fc";
}
.fa-paint-brush::before {
content: "\f1fc";
}
.fa-lock::before {
content: "\f023";
}
.fa-gas-pump::before {
content: "\f52f";
}
.fa-hot-tub-person::before {
content: "\f593";
}
.fa-hot-tub::before {
content: "\f593";
}
.fa-map-location::before {
content: "\f59f";
}
.fa-map-marked::before {
content: "\f59f";
}
.fa-house-flood-water::before {
content: "\e50e";
}
.fa-tree::before {
content: "\f1bb";
}
.fa-bridge-lock::before {
content: "\e4cc";
}
.fa-sack-dollar::before {
content: "\f81d";
}
.fa-pen-to-square::before {
content: "\f044";
}
.fa-edit::before {
content: "\f044";
}
.fa-car-side::before {
content: "\f5e4";
}
.fa-share-nodes::before {
content: "\f1e0";
}
.fa-share-alt::before {
content: "\f1e0";
}
.fa-heart-circle-minus::before {
content: "\e4ff";
}
.fa-hourglass-half::before {
content: "\f252";
}
.fa-hourglass-2::before {
content: "\f252";
}
.fa-microscope::before {
content: "\f610";
}
.fa-sink::before {
content: "\e06d";
}
.fa-bag-shopping::before {
content: "\f290";
}
.fa-shopping-bag::before {
content: "\f290";
}
.fa-arrow-down-z-a::before {
content: "\f881";
}
.fa-sort-alpha-desc::before {
content: "\f881";
}
.fa-sort-alpha-down-alt::before {
content: "\f881";
}
.fa-mitten::before {
content: "\f7b5";
}
.fa-person-rays::before {
content: "\e54d";
}
.fa-users::before {
content: "\f0c0";
}
.fa-eye-slash::before {
content: "\f070";
}
.fa-flask-vial::before {
content: "\e4f3";
}
.fa-hand::before {
content: "\f256";
}
.fa-hand-paper::before {
content: "\f256";
}
.fa-om::before {
content: "\f679";
}
.fa-worm::before {
content: "\e599";
}
.fa-house-circle-xmark::before {
content: "\e50b";
}
.fa-plug::before {
content: "\f1e6";
}
.fa-chevron-up::before {
content: "\f077";
}
.fa-hand-spock::before {
content: "\f259";
}
.fa-stopwatch::before {
content: "\f2f2";
}
.fa-face-kiss::before {
content: "\f596";
}
.fa-kiss::before {
content: "\f596";
}
.fa-bridge-circle-xmark::before {
content: "\e4cb";
}
.fa-face-grin-tongue::before {
content: "\f589";
}
.fa-grin-tongue::before {
content: "\f589";
}
.fa-chess-bishop::before {
content: "\f43a";
}
.fa-face-grin-wink::before {
content: "\f58c";
}
.fa-grin-wink::before {
content: "\f58c";
}
.fa-ear-deaf::before {
content: "\f2a4";
}
.fa-deaf::before {
content: "\f2a4";
}
.fa-deafness::before {
content: "\f2a4";
}
.fa-hard-of-hearing::before {
content: "\f2a4";
}
.fa-road-circle-check::before {
content: "\e564";
}
.fa-dice-five::before {
content: "\f523";
}
.fa-square-rss::before {
content: "\f143";
}
.fa-rss-square::before {
content: "\f143";
}
.fa-land-mine-on::before {
content: "\e51b";
}
.fa-i-cursor::before {
content: "\f246";
}
.fa-stamp::before {
content: "\f5bf";
}
.fa-stairs::before {
content: "\e289";
}
.fa-i::before {
content: "I";
}
.fa-hryvnia-sign::before {
content: "\f6f2";
}
.fa-hryvnia::before {
content: "\f6f2";
}
.fa-pills::before {
content: "\f484";
}
.fa-face-grin-wide::before {
content: "\f581";
}
.fa-grin-alt::before {
content: "\f581";
}
.fa-tooth::before {
content: "\f5c9";
}
.fa-v::before {
content: "V";
}
.fa-bangladeshi-taka-sign::before {
content: "\e2e6";
}
.fa-bicycle::before {
content: "\f206";
}
.fa-staff-snake::before {
content: "\e579";
}
.fa-rod-asclepius::before {
content: "\e579";
}
.fa-rod-snake::before {
content: "\e579";
}
.fa-staff-aesculapius::before {
content: "\e579";
}
.fa-head-side-cough-slash::before {
content: "\e062";
}
.fa-truck-medical::before {
content: "\f0f9";
}
.fa-ambulance::before {
content: "\f0f9";
}
.fa-wheat-awn-circle-exclamation::before {
content: "\e598";
}
.fa-snowman::before {
content: "\f7d0";
}
.fa-mortar-pestle::before {
content: "\f5a7";
}
.fa-road-barrier::before {
content: "\e562";
}
.fa-school::before {
content: "\f549";
}
.fa-igloo::before {
content: "\f7ae";
}
.fa-joint::before {
content: "\f595";
}
.fa-angle-right::before {
content: "\f105";
}
.fa-horse::before {
content: "\f6f0";
}
.fa-q::before {
content: "Q";
}
.fa-g::before {
content: "G";
}
.fa-notes-medical::before {
content: "\f481";
}
.fa-temperature-half::before {
content: "\f2c9";
}
.fa-temperature-2::before {
content: "\f2c9";
}
.fa-thermometer-2::before {
content: "\f2c9";
}
.fa-thermometer-half::before {
content: "\f2c9";
}
.fa-dong-sign::before {
content: "\e169";
}
.fa-capsules::before {
content: "\f46b";
}
.fa-poo-storm::before {
content: "\f75a";
}
.fa-poo-bolt::before {
content: "\f75a";
}
.fa-face-frown-open::before {
content: "\f57a";
}
.fa-frown-open::before {
content: "\f57a";
}
.fa-hand-point-up::before {
content: "\f0a6";
}
.fa-money-bill::before {
content: "\f0d6";
}
.fa-bookmark::before {
content: "\f02e";
}
.fa-align-justify::before {
content: "\f039";
}
.fa-umbrella-beach::before {
content: "\f5ca";
}
.fa-helmet-un::before {
content: "\e503";
}
.fa-bullseye::before {
content: "\f140";
}
.fa-bacon::before {
content: "\f7e5";
}
.fa-hand-point-down::before {
content: "\f0a7";
}
.fa-arrow-up-from-bracket::before {
content: "\e09a";
}
.fa-folder::before {
content: "\f07b";
}
.fa-folder-blank::before {
content: "\f07b";
}
.fa-file-waveform::before {
content: "\f478";
}
.fa-file-medical-alt::before {
content: "\f478";
}
.fa-radiation::before {
content: "\f7b9";
}
.fa-chart-simple::before {
content: "\e473";
}
.fa-mars-stroke::before {
content: "\f229";
}
.fa-vial::before {
content: "\f492";
}
.fa-gauge::before {
content: "\f624";
}
.fa-dashboard::before {
content: "\f624";
}
.fa-gauge-med::before {
content: "\f624";
}
.fa-tachometer-alt-average::before {
content: "\f624";
}
.fa-wand-magic-sparkles::before {
content: "\e2ca";
}
.fa-magic-wand-sparkles::before {
content: "\e2ca";
}
.fa-e::before {
content: "E";
}
.fa-pen-clip::before {
content: "\f305";
}
.fa-pen-alt::before {
content: "\f305";
}
.fa-bridge-circle-exclamation::before {
content: "\e4ca";
}
.fa-user::before {
content: "\f007";
}
.fa-school-circle-check::before {
content: "\e56b";
}
.fa-dumpster::before {
content: "\f793";
}
.fa-van-shuttle::before {
content: "\f5b6";
}
.fa-shuttle-van::before {
content: "\f5b6";
}
.fa-building-user::before {
content: "\e4da";
}
.fa-square-caret-left::before {
content: "\f191";
}
.fa-caret-square-left::before {
content: "\f191";
}
.fa-highlighter::before {
content: "\f591";
}
.fa-key::before {
content: "\f084";
}
.fa-bullhorn::before {
content: "\f0a1";
}
.fa-globe::before {
content: "\f0ac";
}
.fa-synagogue::before {
content: "\f69b";
}
.fa-person-half-dress::before {
content: "\e548";
}
.fa-road-bridge::before {
content: "\e563";
}
.fa-location-arrow::before {
content: "\f124";
}
.fa-c::before {
content: "C";
}
.fa-tablet-button::before {
content: "\f10a";
}
.fa-building-lock::before {
content: "\e4d6";
}
.fa-pizza-slice::before {
content: "\f818";
}
.fa-money-bill-wave::before {
content: "\f53a";
}
.fa-chart-area::before {
content: "\f1fe";
}
.fa-area-chart::before {
content: "\f1fe";
}
.fa-house-flag::before {
content: "\e50d";
}
.fa-person-circle-minus::before {
content: "\e540";
}
.fa-ban::before {
content: "\f05e";
}
.fa-cancel::before {
content: "\f05e";
}
.fa-camera-rotate::before {
content: "\e0d8";
}
.fa-spray-can-sparkles::before {
content: "\f5d0";
}
.fa-air-freshener::before {
content: "\f5d0";
}
.fa-star::before {
content: "\f005";
}
.fa-repeat::before {
content: "\f363";
}
.fa-cross::before {
content: "\f654";
}
.fa-box::before {
content: "\f466";
}
.fa-venus-mars::before {
content: "\f228";
}
.fa-arrow-pointer::before {
content: "\f245";
}
.fa-mouse-pointer::before {
content: "\f245";
}
.fa-maximize::before {
content: "\f31e";
}
.fa-expand-arrows-alt::before {
content: "\f31e";
}
.fa-charging-station::before {
content: "\f5e7";
}
.fa-shapes::before {
content: "\f61f";
}
.fa-triangle-circle-square::before {
content: "\f61f";
}
.fa-shuffle::before {
content: "\f074";
}
.fa-random::before {
content: "\f074";
}
.fa-person-running::before {
content: "\f70c";
}
.fa-running::before {
content: "\f70c";
}
.fa-mobile-retro::before {
content: "\e527";
}
.fa-grip-lines-vertical::before {
content: "\f7a5";
}
.fa-spider::before {
content: "\f717";
}
.fa-hands-bound::before {
content: "\e4f9";
}
.fa-file-invoice-dollar::before {
content: "\f571";
}
.fa-plane-circle-exclamation::before {
content: "\e556";
}
.fa-x-ray::before {
content: "\f497";
}
.fa-spell-check::before {
content: "\f891";
}
.fa-slash::before {
content: "\f715";
}
.fa-computer-mouse::before {
content: "\f8cc";
}
.fa-mouse::before {
content: "\f8cc";
}
.fa-arrow-right-to-bracket::before {
content: "\f090";
}
.fa-sign-in::before {
content: "\f090";
}
.fa-shop-slash::before {
content: "\e070";
}
.fa-store-alt-slash::before {
content: "\e070";
}
.fa-server::before {
content: "\f233";
}
.fa-virus-covid-slash::before {
content: "\e4a9";
}
.fa-shop-lock::before {
content: "\e4a5";
}
.fa-hourglass-start::before {
content: "\f251";
}
.fa-hourglass-1::before {
content: "\f251";
}
.fa-blender-phone::before {
content: "\f6b6";
}
.fa-building-wheat::before {
content: "\e4db";
}
.fa-person-breastfeeding::before {
content: "\e53a";
}
.fa-right-to-bracket::before {
content: "\f2f6";
}
.fa-sign-in-alt::before {
content: "\f2f6";
}
.fa-venus::before {
content: "\f221";
}
.fa-passport::before {
content: "\f5ab";
}
.fa-heart-pulse::before {
content: "\f21e";
}
.fa-heartbeat::before {
content: "\f21e";
}
.fa-people-carry-box::before {
content: "\f4ce";
}
.fa-people-carry::before {
content: "\f4ce";
}
.fa-temperature-high::before {
content: "\f769";
}
.fa-microchip::before {
content: "\f2db";
}
.fa-crown::before {
content: "\f521";
}
.fa-weight-hanging::before {
content: "\f5cd";
}
.fa-xmarks-lines::before {
content: "\e59a";
}
.fa-file-prescription::before {
content: "\f572";
}
.fa-weight-scale::before {
content: "\f496";
}
.fa-weight::before {
content: "\f496";
}
.fa-user-group::before {
content: "\f500";
}
.fa-user-friends::before {
content: "\f500";
}
.fa-arrow-up-a-z::before {
content: "\f15e";
}
.fa-sort-alpha-up::before {
content: "\f15e";
}
.fa-chess-knight::before {
content: "\f441";
}
.fa-face-laugh-squint::before {
content: "\f59b";
}
.fa-laugh-squint::before {
content: "\f59b";
}
.fa-wheelchair::before {
content: "\f193";
}
.fa-circle-arrow-up::before {
content: "\f0aa";
}
.fa-arrow-circle-up::before {
content: "\f0aa";
}
.fa-toggle-on::before {
content: "\f205";
}
.fa-person-walking::before {
content: "\f554";
}
.fa-walking::before {
content: "\f554";
}
.fa-l::before {
content: "L";
}
.fa-fire::before {
content: "\f06d";
}
.fa-bed-pulse::before {
content: "\f487";
}
.fa-procedures::before {
content: "\f487";
}
.fa-shuttle-space::before {
content: "\f197";
}
.fa-space-shuttle::before {
content: "\f197";
}
.fa-face-laugh::before {
content: "\f599";
}
.fa-laugh::before {
content: "\f599";
}
.fa-folder-open::before {
content: "\f07c";
}
.fa-heart-circle-plus::before {
content: "\e500";
}
.fa-code-fork::before {
content: "\e13b";
}
.fa-city::before {
content: "\f64f";
}
.fa-microphone-lines::before {
content: "\f3c9";
}
.fa-microphone-alt::before {
content: "\f3c9";
}
.fa-pepper-hot::before {
content: "\f816";
}
.fa-unlock::before {
content: "\f09c";
}
.fa-colon-sign::before {
content: "\e140";
}
.fa-headset::before {
content: "\f590";
}
.fa-store-slash::before {
content: "\e071";
}
.fa-road-circle-xmark::before {
content: "\e566";
}
.fa-user-minus::before {
content: "\f503";
}
.fa-mars-stroke-up::before {
content: "\f22a";
}
.fa-mars-stroke-v::before {
content: "\f22a";
}
.fa-champagne-glasses::before {
content: "\f79f";
}
.fa-glass-cheers::before {
content: "\f79f";
}
.fa-clipboard::before {
content: "\f328";
}
.fa-house-circle-exclamation::before {
content: "\e50a";
}
.fa-file-arrow-up::before {
content: "\f574";
}
.fa-file-upload::before {
content: "\f574";
}
.fa-wifi::before {
content: "\f1eb";
}
.fa-wifi-3::before {
content: "\f1eb";
}
.fa-wifi-strong::before {
content: "\f1eb";
}
.fa-bath::before {
content: "\f2cd";
}
.fa-bathtub::before {
content: "\f2cd";
}
.fa-underline::before {
content: "\f0cd";
}
.fa-user-pen::before {
content: "\f4ff";
}
.fa-user-edit::before {
content: "\f4ff";
}
.fa-signature::before {
content: "\f5b7";
}
.fa-stroopwafel::before {
content: "\f551";
}
.fa-bold::before {
content: "\f032";
}
.fa-anchor-lock::before {
content: "\e4ad";
}
.fa-building-ngo::before {
content: "\e4d7";
}
.fa-manat-sign::before {
content: "\e1d5";
}
.fa-not-equal::before {
content: "\f53e";
}
.fa-border-top-left::before {
content: "\f853";
}
.fa-border-style::before {
content: "\f853";
}
.fa-map-location-dot::before {
content: "\f5a0";
}
.fa-map-marked-alt::before {
content: "\f5a0";
}
.fa-jedi::before {
content: "\f669";
}
.fa-square-poll-vertical::before {
content: "\f681";
}
.fa-poll::before {
content: "\f681";
}
.fa-mug-hot::before {
content: "\f7b6";
}
.fa-car-battery::before {
content: "\f5df";
}
.fa-battery-car::before {
content: "\f5df";
}
.fa-gift::before {
content: "\f06b";
}
.fa-dice-two::before {
content: "\f528";
}
.fa-chess-queen::before {
content: "\f445";
}
.fa-glasses::before {
content: "\f530";
}
.fa-chess-board::before {
content: "\f43c";
}
.fa-building-circle-check::before {
content: "\e4d2";
}
.fa-person-chalkboard::before {
content: "\e53d";
}
.fa-mars-stroke-right::before {
content: "\f22b";
}
.fa-mars-stroke-h::before {
content: "\f22b";
}
.fa-hand-back-fist::before {
content: "\f255";
}
.fa-hand-rock::before {
content: "\f255";
}
.fa-square-caret-up::before {
content: "\f151";
}
.fa-caret-square-up::before {
content: "\f151";
}
.fa-cloud-showers-water::before {
content: "\e4e4";
}
.fa-chart-bar::before {
content: "\f080";
}
.fa-bar-chart::before {
content: "\f080";
}
.fa-hands-bubbles::before {
content: "\e05e";
}
.fa-hands-wash::before {
content: "\e05e";
}
.fa-less-than-equal::before {
content: "\f537";
}
.fa-train::before {
content: "\f238";
}
.fa-eye-low-vision::before {
content: "\f2a8";
}
.fa-low-vision::before {
content: "\f2a8";
}
.fa-crow::before {
content: "\f520";
}
.fa-sailboat::before {
content: "\e445";
}
.fa-window-restore::before {
content: "\f2d2";
}
.fa-square-plus::before {
content: "\f0fe";
}
.fa-plus-square::before {
content: "\f0fe";
}
.fa-torii-gate::before {
content: "\f6a1";
}
.fa-frog::before {
content: "\f52e";
}
.fa-bucket::before {
content: "\e4cf";
}
.fa-image::before {
content: "\f03e";
}
.fa-microphone::before {
content: "\f130";
}
.fa-cow::before {
content: "\f6c8";
}
.fa-caret-up::before {
content: "\f0d8";
}
.fa-screwdriver::before {
content: "\f54a";
}
.fa-folder-closed::before {
content: "\e185";
}
.fa-house-tsunami::before {
content: "\e515";
}
.fa-square-nfi::before {
content: "\e576";
}
.fa-arrow-up-from-ground-water::before {
content: "\e4b5";
}
.fa-martini-glass::before {
content: "\f57b";
}
.fa-glass-martini-alt::before {
content: "\f57b";
}
.fa-rotate-left::before {
content: "\f2ea";
}
.fa-rotate-back::before {
content: "\f2ea";
}
.fa-rotate-backward::before {
content: "\f2ea";
}
.fa-undo-alt::before {
content: "\f2ea";
}
.fa-table-columns::before {
content: "\f0db";
}
.fa-columns::before {
content: "\f0db";
}
.fa-lemon::before {
content: "\f094";
}
.fa-head-side-mask::before {
content: "\e063";
}
.fa-handshake::before {
content: "\f2b5";
}
.fa-gem::before {
content: "\f3a5";
}
.fa-dolly::before {
content: "\f472";
}
.fa-dolly-box::before {
content: "\f472";
}
.fa-smoking::before {
content: "\f48d";
}
.fa-minimize::before {
content: "\f78c";
}
.fa-compress-arrows-alt::before {
content: "\f78c";
}
.fa-monument::before {
content: "\f5a6";
}
.fa-snowplow::before {
content: "\f7d2";
}
.fa-angles-right::before {
content: "\f101";
}
.fa-angle-double-right::before {
content: "\f101";
}
.fa-cannabis::before {
content: "\f55f";
}
.fa-circle-play::before {
content: "\f144";
}
.fa-play-circle::before {
content: "\f144";
}
.fa-tablets::before {
content: "\f490";
}
.fa-ethernet::before {
content: "\f796";
}
.fa-euro-sign::before {
content: "\f153";
}
.fa-eur::before {
content: "\f153";
}
.fa-euro::before {
content: "\f153";
}
.fa-chair::before {
content: "\f6c0";
}
.fa-circle-check::before {
content: "\f058";
}
.fa-check-circle::before {
content: "\f058";
}
.fa-circle-stop::before {
content: "\f28d";
}
.fa-stop-circle::before {
content: "\f28d";
}
.fa-compass-drafting::before {
content: "\f568";
}
.fa-drafting-compass::before {
content: "\f568";
}
.fa-plate-wheat::before {
content: "\e55a";
}
.fa-icicles::before {
content: "\f7ad";
}
.fa-person-shelter::before {
content: "\e54f";
}
.fa-neuter::before {
content: "\f22c";
}
.fa-id-badge::before {
content: "\f2c1";
}
.fa-marker::before {
content: "\f5a1";
}
.fa-face-laugh-beam::before {
content: "\f59a";
}
.fa-laugh-beam::before {
content: "\f59a";
}
.fa-helicopter-symbol::before {
content: "\e502";
}
.fa-universal-access::before {
content: "\f29a";
}
.fa-circle-chevron-up::before {
content: "\f139";
}
.fa-chevron-circle-up::before {
content: "\f139";
}
.fa-lari-sign::before {
content: "\e1c8";
}
.fa-volcano::before {
content: "\f770";
}
.fa-person-walking-dashed-line-arrow-right::before {
content: "\e553";
}
.fa-sterling-sign::before {
content: "\f154";
}
.fa-gbp::before {
content: "\f154";
}
.fa-pound-sign::before {
content: "\f154";
}
.fa-viruses::before {
content: "\e076";
}
.fa-square-person-confined::before {
content: "\e577";
}
.fa-user-tie::before {
content: "\f508";
}
.fa-arrow-down-long::before {
content: "\f175";
}
.fa-long-arrow-down::before {
content: "\f175";
}
.fa-tent-arrow-down-to-line::before {
content: "\e57e";
}
.fa-certificate::before {
content: "\f0a3";
}
.fa-reply-all::before {
content: "\f122";
}
.fa-mail-reply-all::before {
content: "\f122";
}
.fa-suitcase::before {
content: "\f0f2";
}
.fa-person-skating::before {
content: "\f7c5";
}
.fa-skating::before {
content: "\f7c5";
}
.fa-filter-circle-dollar::before {
content: "\f662";
}
.fa-funnel-dollar::before {
content: "\f662";
}
.fa-camera-retro::before {
content: "\f083";
}
.fa-circle-arrow-down::before {
content: "\f0ab";
}
.fa-arrow-circle-down::before {
content: "\f0ab";
}
.fa-file-import::before {
content: "\f56f";
}
.fa-arrow-right-to-file::before {
content: "\f56f";
}
.fa-square-arrow-up-right::before {
content: "\f14c";
}
.fa-external-link-square::before {
content: "\f14c";
}
.fa-box-open::before {
content: "\f49e";
}
.fa-scroll::before {
content: "\f70e";
}
.fa-spa::before {
content: "\f5bb";
}
.fa-location-pin-lock::before {
content: "\e51f";
}
.fa-pause::before {
content: "\f04c";
}
.fa-hill-avalanche::before {
content: "\e507";
}
.fa-temperature-empty::before {
content: "\f2cb";
}
.fa-temperature-0::before {
content: "\f2cb";
}
.fa-thermometer-0::before {
content: "\f2cb";
}
.fa-thermometer-empty::before {
content: "\f2cb";
}
.fa-bomb::before {
content: "\f1e2";
}
.fa-registered::before {
content: "\f25d";
}
.fa-address-card::before {
content: "\f2bb";
}
.fa-contact-card::before {
content: "\f2bb";
}
.fa-vcard::before {
content: "\f2bb";
}
.fa-scale-unbalanced-flip::before {
content: "\f516";
}
.fa-balance-scale-right::before {
content: "\f516";
}
.fa-subscript::before {
content: "\f12c";
}
.fa-diamond-turn-right::before {
content: "\f5eb";
}
.fa-directions::before {
content: "\f5eb";
}
.fa-burst::before {
content: "\e4dc";
}
.fa-house-laptop::before {
content: "\e066";
}
.fa-laptop-house::before {
content: "\e066";
}
.fa-face-tired::before {
content: "\f5c8";
}
.fa-tired::before {
content: "\f5c8";
}
.fa-money-bills::before {
content: "\e1f3";
}
.fa-smog::before {
content: "\f75f";
}
.fa-crutch::before {
content: "\f7f7";
}
.fa-cloud-arrow-up::before {
content: "\f0ee";
}
.fa-cloud-upload::before {
content: "\f0ee";
}
.fa-cloud-upload-alt::before {
content: "\f0ee";
}
.fa-palette::before {
content: "\f53f";
}
.fa-arrows-turn-right::before {
content: "\e4c0";
}
.fa-vest::before {
content: "\e085";
}
.fa-ferry::before {
content: "\e4ea";
}
.fa-arrows-down-to-people::before {
content: "\e4b9";
}
.fa-seedling::before {
content: "\f4d8";
}
.fa-sprout::before {
content: "\f4d8";
}
.fa-left-right::before {
content: "\f337";
}
.fa-arrows-alt-h::before {
content: "\f337";
}
.fa-boxes-packing::before {
content: "\e4c7";
}
.fa-circle-arrow-left::before {
content: "\f0a8";
}
.fa-arrow-circle-left::before {
content: "\f0a8";
}
.fa-group-arrows-rotate::before {
content: "\e4f6";
}
.fa-bowl-food::before {
content: "\e4c6";
}
.fa-candy-cane::before {
content: "\f786";
}
.fa-arrow-down-wide-short::before {
content: "\f160";
}
.fa-sort-amount-asc::before {
content: "\f160";
}
.fa-sort-amount-down::before {
content: "\f160";
}
.fa-cloud-bolt::before {
content: "\f76c";
}
.fa-thunderstorm::before {
content: "\f76c";
}
.fa-text-slash::before {
content: "\f87d";
}
.fa-remove-format::before {
content: "\f87d";
}
.fa-face-smile-wink::before {
content: "\f4da";
}
.fa-smile-wink::before {
content: "\f4da";
}
.fa-file-word::before {
content: "\f1c2";
}
.fa-file-powerpoint::before {
content: "\f1c4";
}
.fa-arrows-left-right::before {
content: "\f07e";
}
.fa-arrows-h::before {
content: "\f07e";
}
.fa-house-lock::before {
content: "\e510";
}
.fa-cloud-arrow-down::before {
content: "\f0ed";
}
.fa-cloud-download::before {
content: "\f0ed";
}
.fa-cloud-download-alt::before {
content: "\f0ed";
}
.fa-children::before {
content: "\e4e1";
}
.fa-chalkboard::before {
content: "\f51b";
}
.fa-blackboard::before {
content: "\f51b";
}
.fa-user-large-slash::before {
content: "\f4fa";
}
.fa-user-alt-slash::before {
content: "\f4fa";
}
.fa-envelope-open::before {
content: "\f2b6";
}
.fa-handshake-simple-slash::before {
content: "\e05f";
}
.fa-handshake-alt-slash::before {
content: "\e05f";
}
.fa-mattress-pillow::before {
content: "\e525";
}
.fa-guarani-sign::before {
content: "\e19a";
}
.fa-arrows-rotate::before {
content: "\f021";
}
.fa-refresh::before {
content: "\f021";
}
.fa-sync::before {
content: "\f021";
}
.fa-fire-extinguisher::before {
content: "\f134";
}
.fa-cruzeiro-sign::before {
content: "\e152";
}
.fa-greater-than-equal::before {
content: "\f532";
}
.fa-shield-halved::before {
content: "\f3ed";
}
.fa-shield-alt::before {
content: "\f3ed";
}
.fa-book-atlas::before {
content: "\f558";
}
.fa-atlas::before {
content: "\f558";
}
.fa-virus::before {
content: "\e074";
}
.fa-envelope-circle-check::before {
content: "\e4e8";
}
.fa-layer-group::before {
content: "\f5fd";
}
.fa-arrows-to-dot::before {
content: "\e4be";
}
.fa-archway::before {
content: "\f557";
}
.fa-heart-circle-check::before {
content: "\e4fd";
}
.fa-house-chimney-crack::before {
content: "\f6f1";
}
.fa-house-damage::before {
content: "\f6f1";
}
.fa-file-zipper::before {
content: "\f1c6";
}
.fa-file-archive::before {
content: "\f1c6";
}
.fa-square::before {
content: "\f0c8";
}
.fa-martini-glass-empty::before {
content: "\f000";
}
.fa-glass-martini::before {
content: "\f000";
}
.fa-couch::before {
content: "\f4b8";
}
.fa-cedi-sign::before {
content: "\e0df";
}
.fa-italic::before {
content: "\f033";
}
.fa-table-cells-column-lock::before {
content: "\e678";
}
.fa-church::before {
content: "\f51d";
}
.fa-comments-dollar::before {
content: "\f653";
}
.fa-democrat::before {
content: "\f747";
}
.fa-z::before {
content: "Z";
}
.fa-person-skiing::before {
content: "\f7c9";
}
.fa-skiing::before {
content: "\f7c9";
}
.fa-road-lock::before {
content: "\e567";
}
.fa-a::before {
content: "A";
}
.fa-temperature-arrow-down::before {
content: "\e03f";
}
.fa-temperature-down::before {
content: "\e03f";
}
.fa-feather-pointed::before {
content: "\f56b";
}
.fa-feather-alt::before {
content: "\f56b";
}
.fa-p::before {
content: "P";
}
.fa-snowflake::before {
content: "\f2dc";
}
.fa-newspaper::before {
content: "\f1ea";
}
.fa-rectangle-ad::before {
content: "\f641";
}
.fa-ad::before {
content: "\f641";
}
.fa-circle-arrow-right::before {
content: "\f0a9";
}
.fa-arrow-circle-right::before {
content: "\f0a9";
}
.fa-filter-circle-xmark::before {
content: "\e17b";
}
.fa-locust::before {
content: "\e520";
}
.fa-sort::before {
content: "\f0dc";
}
.fa-unsorted::before {
content: "\f0dc";
}
.fa-list-ol::before {
content: "\f0cb";
}
.fa-list-1-2::before {
content: "\f0cb";
}
.fa-list-numeric::before {
content: "\f0cb";
}
.fa-person-dress-burst::before {
content: "\e544";
}
.fa-money-check-dollar::before {
content: "\f53d";
}
.fa-money-check-alt::before {
content: "\f53d";
}
.fa-vector-square::before {
content: "\f5cb";
}
.fa-bread-slice::before {
content: "\f7ec";
}
.fa-language::before {
content: "\f1ab";
}
.fa-face-kiss-wink-heart::before {
content: "\f598";
}
.fa-kiss-wink-heart::before {
content: "\f598";
}
.fa-filter::before {
content: "\f0b0";
}
.fa-question::before {
content: "\?";
}
.fa-file-signature::before {
content: "\f573";
}
.fa-up-down-left-right::before {
content: "\f0b2";
}
.fa-arrows-alt::before {
content: "\f0b2";
}
.fa-house-chimney-user::before {
content: "\e065";
}
.fa-hand-holding-heart::before {
content: "\f4be";
}
.fa-puzzle-piece::before {
content: "\f12e";
}
.fa-money-check::before {
content: "\f53c";
}
.fa-star-half-stroke::before {
content: "\f5c0";
}
.fa-star-half-alt::before {
content: "\f5c0";
}
.fa-code::before {
content: "\f121";
}
.fa-whiskey-glass::before {
content: "\f7a0";
}
.fa-glass-whiskey::before {
content: "\f7a0";
}
.fa-building-circle-exclamation::before {
content: "\e4d3";
}
.fa-magnifying-glass-chart::before {
content: "\e522";
}
.fa-arrow-up-right-from-square::before {
content: "\f08e";
}
.fa-external-link::before {
content: "\f08e";
}
.fa-cubes-stacked::before {
content: "\e4e6";
}
.fa-won-sign::before {
content: "\f159";
}
.fa-krw::before {
content: "\f159";
}
.fa-won::before {
content: "\f159";
}
.fa-virus-covid::before {
content: "\e4a8";
}
.fa-austral-sign::before {
content: "\e0a9";
}
.fa-f::before {
content: "F";
}
.fa-leaf::before {
content: "\f06c";
}
.fa-road::before {
content: "\f018";
}
.fa-taxi::before {
content: "\f1ba";
}
.fa-cab::before {
content: "\f1ba";
}
.fa-person-circle-plus::before {
content: "\e541";
}
.fa-chart-pie::before {
content: "\f200";
}
.fa-pie-chart::before {
content: "\f200";
}
.fa-bolt-lightning::before {
content: "\e0b7";
}
.fa-sack-xmark::before {
content: "\e56a";
}
.fa-file-excel::before {
content: "\f1c3";
}
.fa-file-contract::before {
content: "\f56c";
}
.fa-fish-fins::before {
content: "\e4f2";
}
.fa-building-flag::before {
content: "\e4d5";
}
.fa-face-grin-beam::before {
content: "\f582";
}
.fa-grin-beam::before {
content: "\f582";
}
.fa-object-ungroup::before {
content: "\f248";
}
.fa-poop::before {
content: "\f619";
}
.fa-location-pin::before {
content: "\f041";
}
.fa-map-marker::before {
content: "\f041";
}
.fa-kaaba::before {
content: "\f66b";
}
.fa-toilet-paper::before {
content: "\f71e";
}
.fa-helmet-safety::before {
content: "\f807";
}
.fa-hard-hat::before {
content: "\f807";
}
.fa-hat-hard::before {
content: "\f807";
}
.fa-eject::before {
content: "\f052";
}
.fa-circle-right::before {
content: "\f35a";
}
.fa-arrow-alt-circle-right::before {
content: "\f35a";
}
.fa-plane-circle-check::before {
content: "\e555";
}
.fa-face-rolling-eyes::before {
content: "\f5a5";
}
.fa-meh-rolling-eyes::before {
content: "\f5a5";
}
.fa-object-group::before {
content: "\f247";
}
.fa-chart-line::before {
content: "\f201";
}
.fa-line-chart::before {
content: "\f201";
}
.fa-mask-ventilator::before {
content: "\e524";
}
.fa-arrow-right::before {
content: "\f061";
}
.fa-signs-post::before {
content: "\f277";
}
.fa-map-signs::before {
content: "\f277";
}
.fa-cash-register::before {
content: "\f788";
}
.fa-person-circle-question::before {
content: "\e542";
}
.fa-h::before {
content: "H";
}
.fa-tarp::before {
content: "\e57b";
}
.fa-screwdriver-wrench::before {
content: "\f7d9";
}
.fa-tools::before {
content: "\f7d9";
}
.fa-arrows-to-eye::before {
content: "\e4bf";
}
.fa-plug-circle-bolt::before {
content: "\e55b";
}
.fa-heart::before {
content: "\f004";
}
.fa-mars-and-venus::before {
content: "\f224";
}
.fa-house-user::before {
content: "\e1b0";
}
.fa-home-user::before {
content: "\e1b0";
}
.fa-dumpster-fire::before {
content: "\f794";
}
.fa-house-crack::before {
content: "\e3b1";
}
.fa-martini-glass-citrus::before {
content: "\f561";
}
.fa-cocktail::before {
content: "\f561";
}
.fa-face-surprise::before {
content: "\f5c2";
}
.fa-surprise::before {
content: "\f5c2";
}
.fa-bottle-water::before {
content: "\e4c5";
}
.fa-circle-pause::before {
content: "\f28b";
}
.fa-pause-circle::before {
content: "\f28b";
}
.fa-toilet-paper-slash::before {
content: "\e072";
}
.fa-apple-whole::before {
content: "\f5d1";
}
.fa-apple-alt::before {
content: "\f5d1";
}
.fa-kitchen-set::before {
content: "\e51a";
}
.fa-r::before {
content: "R";
}
.fa-temperature-quarter::before {
content: "\f2ca";
}
.fa-temperature-1::before {
content: "\f2ca";
}
.fa-thermometer-1::before {
content: "\f2ca";
}
.fa-thermometer-quarter::before {
content: "\f2ca";
}
.fa-cube::before {
content: "\f1b2";
}
.fa-bitcoin-sign::before {
content: "\e0b4";
}
.fa-shield-dog::before {
content: "\e573";
}
.fa-solar-panel::before {
content: "\f5ba";
}
.fa-lock-open::before {
content: "\f3c1";
}
.fa-elevator::before {
content: "\e16d";
}
.fa-money-bill-transfer::before {
content: "\e528";
}
.fa-money-bill-trend-up::before {
content: "\e529";
}
.fa-house-flood-water-circle-arrow-right::before {
content: "\e50f";
}
.fa-square-poll-horizontal::before {
content: "\f682";
}
.fa-poll-h::before {
content: "\f682";
}
.fa-circle::before {
content: "\f111";
}
.fa-backward-fast::before {
content: "\f049";
}
.fa-fast-backward::before {
content: "\f049";
}
.fa-recycle::before {
content: "\f1b8";
}
.fa-user-astronaut::before {
content: "\f4fb";
}
.fa-plane-slash::before {
content: "\e069";
}
.fa-trademark::before {
content: "\f25c";
}
.fa-basketball::before {
content: "\f434";
}
.fa-basketball-ball::before {
content: "\f434";
}
.fa-satellite-dish::before {
content: "\f7c0";
}
.fa-circle-up::before {
content: "\f35b";
}
.fa-arrow-alt-circle-up::before {
content: "\f35b";
}
.fa-mobile-screen-button::before {
content: "\f3cd";
}
.fa-mobile-alt::before {
content: "\f3cd";
}
.fa-volume-high::before {
content: "\f028";
}
.fa-volume-up::before {
content: "\f028";
}
.fa-users-rays::before {
content: "\e593";
}
.fa-wallet::before {
content: "\f555";
}
.fa-clipboard-check::before {
content: "\f46c";
}
.fa-file-audio::before {
content: "\f1c7";
}
.fa-burger::before {
content: "\f805";
}
.fa-hamburger::before {
content: "\f805";
}
.fa-wrench::before {
content: "\f0ad";
}
.fa-bugs::before {
content: "\e4d0";
}
.fa-rupee-sign::before {
content: "\f156";
}
.fa-rupee::before {
content: "\f156";
}
.fa-file-image::before {
content: "\f1c5";
}
.fa-circle-question::before {
content: "\f059";
}
.fa-question-circle::before {
content: "\f059";
}
.fa-plane-departure::before {
content: "\f5b0";
}
.fa-handshake-slash::before {
content: "\e060";
}
.fa-book-bookmark::before {
content: "\e0bb";
}
.fa-code-branch::before {
content: "\f126";
}
.fa-hat-cowboy::before {
content: "\f8c0";
}
.fa-bridge::before {
content: "\e4c8";
}
.fa-phone-flip::before {
content: "\f879";
}
.fa-phone-alt::before {
content: "\f879";
}
.fa-truck-front::before {
content: "\e2b7";
}
.fa-cat::before {
content: "\f6be";
}
.fa-anchor-circle-exclamation::before {
content: "\e4ab";
}
.fa-truck-field::before {
content: "\e58d";
}
.fa-route::before {
content: "\f4d7";
}
.fa-clipboard-question::before {
content: "\e4e3";
}
.fa-panorama::before {
content: "\e209";
}
.fa-comment-medical::before {
content: "\f7f5";
}
.fa-teeth-open::before {
content: "\f62f";
}
.fa-file-circle-minus::before {
content: "\e4ed";
}
.fa-tags::before {
content: "\f02c";
}
.fa-wine-glass::before {
content: "\f4e3";
}
.fa-forward-fast::before {
content: "\f050";
}
.fa-fast-forward::before {
content: "\f050";
}
.fa-face-meh-blank::before {
content: "\f5a4";
}
.fa-meh-blank::before {
content: "\f5a4";
}
.fa-square-parking::before {
content: "\f540";
}
.fa-parking::before {
content: "\f540";
}
.fa-house-signal::before {
content: "\e012";
}
.fa-bars-progress::before {
content: "\f828";
}
.fa-tasks-alt::before {
content: "\f828";
}
.fa-faucet-drip::before {
content: "\e006";
}
.fa-cart-flatbed::before {
content: "\f474";
}
.fa-dolly-flatbed::before {
content: "\f474";
}
.fa-ban-smoking::before {
content: "\f54d";
}
.fa-smoking-ban::before {
content: "\f54d";
}
.fa-terminal::before {
content: "\f120";
}
.fa-mobile-button::before {
content: "\f10b";
}
.fa-house-medical-flag::before {
content: "\e514";
}
.fa-basket-shopping::before {
content: "\f291";
}
.fa-shopping-basket::before {
content: "\f291";
}
.fa-tape::before {
content: "\f4db";
}
.fa-bus-simple::before {
content: "\f55e";
}
.fa-bus-alt::before {
content: "\f55e";
}
.fa-eye::before {
content: "\f06e";
}
.fa-face-sad-cry::before {
content: "\f5b3";
}
.fa-sad-cry::before {
content: "\f5b3";
}
.fa-audio-description::before {
content: "\f29e";
}
.fa-person-military-to-person::before {
content: "\e54c";
}
.fa-file-shield::before {
content: "\e4f0";
}
.fa-user-slash::before {
content: "\f506";
}
.fa-pen::before {
content: "\f304";
}
.fa-tower-observation::before {
content: "\e586";
}
.fa-file-code::before {
content: "\f1c9";
}
.fa-signal::before {
content: "\f012";
}
.fa-signal-5::before {
content: "\f012";
}
.fa-signal-perfect::before {
content: "\f012";
}
.fa-bus::before {
content: "\f207";
}
.fa-heart-circle-xmark::before {
content: "\e501";
}
.fa-house-chimney::before {
content: "\e3af";
}
.fa-home-lg::before {
content: "\e3af";
}
.fa-window-maximize::before {
content: "\f2d0";
}
.fa-face-frown::before {
content: "\f119";
}
.fa-frown::before {
content: "\f119";
}
.fa-prescription::before {
content: "\f5b1";
}
.fa-shop::before {
content: "\f54f";
}
.fa-store-alt::before {
content: "\f54f";
}
.fa-floppy-disk::before {
content: "\f0c7";
}
.fa-save::before {
content: "\f0c7";
}
.fa-vihara::before {
content: "\f6a7";
}
.fa-scale-unbalanced::before {
content: "\f515";
}
.fa-balance-scale-left::before {
content: "\f515";
}
.fa-sort-up::before {
content: "\f0de";
}
.fa-sort-asc::before {
content: "\f0de";
}
.fa-comment-dots::before {
content: "\f4ad";
}
.fa-commenting::before {
content: "\f4ad";
}
.fa-plant-wilt::before {
content: "\e5aa";
}
.fa-diamond::before {
content: "\f219";
}
.fa-face-grin-squint::before {
content: "\f585";
}
.fa-grin-squint::before {
content: "\f585";
}
.fa-hand-holding-dollar::before {
content: "\f4c0";
}
.fa-hand-holding-usd::before {
content: "\f4c0";
}
.fa-bacterium::before {
content: "\e05a";
}
.fa-hand-pointer::before {
content: "\f25a";
}
.fa-drum-steelpan::before {
content: "\f56a";
}
.fa-hand-scissors::before {
content: "\f257";
}
.fa-hands-praying::before {
content: "\f684";
}
.fa-praying-hands::before {
content: "\f684";
}
.fa-arrow-rotate-right::before {
content: "\f01e";
}
.fa-arrow-right-rotate::before {
content: "\f01e";
}
.fa-arrow-rotate-forward::before {
content: "\f01e";
}
.fa-redo::before {
content: "\f01e";
}
.fa-biohazard::before {
content: "\f780";
}
.fa-location-crosshairs::before {
content: "\f601";
}
.fa-location::before {
content: "\f601";
}
.fa-mars-double::before {
content: "\f227";
}
.fa-child-dress::before {
content: "\e59c";
}
.fa-users-between-lines::before {
content: "\e591";
}
.fa-lungs-virus::before {
content: "\e067";
}
.fa-face-grin-tears::before {
content: "\f588";
}
.fa-grin-tears::before {
content: "\f588";
}
.fa-phone::before {
content: "\f095";
}
.fa-calendar-xmark::before {
content: "\f273";
}
.fa-calendar-times::before {
content: "\f273";
}
.fa-child-reaching::before {
content: "\e59d";
}
.fa-head-side-virus::before {
content: "\e064";
}
.fa-user-gear::before {
content: "\f4fe";
}
.fa-user-cog::before {
content: "\f4fe";
}
.fa-arrow-up-1-9::before {
content: "\f163";
}
.fa-sort-numeric-up::before {
content: "\f163";
}
.fa-door-closed::before {
content: "\f52a";
}
.fa-shield-virus::before {
content: "\e06c";
}
.fa-dice-six::before {
content: "\f526";
}
.fa-mosquito-net::before {
content: "\e52c";
}
.fa-bridge-water::before {
content: "\e4ce";
}
.fa-person-booth::before {
content: "\f756";
}
.fa-text-width::before {
content: "\f035";
}
.fa-hat-wizard::before {
content: "\f6e8";
}
.fa-pen-fancy::before {
content: "\f5ac";
}
.fa-person-digging::before {
content: "\f85e";
}
.fa-digging::before {
content: "\f85e";
}
.fa-trash::before {
content: "\f1f8";
}
.fa-gauge-simple::before {
content: "\f629";
}
.fa-gauge-simple-med::before {
content: "\f629";
}
.fa-tachometer-average::before {
content: "\f629";
}
.fa-book-medical::before {
content: "\f7e6";
}
.fa-poo::before {
content: "\f2fe";
}
.fa-quote-right::before {
content: "\f10e";
}
.fa-quote-right-alt::before {
content: "\f10e";
}
.fa-shirt::before {
content: "\f553";
}
.fa-t-shirt::before {
content: "\f553";
}
.fa-tshirt::before {
content: "\f553";
}
.fa-cubes::before {
content: "\f1b3";
}
.fa-divide::before {
content: "\f529";
}
.fa-tenge-sign::before {
content: "\f7d7";
}
.fa-tenge::before {
content: "\f7d7";
}
.fa-headphones::before {
content: "\f025";
}
.fa-hands-holding::before {
content: "\f4c2";
}
.fa-hands-clapping::before {
content: "\e1a8";
}
.fa-republican::before {
content: "\f75e";
}
.fa-arrow-left::before {
content: "\f060";
}
.fa-person-circle-xmark::before {
content: "\e543";
}
.fa-ruler::before {
content: "\f545";
}
.fa-align-left::before {
content: "\f036";
}
.fa-dice-d6::before {
content: "\f6d1";
}
.fa-restroom::before {
content: "\f7bd";
}
.fa-j::before {
content: "J";
}
.fa-users-viewfinder::before {
content: "\e595";
}
.fa-file-video::before {
content: "\f1c8";
}
.fa-up-right-from-square::before {
content: "\f35d";
}
.fa-external-link-alt::before {
content: "\f35d";
}
.fa-table-cells::before {
content: "\f00a";
}
.fa-th::before {
content: "\f00a";
}
.fa-file-pdf::before {
content: "\f1c1";
}
.fa-book-bible::before {
content: "\f647";
}
.fa-bible::before {
content: "\f647";
}
.fa-o::before {
content: "O";
}
.fa-suitcase-medical::before {
content: "\f0fa";
}
.fa-medkit::before {
content: "\f0fa";
}
.fa-user-secret::before {
content: "\f21b";
}
.fa-otter::before {
content: "\f700";
}
.fa-person-dress::before {
content: "\f182";
}
.fa-female::before {
content: "\f182";
}
.fa-comment-dollar::before {
content: "\f651";
}
.fa-business-time::before {
content: "\f64a";
}
.fa-briefcase-clock::before {
content: "\f64a";
}
.fa-table-cells-large::before {
content: "\f009";
}
.fa-th-large::before {
content: "\f009";
}
.fa-book-tanakh::before {
content: "\f827";
}
.fa-tanakh::before {
content: "\f827";
}
.fa-phone-volume::before {
content: "\f2a0";
}
.fa-volume-control-phone::before {
content: "\f2a0";
}
.fa-hat-cowboy-side::before {
content: "\f8c1";
}
.fa-clipboard-user::before {
content: "\f7f3";
}
.fa-child::before {
content: "\f1ae";
}
.fa-lira-sign::before {
content: "\f195";
}
.fa-satellite::before {
content: "\f7bf";
}
.fa-plane-lock::before {
content: "\e558";
}
.fa-tag::before {
content: "\f02b";
}
.fa-comment::before {
content: "\f075";
}
.fa-cake-candles::before {
content: "\f1fd";
}
.fa-birthday-cake::before {
content: "\f1fd";
}
.fa-cake::before {
content: "\f1fd";
}
.fa-envelope::before {
content: "\f0e0";
}
.fa-angles-up::before {
content: "\f102";
}
.fa-angle-double-up::before {
content: "\f102";
}
.fa-paperclip::before {
content: "\f0c6";
}
.fa-arrow-right-to-city::before {
content: "\e4b3";
}
.fa-ribbon::before {
content: "\f4d6";
}
.fa-lungs::before {
content: "\f604";
}
.fa-arrow-up-9-1::before {
content: "\f887";
}
.fa-sort-numeric-up-alt::before {
content: "\f887";
}
.fa-litecoin-sign::before {
content: "\e1d3";
}
.fa-border-none::before {
content: "\f850";
}
.fa-circle-nodes::before {
content: "\e4e2";
}
.fa-parachute-box::before {
content: "\f4cd";
}
.fa-indent::before {
content: "\f03c";
}
.fa-truck-field-un::before {
content: "\e58e";
}
.fa-hourglass::before {
content: "\f254";
}
.fa-hourglass-empty::before {
content: "\f254";
}
.fa-mountain::before {
content: "\f6fc";
}
.fa-user-doctor::before {
content: "\f0f0";
}
.fa-user-md::before {
content: "\f0f0";
}
.fa-circle-info::before {
content: "\f05a";
}
.fa-info-circle::before {
content: "\f05a";
}
.fa-cloud-meatball::before {
content: "\f73b";
}
.fa-camera::before {
content: "\f030";
}
.fa-camera-alt::before {
content: "\f030";
}
.fa-square-virus::before {
content: "\e578";
}
.fa-meteor::before {
content: "\f753";
}
.fa-car-on::before {
content: "\e4dd";
}
.fa-sleigh::before {
content: "\f7cc";
}
.fa-arrow-down-1-9::before {
content: "\f162";
}
.fa-sort-numeric-asc::before {
content: "\f162";
}
.fa-sort-numeric-down::before {
content: "\f162";
}
.fa-hand-holding-droplet::before {
content: "\f4c1";
}
.fa-hand-holding-water::before {
content: "\f4c1";
}
.fa-water::before {
content: "\f773";
}
.fa-calendar-check::before {
content: "\f274";
}
.fa-braille::before {
content: "\f2a1";
}
.fa-prescription-bottle-medical::before {
content: "\f486";
}
.fa-prescription-bottle-alt::before {
content: "\f486";
}
.fa-landmark::before {
content: "\f66f";
}
.fa-truck::before {
content: "\f0d1";
}
.fa-crosshairs::before {
content: "\f05b";
}
.fa-person-cane::before {
content: "\e53c";
}
.fa-tent::before {
content: "\e57d";
}
.fa-vest-patches::before {
content: "\e086";
}
.fa-check-double::before {
content: "\f560";
}
.fa-arrow-down-a-z::before {
content: "\f15d";
}
.fa-sort-alpha-asc::before {
content: "\f15d";
}
.fa-sort-alpha-down::before {
content: "\f15d";
}
.fa-money-bill-wheat::before {
content: "\e52a";
}
.fa-cookie::before {
content: "\f563";
}
.fa-arrow-rotate-left::before {
content: "\f0e2";
}
.fa-arrow-left-rotate::before {
content: "\f0e2";
}
.fa-arrow-rotate-back::before {
content: "\f0e2";
}
.fa-arrow-rotate-backward::before {
content: "\f0e2";
}
.fa-undo::before {
content: "\f0e2";
}
.fa-hard-drive::before {
content: "\f0a0";
}
.fa-hdd::before {
content: "\f0a0";
}
.fa-face-grin-squint-tears::before {
content: "\f586";
}
.fa-grin-squint-tears::before {
content: "\f586";
}
.fa-dumbbell::before {
content: "\f44b";
}
.fa-rectangle-list::before {
content: "\f022";
}
.fa-list-alt::before {
content: "\f022";
}
.fa-tarp-droplet::before {
content: "\e57c";
}
.fa-house-medical-circle-check::before {
content: "\e511";
}
.fa-person-skiing-nordic::before {
content: "\f7ca";
}
.fa-skiing-nordic::before {
content: "\f7ca";
}
.fa-calendar-plus::before {
content: "\f271";
}
.fa-plane-arrival::before {
content: "\f5af";
}
.fa-circle-left::before {
content: "\f359";
}
.fa-arrow-alt-circle-left::before {
content: "\f359";
}
.fa-train-subway::before {
content: "\f239";
}
.fa-subway::before {
content: "\f239";
}
.fa-chart-gantt::before {
content: "\e0e4";
}
.fa-indian-rupee-sign::before {
content: "\e1bc";
}
.fa-indian-rupee::before {
content: "\e1bc";
}
.fa-inr::before {
content: "\e1bc";
}
.fa-crop-simple::before {
content: "\f565";
}
.fa-crop-alt::before {
content: "\f565";
}
.fa-money-bill-1::before {
content: "\f3d1";
}
.fa-money-bill-alt::before {
content: "\f3d1";
}
.fa-left-long::before {
content: "\f30a";
}
.fa-long-arrow-alt-left::before {
content: "\f30a";
}
.fa-dna::before {
content: "\f471";
}
.fa-virus-slash::before {
content: "\e075";
}
.fa-minus::before {
content: "\f068";
}
.fa-subtract::before {
content: "\f068";
}
.fa-chess::before {
content: "\f439";
}
.fa-arrow-left-long::before {
content: "\f177";
}
.fa-long-arrow-left::before {
content: "\f177";
}
.fa-plug-circle-check::before {
content: "\e55c";
}
.fa-street-view::before {
content: "\f21d";
}
.fa-franc-sign::before {
content: "\e18f";
}
.fa-volume-off::before {
content: "\f026";
}
.fa-hands-asl-interpreting::before {
content: "\f2a3";
}
.fa-american-sign-language-interpreting::before {
content: "\f2a3";
}
.fa-asl-interpreting::before {
content: "\f2a3";
}
.fa-hands-american-sign-language-interpreting::before {
content: "\f2a3";
}
.fa-gear::before {
content: "\f013";
}
.fa-cog::before {
content: "\f013";
}
.fa-droplet-slash::before {
content: "\f5c7";
}
.fa-tint-slash::before {
content: "\f5c7";
}
.fa-mosque::before {
content: "\f678";
}
.fa-mosquito::before {
content: "\e52b";
}
.fa-star-of-david::before {
content: "\f69a";
}
.fa-person-military-rifle::before {
content: "\e54b";
}
.fa-cart-shopping::before {
content: "\f07a";
}
.fa-shopping-cart::before {
content: "\f07a";
}
.fa-vials::before {
content: "\f493";
}
.fa-plug-circle-plus::before {
content: "\e55f";
}
.fa-place-of-worship::before {
content: "\f67f";
}
.fa-grip-vertical::before {
content: "\f58e";
}
.fa-arrow-turn-up::before {
content: "\f148";
}
.fa-level-up::before {
content: "\f148";
}
.fa-u::before {
content: "U";
}
.fa-square-root-variable::before {
content: "\f698";
}
.fa-square-root-alt::before {
content: "\f698";
}
.fa-clock::before {
content: "\f017";
}
.fa-clock-four::before {
content: "\f017";
}
.fa-backward-step::before {
content: "\f048";
}
.fa-step-backward::before {
content: "\f048";
}
.fa-pallet::before {
content: "\f482";
}
.fa-faucet::before {
content: "\e005";
}
.fa-baseball-bat-ball::before {
content: "\f432";
}
.fa-s::before {
content: "S";
}
.fa-timeline::before {
content: "\e29c";
}
.fa-keyboard::before {
content: "\f11c";
}
.fa-caret-down::before {
content: "\f0d7";
}
.fa-house-chimney-medical::before {
content: "\f7f2";
}
.fa-clinic-medical::before {
content: "\f7f2";
}
.fa-temperature-three-quarters::before {
content: "\f2c8";
}
.fa-temperature-3::before {
content: "\f2c8";
}
.fa-thermometer-3::before {
content: "\f2c8";
}
.fa-thermometer-three-quarters::before {
content: "\f2c8";
}
.fa-mobile-screen::before {
content: "\f3cf";
}
.fa-mobile-android-alt::before {
content: "\f3cf";
}
.fa-plane-up::before {
content: "\e22d";
}
.fa-piggy-bank::before {
content: "\f4d3";
}
.fa-battery-half::before {
content: "\f242";
}
.fa-battery-3::before {
content: "\f242";
}
.fa-mountain-city::before {
content: "\e52e";
}
.fa-coins::before {
content: "\f51e";
}
.fa-khanda::before {
content: "\f66d";
}
.fa-sliders::before {
content: "\f1de";
}
.fa-sliders-h::before {
content: "\f1de";
}
.fa-folder-tree::before {
content: "\f802";
}
.fa-network-wired::before {
content: "\f6ff";
}
.fa-map-pin::before {
content: "\f276";
}
.fa-hamsa::before {
content: "\f665";
}
.fa-cent-sign::before {
content: "\e3f5";
}
.fa-flask::before {
content: "\f0c3";
}
.fa-person-pregnant::before {
content: "\e31e";
}
.fa-wand-sparkles::before {
content: "\f72b";
}
.fa-ellipsis-vertical::before {
content: "\f142";
}
.fa-ellipsis-v::before {
content: "\f142";
}
.fa-ticket::before {
content: "\f145";
}
.fa-power-off::before {
content: "\f011";
}
.fa-right-long::before {
content: "\f30b";
}
.fa-long-arrow-alt-right::before {
content: "\f30b";
}
.fa-flag-usa::before {
content: "\f74d";
}
.fa-laptop-file::before {
content: "\e51d";
}
.fa-tty::before {
content: "\f1e4";
}
.fa-teletype::before {
content: "\f1e4";
}
.fa-diagram-next::before {
content: "\e476";
}
.fa-person-rifle::before {
content: "\e54e";
}
.fa-house-medical-circle-exclamation::before {
content: "\e512";
}
.fa-closed-captioning::before {
content: "\f20a";
}
.fa-person-hiking::before {
content: "\f6ec";
}
.fa-hiking::before {
content: "\f6ec";
}
.fa-venus-double::before {
content: "\f226";
}
.fa-images::before {
content: "\f302";
}
.fa-calculator::before {
content: "\f1ec";
}
.fa-people-pulling::before {
content: "\e535";
}
.fa-n::before {
content: "N";
}
.fa-cable-car::before {
content: "\f7da";
}
.fa-tram::before {
content: "\f7da";
}
.fa-cloud-rain::before {
content: "\f73d";
}
.fa-building-circle-xmark::before {
content: "\e4d4";
}
.fa-ship::before {
content: "\f21a";
}
.fa-arrows-down-to-line::before {
content: "\e4b8";
}
.fa-download::before {
content: "\f019";
}
.fa-face-grin::before {
content: "\f580";
}
.fa-grin::before {
content: "\f580";
}
.fa-delete-left::before {
content: "\f55a";
}
.fa-backspace::before {
content: "\f55a";
}
.fa-eye-dropper::before {
content: "\f1fb";
}
.fa-eye-dropper-empty::before {
content: "\f1fb";
}
.fa-eyedropper::before {
content: "\f1fb";
}
.fa-file-circle-check::before {
content: "\e5a0";
}
.fa-forward::before {
content: "\f04e";
}
.fa-mobile::before {
content: "\f3ce";
}
.fa-mobile-android::before {
content: "\f3ce";
}
.fa-mobile-phone::before {
content: "\f3ce";
}
.fa-face-meh::before {
content: "\f11a";
}
.fa-meh::before {
content: "\f11a";
}
.fa-align-center::before {
content: "\f037";
}
.fa-book-skull::before {
content: "\f6b7";
}
.fa-book-dead::before {
content: "\f6b7";
}
.fa-id-card::before {
content: "\f2c2";
}
.fa-drivers-license::before {
content: "\f2c2";
}
.fa-outdent::before {
content: "\f03b";
}
.fa-dedent::before {
content: "\f03b";
}
.fa-heart-circle-exclamation::before {
content: "\e4fe";
}
.fa-house::before {
content: "\f015";
}
.fa-home::before {
content: "\f015";
}
.fa-home-alt::before {
content: "\f015";
}
.fa-home-lg-alt::before {
content: "\f015";
}
.fa-calendar-week::before {
content: "\f784";
}
.fa-laptop-medical::before {
content: "\f812";
}
.fa-b::before {
content: "B";
}
.fa-file-medical::before {
content: "\f477";
}
.fa-dice-one::before {
content: "\f525";
}
.fa-kiwi-bird::before {
content: "\f535";
}
.fa-arrow-right-arrow-left::before {
content: "\f0ec";
}
.fa-exchange::before {
content: "\f0ec";
}
.fa-rotate-right::before {
content: "\f2f9";
}
.fa-redo-alt::before {
content: "\f2f9";
}
.fa-rotate-forward::before {
content: "\f2f9";
}
.fa-utensils::before {
content: "\f2e7";
}
.fa-cutlery::before {
content: "\f2e7";
}
.fa-arrow-up-wide-short::before {
content: "\f161";
}
.fa-sort-amount-up::before {
content: "\f161";
}
.fa-mill-sign::before {
content: "\e1ed";
}
.fa-bowl-rice::before {
content: "\e2eb";
}
.fa-skull::before {
content: "\f54c";
}
.fa-tower-broadcast::before {
content: "\f519";
}
.fa-broadcast-tower::before {
content: "\f519";
}
.fa-truck-pickup::before {
content: "\f63c";
}
.fa-up-long::before {
content: "\f30c";
}
.fa-long-arrow-alt-up::before {
content: "\f30c";
}
.fa-stop::before {
content: "\f04d";
}
.fa-code-merge::before {
content: "\f387";
}
.fa-upload::before {
content: "\f093";
}
.fa-hurricane::before {
content: "\f751";
}
.fa-mound::before {
content: "\e52d";
}
.fa-toilet-portable::before {
content: "\e583";
}
.fa-compact-disc::before {
content: "\f51f";
}
.fa-file-arrow-down::before {
content: "\f56d";
}
.fa-file-download::before {
content: "\f56d";
}
.fa-caravan::before {
content: "\f8ff";
}
.fa-shield-cat::before {
content: "\e572";
}
.fa-bolt::before {
content: "\f0e7";
}
.fa-zap::before {
content: "\f0e7";
}
.fa-glass-water::before {
content: "\e4f4";
}
.fa-oil-well::before {
content: "\e532";
}
.fa-vault::before {
content: "\e2c5";
}
.fa-mars::before {
content: "\f222";
}
.fa-toilet::before {
content: "\f7d8";
}
.fa-plane-circle-xmark::before {
content: "\e557";
}
.fa-yen-sign::before {
content: "\f157";
}
.fa-cny::before {
content: "\f157";
}
.fa-jpy::before {
content: "\f157";
}
.fa-rmb::before {
content: "\f157";
}
.fa-yen::before {
content: "\f157";
}
.fa-ruble-sign::before {
content: "\f158";
}
.fa-rouble::before {
content: "\f158";
}
.fa-rub::before {
content: "\f158";
}
.fa-ruble::before {
content: "\f158";
}
.fa-sun::before {
content: "\f185";
}
.fa-guitar::before {
content: "\f7a6";
}
.fa-face-laugh-wink::before {
content: "\f59c";
}
.fa-laugh-wink::before {
content: "\f59c";
}
.fa-horse-head::before {
content: "\f7ab";
}
.fa-bore-hole::before {
content: "\e4c3";
}
.fa-industry::before {
content: "\f275";
}
.fa-circle-down::before {
content: "\f358";
}
.fa-arrow-alt-circle-down::before {
content: "\f358";
}
.fa-arrows-turn-to-dots::before {
content: "\e4c1";
}
.fa-florin-sign::before {
content: "\e184";
}
.fa-arrow-down-short-wide::before {
content: "\f884";
}
.fa-sort-amount-desc::before {
content: "\f884";
}
.fa-sort-amount-down-alt::before {
content: "\f884";
}
.fa-less-than::before {
content: "\<";
}
.fa-angle-down::before {
content: "\f107";
}
.fa-car-tunnel::before {
content: "\e4de";
}
.fa-head-side-cough::before {
content: "\e061";
}
.fa-grip-lines::before {
content: "\f7a4";
}
.fa-thumbs-down::before {
content: "\f165";
}
.fa-user-lock::before {
content: "\f502";
}
.fa-arrow-right-long::before {
content: "\f178";
}
.fa-long-arrow-right::before {
content: "\f178";
}
.fa-anchor-circle-xmark::before {
content: "\e4ac";
}
.fa-ellipsis::before {
content: "\f141";
}
.fa-ellipsis-h::before {
content: "\f141";
}
.fa-chess-pawn::before {
content: "\f443";
}
.fa-kit-medical::before {
content: "\f479";
}
.fa-first-aid::before {
content: "\f479";
}
.fa-person-through-window::before {
content: "\e5a9";
}
.fa-toolbox::before {
content: "\f552";
}
.fa-hands-holding-circle::before {
content: "\e4fb";
}
.fa-bug::before {
content: "\f188";
}
.fa-credit-card::before {
content: "\f09d";
}
.fa-credit-card-alt::before {
content: "\f09d";
}
.fa-car::before {
content: "\f1b9";
}
.fa-automobile::before {
content: "\f1b9";
}
.fa-hand-holding-hand::before {
content: "\e4f7";
}
.fa-book-open-reader::before {
content: "\f5da";
}
.fa-book-reader::before {
content: "\f5da";
}
.fa-mountain-sun::before {
content: "\e52f";
}
.fa-arrows-left-right-to-line::before {
content: "\e4ba";
}
.fa-dice-d20::before {
content: "\f6cf";
}
.fa-truck-droplet::before {
content: "\e58c";
}
.fa-file-circle-xmark::before {
content: "\e5a1";
}
.fa-temperature-arrow-up::before {
content: "\e040";
}
.fa-temperature-up::before {
content: "\e040";
}
.fa-medal::before {
content: "\f5a2";
}
.fa-bed::before {
content: "\f236";
}
.fa-square-h::before {
content: "\f0fd";
}
.fa-h-square::before {
content: "\f0fd";
}
.fa-podcast::before {
content: "\f2ce";
}
.fa-temperature-full::before {
content: "\f2c7";
}
.fa-temperature-4::before {
content: "\f2c7";
}
.fa-thermometer-4::before {
content: "\f2c7";
}
.fa-thermometer-full::before {
content: "\f2c7";
}
.fa-bell::before {
content: "\f0f3";
}
.fa-superscript::before {
content: "\f12b";
}
.fa-plug-circle-xmark::before {
content: "\e560";
}
.fa-star-of-life::before {
content: "\f621";
}
.fa-phone-slash::before {
content: "\f3dd";
}
.fa-paint-roller::before {
content: "\f5aa";
}
.fa-handshake-angle::before {
content: "\f4c4";
}
.fa-hands-helping::before {
content: "\f4c4";
}
.fa-location-dot::before {
content: "\f3c5";
}
.fa-map-marker-alt::before {
content: "\f3c5";
}
.fa-file::before {
content: "\f15b";
}
.fa-greater-than::before {
content: "\>";
}
.fa-person-swimming::before {
content: "\f5c4";
}
.fa-swimmer::before {
content: "\f5c4";
}
.fa-arrow-down::before {
content: "\f063";
}
.fa-droplet::before {
content: "\f043";
}
.fa-tint::before {
content: "\f043";
}
.fa-eraser::before {
content: "\f12d";
}
.fa-earth-americas::before {
content: "\f57d";
}
.fa-earth::before {
content: "\f57d";
}
.fa-earth-america::before {
content: "\f57d";
}
.fa-globe-americas::before {
content: "\f57d";
}
.fa-person-burst::before {
content: "\e53b";
}
.fa-dove::before {
content: "\f4ba";
}
.fa-battery-empty::before {
content: "\f244";
}
.fa-battery-0::before {
content: "\f244";
}
.fa-socks::before {
content: "\f696";
}
.fa-inbox::before {
content: "\f01c";
}
.fa-section::before {
content: "\e447";
}
.fa-gauge-high::before {
content: "\f625";
}
.fa-tachometer-alt::before {
content: "\f625";
}
.fa-tachometer-alt-fast::before {
content: "\f625";
}
.fa-envelope-open-text::before {
content: "\f658";
}
.fa-hospital::before {
content: "\f0f8";
}
.fa-hospital-alt::before {
content: "\f0f8";
}
.fa-hospital-wide::before {
content: "\f0f8";
}
.fa-wine-bottle::before {
content: "\f72f";
}
.fa-chess-rook::before {
content: "\f447";
}
.fa-bars-staggered::before {
content: "\f550";
}
.fa-reorder::before {
content: "\f550";
}
.fa-stream::before {
content: "\f550";
}
.fa-dharmachakra::before {
content: "\f655";
}
.fa-hotdog::before {
content: "\f80f";
}
.fa-person-walking-with-cane::before {
content: "\f29d";
}
.fa-blind::before {
content: "\f29d";
}
.fa-drum::before {
content: "\f569";
}
.fa-ice-cream::before {
content: "\f810";
}
.fa-heart-circle-bolt::before {
content: "\e4fc";
}
.fa-fax::before {
content: "\f1ac";
}
.fa-paragraph::before {
content: "\f1dd";
}
.fa-check-to-slot::before {
content: "\f772";
}
.fa-vote-yea::before {
content: "\f772";
}
.fa-star-half::before {
content: "\f089";
}
.fa-boxes-stacked::before {
content: "\f468";
}
.fa-boxes::before {
content: "\f468";
}
.fa-boxes-alt::before {
content: "\f468";
}
.fa-link::before {
content: "\f0c1";
}
.fa-chain::before {
content: "\f0c1";
}
.fa-ear-listen::before {
content: "\f2a2";
}
.fa-assistive-listening-systems::before {
content: "\f2a2";
}
.fa-tree-city::before {
content: "\e587";
}
.fa-play::before {
content: "\f04b";
}
.fa-font::before {
content: "\f031";
}
.fa-table-cells-row-lock::before {
content: "\e67a";
}
.fa-rupiah-sign::before {
content: "\e23d";
}
.fa-magnifying-glass::before {
content: "\f002";
}
.fa-search::before {
content: "\f002";
}
.fa-table-tennis-paddle-ball::before {
content: "\f45d";
}
.fa-ping-pong-paddle-ball::before {
content: "\f45d";
}
.fa-table-tennis::before {
content: "\f45d";
}
.fa-person-dots-from-line::before {
content: "\f470";
}
.fa-diagnoses::before {
content: "\f470";
}
.fa-trash-can-arrow-up::before {
content: "\f82a";
}
.fa-trash-restore-alt::before {
content: "\f82a";
}
.fa-naira-sign::before {
content: "\e1f6";
}
.fa-cart-arrow-down::before {
content: "\f218";
}
.fa-walkie-talkie::before {
content: "\f8ef";
}
.fa-file-pen::before {
content: "\f31c";
}
.fa-file-edit::before {
content: "\f31c";
}
.fa-receipt::before {
content: "\f543";
}
.fa-square-pen::before {
content: "\f14b";
}
.fa-pen-square::before {
content: "\f14b";
}
.fa-pencil-square::before {
content: "\f14b";
}
.fa-suitcase-rolling::before {
content: "\f5c1";
}
.fa-person-circle-exclamation::before {
content: "\e53f";
}
.fa-chevron-down::before {
content: "\f078";
}
.fa-battery-full::before {
content: "\f240";
}
.fa-battery::before {
content: "\f240";
}
.fa-battery-5::before {
content: "\f240";
}
.fa-skull-crossbones::before {
content: "\f714";
}
.fa-code-compare::before {
content: "\e13a";
}
.fa-list-ul::before {
content: "\f0ca";
}
.fa-list-dots::before {
content: "\f0ca";
}
.fa-school-lock::before {
content: "\e56f";
}
.fa-tower-cell::before {
content: "\e585";
}
.fa-down-long::before {
content: "\f309";
}
.fa-long-arrow-alt-down::before {
content: "\f309";
}
.fa-ranking-star::before {
content: "\e561";
}
.fa-chess-king::before {
content: "\f43f";
}
.fa-person-harassing::before {
content: "\e549";
}
.fa-brazilian-real-sign::before {
content: "\e46c";
}
.fa-landmark-dome::before {
content: "\f752";
}
.fa-landmark-alt::before {
content: "\f752";
}
.fa-arrow-up::before {
content: "\f062";
}
.fa-tv::before {
content: "\f26c";
}
.fa-television::before {
content: "\f26c";
}
.fa-tv-alt::before {
content: "\f26c";
}
.fa-shrimp::before {
content: "\e448";
}
.fa-list-check::before {
content: "\f0ae";
}
.fa-tasks::before {
content: "\f0ae";
}
.fa-jug-detergent::before {
content: "\e519";
}
.fa-circle-user::before {
content: "\f2bd";
}
.fa-user-circle::before {
content: "\f2bd";
}
.fa-user-shield::before {
content: "\f505";
}
.fa-wind::before {
content: "\f72e";
}
.fa-car-burst::before {
content: "\f5e1";
}
.fa-car-crash::before {
content: "\f5e1";
}
.fa-y::before {
content: "Y";
}
.fa-person-snowboarding::before {
content: "\f7ce";
}
.fa-snowboarding::before {
content: "\f7ce";
}
.fa-truck-fast::before {
content: "\f48b";
}
.fa-shipping-fast::before {
content: "\f48b";
}
.fa-fish::before {
content: "\f578";
}
.fa-user-graduate::before {
content: "\f501";
}
.fa-circle-half-stroke::before {
content: "\f042";
}
.fa-adjust::before {
content: "\f042";
}
.fa-clapperboard::before {
content: "\e131";
}
.fa-circle-radiation::before {
content: "\f7ba";
}
.fa-radiation-alt::before {
content: "\f7ba";
}
.fa-baseball::before {
content: "\f433";
}
.fa-baseball-ball::before {
content: "\f433";
}
.fa-jet-fighter-up::before {
content: "\e518";
}
.fa-diagram-project::before {
content: "\f542";
}
.fa-project-diagram::before {
content: "\f542";
}
.fa-copy::before {
content: "\f0c5";
}
.fa-volume-xmark::before {
content: "\f6a9";
}
.fa-volume-mute::before {
content: "\f6a9";
}
.fa-volume-times::before {
content: "\f6a9";
}
.fa-hand-sparkles::before {
content: "\e05d";
}
.fa-grip::before {
content: "\f58d";
}
.fa-grip-horizontal::before {
content: "\f58d";
}
.fa-share-from-square::before {
content: "\f14d";
}
.fa-share-square::before {
content: "\f14d";
}
.fa-child-combatant::before {
content: "\e4e0";
}
.fa-child-rifle::before {
content: "\e4e0";
}
.fa-gun::before {
content: "\e19b";
}
.fa-square-phone::before {
content: "\f098";
}
.fa-phone-square::before {
content: "\f098";
}
.fa-plus::before {
content: "\+";
}
.fa-add::before {
content: "\+";
}
.fa-expand::before {
content: "\f065";
}
.fa-computer::before {
content: "\e4e5";
}
.fa-xmark::before {
content: "\f00d";
}
.fa-close::before {
content: "\f00d";
}
.fa-multiply::before {
content: "\f00d";
}
.fa-remove::before {
content: "\f00d";
}
.fa-times::before {
content: "\f00d";
}
.fa-arrows-up-down-left-right::before {
content: "\f047";
}
.fa-arrows::before {
content: "\f047";
}
.fa-chalkboard-user::before {
content: "\f51c";
}
.fa-chalkboard-teacher::before {
content: "\f51c";
}
.fa-peso-sign::before {
content: "\e222";
}
.fa-building-shield::before {
content: "\e4d8";
}
.fa-baby::before {
content: "\f77c";
}
.fa-users-line::before {
content: "\e592";
}
.fa-quote-left::before {
content: "\f10d";
}
.fa-quote-left-alt::before {
content: "\f10d";
}
.fa-tractor::before {
content: "\f722";
}
.fa-trash-arrow-up::before {
content: "\f829";
}
.fa-trash-restore::before {
content: "\f829";
}
.fa-arrow-down-up-lock::before {
content: "\e4b0";
}
.fa-lines-leaning::before {
content: "\e51e";
}
.fa-ruler-combined::before {
content: "\f546";
}
.fa-copyright::before {
content: "\f1f9";
}
.fa-equals::before {
content: "\=";
}
.fa-blender::before {
content: "\f517";
}
.fa-teeth::before {
content: "\f62e";
}
.fa-shekel-sign::before {
content: "\f20b";
}
.fa-ils::before {
content: "\f20b";
}
.fa-shekel::before {
content: "\f20b";
}
.fa-sheqel::before {
content: "\f20b";
}
.fa-sheqel-sign::before {
content: "\f20b";
}
.fa-map::before {
content: "\f279";
}
.fa-rocket::before {
content: "\f135";
}
.fa-photo-film::before {
content: "\f87c";
}
.fa-photo-video::before {
content: "\f87c";
}
.fa-folder-minus::before {
content: "\f65d";
}
.fa-store::before {
content: "\f54e";
}
.fa-arrow-trend-up::before {
content: "\e098";
}
.fa-plug-circle-minus::before {
content: "\e55e";
}
.fa-sign-hanging::before {
content: "\f4d9";
}
.fa-sign::before {
content: "\f4d9";
}
.fa-bezier-curve::before {
content: "\f55b";
}
.fa-bell-slash::before {
content: "\f1f6";
}
.fa-tablet::before {
content: "\f3fb";
}
.fa-tablet-android::before {
content: "\f3fb";
}
.fa-school-flag::before {
content: "\e56e";
}
.fa-fill::before {
content: "\f575";
}
.fa-angle-up::before {
content: "\f106";
}
.fa-drumstick-bite::before {
content: "\f6d7";
}
.fa-holly-berry::before {
content: "\f7aa";
}
.fa-chevron-left::before {
content: "\f053";
}
.fa-bacteria::before {
content: "\e059";
}
.fa-hand-lizard::before {
content: "\f258";
}
.fa-notdef::before {
content: "\e1fe";
}
.fa-disease::before {
content: "\f7fa";
}
.fa-briefcase-medical::before {
content: "\f469";
}
.fa-genderless::before {
content: "\f22d";
}
.fa-chevron-right::before {
content: "\f054";
}
.fa-retweet::before {
content: "\f079";
}
.fa-car-rear::before {
content: "\f5de";
}
.fa-car-alt::before {
content: "\f5de";
}
.fa-pump-soap::before {
content: "\e06b";
}
.fa-video-slash::before {
content: "\f4e2";
}
.fa-battery-quarter::before {
content: "\f243";
}
.fa-battery-2::before {
content: "\f243";
}
.fa-radio::before {
content: "\f8d7";
}
.fa-baby-carriage::before {
content: "\f77d";
}
.fa-carriage-baby::before {
content: "\f77d";
}
.fa-traffic-light::before {
content: "\f637";
}
.fa-thermometer::before {
content: "\f491";
}
.fa-vr-cardboard::before {
content: "\f729";
}
.fa-hand-middle-finger::before {
content: "\f806";
}
.fa-percent::before {
content: "\%";
}
.fa-percentage::before {
content: "\%";
}
.fa-truck-moving::before {
content: "\f4df";
}
.fa-glass-water-droplet::before {
content: "\e4f5";
}
.fa-display::before {
content: "\e163";
}
.fa-face-smile::before {
content: "\f118";
}
.fa-smile::before {
content: "\f118";
}
.fa-thumbtack::before {
content: "\f08d";
}
.fa-thumb-tack::before {
content: "\f08d";
}
.fa-trophy::before {
content: "\f091";
}
.fa-person-praying::before {
content: "\f683";
}
.fa-pray::before {
content: "\f683";
}
.fa-hammer::before {
content: "\f6e3";
}
.fa-hand-peace::before {
content: "\f25b";
}
.fa-rotate::before {
content: "\f2f1";
}
.fa-sync-alt::before {
content: "\f2f1";
}
.fa-spinner::before {
content: "\f110";
}
.fa-robot::before {
content: "\f544";
}
.fa-peace::before {
content: "\f67c";
}
.fa-gears::before {
content: "\f085";
}
.fa-cogs::before {
content: "\f085";
}
.fa-warehouse::before {
content: "\f494";
}
.fa-arrow-up-right-dots::before {
content: "\e4b7";
}
.fa-splotch::before {
content: "\f5bc";
}
.fa-face-grin-hearts::before {
content: "\f584";
}
.fa-grin-hearts::before {
content: "\f584";
}
.fa-dice-four::before {
content: "\f524";
}
.fa-sim-card::before {
content: "\f7c4";
}
.fa-transgender::before {
content: "\f225";
}
.fa-transgender-alt::before {
content: "\f225";
}
.fa-mercury::before {
content: "\f223";
}
.fa-arrow-turn-down::before {
content: "\f149";
}
.fa-level-down::before {
content: "\f149";
}
.fa-person-falling-burst::before {
content: "\e547";
}
.fa-award::before {
content: "\f559";
}
.fa-ticket-simple::before {
content: "\f3ff";
}
.fa-ticket-alt::before {
content: "\f3ff";
}
.fa-building::before {
content: "\f1ad";
}
.fa-angles-left::before {
content: "\f100";
}
.fa-angle-double-left::before {
content: "\f100";
}
.fa-qrcode::before {
content: "\f029";
}
.fa-clock-rotate-left::before {
content: "\f1da";
}
.fa-history::before {
content: "\f1da";
}
.fa-face-grin-beam-sweat::before {
content: "\f583";
}
.fa-grin-beam-sweat::before {
content: "\f583";
}
.fa-file-export::before {
content: "\f56e";
}
.fa-arrow-right-from-file::before {
content: "\f56e";
}
.fa-shield::before {
content: "\f132";
}
.fa-shield-blank::before {
content: "\f132";
}
.fa-arrow-up-short-wide::before {
content: "\f885";
}
.fa-sort-amount-up-alt::before {
content: "\f885";
}
.fa-house-medical::before {
content: "\e3b2";
}
.fa-golf-ball-tee::before {
content: "\f450";
}
.fa-golf-ball::before {
content: "\f450";
}
.fa-circle-chevron-left::before {
content: "\f137";
}
.fa-chevron-circle-left::before {
content: "\f137";
}
.fa-house-chimney-window::before {
content: "\e00d";
}
.fa-pen-nib::before {
content: "\f5ad";
}
.fa-tent-arrow-turn-left::before {
content: "\e580";
}
.fa-tents::before {
content: "\e582";
}
.fa-wand-magic::before {
content: "\f0d0";
}
.fa-magic::before {
content: "\f0d0";
}
.fa-dog::before {
content: "\f6d3";
}
.fa-carrot::before {
content: "\f787";
}
.fa-moon::before {
content: "\f186";
}
.fa-wine-glass-empty::before {
content: "\f5ce";
}
.fa-wine-glass-alt::before {
content: "\f5ce";
}
.fa-cheese::before {
content: "\f7ef";
}
.fa-yin-yang::before {
content: "\f6ad";
}
.fa-music::before {
content: "\f001";
}
.fa-code-commit::before {
content: "\f386";
}
.fa-temperature-low::before {
content: "\f76b";
}
.fa-person-biking::before {
content: "\f84a";
}
.fa-biking::before {
content: "\f84a";
}
.fa-broom::before {
content: "\f51a";
}
.fa-shield-heart::before {
content: "\e574";
}
.fa-gopuram::before {
content: "\f664";
}
.fa-earth-oceania::before {
content: "\e47b";
}
.fa-globe-oceania::before {
content: "\e47b";
}
.fa-square-xmark::before {
content: "\f2d3";
}
.fa-times-square::before {
content: "\f2d3";
}
.fa-xmark-square::before {
content: "\f2d3";
}
.fa-hashtag::before {
content: "\#";
}
.fa-up-right-and-down-left-from-center::before {
content: "\f424";
}
.fa-expand-alt::before {
content: "\f424";
}
.fa-oil-can::before {
content: "\f613";
}
.fa-t::before {
content: "T";
}
.fa-hippo::before {
content: "\f6ed";
}
.fa-chart-column::before {
content: "\e0e3";
}
.fa-infinity::before {
content: "\f534";
}
.fa-vial-circle-check::before {
content: "\e596";
}
.fa-person-arrow-down-to-line::before {
content: "\e538";
}
.fa-voicemail::before {
content: "\f897";
}
.fa-fan::before {
content: "\f863";
}
.fa-person-walking-luggage::before {
content: "\e554";
}
.fa-up-down::before {
content: "\f338";
}
.fa-arrows-alt-v::before {
content: "\f338";
}
.fa-cloud-moon-rain::before {
content: "\f73c";
}
.fa-calendar::before {
content: "\f133";
}
.fa-trailer::before {
content: "\e041";
}
.fa-bahai::before {
content: "\f666";
}
.fa-haykal::before {
content: "\f666";
}
.fa-sd-card::before {
content: "\f7c2";
}
.fa-dragon::before {
content: "\f6d5";
}
.fa-shoe-prints::before {
content: "\f54b";
}
.fa-circle-plus::before {
content: "\f055";
}
.fa-plus-circle::before {
content: "\f055";
}
.fa-face-grin-tongue-wink::before {
content: "\f58b";
}
.fa-grin-tongue-wink::before {
content: "\f58b";
}
.fa-hand-holding::before {
content: "\f4bd";
}
.fa-plug-circle-exclamation::before {
content: "\e55d";
}
.fa-link-slash::before {
content: "\f127";
}
.fa-chain-broken::before {
content: "\f127";
}
.fa-chain-slash::before {
content: "\f127";
}
.fa-unlink::before {
content: "\f127";
}
.fa-clone::before {
content: "\f24d";
}
.fa-person-walking-arrow-loop-left::before {
content: "\e551";
}
.fa-arrow-up-z-a::before {
content: "\f882";
}
.fa-sort-alpha-up-alt::before {
content: "\f882";
}
.fa-fire-flame-curved::before {
content: "\f7e4";
}
.fa-fire-alt::before {
content: "\f7e4";
}
.fa-tornado::before {
content: "\f76f";
}
.fa-file-circle-plus::before {
content: "\e494";
}
.fa-book-quran::before {
content: "\f687";
}
.fa-quran::before {
content: "\f687";
}
.fa-anchor::before {
content: "\f13d";
}
.fa-border-all::before {
content: "\f84c";
}
.fa-face-angry::before {
content: "\f556";
}
.fa-angry::before {
content: "\f556";
}
.fa-cookie-bite::before {
content: "\f564";
}
.fa-arrow-trend-down::before {
content: "\e097";
}
.fa-rss::before {
content: "\f09e";
}
.fa-feed::before {
content: "\f09e";
}
.fa-draw-polygon::before {
content: "\f5ee";
}
.fa-scale-balanced::before {
content: "\f24e";
}
.fa-balance-scale::before {
content: "\f24e";
}
.fa-gauge-simple-high::before {
content: "\f62a";
}
.fa-tachometer::before {
content: "\f62a";
}
.fa-tachometer-fast::before {
content: "\f62a";
}
.fa-shower::before {
content: "\f2cc";
}
.fa-desktop::before {
content: "\f390";
}
.fa-desktop-alt::before {
content: "\f390";
}
.fa-m::before {
content: "M";
}
.fa-table-list::before {
content: "\f00b";
}
.fa-th-list::before {
content: "\f00b";
}
.fa-comment-sms::before {
content: "\f7cd";
}
.fa-sms::before {
content: "\f7cd";
}
.fa-book::before {
content: "\f02d";
}
.fa-user-plus::before {
content: "\f234";
}
.fa-check::before {
content: "\f00c";
}
.fa-battery-three-quarters::before {
content: "\f241";
}
.fa-battery-4::before {
content: "\f241";
}
.fa-house-circle-check::before {
content: "\e509";
}
.fa-angle-left::before {
content: "\f104";
}
.fa-diagram-successor::before {
content: "\e47a";
}
.fa-truck-arrow-right::before {
content: "\e58b";
}
.fa-arrows-split-up-and-left::before {
content: "\e4bc";
}
.fa-hand-fist::before {
content: "\f6de";
}
.fa-fist-raised::before {
content: "\f6de";
}
.fa-cloud-moon::before {
content: "\f6c3";
}
.fa-briefcase::before {
content: "\f0b1";
}
.fa-person-falling::before {
content: "\e546";
}
.fa-image-portrait::before {
content: "\f3e0";
}
.fa-portrait::before {
content: "\f3e0";
}
.fa-user-tag::before {
content: "\f507";
}
.fa-rug::before {
content: "\e569";
}
.fa-earth-europe::before {
content: "\f7a2";
}
.fa-globe-europe::before {
content: "\f7a2";
}
.fa-cart-flatbed-suitcase::before {
content: "\f59d";
}
.fa-luggage-cart::before {
content: "\f59d";
}
.fa-rectangle-xmark::before {
content: "\f410";
}
.fa-rectangle-times::before {
content: "\f410";
}
.fa-times-rectangle::before {
content: "\f410";
}
.fa-window-close::before {
content: "\f410";
}
.fa-baht-sign::before {
content: "\e0ac";
}
.fa-book-open::before {
content: "\f518";
}
.fa-book-journal-whills::before {
content: "\f66a";
}
.fa-journal-whills::before {
content: "\f66a";
}
.fa-handcuffs::before {
content: "\e4f8";
}
.fa-triangle-exclamation::before {
content: "\f071";
}
.fa-exclamation-triangle::before {
content: "\f071";
}
.fa-warning::before {
content: "\f071";
}
.fa-database::before {
content: "\f1c0";
}
.fa-share::before {
content: "\f064";
}
.fa-mail-forward::before {
content: "\f064";
}
.fa-bottle-droplet::before {
content: "\e4c4";
}
.fa-mask-face::before {
content: "\e1d7";
}
.fa-hill-rockslide::before {
content: "\e508";
}
.fa-right-left::before {
content: "\f362";
}
.fa-exchange-alt::before {
content: "\f362";
}
.fa-paper-plane::before {
content: "\f1d8";
}
.fa-road-circle-exclamation::before {
content: "\e565";
}
.fa-dungeon::before {
content: "\f6d9";
}
.fa-align-right::before {
content: "\f038";
}
.fa-money-bill-1-wave::before {
content: "\f53b";
}
.fa-money-bill-wave-alt::before {
content: "\f53b";
}
.fa-life-ring::before {
content: "\f1cd";
}
.fa-hands::before {
content: "\f2a7";
}
.fa-sign-language::before {
content: "\f2a7";
}
.fa-signing::before {
content: "\f2a7";
}
.fa-calendar-day::before {
content: "\f783";
}
.fa-water-ladder::before {
content: "\f5c5";
}
.fa-ladder-water::before {
content: "\f5c5";
}
.fa-swimming-pool::before {
content: "\f5c5";
}
.fa-arrows-up-down::before {
content: "\f07d";
}
.fa-arrows-v::before {
content: "\f07d";
}
.fa-face-grimace::before {
content: "\f57f";
}
.fa-grimace::before {
content: "\f57f";
}
.fa-wheelchair-move::before {
content: "\e2ce";
}
.fa-wheelchair-alt::before {
content: "\e2ce";
}
.fa-turn-down::before {
content: "\f3be";
}
.fa-level-down-alt::before {
content: "\f3be";
}
.fa-person-walking-arrow-right::before {
content: "\e552";
}
.fa-square-envelope::before {
content: "\f199";
}
.fa-envelope-square::before {
content: "\f199";
}
.fa-dice::before {
content: "\f522";
}
.fa-bowling-ball::before {
content: "\f436";
}
.fa-brain::before {
content: "\f5dc";
}
.fa-bandage::before {
content: "\f462";
}
.fa-band-aid::before {
content: "\f462";
}
.fa-calendar-minus::before {
content: "\f272";
}
.fa-circle-xmark::before {
content: "\f057";
}
.fa-times-circle::before {
content: "\f057";
}
.fa-xmark-circle::before {
content: "\f057";
}
.fa-gifts::before {
content: "\f79c";
}
.fa-hotel::before {
content: "\f594";
}
.fa-earth-asia::before {
content: "\f57e";
}
.fa-globe-asia::before {
content: "\f57e";
}
.fa-id-card-clip::before {
content: "\f47f";
}
.fa-id-card-alt::before {
content: "\f47f";
}
.fa-magnifying-glass-plus::before {
content: "\f00e";
}
.fa-search-plus::before {
content: "\f00e";
}
.fa-thumbs-up::before {
content: "\f164";
}
.fa-user-clock::before {
content: "\f4fd";
}
.fa-hand-dots::before {
content: "\f461";
}
.fa-allergies::before {
content: "\f461";
}
.fa-file-invoice::before {
content: "\f570";
}
.fa-window-minimize::before {
content: "\f2d1";
}
.fa-mug-saucer::before {
content: "\f0f4";
}
.fa-coffee::before {
content: "\f0f4";
}
.fa-brush::before {
content: "\f55d";
}
.fa-mask::before {
content: "\f6fa";
}
.fa-magnifying-glass-minus::before {
content: "\f010";
}
.fa-search-minus::before {
content: "\f010";
}
.fa-ruler-vertical::before {
content: "\f548";
}
.fa-user-large::before {
content: "\f406";
}
.fa-user-alt::before {
content: "\f406";
}
.fa-train-tram::before {
content: "\e5b4";
}
.fa-user-nurse::before {
content: "\f82f";
}
.fa-syringe::before {
content: "\f48e";
}
.fa-cloud-sun::before {
content: "\f6c4";
}
.fa-stopwatch-20::before {
content: "\e06f";
}
.fa-square-full::before {
content: "\f45c";
}
.fa-magnet::before {
content: "\f076";
}
.fa-jar::before {
content: "\e516";
}
.fa-note-sticky::before {
content: "\f249";
}
.fa-sticky-note::before {
content: "\f249";
}
.fa-bug-slash::before {
content: "\e490";
}
.fa-arrow-up-from-water-pump::before {
content: "\e4b6";
}
.fa-bone::before {
content: "\f5d7";
}
.fa-user-injured::before {
content: "\f728";
}
.fa-face-sad-tear::before {
content: "\f5b4";
}
.fa-sad-tear::before {
content: "\f5b4";
}
.fa-plane::before {
content: "\f072";
}
.fa-tent-arrows-down::before {
content: "\e581";
}
.fa-exclamation::before {
content: "\!";
}
.fa-arrows-spin::before {
content: "\e4bb";
}
.fa-print::before {
content: "\f02f";
}
.fa-turkish-lira-sign::before {
content: "\e2bb";
}
.fa-try::before {
content: "\e2bb";
}
.fa-turkish-lira::before {
content: "\e2bb";
}
.fa-dollar-sign::before {
content: "\$";
}
.fa-dollar::before {
content: "\$";
}
.fa-usd::before {
content: "\$";
}
.fa-x::before {
content: "X";
}
.fa-magnifying-glass-dollar::before {
content: "\f688";
}
.fa-search-dollar::before {
content: "\f688";
}
.fa-users-gear::before {
content: "\f509";
}
.fa-users-cog::before {
content: "\f509";
}
.fa-person-military-pointing::before {
content: "\e54a";
}
.fa-building-columns::before {
content: "\f19c";
}
.fa-bank::before {
content: "\f19c";
}
.fa-institution::before {
content: "\f19c";
}
.fa-museum::before {
content: "\f19c";
}
.fa-university::before {
content: "\f19c";
}
.fa-umbrella::before {
content: "\f0e9";
}
.fa-trowel::before {
content: "\e589";
}
.fa-d::before {
content: "D";
}
.fa-stapler::before {
content: "\e5af";
}
.fa-masks-theater::before {
content: "\f630";
}
.fa-theater-masks::before {
content: "\f630";
}
.fa-kip-sign::before {
content: "\e1c4";
}
.fa-hand-point-left::before {
content: "\f0a5";
}
.fa-handshake-simple::before {
content: "\f4c6";
}
.fa-handshake-alt::before {
content: "\f4c6";
}
.fa-jet-fighter::before {
content: "\f0fb";
}
.fa-fighter-jet::before {
content: "\f0fb";
}
.fa-square-share-nodes::before {
content: "\f1e1";
}
.fa-share-alt-square::before {
content: "\f1e1";
}
.fa-barcode::before {
content: "\f02a";
}
.fa-plus-minus::before {
content: "\e43c";
}
.fa-video::before {
content: "\f03d";
}
.fa-video-camera::before {
content: "\f03d";
}
.fa-graduation-cap::before {
content: "\f19d";
}
.fa-mortar-board::before {
content: "\f19d";
}
.fa-hand-holding-medical::before {
content: "\e05c";
}
.fa-person-circle-check::before {
content: "\e53e";
}
.fa-turn-up::before {
content: "\f3bf";
}
.fa-level-up-alt::before {
content: "\f3bf";
}
.sr-only,
.fa-sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border-width: 0;
}
.sr-only-focusable:not(:focus),
.fa-sr-only-focusable:not(:focus) {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border-width: 0;
}
/*!
* Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
* Copyright 2024 Fonticons, Inc.
*/
:root, :host {
--fa-style-family-classic: "Font Awesome 6 Free";
--fa-font-solid: normal 900 1em/1 "Font Awesome 6 Free";
}
@font-face {
font-family: "Font Awesome 6 Free";
font-style: normal;
font-weight: 900;
font-display: block;
src: url("font-awesome/fa-solid-900.woff2") format("woff2"), url("font-awesome/fa-solid-900.ttf") format("truetype");
}
.fas,
.fa-solid {
font-weight: 900;
}
/*!
* Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
* Copyright 2024 Fonticons, Inc.
*/
:root, :host {
--fa-style-family-classic: "Font Awesome 6 Free";
--fa-font-regular: normal 400 1em/1 "Font Awesome 6 Free";
}
@font-face {
font-family: "Font Awesome 6 Free";
font-style: normal;
font-weight: 400;
font-display: block;
src: url("font-awesome/fa-regular-400.woff2") format("woff2"), url("font-awesome/fa-regular-400.ttf") format("truetype");
}
.far,
.fa-regular {
font-weight: 400;
}
/*!
* Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
* Copyright 2024 Fonticons, Inc.
*/
:root, :host {
--fa-style-family-brands: "Font Awesome 6 Brands";
--fa-font-brands: normal 400 1em/1 "Font Awesome 6 Brands";
}
@font-face {
font-family: "Font Awesome 6 Brands";
font-style: normal;
font-weight: 400;
font-display: block;
src: url("font-awesome/fa-brands-400.woff2") format("woff2"), url("font-awesome/fa-brands-400.ttf") format("truetype");
}
.fab,
.fa-brands {
font-weight: 400;
}
.fa-monero:before {
content: "\f3d0";
}
.fa-hooli:before {
content: "\f427";
}
.fa-yelp:before {
content: "\f1e9";
}
.fa-cc-visa:before {
content: "\f1f0";
}
.fa-lastfm:before {
content: "\f202";
}
.fa-shopware:before {
content: "\f5b5";
}
.fa-creative-commons-nc:before {
content: "\f4e8";
}
.fa-aws:before {
content: "\f375";
}
.fa-redhat:before {
content: "\f7bc";
}
.fa-yoast:before {
content: "\f2b1";
}
.fa-cloudflare:before {
content: "\e07d";
}
.fa-ups:before {
content: "\f7e0";
}
.fa-pixiv:before {
content: "\e640";
}
.fa-wpexplorer:before {
content: "\f2de";
}
.fa-dyalog:before {
content: "\f399";
}
.fa-bity:before {
content: "\f37a";
}
.fa-stackpath:before {
content: "\f842";
}
.fa-buysellads:before {
content: "\f20d";
}
.fa-first-order:before {
content: "\f2b0";
}
.fa-modx:before {
content: "\f285";
}
.fa-guilded:before {
content: "\e07e";
}
.fa-vnv:before {
content: "\f40b";
}
.fa-square-js:before {
content: "\f3b9";
}
.fa-js-square:before {
content: "\f3b9";
}
.fa-microsoft:before {
content: "\f3ca";
}
.fa-qq:before {
content: "\f1d6";
}
.fa-orcid:before {
content: "\f8d2";
}
.fa-java:before {
content: "\f4e4";
}
.fa-invision:before {
content: "\f7b0";
}
.fa-creative-commons-pd-alt:before {
content: "\f4ed";
}
.fa-centercode:before {
content: "\f380";
}
.fa-glide-g:before {
content: "\f2a6";
}
.fa-drupal:before {
content: "\f1a9";
}
.fa-jxl:before {
content: "\e67b";
}
.fa-hire-a-helper:before {
content: "\f3b0";
}
.fa-creative-commons-by:before {
content: "\f4e7";
}
.fa-unity:before {
content: "\e049";
}
.fa-whmcs:before {
content: "\f40d";
}
.fa-rocketchat:before {
content: "\f3e8";
}
.fa-vk:before {
content: "\f189";
}
.fa-untappd:before {
content: "\f405";
}
.fa-mailchimp:before {
content: "\f59e";
}
.fa-css3-alt:before {
content: "\f38b";
}
.fa-square-reddit:before {
content: "\f1a2";
}
.fa-reddit-square:before {
content: "\f1a2";
}
.fa-vimeo-v:before {
content: "\f27d";
}
.fa-contao:before {
content: "\f26d";
}
.fa-square-font-awesome:before {
content: "\e5ad";
}
.fa-deskpro:before {
content: "\f38f";
}
.fa-brave:before {
content: "\e63c";
}
.fa-sistrix:before {
content: "\f3ee";
}
.fa-square-instagram:before {
content: "\e055";
}
.fa-instagram-square:before {
content: "\e055";
}
.fa-battle-net:before {
content: "\f835";
}
.fa-the-red-yeti:before {
content: "\f69d";
}
.fa-square-hacker-news:before {
content: "\f3af";
}
.fa-hacker-news-square:before {
content: "\f3af";
}
.fa-edge:before {
content: "\f282";
}
.fa-threads:before {
content: "\e618";
}
.fa-napster:before {
content: "\f3d2";
}
.fa-square-snapchat:before {
content: "\f2ad";
}
.fa-snapchat-square:before {
content: "\f2ad";
}
.fa-google-plus-g:before {
content: "\f0d5";
}
.fa-artstation:before {
content: "\f77a";
}
.fa-markdown:before {
content: "\f60f";
}
.fa-sourcetree:before {
content: "\f7d3";
}
.fa-google-plus:before {
content: "\f2b3";
}
.fa-diaspora:before {
content: "\f791";
}
.fa-foursquare:before {
content: "\f180";
}
.fa-stack-overflow:before {
content: "\f16c";
}
.fa-github-alt:before {
content: "\f113";
}
.fa-phoenix-squadron:before {
content: "\f511";
}
.fa-pagelines:before {
content: "\f18c";
}
.fa-algolia:before {
content: "\f36c";
}
.fa-red-river:before {
content: "\f3e3";
}
.fa-creative-commons-sa:before {
content: "\f4ef";
}
.fa-safari:before {
content: "\f267";
}
.fa-google:before {
content: "\f1a0";
}
.fa-square-font-awesome-stroke:before {
content: "\f35c";
}
.fa-font-awesome-alt:before {
content: "\f35c";
}
.fa-atlassian:before {
content: "\f77b";
}
.fa-linkedin-in:before {
content: "\f0e1";
}
.fa-digital-ocean:before {
content: "\f391";
}
.fa-nimblr:before {
content: "\f5a8";
}
.fa-chromecast:before {
content: "\f838";
}
.fa-evernote:before {
content: "\f839";
}
.fa-hacker-news:before {
content: "\f1d4";
}
.fa-creative-commons-sampling:before {
content: "\f4f0";
}
.fa-adversal:before {
content: "\f36a";
}
.fa-creative-commons:before {
content: "\f25e";
}
.fa-watchman-monitoring:before {
content: "\e087";
}
.fa-fonticons:before {
content: "\f280";
}
.fa-weixin:before {
content: "\f1d7";
}
.fa-shirtsinbulk:before {
content: "\f214";
}
.fa-codepen:before {
content: "\f1cb";
}
.fa-git-alt:before {
content: "\f841";
}
.fa-lyft:before {
content: "\f3c3";
}
.fa-rev:before {
content: "\f5b2";
}
.fa-windows:before {
content: "\f17a";
}
.fa-wizards-of-the-coast:before {
content: "\f730";
}
.fa-square-viadeo:before {
content: "\f2aa";
}
.fa-viadeo-square:before {
content: "\f2aa";
}
.fa-meetup:before {
content: "\f2e0";
}
.fa-centos:before {
content: "\f789";
}
.fa-adn:before {
content: "\f170";
}
.fa-cloudsmith:before {
content: "\f384";
}
.fa-opensuse:before {
content: "\e62b";
}
.fa-pied-piper-alt:before {
content: "\f1a8";
}
.fa-square-dribbble:before {
content: "\f397";
}
.fa-dribbble-square:before {
content: "\f397";
}
.fa-codiepie:before {
content: "\f284";
}
.fa-node:before {
content: "\f419";
}
.fa-mix:before {
content: "\f3cb";
}
.fa-steam:before {
content: "\f1b6";
}
.fa-cc-apple-pay:before {
content: "\f416";
}
.fa-scribd:before {
content: "\f28a";
}
.fa-debian:before {
content: "\e60b";
}
.fa-openid:before {
content: "\f19b";
}
.fa-instalod:before {
content: "\e081";
}
.fa-expeditedssl:before {
content: "\f23e";
}
.fa-sellcast:before {
content: "\f2da";
}
.fa-square-twitter:before {
content: "\f081";
}
.fa-twitter-square:before {
content: "\f081";
}
.fa-r-project:before {
content: "\f4f7";
}
.fa-delicious:before {
content: "\f1a5";
}
.fa-freebsd:before {
content: "\f3a4";
}
.fa-vuejs:before {
content: "\f41f";
}
.fa-accusoft:before {
content: "\f369";
}
.fa-ioxhost:before {
content: "\f208";
}
.fa-fonticons-fi:before {
content: "\f3a2";
}
.fa-app-store:before {
content: "\f36f";
}
.fa-cc-mastercard:before {
content: "\f1f1";
}
.fa-itunes-note:before {
content: "\f3b5";
}
.fa-golang:before {
content: "\e40f";
}
.fa-kickstarter:before {
content: "\f3bb";
}
.fa-square-kickstarter:before {
content: "\f3bb";
}
.fa-grav:before {
content: "\f2d6";
}
.fa-weibo:before {
content: "\f18a";
}
.fa-uncharted:before {
content: "\e084";
}
.fa-firstdraft:before {
content: "\f3a1";
}
.fa-square-youtube:before {
content: "\f431";
}
.fa-youtube-square:before {
content: "\f431";
}
.fa-wikipedia-w:before {
content: "\f266";
}
.fa-wpressr:before {
content: "\f3e4";
}
.fa-rendact:before {
content: "\f3e4";
}
.fa-angellist:before {
content: "\f209";
}
.fa-galactic-republic:before {
content: "\f50c";
}
.fa-nfc-directional:before {
content: "\e530";
}
.fa-skype:before {
content: "\f17e";
}
.fa-joget:before {
content: "\f3b7";
}
.fa-fedora:before {
content: "\f798";
}
.fa-stripe-s:before {
content: "\f42a";
}
.fa-meta:before {
content: "\e49b";
}
.fa-laravel:before {
content: "\f3bd";
}
.fa-hotjar:before {
content: "\f3b1";
}
.fa-bluetooth-b:before {
content: "\f294";
}
.fa-square-letterboxd:before {
content: "\e62e";
}
.fa-sticker-mule:before {
content: "\f3f7";
}
.fa-creative-commons-zero:before {
content: "\f4f3";
}
.fa-hips:before {
content: "\f452";
}
.fa-behance:before {
content: "\f1b4";
}
.fa-reddit:before {
content: "\f1a1";
}
.fa-discord:before {
content: "\f392";
}
.fa-chrome:before {
content: "\f268";
}
.fa-app-store-ios:before {
content: "\f370";
}
.fa-cc-discover:before {
content: "\f1f2";
}
.fa-wpbeginner:before {
content: "\f297";
}
.fa-confluence:before {
content: "\f78d";
}
.fa-shoelace:before {
content: "\e60c";
}
.fa-mdb:before {
content: "\f8ca";
}
.fa-dochub:before {
content: "\f394";
}
.fa-accessible-icon:before {
content: "\f368";
}
.fa-ebay:before {
content: "\f4f4";
}
.fa-amazon:before {
content: "\f270";
}
.fa-unsplash:before {
content: "\e07c";
}
.fa-yarn:before {
content: "\f7e3";
}
.fa-square-steam:before {
content: "\f1b7";
}
.fa-steam-square:before {
content: "\f1b7";
}
.fa-500px:before {
content: "\f26e";
}
.fa-square-vimeo:before {
content: "\f194";
}
.fa-vimeo-square:before {
content: "\f194";
}
.fa-asymmetrik:before {
content: "\f372";
}
.fa-font-awesome:before {
content: "\f2b4";
}
.fa-font-awesome-flag:before {
content: "\f2b4";
}
.fa-font-awesome-logo-full:before {
content: "\f2b4";
}
.fa-gratipay:before {
content: "\f184";
}
.fa-apple:before {
content: "\f179";
}
.fa-hive:before {
content: "\e07f";
}
.fa-gitkraken:before {
content: "\f3a6";
}
.fa-keybase:before {
content: "\f4f5";
}
.fa-apple-pay:before {
content: "\f415";
}
.fa-padlet:before {
content: "\e4a0";
}
.fa-amazon-pay:before {
content: "\f42c";
}
.fa-square-github:before {
content: "\f092";
}
.fa-github-square:before {
content: "\f092";
}
.fa-stumbleupon:before {
content: "\f1a4";
}
.fa-fedex:before {
content: "\f797";
}
.fa-phoenix-framework:before {
content: "\f3dc";
}
.fa-shopify:before {
content: "\e057";
}
.fa-neos:before {
content: "\f612";
}
.fa-square-threads:before {
content: "\e619";
}
.fa-hackerrank:before {
content: "\f5f7";
}
.fa-researchgate:before {
content: "\f4f8";
}
.fa-swift:before {
content: "\f8e1";
}
.fa-angular:before {
content: "\f420";
}
.fa-speakap:before {
content: "\f3f3";
}
.fa-angrycreative:before {
content: "\f36e";
}
.fa-y-combinator:before {
content: "\f23b";
}
.fa-empire:before {
content: "\f1d1";
}
.fa-envira:before {
content: "\f299";
}
.fa-google-scholar:before {
content: "\e63b";
}
.fa-square-gitlab:before {
content: "\e5ae";
}
.fa-gitlab-square:before {
content: "\e5ae";
}
.fa-studiovinari:before {
content: "\f3f8";
}
.fa-pied-piper:before {
content: "\f2ae";
}
.fa-wordpress:before {
content: "\f19a";
}
.fa-product-hunt:before {
content: "\f288";
}
.fa-firefox:before {
content: "\f269";
}
.fa-linode:before {
content: "\f2b8";
}
.fa-goodreads:before {
content: "\f3a8";
}
.fa-square-odnoklassniki:before {
content: "\f264";
}
.fa-odnoklassniki-square:before {
content: "\f264";
}
.fa-jsfiddle:before {
content: "\f1cc";
}
.fa-sith:before {
content: "\f512";
}
.fa-themeisle:before {
content: "\f2b2";
}
.fa-page4:before {
content: "\f3d7";
}
.fa-hashnode:before {
content: "\e499";
}
.fa-react:before {
content: "\f41b";
}
.fa-cc-paypal:before {
content: "\f1f4";
}
.fa-squarespace:before {
content: "\f5be";
}
.fa-cc-stripe:before {
content: "\f1f5";
}
.fa-creative-commons-share:before {
content: "\f4f2";
}
.fa-bitcoin:before {
content: "\f379";
}
.fa-keycdn:before {
content: "\f3ba";
}
.fa-opera:before {
content: "\f26a";
}
.fa-itch-io:before {
content: "\f83a";
}
.fa-umbraco:before {
content: "\f8e8";
}
.fa-galactic-senate:before {
content: "\f50d";
}
.fa-ubuntu:before {
content: "\f7df";
}
.fa-draft2digital:before {
content: "\f396";
}
.fa-stripe:before {
content: "\f429";
}
.fa-houzz:before {
content: "\f27c";
}
.fa-gg:before {
content: "\f260";
}
.fa-dhl:before {
content: "\f790";
}
.fa-square-pinterest:before {
content: "\f0d3";
}
.fa-pinterest-square:before {
content: "\f0d3";
}
.fa-xing:before {
content: "\f168";
}
.fa-blackberry:before {
content: "\f37b";
}
.fa-creative-commons-pd:before {
content: "\f4ec";
}
.fa-playstation:before {
content: "\f3df";
}
.fa-quinscape:before {
content: "\f459";
}
.fa-less:before {
content: "\f41d";
}
.fa-blogger-b:before {
content: "\f37d";
}
.fa-opencart:before {
content: "\f23d";
}
.fa-vine:before {
content: "\f1ca";
}
.fa-signal-messenger:before {
content: "\e663";
}
.fa-paypal:before {
content: "\f1ed";
}
.fa-gitlab:before {
content: "\f296";
}
.fa-typo3:before {
content: "\f42b";
}
.fa-reddit-alien:before {
content: "\f281";
}
.fa-yahoo:before {
content: "\f19e";
}
.fa-dailymotion:before {
content: "\e052";
}
.fa-affiliatetheme:before {
content: "\f36b";
}
.fa-pied-piper-pp:before {
content: "\f1a7";
}
.fa-bootstrap:before {
content: "\f836";
}
.fa-odnoklassniki:before {
content: "\f263";
}
.fa-nfc-symbol:before {
content: "\e531";
}
.fa-mintbit:before {
content: "\e62f";
}
.fa-ethereum:before {
content: "\f42e";
}
.fa-speaker-deck:before {
content: "\f83c";
}
.fa-creative-commons-nc-eu:before {
content: "\f4e9";
}
.fa-patreon:before {
content: "\f3d9";
}
.fa-avianex:before {
content: "\f374";
}
.fa-ello:before {
content: "\f5f1";
}
.fa-gofore:before {
content: "\f3a7";
}
.fa-bimobject:before {
content: "\f378";
}
.fa-brave-reverse:before {
content: "\e63d";
}
.fa-facebook-f:before {
content: "\f39e";
}
.fa-square-google-plus:before {
content: "\f0d4";
}
.fa-google-plus-square:before {
content: "\f0d4";
}
.fa-web-awesome:before {
content: "\e682";
}
.fa-mandalorian:before {
content: "\f50f";
}
.fa-first-order-alt:before {
content: "\f50a";
}
.fa-osi:before {
content: "\f41a";
}
.fa-google-wallet:before {
content: "\f1ee";
}
.fa-d-and-d-beyond:before {
content: "\f6ca";
}
.fa-periscope:before {
content: "\f3da";
}
.fa-fulcrum:before {
content: "\f50b";
}
.fa-cloudscale:before {
content: "\f383";
}
.fa-forumbee:before {
content: "\f211";
}
.fa-mizuni:before {
content: "\f3cc";
}
.fa-schlix:before {
content: "\f3ea";
}
.fa-square-xing:before {
content: "\f169";
}
.fa-xing-square:before {
content: "\f169";
}
.fa-bandcamp:before {
content: "\f2d5";
}
.fa-wpforms:before {
content: "\f298";
}
.fa-cloudversify:before {
content: "\f385";
}
.fa-usps:before {
content: "\f7e1";
}
.fa-megaport:before {
content: "\f5a3";
}
.fa-magento:before {
content: "\f3c4";
}
.fa-spotify:before {
content: "\f1bc";
}
.fa-optin-monster:before {
content: "\f23c";
}
.fa-fly:before {
content: "\f417";
}
.fa-aviato:before {
content: "\f421";
}
.fa-itunes:before {
content: "\f3b4";
}
.fa-cuttlefish:before {
content: "\f38c";
}
.fa-blogger:before {
content: "\f37c";
}
.fa-flickr:before {
content: "\f16e";
}
.fa-viber:before {
content: "\f409";
}
.fa-soundcloud:before {
content: "\f1be";
}
.fa-digg:before {
content: "\f1a6";
}
.fa-tencent-weibo:before {
content: "\f1d5";
}
.fa-letterboxd:before {
content: "\e62d";
}
.fa-symfony:before {
content: "\f83d";
}
.fa-maxcdn:before {
content: "\f136";
}
.fa-etsy:before {
content: "\f2d7";
}
.fa-facebook-messenger:before {
content: "\f39f";
}
.fa-audible:before {
content: "\f373";
}
.fa-think-peaks:before {
content: "\f731";
}
.fa-bilibili:before {
content: "\e3d9";
}
.fa-erlang:before {
content: "\f39d";
}
.fa-x-twitter:before {
content: "\e61b";
}
.fa-cotton-bureau:before {
content: "\f89e";
}
.fa-dashcube:before {
content: "\f210";
}
.fa-42-group:before {
content: "\e080";
}
.fa-innosoft:before {
content: "\e080";
}
.fa-stack-exchange:before {
content: "\f18d";
}
.fa-elementor:before {
content: "\f430";
}
.fa-square-pied-piper:before {
content: "\e01e";
}
.fa-pied-piper-square:before {
content: "\e01e";
}
.fa-creative-commons-nd:before {
content: "\f4eb";
}
.fa-palfed:before {
content: "\f3d8";
}
.fa-superpowers:before {
content: "\f2dd";
}
.fa-resolving:before {
content: "\f3e7";
}
.fa-xbox:before {
content: "\f412";
}
.fa-square-web-awesome-stroke:before {
content: "\e684";
}
.fa-searchengin:before {
content: "\f3eb";
}
.fa-tiktok:before {
content: "\e07b";
}
.fa-square-facebook:before {
content: "\f082";
}
.fa-facebook-square:before {
content: "\f082";
}
.fa-renren:before {
content: "\f18b";
}
.fa-linux:before {
content: "\f17c";
}
.fa-glide:before {
content: "\f2a5";
}
.fa-linkedin:before {
content: "\f08c";
}
.fa-hubspot:before {
content: "\f3b2";
}
.fa-deploydog:before {
content: "\f38e";
}
.fa-twitch:before {
content: "\f1e8";
}
.fa-ravelry:before {
content: "\f2d9";
}
.fa-mixer:before {
content: "\e056";
}
.fa-square-lastfm:before {
content: "\f203";
}
.fa-lastfm-square:before {
content: "\f203";
}
.fa-vimeo:before {
content: "\f40a";
}
.fa-mendeley:before {
content: "\f7b3";
}
.fa-uniregistry:before {
content: "\f404";
}
.fa-figma:before {
content: "\f799";
}
.fa-creative-commons-remix:before {
content: "\f4ee";
}
.fa-cc-amazon-pay:before {
content: "\f42d";
}
.fa-dropbox:before {
content: "\f16b";
}
.fa-instagram:before {
content: "\f16d";
}
.fa-cmplid:before {
content: "\e360";
}
.fa-upwork:before {
content: "\e641";
}
.fa-facebook:before {
content: "\f09a";
}
.fa-gripfire:before {
content: "\f3ac";
}
.fa-jedi-order:before {
content: "\f50e";
}
.fa-uikit:before {
content: "\f403";
}
.fa-fort-awesome-alt:before {
content: "\f3a3";
}
.fa-phabricator:before {
content: "\f3db";
}
.fa-ussunnah:before {
content: "\f407";
}
.fa-earlybirds:before {
content: "\f39a";
}
.fa-trade-federation:before {
content: "\f513";
}
.fa-autoprefixer:before {
content: "\f41c";
}
.fa-whatsapp:before {
content: "\f232";
}
.fa-square-upwork:before {
content: "\e67c";
}
.fa-slideshare:before {
content: "\f1e7";
}
.fa-google-play:before {
content: "\f3ab";
}
.fa-viadeo:before {
content: "\f2a9";
}
.fa-line:before {
content: "\f3c0";
}
.fa-google-drive:before {
content: "\f3aa";
}
.fa-servicestack:before {
content: "\f3ec";
}
.fa-simplybuilt:before {
content: "\f215";
}
.fa-bitbucket:before {
content: "\f171";
}
.fa-imdb:before {
content: "\f2d8";
}
.fa-deezer:before {
content: "\e077";
}
.fa-raspberry-pi:before {
content: "\f7bb";
}
.fa-jira:before {
content: "\f7b1";
}
.fa-docker:before {
content: "\f395";
}
.fa-screenpal:before {
content: "\e570";
}
.fa-bluetooth:before {
content: "\f293";
}
.fa-gitter:before {
content: "\f426";
}
.fa-d-and-d:before {
content: "\f38d";
}
.fa-microblog:before {
content: "\e01a";
}
.fa-cc-diners-club:before {
content: "\f24c";
}
.fa-gg-circle:before {
content: "\f261";
}
.fa-pied-piper-hat:before {
content: "\f4e5";
}
.fa-kickstarter-k:before {
content: "\f3bc";
}
.fa-yandex:before {
content: "\f413";
}
.fa-readme:before {
content: "\f4d5";
}
.fa-html5:before {
content: "\f13b";
}
.fa-sellsy:before {
content: "\f213";
}
.fa-square-web-awesome:before {
content: "\e683";
}
.fa-sass:before {
content: "\f41e";
}
.fa-wirsindhandwerk:before {
content: "\e2d0";
}
.fa-wsh:before {
content: "\e2d0";
}
.fa-buromobelexperte:before {
content: "\f37f";
}
.fa-salesforce:before {
content: "\f83b";
}
.fa-octopus-deploy:before {
content: "\e082";
}
.fa-medapps:before {
content: "\f3c6";
}
.fa-ns8:before {
content: "\f3d5";
}
.fa-pinterest-p:before {
content: "\f231";
}
.fa-apper:before {
content: "\f371";
}
.fa-fort-awesome:before {
content: "\f286";
}
.fa-waze:before {
content: "\f83f";
}
.fa-bluesky:before {
content: "\e671";
}
.fa-cc-jcb:before {
content: "\f24b";
}
.fa-snapchat:before {
content: "\f2ab";
}
.fa-snapchat-ghost:before {
content: "\f2ab";
}
.fa-fantasy-flight-games:before {
content: "\f6dc";
}
.fa-rust:before {
content: "\e07a";
}
.fa-wix:before {
content: "\f5cf";
}
.fa-square-behance:before {
content: "\f1b5";
}
.fa-behance-square:before {
content: "\f1b5";
}
.fa-supple:before {
content: "\f3f9";
}
.fa-webflow:before {
content: "\e65c";
}
.fa-rebel:before {
content: "\f1d0";
}
.fa-css3:before {
content: "\f13c";
}
.fa-staylinked:before {
content: "\f3f5";
}
.fa-kaggle:before {
content: "\f5fa";
}
.fa-space-awesome:before {
content: "\e5ac";
}
.fa-deviantart:before {
content: "\f1bd";
}
.fa-cpanel:before {
content: "\f388";
}
.fa-goodreads-g:before {
content: "\f3a9";
}
.fa-square-git:before {
content: "\f1d2";
}
.fa-git-square:before {
content: "\f1d2";
}
.fa-square-tumblr:before {
content: "\f174";
}
.fa-tumblr-square:before {
content: "\f174";
}
.fa-trello:before {
content: "\f181";
}
.fa-creative-commons-nc-jp:before {
content: "\f4ea";
}
.fa-get-pocket:before {
content: "\f265";
}
.fa-perbyte:before {
content: "\e083";
}
.fa-grunt:before {
content: "\f3ad";
}
.fa-weebly:before {
content: "\f5cc";
}
.fa-connectdevelop:before {
content: "\f20e";
}
.fa-leanpub:before {
content: "\f212";
}
.fa-black-tie:before {
content: "\f27e";
}
.fa-themeco:before {
content: "\f5c6";
}
.fa-python:before {
content: "\f3e2";
}
.fa-android:before {
content: "\f17b";
}
.fa-bots:before {
content: "\e340";
}
.fa-free-code-camp:before {
content: "\f2c5";
}
.fa-hornbill:before {
content: "\f592";
}
.fa-js:before {
content: "\f3b8";
}
.fa-ideal:before {
content: "\e013";
}
.fa-git:before {
content: "\f1d3";
}
.fa-dev:before {
content: "\f6cc";
}
.fa-sketch:before {
content: "\f7c6";
}
.fa-yandex-international:before {
content: "\f414";
}
.fa-cc-amex:before {
content: "\f1f3";
}
.fa-uber:before {
content: "\f402";
}
.fa-github:before {
content: "\f09b";
}
.fa-php:before {
content: "\f457";
}
.fa-alipay:before {
content: "\f642";
}
.fa-youtube:before {
content: "\f167";
}
.fa-skyatlas:before {
content: "\f216";
}
.fa-firefox-browser:before {
content: "\e007";
}
.fa-replyd:before {
content: "\f3e6";
}
.fa-suse:before {
content: "\f7d6";
}
.fa-jenkins:before {
content: "\f3b6";
}
.fa-twitter:before {
content: "\f099";
}
.fa-rockrms:before {
content: "\f3e9";
}
.fa-pinterest:before {
content: "\f0d2";
}
.fa-buffer:before {
content: "\f837";
}
.fa-npm:before {
content: "\f3d4";
}
.fa-yammer:before {
content: "\f840";
}
.fa-btc:before {
content: "\f15a";
}
.fa-dribbble:before {
content: "\f17d";
}
.fa-stumbleupon-circle:before {
content: "\f1a3";
}
.fa-internet-explorer:before {
content: "\f26b";
}
.fa-stubber:before {
content: "\e5c7";
}
.fa-telegram:before {
content: "\f2c6";
}
.fa-telegram-plane:before {
content: "\f2c6";
}
.fa-old-republic:before {
content: "\f510";
}
.fa-odysee:before {
content: "\e5c6";
}
.fa-square-whatsapp:before {
content: "\f40c";
}
.fa-whatsapp-square:before {
content: "\f40c";
}
.fa-node-js:before {
content: "\f3d3";
}
.fa-edge-legacy:before {
content: "\e078";
}
.fa-slack:before {
content: "\f198";
}
.fa-slack-hash:before {
content: "\f198";
}
.fa-medrt:before {
content: "\f3c8";
}
.fa-usb:before {
content: "\f287";
}
.fa-tumblr:before {
content: "\f173";
}
.fa-vaadin:before {
content: "\f408";
}
.fa-quora:before {
content: "\f2c4";
}
.fa-square-x-twitter:before {
content: "\e61a";
}
.fa-reacteurope:before {
content: "\f75d";
}
.fa-medium:before {
content: "\f23a";
}
.fa-medium-m:before {
content: "\f23a";
}
.fa-amilia:before {
content: "\f36d";
}
.fa-mixcloud:before {
content: "\f289";
}
.fa-flipboard:before {
content: "\f44d";
}
.fa-viacoin:before {
content: "\f237";
}
.fa-critical-role:before {
content: "\f6c9";
}
.fa-sitrox:before {
content: "\e44a";
}
.fa-discourse:before {
content: "\f393";
}
.fa-joomla:before {
content: "\f1aa";
}
.fa-mastodon:before {
content: "\f4f6";
}
.fa-airbnb:before {
content: "\f834";
}
.fa-wolf-pack-battalion:before {
content: "\f514";
}
.fa-buy-n-large:before {
content: "\f8a6";
}
.fa-gulp:before {
content: "\f3ae";
}
.fa-creative-commons-sampling-plus:before {
content: "\f4f1";
}
.fa-strava:before {
content: "\f428";
}
.fa-ember:before {
content: "\f423";
}
.fa-canadian-maple-leaf:before {
content: "\f785";
}
.fa-teamspeak:before {
content: "\f4f9";
}
.fa-pushed:before {
content: "\f3e1";
}
.fa-wordpress-simple:before {
content: "\f411";
}
.fa-nutritionix:before {
content: "\f3d6";
}
.fa-wodu:before {
content: "\e088";
}
.fa-google-pay:before {
content: "\e079";
}
.fa-intercom:before {
content: "\f7af";
}
.fa-zhihu:before {
content: "\f63f";
}
.fa-korvue:before {
content: "\f42f";
}
.fa-pix:before {
content: "\e43a";
}
.fa-steam-symbol:before {
content: "\f3f6";
}
ul.nav-pills {
padding-left: 0;
}
ul.nav-pills .nav-link {
display: list-item;
list-style-type: disc;
margin-left: 12px;
}
ul.nav-pills .nav-link.active a {
color: white;
}
body {
padding-top: 20px;
}
header {
padding-bottom: 20px;
}
header h1, header .h1 {
font-size: 48px;
}
.well h2, .well .h2 {
margin-bottom: 20px;
}
.external-buttons {
margin-bottom: 20px;
}
input.range-start, input.range-end {
width: 100px;
}
header h1, header .h1 {
float: left;
margin-left: 20px;
}
header .example-navigator {
float: right;
margin-right: 120px;
}
li.next {
margin-left: 10px;
}
.clear {
clear: both;
}
.wice-grid.table-striped tbody tr:nth-child(odd) td.active-filter {
background-color: #f9f9e9;
}
.wice-grid.table-striped tbody tr td.active-filter {
background-color: #f9f9e9;
}
footer .sources {
float: right;
}
/*# sourceMappingURL=data:application/json;charset=utf-8,%7B%22version%22:3,%22sourceRoot%22:%22%22,%22sources%22:%5B%22../stylesheets/application.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/mixins/_banner.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/_root.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/vendor/_rfs.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/mixins/_color-mode.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/_reboot.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/_variables.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/mixins/_border-radius.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/_type.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/mixins/_lists.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/_images.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/mixins/_image.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/_containers.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/mixins/_container.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/mixins/_breakpoints.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/_grid.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/mixins/_grid.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/_tables.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/mixins/_table-variants.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/forms/_labels.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/forms/_form-text.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/forms/_form-control.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/mixins/_transition.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/mixins/_gradients.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/forms/_form-select.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/forms/_form-check.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/forms/_form-range.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/forms/_floating-labels.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/forms/_input-group.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/mixins/_forms.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/_buttons.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/mixins/_buttons.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/_transitions.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/_dropdown.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/mixins/_caret.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/_button-group.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/_nav.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/_navbar.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/_card.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/_accordion.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/_breadcrumb.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/_pagination.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/mixins/_pagination.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/_badge.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/_alert.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/_progress.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/_list-group.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/_close.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/_toasts.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/_modal.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/mixins/_backdrop.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/_tooltip.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/mixins/_reset-text.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/_popover.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/_carousel.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/mixins/_clearfix.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/_spinners.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/_offcanvas.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/_placeholders.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/helpers/_color-bg.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/helpers/_colored-links.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/helpers/_focus-ring.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/helpers/_icon-link.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/helpers/_ratio.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/helpers/_position.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/helpers/_stacks.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/helpers/_visually-hidden.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/mixins/_visually-hidden.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/helpers/_stretched-link.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/helpers/_text-truncation.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/mixins/_text-truncate.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/helpers/_vr.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/mixins/_utilities.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/gems/bootstrap-5.3.3/assets/stylesheets/bootstrap/utilities/_api.scss%22,%22../../../../../../vendor/assets/stylesheets/wice_grid.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/bundler/gems/font-awesome-sass-bed06b0e9c62/assets/stylesheets/_font-awesome.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/bundler/gems/font-awesome-sass-bed06b0e9c62/assets/stylesheets/font-awesome/_core.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/bundler/gems/font-awesome-sass-bed06b0e9c62/assets/stylesheets/font-awesome/_sizing.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/bundler/gems/font-awesome-sass-bed06b0e9c62/assets/stylesheets/font-awesome/_mixins.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/bundler/gems/font-awesome-sass-bed06b0e9c62/assets/stylesheets/font-awesome/_fixed-width.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/bundler/gems/font-awesome-sass-bed06b0e9c62/assets/stylesheets/font-awesome/_variables.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/bundler/gems/font-awesome-sass-bed06b0e9c62/assets/stylesheets/font-awesome/_list.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/bundler/gems/font-awesome-sass-bed06b0e9c62/assets/stylesheets/font-awesome/_bordered-pulled.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/bundler/gems/font-awesome-sass-bed06b0e9c62/assets/stylesheets/font-awesome/_animated.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/bundler/gems/font-awesome-sass-bed06b0e9c62/assets/stylesheets/font-awesome/_rotated-flipped.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/bundler/gems/font-awesome-sass-bed06b0e9c62/assets/stylesheets/font-awesome/_stacked.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/bundler/gems/font-awesome-sass-bed06b0e9c62/assets/stylesheets/font-awesome/_icons.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/bundler/gems/font-awesome-sass-bed06b0e9c62/assets/stylesheets/font-awesome/_screen-reader.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/bundler/gems/font-awesome-sass-bed06b0e9c62/assets/stylesheets/font-awesome/_solid.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/bundler/gems/font-awesome-sass-bed06b0e9c62/assets/stylesheets/font-awesome/_regular.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/bundler/gems/font-awesome-sass-bed06b0e9c62/assets/stylesheets/font-awesome/_brands.scss%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/bundler/gems/jquery-ui-rails-619d63474aee/app/assets/stylesheets/jquery-ui/core.css%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/bundler/gems/jquery-ui-rails-619d63474aee/app/assets/stylesheets/jquery-ui/theme.css%22,%22../../../../../../../../../../../usr/local/rvm/gems/ruby-3.2.3@github/bundler/gems/jquery-ui-rails-619d63474aee/app/assets/stylesheets/jquery-ui/datepicker.css%22%5D,%22names%22:%5B%5D,%22mappings%22:%22;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ACCE;AAAA;AAAA;AAAA;AAAA;ACDF;AAAA;EASI;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAIA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAIA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAIA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAIA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAIA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAIA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAGF;EACA;EAMA;EACA;EACA;EAOA;EC2OI,qBALI;EDpOR;EACA;EAKA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EAGA;EAEA;EACA;EACA;EAEA;EACA;EAMA;EACA;EACA;EAGA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EAIA;EACA;EACA;EAIA;EACA;EACA;EACA;;;AEhHE;EFsHA;EAGA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EAGE;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAIA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAIA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAGF;EAEA;EACA;EACA;EACA;EAEA;EACA;EACA;EAEA;EACA;EAEA;EACA;EACA;EACA;;;AGxKJ;AAAA;AAAA;EAGE;;;AAeE;EANJ;IAOM;;;;AAcN;EACE;EACA;EF6OI,WALI;EEtOR;EACA;EACA;EACA;EACA;EACA;EACA;;;AASF;EACE;EACA,OCmnB4B;EDlnB5B;EACA;EACA,SCynB4B;;;AD/mB9B;EACE;EACA,eCwjB4B;EDrjB5B,aCwjB4B;EDvjB5B,aCwjB4B;EDvjB5B;;;AAGF;EFuMQ;;AA5JJ;EE3CJ;IF8MQ;;;;AEzMR;EFkMQ;;AA5JJ;EEtCJ;IFyMQ;;;;AEpMR;EF6LQ;;AA5JJ;EEjCJ;IFoMQ;;;;AE/LR;EFwLQ;;AA5JJ;EE5BJ;IF+LQ;;;;AE1LR;EF+KM,WALI;;;AErKV;EF0KM,WALI;;;AE1JV;EACE;EACA,eCwV0B;;;AD9U5B;EACE;EACA;EACA;;;AAMF;EACE;EACA;EACA;;;AAMF;AAAA;EAEE;;;AAGF;AAAA;AAAA;EAGE;EACA;;;AAGF;AAAA;AAAA;AAAA;EAIE;;;AAGF;EACE,aC6b4B;;;ADxb9B;EACE;EACA;;;AAMF;EACE;;;AAQF;AAAA;EAEE,aCsa4B;;;AD9Z9B;EF6EM,WALI;;;AEjEV;EACE,SCqf4B;EDpf5B;EACA;;;AASF;AAAA;EAEE;EFwDI,WALI;EEjDR;EACA;;;AAGF;EAAM;;;AACN;EAAM;;;AAKN;EACE;EACA,iBCgNwC;;AD9MxC;EACE;;;AAWF;EAEE;EACA;;;AAOJ;AAAA;AAAA;AAAA;EAIE,aCgV4B;EHlUxB,WALI;;;AEDV;EACE;EACA;EACA;EACA;EFEI,WALI;;AEQR;EFHI,WALI;EEUN;EACA;;;AAIJ;EFVM,WALI;EEiBR;EACA;;AAGA;EACE;;;AAIJ;EACE;EFtBI,WALI;EE6BR,OCy5CkC;EDx5ClC,kBCy5CkC;EC9rDhC;;AFwSF;EACE;EF7BE,WALI;;;AE6CV;EACE;;;AAMF;AAAA;EAEE;;;AAQF;EACE;EACA;;;AAGF;EACE,aC4X4B;ED3X5B,gBC2X4B;ED1X5B,OC4Z4B;ED3Z5B;;;AAOF;EAEE;EACA;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;EAME;EACA;EACA;;;AAQF;EACE;;;AAMF;EAEE;;;AAQF;EACE;;;AAKF;AAAA;AAAA;AAAA;AAAA;EAKE;EACA;EF5HI,WALI;EEmIR;;;AAIF;AAAA;EAEE;;;AAKF;EACE;;;AAGF;EAGE;;AAGA;EACE;;;AAOJ;EACE;;;AAQF;AAAA;AAAA;AAAA;EAIE;;AAGE;AAAA;AAAA;AAAA;EACE;;;AAON;EACE;EACA;;;AAKF;EACE;;;AAUF;EACE;EACA;EACA;EACA;;;AAQF;EACE;EACA;EACA;EACA,eCmN4B;EHpatB;EEoNN;;AFhXE;EEyWJ;IFtMQ;;;AE+MN;EACE;;;AAOJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOE;;;AAGF;EACE;;;AASF;EACE;EACA;;;AAQF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWA;EACE;;;AAKF;EACE;;;AAOF;EACE;EACA;;;AAKF;EACE;;;AAKF;EACE;;;AAOF;EACE;EACA;;;AAQF;EACE;;;AAQF;EACE;;;AGrkBF;ELmQM,WALI;EK5PR,aFwoB4B;;;AEnoB5B;ELgQM;EK5PJ,aFynBkB;EExnBlB,aFwmB0B;;AHzgB1B;EKpGF;ILuQM;;;;AKvQN;ELgQM;EK5PJ,aFynBkB;EExnBlB,aFwmB0B;;AHzgB1B;EKpGF;ILuQM;;;;AKvQN;ELgQM;EK5PJ,aFynBkB;EExnBlB,aFwmB0B;;AHzgB1B;EKpGF;ILuQM;;;;AKvQN;ELgQM;EK5PJ,aFynBkB;EExnBlB,aFwmB0B;;AHzgB1B;EKpGF;ILuQM;;;;AKvQN;ELgQM;EK5PJ,aFynBkB;EExnBlB,aFwmB0B;;AHzgB1B;EKpGF;ILuQM;;;;AKvQN;ELgQM;EK5PJ,aFynBkB;EExnBlB,aFwmB0B;;AHzgB1B;EKpGF;ILuQM;;;;AK/OR;ECvDE;EACA;;;AD2DF;EC5DE;EACA;;;AD8DF;EACE;;AAEA;EACE,cFsoB0B;;;AE5nB9B;EL8MM,WALI;EKvMR;;;AAIF;EACE,eFiUO;EH1HH,WALI;;AK/LR;EACE;;;AAIJ;EACE;EACA,eFuTO;EH1HH,WALI;EKtLR,OFtFS;;AEwFT;EACE;;;AEhGJ;ECIE;EAGA;;;ADDF;EACE,SJ+jDkC;EI9jDlC,kBJ+jDkC;EI9jDlC;EHGE;EIRF;EAGA;;;ADcF;EAEE;;;AAGF;EACE;EACA;;;AAGF;EPyPM,WALI;EOlPR,OJkjDkC;;;AMplDlC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ECHA;EACA;EACA;EACA;EACA;EACA;EACA;;;ACsDE;EF5CE;IACE,WNkee;;;AQvbnB;EF5CE;IACE,WNkee;;;AQvbnB;EF5CE;IACE,WNkee;;;AQvbnB;EF5CE;IACE,WNkee;;;AQvbnB;EF5CE;IACE,WNkee;;;ASlfvB;EAEI;EAAA;EAAA;EAAA;EAAA;EAAA;;;AAKF;ECNA;EACA;EACA;EACA;EAEA;EACA;EACA;;ADEE;ECOF;EACA;EACA;EACA;EACA;EACA;;;AA+CI;EACE;;;AAGF;EApCJ;EACA;;;AAcA;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AA+BE;EAhDJ;EACA;;;AAqDQ;EAhEN;EACA;;;AA+DM;EAhEN;EACA;;;AA+DM;EAhEN;EACA;;;AA+DM;EAhEN;EACA;;;AA+DM;EAhEN;EACA;;;AA+DM;EAhEN;EACA;;;AA+DM;EAhEN;EACA;;;AA+DM;EAhEN;EACA;;;AA+DM;EAhEN;EACA;;;AA+DM;EAhEN;EACA;;;AA+DM;EAhEN;EACA;;;AA+DM;EAhEN;EACA;;;AAuEQ;EAxDV;;;AAwDU;EAxDV;;;AAwDU;EAxDV;;;AAwDU;EAxDV;;;AAwDU;EAxDV;;;AAwDU;EAxDV;;;AAwDU;EAxDV;;;AAwDU;EAxDV;;;AAwDU;EAxDV;;;AAwDU;EAxDV;;;AAwDU;EAxDV;;;AAmEM;AAAA;EAEE;;;AAGF;AAAA;EAEE;;;AAPF;AAAA;EAEE;;;AAGF;AAAA;EAEE;;;AAPF;AAAA;EAEE;;;AAGF;AAAA;EAEE;;;AAPF;AAAA;EAEE;;;AAGF;AAAA;EAEE;;;AAPF;AAAA;EAEE;;;AAGF;AAAA;EAEE;;;AAPF;AAAA;EAEE;;;AAGF;AAAA;EAEE;;;AF1DN;EEUE;IACE;;EAGF;IApCJ;IACA;;EAcA;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EA+BE;IAhDJ;IACA;;EAqDQ;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EAuEQ;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAmEM;AAAA;IAEE;;EAGF;AAAA;IAEE;;EAPF;AAAA;IAEE;;EAGF;AAAA;IAEE;;EAPF;AAAA;IAEE;;EAGF;AAAA;IAEE;;EAPF;AAAA;IAEE;;EAGF;AAAA;IAEE;;EAPF;AAAA;IAEE;;EAGF;AAAA;IAEE;;EAPF;AAAA;IAEE;;EAGF;AAAA;IAEE;;;AF1DN;EEUE;IACE;;EAGF;IApCJ;IACA;;EAcA;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EA+BE;IAhDJ;IACA;;EAqDQ;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EAuEQ;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAmEM;AAAA;IAEE;;EAGF;AAAA;IAEE;;EAPF;AAAA;IAEE;;EAGF;AAAA;IAEE;;EAPF;AAAA;IAEE;;EAGF;AAAA;IAEE;;EAPF;AAAA;IAEE;;EAGF;AAAA;IAEE;;EAPF;AAAA;IAEE;;EAGF;AAAA;IAEE;;EAPF;AAAA;IAEE;;EAGF;AAAA;IAEE;;;AF1DN;EEUE;IACE;;EAGF;IApCJ;IACA;;EAcA;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EA+BE;IAhDJ;IACA;;EAqDQ;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EAuEQ;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAmEM;AAAA;IAEE;;EAGF;AAAA;IAEE;;EAPF;AAAA;IAEE;;EAGF;AAAA;IAEE;;EAPF;AAAA;IAEE;;EAGF;AAAA;IAEE;;EAPF;AAAA;IAEE;;EAGF;AAAA;IAEE;;EAPF;AAAA;IAEE;;EAGF;AAAA;IAEE;;EAPF;AAAA;IAEE;;EAGF;AAAA;IAEE;;;AF1DN;EEUE;IACE;;EAGF;IApCJ;IACA;;EAcA;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EA+BE;IAhDJ;IACA;;EAqDQ;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EAuEQ;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAmEM;AAAA;IAEE;;EAGF;AAAA;IAEE;;EAPF;AAAA;IAEE;;EAGF;AAAA;IAEE;;EAPF;AAAA;IAEE;;EAGF;AAAA;IAEE;;EAPF;AAAA;IAEE;;EAGF;AAAA;IAEE;;EAPF;AAAA;IAEE;;EAGF;AAAA;IAEE;;EAPF;AAAA;IAEE;;EAGF;AAAA;IAEE;;;AF1DN;EEUE;IACE;;EAGF;IApCJ;IACA;;EAcA;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EA+BE;IAhDJ;IACA;;EAqDQ;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EAuEQ;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAmEM;AAAA;IAEE;;EAGF;AAAA;IAEE;;EAPF;AAAA;IAEE;;EAGF;AAAA;IAEE;;EAPF;AAAA;IAEE;;EAGF;AAAA;IAEE;;EAPF;AAAA;IAEE;;EAGF;AAAA;IAEE;;EAPF;AAAA;IAEE;;EAGF;AAAA;IAEE;;EAPF;AAAA;IAEE;;EAGF;AAAA;IAEE;;;ACrHV;EAEE;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA,eXkYO;EWjYP,gBXusB4B;EWtsB5B;;AAOA;EACE;EAEA;EACA;EACA,qBX+sB0B;EW9sB1B;;AAGF;EACE;;AAGF;EACE;;;AAIJ;EACE;;;AAOF;EACE;;;AAUA;EACE;;;AAeF;EACE;;AAGA;EACE;;;AAOJ;EACE;;AAGF;EACE;;;AAUF;EACE;EACA;;;AAMF;EACE;EACA;;;AAQJ;EACE;EACA;;;AAQA;EACE;EACA;;;AC5IF;EAOE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;;;AAlBF;EAOE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;;;AAlBF;EAOE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;;;AAlBF;EAOE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;;;AAlBF;EAOE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;;;AAlBF;EAOE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;;;AAlBF;EAOE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;;;AAlBF;EAOE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;;;ADiJA;EACE;EACA;;;AH3FF;EGyFA;IACE;IACA;;;AH3FF;EGyFA;IACE;IACA;;;AH3FF;EGyFA;IACE;IACA;;;AH3FF;EGyFA;IACE;IACA;;;AH3FF;EGyFA;IACE;IACA;;;AEnKN;EACE,ebu2BsC;;;Aa91BxC;EACE;EACA;EACA;EhB8QI,WALI;EgBrQR,ab+lB4B;;;Aa3lB9B;EACE;EACA;EhBoQI,WALI;;;AgB3PV;EACE;EACA;EhB8PI,WALI;;;AiBtRV;EACE,Yd+1BsC;EHrkBlC,WALI;EiBjRR,Od+1BsC;;;Aep2BxC;EACE;EACA;EACA;ElBwRI,WALI;EkBhRR,afkmB4B;EejmB5B,afymB4B;EexmB5B,Of43BsC;Ee33BtC;EACA,kBfq3BsC;Eep3BtC;EACA;EdGE;EeHE,YDMJ;;ACFI;EDhBN;ICiBQ;;;ADGN;EACE;;AAEA;EACE;;AAKJ;EACE,Ofs2BoC;Eer2BpC,kBfg2BoC;Ee/1BpC,cf82BoC;Ee72BpC;EAKE,YfkhBkB;;Ae9gBtB;EAME;EAMA;EAKA;;AAKF;EACE;EACA;;AAIF;EACE,Of40BoC;Ee10BpC;;AAQF;EAEE,kBf8yBoC;Ee3yBpC;;AAIF;EACE;EACA;EACA,mBforB0B;EenrB1B,OfsyBoC;EiBp4BtC,kBjBqiCgC;Eer8B9B;EACA;EACA;EACA;EACA,yBfgsB0B;Ee/rB1B;ECzFE,YD0FF;;ACtFE;ED0EJ;ICzEM;;;ADwFN;EACE,kBf47B8B;;;Aen7BlC;EACE;EACA;EACA;EACA;EACA,afwf4B;Eevf5B,Of2xBsC;Ee1xBtC;EACA;EACA;;AAEA;EACE;;AAGF;EAEE;EACA;;;AAWJ;EACE,Yf4wBsC;Ee3wBtC;ElByII,WALI;EIvQN;;AcuIF;EACE;EACA;EACA,mBfooB0B;;;AehoB9B;EACE,YfgwBsC;Ee/vBtC;ElB4HI,WALI;EIvQN;;AcoJF;EACE;EACA;EACA,mBf2nB0B;;;AennB5B;EACE,Yf6uBoC;;Ae1uBtC;EACE,Yf0uBoC;;AevuBtC;EACE,YfuuBoC;;;AeluBxC;EACE,OfquBsC;EepuBtC,Qf8tBsC;Ee7tBtC,SfilB4B;;Ae/kB5B;EACE;;AAGF;EACE;EdvLA;;Ac2LF;EACE;Ed5LA;;AcgMF;EAAoB,Qf8sBkB;;Ae7sBtC;EAAoB,Qf8sBkB;;;AkB75BxC;EACE;EAEA;EACA;EACA;ErBqRI,WALI;EqB7QR,alB+lB4B;EkB9lB5B,alBsmB4B;EkBrmB5B,OlBy3BsC;EkBx3BtC;EACA,kBlBk3BsC;EkBj3BtC;EACA;EACA,qBlB+9BkC;EkB99BlC,iBlB+9BkC;EkB99BlC;EjBHE;EeHE,YESJ;;AFLI;EEfN;IFgBQ;;;AEMN;EACE,clBs3BoC;EkBr3BpC;EAKE,YlBi+B4B;;AkB79BhC;EAEE,elB6uB0B;EkB5uB1B;;AAGF;EAEE,kBlBu1BoC;;AkBl1BtC;EACE;EACA;;;AAIJ;EACE,alBsuB4B;EkBruB5B,gBlBquB4B;EkBpuB5B,clBquB4B;EHlgBxB,WALI;EIvQN;;;AiB8CJ;EACE,alBkuB4B;EkBjuB5B,gBlBiuB4B;EkBhuB5B,clBiuB4B;EHtgBxB,WALI;EIvQN;;;AiBwDA;EACE;;;ACxEN;EACE;EACA,YnBq6BwC;EmBp6BxC,cnBq6BwC;EmBp6BxC,enBq6BwC;;AmBn6BxC;EACE;EACA;;;AAIJ;EACE,enB25BwC;EmB15BxC;EACA;;AAEA;EACE;EACA;EACA;;;AAIJ;EACE;EAEA;EACA,OnB04BwC;EmBz4BxC,QnBy4BwC;EmBx4BxC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,QnB24BwC;EmB14BxC;;AAGA;ElB3BE;;AkB+BF;EAEE,enBm4BsC;;AmBh4BxC;EACE,QnB03BsC;;AmBv3BxC;EACE,cnBs1BoC;EmBr1BpC;EACA,YnB8foB;;AmB3ftB;EACE,kBnB5BM;EmB6BN,cnB7BM;;AmB+BN;EAII;;AAIJ;EAII;;AAKN;EACE,kBnBjDM;EmBkDN,cnBlDM;EmBuDJ;;AAIJ;EACE;EACA;EACA,SnBk2BuC;;AmB31BvC;EACE;EACA,SnBy1BqC;;;AmB30B3C;EACE,cnBo1BgC;;AmBl1BhC;EACE;EAEA,OnB80B8B;EmB70B9B;EACA;EACA;ElBjHA;EeHE,YGsHF;;AHlHE;EG0GJ;IHzGM;;;AGmHJ;EACE;;AAGF;EACE,qBnB60B4B;EmBx0B1B;;AAKN;EACE,enBwzB8B;EmBvzB9B;;AAEA;EACE;EACA;;;AAKN;EACE;EACA,cnBsyBgC;;;AmBnyBlC;EACE;EACA;EACA;;AAIE;EACE;EACA;EACA,SnBspBwB;;;AmB/oB1B;EACE;;;ACnLN;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAIA;EAA0B,YpB8gCa;;AoB7gCvC;EAA0B,YpB6gCa;;AoB1gCzC;EACE;;AAGF;EACE,OpB+/BuC;EoB9/BvC,QpB8/BuC;EoB7/BvC;EACA;EH1BF,kBjBkCQ;EoBNN,QpB6/BuC;EC1gCvC;EeHE,YImBF;;AJfE;EIMJ;IJLM;;;AIgBJ;EHjCF,kBjB8hCyC;;AoBx/BzC;EACE,OpBw+B8B;EoBv+B9B,QpBw+B8B;EoBv+B9B;EACA,QpBu+B8B;EoBt+B9B,kBpBu+B8B;EoBt+B9B;EnB7BA;;AmBkCF;EACE,OpBo+BuC;EoBn+BvC,QpBm+BuC;EoBl+BvC;EHpDF,kBjBkCQ;EoBoBN,QpBm+BuC;EC1gCvC;EeHE,YI6CF;;AJzCE;EIiCJ;IJhCM;;;AI0CJ;EH3DF,kBjB8hCyC;;AoB99BzC;EACE,OpB88B8B;EoB78B9B,QpB88B8B;EoB78B9B;EACA,QpB68B8B;EoB58B9B,kBpB68B8B;EoB58B9B;EnBvDA;;AmB4DF;EACE;;AAEA;EACE,kBpBg9BqC;;AoB78BvC;EACE,kBpB48BqC;;;AqBniC3C;EACE;;AAEA;AAAA;AAAA;EAGE,QrBwiCoC;EqBviCpC,YrBuiCoC;EqBtiCpC,arBuiCoC;;AqBpiCtC;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;ELRE,YKSF;;ALLE;EKTJ;ILUM;;;AKON;AAAA;EAEE;;AAEA;AAAA;EACE;;AAGF;AAAA;AAAA;EAEE,arB4gCkC;EqB3gClC,gBrB4gCkC;;AqBzgCpC;AAAA;EACE,arBugCkC;EqBtgClC,gBrBugCkC;;AqBngCtC;EACE,arBigCoC;EqBhgCpC,gBrBigCoC;;AqB1/BpC;AAAA;AAAA;AAAA;EACE;EACA,WrB2/BkC;;AqBz/BlC;AAAA;AAAA;AAAA;EACE;EACA;EACA;EACA,QrBm/BgC;EqBl/BhC;EACA,kBrBg0BgC;ECh3BpC;;AoBuDA;EACE;EACA,WrB0+BkC;;AqBr+BpC;EACE;;AAIJ;AAAA;EAEE,OrB1EO;;AqB4EP;AAAA;EACE,kBrB0yBkC;;;AsBj4BxC;EACE;EACA;EACA;EACA;EACA;;AAEA;AAAA;AAAA;EAGE;EACA;EACA;EACA;;AAIF;AAAA;AAAA;EAGE;;AAMF;EACE;EACA;;AAEA;EACE;;;AAWN;EACE;EACA;EACA;EzB8OI,WALI;EyBvOR,atByjB4B;EsBxjB5B,atBgkB4B;EsB/jB5B,OtBm1BsC;EsBl1BtC;EACA;EACA,kBtB06BsC;EsBz6BtC;ErBtCE;;;AqBgDJ;AAAA;AAAA;AAAA;EAIE;EzBwNI,WALI;EIvQN;;;AqByDJ;AAAA;AAAA;AAAA;EAIE;EzB+MI,WALI;EIvQN;;;AqBkEJ;AAAA;EAEE;;;AAaE;AAAA;AAAA;AAAA;ErBjEA;EACA;;AqByEA;AAAA;AAAA;AAAA;ErB1EA;EACA;;AqBsFF;EACE;ErB1EA;EACA;;AqB6EF;AAAA;ErB9EE;EACA;;;AsBxBF;EACE;EACA;EACA,YvBu0BoC;EHrkBlC,WALI;E0B1PN,OvBkjCqB;;;AuB/iCvB;EACE;EACA;EACA;EACA;EACA;EACA;EACA;E1BqPE,WALI;E0B7ON,OvBqiCqB;EuBpiCrB,kBvBoiCqB;EC/jCrB;;;AsBgCA;AAAA;AAAA;AAAA;EAEE;;;AA/CF;EAqDE,cvBuhCmB;EuBphCjB,evB81BgC;EuB71BhC;EACA;EACA;EACA;;AAGF;EACE,cvB4gCiB;EuBvgCf,YvBugCe;;;AuB5kCrB;EA+EI,evBu0BgC;EuBt0BhC;;;AAhFJ;EAuFE,cvBq/BmB;;AuBl/BjB;EAEE;EACA,evBq5B8B;EuBp5B9B;EACA;;AAIJ;EACE,cvBw+BiB;EuBn+Bf,YvBm+Be;;;AuB5kCrB;EAkHI;;;AAlHJ;EAyHE,cvBm9BmB;;AuBj9BnB;EACE,kBvBg9BiB;;AuB78BnB;EACE,YvB48BiB;;AuBz8BnB;EACE,OvBw8BiB;;;AuBn8BrB;EACE;;;AA1IF;AAAA;AAAA;AAAA;AAAA;EAoJM;;;AAhIR;EACE;EACA;EACA,YvBu0BoC;EHrkBlC,WALI;E0B1PN,OvBkjCqB;;;AuB/iCvB;EACE;EACA;EACA;EACA;EACA;EACA;EACA;E1BqPE,WALI;E0B7ON,OvBqiCqB;EuBpiCrB,kBvBoiCqB;EC/jCrB;;;AsBgCA;AAAA;AAAA;AAAA;EAEE;;;AA/CF;EAqDE,cvBuhCmB;EuBphCjB,evB81BgC;EuB71BhC;EACA;EACA;EACA;;AAGF;EACE,cvB4gCiB;EuBvgCf,YvBugCe;;;AuB5kCrB;EA+EI,evBu0BgC;EuBt0BhC;;;AAhFJ;EAuFE,cvBq/BmB;;AuBl/BjB;EAEE;EACA,evBq5B8B;EuBp5B9B;EACA;;AAIJ;EACE,cvBw+BiB;EuBn+Bf,YvBm+Be;;;AuB5kCrB;EAkHI;;;AAlHJ;EAyHE,cvBm9BmB;;AuBj9BnB;EACE,kBvBg9BiB;;AuB78BnB;EACE,YvB48BiB;;AuBz8BnB;EACE,OvBw8BiB;;;AuBn8BrB;EACE;;;AA1IF;AAAA;AAAA;AAAA;AAAA;EAsJM;;;ACxJV;EAEE;EACA;EACA;E3BuRI,oBALI;E2BhRR;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;E3BsQI,WALI;E2B/PR;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EvBjBE;EgBfF,kBOkCqB;ERtBjB,YQwBJ;;ARpBI;EQhBN;IRiBQ;;;AQqBN;EACE;EAEA;EACA;;AAGF;EAEE;EACA;EACA;;AAGF;EACE;EPrDF,kBOsDuB;EACrB;EACA;EAKE;;AAIJ;EACE;EACA;EAKE;;AAIJ;EAKE;EACA;EAGA;;AAGA;EAKI;;AAKN;EAKI;;AAIJ;EAGE;EACA;EACA;EAEA;EACA;;;AAYF;EC/GA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ADkGA;EC/GA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ADkGA;EC/GA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ADkGA;EC/GA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ADkGA;EC/GA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ADkGA;EC/GA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ADkGA;EC/GA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ADkGA;EC/GA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AD4HA;EChHA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ADmGA;EChHA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ADmGA;EChHA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ADmGA;EChHA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ADmGA;EChHA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ADmGA;EChHA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ADmGA;EChHA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ADmGA;EChHA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AD+GF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA,iBxB8QwC;;AwBpQxC;EACE;;AAGF;EACE;;;AAWJ;ECjJE;EACA;E5B8NI,oBALI;E4BvNR;;;ADkJF;ECrJE;EACA;E5B8NI,oBALI;E4BvNR;;;ACnEF;EVgBM,YUfJ;;AVmBI;EUpBN;IVqBQ;;;AUlBN;EACE;;;AAMF;EACE;;;AAIJ;EACE;EACA;EVDI,YUEJ;;AVEI;EULN;IVMQ;;;AUDN;EACE;EACA;EVNE,YUOF;;AVHE;EUAJ;IVCM;;;;AWpBR;AAAA;AAAA;AAAA;AAAA;AAAA;EAME;;;AAGF;EACE;;ACwBE;EACE;EACA,a5B6hBwB;E4B5hBxB,gB5B2hBwB;E4B1hBxB;EArCJ;EACA;EACA;EACA;;AA0DE;EACE;;;AD9CN;EAEE;EACA;EACA;EACA;EACA;E9BuQI,yBALI;E8BhQR;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;EACA;E9B0OI,WALI;E8BnOR;EACA;EACA;EACA;EACA;EACA;E1BzCE;;A0B6CF;EACE;EACA;EACA;;;AAwBA;EACE;;AAEA;EACE;EACA;;;AAIJ;EACE;;AAEA;EACE;EACA;;;AnB1CJ;EmB4BA;IACE;;EAEA;IACE;IACA;;EAIJ;IACE;;EAEA;IACE;IACA;;;AnB1CJ;EmB4BA;IACE;;EAEA;IACE;IACA;;EAIJ;IACE;;EAEA;IACE;IACA;;;AnB1CJ;EmB4BA;IACE;;EAEA;IACE;IACA;;EAIJ;IACE;;EAEA;IACE;IACA;;;AnB1CJ;EmB4BA;IACE;;EAEA;IACE;IACA;;EAIJ;IACE;;EAEA;IACE;IACA;;;AnB1CJ;EmB4BA;IACE;;EAEA;IACE;IACA;;EAIJ;IACE;;EAEA;IACE;IACA;;;AAUN;EACE;EACA;EACA;EACA;;ACpFA;EACE;EACA,a5B6hBwB;E4B5hBxB,gB5B2hBwB;E4B1hBxB;EA9BJ;EACA;EACA;EACA;;AAmDE;EACE;;;ADgEJ;EACE;EACA;EACA;EACA;EACA;;AClGA;EACE;EACA,a5B6hBwB;E4B5hBxB,gB5B2hBwB;E4B1hBxB;EAvBJ;EACA;EACA;EACA;;AA4CE;EACE;;AD0EF;EACE;;;AAMJ;EACE;EACA;EACA;EACA;EACA;;ACnHA;EACE;EACA,a5B6hBwB;E4B5hBxB,gB5B2hBwB;E4B1hBxB;;AAWA;EACE;;AAGF;EACE;EACA,c5B0gBsB;E4BzgBtB,gB5BwgBsB;E4BvgBtB;EAnCN;EACA;EACA;;AAsCE;EACE;;AD2FF;EACE;;;AAON;EACE;EACA;EACA;EACA;EACA;;;AAMF;EACE;EACA;EACA;EACA;EACA,a3Byb4B;E2Bxb5B;EACA;EACA;EACA;EACA;EACA;E1BtKE;;A0ByKF;EAEE;EV1LF,kBU4LuB;;AAGvB;EAEE;EACA;EVlMF,kBUmMuB;;AAGvB;EAEE;EACA;EACA;;;AAMJ;EACE;;;AAIF;EACE;EACA;EACA;E9BmEI,WALI;E8B5DR;EACA;;;AAIF;EACE;EACA;EACA;;;AAIF;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AEtPF;AAAA;EAEE;EACA;EACA;;AAEA;AAAA;EACE;EACA;;AAKF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAME;;;AAKJ;EACE;EACA;EACA;;AAEA;EACE;;;AAIJ;E5BhBI;;A4BoBF;AAAA;EAEE;;AAIF;AAAA;AAAA;E5BVE;EACA;;A4BmBF;AAAA;AAAA;E5BNE;EACA;;;A4BwBJ;EACE;EACA;;AAEA;EAGE;;AAGF;EACE;;;AAIJ;EACE;EACA;;;AAGF;EACE;EACA;;;AAoBF;EACE;EACA;EACA;;AAEA;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAIF;AAAA;E5B1FE;EACA;;A4B8FF;AAAA;E5B7GE;EACA;;;A6BxBJ;EAEE;EACA;EAEA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EjCsQI,WALI;EiC/PR;EACA;EACA;EACA;EACA;EdfI,YcgBJ;;AdZI;EcGN;IdFQ;;;AcaN;EAEE;;AAIF;EACE;EACA,Y9BkhBoB;;A8B9gBtB;EAEE;EACA;EACA;;;AAQJ;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;;AAEA;EACE;EACA;E7B7CA;EACA;;A6B+CA;EAGE;EACA;;AAIJ;AAAA;EAEE;EACA;EACA;;AAGF;EAEE;E7BjEA;EACA;;;A6B2EJ;EAEE;EACA;EACA;;AAGA;E7B5FE;;A6BgGF;AAAA;EAEE;EbjHF,kBakHuB;;;AASzB;EAEE;EACA;EACA;EAGA;;AAEA;EACE;EACA;EACA;;AAEA;EAEE;;AAIJ;AAAA;EAEE,a9B0d0B;E8Bzd1B;EACA;;;AAUF;AAAA;EAEE;EACA;;;AAKF;AAAA;EAEE;EACA;EACA;;;AAMF;AAAA;EACE;;;AAUF;EACE;;AAEF;EACE;;;AC7LJ;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;EACA;;AAMA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;EACA;EACA;EACA;;AAoBJ;EACE;EACA;EACA;ElC4NI,WALI;EkCrNR;EACA;EACA;;AAEA;EAEE;;;AAUJ;EAEE;EACA;EAEA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;;AAGE;EAEE;;AAIJ;EACE;;;AASJ;EACE,a/B8gCkC;E+B7gClC,gB/B6gCkC;E+B5gClC;;AAEA;AAAA;AAAA;EAGE;;;AAaJ;EACE;EACA;EAGA;;;AAIF;EACE;ElCyII,WALI;EkClIR;EACA;EACA;EACA;E9BxIE;EeHE,Ye6IJ;;AfzII;EeiIN;IfhIQ;;;Ae0IN;EACE;;AAGF;EACE;EACA;EACA;;;AAMJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AvB1HE;EuBsIA;IAEI;IACA;;EAEA;IACE;;EAEA;IACE;;EAGF;IACE;IACA;;EAIJ;IACE;;EAGF;IACE;IACA;;EAGF;IACE;;EAGF;IAEE;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;If9NJ,YegOI;;EAGA;IACE;;EAGF;IACE;IACA;IACA;IACA;;;AvB5LR;EuBsIA;IAEI;IACA;;EAEA;IACE;;EAEA;IACE;;EAGF;IACE;IACA;;EAIJ;IACE;;EAGF;IACE;IACA;;EAGF;IACE;;EAGF;IAEE;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;If9NJ,YegOI;;EAGA;IACE;;EAGF;IACE;IACA;IACA;IACA;;;AvB5LR;EuBsIA;IAEI;IACA;;EAEA;IACE;;EAEA;IACE;;EAGF;IACE;IACA;;EAIJ;IACE;;EAGF;IACE;IACA;;EAGF;IACE;;EAGF;IAEE;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;If9NJ,YegOI;;EAGA;IACE;;EAGF;IACE;IACA;IACA;IACA;;;AvB5LR;EuBsIA;IAEI;IACA;;EAEA;IACE;;EAEA;IACE;;EAGF;IACE;IACA;;EAIJ;IACE;;EAGF;IACE;IACA;;EAGF;IACE;;EAGF;IAEE;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;If9NJ,YegOI;;EAGA;IACE;;EAGF;IACE;IACA;IACA;IACA;;;AvB5LR;EuBsIA;IAEI;IACA;;EAEA;IACE;;EAEA;IACE;;EAGF;IACE;IACA;;EAIJ;IACE;;EAGF;IACE;IACA;;EAGF;IACE;;EAGF;IAEE;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;If9NJ,YegOI;;EAGA;IACE;;EAGF;IACE;IACA;IACA;IACA;;;AAtDR;EAEI;EACA;;AAEA;EACE;;AAEA;EACE;;AAGF;EACE;EACA;;AAIJ;EACE;;AAGF;EACE;EACA;;AAGF;EACE;;AAGF;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;Ef9NJ,YegOI;;AAGA;EACE;;AAGF;EACE;EACA;EACA;EACA;;;AAiBZ;AAAA;EAGE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAME;EACE;;;ACzRN;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;E/BjBE;;A+BqBF;EACE;EACA;;AAGF;EACE;EACA;;AAEA;EACE;E/BtBF;EACA;;A+ByBA;EACE;E/BbF;EACA;;A+BmBF;AAAA;EAEE;;;AAIJ;EAGE;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;;;AAQA;EACE;;;AAQJ;EACE;EACA;EACA;EACA;EACA;;AAEA;E/B7FE;;;A+BkGJ;EACE;EACA;EACA;EACA;;AAEA;E/BxGE;;;A+BkHJ;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;;;AAIJ;EACE;EACA;;;AAIF;EACE;EACA;EACA;EACA;EACA;EACA;E/B1IE;;;A+B8IJ;AAAA;AAAA;EAGE;;;AAGF;AAAA;E/B3II;EACA;;;A+B+IJ;AAAA;E/BlII;EACA;;;A+B8IF;EACE;;AxB3HA;EwBuHJ;IAQI;IACA;;EAGA;IAEE;IACA;;EAEA;IACE;IACA;;EAKA;I/B3KJ;IACA;;E+B6KM;AAAA;IAGE;;EAEF;AAAA;IAGE;;EAIJ;I/B5KJ;IACA;;E+B8KM;AAAA;IAGE;;EAEF;AAAA;IAGE;;;;ACpOZ;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAIF;EACE;EACA;EACA;EACA;EACA;EpC4PI,WALI;EoCrPR;EACA;EACA;EACA;EhCrBE;EgCuBF;EjB1BI,YiB2BJ;;AjBvBI;EiBUN;IjBTQ;;;AiBwBN;EACE;EACA;EACA;;AAEA;EACE;EACA;;AAKJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EjBjDE,YiBkDF;;AjB9CE;EiBqCJ;IjBpCM;;;AiBgDN;EACE;;AAGF;EACE;EACA;EACA;;;AAIJ;EACE;;;AAGF;EACE;EACA;EACA;;AAEA;EhC7DE;EACA;;AgC+DA;EhChEA;EACA;;AgCoEF;EACE;;AAIF;EhC5DE;EACA;;AgC+DE;EhChEF;EACA;;AgCoEA;EhCrEA;EACA;;;AgC0EJ;EACE;;;AASA;EACE;EACA;EhC9GA;;AgCiHA;EAAgB;;AAChB;EAAe;;AAIb;EhCtHF;;AgC6HA;EhC7HA;;;AgCqIA;EACE;EACA;;;AC1JN;EAEE;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;ErC+QI,WALI;EqCxQR;EACA;EjCAE;;;AiCMF;EACE;;AAEA;EACE;EACA;EACA;EACA;;AAIJ;EACE;;;ACrCJ;EAEE;EACA;EtC4RI,2BALI;EsCrRR;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EhCpBA;EACA;;;AgCuBF;EACE;EACA;EACA;EtCgQI,WALI;EsCzPR;EACA;EACA;EACA;EnBpBI,YmBqBJ;;AnBjBI;EmBQN;InBPQ;;;AmBkBN;EACE;EACA;EAEA;EACA;;AAGF;EACE;EACA;EACA;EACA,SnC2uCgC;EmC1uChC;;AAGF;EAEE;EACA;ElBtDF,kBkBuDuB;EACrB;;AAGF;EAEE;EACA;EACA;EACA;;;AAKF;EACE,anC8sCgC;;AmCzsC9B;ElC9BF;EACA;;AkCmCE;ElClDF;EACA;;;AkCkEJ;EClGE;EACA;EvC0RI,2BALI;EuCnRR;;;ADmGF;ECtGE;EACA;EvC0RI,2BALI;EuCnRR;;;ACFF;EAEE;EACA;ExCuRI,sBALI;EwChRR;EACA;EACA;EAGA;EACA;ExC+QI,WALI;EwCxQR;EACA;EACA;EACA;EACA;EACA;EpCJE;;AoCSF;EACE;;;AAKJ;EACE;EACA;;;AChCF;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;EACA;ErCHE;;;AqCQJ;EAEE;;;AAIF;EACE,atC6kB4B;EsC5kB5B;;;AAQF;EACE,etCs+C8B;;AsCn+C9B;EACE;EACA;EACA;EACA;EACA;;;AAQF;EACE;EACA;EACA;EACA;;;AAJF;EACE;EACA;EACA;EACA;;;AAJF;EACE;EACA;EACA;EACA;;;AAJF;EACE;EACA;EACA;EACA;;;AAJF;EACE;EACA;EACA;EACA;;;AAJF;EACE;EACA;EACA;EACA;;;AAJF;EACE;EACA;EACA;EACA;;;AAJF;EACE;EACA;EACA;EACA;;;AC5DF;EACE;IAAK,uBvCyhD2B;;;AuCphDpC;AAAA;EAGE;E1CkRI,yBALI;E0C3QR;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;E1CsQI,WALI;E0C/PR;EtCRE;;;AsCaJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EvBxBI,YuByBJ;;AvBrBI;EuBYN;IvBXQ;;;;AuBuBR;EtBAE;EsBEA;;;AAGF;EACE;;;AAGF;EACE;;;AAIA;EACE;;AAGE;EAJJ;IAKM;;;;AC3DR;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EAGA;EACA;EvCXE;;;AuCeJ;EACE;EACA;;AAEA;EAEE;EACA;;;AASJ;EACE;EACA;EACA;;AAGA;EAEE;EACA;EACA;EACA;;AAGF;EACE;EACA;;;AAQJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EvCvDE;EACA;;AuC0DF;EvC7CE;EACA;;AuCgDF;EAEE;EACA;EACA;;AAIF;EACE;EACA;EACA;EACA;;AAIF;EACE;;AAEA;EACE;EACA;;;AAaF;EACE;;AAGE;EvCvDJ;EAZA;;AuCwEI;EvCxEJ;EAYA;;AuCiEI;EACE;;AAGF;EACE;EACA;;AAEA;EACE;EACA;;;AhCtFR;EgC8DA;IACE;;EAGE;IvCvDJ;IAZA;;EuCwEI;IvCxEJ;IAYA;;EuCiEI;IACE;;EAGF;IACE;IACA;;EAEA;IACE;IACA;;;AhCtFR;EgC8DA;IACE;;EAGE;IvCvDJ;IAZA;;EuCwEI;IvCxEJ;IAYA;;EuCiEI;IACE;;EAGF;IACE;IACA;;EAEA;IACE;IACA;;;AhCtFR;EgC8DA;IACE;;EAGE;IvCvDJ;IAZA;;EuCwEI;IvCxEJ;IAYA;;EuCiEI;IACE;;EAGF;IACE;IACA;;EAEA;IACE;IACA;;;AhCtFR;EgC8DA;IACE;;EAGE;IvCvDJ;IAZA;;EuCwEI;IvCxEJ;IAYA;;EuCiEI;IACE;;EAGF;IACE;IACA;;EAEA;IACE;IACA;;;AhCtFR;EgC8DA;IACE;;EAGE;IvCvDJ;IAZA;;EuCwEI;IvCxEJ;IAYA;;EuCiEI;IACE;;EAGF;IACE;IACA;;EAEA;IACE;IACA;;;AAcZ;EvChJI;;AuCmJF;EACE;;AAEA;EACE;;;AAaJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAVF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAVF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAVF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAVF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAVF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAVF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAVF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AC5LJ;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA,OzCqpD2B;EyCppD3B,QzCopD2B;EyCnpD3B;EACA;EACA;EACA;ExCJE;EwCMF;;AAGA;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EAEE;EACA;EACA;;;AAQJ;EAHE;;;AASE;EATF;;;ACjDF;EAEE;EACA;EACA;EACA;EACA;E7CyRI,sBALI;E6ClRR;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;E7C2QI,WALI;E6CpQR;EACA;EACA;EACA;EACA;EACA;EzCRE;;AyCWF;EACE;;AAGF;EACE;;;AAIJ;EACE;EAEA;EACA;EACA;EACA;EACA;;AAEA;EACE;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EzChCE;EACA;;AyCkCF;EACE;EACA;;;AAIJ;EACE;EACA;;;AC9DF;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;;;AAOF;EACE;EACA;EACA;EAEA;;AAGA;E3B5CI,Y2B6CF;EACA,W3Ck8CgC;;AgB5+C9B;E2BwCJ;I3BvCM;;;A2B2CN;EACE,W3Cg8CgC;;A2C57ClC;EACE,W3C67CgC;;;A2Cz7CpC;EACE;;AAEA;EACE;EACA;;AAGF;EACE;;;AAIJ;EACE;EACA;EACA;;;AAIF;EACE;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;E1CrFE;E0CyFF;;;AAIF;EAEE;EACA;EACA;EClHA;EACA;EACA;EACA,SDkH0B;ECjH1B;EACA;EACA,kBD+G4D;;AC5G5D;EAAS;;AACT;EAAS,SD2GiF;;;AAK5F;EACE;EACA;EACA;EACA;EACA;E1CrGE;EACA;;A0CuGF;EACE;EACA;;;AAKJ;EACE;EACA;;;AAKF;EACE;EAGA;EACA;;;AAIF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;E1CzHE;EACA;;A0C8HF;EACE;;;AnC3GA;EmCiHF;IACE;IACA;;EAIF;IACE;IACA;IACA;;EAGF;IACE;;;AnC9HA;EmCmIF;AAAA;IAEE;;;AnCrIA;EmC0IF;IACE;;;AAUA;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;E1CzMJ;;A0C6ME;AAAA;E1C7MF;;A0CkNE;EACE;;;AnC1JJ;EmCwIA;IACE;IACA;IACA;IACA;;EAEA;IACE;IACA;I1CzMJ;;E0C6ME;AAAA;I1C7MF;;E0CkNE;IACE;;;AnC1JJ;EmCwIA;IACE;IACA;IACA;IACA;;EAEA;IACE;IACA;I1CzMJ;;E0C6ME;AAAA;I1C7MF;;E0CkNE;IACE;;;AnC1JJ;EmCwIA;IACE;IACA;IACA;IACA;;EAEA;IACE;IACA;I1CzMJ;;E0C6ME;AAAA;I1C7MF;;E0CkNE;IACE;;;AnC1JJ;EmCwIA;IACE;IACA;IACA;IACA;;EAEA;IACE;IACA;I1CzMJ;;E0C6ME;AAAA;I1C7MF;;E0CkNE;IACE;;;AnC1JJ;EmCwIA;IACE;IACA;IACA;IACA;;EAEA;IACE;IACA;I1CzMJ;;E0C6ME;AAAA;I1C7MF;;E0CkNE;IACE;;;AErOR;EAEE;EACA;EACA;EACA;EACA;EhDwRI,wBALI;EgDjRR;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EClBA,a9C+lB4B;E8C7lB5B;EACA,a9CwmB4B;E8CvmB5B,a9C+mB4B;E8C9mB5B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EjDgRI,WALI;EgDhQR;EACA;;AAEA;EAAS;;AAET;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;;;AAKN;EACE;;AAEA;EACE;EACA;EACA;;;AAIJ;AACA;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;;;AAIJ;AAEA;EACE;;AAEA;EACE;EACA;EACA;;;AAIJ;AACA;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;;;AAIJ;AAkBA;EACE;EACA;EACA;EACA;EACA;E5CjGE;;;A8CnBJ;EAEE;EACA;ElD4RI,wBALI;EkDrRR;EACA;EACA;EACA;EACA;EACA;EACA;EACA;ElDmRI,+BALI;EkD5QR;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EDzBA,a9C+lB4B;E8C7lB5B;EACA,a9CwmB4B;E8CvmB5B,a9C+mB4B;E8C9mB5B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EjDgRI,WALI;EkD1PR;EACA;EACA;EACA;E9ChBE;;A8CoBF;EACE;EACA;EACA;;AAEA;EAEE;EACA;EACA;EACA;EACA;EACA;;;AAMJ;EACE;;AAEA;EAEE;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;;AAKN;AAEE;EACE;EACA;EACA;;AAEA;EAEE;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;;AAKN;AAGE;EACE;;AAEA;EAEE;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAKJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAIJ;AAEE;EACE;EACA;EACA;;AAEA;EAEE;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;;AAKN;AAkBA;EACE;EACA;ElD2GI,WALI;EkDpGR;EACA;EACA;E9C5JE;EACA;;A8C8JF;EACE;;;AAIJ;EACE;EACA;;;ACrLF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;ACtBA;EACE;EACA;EACA;;;ADuBJ;EACE;EACA;EACA;EACA;EACA;EACA;EhClBI,YgCmBJ;;AhCfI;EgCQN;IhCPQ;;;;AgCiBR;AAAA;AAAA;EAGE;;;AAGF;AAAA;EAEE;;;AAGF;AAAA;EAEE;;;AASA;EACE;EACA;EACA;;AAGF;AAAA;AAAA;EAGE;EACA;;AAGF;AAAA;EAEE;EACA;EhC5DE,YgC6DF;;AhCzDE;EgCqDJ;AAAA;IhCpDM;;;;AgCiER;AAAA;EAEE;EACA;EACA;EACA;EAEA;EACA;EACA;EACA,OhDkhDmC;EgDjhDnC;EACA,OhD1FS;EgD2FT;EACA;EACA;EACA,ShD6gDmC;EgBnmD/B,YgCuFJ;;AhCnFI;EgCkEN;AAAA;IhCjEQ;;;AgCqFN;AAAA;AAAA;EAEE,OhDpGO;EgDqGP;EACA;EACA,ShDqgDiC;;;AgDlgDrC;EACE;;;AAGF;EACE;;;AAKF;AAAA;EAEE;EACA,OhDsgDmC;EgDrgDnC,QhDqgDmC;EgDpgDnC;EACA;EACA;;;AAGF;EACE;;;AAEF;EACE;;;AAQF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA,chDs9CmC;EgDr9CnC;EACA,ahDo9CmC;;AgDl9CnC;EACE;EACA;EACA,OhDo9CiC;EgDn9CjC,QhDo9CiC;EgDn9CjC;EACA,chDo9CiC;EgDn9CjC,ahDm9CiC;EgDl9CjC;EACA;EACA,kBhDlKO;EgDmKP;EACA;EAEA;EACA;EACA,ShD28CiC;EgB3mD/B,YgCiKF;;AhC7JE;EgC4IJ;IhC3IM;;;AgC+JN;EACE,ShDw8CiC;;;AgD/7CrC;EACE;EACA;EACA,QhDk8CmC;EgDj8CnC;EACA,ahD+7CmC;EgD97CnC,gBhD87CmC;EgD77CnC,OhD7LS;EgD8LT;;;AAMA;AAAA;EAEE,QhDm8CiC;;AgDh8CnC;EACE,kBhDhMO;;AgDmMT;EACE,OhDpMO;;;AgD0LT;AAAA;AAAA;EAEE,QhDm8CiC;;AgDh8CnC;EACE,kBhDhMO;;AgDmMT;EACE,OhDpMO;;;AkDdX;AAAA;EAEE;EACA;EACA;EACA;EAEA;EACA;;;AAIF;EACE;IAAK;;;AAIP;EAEE;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;;;AAGF;EAEE;EACA;EACA;;;AASF;EACE;IACE;;EAEF;IACE;IACA;;;AAKJ;EAEE;EACA;EACA;EACA;EACA;EAGA;EACA;;;AAGF;EACE;EACA;;;AAIA;EACE;AAAA;IAEE;;;AC/EN;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;A3C6DE;E2C5CF;IAEI;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;InC5BA,YmC8BA;;;AnC1BA;EmCYJ;InCXM;;;ARuDJ;E2C5BE;IACE;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;IACA;;EAGF;IAEE;;EAGF;IAGE;;;A3C5BJ;E2C/BF;IAiEM;IACA;IACA;;EAEA;IACE;;EAGF;IACE;IACA;IACA;IACA;IAEA;;;;A3CnCN;E2C5CF;IAEI;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;InC5BA,YmC8BA;;;AnC1BA;EmCYJ;InCXM;;;ARuDJ;E2C5BE;IACE;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;IACA;;EAGF;IAEE;;EAGF;IAGE;;;A3C5BJ;E2C/BF;IAiEM;IACA;IACA;;EAEA;IACE;;EAGF;IACE;IACA;IACA;IACA;IAEA;;;;A3CnCN;E2C5CF;IAEI;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;InC5BA,YmC8BA;;;AnC1BA;EmCYJ;InCXM;;;ARuDJ;E2C5BE;IACE;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;IACA;;EAGF;IAEE;;EAGF;IAGE;;;A3C5BJ;E2C/BF;IAiEM;IACA;IACA;;EAEA;IACE;;EAGF;IACE;IACA;IACA;IACA;IAEA;;;;A3CnCN;E2C5CF;IAEI;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;InC5BA,YmC8BA;;;AnC1BA;EmCYJ;InCXM;;;ARuDJ;E2C5BE;IACE;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;IACA;;EAGF;IAEE;;EAGF;IAGE;;;A3C5BJ;E2C/BF;IAiEM;IACA;IACA;;EAEA;IACE;;EAGF;IACE;IACA;IACA;IACA;IAEA;;;;A3CnCN;E2C5CF;IAEI;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;InC5BA,YmC8BA;;;AnC1BA;EmCYJ;InCXM;;;ARuDJ;E2C5BE;IACE;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;IACA;;EAGF;IAEE;;EAGF;IAGE;;;A3C5BJ;E2C/BF;IAiEM;IACA;IACA;;EAEA;IACE;;EAGF;IACE;IACA;IACA;IACA;IAEA;;;;AA/ER;EAEI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EnC5BA,YmC8BA;;AnC1BA;EmCYJ;InCXM;;;AmC2BF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;AAGF;EAEE;;AAGF;EAGE;;;AA2BR;EPpHE;EACA;EACA;EACA,S5C0mCkC;E4CzmClC;EACA;EACA,kB5CUS;;A4CPT;EAAS;;AACT;EAAS,S5Cm+CyB;;;AmDr3CpC;EACE;EACA;EACA;;AAEA;EACE;EACA;;;AAIJ;EACE;EACA;;;AAGF;EACE;EACA;EACA;;;AC7IF;EACE;EACA;EACA;EACA;EACA;EACA,SpDgzCkC;;AoD9yClC;EACE;EACA;;;AAKJ;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKA;EACE;;;AAIJ;EACE;IACE,SpDmxCgC;;;AoD/wCpC;EACE;EACA;EACA;;;AAGF;EACE;IACE;;;AH9CF;EACE;EACA;EACA;;;AIHF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;ACFF;EACE;EACA;;AAGE;EAGE;EACA;;;AATN;EACE;EACA;;AAGE;EAGE;EACA;;;AATN;EACE;EACA;;AAGE;EAGE;EACA;;;AATN;EACE;EACA;;AAGE;EAGE;EACA;;;AATN;EACE;EACA;;AAGE;EAGE;EACA;;;AATN;EACE;EACA;;AAGE;EAGE;EACA;;;AATN;EACE;EACA;;AAGE;EAGE;EACA;;;AATN;EACE;EACA;;AAGE;EAGE;EACA;;;AAOR;EACE;EACA;;AAGE;EAEE;EACA;;;AC1BN;EACE;EAEA;;;ACHF;EACE;EACA,KxD6c4B;EwD5c5B;EACA;EACA,uBxD2c4B;EwD1c5B;;AAEA;EACE;EACA,OxDuc0B;EwDtc1B,QxDsc0B;EwDrc1B;ExCIE,YwCHF;;AxCOE;EwCZJ;IxCaM;;;;AwCDJ;EACE;;;ACnBN;EACE;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AAKF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;ACrBJ;EACE;EACA;EACA;EACA;EACA,S1DumCkC;;;A0DpmCpC;EACE;EACA;EACA;EACA;EACA,S1D+lCkC;;;A0DvlChC;EACE;EACA;EACA,S1DmlC8B;;;A0DhlChC;EACE;EACA;EACA,S1D6kC8B;;;AQ9iChC;EkDxCA;IACE;IACA;IACA,S1DmlC8B;;E0DhlChC;IACE;IACA;IACA,S1D6kC8B;;;AQ9iChC;EkDxCA;IACE;IACA;IACA,S1DmlC8B;;E0DhlChC;IACE;IACA;IACA,S1D6kC8B;;;AQ9iChC;EkDxCA;IACE;IACA;IACA,S1DmlC8B;;E0DhlChC;IACE;IACA;IACA,S1D6kC8B;;;AQ9iChC;EkDxCA;IACE;IACA;IACA,S1DmlC8B;;E0DhlChC;IACE;IACA;IACA,S1D6kC8B;;;AQ9iChC;EkDxCA;IACE;IACA;IACA,S1DmlC8B;;E0DhlChC;IACE;IACA;IACA,S1D6kC8B;;;A2D5mCpC;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;ACRF;AAAA;ECIE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGA;AAAA;EACE;;;ACdF;EACE;EACA;EACA;EACA;EACA;EACA,S9DgcsC;E8D/btC;;;ACRJ;ECAE;EACA;EACA;;;ACNF;EACE;EACA;EACA,OjEisB4B;EiEhsB5B;EACA;EACA,SjE2rB4B;;;AkE/nBtB;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAjBJ;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AASF;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAjBJ;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AASF;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AArBJ;AAcA;EAOI;EAAA;;;AAmBJ;AA1BA;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAjBJ;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AASF;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAjBJ;EACE;;;AAIA;EACE;;;AANJ;EACE;;;AAIA;EACE;;;AANJ;EACE;;;AAIA;EACE;;;AANJ;EACE;;;AAIA;EACE;;;AANJ;EACE;;;AAIA;EACE;;;AAIJ;EAOI;;;AAKF;EAOI;;;AAnBN;EAOI;;;AAKF;EAOI;;;AAnBN;EAOI;;;AAKF;EAOI;;;AAnBN;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAjBJ;EACE;;;AAIA;EACE;;;AANJ;EACE;;;AAIA;EACE;;;AANJ;EACE;;;AAIA;EACE;;;AANJ;EACE;;;AAIA;EACE;;;AANJ;EACE;;;AAIA;EACE;;;AANJ;EACE;;;AAIA;EACE;;;AAIJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAjBJ;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AASF;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;A1DVR;E0DGI;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;;A1DVR;E0DGI;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;;A1DVR;E0DGI;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;;A1DVR;E0DGI;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;;A1DVR;E0DGI;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;;ACtDZ;ED+CQ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;;ACnCZ;ED4BQ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;;AEzEZ;AAAA;AAAA;AAAA;AAAA;ACAA;AAAA;AAAA;AAAA;AAAA;ACGA;EACE;EACA;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EASE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAAA;AAAA;EAKE;;;AAGF;AAAA;EAEE;;;AC/BA;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AAMF;ECIA;EACA;EACA;;;ADNA;ECIA;EACA;EACA;;;ADNA;ECIA;EACA;EACA;;;ADNA;ECIA;EACA;EACA;;;ADNA;ECIA;EACA;EACA;;;ADNA;ECIA;EACA;EACA;;;ACfF;EACE;EACA,OCIwB;;;ACN1B;EACE;EACA;EACA;;AAEA;EAAO;;;AAGT;EACE;EACA;EACA;EACA;EACA;;;ACbF;EACE;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;ACfF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;;;AAMF;EACE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;IASE;IACA;IACA;IACA;IACA;;;AAIJ;EACE;IAAU;;EACV;IAAM;;;AAGR;EACE;IAAO;;EACP;IAAO;;EACP;IAAO;;EACP;IAAO;;EACP;IAAO;;EACP;IAAO;;EACP;IAAO;;;AAGT;EACE;IAAM;;;AAGR;EACE;IACE;IACA;;EAEF;IACE;IACA;;;AAIJ;EACE;IACE;;;AAIJ;EACE;IAAK;;EACL;IAAK;;EACL;IAAU;;EACV;IAAW;;EACX;IAAM;;EACN;IAAM;;EACN;IAAM;;EACN;IAAM;;EACN;IAAY;;;AAGd;EACE;IAAK;;EACL;IAAO;;;ACnJT;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;AAAA;EAEE;;;AAGF;EACE;;;AC1BF;EACE;EACA;EACA;EACA;EACA,gBLmCwB;EKlCxB,OLmCwB;;;AKhC1B;AAAA;EAEE;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AC3BF;AAAA;AAIE;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;ACHxC;AAAA;ETqBE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAKA;AAAA;EAbA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AUjCF;AAAA;AAAA;AAAA;AAAA;AAQA;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA,cR8BwB;EQ7BxB;;AAIF;AAAA;EAEE;;;ACxBF;AAAA;AAAA;AAAA;AAAA;AAQA;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA,cT8BwB;ES7BxB;;AAIF;AAAA;EAEE;;;ACxBF;AAAA;AAAA;AAAA;AAAA;AAQA;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA,cV8BwB;EU7BxB;;AAIF;AAAA;EAEE;;;AAIA;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AhBpBvC;AAAA;AAAA;AAAA;AAAA;AiBRA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUA;AAAA;AAAA;AAIA;AAAA;AAEA;EACC;;;AAED;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAED;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAED;AAAA;EAEC;EACA;EACA;;;AAED;EACC;;;AAED;EACC;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGD;EACC;;;AAID;AAAA;AAEA;EACC;EACA;;;AAID;AAAA;AAEA;EACC;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGD;EACC;EACA;EACA;;;AAGD;AAAA;AAGA;AACA;EACC;EACA;EACA;EACA;EACA;;;AjBpFD;AAAA;AAAA;AAAA;AAAA;AkBdA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAaA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWA;AAAA;AAEA;EACC;EACA;;;AAED;EACC;;;AAED;AAAA;AAAA;AAAA;EAIC;EACA;;;AAED;EACC;;;AAED;EACC;EACA;EACA;;;AAED;EACC;;;AAED;EACC;EACA;EACA;EACA;;;AAED;EACC;;;AAGD;AAAA;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;EASC;EACA;EACA;EACA;;;AAED;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOC;EACA;;;AAED;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAQC;EACA;EACA;EACA;;;AAED;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAUC;EACA;;;AAGD;EACC;;;AAED;AAAA;AAAA;AAAA;AAAA;AAAA;EAMC;EACA;EACA;EACA;;;AAED;AAAA;EAEC;EACA;;;AAED;AAAA;AAAA;EAGC;EACA;;;AAGD;AAAA;AAEA;AAAA;AAAA;EAGC;EACA;EACA;;;AAED;EACC;EACA;;;AAED;AAAA;AAAA;EAGC;;;AAED;AAAA;AAAA;EAGC;EACA;EACA;;;AAED;AAAA;AAAA;EAGC;;;AAED;AAAA;AAAA;EAGC;;;AAED;AAAA;AAAA;EAGC;;;AAED;AAAA;AAAA;EAGC;EACA;EACA;;;AAED;AAAA;AAAA;EAGC;EACA;EACA;;;AAED;EACC;;;AAGD;AAAA;AAGA;AACA;EACC;EACA;;;AAED;AAAA;EAEC;;;AAED;EACC;;;AAED;AAAA;AAAA;AAAA;EAIC;;;AAED;AAAA;EAEC;;;AAED;AAAA;EAEC;;;AAED;AAAA;EAEC;;;AAED;EACC;;;AAGD;AACA;AACA;EACC;;;AAED;EAAqB;;;AACrB;EAAsB;;;AACtB;EAAqB;;;AACrB;EAAsB;;;AACtB;EAAqB;;;AACrB;EAAsB;;;AACtB;EAAqB;;;AACrB;EAAsB;;;AACtB;EAAuB;;;AACvB;EAAuB;;;AACvB;EAAwB;;;AACxB;EAAyB;;;AACzB;EAAwB;;;AACxB;EAAyB;;;AACzB;EAAwB;;;AACxB;EAAyB;;;AACzB;EAAwB;;;AACxB;EAAyB;;;AACzB;EAA0B;;;AAC1B;EAA0B;;;AAC1B;EAAqB;;;AACrB;EAAsB;;;AACtB;EAAqB;;;AACrB;EAAsB;;;AACtB;EAAqB;;;AACrB;EAAsB;;;AACtB;EAAqB;;;AACrB;EAAsB;;;AACtB;EAAuB;;;AACvB;EAAyB;;;AACzB;EAAuB;;;AACvB;EAAyB;;;AACzB;EAAyB;;;AACzB;EAAyB;;;AACzB;EAAyB;;;AACzB;EAAyB;;;AACzB;EAA0B;;;AAC1B;EAA2B;;;AAC3B;EAA0B;;;AAC1B;EAA2B;;;AAC3B;EAA0B;;;AAC1B;EAA2B;;;AAC3B;EAA0B;;;AAC1B;EAA2B;;;AAC3B;EAA4B;;;AAC5B;EAA8B;;;AAC9B;EAA4B;;;AAC5B;EAA8B;;;AAC9B;EAA8B;;;AAC9B;EAA8B;;;AAC9B;EAA8B;;;AAC9B;EAA8B;;;AAC9B;EAAgC;;;AAChC;EAAgC;;;AAChC;EAAgC;;;AAChC;EAAgC;;;AAChC;EAA2B;;;AAC3B;EAA2B;;;AAC3B;EAA2B;;;AAC3B;EAA2B;;;AAC3B;EAA4B;;;AAC5B;EAA4B;;;AAC5B;EAA4B;;;AAC5B;EAA4B;;;AAC5B;EAAmB;;;AACnB;EAAwB;;;AACxB;EAAmB;;;AACnB;EAAkB;;;AAClB;EAAmB;;;AACnB;EAAmB;;;AACnB;EAAwB;;;AACxB;EAA6B;;;AAC7B;EAA4B;;;AAC5B;EAAuB;;;AACvB;EAAoB;;;AACpB;EAAsB;;;AACtB;EAAgB;;;AAChB;EAAuB;;;AACvB;EAAqB;;;AACrB;EAAoB;;;AACpB;EAAmB;;;AACnB;EAAkB;;;AAClB;EAAiB;;;AACjB;EAAiB;;;AACjB;EAAkB;;;AAClB;EAAoB;;;AACpB;EAAoB;;;AACpB;EAAe;;;AACf;EAAgB;;;AAChB;EAAgB;;;AAChB;EAAoB;;;AACpB;EAAgB;;;AAChB;EAAkB;;;AAClB;EAAiB;;;AACjB;EAAgB;;;AAChB;EAAsB;;;AACtB;EAAkB;;;AAClB;EAAmB;;;AACnB;EAAkB;;;AAClB;EAAkB;;;AAClB;EAAgB;;;AAChB;EAAiB;;;AACjB;EAAgB;;;AAChB;EAAgB;;;AAChB;EAAkB;;;AAClB;EAAgB;;;AAChB;EAAqB;;;AACrB;EAAiB;;;AACjB;EAAsB;;;AACtB;EAAiB;;;AACjB;EAAsB;;;AACtB;EAAe;;;AACf;EAAqB;;;AACrB;EAAoB;;;AACpB;EAAqB;;;AACrB;EAAgB;;;AAChB;EAAmB;;;AACnB;EAAiB;;;AACjB;EAAiB;;;AACjB;EAAkB;;;AAClB;EAAiB;;;AACjB;EAAgB;;;AAChB;EAAkB;;;AAClB;EAAgB;;;AAChB;EAAiB;;;AACjB;EAAkB;;;AAClB;EAAoB;;;AACpB;EAAqB;;;AACrB;EAAiB;;;AACjB;EAAiB;;;AACjB;EAAgB;;;AAChB;EAAiB;;;AACjB;EAAqB;;;AACrB;EAAqB;;;AACrB;EAAoB;;;AACpB;EAAsB;;;AACtB;AACA;EAAsB;;;AACtB;EAAgB;;;AAChB;EAAiB;;;AACjB;EAAsB;;;AACtB;EAAqB;;;AACrB;EAAiB;;;AACjB;EAAuB;;;AACvB;EAAkB;;;AAClB;EAAqB;;;AACrB;EAAqB;;;AACrB;EAAqB;;;AACrB;EAAqB;;;AACrB;EAAuB;;;AACvB;EAAwB;;;AACxB;EAAwB;;;AACxB;EAA6B;;;AAC7B;EAA6B;;;AAC7B;EAA6B;;;AAC7B;EAA6B;;;AAC7B;EAA0B;;;AAC1B;EAA0B;;;AAC1B;EAA0B;;;AAC1B;EAA0B;;;AAC1B;EAAyB;;;AACzB;EAA0B;;;AAC1B;EAAwB;;;AACxB;EAA4B;;;AAC5B;EAA6B;;;AAC7B;EAA6B;;;AAC7B;EAA4B;;;AAC5B;EAA6B;;;AAC7B;EAA6B;;;AAC7B;EAAgC;;;AAChC;EAAkC;;;AAClC;EAA+B;;;AAC/B;EAAiC;;;AACjC;EAAiC;;;AACjC;EAA4B;;;AAG5B;AAAA;AAGA;AACA;AAAA;AAAA;AAAA;EAIC;;;AAED;AAAA;AAAA;AAAA;EAIC;;;AAED;AAAA;AAAA;AAAA;EAIC;;;AAED;AAAA;AAAA;AAAA;EAIC;;;AAGD;AACA;EACC;EACA;EACA;;;AAED;EACC;EACA;;;AlBlbD;AAAA;AAAA;AAAA;AAAA;AmBpBA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUA;AAAA;AAAA;AAGA;EACC;EACA;EACA;;;AAED;EACC;EACA;;;AAED;AAAA;EAEC;EACA;EACA;EACA;;;AAED;AAAA;EAEC;;;AAED;EACC;;;AAED;EACC;;;AAED;EACC;;;AAED;EACC;;;AAED;AAAA;EAEC;EACA;EACA;EACA;EACA;EACA;;;AAED;EACC;EACA;EACA;;;AAED;EACC;EACA;;;AAED;AAAA;EAEC;;;AAED;EACC;EACA;EACA;EACA;;;AAED;EACC;EACA;EACA;EACA;;;AAED;EACC;EACA;;;AAED;AAAA;EAEC;EACA;EACA;EACA;;;AAED;EACC;EACA;EACA;EACA;EACA;EACA;;;AAED;EACC;EACA;EACA;EACA;EACA;EACA;;;AAED;EACC;;;AAGD;AACA;EACC;;;AAED;EACC;;;AAED;EACC;EACA;;;AAED;EACC;;;AAED;EACC;;;AAED;EACC;;;AAED;AAAA;EAEC;;;AAED;EACC;;;AAED;EACC;EACA;EACA;;;AAGD;AACA;EACC;;;AAED;EACC;EACA;;;AAED;EACC;EACA;;;AAED;EACC;EACA;;;AAED;EACC;EACA;;;AAED;EACC;;;AAED;EACC;;;AAED;AAAA;EAEC;;;AAED;AAAA;EAEC;EACA;;;AAGD;AACA;EACC;EACA;EACA;EACA;EACA;EACA;;;AnB9JD;AAAA;AAAA;AAAA;AAAA;AAQI;EACE;EACA;EACA;;AAIJ;EACE;;AAGF;EAAc;;AACd;EAAoB;;AAEpB;EACE;EACA;EACA;;AAGF;EACE;;AAKA;EACE;EACA;EACA;EACA;EACA;;;AAKN;AAWE;;AATA;EACE;EACA;;AAGF;EACE;;AAIF;EACE;;AAGF;EACE;EACA;;AAGF;EACE;;AAGF;EACE;EACA;;;AAKF;EAAI;;AAEJ;EAAI;;;AAGN;EACE;EACA;EACA;;;A1E9FF;AAAA;AAAA;A2ElBA;AAAA;AAAA;AAAA;AAAA;ACGA;EACE;EACA;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EASE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAAA;AAAA;EAKE;;;AAGF;AAAA;EAEE;;;AC/BA;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AAMF;ECIA;EACA;EACA;;;ADNA;ECIA;EACA;EACA;;;ADNA;ECIA;EACA;EACA;;;ADNA;ECIA;EACA;EACA;;;ADNA;ECIA;EACA;EACA;;;ADNA;ECIA;EACA;EACA;;;ACfF;EACE;EACA,OCIwB;;;ACN1B;EACE;EACA;EACA;;AAEA;EAAO;;;AAGT;EACE;EACA;EACA;EACA;EACA;;;ACbF;EACE;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;ACfF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;;;AAMF;EACE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;IASE;IACA;IACA;IACA;IACA;;;AAIJ;EACE;IAAU;;EACV;IAAM;;;AAGR;EACE;IAAO;;EACP;IAAO;;EACP;IAAO;;EACP;IAAO;;EACP;IAAO;;EACP;IAAO;;EACP;IAAO;;;AAGT;EACE;IAAM;;;AAGR;EACE;IACE;IACA;;EAEF;IACE;IACA;;;AAIJ;EACE;IACE;;;AAIJ;EACE;IAAK;;EACL;IAAK;;EACL;IAAU;;EACV;IAAW;;EACX;IAAM;;EACN;IAAM;;EACN;IAAM;;EACN;IAAM;;EACN;IAAY;;;AAGd;EACE;IAAK;;EACL;IAAO;;;ACnJT;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;AAAA;EAEE;;;AAGF;EACE;;;AC1BF;EACE;EACA;EACA;EACA;EACA,gBLmCwB;EKlCxB,OLmCwB;;;AKhC1B;AAAA;EAEE;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AC3BF;AAAA;AAIE;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;AAAtC;EAAsC;;;ACHxC;AAAA;ETqBE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAKA;AAAA;EAbA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AUjCF;AAAA;AAAA;AAAA;AAAA;AAQA;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA,cR8BwB;EQ7BxB;;AAIF;AAAA;EAEE;;;ACxBF;AAAA;AAAA;AAAA;AAAA;AAQA;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA,cT8BwB;ES7BxB;;AAIF;AAAA;EAEE;;;ACxBF;AAAA;AAAA;AAAA;AAAA;AAQA;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA,cV8BwB;EU7BxB;;AAIF;AAAA;EAEE;;;AAIA;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;AAArC;EAAqC;;;A1FLvC;EACE;;AACA;EACE;EACA;EACA;;AACA;EACE;;;AAKN;EAAM;;;AACN;EAAO;;;AACP;EAAU;;;AAEV;EAAU;;;AAEV;EAAmB;;;AAEnB;EAAmC;;;AAEnC;EAAW;EAAa;;;AACxB;EAA2B;EAAc;;;AACzC;EAAS;;;AACT;EAAQ;;;AAER;EACE;;;AAGF;EACE;;;AAGF;EAAiB%22,%22file%22:%22application.css%22%7D */
================================================
FILE: spec/support/test_app/app/assets/config/manifest.js
================================================
//= link_tree ../images
//= link_tree ../../javascript .js
//= link_tree ../../../vendor/javascript .js
//= link_tree ../builds
//= link application.css
//= link wice_grid.js
//= link bootstrap.min.js
//= link popper.js
//= link jquery3.min.js
//= link jquery-ui.js
//= link jquery.ui.datepicker.locales.js
//= link reload_on_change.js
================================================
FILE: spec/support/test_app/app/assets/stylesheets/adding_rows.scss
================================================
.last-row button, .extra-row button {margin: 10px}
.urgent{font-weight: bold}
================================================
FILE: spec/support/test_app/app/assets/stylesheets/application.scss
================================================
/*
* This is a manifest file that'll be compiled into application.css, which will include all the files
* listed below.
*
* Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
* or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path.
*
* You're free to add application-wide styles to this file and they'll appear at the top of the
* compiled file, but it's generally better to create a new file per style scope.
*
*= require_self
*= require_tree .
*= require jquery-ui/humanity
*/
@import "bootstrap";
@import "wice_grid";
/*
* @import "font-awesome"
*/
@import "font-awesome";
ul.nav-pills {
padding-left: 0;
.nav-link {
display: list-item;
list-style-type: disc;
margin-left: 12px;
&.active a {
color: white
}
}
}
body {padding-top: 20px;}
header{padding-bottom: 20px;}
header h1{font-size: 48px;}
.well h2 {margin-bottom: 20px;}
.external-buttons {margin-bottom: 20px;}
input.range-start, input.range-end{width: 100px;}
header h1 {float: left; margin-left: 20px;}
header .example-navigator {float: right; margin-right: 120px}
li.next {margin-left: 10px;}
.clear {clear:both;}
.wice-grid.table-striped tbody tr:nth-child(odd) td.active-filter {
background-color: #f9f9e9;
}
.wice-grid.table-striped tbody tr td.active-filter {
background-color: #f9f9e9;
}
footer .sources {float: right;}
================================================
FILE: spec/support/test_app/app/assets/stylesheets/csv_and_detached_filters.scss
================================================
.external-buttons{
margin-top: 10px;
}
================================================
FILE: spec/support/test_app/app/assets/stylesheets/many_grids_on_page.scss
================================================
.many-grids-on-page input[type=text]{
width: 100px;
}
================================================
FILE: spec/support/test_app/app/controllers/action_column_controller.rb
================================================
# encoding: utf-8
class ActionColumnController < ::ApplicationController
def index
@tasks_grid = initialize_grid(Task,
include: [:priority, :status, :project, :assigned_users],
name: 'g',
order: 'id'
)
if params[:g] && params[:g][:selected]
@selected = params[:g][:selected]
end
end
end
================================================
FILE: spec/support/test_app/app/controllers/adding_rows_controller.rb
================================================
# encoding: utf-8
class AddingRowsController < ApplicationController
def index
@tasks_grid = initialize_grid(Task,
include: [:priority, :status, :project, :assigned_users],
order: 'statuses.name',
custom_order: {
'tasks.priority_id' => 'priorities.name',
'tasks.status_id' => 'statuses.position',
'tasks.project_id' => 'projects.name'
}
)
end
end
================================================
FILE: spec/support/test_app/app/controllers/all_records_controller.rb
================================================
# encoding: utf-8
class AllRecordsController < ApplicationController
def index
@tasks_grid = initialize_grid(Task,
include: [:priority, :status, :project, :assigned_users],
order: 'statuses.name',
custom_order: {
'tasks.priority_id' => 'priorities.name',
'tasks.status_id' => 'statuses.position',
'tasks.project_id' => 'projects.name'
}
)
end
end
================================================
FILE: spec/support/test_app/app/controllers/application_controller.rb
================================================
# encoding: utf-8
class ApplicationController < ActionController::Base
protect_from_forgery
before_action :init_example_map
before_action :init_current_example_map
protected
def init_current_example_map
@controller_file_to_show = 'app/controllers/' + controller_name + '_controller.rb'
@controller_file = File.join(Rails.root, @controller_file_to_show)
@view_files_dir = {}
view_files_dir = File.join(Rails.root, 'app/views/' + controller_name)
Dir.glob("#{view_files_dir}/*").each do |fullpath|
fullpath =~ /^.+(app\/views\/.+)$/
@view_files_dir[Regexp.last_match(1)] = fullpath
end
end
def init_example_map
@example_map = [
['Basics',
[
[:basics1, 'Most simple grid'],
[:basics2, 'Named columns'],
[:upper_pagination_panel, 'Two pagination panels'],
[:basics3, 'Associating columns with database fields'],
[:blockless_column_definition, 'Dropping the block in #column'],
[:numeric_filters, 'Numeric filters'],
[:many_grids_on_page, 'More than 1 grid on a page'],
[:basics4, 'Disabling filters'],
[:disable_all_filters, 'Disabling all filters'],
[:dates, 'Date/Datetime helpers'],
[:when_filtered, 'Hidden filter panel'],
[:basics5, 'Disabling ordering'],
[:basics6, 'Initial conditions and ordering'],
[:buttons, 'External submit/reset buttons'],
[:detached_filters, 'External filters'],
[:detached_filters_two_grids, 'External filters (example with 2 grids)'],
[:no_records, 'A grid without records']
]
],
['Joined tables',
[
[:joining_tables, 'Joined tables'],
[:two_associations, '2 associations to the same table']
]
],
['Custom filters and ordering',
[
[:custom_ordering, 'Custom ordering (with String)'],
[:custom_ordering_with_arel, 'Custom ordering (with Arel)'],
[:custom_ordering_with_proc, 'Custom ordering (with Proc)'],
[:custom_ordering_with_ruby, 'Custom ordering (with arbitrary Ruby)'],
[:custom_ordering_on_calculated, 'Custom ordering (on a calculated field)'],
[:custom_filters1, 'Custom filters (one table)'],
[:custom_filters2, 'Custom filters (joined tables)'],
[:custom_filters3, 'Custom filters (method chains)'],
[:custom_filters4, 'Custom filters: turning off multiple selection'],
[:null_values, 'Custom filters (null values)']
]
],
['Miscellaneous',
[
[:styling, 'Styling the grid'],
[:negation, 'Text filters with negation'],
[:adding_rows, 'Adding custom rows'],
[:all_records, 'Removing link "All Records"'],
[:csv_export, 'CSV export'],
[:csv_and_detached_filters, 'CSV export and external filters'],
[:auto_reloads, 'Auto reloading filters'],
[:auto_reloads2, 'Auto reloading filters (external filters)'],
[:auto_reloads3, 'Auto reloading filters (two grids on page)']
]
],
['Integration with the application',
[
[:action_column, 'Action column'],
[:hiding_checkboxes_in_action_column, 'Hiding certain checkboxes in the action column'],
[:integration_with_forms, 'Integration with other forms'],
[:integration_with_application_view, 'View helpers to access records on the current page and all pages'],
[:resultset_processings, 'Callback to process records of the current page'],
[:resultset_processings2, 'Callback to process records throughout all pages on demand'],
[:localization, 'Localization'],
[:custom_filter_params, 'Generating custom filter parameters'],
[:saved_queries, 'Saved queries: simple example']
]
]
]
end
end
================================================
FILE: spec/support/test_app/app/controllers/auto_reloads2_controller.rb
================================================
# encoding: utf-8
class AutoReloads2Controller < ApplicationController
def index
@tasks_grid = initialize_grid(Task,
custom_order: {
'tasks.priority_id' => 'priorities.name',
'tasks.status_id' => 'statuses.position',
'tasks.project_id' => 'projects.name'
},
order: 'id',
order_direction: 'asc'
)
end
end
================================================
FILE: spec/support/test_app/app/controllers/auto_reloads3_controller.rb
================================================
# encoding: utf-8
class AutoReloads3Controller < ApplicationController
def index
@tasks_grid = initialize_grid(Task,
custom_order: {
'tasks.priority_id' => 'priorities.name',
'tasks.status_id' => 'statuses.position',
'tasks.project_id' => 'projects.name'
}
)
@tasks_grid2 = initialize_grid(Task,
name: 'grid2',
custom_order: {
'tasks.priority_id' => 'priorities.name',
'tasks.status_id' => 'statuses.position',
'tasks.project_id' => 'projects.name'
}
)
end
end
================================================
FILE: spec/support/test_app/app/controllers/auto_reloads_controller.rb
================================================
# encoding: utf-8
class AutoReloadsController < ApplicationController
def index
@tasks_grid = initialize_grid(Task,
custom_order: {
'tasks.priority_id' => 'priorities.name',
'tasks.status_id' => 'statuses.position',
'tasks.project_id' => 'projects.name'
},
order: 'id',
order_direction: 'asc'
)
end
end
================================================
FILE: spec/support/test_app/app/controllers/basics1_controller.rb
================================================
# encoding: utf-8
class Basics1Controller < ApplicationController
def index
@tasks_grid = initialize_grid(Task)
end
end
================================================
FILE: spec/support/test_app/app/controllers/basics2_controller.rb
================================================
# encoding: utf-8
class Basics2Controller < ApplicationController
def index
@tasks_grid = initialize_grid(Task)
end
end
================================================
FILE: spec/support/test_app/app/controllers/basics3_controller.rb
================================================
# encoding: utf-8
class Basics3Controller < ApplicationController
def index
@tasks_grid = initialize_grid(Task, order: 'id')
end
end
================================================
FILE: spec/support/test_app/app/controllers/basics4_controller.rb
================================================
# encoding: utf-8
class Basics4Controller < ApplicationController
def index
@tasks_grid = initialize_grid(Task)
end
end
================================================
FILE: spec/support/test_app/app/controllers/basics5_controller.rb
================================================
# encoding: utf-8
class Basics5Controller < ApplicationController
def index
@tasks_grid = initialize_grid(Task)
end
end
================================================
FILE: spec/support/test_app/app/controllers/basics6_controller.rb
================================================
# encoding: utf-8
class Basics6Controller < ApplicationController
def index
@tasks_grid = initialize_grid(Task,
order: 'tasks.title',
order_direction: 'desc',
conditions: { archived: false },
per_page: 20
)
end
end
================================================
FILE: spec/support/test_app/app/controllers/blockless_column_definition_controller.rb
================================================
# encoding: utf-8
class BlocklessColumnDefinitionController < ApplicationController
def index
@tasks_grid = initialize_grid(Task, order: 'id')
end
end
================================================
FILE: spec/support/test_app/app/controllers/buttons_controller.rb
================================================
# encoding: utf-8
class ButtonsController < ApplicationController
def index
@tasks_grid = initialize_grid(Task)
end
end
================================================
FILE: spec/support/test_app/app/controllers/csv_and_detached_filters_controller.rb
================================================
# encoding: utf-8
class CsvAndDetachedFiltersController < ApplicationController
def index
@tasks_grid = initialize_grid(Task,
name: 'grid',
enable_export_to_csv: true,
csv_field_separator: ';',
csv_file_name: 'tasks'
)
export_grid_if_requested('grid' => 'grid')
end
end
================================================
FILE: spec/support/test_app/app/controllers/csv_export_controller.rb
================================================
# encoding: utf-8
class CsvExportController < ApplicationController
def index
@tasks_grid = initialize_grid(Task,
include: [:priority, :status, :project, :assigned_users],
order: 'statuses.name',
custom_order: {
'tasks.priority_id' => 'priorities.name',
'tasks.status_id' => 'statuses.position',
'tasks.project_id' => 'projects.name'
},
name: 'g1',
enable_export_to_csv: true,
csv_field_separator: ';',
csv_file_name: 'tasks'
)
@projects_grid = initialize_grid(Project,
name: 'g2',
enable_export_to_csv: true,
csv_file_name: 'projects'
)
return export_grid_if_requested('g1' => 'tasks_grid', 'g2' => 'projects_grid') do
# usual render or redirect code executed if the request is not a CSV export request
end
end
end
================================================
FILE: spec/support/test_app/app/controllers/custom_filter_params_controller.rb
================================================
# encoding: utf-8
class CustomFilterParamsController < ApplicationController
def index
@projects_grid = initialize_grid(Project)
end
end
================================================
FILE: spec/support/test_app/app/controllers/custom_filters1_controller.rb
================================================
# encoding: utf-8
class CustomFilters1Controller < ApplicationController
def index
@versions_grid1 = initialize_grid(Version, name: 'g1', per_page: 5)
@versions_grid2 = initialize_grid(Version, name: 'g2', per_page: 5)
@versions_grid3 = initialize_grid(Version, name: 'g3', per_page: 5)
@versions_grid4 = initialize_grid(Version, name: 'g4', per_page: 5)
end
end
================================================
FILE: spec/support/test_app/app/controllers/custom_filters2_controller.rb
================================================
# encoding: utf-8
class CustomFilters2Controller < ApplicationController
def index
@tasks_grid = initialize_grid(Task,
include: [:priority, :status, :project],
order: 'statuses.name',
custom_order: {
# 'tasks.priority_id' => 'priorities.name',
'tasks.status_id' => 'statuses.position',
'tasks.project_id' => 'projects.name'
}
)
end
end
================================================
FILE: spec/support/test_app/app/controllers/custom_filters3_controller.rb
================================================
# encoding: utf-8
class CustomFilters3Controller < ApplicationController
def index
@tasks_grid = initialize_grid(Task,
include: [:relevant_version, :expected_version, :project],
conditions: { projects: { id: Project.first.id } },
custom_order: {
'tasks.expected_version_id' => 'expected_versions_tasks.name'
}
)
end
end
================================================
FILE: spec/support/test_app/app/controllers/custom_filters4_controller.rb
================================================
# encoding: utf-8
class CustomFilters4Controller < ApplicationController
def index
@tasks_grid = initialize_grid(Task,
include: [:relevant_version, :expected_version, :project],
conditions: ['projects.id = ?', Project.first],
custom_order: {
'tasks.expected_version_id' => 'expected_versions_tasks.name'
}
)
end
end
================================================
FILE: spec/support/test_app/app/controllers/custom_ordering_controller.rb
================================================
# encoding: utf-8
class CustomOrderingController < ApplicationController
def index
@status_grid1 = initialize_grid(Status,
order: 'statuses.name',
custom_order: {
'statuses.name' => 'length( ? )'
}
)
@status_grid2 = initialize_grid(Status,
name: 'g2',
order: 'statuses.name',
custom_order: {
'statuses.name' => 'statuses.position'
}
)
end
end
================================================
FILE: spec/support/test_app/app/controllers/custom_ordering_on_calculated_controller.rb
================================================
# encoding: utf-8
class CustomOrderingOnCalculatedController < ApplicationController
def index
@status_grid = initialize_grid(Status)
end
end
================================================
FILE: spec/support/test_app/app/controllers/custom_ordering_with_arel_controller.rb
================================================
# encoding: utf-8
class CustomOrderingWithArelController < ApplicationController
def index
@status_grid1 = initialize_grid(Status,
order: 'statuses.name',
custom_order: {
'statuses.name' => Arel.sql('length( ? )')
}
)
@status_grid2 = initialize_grid(Status,
name: 'g2',
order: 'statuses.name',
custom_order: {
'statuses.name' => Status.arel_table[:position]
}
)
end
end
================================================
FILE: spec/support/test_app/app/controllers/custom_ordering_with_proc_controller.rb
================================================
# encoding: utf-8
class CustomOrderingWithProcController < ApplicationController
def index
@status_grid = initialize_grid(Status,
order: 'statuses.name',
custom_order: {
'statuses.name' => ->(column_name) { params[:sort_by_length] ? "length(#{column_name})" : column_name }
}
)
end
end
================================================
FILE: spec/support/test_app/app/controllers/custom_ordering_with_ruby_controller.rb
================================================
# encoding: utf-8
class CustomOrderingWithRubyController < ApplicationController
def index
@status_grid = initialize_grid(Status)
end
end
================================================
FILE: spec/support/test_app/app/controllers/dates_controller.rb
================================================
# encoding: utf-8
class DatesController < ApplicationController
def index
@tasks_grid = initialize_grid(Task,
order: 'id'
)
end
end
================================================
FILE: spec/support/test_app/app/controllers/detached_filters_controller.rb
================================================
# encoding: utf-8
class DetachedFiltersController < ApplicationController
def index
@tasks_grid = initialize_grid(Task)
end
end
================================================
FILE: spec/support/test_app/app/controllers/detached_filters_two_grids_controller.rb
================================================
# encoding: utf-8
class DetachedFiltersTwoGridsController < ApplicationController
def index
@grid1 = initialize_grid(Task)
@grid2 = initialize_grid(Task, name: 'grid2')
end
end
================================================
FILE: spec/support/test_app/app/controllers/disable_all_filters_controller.rb
================================================
# encoding: utf-8
class DisableAllFiltersController < ApplicationController
def index
@tasks_grid = initialize_grid(Task)
end
end
================================================
FILE: spec/support/test_app/app/controllers/hiding_checkboxes_in_action_column_controller.rb
================================================
# encoding: utf-8
class HidingCheckboxesInActionColumnController < ApplicationController
def index
@tasks_grid = initialize_grid(Task,
name: 'g',
order: 'id'
)
if params[:g] && params[:g][:selected]
@selected = params[:g][:selected]
end
end
end
================================================
FILE: spec/support/test_app/app/controllers/home_controller.rb
================================================
# encoding: utf-8
class HomeController < ApplicationController
end
================================================
FILE: spec/support/test_app/app/controllers/integration_with_application_view_controller.rb
================================================
# encoding: utf-8
class IntegrationWithApplicationViewController < ApplicationController
def index
@tasks_grid = initialize_grid(Task,
include: [:priority, :status, :project, :assigned_users],
order: 'statuses.name',
name: 'g',
per_page: 10,
custom_order: {
'tasks.priority_id' => 'priorities.name',
'tasks.status_id' => 'statuses.position',
'tasks.project_id' => 'projects.name'
}
)
end
end
================================================
FILE: spec/support/test_app/app/controllers/integration_with_forms_controller.rb
================================================
# encoding: utf-8
class IntegrationWithFormsController < ApplicationController
def index
@archived = params[:archived] == '1' ? true : false
@tasks_grid = initialize_grid(Task,
conditions: { archived: @archived },
name: 'g'
)
end
end
================================================
FILE: spec/support/test_app/app/controllers/joining_tables_controller.rb
================================================
# encoding: utf-8
class JoiningTablesController < ApplicationController
def index
@tasks_grid = initialize_grid(Task,
# You can omit includes if they are all mentioned in :assoc in the view
# includes: [:priority, :status, {project: :customer}],
conditions: { archived: false },
order: 'id'
)
end
end
================================================
FILE: spec/support/test_app/app/controllers/localization_controller.rb
================================================
# encoding: utf-8
class LocalizationController < ApplicationController
before_action :init_locale
def init_locale
if params[:lang]
session[:lang] = params[:lang]
end
session[:lang] = :nl unless session[:lang]
I18n.locale = session[:lang]
end
def index
@tasks_grid = initialize_grid(Task,
include: [:priority, :status, :project, :assigned_users],
order: 'statuses.name',
custom_order: {
'tasks.priority_id' => 'priorities.name',
'tasks.status_id' => 'statuses.position',
'tasks.project_id' => 'projects.name'
}
)
end
end
================================================
FILE: spec/support/test_app/app/controllers/many_grids_on_page_controller.rb
================================================
# encoding: utf-8
class ManyGridsOnPageController < ApplicationController
def index
@tasks_grid1 = initialize_grid(Task, name: 'g1')
@tasks_grid2 = initialize_grid(Task, name: 'g2')
end
end
================================================
FILE: spec/support/test_app/app/controllers/negation_controller.rb
================================================
# encoding: utf-8
class NegationController < ApplicationController
def index
@tasks_grid = initialize_grid(Task,
include: [:priority, :status, :project],
order: 'statuses.name',
custom_order: {
'tasks.priority_id' => 'priorities.name',
'tasks.status_id' => 'statuses.position',
'tasks.project_id' => 'projects.name'
}
)
end
end
================================================
FILE: spec/support/test_app/app/controllers/no_records_controller.rb
================================================
# encoding: utf-8
class NoRecordsController < ApplicationController
def index
@tasks_grid = initialize_grid(Task, conditions: ['title = ?', 'a title that does not exist'])
@tasks_grid2 = initialize_grid(Task, conditions: ['title = ?', 'a title that does not exist'])
@tasks_grid3 = initialize_grid(Task, conditions: ['title = ?', 'a title that does not exist'])
end
end
================================================
FILE: spec/support/test_app/app/controllers/null_values_controller.rb
================================================
# encoding: utf-8
class NullValuesController < ApplicationController
def index
@tasks_grid = initialize_grid(Task,
custom_order: {
'tasks.priority_id' => 'priorities.name'
}
)
end
end
================================================
FILE: spec/support/test_app/app/controllers/numeric_filters_controller.rb
================================================
# encoding: utf-8
class NumericFiltersController < ApplicationController
def index
@tasks_grid = initialize_grid(Task)
end
end
================================================
FILE: spec/support/test_app/app/controllers/queries_controller.rb
================================================
# encoding: utf-8
class QueriesController < ApplicationController
save_wice_grid_queries
end
================================================
FILE: spec/support/test_app/app/controllers/resultset_processings2_controller.rb
================================================
# encoding: utf-8
class ResultsetProcessings2Controller < ApplicationController
attr_reader :selected_tasks
def index
@tasks_grid = initialize_grid(Task,
include: [:priority, :status, :project, :assigned_users],
order: 'statuses.name',
name: 'g',
per_page: 5,
with_resultset: :process_records,
custom_order: {
'tasks.priority_id' => 'priorities.name',
'tasks.status_id' => 'statuses.position',
'tasks.project_id' => 'projects.name'
}
)
@selected_tasks = []
end
protected
def process_records(active_relation)
if params[:process_selected_tasks]
@selected_tasks = active_relation.to_a
end
end
end
================================================
FILE: spec/support/test_app/app/controllers/resultset_processings_controller.rb
================================================
# encoding: utf-8
class ResultsetProcessingsController < ApplicationController
def index
@tasks_grid = initialize_grid(Task,
include: [:priority, :status, :project, :assigned_users],
order: 'statuses.name',
name: 'g',
per_page: 10,
# :with_paginated_resultset => :process_records,
custom_order: {
'tasks.priority_id' => 'priorities.name',
'tasks.status_id' => 'statuses.position',
'tasks.project_id' => 'projects.name'
}
)
@one_page_records = []
@tasks_grid.with_paginated_resultset do |records|
records.each { |rec| @one_page_records << rec }
end
end
protected
# def process_records(records)
# records.each{|rec| @one_page_records << rec}
# end
end
================================================
FILE: spec/support/test_app/app/controllers/saved_queries_controller.rb
================================================
# encoding: utf-8
class SavedQueriesController < ApplicationController
def index
@tasks_grid = initialize_grid(Task,
include: [:priority, :status, :project, :assigned_users],
order: 'statuses.name',
custom_order: {
'tasks.priority_id' => 'priorities.name',
'tasks.status_id' => 'statuses.position',
'tasks.project_id' => 'projects.name'
}
)
end
end
================================================
FILE: spec/support/test_app/app/controllers/styling_controller.rb
================================================
# encoding: utf-8
class StylingController < ApplicationController
def index
@versions_grid1 = initialize_grid(Version, name: 'g1')
@versions_grid2 = initialize_grid(Version, name: 'g2')
end
end
================================================
FILE: spec/support/test_app/app/controllers/tasks_controller.rb
================================================
# encoding: utf-8
class TasksController < ApplicationController
def index
@tasks_grid = initialize_grid(Task,
include: [:priority, :status, :project],
order: 'statuses.name',
custom_order: {
'tasks.priority_id' => 'priorities.name',
'tasks.status_id' => 'statuses.position',
'tasks.project_id' => 'projects.name'
}
)
end
end
================================================
FILE: spec/support/test_app/app/controllers/two_associations_controller.rb
================================================
# encoding: utf-8
class TwoAssociationsController < ApplicationController
def index
@projects_grid = initialize_grid(Project)
end
end
================================================
FILE: spec/support/test_app/app/controllers/upper_pagination_panel_controller.rb
================================================
# encoding: utf-8
class UpperPaginationPanelController < ApplicationController
def index
@tasks_grid = initialize_grid(Task)
end
end
================================================
FILE: spec/support/test_app/app/controllers/when_filtered_controller.rb
================================================
# encoding: utf-8
class WhenFilteredController < ApplicationController
def index
@tasks_grid = initialize_grid(Task)
end
end
================================================
FILE: spec/support/test_app/app/helpers/application_helper.rb
================================================
# encoding: utf-8
module ApplicationHelper
@@code = {}
def show_code
n = 0
content_tag(
:ul, code_chunks.map do |filename_for_view, code|
n += 1
content_tag(
:li, content_tag(
:div, link_to(filename_for_view, "#collapse#{n}", 'data-bs-toggle' => 'collapse', 'data-parent' => '#code-accordion', :class => 'accordion-button'),
class: 'accordion-header'
) +
content_tag(
:div, content_tag(:div, code, class: 'accordion-inner'),
class: 'accordion-body collapse',
style: 'height: 0px;',
id: "collapse#{n}"
),
class: 'accordion-item'
)
end.join.html_safe,
id: 'code-accordion',
class: 'accordion'
)
end
def code_chunks
[].tap do |res|
res << code_for(@controller_file, @controller_file_to_show, :ruby)
@view_files_dir.each do|filename_for_view, filename|
filetype = filename_for_view =~ /\.erb/ ? :rhtml : :haml
res << code_for(filename, filename_for_view, filetype) unless filename.ends_with? '~'
end
end
#.reject do |file_name|
#file_name.ends_with? '~'
#end
end
def code_for(filename, filename_for_view, filetype = :ruby)
code = File.read(filename)
@@code[filetype] = CodeRay.scan("\n#{code}", filetype).div unless @@code[filename]
[filename_for_view, @@code[filetype].html_safe]
end
def each_example
@example_map.each do |section|
section[1].each do |controller, name|
yield controller, name
end
end
end
def current_page_title
each_example do |controller, name|
if controller.to_s == controller_name
return name
end
end
end
def previous_next_example_urls
previous_example_controller = nil
next_example_controller = nil
_previous_example_controller = nil
found = false
each_example do |controller, _name|
if found
return previous_example_controller, controller
end
if controller.to_s == controller_name
previous_example_controller = _previous_example_controller
found = true
end
_previous_example_controller = controller
end
[previous_example_controller, nil]
end
end
================================================
FILE: spec/support/test_app/app/javascript/application.js
================================================
// Configure your import map in config/importmap.rb. Read more: https://github.com/rails/importmap-rails
import "@hotwired/turbo-rails"
import "jquery" // this import first
import "jquery-ui"
import "bootstrap"
import "wice_grid"
import "jquery.ui.datepicker.locales"
import "reload_on_change"
================================================
FILE: spec/support/test_app/app/mailers/.gitkeep
================================================
================================================
FILE: spec/support/test_app/app/models/.gitkeep
================================================
================================================
FILE: spec/support/test_app/app/models/company.rb
================================================
# encoding: utf-8
class Company < ActiveRecord::Base
has_many :customer_projects, class_name: 'Project', foreign_key: 'customer_id'
has_many :supplier_projects, class_name: 'Project', foreign_key: 'supplier_id'
end
================================================
FILE: spec/support/test_app/app/models/populate.rb
================================================
# encoding: utf-8
module Populate
def self.me
[Priority, ProjectRole, Status, Company, Version, User, UserProjectParticipation, Project, Task].map(&:delete_all)
%w(Urgent High Normal Low Anecdotic).each_with_index do |priority_name, i|
Priority.create!(position: i, name: priority_name)
end
%w(Manager Customer Developer QualityAssurance).each_with_index do |role_name, i|
ProjectRole.create!(name: role_name, can_close_tasks: i < 2)
end
%w(New Assigned Started Resolved Duplicate Cancelled Postponed Closed Verified).each_with_index do |status_name, i|
Status.create!(name: status_name, position: i)
end
['MNU', 'SkyNet', 'Coders Unlimited', 'Shift-Command-4 Limited'].each do |company_name|
Company.create!(name: company_name)
end
companies = Company.all.index_by(&:name)
version_statuses = %w(development testing production)
{ 'Ultimate Website' => { customer: 'MNU', supplier: 'Coders Unlimited', versions: ['1.0', '1.1', '1.2', '2.0', '3.0'] },
'Super Game' => { customer: 'MNU', supplier: 'Shift-Command-4 Limited', versions: ['1.0', '88.1', '99.0'] },
'Divine Firmware' => { customer: 'SkyNet', supplier: 'Coders Unlimited', versions: ['6.0', '7.1', '8.0'] } }.each do |project, data|
project = Project.create!(name: project, customer: companies[data[:customer]], supplier: companies[data[:supplier]])
data[:versions].each do|version|
Version.create!(name: version, project: project, status: version_statuses[rand(3)])
end
end
projects = Project.includes(:users).all
project_roles = ProjectRole.all
['Wikus van de Merwe', 'Grey Bradnam', 'Christopher Johnson', 'Piet Smit', 'Fundiswa Mhlanga', 'Tania van de Merwe',
'Obesandjo', 'Dirk Michaels', 'Ross Pienaar', 'Koobus Venter', 'Dirk Michaels', 'Sarah Livingstone'].each do |user|
user = User.create!(name: user)
(rand(3) + 1).times do
UserProjectParticipation.create(
user: user,
project: projects.sample,
project_role: project_roles.sample
)
end
end
projects = Project.includes([:users, :versions]).all
statuses = Status.all
priorities = Priority.all
500.times do
task_name = Faker::Lorem.words(rand(3) + 1).join(' ')
project = projects.sample
assigned_users = Set.new
rand(4).times do
assigned_users << project.users.sample
end
a = Task.create!(
title: task_name,
description: Faker::Lorem.sentence,
project: project,
created_by: project.users.sample,
status: statuses.sample,
priority: (rand(4) == 0 ? nil : priorities.sample),
assigned_users: assigned_users.to_a,
relevant_version: (rand(2) == 0 ? nil : project.versions.sample),
expected_version: (rand(2) == 0 ? nil : project.versions.sample),
estimated_time: rand(20) + 1,
due_date: Date.current.advance(days: (rand(300) + 100)),
created_at: (rand(100) + 100).days.ago,
updated_at: rand(100).days.ago,
archived: rand(10) == 0
)
end
end
end
================================================
FILE: spec/support/test_app/app/models/priority.rb
================================================
# encoding: utf-8
class Priority < ActiveRecord::Base
has_many :tasks
include ToDropdownMixin
def self.urgent
find_by_name('Urgent')
end
end
================================================
FILE: spec/support/test_app/app/models/project.rb
================================================
# encoding: utf-8
class Project < ActiveRecord::Base
has_many :tasks
has_many :user_project_participations
has_many :users, through: :user_project_participations
has_many :versions
belongs_to :customer, class_name: 'Company'
belongs_to :supplier, class_name: 'Company'
include ToDropdownMixin
end
================================================
FILE: spec/support/test_app/app/models/project_role.rb
================================================
# encoding: utf-8
class ProjectRole < ActiveRecord::Base
end
================================================
FILE: spec/support/test_app/app/models/status.rb
================================================
# encoding: utf-8
class Status < ActiveRecord::Base
has_many :tasks
include ToDropdownMixin
def number_of_vowels
name.scan(/[aeiou]/i).count
end
end
================================================
FILE: spec/support/test_app/app/models/task.rb
================================================
# encoding: utf-8
class Task < ActiveRecord::Base
belongs_to :created_by, class_name: 'User'
belongs_to :project
belongs_to :priority
belongs_to :status
belongs_to :relevant_version, class_name: 'Version'
belongs_to :expected_version, class_name: 'Version'
has_and_belongs_to_many :assigned_users, -> { order('users.name') }, class_name: 'User'
end
================================================
FILE: spec/support/test_app/app/models/to_dropdown_mixin.rb
================================================
# encoding: utf-8
module ToDropdownMixin
def self.included(base)
base.extend(ClassMethods)
end
module ClassMethods
def to_dropdown
order('name').map(&:to_option)
end
end
def to_option
[name, id]
end
end
================================================
FILE: spec/support/test_app/app/models/user.rb
================================================
# encoding: utf-8
class User < ActiveRecord::Base
has_many :created_tasks, class_name: 'Task', foreign_key: :created_by_id
has_and_belongs_to_many :assigned_tasks, class_name: 'Task'
has_many :user_project_participations
has_many :projects, through: :user_project_participations
end
================================================
FILE: spec/support/test_app/app/models/user_project_participation.rb
================================================
# encoding: utf-8
class UserProjectParticipation < ActiveRecord::Base
belongs_to :user
belongs_to :project
belongs_to :project_role
end
================================================
FILE: spec/support/test_app/app/models/version.rb
================================================
# encoding: utf-8
class Version < ActiveRecord::Base
belongs_to :project
include ToDropdownMixin
end
================================================
FILE: spec/support/test_app/app/views/action_column/_grid.html.erb
================================================
<%= grid(@tasks_grid) do |g|
g.action_column html_check_box: false
# The default param_name is 'selected', the complete HTTP parameter will be "#{grid_name}[#{param_name}][]"
# Or:
# g.action_column param_name: :foo, html: {class: 'my_class'},
# select_all_buttons: false, object_property: :id
g.column name: 'ID', attribute: 'id', filter_type: :range
g.column name: 'Title', attribute: 'title', negation: true
g.column name: 'Archived', attribute: 'archived' do |rec|
rec.archived? ? 'Yes' : 'No'
end
g.column name: 'Status', attribute: 'status_id', custom_filter: Status.to_dropdown do |task|
task.status.name if task.status
end
g.column name: 'Project Name', attribute: 'project_id', custom_filter: Project.to_dropdown do |task|
task.project.name if task.project
end
g.column name: 'Due Date', attribute: 'due_date'
g.column name: 'Added', attribute: 'created_at' do |task|
task.created_at.to_fs(:db)
end
end -%>
================================================
FILE: spec/support/test_app/app/views/action_column/index.html.haml
================================================
.card.bg-light
.card-body
%h2= current_page_title
%p
You can easily add a column with checkboxes for each row with
%code g.action_column
\.
Normally WiceGrid does not use a form, but its filters work correctly when placed inside a form, so you can use a form to process
the selected records while keeping the state of the filters. Another way could be reading the selected checkoxes with the help
of a simple javascript.
%p
By default the checkboxes have name
%code "grid_name[selected][]"
, but you can change
%code selected
to something else with parameter
%code param_name: 'my-parameter-name'
%p
The value of the checkox is the id by default, but you can change it with parameter
%code object_property: 'some_object_property'
\.
%p
%code select_all_buttons: false
hides the "(de)select all" icons, and
%code html: {class: 'my_class'}
changes the css class of the checkboxes.
= show_code
= dump_filter_parameters_as_hidden_fields(@tasks_grid)
= form_for '#', method: :get do
- if @selected
.card.bg-light
.card-body
Selected tasks:
= @selected.to_sentence
.row
.col-md-12
%p
%button.btn.btn-default{'type' => 'submit'} Process tasks
= render 'grid'
%p
%button.btn.btn-default{'type' => 'submit'} Process tasks
================================================
FILE: spec/support/test_app/app/views/adding_rows/_grid.html.erb
================================================
<%= grid(@tasks_grid) do |g|
g.after_row do |task, number_of_columns|
if task.priority == Priority.urgent
content_tag(:tr,
content_tag(:td,
content_tag(:button, "Panic! \"#{task.title}\" is urgent!", class: "btn btn-danger"),
colspan: number_of_columns),
class: 'extra-row')
else
nil
end
end
g.last_row do |number_of_columns|
content_tag(:tr,
content_tag(:td,
content_tag(:button, "Don't panic", class: "btn btn-info"),
colspan: 9),
class: 'last-row')
end
g.row_attributes do |task|
if task.priority == Priority.urgent
{class: 'urgent'}
end
end
g.column name: 'ID', attribute: 'id', filter: false
g.column name: 'Title', attribute: 'title'
g.column name: 'Priority', attribute: 'priority_id', custom_filter: Priority.to_dropdown do |task|
task.priority.name if task.priority
end
g.column name: 'Status', attribute: 'status_id', custom_filter: Status.to_dropdown do |task|
task.status.name if task.status
end
g.column name: 'Project Name', attribute: 'project_id', custom_filter: Project.to_dropdown do |task|
task.project.name if task.project
end
g.column name: 'Archived', attribute: 'archived' do |task|
task.archived? ? 'Yes' : 'No'
end
g.column name: 'Added', attribute: 'created_at' do |task|
task.created_at.to_fs(:short)
end
g.column do |task|
link_to('Edit', edit_task_path(task))
end
end
-%>
================================================
FILE: spec/support/test_app/app/views/adding_rows/index.html.haml
================================================
.card.bg-light
.card-body
%h2= current_page_title
%p
It is possible to insert a custom row at the bottom of the grid with
%code last_row
and a custom row before or after a certain row with
%code before_row
and
%code after_row.
%p
The block of
%code before_row
or
%code after_row
is executed for each record and if it returns a string.
%p
Both
%code before_row
and
%code last_row
are expected to return the complete markup for a table row starting with the
%code tr
tag.
%p
The first argument for a
%code last_row
block and the second argument for
%code before_row
and
%code after_row
blocks is the number of columns in the grid.
= show_code
.row
.col-md-12
= render 'grid'
================================================
FILE: spec/support/test_app/app/views/all_records/_grid.html.erb
================================================
<%= grid(@tasks_grid, allow_showing_all_records: false) do |g|
g.column name: 'ID', attribute: 'id', filter: false
g.column name: 'Title', attribute: 'title'
g.column name: 'Priority', attribute: 'priority_id', custom_filter: Priority.to_dropdown do |task|
task.priority.name if task.priority
end
g.column name: 'Status', attribute: 'status_id', custom_filter: Status.to_dropdown do |task|
task.status.name if task.status
end
g.column name: 'Project Name', attribute: 'project_id', custom_filter: Project.to_dropdown do |task|
task.project.name if task.project
end
g.column name: 'Archived', attribute: 'archived' do |task|
task.archived? ? 'Yes' : 'No'
end
g.column name: 'Added', attribute: 'created_at' do |task|
task.created_at.to_fs(:short)
end
g.column do |task|
link_to('Edit', edit_task_path(task))
end
end -%>
================================================
FILE: spec/support/test_app/app/views/all_records/index.html.haml
================================================
.card.bg-light
.card-body
%h2= current_page_title
%p
Use
%code allow_showing_all_records: false
to remove "show all" link from the grid.
= show_code
.row
.col-md-12
= render 'grid'
================================================
FILE: spec/support/test_app/app/views/auto_reloads/_grid.html.erb
================================================
<%= grid(@tasks_grid, hide_submit_button: true) do |g|
g.column name: 'ID', attribute: 'id', auto_reload: true , filter_type: :range
g.column name: 'Title', attribute: 'title', auto_reload: true, negation: true
g.column name: 'Archived', attribute: 'archived', auto_reload: true do |rec|
rec.archived? ? 'Yes' : 'No'
end
g.column name: 'Status', attribute: 'status_id', custom_filter: Status.to_dropdown, auto_reload: true do |task|
task.status.name if task.status
end
g.column name: 'Project Name', attribute: 'project_id', custom_filter: Project.to_dropdown, auto_reload: true do |task|
task.project.name if task.project
end
g.column name: 'Due Date', attribute: 'due_date', auto_reload: true do |task|
task.due_date if task.due_date
end
g.column name: 'Added', attribute: 'created_at', auto_reload: true do |task|
task.created_at.to_fs(:db)
end
g.column do |task|
link_to('Edit', edit_task_path(task))
end
end -%>
================================================
FILE: spec/support/test_app/app/views/auto_reloads/index.html.haml
================================================
.card.bg-light
.card-body
%h2= current_page_title
%p
It is possible to reload the grid on each filter action like changing the selected option in a dropdown filter or typing in a text filter.
One way to do it is to use
%code auto_reload: true
for each column. Another way is changing
%code Wice::Defaults::AUTO_RELOAD
in the WiceGrid config file.
= show_code
.row
.col-md-12
= render 'grid'
================================================
FILE: spec/support/test_app/app/views/auto_reloads2/_grid.html.erb
================================================
<%= define_grid(@tasks_grid, hide_submit_button: true) do |g|
g.column name: 'ID', attribute: 'id', auto_reload: true, detach_with_id: :id, filter_type: :range
g.column name: 'Title', attribute: 'title', auto_reload: true, negation: true, detach_with_id: :title
g.column name: 'Archived', attribute: 'archived', auto_reload: true, detach_with_id: :archived do |rec|
rec.archived? ? 'Yes' : 'No'
end
g.column name: 'Status', attribute: 'status_id', custom_filter: Status.to_dropdown, auto_reload: true, detach_with_id: :status_id do |task|
task.status.name if task.status
end
g.column name: 'Project Name', attribute: 'project_id', custom_filter: Project.to_dropdown, auto_reload: true, detach_with_id: :project_id do |task|
task.project.name if task.project
end
g.column name: 'Due Date', attribute: 'due_date', auto_reload: true, detach_with_id: :due_date do |task|
task.due_date if task.due_date
end
g.column name: 'Added', attribute: 'created_at', auto_reload: true, detach_with_id: :created_at do |task|
task.created_at.to_fs(:db)
end
g.column do |task|
link_to('Edit', edit_task_path(task))
end
end -%>
================================================
FILE: spec/support/test_app/app/views/auto_reloads2/index.html.haml
================================================
.card.bg-light
.card-body
%h2= current_page_title
%p
An example with an autoreloading grid with detached filters.
= show_code
= render 'grid'
.row
.col-md-2
ID:
.col-md-10
= grid_filter @tasks_grid, :id
.row
.col-md-2
Title:
.col-md-10
= grid_filter @tasks_grid, :title
.row
.col-md-2
Archived:
.col-md-10
= grid_filter @tasks_grid, :archived
.row
.col-md-2
Status:
.col-md-10
= grid_filter @tasks_grid, :status_id
.row
.col-md-2
Project:
.col-md-10
= grid_filter @tasks_grid, :project_id
.row
.col-md-2
Due date:
.col-md-10
= grid_filter @tasks_grid, :due_date
.row
.col-md-2
Added:
.col-md-10
= grid_filter @tasks_grid, :created_at
.row
.col-md-12
.external-buttons
%button.btn.btn-default.wg-external-reset-button{'data-grid-name' => 'grid'} Reset
.row
.col-md-12
= render_grid(@tasks_grid)
================================================
FILE: spec/support/test_app/app/views/auto_reloads3/_grid.html.erb
================================================
<%= define_grid(grid, hide_submit_button: true) do |g|
g.column name: 'Title', attribute: 'title', auto_reload: true, negation: true, detach_with_id: :title
g.column name: 'Archived', attribute: 'archived', auto_reload: true, detach_with_id: :archived do |rec|
rec.archived? ? 'Yes' : 'No'
end
g.column name: 'Status', attribute: 'status_id', custom_filter: Status.to_dropdown, auto_reload: true, detach_with_id: :status_id do |task|
task.status.name if task.status
end
g.column name: 'Due Date', attribute: 'due_date', auto_reload: true, detach_with_id: :due_date do |task|
task.due_date if task.due_date
end
g.column do |task|
link_to('Edit', edit_task_path(task))
end
end -%>
================================================
FILE: spec/support/test_app/app/views/auto_reloads3/index.html.haml
================================================
.card.bg-light
.card-body
%h2= current_page_title
%p
An example with 2 independant autoreloading grids on one page.
= show_code
= render 'grid', grid: @tasks_grid
= render 'grid', grid: @tasks_grid2
.row
.col-md-2
Title:
.col-md-4
= grid_filter @tasks_grid, :title
.col-md-2
Title:
.col-md-4
= grid_filter @tasks_grid2, :title
.row
.col-md-2
Archived:
.col-md-4
= grid_filter @tasks_grid, :archived
.col-md-2
Archived:
.col-md-4
= grid_filter @tasks_grid2, :archived
.row
.col-md-2
Status:
.col-md-4
= grid_filter @tasks_grid, :status_id
.col-md-2
Status:
.col-md-4
= grid_filter @tasks_grid2, :status_id
.row
.col-md-2
Due date:
.col-md-4
= grid_filter @tasks_grid, :due_date
.col-md-2
Due date:
.col-md-4
= grid_filter @tasks_grid2, :due_date
.row
.col-md-6
.external-buttons.grid1
%button.btn.btn-default.wg-external-reset-button{'data-grid-name' => 'grid'} Reset
.col-md-6
.external-buttons.grid2
%button.btn.btn-default.wg-external-reset-button{'data-grid-name' => 'grid2'} Reset
.row
.col-md-6
= render_grid(@tasks_grid)
.col-md-6
= render_grid(@tasks_grid2)
================================================
FILE: spec/support/test_app/app/views/basics1/_grid.html.erb
================================================
<%= grid(@tasks_grid) do |g|
g.column do |task|
task.id
end
g.column do |task|
task.title
end
g.column do |task|
task.description
end
g.column do |task|
task.archived? ? 'Yes' : 'No'
end
g.column do |task|
task.created_at.to_fs(:short)
end
g.column do |task|
link_to('Edit', edit_task_path(task))
end
end -%>
================================================
FILE: spec/support/test_app/app/views/basics1/index.html.haml
================================================
.card.bg-light
.card-body
%h2= current_page_title
%p
The simplest grid is defined by the
%code grid
helper with column blocks inside for each column.
The value of each column block is the contents of a cell.
= show_code
.row
.col-md-12
= render 'grid'
================================================
FILE: spec/support/test_app/app/views/basics2/_grid.html.erb
================================================
<%= grid(@tasks_grid) do |g|
g.column name: 'ID' do |task|
task.id
end
g.column name: 'Title' do |task|
task.title
end
g.column name: 'Description' do |task|
task.description
end
g.column name: 'Archived' do |task|
task.archived? ? 'Yes' : 'No'
end
g.column name: 'Added' do |task|
task.created_at.to_fs(:short)
end
g.column do |task|
link_to('Edit', edit_task_path(task))
end
end -%>
================================================
FILE: spec/support/test_app/app/views/basics2/index.html.haml
================================================
.card.bg-light
.card-body
%h2= current_page_title
%p
The
%code name
parameter adds names of columns to the grid.
= show_code
.row
.col-md-12
= render 'grid'
================================================
FILE: spec/support/test_app/app/views/basics3/_grid.html.erb
================================================
<%# show_filters: :when_filtered %>
<%= grid(@tasks_grid) do |g|
g.column name: 'ID', attribute: 'id' do |task|
task.id
end
g.column name: 'Title', attribute: 'title' do |task|
task.title
end
g.column name: 'Description', attribute: 'description' do |task|
task.description
end
g.column name: 'Archived', attribute: 'archived' do |task|
task.archived? ? 'Yes' : 'No'
end
g.column name: 'Due Date', attribute: 'due_date' do |task|
task.due_date
end
g.column do |task|
link_to('Edit', edit_task_path(task))
end
end -%>
================================================
FILE: spec/support/test_app/app/views/basics3/index.html.haml
================================================
.card.bg-light
.card-body
%h2= current_page_title
%p
Once a grid column is associated with the inderlying database field with the help of the
%code attrubute
parameter the column becomes sortable and a column filter is rendered. The column filter
is generated based on the type of the database field.
= show_code
.row
.col-md-12
= render 'grid'
================================================
FILE: spec/support/test_app/app/views/basics4/_grid.html.erb
================================================
<%= grid(@tasks_grid) do |g|
g.column name: 'ID', attribute: 'id', filter: false
g.column name: 'Title', attribute: 'title'
g.column name: 'Description', attribute: 'description', filter: false
g.column name: 'Archived', attribute: 'archived' do |task|
task.archived? ? 'Yes' : 'No'
end
g.column name: 'Added', attribute: 'created_at', filter: false do |task|
task.created_at.to_fs(:short)
end
g.column do |task|
link_to('Edit', edit_task_path(task))
end
end -%>
================================================
FILE: spec/support/test_app/app/views/basics4/index.html.haml
================================================
.card.bg-light
.card-body
%h2= current_page_title
%p
To disable a filter use
%code filter: false
\.
= show_code
.row
.col-md-12
= render 'grid'
================================================
FILE: spec/support/test_app/app/views/basics5/_grid.html.erb
================================================
<%= grid(@tasks_grid) do |g|
g.column name: 'ID', attribute: 'id', filter: false
g.column name: 'Title', attribute: 'title'
g.column name: 'Description', attribute: 'description', ordering: false
g.column name: 'Archived', attribute: 'archived', ordering: false do |task|
task.archived? ? 'Yes' : 'No'
end
g.column name: 'Due Date', attribute: 'due_date', filter: false
g.column do |task|
link_to('Edit', edit_task_path(task))
end
end -%>
================================================
FILE: spec/support/test_app/app/views/basics5/index.html.haml
================================================
.card.bg-light
.card-body
%h2= current_page_title
%p
To disable ordering columns use
%code allow_ordering: false
\.
= show_code
.row
.col-md-12
= render 'grid'
================================================
FILE: spec/support/test_app/app/views/basics6/_grid.html.erb
================================================
<%= grid(@tasks_grid) do |g|
g.column name: 'ID', attribute: 'id', filter: false
g.column name: 'Title', attribute: 'title'
g.column name: 'Description', attribute: 'description'
g.column name: 'Archived', attribute: 'archived' do |task|
task.archived? ? 'Yes' : 'No'
end
g.column name: 'Due Date', attribute: 'due_date', filter: false
g.column do |task|
link_to('Edit', edit_task_path(task))
end
end -%>
================================================
FILE: spec/support/test_app/app/views/basics6/index.html.haml
================================================
.card.bg-light
.card-body
%h2= current_page_title
%p
Use
%code :order
and
%code :order_direction
in
%code initialize_grid
to define by which column the grid should be ordered once it is loaded initially.
%p
Use
%code :conditions
in
%code initialize_grid
to define the subset of records shown in the grid.
= show_code
.row
.col-md-12
= render 'grid'
================================================
FILE: spec/support/test_app/app/views/blockless_column_definition/_grid.html.erb
================================================
<%= grid(@tasks_grid) do |g|
g.column name: 'ID', attribute: 'id'
g.column name: 'Title', attribute: 'title'
g.column name: 'Description', attribute: 'description'
g.column name: 'Archived', attribute: 'archived' do |task|
task.archived? ? 'Yes' : 'No'
end
g.column name: 'Due Date', attribute: 'due_date'
g.column do |task|
link_to('Edit', edit_task_path(task))
end
end -%>
================================================
FILE: spec/support/test_app/app/views/blockless_column_definition/index.html.haml
================================================
.card.bg-light
.card-body
%h2= current_page_title
%p
If the contents of the cell is the return value of calling
%code :attrubute
on the active record, without any additional markup or transformations, the
block of the
%code column
method can be dropped.
= show_code
.row
.col-md-12
= render 'grid'
================================================
FILE: spec/support/test_app/app/views/buttons/_grid.html.erb
================================================
<%= grid(@tasks_grid, hide_submit_button: true, hide_reset_button: true) do |g|
g.column name: 'ID', attribute: 'id', filter: false
g.column name: 'Title', attribute: 'title'
g.column name: 'Description', attribute: 'description'
g.column name: 'Archived', attribute: 'archived' do |task|
task.archived? ? 'Yes' : 'No'
end
g.column name: 'Due Date', attribute: 'due_date', filter: false
g.column do |task|
link_to('Edit', edit_task_path(task))
end
end -%>
================================================
FILE: spec/support/test_app/app/views/buttons/index.html.haml
================================================
.card.bg-light
.card-body
%h2= current_page_title
%p
To replace the default Submit and Reset icons of the grid, add class
%code wg-external-submit-button
to any clickable element on page and set its attribute
%code data-grid-name
to the name of the grid.
Do the same for the Reset button with class
%code wg-external-reset-button.
%p
%code grid
helper parameters
%code hide_submit_button: true
and
%code hide_reset_button: true
hide the default icons.
= show_code
.row
.col-md-12
.external-buttons
%button.btn.btn-primary.wg-external-submit-button{'data-grid-name' => 'grid'} Submit
%button.btn.btn-default.wg-external-reset-button{'data-grid-name' => 'grid'} Reset
= render 'grid'
================================================
FILE: spec/support/test_app/app/views/csv_and_detached_filters/_grid.html.erb
================================================
<%= define_grid(@tasks_grid, hide_submit_button: true, hide_reset_button: true) do |g|
g.column name: 'ID', attribute: 'id', detach_with_id: :id_filter
g.column name: 'Title', attribute: 'title', detach_with_id: :title_filter
g.column name: 'Description', attribute: 'description', detach_with_id: :description_filter
g.column name: 'Archived', attribute: 'archived', detach_with_id: :archived_filter do |task|
task.archived? ? 'Yes' : 'No'
end
g.column name: 'Due Date', attribute: 'due_date', detach_with_id: :due_date do |task|
task.due_date.to_fs(:short)
end
g.column do |task|
link_to('Edit', edit_task_path(task))
end
end -%>
================================================
FILE: spec/support/test_app/app/views/csv_and_detached_filters/index.html.haml
================================================
.card.bg-light
.card-body
%h2= current_page_title
%p
CSV export works with
%code define_grid
and external filters, too.
= show_code
= render 'grid'
.row
.col-md-2
ID:
.col-md-10
= grid_filter @tasks_grid, :id_filter
.row
.col-md-2
Title:
.col-md-10
= grid_filter @tasks_grid, :title_filter
.row
.col-md-2
Description:
.col-md-10
= grid_filter @tasks_grid, :description_filter
.row
.col-md-2
Archived:
.col-md-10
= grid_filter @tasks_grid, :archived_filter
.row
.col-md-2
Due date:
.col-md-10
= grid_filter @tasks_grid, :due_date
.row
.col-md-12
%button.btn.btn-primary.wg-external-submit-button{'data-grid-name' => 'grid'} Submit
%button.btn.btn-default.wg-external-reset-button{'data-grid-name' => 'grid'} Reset
%button.btn.btn-primary.wg-external-csv-export-button{'data-grid-name' => 'grid'} Export To CSV
%p
.row
.col-md-12
= render_grid(@tasks_grid)
================================================
FILE: spec/support/test_app/app/views/csv_export/_projects_grid.html.erb
================================================
<%= grid(@projects_grid, show_filters: :always, hide_csv_button: true) do |g|
g.column name: 'ID', attribute: 'id', filter: false
g.column name: 'Project Name', attribute: 'name'
g.column name: 'Customer company', assoc: :customer, attribute: 'name' do |task|
task.customer.name if task.customer
end
g.column name: 'Supplier company',
assoc: :supplier, attribute: 'name', table_alias: 'suppliers_projects' do |task|
task.supplier.name if task.supplier
end
end -%>
================================================
FILE: spec/support/test_app/app/views/csv_export/_tasks_grid.html.erb
================================================
<%= grid(@tasks_grid, upper_pagination_panel: true) do |g|
g.column name: 'ID', attribute: 'id', filter: false
# html version
g.column name: 'Title', attribute: 'title', in_csv: false do |task|
link_to('Edit', edit_task_path(task.title))
end
# plain text version
g.column name: 'Title', in_html: false do |task|
task.title
end
g.column name: 'Priority', attribute: 'priority_id', custom_filter: Priority.to_dropdown do |task|
task.priority.name if task.priority
end
g.column name: 'Status', attribute: 'status_id', custom_filter: Status.to_dropdown do |task|
task.status.name if task.status
end
# html version
g.column name: 'Project Name', attribute: 'project_id', custom_filter: Project.to_dropdown, in_csv: false do |task|
link_to_if(task.project, task.project.name, project_path(task.project) )
end
# plain text version
g.column name: 'Project Name', in_html: false do |task|
task.project.name if task.project
end
g.column name: 'Archived', attribute: 'archived' do |task|
task.archived? ? 'Yes' : 'No'
end
g.column name: 'Added', attribute: 'created_at' do |task|
task.created_at.to_fs(:short)
end
# is not included into csv
g.column in_csv: false do |task|
link_to('Edit', edit_task_path(task))
end
end -%>
================================================
FILE: spec/support/test_app/app/views/csv_export/index.html.haml
================================================
.card.bg-light
.card-body
%h2= current_page_title
%p
A grid can export itself in the form of a CSV file. The contents of the file corresponds to the selected subset of all records,
that is, the CSV export follows the state of filters and sorting.
%p
To enable CSV export for a grid please do the following:
%ol
%li Make sure that the grid helper is in its own partial and there are no other elements in that partial including whitespaces
%li
Enable CSV export by adding
%code enable_export_to_csv: true
to
%code initialize_grid
%li
Set the name of the exported file using option
%code :csv_file_name
in
%code initialize_grid
%li
Change the CSV field separator by adding
%code csv_field_separator: 'your-separator'
to
%code initialize_grid
\.
The default field separator is the comma, and you can change the default by editing the value of
%code Wice::Defaults::CSV_FIELD_SEPARATOR
in the config file
%li
The action code should be finished by a call to
%code export_grid_if_requested
\:
:plain
export_grid_if_requested('g1' => 'tasks_grid', 'g2' => 'projects_grid') do
# usual render or redirect code executed if the request is not a CSV export request
end
The block is executed if the call is not a request for a CSV file, so place your usual
%code redirect_to
,
%code render
inside the block, or just skip it if your action does not have an explicit render:
:plain
export_grid_if_requested('g1' => 'tasks_grid', 'g2' => 'projects_grid')
The keys of the hash submitted as an argument to
%code export_grid_if_requested
are names of grids, and the values are names of partials where the grids are defined.
%li
If a column definition contains markup, first disable its export to CSV adding
%code in_csv: false
to the column definition, and then duplicate the column definition without the markup in the block while adding
%code in_html: false
to the column definition. Any filter related parameters like
%code :attribute
,
%code :assoc
, or
%code :custom_filter
can be skipped in a CSV-only column.
%li
If you need an external CSV export button , add class
%code wg-external-csv-export-button
to any clickable element on page
and set its attribute
%code data-grid-name
to the name of the grid. If you need to disable the default export icon in the grid, add
%code hide_csv_button: true
to the
%code grid
helper.
= show_code
%p
%button.btn.btn-primary.wg-external-csv-export-button{'data-grid-name' => 'g1'} Export To CSV
.row
.col-md-12
=render 'projects_grid'
.row
.col-md-12
=render 'tasks_grid'
================================================
FILE: spec/support/test_app/app/views/custom_filter_params/_grid.html.erb
================================================
<%= grid(@projects_grid) do |g|
g.column name: 'Project Name', attribute: 'name' do |project|
link_to(project.name,
tasks_path(
wice_grid_custom_filter_params(
grid_name: 'grid',
attribute: 'project_id',
value: project.id )))
end
end -%>
================================================
FILE: spec/support/test_app/app/views/custom_filter_params/index.html.haml
================================================
.card.bg-light
.card-body
%h2= current_page_title
%p
Helper
%code wice_grid_custom_filter_params
simplifies generation of links with HTTP parameters understood by WiceGrid custom filter parameters.
= show_code
.row
.col-md-4
= render 'grid'
================================================
FILE: spec/support/test_app/app/views/custom_filters1/_g1.html.erb
================================================
<%= grid(@versions_grid1) do |g|
g.column name: 'Project', attribute: 'name', assoc: :project, filter: false
g.column name: 'Version name', attribute: 'name', filter: false
g.column name: 'Status', attribute: 'status', custom_filter: {'Development' => 'development', 'Testing' => 'testing', 'Production' => 'production'}
end -%>
================================================
FILE: spec/support/test_app/app/views/custom_filters1/_g2.html.erb
================================================
<%= grid(@versions_grid2) do |g|
g.column name: 'Project', attribute: 'name', assoc: :project, filter: false
g.column name: 'Version name', attribute: 'name', filter: false
g.column name: 'Status', attribute: 'status',
custom_filter: [['Development', 'development'], ['Testing', 'testing'], ['Production', 'production']]
end -%>
================================================
FILE: spec/support/test_app/app/views/custom_filters1/_g3.html.erb
================================================
<%= grid(@versions_grid3) do |g|
g.column name: 'Project', attribute: 'name', assoc: :project, filter: false
g.column name: 'Version name', attribute: 'name', filter: false
g.column name: 'Status', attribute: 'status',
custom_filter: ['development', 'testing', 'production']
end -%>
================================================
FILE: spec/support/test_app/app/views/custom_filters1/_g4.html.erb
================================================
<%= grid(@versions_grid4) do |g|
g.column name: 'Project', attribute: 'name', assoc: :project, filter: false
g.column name: 'Version name', attribute: 'name', filter: false
g.column name: 'Status', attribute: 'status', custom_filter: :auto
end -%>
================================================
FILE: spec/support/test_app/app/views/custom_filters1/index.html.haml
================================================
.card.bg-light
.card-body
%h2= current_page_title
%p
Just like
%code options_for_select
,
%code :custom_filter
can take arguments in the form of a hash, an array of two element arrays, or just an array.
%p
%code custom_filter: :auto
will instruct WiceGrid to figure out the list of possible values by running a
%code SELECT DISTINCT `column` FROM `table`
query on the table.
= show_code
.row
.col-md-6
= render 'g1'
.col-md-6
= render 'g2'
.row
.col-md-6
= render 'g3'
.col-md-6
= render 'g4'
================================================
FILE: spec/support/test_app/app/views/custom_filters2/_grid.html.erb
================================================
<%= grid(@tasks_grid) do |g|
g.column name: 'ID', attribute: 'id', filter: false
g.column name: 'Title', attribute: 'title'
g.column name: 'Priority', attribute: 'name', assoc: :priority, custom_filter: %w(Anecdotic High Low Normal Urgent) do |task|
task.priority.name if task.priority
end
g.column name: 'Status', attribute: 'status_id', custom_filter: Status.to_dropdown do |task|
task.status.name if task.status
end
g.column name: 'Project Name', attribute: 'project_id', custom_filter: Project.to_dropdown do |task|
task.project.name if task.project
end
g.column name: 'Archived', attribute: 'archived' do |task|
task.archived? ? 'Yes' : 'No'
end
g.column name: 'Added', attribute: 'created_at' do |task|
task.created_at.to_fs(:short)
end
g.column do |task|
link_to('Edit', edit_task_path(task))
end
end -%>
================================================
FILE: spec/support/test_app/app/views/custom_filters2/index.html.haml
================================================
.card.bg-light
.card-body
%h2= current_page_title
%p
There are two approaches to custom filters with joined tables. The first thing that comes to mind is to define
a column of a joined table with
%code :attribute
and
%code :assoc
, and submit a list of all possible values of this column to
%code :custom_filter
, like it is done in the example below in the Priority column:
%p
%code g.column name: 'Priority', attribute: 'name', assoc: :priority, custom_filter: %w(Anecdotic High Low Normal Urgent) do |task|
%p
This works but such a filter produces a query with a
%code WHERE
clause comparing a varchar field with one of the string values submitted to
%code :custom_filter
\.
This is not guaranteed to be as efficient as comparing an indexed integer foreign key with an integer primary key, thus, this approach is highly advised against.
%p
To implement filtering by foreign keys, define the column with the foreign key in
%code :attribute
and submit a hash or a two element array containing the IDs and labels of the joined table to
%code :attribute
\.
This has a negative side effect on sorting - the column will now be sorted according to the numerical value of the foreign key.
It can be dealt with by overiding sorting by
%code :custom_order
in
%code initialize_grid
\:
%p
%code custom_order: {'tasks.status_id' => 'statuses.position', 'tasks.project_id' => 'projects.name'}
= show_code
.row
.col-md-12
= render 'grid'
================================================
FILE: spec/support/test_app/app/views/custom_filters3/_grid.html.erb
================================================
<%= grid(@tasks_grid) do |g|
g.column name: 'ID', attribute: 'id', filter: false
g.column name: 'Title', attribute: 'title'
g.column name: 'Found in version', assoc: :relevant_version, attribute: 'name', custom_filter: :auto do |task|
task.relevant_version.name if task.relevant_version
end
g.column name: 'Expected in version', attribute: 'expected_version_id', custom_filter: [:expected_version, :to_option] do |task|
task.expected_version.name if task.expected_version
end
g.column do |task|
link_to('Edit', edit_task_path(task))
end
end -%>
================================================
FILE: spec/support/test_app/app/views/custom_filters3/index.html.haml
================================================
.card.bg-light
.card-body
%h2= current_page_title
%p
An array of symbols submitted to
%code :custom_filter
has a special meaning. The first symbol is sent as a method name to EVERY ActiveRecord object.
If an object responds to this method, the second method name is sent to the returned value unless it is nil, and so on.
The dropdown is populated by the list unique values.
The conditions set up by the user are ignored, that is, the records used are all those found on all pages without any active filters.
Naturally this can be extremely inneffective and should be used with caution.
= show_code
.row
.col-md-12
= render 'grid'
================================================
FILE: spec/support/test_app/app/views/custom_filters4/_grid.html.erb
================================================
<%= grid(@tasks_grid) do |g|
g.column name: 'ID', attribute: 'id', filter: false
g.column name: 'Title', attribute: 'title'
g.column name: 'Found in version', assoc: :relevant_version,
attribute: 'name', custom_filter: :auto, allow_multiple_selection: false do |task|
task.relevant_version.name if task.relevant_version
end
g.column name: 'Expected in version', attribute: 'expected_version_id',
custom_filter: [:expected_version, :to_option], allow_multiple_selection: false do |task|
task.expected_version.name if task.expected_version
end
g.column do |task|
link_to('Edit', edit_task_path(task))
end
end -%>
================================================
FILE: spec/support/test_app/app/views/custom_filters4/index.html.haml
================================================
.card.bg-light
.card-body
%h2= current_page_title
%p
Use
%code allow_multiple_selection: false
to turn off mutiple selection in custom filters.
= show_code
.row
.col-md-12
= render 'grid'
================================================
FILE: spec/support/test_app/app/views/custom_ordering/_grid.html.erb
================================================
<%= grid(grid, show_filters: :always) do |g|
g.column name: 'ID', attribute: 'id', filter: false
g.column name: 'Status Name', attribute: 'name'
g.column name: 'Created' do |status|
status.created_at.to_fs(:db) if status.created_at
end
end -%>
================================================
FILE: spec/support/test_app/app/views/custom_ordering/index.html.haml
================================================
:css
table.my-grid {
border: 1px solid red;
}
table.my-grid tr.my-header {
background-color: #ebebeb;
}
.card.bg-light
.card-body
%h2= current_page_title
%p
It is possible to override the default ordering by specifying SQL Strings.
"Status Name" in the first table is done by the length of the status name.
Ordering "Status Name" in the second table is actually replaced by ordering
by column.
= show_code
.row
.col-md-6
= render 'grid', grid: @status_grid1
.col-md-6
= render 'grid', grid: @status_grid2
================================================
FILE: spec/support/test_app/app/views/custom_ordering_on_calculated/_grid.html.erb
================================================
<%= grid(grid, show_filters: :always) do |g|
g.column name: 'ID', attribute: 'id', filter: false
g.column name: 'Status Name', attribute: 'name'
g.column name: 'Created' do |status|
status.created_at.to_fs(:db) if status.created_at
end
g.column name: 'Task Count', attribute: 'task_count', sort_by: ->(status) { status.tasks.count } do |status|
status.tasks.count
end
end -%>
================================================
FILE: spec/support/test_app/app/views/custom_ordering_on_calculated/index.html.haml
================================================
:css
table.my-grid {
border: 1px solid red;
}
table.my-grid tr.my-header {
background-color: #ebebeb;
}
.card.bg-light
.card-body
%h2= current_page_title
%p
It is possible to support ordering on calculated fields with custom_sort. When using this method you must specify
an (arbitrary) attribute name, which is used as a query parameter.
%p
Note that this method requires loading every result of the query into memory and running the Proc on each, so is
unsuitable for a large number of results or expensive calculations.
= show_code
.row
.col-md-6
= render 'grid', grid: @status_grid
================================================
FILE: spec/support/test_app/app/views/custom_ordering_with_arel/_grid.html.erb
================================================
<%= grid(grid, show_filters: :always) do |g|
g.column name: 'ID', attribute: 'id', filter: false
g.column name: 'Status Name', attribute: 'name'
g.column name: 'Created' do |status|
status.created_at.to_fs(:db) if status.created_at
end
end -%>
================================================
FILE: spec/support/test_app/app/views/custom_ordering_with_arel/index.html.haml
================================================
:css
table.my-grid {
border: 1px solid red;
}
table.my-grid tr.my-header {
background-color: #ebebeb;
}
.card.bg-light
.card-body
%h2= current_page_title
%p
It is possible to override the default ordering by specifying Arel objects. "Status Name" in the first table is done
by the length of the status name. Ordering "Status Name" in the second table is actually replaced by ordering
by column.
= show_code
.row
.col-md-6
= render 'grid', grid: @status_grid1
.col-md-6
= render 'grid', grid: @status_grid2
================================================
FILE: spec/support/test_app/app/views/custom_ordering_with_proc/_grid.html.erb
================================================
<%= grid(grid, show_filters: :always) do |g|
g.column name: 'ID', attribute: 'id', filter: false
g.column name: 'Status Name', attribute: 'name'
g.column name: 'Created' do |status|
status.created_at.to_fs(:db) if status.created_at
end
end -%>
================================================
FILE: spec/support/test_app/app/views/custom_ordering_with_proc/index.html.haml
================================================
:css
table.my-grid {
border: 1px solid red;
}
table.my-grid tr.my-header {
background-color: #ebebeb;
}
.card.bg-light
.card-body
%h2= current_page_title
%p
It is possible to override the default ordering by specifying a Proc which generates custom sql code. "Status Name"
is sorted alphabetically unless
= link_to 'a sort_by_length parameter is in the request.', sort_by_length: true
= show_code
.row
.col-md-6
= render 'grid', grid: @status_grid
================================================
FILE: spec/support/test_app/app/views/custom_ordering_with_ruby/_grid.html.erb
================================================
<%= grid(grid, show_filters: :always) do |g|
g.column name: 'ID', attribute: 'id', filter: false
g.column name: 'Status Name', attribute: 'name', sort_by: ->(status) { [status.number_of_vowels, status] }
g.column name: 'Created' do |status|
status.created_at.to_fs(:db) if status.created_at
end
end -%>
================================================
FILE: spec/support/test_app/app/views/custom_ordering_with_ruby/index.html.haml
================================================
:css
table.my-grid {
border: 1px solid red;
}
table.my-grid tr.my-header {
background-color: #ebebeb;
}
.card.bg-light
.card-body
%h2= current_page_title
%p
It is possible to override the default ordering by specifying a Proc to define the key to sort on. This key can be
a method of the model or other Ruby code. "Status Name" sorts on Status#number_of_vowels.
%p
Note that this method requires loading every result of the query into memory and running the Proc on each, so is
unsuitable for a large number of results or expensive calculations.
= show_code
.row
.col-md-6
= render 'grid', grid: @status_grid
================================================
FILE: spec/support/test_app/app/views/dates/_grid.html.erb
================================================
<%= grid(@tasks_grid) do |g|
g.column name: 'ID', attribute: 'id', filter: false
g.column name: 'Title', attribute: 'title'
g.column name: 'Archived', attribute: 'archived' do |task|
task.archived? ? 'Yes' : 'No'
end
g.column name: 'Due Date', attribute: 'due_date' do |task|
task.due_date if task.due_date
end
g.column name: 'Added', attribute: 'created_at' do |task|
task.created_at.to_fs(:db)
end
g.column name: 'Updated', attribute: 'updated_at', filter_type: :rails_datetime_helper, filter_control_options: {start_year: 2021} do |task|
task.updated_at.to_fs(:db)
end
end -%>
================================================
FILE: spec/support/test_app/app/views/dates/index.html.haml
================================================
.card.bg-light
.card-body
%h2= current_page_title
%p
WiceGrid provides four filters for selecting dates and time:
%ul
%li
%code
\:jquery_datepicker
\- Jquery datepicker (works for datetime, too)
%li
%code
\:bootstrap_datepicker
\- Bootstrap datepicker (works for datetime, too)
%li
%code
\:rails_date_helper
\- standard Rails date helper
%li
%code
\:rails_datetime_helper
\- standard Rails datetime helper
Specify a date/datetime filter just like you specify any other filter:
%p
Default filters are defined in configuration constants
%code
Wice::Defaults::DEFAULT_FILTER_FOR_DATE
and
%code
Wice::Defaults::DEFAULT_FILTER_FOR_DATETIME.
By default
%code
\:jquery_datepicker
is used for both dates and time.
= show_code
.row
.col-md-12
= render 'grid'
================================================
FILE: spec/support/test_app/app/views/detached_filters/_grid.html.erb
================================================
<%= define_grid(@tasks_grid, hide_submit_button: true, hide_reset_button: true) do |g|
g.column name: 'ID', attribute: 'id', detach_with_id: :id_filter
g.column name: 'Title', attribute: 'title', detach_with_id: :title_filter
g.column name: 'Description', attribute: 'description', detach_with_id: :description_filter
g.column name: 'Archived', attribute: 'archived', detach_with_id: :archived_filter do |task|
task.archived? ? 'Yes' : 'No'
end
g.column name: 'Due Date', attribute: 'due_date', detach_with_id: :due_date do |task|
task.due_date.to_fs(:short)
end
g.column do |task|
link_to('Edit', edit_task_path(task))
end
end -%>
================================================
FILE: spec/support/test_app/app/views/detached_filters/index.html.haml
================================================
.card.bg-light
.card-body
%h2= current_page_title
%p
Filters can also be detached from the grid table. This is a 3-step process.
%ol
%li
First, define the grid with helper
%code define_grid
instead of
%code grid
\. Everything should be done the same way as with
%code grid, but every column which will have an external filter, add
%code detach_with_id: :some_filter_name
in the
%code column
definition.
%li
Then use
%code grid_filter(grid, :some_filter_name)
to render filters.
%li
Finally, use
%code render_grid(@grid)
to actually output the grid table
\.
= show_code
= render 'grid'
.row
.col-md-2
ID:
.col-md-10
= grid_filter @tasks_grid, :id_filter
.row
.col-md-2
Title:
.col-md-3
= grid_filter @tasks_grid, :title_filter
.col-md-7
.row
.col-md-2
Description:
.col-md-3
= grid_filter @tasks_grid, :description_filter
.col-md-7
.row
.col-md-2
Archived:
.col-md-10
= grid_filter @tasks_grid, :archived_filter
.row
.col-md-2
Due date:
.col-md-10
= grid_filter @tasks_grid, :due_date
.row
.col-md-12
.external-buttons
%button.btn.btn-primary.wg-external-submit-button{'data-grid-name' => 'grid'} Submit
%button.btn.btn-default.wg-external-reset-button{'data-grid-name' => 'grid'} Reset
.row
.col-md-12
= render_grid(@tasks_grid)
================================================
FILE: spec/support/test_app/app/views/detached_filters_two_grids/_grid.html.erb
================================================
<%= define_grid(tasks_grid, hide_submit_button: true, hide_reset_button: true) do |g|
g.column name: 'ID', attribute: 'id', detach_with_id: :id_filter
g.column name: 'Title', attribute: 'title', detach_with_id: :title_filter
g.column name: 'Description', attribute: 'description', detach_with_id: :description_filter
g.column name: 'Archived', attribute: 'archived', detach_with_id: :archived_filter do |task|
task.archived? ? 'Yes' : 'No'
end
g.column name: 'Due Date', attribute: 'due_date', detach_with_id: :due_date do |task|
task.due_date.to_fs(:db)
end
g.column do |task|
link_to('Edit', edit_task_path(task))
end
end -%>
================================================
FILE: spec/support/test_app/app/views/detached_filters_two_grids/index.html.haml
================================================
.card.bg-light
.card-body
%h2= current_page_title
%p
An example of two grids with detached filters functioning independantly of each other.
= show_code
= render 'grid', tasks_grid: @grid1
= render 'grid', tasks_grid: @grid2
.row
.col-md-2
ID:
.col-md-4
= grid_filter @grid1, :id_filter
.col-md-2
ID:
.col-md-4
= grid_filter @grid2, :id_filter
.row
.col-md-2
Title:
.col-md-4
= grid_filter @grid1, :title_filter
.col-md-2
Title:
.col-md-4
= grid_filter @grid2, :title_filter
.row
.col-md-2
Description:
.col-md-4
= grid_filter @grid1, :description_filter
.col-md-2
Description:
.col-md-4
= grid_filter @grid2, :description_filter
.row
.col-md-2
Archived:
.col-md-4
= grid_filter @grid1, :archived_filter
.col-md-2
Archived:
.col-md-4
= grid_filter @grid2, :archived_filter
.row
.col-md-2
Due date:
.col-md-4
= grid_filter @grid1, :due_date
.col-md-2
Due date:
.col-md-4
= grid_filter @grid2, :due_date
.row
.col-md-6
.external-buttons-grid1
%button.btn.btn-primary.wg-external-submit-button{'data-grid-name' => 'grid'} Submit
%button.btn.btn-default.wg-external-reset-button{'data-grid-name' => 'grid'} Reset
.col-md-6
.external-buttons-grid2
%button.btn.btn-primary.wg-external-submit-button{'data-grid-name' => 'grid2'} Submit
%button.btn.btn-default.wg-external-reset-button{'data-grid-name' => 'grid2'} Reset
%p
.row
.col-md-6
= render_grid(@grid1)
.col-md-6
= render_grid(@grid2)
================================================
FILE: spec/support/test_app/app/views/disable_all_filters/_grid.html.erb
================================================
<%= grid(@tasks_grid, show_filters: :no) do |g|
g.column name: 'ID', attribute: 'id'
g.column name: 'Title', attribute: 'title'
g.column name: 'Description', attribute: 'description'
g.column name: 'Archived', attribute: 'archived' do |task|
task.archived? ? 'Yes' : 'No'
end
g.column name: 'Added', attribute: 'created_at' do |task|
task.created_at.to_fs(:short)
end
g.column do |task|
link_to('Edit', edit_task_path(task))
end
end -%>
================================================
FILE: spec/support/test_app/app/views/disable_all_filters/index.html.haml
================================================
.card.bg-light
.card-body
%h2= current_page_title
%p
To disable all filters at once use
%code show_filters: :no
as a
%code grid
parameter .
= show_code
.row
.col-md-12
= render 'grid'
================================================
FILE: spec/support/test_app/app/views/hiding_checkboxes_in_action_column/_grid.html.erb
================================================
<%= grid(@tasks_grid) do |g|
g.action_column html_check_box: false do |task|
task.status.name != 'Assigned'
end
g.column name: 'ID', attribute: 'id', filter_type: :range
g.column name: 'Title', attribute: 'title', negation: true
g.column name: 'Archived', attribute: 'archived' do |rec|
rec.archived? ? 'Yes' : 'No'
end
g.column name: 'Status', attribute: 'status_id', custom_filter: Status.to_dropdown do |task|
task.status.name if task.status
end
g.column name: 'Project Name', attribute: 'project_id', custom_filter: Project.to_dropdown do |task|
task.project.name if task.project
end
g.column name: 'Due Date', attribute: 'due_date' do |task|
task.due_date if task.due_date
end
g.column name: 'Added', attribute: 'created_at' do |task|
task.created_at.to_fs(:db)
end
end -%>
================================================
FILE: spec/support/test_app/app/views/hiding_checkboxes_in_action_column/index.html.haml
================================================
.card.bg-light
.card-body
%h2= current_page_title
%p
You can hide a certain action checkbox if you add the usual block to
%code g.action_column
, just like with the
%code g.column
definition. If the block returns
%code nil
or
%code false
no checkbox will be rendered.
= show_code
= dump_filter_parameters_as_hidden_fields(@tasks_grid)
= form_for '#', method: :get do
- if @selected
.card.bg-light
.card-body
Selected tasks:
= @selected.to_sentence
.row
.col-md-12
%p
%button.btn.btn-default{'type' => 'submit'} Process tasks
= render 'grid'
%p
%button.btn.btn-default{'type' => 'submit'} Process tasks
================================================
FILE: spec/support/test_app/app/views/integration_with_application_view/_grid.html.erb
================================================
<%= grid(@tasks_grid, hide_submit_button: true) do |g|
g.column name: 'ID', attribute: 'id', filter: false
g.column name: 'Title', attribute: 'title', auto_reload: true
g.column name: 'Priority', attribute: 'priority_id', custom_filter: Priority.to_dropdown, auto_reload: true do |task|
task.priority.name if task.priority
end
g.column name: 'Status', attribute: 'status_id', custom_filter: Status.to_dropdown, auto_reload: true do |task|
task.status.name if task.status
end
g.column name: 'Project Name', attribute: 'project_id', custom_filter: Project.to_dropdown, auto_reload: true do |task|
task.project.name if task.project
end
g.column name: 'Archived', attribute: 'archived', auto_reload: true do |task|
task.archived? ? 'Yes' : 'No'
end
g.column name: 'Added', attribute: 'created_at', auto_reload: true do |task|
task.created_at.to_fs(:short)
end
end -%>
================================================
FILE: spec/support/test_app/app/views/integration_with_application_view/index.html.haml
================================================
.card.bg-light
.card-body
%h2= current_page_title
%p
Method
%code current_page_records
sent to the grid object returns a list of all ActiveRecord objects currently displayed on the page.
%p
Method
%code all_pages_records
returns a list of all ActiveRecord objects throughout all pages of the current selection.
%code all_pages_records
causes an additional SQL query to be executed and has to be used with care.
%p Both methods can be used after the grid definition only.
= show_code
= render 'grid'
.row
.col-md-6
.card.bg-light
.card-body
- current_page_records = @tasks_grid.current_page_records
= current_page_records.size
records on the current page:
= current_page_records.map(&:id).to_sentence
.col-md-6
.card.bg-light
.card-body
- all_pages_records = @tasks_grid.all_pages_records
= all_pages_records.size
records throughout all pages:
= all_pages_records.map(&:id).to_sentence
================================================
FILE: spec/support/test_app/app/views/integration_with_forms/_grid.html.erb
================================================
<%= grid(@tasks_grid) do |g|
g.column name: 'ID', attribute: 'id', filter_type: :range
g.column name: 'Title', attribute: 'title', negation: true
g.column name: 'Status', attribute: 'status_id', custom_filter: Status.to_dropdown do |task|
task.status.name if task.status
end
g.column name: 'Project Name', attribute: 'project_id', custom_filter: Project.to_dropdown do |task|
task.project.name if task.project
end
g.column name: 'Due Date', attribute: 'due_date' do |task|
task.due_date if task.due_date
end
g.column name: 'Added', attribute: 'created_at' do |task|
task.created_at.to_fs(:db)
end
end -%>
================================================
FILE: spec/support/test_app/app/views/integration_with_forms/index.html.haml
================================================
.card.bg-light
.card-body
%h2= current_page_title
%p
In addition to including
%a{href: action_column_index_path}a grid into a form
it is possible to dump the state of filters into another form as a set of hidden parameters with helper
%code dump_filter_parameters_as_hidden_fields(grid_object)
\.
= show_code
= form_tag(integration_with_forms_path, method: :get) do
= dump_filter_parameters_as_hidden_fields(@tasks_grid)
%p= select_tag 'archived', options_for_select([['View active tasks', 0], ['View archived tasks', 1]], @archived ? 1 : 0), class: 'reload-on-change form-control'
= render 'grid'
================================================
FILE: spec/support/test_app/app/views/joining_tables/_grid.html.erb
================================================
<%= grid(@tasks_grid, show_filters: :always) do |g|
g.column name: 'ID', attribute: 'id', filter: false
g.column name: 'Title', attribute: 'title'
g.column name: 'Priority', attribute: 'name', assoc: :priority
g.column name: 'Status', attribute: 'name', assoc: :status
g.column name: 'Project Name', attribute: 'name', assoc: :project
g.column name: 'Customer', attribute: 'name', assoc: [:project, :customer]
g.column name: 'Assigned To', attribute: 'name', assoc: :assigned_users do |task|
task.assigned_users.collect{|user| user.name}.to_sentence
end
g.column do |task|
link_to('Edit', edit_task_path(task))
end
end -%>
================================================
FILE: spec/support/test_app/app/views/joining_tables/index.html.haml
================================================
.card.bg-light
.card-body
%h2= current_page_title
%p
Use
%code :include
in
%code :initialize_grid
to include associated tables.
%code :include
can be a single association name, an array of association names.
If you need to join tables to joined tabes, use hashes, for example:
%code include: [:priority, :status, {project: :customer}]
%p
To define a column from a joined table, use
%code :assoc
to specify a the corresponding association.
If you need to join a table to a joined table,
list associations in an array on the correct order
(look at the customer column).
%p
You can drop a block if you don't need any special markup.
= show_code
= render 'grid'
================================================
FILE: spec/support/test_app/app/views/layouts/application.html.haml
================================================
!!! 5
%html
%head
%title WiceGrid Examples
= stylesheet_link_tag "application", "data-turbo-track": "reload"
= javascript_importmap_tags
= favicon_link_tag 'favicon.ico'
= csrf_meta_tags
-# %meta{name: "turbo-prefetch", content: "false"}
%body
.container-fluid
%header
%h1
WiceGrid
= Gem.loaded_specs['wice_grid'].version.to_s
examples
.example-navigator
%ul.pagination
- previous_example_controller, next_example_controller = previous_next_example_urls
- if previous_example_controller
%li.previous.page-item
=link_to "← Previous", {controller: previous_example_controller, action: :index}, class: 'page-link'
-if next_example_controller
%li.next.page-item
=link_to "Next →", {controller: next_example_controller, action: :index}, class: 'page-link'
.clear
.row
.col-md-3
.card.bg-light
.card-body
%ul.nav-pills
- @example_map.each do |title, examples|
%li.navbar= title
- examples.each do |example_controller, name, _|
- if example_controller.to_s == controller_name
- active_klass = ' active'
- @example_name = name
- else
- active_klass = nil
%li{class: "nav-link#{active_klass}"}
= link_to name, controller: example_controller, action: :index
.col-md-9
=yield
%hr
%footer
© Yury Leikind 2012 - 2015
%span.sources
%a{href: "https://github.com/leikind/wice_grid"} Sources
%a{href: "https://github.com/leikind/wice_grid", target: "_blank"}
= image_tag 'forkme_right_gray.png',
style: "position: absolute; top: 0; right: 0; border: 0;;",
alt: "Fork me on GitHub"
================================================
FILE: spec/support/test_app/app/views/localization/_grid.html.erb
================================================
<%= grid(@tasks_grid, show_filters: :always) do |g|
g.column name: 'ID', attribute: 'id', filter: false
g.column name: 'Title', attribute: 'title'
g.column name: 'Priority', attribute: 'priority_id', custom_filter: Priority.to_dropdown do |task|
task.priority.name if task.priority
end
g.column name: 'Status', attribute: 'status_id', custom_filter: Status.to_dropdown do |task|
task.status.name if task.status
end
g.column name: 'Project Name', attribute: 'project_id', custom_filter: Project.to_dropdown do |task|
task.project.name if task.project
end
g.column name: 'Archived', attribute: 'archived' do |task|
task.archived? ? 'Yes' : 'No'
end
g.column name: 'Due Date', attribute: 'due_date' do |task|
task.due_date.to_fs(:short)
end
g.column name: 'Added', attribute: 'created_at' do |task|
task.created_at.to_fs(:short)
end
g.column do |task|
link_to('Edit', edit_task_path(task))
end
end
%>
================================================
FILE: spec/support/test_app/app/views/localization/index.html.haml
================================================
.card.bg-light
.card-body
%h2= current_page_title
%p
WiceGrid integrated well with I18n.
Edit file
%code wice_grid.yml
to add or change languages.
= show_code
%ul.nav.nav-pills
- current = session[:lang].to_s
- ['en', 'nl', 'fr', 'is'].each do |lang|
- klass = current == lang ? 'active' : nil
%li{class: klass}
%a{href:url_for(lang: lang)}= lang
= render 'grid'
================================================
FILE: spec/support/test_app/app/views/many_grids_on_page/_tasks_grid1.html.erb
================================================
<%= grid(@tasks_grid1) do |g|
g.column name: 'Title', attribute: 'title'
g.column name: 'Description', attribute: 'description'
g.column name: 'Archived', attribute: 'archived' do |task|
task.archived? ? 'Yes' : 'No'
end
end -%>
================================================
FILE: spec/support/test_app/app/views/many_grids_on_page/_tasks_grid2.html.erb
================================================
<%= grid(@tasks_grid2) do |g|
g.column name: 'Title', attribute: 'title'
g.column name: 'Description', attribute: 'description'
g.column name: 'Archived', attribute: 'archived' do |task|
task.archived? ? 'Yes' : 'No'
end
end -%>
================================================
FILE: spec/support/test_app/app/views/many_grids_on_page/index.html.haml
================================================
.card.bg-light
.card-body
%h2= current_page_title
%p
There can be many grids on one page, but in order to work correctly and independantly
from each other they should
all have different names. A grid name is the basis and the scope for all CSS classes and HTTP
parameters of the grid. By default the name of a grid is
%code grid
and in case there is only one grid on a page defining the name is not required unless it
clashes with some other form field names.
Define the name with the
%code :name
parameter of the
%code initialize_grid
method.
= show_code
.row.many-grids-on-page
.col-md-6
.example1= render 'tasks_grid1'
.col-md-6
.example2= render 'tasks_grid2'
================================================
FILE: spec/support/test_app/app/views/negation/_grid.html.erb
================================================
<%= grid(@tasks_grid) do |g|
g.column name: 'ID', attribute: 'id', filter: false
g.column name: 'Title', attribute: 'title', negation: true
g.column name: 'Priority', attribute: 'priority_id', custom_filter: Priority.to_dropdown do |task|
task.priority.name if task.priority
end
g.column name: 'Status', attribute: 'status_id', custom_filter: Status.to_dropdown do |task|
task.status.name if task.status
end
g.column name: 'Project Name', attribute: 'project_id', custom_filter: Project.to_dropdown do |task|
task.project.name if task.project
end
g.column name: 'Archived', attribute: 'archived' do |task|
task.archived? ? 'Yes' : 'No'
end
g.column name: 'Added', attribute: 'created_at' do |task|
task.created_at.to_fs(:short)
end
g.column do |task|
link_to('Edit', edit_task_path(task))
end
end -%>
================================================
FILE: spec/support/test_app/app/views/negation/index.html.haml
================================================
.card.bg-light
.card-body
%h2= current_page_title
%p
%code negation: true
adds a checkox to a text filter. The checked checkbox is the logical
%i NOT
\- it changes the semantics of a text filter to
%b not
showing all records with a matching substring.
= show_code
.row
.col-md-12
= render 'grid'
================================================
FILE: spec/support/test_app/app/views/no_records/_empty_grid.html.haml
================================================
.card.bg-light
.card-body
No records found
================================================
FILE: spec/support/test_app/app/views/no_records/_grid1.html.erb
================================================
<%= grid(@tasks_grid) do |g|
g.blank_slate do
content_tag :div, "No records found", class: 'well'
end
g.column name: 'ID', attribute: 'id'
g.column name: 'Title', attribute: 'title'
end -%>
================================================
FILE: spec/support/test_app/app/views/no_records/_grid2.html.erb
================================================
<%= grid(@tasks_grid2) do |g|
g.blank_slate content_tag(:div, "No records found", class: 'well')
g.column name: 'ID', attribute: 'id'
g.column name: 'Title', attribute: 'title'
end -%>
================================================
FILE: spec/support/test_app/app/views/no_records/_grid3.html.erb
================================================
<%= grid(@tasks_grid3) do |g|
g.blank_slate partial: "empty_grid"
g.column name: 'ID', attribute: 'id'
g.column name: 'Title', attribute: 'title'
end -%>
================================================
FILE: spec/support/test_app/app/views/no_records/index.html.haml
================================================
.card.bg-light
.card-body
%h2= current_page_title
%p
What if there no records to render in a grid?
There are three ways to define what to show in this case:
%ul
%li
%code blank_slate
with a block. This looks like a column definition, but the value
returned by the block is rendred when there are no records.
%li
%code blank_slate
whithout a block, but with one string argument.
%li
%code blank_slate
with parameter
%code partial: "partial_name"
which defines a partial to render.
= show_code
.example1= render 'grid1'
.example2= render 'grid2'
.example3= render 'grid3'
================================================
FILE: spec/support/test_app/app/views/null_values/_grid.html.erb
================================================
<%= grid(@tasks_grid) do |g|
g.column name: 'ID', attribute: 'id', filter: false
g.column name: 'Title', attribute: 'title'
g.column name: 'Priority', attribute: 'priority_id',
custom_filter: [['NOT DEFINED', 'null'], ['DEFINED', 'not null']] + Priority.to_dropdown do |task|
task.priority.name if task.priority
end
g.column do |task|
link_to('Edit', edit_task_path(task))
end
end -%>
================================================
FILE: spec/support/test_app/app/views/null_values/index.html.haml
================================================
.card.bg-light
.card-body
%h2= current_page_title
%p
Strings
%code null
and
%code not null
in
%code custom_filter
values
are treated speacially and result in
%code IS NULL
and
%code IS NOT NULL
WHERE-clauses.
= show_code
.row
.col-md-12
= render 'grid'
================================================
FILE: spec/support/test_app/app/views/numeric_filters/_grid.html.erb
================================================
<%= grid(@tasks_grid) do |g|
g.column name: 'ID', attribute: 'id', filter_type: :range
g.column name: 'Title', attribute: 'title'
g.column name: 'Description', attribute: 'description'
g.column name: 'Archived', attribute: 'archived' do |task|
task.archived? ? 'Yes' : 'No'
end
g.column name: 'Due Date', attribute: 'due_date'
g.column do |task|
link_to('Edit', edit_task_path(task))
end
end -%>
================================================
FILE: spec/support/test_app/app/views/numeric_filters/index.html.haml
================================================
.card.bg-light
.card-body
%h2= current_page_title
%p
By default the filter for numeric columns is a one input field filter which checks for equality. You can also use a range filter which check if the value is with a range. Use
%code filter_type: :range
= show_code
.row
.col-md-12
= render 'grid'
================================================
FILE: spec/support/test_app/app/views/resultset_processings/_grid.html.erb
================================================
<%= grid(@tasks_grid, hide_submit_button: true) do |g|
g.column name: 'ID', attribute: 'id', filter: false
g.column name: 'Title', attribute: 'title', auto_reload: true
g.column name: 'Priority', attribute: 'priority_id', custom_filter: Priority.to_dropdown, auto_reload: true do |task|
task.priority.name if task.priority
end
g.column name: 'Status', attribute: 'status_id', custom_filter: Status.to_dropdown, auto_reload: true do |task|
task.status.name if task.status
end
g.column name: 'Project Name', attribute: 'project_id', custom_filter: Project.to_dropdown, auto_reload: true do |task|
task.project.name if task.project
end
g.column name: 'Archived', attribute: 'archived', auto_reload: true do |task|
task.archived? ? 'Yes' : 'No'
end
g.column name: 'Added', attribute: 'created_at', auto_reload: true do |task|
task.created_at.to_fs(:short)
end
end -%>
================================================
FILE: spec/support/test_app/app/views/resultset_processings/index.html.haml
================================================
.card.bg-light
.card-body
%h2= current_page_title
%p
In addition to
%a{href: integration_with_application_view_index_path}
%code current_page_records
and
%a{href: integration_with_application_view_index_path}
%code current_page_records
helpers a callback can be setup in the controller which is executed
when a grid page is rendered.
Though the results of that processing is rendered on page, normally such callbacks
are used for some kind of background processing.
Please notice that the callback is executed
%em after
the controller action and thus all controller instance variables have already been
injected into the view, that is why the current example has a definition of
%code @one_page_records
%em before
the callback, so that the object is injected into the view and the callback block
has access to the object as well.
The callback can be setup separately as a block:
:plain
@grid.with_paginated_resultset do |records|
...
end
or as an argument of
%code initialize_grid
where the value is the name of the method to be invoked:
:plain
@grid = initialize_grid(Task,
with_paginated_resultset: :process_records
)
= show_code
= render 'grid'
.row
.col-md-12
.card.bg-light
.card-body
= @one_page_records.size
records on the current page:
= @one_page_records.map(&:id).to_sentence
================================================
FILE: spec/support/test_app/app/views/resultset_processings2/_grid.html.erb
================================================
<%= grid(@tasks_grid, hide_submit_button: true) do |g|
g.column name: 'ID', attribute: 'id', filter: false
g.column name: 'Title', attribute: 'title', auto_reload: true
g.column name: 'Priority', attribute: 'priority_id', custom_filter: Priority.to_dropdown, auto_reload: true do |task|
task.priority.name if task.priority
end
g.column name: 'Status', attribute: 'status_id', custom_filter: Status.to_dropdown, auto_reload: true do |task|
task.status.name if task.status
end
g.column name: 'Project Name', attribute: 'project_id', custom_filter: Project.to_dropdown, auto_reload: true do |task|
task.project.name if task.project
end
g.column name: 'Archived', attribute: 'archived', auto_reload: true do |task|
task.archived? ? 'Yes' : 'No'
end
g.column name: 'Added', attribute: 'created_at', auto_reload: true do |task|
task.created_at.to_fs(:short)
end
end -%>
================================================
FILE: spec/support/test_app/app/views/resultset_processings2/index.html.haml
================================================
.card.bg-light
.card-body
%h2= current_page_title
%p
In addition to the
%a{href: resultset_processings_path}
%code with_paginated_resultset
callback
there is callback
%code with_resultset
\.
%p
Just like
%code with_paginated_resultset
it can be defined as a block and as a symbol referring to a method in the controller.
%p
The difference is that the value submitted to the method or the callback is not a list of
all records but an ActiveRelation object which can be used to obtain all records.
In the example on this page the list of all records is only obtained when button
%code Show IDs of records throughout all pages
is clicked.
%p
Normally
%code with_resultset
is used
for some kind of background processing.
The results of callback are rendered on page only for the sake of the demonstration.
= show_code
= form_tag(resultset_processings2_index_path, method: :get) do
= dump_filter_parameters_as_hidden_fields(@tasks_grid)
= hidden_field :process_selected_tasks, 1
%button#process.btn.btn-primary{type: 'submit'} Show IDs of records throughout all pages
.example
= render 'grid'
-unless controller.selected_tasks.blank?
.row
.col-md-12
.card.bg-light
.card-body
= controller.selected_tasks.size
records on all pages:
= controller.selected_tasks.map(&:id).to_sentence
================================================
FILE: spec/support/test_app/app/views/saved_queries/_grid.html.erb
================================================
<%= grid(@tasks_grid, show_filters: :always) do |g|
g.column name: 'ID', attribute: 'id', filter: false
g.column name: 'Title', attribute: 'title'
g.column name: 'Priority', attribute: 'priority_id', custom_filter: Priority.to_dropdown do |task|
task.priority.name if task.priority
end
g.column name: 'Status', attribute: 'status_id', custom_filter: Status.to_dropdown do |task|
task.status.name if task.status
end
g.column name: 'Project Name', attribute: 'project_id', custom_filter: Project.to_dropdown do |task|
task.project.name if task.project
end
g.column name: 'Archived', attribute: 'archived' do |task|
task.archived? ? 'Yes' : 'No'
end
g.column name: 'Added', attribute: 'created_at' do |task|
task.created_at.to_fs(:db)
end
g.column do |task|
link_to('Edit', edit_task_path(task))
end
end -%>
================================================
FILE: spec/support/test_app/app/views/saved_queries/index.html.haml
================================================
.card.bg-light
.card-body
%h2= current_page_title
%p
Read
%code SAVED_QUERIES_HOWTO.rdoc
for details.
= show_code
.row
.col-md-6
= saved_queries_panel(@tasks_grid, confirm: false)
= render 'grid'
================================================
FILE: spec/support/test_app/app/views/styling/_grid1.html.erb
================================================
<%= grid(@versions_grid1, html: {class: 'my-grid'}, header_tr_html: {class: 'my-header'}) do |g|
g.column name: 'ID', attribute: 'id', filter: false
g.column name: 'Project', attribute: 'name', assoc: :project do |version|
version.project.name if version.project
end
g.column name: 'Version name', attribute: 'name', html: {style: 'font-weight: bold; text-align: center'}
g.column name: 'Status', attribute: 'status', custom_filter: {'Development' => 'development', 'Testing' => 'testing', 'Production' => 'production'}
end -%>
================================================
FILE: spec/support/test_app/app/views/styling/_grid2.html.erb
================================================
<%= grid(@versions_grid2) do |g|
g.row_attributes do |version|
if version.status == 'production'
{style: 'background-color: rgb(255, 255, 204);'}
end
end
g.column name: 'ID', attribute: 'id', filter: false do |version|
if version.id.to_s.index('9')
[version.id, {style: 'background-color: rgb(255, 105, 104);'}]
else
version.id
end
end
g.column name: 'Project', attribute: 'name', assoc: :project, class: 'special-column' do |version|
if version.project
if version.project.name == 'Divine Firmware'
[version.project.name , {style: 'background-color: rgb(255, 105, 104);', class: 'some-special-class'}]
else
version.project.name
end
end
end
g.column name: 'Version name', attribute: 'name'
g.column name: 'Status', attribute: 'status', custom_filter: {'Development' => 'development', 'Testing' => 'testing', 'Production' => 'production'}
end -%>
================================================
FILE: spec/support/test_app/app/views/styling/index.html.haml
================================================
:css
table.my-grid {
border: 1px solid red;
}
table.my-grid tr.my-header {
background-color: #ebebeb;
}
.card.bg-light
.card-body
%h2= current_page_title
%ul
%li
%code :html
in the
%code grid
helper defines html arguments for the
%code table
tag.
%li
%code :header_tr_html
in the
%code grid
helper defines html attributes for the header rows with column names and filters.
%li
%code :html
in the
%code column
helper defines html attributes for the
%code td
tag.
%li
%code g.row_attributes do |record| ... end
is similar to a
%code column
definition, but returns a hash of html attributes to be added to each
%code tr.
Because the block is evaluated for each record, just like
%column
, the returned value can be calculated dynamically depending on the record.
%li
Each
%code column
block can return a 2-value array, the first value of which is the content of the cell, and
the second is a hash of html attributes for the
%code td
tag.
= show_code
.row
.col-md-12
= render 'grid1'
.row
.col-md-12
= render 'grid2'
================================================
FILE: spec/support/test_app/app/views/tasks/_grid.html.erb
================================================
<%= grid(@tasks_grid, show_filters: :always) do |g|
g.column name: 'Project Name', attribute: 'project_id', custom_filter: Project.to_dropdown do |task|
task.project.name if task.project
end
g.column name: 'Title', attribute: 'title'
# returns an array of 2-element arrays
g.column name: 'Priority', attribute: 'priority_id', custom_filter: Priority.to_dropdown do |task|
task.priority.name if task.priority
end
g.column name: 'Status', attribute: 'status_id', custom_filter: Status.to_dropdown do |task|
task.status.name if task.status
end
end -%>
================================================
FILE: spec/support/test_app/app/views/tasks/index.html.haml
================================================
= render 'grid'
================================================
FILE: spec/support/test_app/app/views/two_associations/_grid.html.erb
================================================
<%= grid(@projects_grid, show_filters: :always) do |g|
g.column name: 'ID', attribute: 'id', filter: false
g.column name: 'Project Name', attribute: 'name'
g.column name: 'Customer company', attribute: 'name', assoc: :customer
g.column name: 'Supplier company', attribute: 'name', assoc: :supplier, table_alias: 'suppliers_projects'
end -%>
================================================
FILE: spec/support/test_app/app/views/two_associations/index.html.haml
================================================
.card.bg-light
.card-body
%h2= current_page_title
%p
When two associations referring to the same model are joined, ActiveRecord
uses a table alias for one of these joins. To make it work with WiceGrid, find
the alias in the logs and specify it in a column definition with the help of
%code :table_alias
\.
= show_code
= render 'grid'
================================================
FILE: spec/support/test_app/app/views/upper_pagination_panel/_grid.html.erb
================================================
<%= grid(@tasks_grid, upper_pagination_panel: true) do |g|
g.column name: 'ID' do |task|
task.id
end
g.column name: 'Title' do |task|
task.title
end
g.column name: 'Description' do |task|
task.description
end
g.column name: 'Archived' do |task|
task.archived? ? 'Yes' : 'No'
end
g.column name: 'Added' do |task|
task.created_at.to_fs(:short)
end
g.column do |task|
link_to('Edit', edit_task_path(task))
end
end -%>
================================================
FILE: spec/support/test_app/app/views/upper_pagination_panel/index.html.haml
================================================
.card.bg-light
.card-body
%h2= current_page_title
%p
The
%code upper_pagination_panel
parameter for the
%code grid
helper forces the pagination panel to appear at at top of the grid
= show_code
.row
.col-md-12
= render 'grid'
================================================
FILE: spec/support/test_app/app/views/when_filtered/_grid.html.erb
================================================
<%= grid(@tasks_grid, show_filters: :when_filtered) do |g|
g.column name: 'ID', attribute: 'id', filter: false
g.column name: 'Title', attribute: 'title'
g.column name: 'Description', attribute: 'description'
g.column name: 'Archived', attribute: 'archived' do |task|
task.archived? ? 'Yes' : 'No'
end
g.column name: 'Due Date', attribute: 'due_date', filter: false
g.column do |task|
link_to('Edit', edit_task_path(task))
end
end -%>
================================================
FILE: spec/support/test_app/app/views/when_filtered/index.html.haml
================================================
.card.bg-light
.card-body
%h2= current_page_title
%p
%code show_filters: :when_filtered
in
%code grid
hides the filter panel but the user can make it visible by clicking on the "Show filter" panel.
%p
When any of the filters is active the filter panel is shown anyway.
= show_code
.row
.col-md-12
= render 'grid'
================================================
FILE: spec/support/test_app/bin/dartsass
================================================
#!/usr/bin/env ruby
# frozen_string_literal: true
#
# This file was generated by Bundler.
#
# The application 'dartsass' is installed as part of a gem, and
# this file is here to facilitate running it.
#
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__)
bundle_binstub = File.expand_path("bundle", __dir__)
if File.file?(bundle_binstub)
if File.read(bundle_binstub, 300).include?("This file was generated by Bundler")
load(bundle_binstub)
else
abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
end
end
require "rubygems"
require "bundler/setup"
load Gem.bin_path("dartsass-rails", "dartsass")
================================================
FILE: spec/support/test_app/bin/importmap
================================================
#!/usr/bin/env ruby
require_relative "../config/application"
require "importmap/commands"
================================================
FILE: spec/support/test_app/bin/rails
================================================
#!/usr/bin/env ruby
APP_PATH = File.expand_path('../../config/application', __FILE__)
require_relative '../config/boot'
require 'rails/commands'
================================================
FILE: spec/support/test_app/bin/rake
================================================
#!/usr/bin/env ruby
require_relative '../config/boot'
require 'rake'
Rake.application.run
================================================
FILE: spec/support/test_app/config/application.rb
================================================
# encoding: utf-8
require File.expand_path('../boot', __FILE__)
# We don't have our own Gemfile, make sure these things are loaded.
require 'rails/all'
require 'sprockets/railtie'
require 'haml'
require 'coderay'
require 'bootstrap'
require 'dartsass-rails'
require 'font-awesome-sass'
require 'importmap-rails'
require 'jquery-rails'
require 'jquery-ui-rails'
require 'jquery-ui-themes'
require "stimulus-rails"
require 'turbo-rails'
require_relative '../../../../lib/wice_grid'
module Examples
class TestApp < Rails::Application
config.load_defaults 7.1
# Settings in config/environments/* take precedence over those specified here.
# Application configuration should go into files in config/initializers
# -- all .rb files in that directory are automatically loaded.
# Custom directories with classes and modules you want to be autoloadable.
# config.autoload_paths += %W(#{config.root}/extras)
# Only load the plugins named here, in the order given (default is alphabetical).
# :all can be used as a placeholder for all plugins not explicitly named.
# config.plugins = [ :exception_notification, :ssl_requirement, :all ]
# Activate observers that should always be running.
# config.active_record.observers = :cacher, :garbage_collector, :forum_observer
# Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
# Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
# config.time_zone = 'Central Time (US & Canada)'
# The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
# config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
# config.i18n.default_locale = :de
# Configure the default encoding used in templates for Ruby 1.9.
config.encoding = 'utf-8'
# Configure sensitive parameters which will be filtered from the log file.
config.filter_parameters += [:password]
# Use SQL instead of Active Record's schema dumper when creating the database.
# This is necessary if your schema can't be completely dumped by the schema dumper,
# like if you have constraints or database-specific column types
# config.active_record.schema_format = :sql
# Enforce whitelist mode for mass assignment.
# This will create an empty whitelist of attributes available for mass-assignment for all models
# in your app. As such, your models will need to explicitly whitelist or blacklist accessible
# parameters by using an attr_accessible or attr_protected declaration.
# config.active_record.whitelist_attributes = true
# Enable the asset pipeline
config.assets.enabled = true
# Version of your assets, change this if you want to expire all your assets
config.assets.version = '1.0'
config.assets.initialize_on_precompile = false
I18n.enforce_available_locales = false
# Rails 5.2+
config.active_record.sqlite3.represent_boolean_as_integer = true if config.active_record.sqlite3
config.active_record.default_column_serializer = YAML
config.active_record.yaml_column_permitted_classes = [
ActionController::Parameters,
ActiveSupport::HashWithIndifferentAccess,
]
config.dartsass.build_options = '--style=expanded --embed-source-map'
end
end
================================================
FILE: spec/support/test_app/config/boot.rb
================================================
# encoding: utf-8
require 'rubygems'
# Set up gems listed in the Gemfile.
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE'])
================================================
FILE: spec/support/test_app/config/database.travis.yml
================================================
mysql: &mysql
adapter: mysql2
username: root
password:
database: wice_grid_test
postgres: &postgres
adapter: postgresql
username: postgres
password:
database: wice_grid_test
min_messages: ERROR
defaults: &defaults
pool: 5
timeout: 5000
host: localhost
<<: *<%= ENV['DB'] || 'postgres' %>
development:
<<: *defaults
test:
<<: *defaults
production:
<<: *defaults
================================================
FILE: spec/support/test_app/config/database.yml
================================================
defaults: &defaults
adapter: sqlite3
encoding: unicode
pool: 5
development:
<<: *defaults
database: db/development.sqlite3
test:
<<: *defaults
database: db/test.sqlite3
production:
<<: *defaults
database: db/production.sqlite3
================================================
FILE: spec/support/test_app/config/database.yml.mysql
================================================
defaults: &defaults
adapter: mysql2
encoding: utf8
pool: 5
username: root
password:
socket: /tmp/mysql.sock
development:
<<: *defaults
database: wice_grid_testbed_development
test:
<<: *defaults
database: wice_grid_testbed_test
production:
<<: *defaults
database: wice_grid_testbed_production
================================================
FILE: spec/support/test_app/config/database.yml.postgresql
================================================
defaults: &defaults
adapter: postgresql
encoding: utf8
pool: 5
username: postgres
password:
development:
<<: *defaults
database: wice_grid_testbed_development
test:
<<: *defaults
database: wice_grid_testbed_test
production:
<<: *defaults
database: wice_grid_testbed_production
================================================
FILE: spec/support/test_app/config/environment.rb
================================================
# encoding: utf-8
# Load the rails application
require_relative 'application'
# Initialize the rails application
Rails.application.initialize!
# fix for bootstrap-sass that uses depricated Regexp
indices = []
strings = []
precompile = Rails.application.config.assets.precompile
precompile.each_with_index do |string_or_regexp, index|
if string_or_regexp.is_a? Regexp
indices << index
match = string_or_regexp.source.match /(.*)\\\.\(\?:(.*?)\??\)\$$/
match[2].split('|').each do |ext|
strings << "#{match[1]}.#{ext}"
end
end
end
indices.reverse.each do |index|
precompile.delete_at index
end
strings.each do |string|
precompile << string
end
================================================
FILE: spec/support/test_app/config/environments/development.rb
================================================
# encoding: utf-8
Examples::TestApp.configure do
# Settings specified here will take precedence over those in config/application.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 web server when you make code changes.
config.cache_classes = false
# Show full error reports and disable caching
config.consider_all_requests_local = true
config.action_controller.perform_caching = false
# Don't care if the mailer can't send
config.action_mailer.raise_delivery_errors = false
# Print deprecation notices to the Rails logger
config.active_support.deprecation = :log
# Only use best-standards-support built into browsers
config.action_dispatch.best_standards_support = :builtin
config.action_dispatch.show_exceptions = :rescuable
# Do not compress assets
config.assets.compress = false
# Expands the lines which load the assets
config.assets.debug = true
config.public_file_server.enabled = false
config.eager_load = false
end
================================================
FILE: spec/support/test_app/config/environments/production.rb
================================================
# encoding: utf-8
Examples::TestApp.configure do
# Settings specified here will take precedence over those in config/application.rb
# Code is not reloaded between requests
config.cache_classes = true
# Full error reports are disabled and caching is turned on
config.consider_all_requests_local = false
config.action_controller.perform_caching = true
# Disable Rails's static asset server (Apache or nginx will already do this)
config.public_file_server.enabled = true
# Compress JavaScripts and CSS
config.assets.compress = true
# Don't fallback to assets pipeline if a precompiled asset is missed
config.assets.compile = false
# Generate digests for assets URLs
config.assets.digest = true
# Defaults to Rails.root.join("public/assets")
# config.assets.manifest = YOUR_PATH
# Specifies the header that your server uses for sending files
# config.action_dispatch.x_sendfile_header = "X-Sendfile" # for apache
# config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx
# Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
# config.force_ssl = true
# See everything in the log (default is :info)
config.log_level = :info
# Prepend all log lines with the following tags
# config.log_tags = [ :subdomain, :uuid ]
# Use a different logger for distributed setups
# config.logger = ActiveSupport::TaggedLogging.new(SyslogLogger.new)
# Use a different cache store in production
# config.cache_store = :mem_cache_store
# Enable serving of images, stylesheets, and JavaScripts from an asset server
# config.action_controller.asset_host = "http://assets.example.com"
# Precompile additional assets (application.js, application.css, and all non-JS/CSS are already added)
# config.assets.precompile += %w( search.js )
# Disable delivery errors, bad email addresses will be ignored
# config.action_mailer.raise_delivery_errors = false
# Enable threaded mode
# config.threadsafe!
# Enable locale fallbacks for I18n (makes lookups for any locale fall back to
# the I18n.default_locale when a translation can not be found)
config.i18n.fallbacks = true
# Send deprecation notices to registered listeners
config.active_support.deprecation = :notify
config.eager_load = true
end
================================================
FILE: spec/support/test_app/config/environments/test.rb
================================================
# encoding: utf-8
Examples::TestApp.configure do
# Settings specified here will take precedence over those in config/application.rb
# The test environment is used exclusively to run your application's
# test suite. You never need to work with it otherwise. Remember that
# your test database is "scratch space" for the test suite and is wiped
# and recreated between test runs. Don't rely on the data there!
config.cache_classes = true
# Configure static asset server for tests with Cache-Control for performance
config.public_file_server.enabled = true
config.public_file_server.headers = { 'Cache-Control' => 'public, max-age=3600' }
# Show full error reports and disable caching
config.consider_all_requests_local = true
config.action_controller.perform_caching = false
# Raise exceptions instead of rendering exception templates
config.action_dispatch.show_exceptions = true
# Disable request forgery protection in test environment
config.action_controller.allow_forgery_protection = false
# Tell Action Mailer not to deliver emails to the real world.
# The :test delivery method accumulates sent emails in the
# ActionMailer::Base.deliveries array.
config.action_mailer.delivery_method = :test
# Print deprecation notices to the stderr
config.active_support.deprecation = :stderr
config.eager_load = false
end
================================================
FILE: spec/support/test_app/config/importmap.rb
================================================
# Pin npm packages by running ./bin/importmap
pin "application"
pin "@hotwired/turbo-rails", to: "turbo.min.js"
pin "@hotwired/stimulus", to: "@hotwired--stimulus.js" # @3.2.2
pin "@hotwired/stimulus-loading", to: "stimulus-loading.js"
pin_all_from "app/javascript/controllers", under: "controllers"
pin "@stimulus-components/rails-nested-form", to: "@stimulus-components--rails-nested-form.js" # @5.0.0
pin "jquery", to: "jquery3.min.js", preload: true
pin "jquery-ui", to: "jquery-ui.js", preload: true
pin "wice_grid", to: "wice_grid.js", preload: true
pin "bootstrap", to: "bootstrap.min.js", preload: true
pin "@popperjs/core", to: "popper.js", preload: true
pin "jquery.ui.datepicker.locales"
pin "reload_on_change"
================================================
FILE: spec/support/test_app/config/initializers/assets.rb
================================================
Rails.application.config.assets.paths << Rails.root.join('app/javascript').to_s
================================================
FILE: spec/support/test_app/config/initializers/backtrace_silencers.rb
================================================
# encoding: utf-8
# 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.
# Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ }
# You can also remove all the silencers if you're trying to debug a problem that might stem from framework code.
# Rails.backtrace_cleaner.remove_silencers!
================================================
FILE: spec/support/test_app/config/initializers/inflections.rb
================================================
# encoding: utf-8
# Be sure to restart your server when you modify this file.
# 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'
# inflect.singular /^(ox)en/i, '\1'
# inflect.irregular 'person', 'people'
# inflect.uncountable %w( fish sheep )
# end
#
# These inflection rules are supported but not enabled by default:
# ActiveSupport::Inflector.inflections do |inflect|
# inflect.acronym 'RESTful'
# end
================================================
FILE: spec/support/test_app/config/initializers/mime_types.rb
================================================
# encoding: utf-8
# Be sure to restart your server when you modify this file.
# Add new mime types for use in respond_to blocks:
# Mime::Type.register "text/richtext", :rtf
# Mime::Type.register_alias "text/html", :iphone
================================================
FILE: spec/support/test_app/config/initializers/secret_token.rb
================================================
# encoding: utf-8
# Be sure to restart your server when you modify this file.
# Your secret key for verifying the integrity of signed cookies.
# If you change this key, all old signed cookies will become invalid!
# Make sure the secret is at least 30 characters and all random,
# no regular words or you'll be exposed to dictionary attacks.
if Examples::TestApp.config.respond_to?(:secret_key_base)
Examples::TestApp.config.secret_key_base = '41aebe1604463465ca9a3d0c79244d48b668ca1db17b75fba958b31d250d42f2771eecac77be54fe2c6a919a4c40de4e5348857b77c4593987fcb890fcce8827'
else
Examples::TestApp.config.secret_token = '41aebe1604463465ca9a3d0c79244d48b668ca1db17b75fba958b31d250d42f2771eecac77be54fe2c6a919a4c40de4e5348857b77c4593987fcb890fcce8827'
end
================================================
FILE: spec/support/test_app/config/initializers/session_store.rb
================================================
# encoding: utf-8
# Be sure to restart your server when you modify this file.
Examples::TestApp.config.session_store :cookie_store, key: '_examples_session'
# Use the database for sessions instead of the cookie-based default,
# which shouldn't be used to store highly confidential information
# (create the session table with "rails generate session_migration")
# Examples::Application.config.session_store :active_record_store
================================================
FILE: spec/support/test_app/config/initializers/wice_grid_config.rb
================================================
# encoding: utf-8
if defined?(Wice::Defaults)
# Default number of rows to show per page.
Wice::Defaults::PER_PAGE = 20
# Default order direction
Wice::Defaults::ORDER_DIRECTION = 'asc'
# Default name for a grid. A grid name is the basis for a lot of
# names including parameter names, DOM IDs, etc
# The shorter the name is the shorter the request URI will be.
Wice::Defaults::GRID_NAME = 'grid'
# If REUSE_LAST_COLUMN_FOR_FILTER_ICONS is true and the last column doesn't have any filter and column name, it will be used
# for filter related icons (filter icon, reset icon, show/hide icon), otherwise an additional table column is added.
Wice::Defaults::REUSE_LAST_COLUMN_FOR_FILTER_ICONS = true
# The label of the first option of a custom dropdown list meaning 'All items'
Wice::Defaults::CUSTOM_FILTER_ALL_LABEL = '--'
# A list of classes for the table tag of the grid
Wice::Defaults::DEFAULT_TABLE_CLASSES = ['table', 'table-bordered', 'table-striped']
# Allow switching between a single and multiple selection modes in custom filters (dropdown boxes)
Wice::Defaults::ALLOW_MULTIPLE_SELECTION = true
# Show the upper pagination panel by default or not
Wice::Defaults::SHOW_UPPER_PAGINATION_PANEL = false
# Disabling CSV export by default
Wice::Defaults::ENABLE_EXPORT_TO_CSV = false
# Default CSV field separator
Wice::Defaults::CSV_FIELD_SEPARATOR = ','
# Default CSV encoding (p.e. 'CP1252:UTF-8' to make Microsoft Excel(tm) happy)
Wice::Defaults::CSV_ENCODING = nil
# The strategy when to show the filter.
# * :when_filtered - when the table is the result of filtering
# * :always - show the filter always
# * :no - never show the filter
Wice::Defaults::SHOW_FILTER = :always
# A boolean value specifying if a change in a filter triggers reloading of the grid.
Wice::Defaults::AUTO_RELOAD = false
# SQL operator used for matching strings in string filters.
Wice::Defaults::STRING_MATCHING_OPERATOR = 'LIKE'
# STRING_MATCHING_OPERATOR = 'ILIKE' # Use this for Postgresql case-insensitive matching.
# Defining one string matching operator globally for the whole application turns is not enough
# when you connect to two databases one of which is MySQL and the other is Postgresql.
# If the key for an adapter is missing it will fall back to Wice::Defaults::STRING_MATCHING_OPERATOR
Wice::Defaults::STRING_MATCHING_OPERATORS = {
'ActiveRecord::ConnectionAdapters::MysqlAdapter' => 'LIKE',
'ActiveRecord::ConnectionAdapters::PostgreSQLAdapter' => 'ILIKE'
}
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# Advanced Filters #
# Switch of the negation checkbox in all text filters
Wice::Defaults::NEGATION_IN_STRING_FILTERS = false
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# Showing All Records #
# Enable or disable showing all records (non-paginated table)
Wice::Defaults::ALLOW_SHOWING_ALL_RECORDS = true
# If number of all queries is more than this value, the user will be given a warning message
Wice::Defaults::START_SHOWING_WARNING_FROM = 100
# Hide the "show all" link if the number of all records is more than...
# Force-resets back to pagination starting from this value.
# Set to nil to always show it
Wice::Defaults::SHOW_ALL_ALLOWED_UP_TO = nil
#
# set to nil to skip the check
Wice::Defaults::SWITCH_BACK_TO_PAGINATION_FROM = nil
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# Saving Queries #
# ActiveRecord model to store queries. Read the documentation for details
# QUERY_STORE_MODEL = 'WiceGridSerializedQuery'
Wice::Defaults::QUERY_STORE_MODEL = 'WiceGridSerializedQuery'
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# Here go settings related to the date/datetime filters #
# Default column filters
# Possible values:
# * :jquery_datepicker - Jquery datepicker (works for datetime, too)
# * :bootstrap_datepicker - Bootstrap datepicker (works for datetime, too)
# * :rails_date_helper - standard Rails date helper
# * :rails_datetime_helper - standard Rails datetime helper
Wice::Defaults::DEFAULT_FILTER_FOR_DATE = :jquery_datepicker
Wice::Defaults::DEFAULT_FILTER_FOR_DATETIME = :jquery_datepicker
# Format of the datetime displayed.
# If you change the format, make sure to check if +DATETIME_PARSER+ can still parse this string.
Wice::Defaults::DATETIME_FORMAT = '%Y-%m-%d %H:%M'
# Format of the date displayed.
# If you change the format, make sure to check if +DATE_PARSER+ can still parse this string.
Wice::Defaults::DATE_FORMAT = '%Y-%m-%d'
# Format of the date displayed in jQuery's Datepicker
# If you change the format, make sure to check if +DATE_PARSER+ can still parse this string.
Wice::Defaults::DATE_FORMAT_JQUERY = 'yy-mm-dd'
# Format of the date displayed in Bootstrap's Datepicker
# If you change the format, make sure to check if +DATE_PARSER+ can still parse this string.
Wice::Defaults::DATE_FORMAT_BOOTSTRAP = 'yyyy-mm-dd'
# With Calendar helpers enabled the parameter sent is the string displayed. This lambda will be given a date string in the
# format defined by +DATETIME_FORMAT+ and must generate a DateTime object.
# In many cases Time.zone.parse is enough, for instance, %Y-%m-%d . If you change the format, make sure to check this code
# and modify it if needed.
Wice::Defaults::DATETIME_PARSER = lambda do|datetime_string|
if datetime_string.blank?
nil
elsif Time.zone
Time.zone.parse(datetime_string)
else
Time.parse(datetime_string)
end
end
# The range of years to display in jQuery Datepicker.
# It can always be changed dynamically with the following javascript:
# $( ".hasDatepicker" ).datepicker( "option", "yearRange", "2000:2042" );
Wice::Defaults::DATEPICKER_YEAR_RANGE = (from = Date.current.year - 10).to_s + ':' + (from + 15).to_s
# With Calendar helpers enabled the parameter sent is the string displayed. This lambda will be given a date string in the
# format defined by +DATETIME+ and must generate a Date object.
# In many cases Date.parse is enough, for instance, %Y-%m-%d . If you change the format, make sure to check this code
# and modify it if needed.
Wice::Defaults::DATE_PARSER = lambda do|date_string|
if date_string.blank?
nil
else
Date.parse(date_string)
end
end
# The name of the page method (should correspond to Kaminari.config.page_method_name)
Wice::Defaults::PAGE_METHOD_NAME = :page
# The name of the theme to use for the pagination with Kaminari
Wice::Defaults::PAGINATION_THEME = :wice_grid
# by default Wice-Grid always use unscoped,set to true to force use of default_scope by default instead
Wice::Defaults::USE_DEFAULT_SCOPE = false
end
================================================
FILE: spec/support/test_app/config/initializers/wrap_parameters.rb
================================================
# encoding: utf-8
# Be sure to restart your server when you modify this file.
#
# This file contains settings for ActionController::ParamsWrapper which
# is enabled by default.
# Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array.
ActiveSupport.on_load(:action_controller) do
wrap_parameters format: [:json]
end
# Disable root element in JSON by default.
ActiveSupport.on_load(:active_record) do
self.include_root_in_json = false
end
================================================
FILE: spec/support/test_app/config/locales/en.yml
================================================
# Sample localization file for English. Add more files in this directory for other locales.
# See https://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points.
en:
hello: "Hello world"
================================================
FILE: spec/support/test_app/config/locales/wice_grid.yml
================================================
en:
date:
order:
- :year
- :month
- :day
wice_grid:
show_filter_tooltip: Show filter
hide_filter_tooltip: Hide filter
csv_export_tooltip: Export to CSV
filter_tooltip: Filter
reset_filter_tooltip: Reset
boolean_filter_true_label: "yes"
boolean_filter_false_label: "no"
previous_label: «
next_label: »
# Title of the icon clicking on which will show the calendar to set the FROM date.
date_selector_tooltip_from: From
# Title of the icon clicking on which will show the calendar to set the TO date.
date_selector_tooltip_to: To
# The title of the checkox to turn on negation
negation_checkbox_title: Exclude
# link to switch to show all records
show_all_records_label: show all
# tooltip for the link to switch to show all records
show_all_records_tooltip: Show all records
# Warning message shown when the user wants to switch to all-records mode
all_queries_warning: Are you sure you want to display all records?
# link to paginated view
switch_back_to_paginated_mode_label: back to paginated view
# tooltip for the link to paginated view
switch_back_to_paginated_mode_tooltip: Switch back to the view with pages
# Title of the date string.
date_string_tooltip: Click to delete
saved_query_panel_title: Saved Queries
save_query_button_label: Save the state of filters
saved_query_deletion_confirmation: Are you sure?
saved_query_deletion_link_title: Delete query
saved_query_link_title: Load query
validates_uniqueness_error: A query with this name already exists
validates_presence_error: Please submit the name of the custom query
query_deleted_message: Saved query deleted.
query_saved_message: Query saved.
select_all: Select all
deselect_all: Remove selection
expand: Expand
collapse: Collapse
is:
date:
order:
- :year
- :month
- :day
wice_grid:
show_filter_tooltip: Sýna síumöguleika
hide_filter_tooltip: Fela síumoguleika
csv_export_tooltip: Flytja út CSV
filter_tooltip: Sía
reset_filter_tooltip: Hreinsa
boolean_filter_true_label: Já
boolean_filter_false_label: Nei
previous_label: «
next_label: »
# Title of the icon clicking on which will show the calendar to set the FROM date.
date_selector_tooltip_from: Frá
# Title of the icon clicking on which will show the calendar to set the TO date.
date_selector_tooltip_to: Til
# The title of the checkox to turn on negation
negation_checkbox_title: Undanskilja
# link to switch to show all records
show_all_records_label: Sýna allt
# tooltip for the link to switch to show all records
show_all_records_tooltip: Sýna öll gögn
# Warning message shown when the user wants to switch to all-records mode
all_queries_warning: Ertu viss um að þú viljir láta sýna öll gögn?
# link to paginated view
switch_back_to_paginated_mode_label: Aftur til síðuhorfs
# tooltip for the link to paginated view
switch_back_to_paginated_mode_tooltip: Aftur til síðuhorfs
# Title of the date string.
date_string_tooltip: Smella á til að eyða
saved_query_panel_title: Vistaðar leitarskipanir
save_query_button_label: Vista síuval
saved_query_deletion_confirmation: Ertu viss?
saved_query_deletion_link_title: Eyða leitarskipun
saved_query_link_title: Hlaða leitarskipun
validates_uniqueness_error: Leitarskipun með þessu nafni er þegar til
validates_presence_error: Vinsamlegast gefið heiti fyrir leitarskipun
query_deleted_message: Vistaðri leitarskipun hefur verið eytt
query_saved_message: leitaskipun hefur verið vistuð
# To do: translate
select_all: Select all
deselect_all: Remove selection
nl:
date:
order:
- :year
- :month
- :day
wice_grid:
show_filter_tooltip: Filter tonen
hide_filter_tooltip: Filter verbergen
csv_export_tooltip: Als CSV exporteren
filter_tooltip: Filter
reset_filter_tooltip: Terugstellen
boolean_filter_true_label: ja
boolean_filter_false_label: neen
previous_label: «
next_label: »
# Title of the icon clicking on which will show the calendar to set the FROM date.
date_selector_tooltip_from: Vanaf
# Title of the icon clicking on which will show the calendar to set the TO date.
date_selector_tooltip_to: Tot
# The title of the checkox to turn on negation
negation_checkbox_title: Uitsluiten
# link to switch to show all records
show_all_records_label: Alle rijen tonen
# tooltip for the link to switch to show all records
show_all_records_tooltip: Alle rijen tonen
# Warning message shown when the user wants to switch to all-records mode
all_queries_warning: Bent u zeker dat u alle rijen wilt tonen?
# link to paginated view
switch_back_to_paginated_mode_label: Terug naar pagina's
# tooltip for the link to paginated view
switch_back_to_paginated_mode_tooltip: Terug naar pagina's
# Title of the date string.
date_string_tooltip: Klik om te verwijderen
saved_query_panel_title: Opgeslagen query's
save_query_button_label: Query opslaan
saved_query_deletion_confirmation: Bent u zeker?
saved_query_deletion_link_title: Query verwijderen
saved_query_link_title: Query laden
validates_uniqueness_error: Deze query bestaat reeds
validates_presence_error: Gelieve de naam van de query in te vullen
query_deleted_message: Opgeslagen query verwijderd.
query_saved_message: Query opgeslagen
select_all: Selecteer alle rijen
deselect_all: Deselecteer alle rijen
fr:
date:
order:
- :year
- :month
- :day
wice_grid:
show_filter_tooltip: Afficher le filtre
hide_filter_tooltip: Cacher le filtrer
csv_export_tooltip: Exporter en CSV
filter_tooltip: Filtrer
reset_filter_tooltip: Effacer
boolean_filter_true_label: oui
boolean_filter_false_label: non
previous_label: «
next_label: »
# Title of the icon clicking on which will show the calendar to set the FROM date.
date_selector_tooltip_from: De
# Title of the icon clicking on which will show the calendar to set the TO date.
date_selector_tooltip_to: à
# The title of the checkox to turn on negation
negation_checkbox_title: Exclure
# link to switch to show all records
show_all_records_label: Voir tous
# tooltip for the link to switch to show all records
show_all_records_tooltip: Voir tous les enregistrements
# Warning message shown when the user wants to switch to all-records mode
all_queries_warning: Etes-vous certain de vouloir afficher tous les enregistrements?
# link to paginated view
switch_back_to_paginated_mode_label: Retour à la vue paginée
# tooltip for the link to paginated view
switch_back_to_paginated_mode_tooltip: Retour à la vue par pages
# Title of the date string.
date_string_tooltip: Cliquez pour effacer
saved_query_panel_title: Requêtes sauvées
save_query_button_label: Sauver l'état des filtres
saved_query_deletion_confirmation: Etes vous sûr?
saved_query_deletion_link_title: Effacer la requête
saved_query_link_title: Charger la requête
validates_uniqueness_error: Un requête existante porte déjà ce nom
validates_presence_error: Veuillez indiquer le nom de la requête que vous souhaitez sauver
query_deleted_message: La requête a été effacée.
query_saved_message: La requête a été sauvée.
select_all: Sélectionner tout
deselect_all: Désélectionner tout
ru:
date:
order:
- :year
- :month
- :day
wice_grid:
show_filter_tooltip: Показать фильтр
hide_filter_tooltip: Спрятать фильтр
csv_export_tooltip: Экспорт в CSV
filter_tooltip: Фильтровать
reset_filter_tooltip: Сброс
boolean_filter_true_label: да
boolean_filter_false_label: нет
previous_label: «
next_label: »
# Title of the icon clicking on which will show the calendar to set the FROM date.
date_selector_tooltip_from: С
# Title of the icon clicking on which will show the calendar to set the TO date.
date_selector_tooltip_to: До
# The title of the checkox to turn on negation
negation_checkbox_title: Исключая строки
# link to switch to show all records
show_all_records_label: показать все
# tooltip for the link to switch to show all records
show_all_records_tooltip: Показать все записи
# Warning message shown when the user wants to switch to all-records mode
all_queries_warning: Вы уверены в том, что хотите отобразить все записи?
# link to paginated view
switch_back_to_paginated_mode_label: Назад к постраничному выводу
# tooltip for the link to paginated view
switch_back_to_paginated_mode_tooltip: Назад к постраничному выводу
# Title of the date string.
date_string_tooltip: Кликните, чтобы удалить дату
saved_query_panel_title: Сохранённые фильтры
save_query_button_label: Сохранить фильтр
saved_query_deletion_confirmation: Вы уверены?
saved_query_deletion_link_title: Удалить сохранённый фильтр
saved_query_link_title: Загрузить сохранённый фильтр
validates_uniqueness_error: Сохранённый фильтр с таким именем уже существует
validates_presence_error: Пожалуйста введите имя сохраняемого фильтра
query_deleted_message: Сохранённый фильтр удалён.
query_saved_message: Сохранённый фильтр сохранён.
select_all: Отметить все
deselect_all: Убрать выделение
pt:
date:
order:
- :year
- :month
- :day
wice_grid:
show_filter_tooltip: Mostrar o filtro
hide_filter_tooltip: Esconder o filtro
csv_export_tooltip: Exportar em CSV
filter_tooltip: Filtrar
reset_filter_tooltip: Reinicializar
boolean_filter_true_label: sim
boolean_filter_false_label: não
previous_label: «
next_label: »
# Title of the icon clicking on which will show the calendar to set the FROM date.
date_selector_tooltip_from: De
# Title of the icon clicking on which will show the calendar to set the TO date.
date_selector_tooltip_to: a
# The title of the checkox to turn on negation
negation_checkbox_title: Excluir
# link to switch to show all records
show_all_records_label: Ver todos
# tooltip for the link to switch to show all records
show_all_records_tooltip: Ver todos os registos
# Warning message shown when the user wants to switch to all-records mode
all_queries_warning: Tem a certeza de querer visualizar todos os registos?
# link to paginated view
switch_back_to_paginated_mode_label: Retorno à vista paginada
# tooltip for the link to paginated view
switch_back_to_paginated_mode_tooltip: Retorno à vista por página
# Title of the date string.
date_string_tooltip: Cliquar para apagar
saved_query_panel_title: Queries gravadas
save_query_button_label: Gravar o estado dos filtros
saved_query_deletion_confirmation: Tem a certeza?
saved_query_deletion_link_title: Apagar a query
saved_query_link_title: Caregar a query
validates_uniqueness_error: Já existe uma query com o mesmo nome
validates_presence_error: Queira indicar o nome da query que deseja gravar
query_deleted_message: A query foi apagada.
query_saved_message: A query foi gravada.
select_all: Selecionar todos
deselect_all: Remover seleção
pt-BR:
date:
order:
- :year
- :month
- :day
wice_grid:
show_filter_tooltip: Mostrar o filtro
hide_filter_tooltip: Esconder o filtro
csv_export_tooltip: Exportar em CSV
filter_tooltip: Filtrar
reset_filter_tooltip: Reinicializar
boolean_filter_true_label: sim
boolean_filter_false_label: não
previous_label: «
next_label: »
date_selector_tooltip_from: De
date_selector_tooltip_to: a
negation_checkbox_title: Excluir
show_all_records_label: Ver todos
show_all_records_tooltip: Ver todos os registos
all_queries_warning: Tem certeza que gostaria de visualizar todos os registos?
switch_back_to_paginated_mode_label: Voltar à lista paginada
switch_back_to_paginated_mode_tooltip: Voltar à lista por página
date_string_tooltip: Clique para apagar
saved_query_panel_title: Filtros gravados
save_query_button_label: Gravar o estado dos filtros
saved_query_deletion_confirmation: Tem certeza?
saved_query_deletion_link_title: Apagar o filtro
saved_query_link_title: Carregar o filtro
validates_uniqueness_error: Já existe um filtro com o mesmo nome
validates_presence_error: Indique o nome do filtro que deseja gravar
query_deleted_message: O filtro foi apagado.
query_saved_message: O filtro foi gravado.
select_all: Selecionar todos
deselect_all: Remover seleção
sk:
date:
order:
- :year
- :month
- :day
wice_grid:
show_filter_tooltip: Zobraziť filter
hide_filter_tooltip: Skryť filter
csv_export_tooltip: Exportovať do CSV
filter_tooltip: Filter
reset_filter_tooltip: Zrušiť filtre
boolean_filter_true_label: "áno"
boolean_filter_false_label: "nie"
previous_label: «
next_label: »
# Title of the icon clicking on which will show the calendar to set the FROM date.
date_selector_tooltip_from: Dátum od
# Title of the icon clicking on which will show the calendar to set the TO date.
date_selector_tooltip_to: Dátum do
# The title of the checkox to turn on negation
negation_checkbox_title: Inverzný výber
# link to switch to show all records
show_all_records_label: Zobraziť všetko
# tooltip for the link to switch to show all records
show_all_records_tooltip: Zobrazí všetky záznamy v databáze
# Warning message shown when the user wants to switch to all-records mode
all_queries_warning: Určite chceš zobraziť všetky záznamy v databáze?
# link to paginated view
switch_back_to_paginated_mode_label: späť na stránkové zobrazenie
# tooltip for the link to paginated view
switch_back_to_paginated_mode_tooltip: Prepnúť do stránkového zobrazenia
# Title of the date string.
date_string_tooltip: Kliknutím zmažeš
saved_query_panel_title: Uložené filtre/výsledky
save_query_button_label: Uložiť stav filtrov
saved_query_deletion_confirmation: Si si istý?
saved_query_deletion_link_title: Vymazať uložený filter
saved_query_link_title: Nahrať uložený filter
validates_uniqueness_error: Filter s uvedeným názvom už existuje.
validates_presence_error: Prosím zadaj názov uloženého filtra.
query_deleted_message: Uložený filter bol vymazaný.
query_saved_message: Filter bol uložený.
select_all: Vyber všetko
deselect_all: Zrušiť výber
cz:
date:
order:
- :year
- :month
- :day
wice_grid:
show_filter_tooltip: Zobrazit filtr
hide_filter_tooltip: Skrýt filtr
csv_export_tooltip: Exportovat do CSV
filter_tooltip: Filtr
reset_filter_tooltip: Zrušit filtr
boolean_filter_true_label: "áno"
boolean_filter_false_label: "ne"
previous_label: «
next_label: »
# Title of the icon clicking on which will show the calendar to set the FROM date.
date_selector_tooltip_from: Dátum od
# Title of the icon clicking on which will show the calendar to set the TO date.
date_selector_tooltip_to: Dátum do
# The title of the checkox to turn on negation
negation_checkbox_title: Inverzní výběr
# link to switch to show all records
show_all_records_label: Zobrazit všechno
# tooltip for the link to switch to show all records
show_all_records_tooltip: Zobrazí všechny záznamy v databáze
# Warning message shown when the user wants to switch to all-records mode
all_queries_warning: Určitě chceš zobrazit všechny záznamy v databáze?
# link to paginated view
switch_back_to_paginated_mode_label: zpět na stránkové zobrazení
# tooltip for the link to paginated view
switch_back_to_paginated_mode_tooltip: Přepnout do stránkového zobrazení
# Title of the date string.
date_string_tooltip: Kliknutím zmažeš
saved_query_panel_title: Uložené filtry
save_query_button_label: Uložit aktuálni stav filtrů
saved_query_deletion_confirmation: Seš si jistej?
saved_query_deletion_link_title: Smazat uloženej filtr
saved_query_link_title: Použít uloženej filtr
validates_uniqueness_error: Filtr už existuje.
validates_presence_error: Prosím zadej název filtru.
query_deleted_message: Uložený filtr byl smazán.
query_saved_message: Filtr byl uložen.
select_all: Vyber všechno
deselect_all: Zrušit výběr
de:
date:
order:
- :year
- :month
- :day
wice_grid:
show_filter_tooltip: Filter einblenden
hide_filter_tooltip: Filter ausblenden
csv_export_tooltip: CSV Export
filter_tooltip: Filter
reset_filter_tooltip: Reset
boolean_filter_true_label: "Ja"
boolean_filter_false_label: "Nein"
previous_label: «
next_label: »
# Title of the icon clicking on which will show the calendar to set the FROM date.
date_selector_tooltip_from: Von
# Title of the icon clicking on which will show the calendar to set the TO date.
date_selector_tooltip_to: Bis
# The title of the checkox to turn on negation
negation_checkbox_title: Ausschließen
# link to switch to show all records
show_all_records_label: Alle anzeigen
# tooltip for the link to switch to show all records
show_all_records_tooltip: Alle anzeigen
# Warning message shown when the user wants to switch to all-records mode
all_queries_warning: Wollen Sie wirkliche alle Einträge anzeigen?
# link to paginated view
switch_back_to_paginated_mode_label: Zurück zur seitenbasierten Ansicht
# tooltip for the link to paginated view
switch_back_to_paginated_mode_tooltip: Zurück zur seitenbasierten Ansicht
# Title of the date string.
date_string_tooltip: Löschen
saved_query_panel_title: Gespeicherte Abfragen
save_query_button_label: Filter speichern
saved_query_deletion_confirmation: Sind Sie sicher?
saved_query_deletion_link_title: Abfrage löschen
saved_query_link_title: Abfrage laden
validates_uniqueness_error: Eine Abfrage mit dieser Bezeichnung existiert bereits!
validates_presence_error: Bitte vergeben Sie einen Namen!
query_deleted_message: Abfrage gelöscht.
query_saved_message: Abfrage gespeichert.
select_all: Alle auswählen
deselect_all: Auswahl aufheben
zh:
date:
order:
- :year
- :month
- :day
wice_grid:
show_filter_tooltip: 显示过滤
hide_filter_tooltip: 隐藏过滤
csv_export_tooltip: 输出CSV档
filter_tooltip: 过滤
reset_filter_tooltip: 清除过滤
boolean_filter_true_label: "是"
boolean_filter_false_label: "否"
previous_label: «
next_label: »
# Title of the icon clicking on which will show the calendar to set the FROM date.
date_selector_tooltip_from: 从
# Title of the icon clicking on which will show the calendar to set the TO date.
date_selector_tooltip_to: 至
# The title of the checkox to turn on negation
negation_checkbox_title: 排除
# link to switch to show all records
show_all_records_label: 显示全部
# tooltip for the link to switch to show all records
show_all_records_tooltip: 显示全部记录
# Warning message shown when the user wants to switch to all-records mode
all_queries_warning: 确定要显示全部记录?
# link to paginated view
switch_back_to_paginated_mode_label: 回到分页显示
# tooltip for the link to paginated view
switch_back_to_paginated_mode_tooltip: 切换到分页显示
# Title of the date string.
date_string_tooltip: 按下以清除
saved_query_panel_title: 查询存储
save_query_button_label: 储存查询状态
saved_query_deletion_confirmation: 确定删除?
saved_query_deletion_link_title: 删除查询
saved_query_link_title: 读取查询
validates_uniqueness_error: 已存在相同名称的查询
validates_presence_error: 请为此查询命名
query_deleted_message: 查询已删除
query_saved_message: 查询已储存
select_all: 全选
deselect_all: 全清
ja:
date:
order:
- :年
- :月
- :日
wice_grid:
show_filter_tooltip: フィルタ表示
hide_filter_tooltip: フィルタ非表示
csv_export_tooltip: CSVエクスポート
filter_tooltip: フィルタ
reset_filter_tooltip: リセット
boolean_filter_true_label: "yes"
boolean_filter_false_label: "no"
previous_label: «
next_label: »
# Title of the icon clicking on which will show the calendar to set the FROM date.
date_selector_tooltip_from: From
# Title of the icon clicking on which will show the calendar to set the TO date.
date_selector_tooltip_to: To
# The title of the checkox to turn on negation
negation_checkbox_title: 除外する
# link to switch to show all records
show_all_records_label: すべて表示
# tooltip for the link to switch to show all records
show_all_records_tooltip: 前レコード表示
# Warning message shown when the user wants to switch to all-records mode
all_queries_warning: 全てのレコードを表示しますか?
# link to paginated view
switch_back_to_paginated_mode_label: 戻る
# tooltip for the link to paginated view
switch_back_to_paginated_mode_tooltip: 戻る
# Title of the date string.
date_string_tooltip: 削除
saved_query_panel_title: クエリ保存
save_query_button_label: フィルタ保存
saved_query_deletion_confirmation: 本当によろしいですか?
saved_query_deletion_link_title: クエリ削除
saved_query_link_title: クエリのロード
validates_uniqueness_error: 同じ名前がすでに存在します
validates_presence_error: クエリ名を記入して下さい
query_deleted_message: クエリの削除が完了しました
query_saved_message: クエリを保存しました
select_all: 全てを選択
deselect_all: 選択を解除
expand: 開く
collapse: 閉じる
================================================
FILE: spec/support/test_app/config/puma.rb
================================================
workers Integer(ENV['WEB_CONCURRENCY'] || 2)
threads_count = Integer(ENV['MAX_THREADS'] || 5)
threads threads_count, threads_count
preload_app!
rackup DefaultRackup
port ENV['PORT'] || 3000
environment ENV['RACK_ENV'] || 'development'
on_worker_boot do
# Worker specific setup for Rails 4.1+
# See: https://devcenter.heroku.com/articles/deploying-rails-applications-with-the-puma-web-server#on-worker-boot
ActiveRecord::Base.establish_connection
end
================================================
FILE: spec/support/test_app/config/routes.rb
================================================
# encoding: utf-8
Examples::TestApp.routes.draw do
# just in order to have the helpers defined
resources :tasks
resources :projects
resources :action_column do
collection do
post :process_issues
end
end
resources :hiding_checkboxes_in_action_column do
collection do
post :process_issues
end
end
resources(
:adding_rows,
:all_records,
:auto_reloads,
:auto_reloads2,
:auto_reloads3,
:basics1,
:basics2,
:basics3,
:basics4,
:basics5,
:basics6,
:blockless_column_definition,
:buttons,
:csv_and_detached_filters,
:csv_export,
:custom_filter_params,
:custom_filters1,
:custom_filters2,
:custom_filters3,
:custom_filters4,
:custom_ordering,
:custom_ordering_on_calculated,
:custom_ordering_with_arel,
:custom_ordering_with_proc,
:custom_ordering_with_ruby,
:dates,
:detached_filters,
:detached_filters_two_grids,
:disable_all_filters,
:erb_mode,
:integration_with_application_view,
:integration_with_forms,
:joining_tables,
:localization,
:many_grids_on_page,
:negation,
:no_records,
:null_values,
:numeric_filters,
:resultset_processings,
:resultset_processings2,
:saved_queries,
:styling,
:tasks,
:two_associations,
:upper_pagination_panel,
:when_filtered,
)
Wice.define_routes(self, 'queries')
# The priority is based upon order of creation:
# first created -> highest priority.
# Sample of regular route:
# match 'products/:id' => 'catalog#view'
# Keep in mind you can assign values other than :controller and :action
# Sample of named route:
# match 'products/:id/purchase' => 'catalog#purchase', :as => :purchase
# This route can be invoked with purchase_url(:id => product.id)
# Sample resource route (maps HTTP verbs to controller actions automatically):
# resources :products
# Sample resource route with options:
# resources :products do
# member do
# get 'short'
# post 'toggle'
# end
#
# collection do
# get 'sold'
# end
# end
# Sample resource route with sub-resources:
# resources :products do
# resources :comments, :sales
# resource :seller
# end
# Sample resource route with more complex sub-resources
# resources :products do
# resources :comments
# resources :sales do
# get 'recent', :on => :collection
# end
# end
# Sample resource route within a namespace:
# namespace :admin do
# # Directs /admin/products/* to Admin::ProductsController
# # (app/controllers/admin/products_controller.rb)
# resources :products
# end
# You can have the root of your site routed with "root"
# just remember to delete public/index.html.
root to: 'basics1#index'
# See how all your routes lay out with "rake routes"
# This is a legacy wild controller route that's not recommended for RESTful applications.
# Note: This route will make all actions in every controller accessible via GET requests.
# match ':controller(/:action(/:id))(.:format)'
end
================================================
FILE: spec/support/test_app/config.ru
================================================
# encoding: utf-8
# This file is used by Rack-based servers to start the application.
require ::File.expand_path('../config/environment', __FILE__)
run Examples::TestApp
================================================
FILE: spec/support/test_app/db/migrate/20120224193505_create_tasks.rb
================================================
# encoding: utf-8
class CreateTasks < ActiveRecord::Migration
def change
create_table :tasks do |t|
t.string :title
t.text :description
t.integer :created_by_id
t.references :project
t.date :due_date
t.references :priority
t.references :status
t.integer :relevant_version_id
t.integer :expected_version_id
t.float :estimated_time
t.boolean :archived
t.timestamps
end
add_index :tasks, :title
add_index :tasks, :created_by_id
add_index :tasks, :project_id
add_index :tasks, :priority_id
add_index :tasks, :status_id
add_index :tasks, :relevant_version_id
add_index :tasks, :expected_version_id
end
end
================================================
FILE: spec/support/test_app/db/migrate/20120224193517_create_users.rb
================================================
# encoding: utf-8
class CreateUsers < ActiveRecord::Migration
def change
create_table :users do |t|
t.string :name
t.timestamps
end
add_index :users, :name
end
end
================================================
FILE: spec/support/test_app/db/migrate/20120224193522_create_projects.rb
================================================
# encoding: utf-8
class CreateProjects < ActiveRecord::Migration
def change
create_table :projects do |t|
t.string :name
t.integer :customer_id
t.integer :supplier_id
t.timestamps
end
add_index :projects, :customer_id
add_index :projects, :supplier_id
end
end
================================================
FILE: spec/support/test_app/db/migrate/20120224193529_create_priorities.rb
================================================
# encoding: utf-8
class CreatePriorities < ActiveRecord::Migration
def change
create_table :priorities do |t|
t.string :name
t.integer :position
t.timestamps
end
add_index :priorities, :name
add_index :priorities, :position
end
end
================================================
FILE: spec/support/test_app/db/migrate/20120224193537_create_statuses.rb
================================================
# encoding: utf-8
class CreateStatuses < ActiveRecord::Migration
def change
create_table :statuses do |t|
t.string :name
t.integer :position
t.timestamps
end
add_index :statuses, :name
add_index :statuses, :position
end
end
================================================
FILE: spec/support/test_app/db/migrate/20120224193543_create_versions.rb
================================================
# encoding: utf-8
class CreateVersions < ActiveRecord::Migration
def change
create_table :versions do |t|
t.string :name
t.references :project
t.string :status
t.timestamps
end
add_index :versions, :name
add_index :versions, :project_id
add_index :versions, :status
end
end
================================================
FILE: spec/support/test_app/db/migrate/20120224193550_create_project_roles.rb
================================================
# encoding: utf-8
class CreateProjectRoles < ActiveRecord::Migration
def change
create_table :project_roles do |t|
t.string :name
t.boolean :can_close_tasks
t.timestamps
end
add_index :project_roles, :name
end
end
================================================
FILE: spec/support/test_app/db/migrate/20120224193610_create_companies.rb
================================================
# encoding: utf-8
class CreateCompanies < ActiveRecord::Migration
def change
create_table :companies do |t|
t.string :name
t.timestamps
end
add_index :companies, :name
end
end
================================================
FILE: spec/support/test_app/db/migrate/20120224195351_create_user_project_participations.rb
================================================
# encoding: utf-8
class CreateUserProjectParticipations < ActiveRecord::Migration
def change
create_table :user_project_participations do |t|
t.references :project
t.references :user
t.references :project_role
t.timestamps
end
add_index :user_project_participations, :project_id
add_index :user_project_participations, :user_id
add_index :user_project_participations, :project_role_id
end
end
================================================
FILE: spec/support/test_app/db/migrate/20120224195521_add_tasks_users.rb
================================================
# encoding: utf-8
class AddTasksUsers < ActiveRecord::Migration
def change
create_table :tasks_users, id: false do |t|
t.integer :task_id, :user_id
end
add_index :tasks_users, :task_id
add_index :tasks_users, :user_id
end
end
================================================
FILE: spec/support/test_app/db/migrate/20120610091944_create_wice_grid_serialized_queries.rb
================================================
# encoding: utf-8
class CreateWiceGridSerializedQueries < ::ActiveRecord::Migration
def change
create_table :wice_grid_serialized_queries do |t|
t.column :name, :string
t.column :grid_name, :string
t.column :query, :text
t.timestamps
end
add_index :wice_grid_serialized_queries, :grid_name
add_index :wice_grid_serialized_queries, [:grid_name, :id]
end
end
================================================
FILE: spec/support/test_app/db/schema.rb
================================================
# encoding: UTF-8
# This file is auto-generated from the current state of the database. Instead
# of editing this file, please use the migrations feature of Active Record to
# incrementally modify your database, and then regenerate this schema definition.
#
# Note that this schema.rb definition is the authoritative source for your
# database schema. If you need to create the application database on another
# system, you should be using db:schema:load, not running all the migrations
# from scratch. The latter is a flawed and unsustainable approach (the more migrations
# you'll amass, the slower it'll run and the greater likelihood for issues).
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 20120610091944) do
create_table "companies", force: :cascade do |t|
t.string "name", limit: 255
t.datetime "created_at"
t.datetime "updated_at"
end
add_index "companies", ["name"], name: "index_companies_on_name", using: :btree
create_table "priorities", force: :cascade do |t|
t.string "name", limit: 255
t.integer "position", limit: 4
t.datetime "created_at"
t.datetime "updated_at"
end
add_index "priorities", ["name"], name: "index_priorities_on_name", using: :btree
add_index "priorities", ["position"], name: "index_priorities_on_position", using: :btree
create_table "project_roles", force: :cascade do |t|
t.string "name", limit: 255
t.boolean "can_close_tasks"
t.datetime "created_at"
t.datetime "updated_at"
end
add_index "project_roles", ["name"], name: "index_project_roles_on_name", using: :btree
create_table "projects", force: :cascade do |t|
t.string "name", limit: 255
t.integer "customer_id", limit: 4
t.integer "supplier_id", limit: 4
t.datetime "created_at"
t.datetime "updated_at"
end
add_index "projects", ["customer_id"], name: "index_projects_on_customer_id", using: :btree
add_index "projects", ["supplier_id"], name: "index_projects_on_supplier_id", using: :btree
create_table "statuses", force: :cascade do |t|
t.string "name", limit: 255
t.integer "position", limit: 4
t.datetime "created_at"
t.datetime "updated_at"
end
add_index "statuses", ["name"], name: "index_statuses_on_name", using: :btree
add_index "statuses", ["position"], name: "index_statuses_on_position", using: :btree
create_table "tasks", force: :cascade do |t|
t.string "title", limit: 255
t.text "description", limit: 65535
t.integer "created_by_id", limit: 4
t.integer "project_id", limit: 4
t.date "due_date"
t.integer "priority_id", limit: 4
t.integer "status_id", limit: 4
t.integer "relevant_version_id", limit: 4
t.integer "expected_version_id", limit: 4
t.float "estimated_time", limit: 24
t.boolean "archived"
t.datetime "created_at"
t.datetime "updated_at"
end
add_index "tasks", ["created_by_id"], name: "index_tasks_on_created_by_id", using: :btree
add_index "tasks", ["expected_version_id"], name: "index_tasks_on_expected_version_id", using: :btree
add_index "tasks", ["priority_id"], name: "index_tasks_on_priority_id", using: :btree
add_index "tasks", ["project_id"], name: "index_tasks_on_project_id", using: :btree
add_index "tasks", ["relevant_version_id"], name: "index_tasks_on_relevant_version_id", using: :btree
add_index "tasks", ["status_id"], name: "index_tasks_on_status_id", using: :btree
add_index "tasks", ["title"], name: "index_tasks_on_title", using: :btree
create_table "tasks_users", id: false, force: :cascade do |t|
t.integer "task_id", limit: 4
t.integer "user_id", limit: 4
end
add_index "tasks_users", ["task_id"], name: "index_tasks_users_on_task_id", using: :btree
add_index "tasks_users", ["user_id"], name: "index_tasks_users_on_user_id", using: :btree
create_table "user_project_participations", force: :cascade do |t|
t.integer "project_id", limit: 4
t.integer "user_id", limit: 4
t.integer "project_role_id", limit: 4
t.datetime "created_at"
t.datetime "updated_at"
end
add_index "user_project_participations", ["project_id"], name: "index_user_project_participations_on_project_id", using: :btree
add_index "user_project_participations", ["project_role_id"], name: "index_user_project_participations_on_project_role_id", using: :btree
add_index "user_project_participations", ["user_id"], name: "index_user_project_participations_on_user_id", using: :btree
create_table "users", force: :cascade do |t|
t.string "name", limit: 255
t.datetime "created_at"
t.datetime "updated_at"
end
add_index "users", ["name"], name: "index_users_on_name", using: :btree
create_table "versions", force: :cascade do |t|
t.string "name", limit: 255
t.integer "project_id", limit: 4
t.string "status", limit: 255
t.datetime "created_at"
t.datetime "updated_at"
end
add_index "versions", ["name"], name: "index_versions_on_name", using: :btree
add_index "versions", ["project_id"], name: "index_versions_on_project_id", using: :btree
add_index "versions", ["status"], name: "index_versions_on_status", using: :btree
create_table "wice_grid_serialized_queries", force: :cascade do |t|
t.string "name", limit: 255
t.string "grid_name", limit: 255
t.text "query", limit: 65535
t.datetime "created_at"
t.datetime "updated_at"
end
add_index "wice_grid_serialized_queries", ["grid_name", "id"], name: "index_wice_grid_serialized_queries_on_grid_name_and_id", using: :btree
add_index "wice_grid_serialized_queries", ["grid_name"], name: "index_wice_grid_serialized_queries_on_grid_name", using: :btree
end
================================================
FILE: spec/support/test_app/db/seeds.rb
================================================
# encoding: utf-8
# 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' }])
# Mayor.create(name: 'Emanuel', city: cities.first)
Populate.me
================================================
FILE: spec/support/test_app/lib/ar_fixtures.rb
================================================
# encoding: utf-8
# Extension to make it easy to read and write data to a file.
class ActiveRecord::Base
class << self
# Writes content of this table to db/table_name.yml, or the specified file.
#
# Writes all content by default, but can be limited.
def dump_to_file(path = nil, limit = nil)
opts = {}
opts[:limit] = limit if limit
path ||= "db/#{table_name}.yml"
write_file(File.expand_path(path, Rails.root), self.find(:all, opts).to_yaml)
end
# Delete existing data in database and load fresh from file in db/table_name.yml
def load_from_file(path = nil)
path ||= "db/#{table_name}.yml"
self.destroy_all
if connection.respond_to?(:reset_pk_sequence!)
connection.reset_pk_sequence!(table_name)
end
records = YAML.load(File.open(File.expand_path(path, Rails.root)))
records.each do |record|
record_copy = self.new(record.attributes)
record_copy.id = record.id
# For Single Table Inheritance
klass_col = record.class.inheritance_column.to_sym
if record[klass_col]
record_copy.type = record[klass_col]
end
record_copy.save
end
if connection.respond_to?(:reset_pk_sequence!)
connection.reset_pk_sequence!(table_name)
end
end
# Write a file that can be loaded with +fixture :some_table+ in tests.
# Uses existing data in the database.
#
# Will be written to +test/fixtures/table_name.yml+. Can be restricted to some number of rows.
def to_fixture(limit = nil)
opts = {}
opts[:limit] = limit if limit
write_file(File.expand_path("test/fixtures/#{table_name}.yml", Rails.root),
self.find(:all, opts).inject({}) do |hsh, record|
hsh.merge("#{table_name.singularize}_#{'%05i' % record.id}" => record.attributes)
end.to_yaml(SortKeys: true))
habtm_to_fixture
end
# Write the habtm association table
def habtm_to_fixture
joins = self.reflect_on_all_associations.select do |j|
j.macro == :has_and_belongs_to_many
end
joins.each do |join|
hsh = {}
connection.select_all("SELECT * FROM #{join.options[:join_table]}").each_with_index do |record, i|
hsh["join_#{'%05i' % i}"] = record
end
write_file(File.expand_path("test/fixtures/#{join.options[:join_table]}.yml", Rails.root), hsh.to_yaml(SortKeys: true))
end
end
# Generates a basic fixture file in test/fixtures that lists the table's field names.
#
# You can use it as a starting point for your own fixtures.
#
# record_1:
# name:
# rating:
# record_2:
# name:
# rating:
#
# TODO: Automatically add :id field if there is one.
def to_skeleton
record = {
'record_1' => self.new.attributes,
'record_2' => self.new.attributes
}
write_file(File.expand_path("test/fixtures/#{table_name}.yml", Rails.root),
record.to_yaml)
end
def write_file(path, content) # :nodoc:
f = File.new(path, 'w+')
f.puts content
f.close
end
end
end
================================================
FILE: spec/support/test_app/lib/assets/.gitkeep
================================================
================================================
FILE: spec/support/test_app/lib/tasks/.gitkeep
================================================
================================================
FILE: spec/support/test_app/lib/tasks/ar_fixtures.rake
================================================
# encoding: utf-8
require 'ar_fixtures'
def env_or_raise(var_name, human_name)
if ENV[var_name].blank?
fail "No #{var_name} value given. Set #{var_name}=#{human_name}"
else
return ENV[var_name]
end
end
def model_or_raise
env_or_raise('MODEL', 'ModelName')
end
def limit_or_nil_string
ENV['LIMIT'].blank? ? 'nil' : ENV['LIMIT']
end
namespace :db do
namespace :fixtures do
desc 'Dump data to the test/fixtures/ directory. Use MODEL=ModelName and LIMIT (optional)'
task dump_all: :environment do
[Company, Priority, Project, ProjectRole, Status, Task, User, Version].each(&:to_fixture)
end
desc 'Dump data to the test/fixtures/ directory. Use MODEL=ModelName and LIMIT (optional)'
task dump: :environment do
eval "#{model_or_raise}.to_fixture(#{limit_or_nil_string})"
end
end
namespace :data do
desc 'Dump data to the db/ directory. Use MODEL=ModelName and LIMIT (optional)'
task dump: :environment do
eval "#{model_or_raise}.dump_to_file(nil, #{limit_or_nil_string})"
puts "#{model_or_raise} has been dumped to the db folder."
end
desc 'Load data from the db/ directory. Use MODEL=ModelName'
task load: :environment do
eval "#{model_or_raise}.load_from_file"
end
end
end
================================================
FILE: spec/support/test_app/public/404.html
================================================
The page you were looking for doesn't exist (404)
The page you were looking for doesn't exist.
You may have mistyped the address or the page may have moved.
================================================
FILE: spec/support/test_app/public/422.html
================================================
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.
================================================
FILE: spec/support/test_app/public/500.html
================================================
We're sorry, but something went wrong (500)
We're sorry, but something went wrong.
================================================
FILE: spec/support/test_app/public/robots.txt
================================================
# See http://www.robotstxt.org/wc/norobots.html for documentation on how to use the robots.txt file
#
# To ban all spiders from the entire site uncomment the next two lines:
# User-Agent: *
# Disallow: /
================================================
FILE: spec/support/test_app/vendor/javascript/.keep
================================================
================================================
FILE: spec/support/test_app/vendor/javascript/@hotwired--stimulus.js
================================================
class EventListener{constructor(e,t,r){this.eventTarget=e;this.eventName=t;this.eventOptions=r;this.unorderedBindings=new Set}connect(){this.eventTarget.addEventListener(this.eventName,this,this.eventOptions)}disconnect(){this.eventTarget.removeEventListener(this.eventName,this,this.eventOptions)}bindingConnected(e){this.unorderedBindings.add(e)}bindingDisconnected(e){this.unorderedBindings.delete(e)}handleEvent(e){const t=extendEvent(e);for(const e of this.bindings){if(t.immediatePropagationStopped)break;e.handleEvent(t)}}hasBindings(){return this.unorderedBindings.size>0}get bindings(){return Array.from(this.unorderedBindings).sort(((e,t)=>{const r=e.index,s=t.index;return rs?1:0}))}}function extendEvent(e){if("immediatePropagationStopped"in e)return e;{const{stopImmediatePropagation:t}=e;return Object.assign(e,{immediatePropagationStopped:false,stopImmediatePropagation(){this.immediatePropagationStopped=true;t.call(this)}})}}class Dispatcher{constructor(e){this.application=e;this.eventListenerMaps=new Map;this.started=false}start(){if(!this.started){this.started=true;this.eventListeners.forEach((e=>e.connect()))}}stop(){if(this.started){this.started=false;this.eventListeners.forEach((e=>e.disconnect()))}}get eventListeners(){return Array.from(this.eventListenerMaps.values()).reduce(((e,t)=>e.concat(Array.from(t.values()))),[])}bindingConnected(e){this.fetchEventListenerForBinding(e).bindingConnected(e)}bindingDisconnected(e,t=false){this.fetchEventListenerForBinding(e).bindingDisconnected(e);t&&this.clearEventListenersForBinding(e)}handleError(e,t,r={}){this.application.handleError(e,`Error ${t}`,r)}clearEventListenersForBinding(e){const t=this.fetchEventListenerForBinding(e);if(!t.hasBindings()){t.disconnect();this.removeMappedEventListenerFor(e)}}removeMappedEventListenerFor(e){const{eventTarget:t,eventName:r,eventOptions:s}=e;const n=this.fetchEventListenerMapForEventTarget(t);const i=this.cacheKey(r,s);n.delete(i);0==n.size&&this.eventListenerMaps.delete(t)}fetchEventListenerForBinding(e){const{eventTarget:t,eventName:r,eventOptions:s}=e;return this.fetchEventListener(t,r,s)}fetchEventListener(e,t,r){const s=this.fetchEventListenerMapForEventTarget(e);const n=this.cacheKey(t,r);let i=s.get(n);if(!i){i=this.createEventListener(e,t,r);s.set(n,i)}return i}createEventListener(e,t,r){const s=new EventListener(e,t,r);this.started&&s.connect();return s}fetchEventListenerMapForEventTarget(e){let t=this.eventListenerMaps.get(e);if(!t){t=new Map;this.eventListenerMaps.set(e,t)}return t}cacheKey(e,t){const r=[e];Object.keys(t).sort().forEach((e=>{r.push(`${t[e]?"":"!"}${e}`)}));return r.join(":")}}const e={stop({event:e,value:t}){t&&e.stopPropagation();return true},prevent({event:e,value:t}){t&&e.preventDefault();return true},self({event:e,value:t,element:r}){return!t||r===e.target}};const t=/^(?:(?:([^.]+?)\+)?(.+?)(?:\.(.+?))?(?:@(window|document))?->)?(.+?)(?:#([^:]+?))(?::(.+))?$/;function parseActionDescriptorString(e){const r=e.trim();const s=r.match(t)||[];let n=s[2];let i=s[3];if(i&&!["keydown","keyup","keypress"].includes(n)){n+=`.${i}`;i=""}return{eventTarget:parseEventTarget(s[4]),eventName:n,eventOptions:s[7]?parseEventOptions(s[7]):{},identifier:s[5],methodName:s[6],keyFilter:s[1]||i}}function parseEventTarget(e){return"window"==e?window:"document"==e?document:void 0}function parseEventOptions(e){return e.split(":").reduce(((e,t)=>Object.assign(e,{[t.replace(/^!/,"")]:!/^!/.test(t)})),{})}function stringifyEventTarget(e){return e==window?"window":e==document?"document":void 0}function camelize(e){return e.replace(/(?:[_-])([a-z0-9])/g,((e,t)=>t.toUpperCase()))}function namespaceCamelize(e){return camelize(e.replace(/--/g,"-").replace(/__/g,"_"))}function capitalize(e){return e.charAt(0).toUpperCase()+e.slice(1)}function dasherize(e){return e.replace(/([A-Z])/g,((e,t)=>`-${t.toLowerCase()}`))}function tokenize(e){return e.match(/[^\s]+/g)||[]}function isSomething(e){return null!==e&&void 0!==e}function hasProperty(e,t){return Object.prototype.hasOwnProperty.call(e,t)}const r=["meta","ctrl","alt","shift"];class Action{constructor(e,t,r,s){this.element=e;this.index=t;this.eventTarget=r.eventTarget||e;this.eventName=r.eventName||getDefaultEventNameForElement(e)||error("missing event name");this.eventOptions=r.eventOptions||{};this.identifier=r.identifier||error("missing identifier");this.methodName=r.methodName||error("missing method name");this.keyFilter=r.keyFilter||"";this.schema=s}static forToken(e,t){return new this(e.element,e.index,parseActionDescriptorString(e.content),t)}toString(){const e=this.keyFilter?`.${this.keyFilter}`:"";const t=this.eventTargetName?`@${this.eventTargetName}`:"";return`${this.eventName}${e}${t}->${this.identifier}#${this.methodName}`}shouldIgnoreKeyboardEvent(e){if(!this.keyFilter)return false;const t=this.keyFilter.split("+");if(this.keyFilterDissatisfied(e,t))return true;const s=t.filter((e=>!r.includes(e)))[0];if(!s)return false;hasProperty(this.keyMappings,s)||error(`contains unknown key filter: ${this.keyFilter}`);return this.keyMappings[s].toLowerCase()!==e.key.toLowerCase()}shouldIgnoreMouseEvent(e){if(!this.keyFilter)return false;const t=[this.keyFilter];return!!this.keyFilterDissatisfied(e,t)}get params(){const e={};const t=new RegExp(`^data-${this.identifier}-(.+)-param$`,"i");for(const{name:r,value:s}of Array.from(this.element.attributes)){const n=r.match(t);const i=n&&n[1];i&&(e[camelize(i)]=typecast(s))}return e}get eventTargetName(){return stringifyEventTarget(this.eventTarget)}get keyMappings(){return this.schema.keyMappings}keyFilterDissatisfied(e,t){const[s,n,i,o]=r.map((e=>t.includes(e)));return e.metaKey!==s||e.ctrlKey!==n||e.altKey!==i||e.shiftKey!==o}}const s={a:()=>"click",button:()=>"click",form:()=>"submit",details:()=>"toggle",input:e=>"submit"==e.getAttribute("type")?"click":"input",select:()=>"change",textarea:()=>"input"};function getDefaultEventNameForElement(e){const t=e.tagName.toLowerCase();if(t in s)return s[t](e)}function error(e){throw new Error(e)}function typecast(e){try{return JSON.parse(e)}catch(t){return e}}class Binding{constructor(e,t){this.context=e;this.action=t}get index(){return this.action.index}get eventTarget(){return this.action.eventTarget}get eventOptions(){return this.action.eventOptions}get identifier(){return this.context.identifier}handleEvent(e){const t=this.prepareActionEvent(e);this.willBeInvokedByEvent(e)&&this.applyEventModifiers(t)&&this.invokeWithEvent(t)}get eventName(){return this.action.eventName}get method(){const e=this.controller[this.methodName];if("function"==typeof e)return e;throw new Error(`Action "${this.action}" references undefined method "${this.methodName}"`)}applyEventModifiers(e){const{element:t}=this.action;const{actionDescriptorFilters:r}=this.context.application;const{controller:s}=this.context;let n=true;for(const[i,o]of Object.entries(this.eventOptions))if(i in r){const c=r[i];n=n&&c({name:i,value:o,event:e,element:t,controller:s})}return n}prepareActionEvent(e){return Object.assign(e,{params:this.action.params})}invokeWithEvent(e){const{target:t,currentTarget:r}=e;try{this.method.call(this.controller,e);this.context.logDebugActivity(this.methodName,{event:e,target:t,currentTarget:r,action:this.methodName})}catch(t){const{identifier:r,controller:s,element:n,index:i}=this;const o={identifier:r,controller:s,element:n,index:i,event:e};this.context.handleError(t,`invoking action "${this.action}"`,o)}}willBeInvokedByEvent(e){const t=e.target;return!(e instanceof KeyboardEvent&&this.action.shouldIgnoreKeyboardEvent(e))&&(!(e instanceof MouseEvent&&this.action.shouldIgnoreMouseEvent(e))&&(this.element===t||(t instanceof Element&&this.element.contains(t)?this.scope.containsElement(t):this.scope.containsElement(this.action.element))))}get controller(){return this.context.controller}get methodName(){return this.action.methodName}get element(){return this.scope.element}get scope(){return this.context.scope}}class ElementObserver{constructor(e,t){this.mutationObserverInit={attributes:true,childList:true,subtree:true};this.element=e;this.started=false;this.delegate=t;this.elements=new Set;this.mutationObserver=new MutationObserver((e=>this.processMutations(e)))}start(){if(!this.started){this.started=true;this.mutationObserver.observe(this.element,this.mutationObserverInit);this.refresh()}}pause(e){if(this.started){this.mutationObserver.disconnect();this.started=false}e();if(!this.started){this.mutationObserver.observe(this.element,this.mutationObserverInit);this.started=true}}stop(){if(this.started){this.mutationObserver.takeRecords();this.mutationObserver.disconnect();this.started=false}}refresh(){if(this.started){const e=new Set(this.matchElementsInTree());for(const t of Array.from(this.elements))e.has(t)||this.removeElement(t);for(const t of Array.from(e))this.addElement(t)}}processMutations(e){if(this.started)for(const t of e)this.processMutation(t)}processMutation(e){if("attributes"==e.type)this.processAttributeChange(e.target,e.attributeName);else if("childList"==e.type){this.processRemovedNodes(e.removedNodes);this.processAddedNodes(e.addedNodes)}}processAttributeChange(e,t){this.elements.has(e)?this.delegate.elementAttributeChanged&&this.matchElement(e)?this.delegate.elementAttributeChanged(e,t):this.removeElement(e):this.matchElement(e)&&this.addElement(e)}processRemovedNodes(e){for(const t of Array.from(e)){const e=this.elementFromNode(t);e&&this.processTree(e,this.removeElement)}}processAddedNodes(e){for(const t of Array.from(e)){const e=this.elementFromNode(t);e&&this.elementIsActive(e)&&this.processTree(e,this.addElement)}}matchElement(e){return this.delegate.matchElement(e)}matchElementsInTree(e=this.element){return this.delegate.matchElementsInTree(e)}processTree(e,t){for(const r of this.matchElementsInTree(e))t.call(this,r)}elementFromNode(e){if(e.nodeType==Node.ELEMENT_NODE)return e}elementIsActive(e){return e.isConnected==this.element.isConnected&&this.element.contains(e)}addElement(e){if(!this.elements.has(e)&&this.elementIsActive(e)){this.elements.add(e);this.delegate.elementMatched&&this.delegate.elementMatched(e)}}removeElement(e){if(this.elements.has(e)){this.elements.delete(e);this.delegate.elementUnmatched&&this.delegate.elementUnmatched(e)}}}class AttributeObserver{constructor(e,t,r){this.attributeName=t;this.delegate=r;this.elementObserver=new ElementObserver(e,this)}get element(){return this.elementObserver.element}get selector(){return`[${this.attributeName}]`}start(){this.elementObserver.start()}pause(e){this.elementObserver.pause(e)}stop(){this.elementObserver.stop()}refresh(){this.elementObserver.refresh()}get started(){return this.elementObserver.started}matchElement(e){return e.hasAttribute(this.attributeName)}matchElementsInTree(e){const t=this.matchElement(e)?[e]:[];const r=Array.from(e.querySelectorAll(this.selector));return t.concat(r)}elementMatched(e){this.delegate.elementMatchedAttribute&&this.delegate.elementMatchedAttribute(e,this.attributeName)}elementUnmatched(e){this.delegate.elementUnmatchedAttribute&&this.delegate.elementUnmatchedAttribute(e,this.attributeName)}elementAttributeChanged(e,t){this.delegate.elementAttributeValueChanged&&this.attributeName==t&&this.delegate.elementAttributeValueChanged(e,t)}}function add(e,t,r){fetch(e,t).add(r)}function del(e,t,r){fetch(e,t).delete(r);prune(e,t)}function fetch(e,t){let r=e.get(t);if(!r){r=new Set;e.set(t,r)}return r}function prune(e,t){const r=e.get(t);null!=r&&0==r.size&&e.delete(t)}class Multimap{constructor(){this.valuesByKey=new Map}get keys(){return Array.from(this.valuesByKey.keys())}get values(){const e=Array.from(this.valuesByKey.values());return e.reduce(((e,t)=>e.concat(Array.from(t))),[])}get size(){const e=Array.from(this.valuesByKey.values());return e.reduce(((e,t)=>e+t.size),0)}add(e,t){add(this.valuesByKey,e,t)}delete(e,t){del(this.valuesByKey,e,t)}has(e,t){const r=this.valuesByKey.get(e);return null!=r&&r.has(t)}hasKey(e){return this.valuesByKey.has(e)}hasValue(e){const t=Array.from(this.valuesByKey.values());return t.some((t=>t.has(e)))}getValuesForKey(e){const t=this.valuesByKey.get(e);return t?Array.from(t):[]}getKeysForValue(e){return Array.from(this.valuesByKey).filter((([t,r])=>r.has(e))).map((([e,t])=>e))}}class IndexedMultimap extends Multimap{constructor(){super();this.keysByValue=new Map}get values(){return Array.from(this.keysByValue.keys())}add(e,t){super.add(e,t);add(this.keysByValue,t,e)}delete(e,t){super.delete(e,t);del(this.keysByValue,t,e)}hasValue(e){return this.keysByValue.has(e)}getKeysForValue(e){const t=this.keysByValue.get(e);return t?Array.from(t):[]}}class SelectorObserver{constructor(e,t,r,s){this._selector=t;this.details=s;this.elementObserver=new ElementObserver(e,this);this.delegate=r;this.matchesByElement=new Multimap}get started(){return this.elementObserver.started}get selector(){return this._selector}set selector(e){this._selector=e;this.refresh()}start(){this.elementObserver.start()}pause(e){this.elementObserver.pause(e)}stop(){this.elementObserver.stop()}refresh(){this.elementObserver.refresh()}get element(){return this.elementObserver.element}matchElement(e){const{selector:t}=this;if(t){const r=e.matches(t);return this.delegate.selectorMatchElement?r&&this.delegate.selectorMatchElement(e,this.details):r}return false}matchElementsInTree(e){const{selector:t}=this;if(t){const r=this.matchElement(e)?[e]:[];const s=Array.from(e.querySelectorAll(t)).filter((e=>this.matchElement(e)));return r.concat(s)}return[]}elementMatched(e){const{selector:t}=this;t&&this.selectorMatched(e,t)}elementUnmatched(e){const t=this.matchesByElement.getKeysForValue(e);for(const r of t)this.selectorUnmatched(e,r)}elementAttributeChanged(e,t){const{selector:r}=this;if(r){const t=this.matchElement(e);const s=this.matchesByElement.has(r,e);t&&!s?this.selectorMatched(e,r):!t&&s&&this.selectorUnmatched(e,r)}}selectorMatched(e,t){this.delegate.selectorMatched(e,t,this.details);this.matchesByElement.add(t,e)}selectorUnmatched(e,t){this.delegate.selectorUnmatched(e,t,this.details);this.matchesByElement.delete(t,e)}}class StringMapObserver{constructor(e,t){this.element=e;this.delegate=t;this.started=false;this.stringMap=new Map;this.mutationObserver=new MutationObserver((e=>this.processMutations(e)))}start(){if(!this.started){this.started=true;this.mutationObserver.observe(this.element,{attributes:true,attributeOldValue:true});this.refresh()}}stop(){if(this.started){this.mutationObserver.takeRecords();this.mutationObserver.disconnect();this.started=false}}refresh(){if(this.started)for(const e of this.knownAttributeNames)this.refreshAttribute(e,null)}processMutations(e){if(this.started)for(const t of e)this.processMutation(t)}processMutation(e){const t=e.attributeName;t&&this.refreshAttribute(t,e.oldValue)}refreshAttribute(e,t){const r=this.delegate.getStringMapKeyForAttribute(e);if(null!=r){this.stringMap.has(e)||this.stringMapKeyAdded(r,e);const s=this.element.getAttribute(e);this.stringMap.get(e)!=s&&this.stringMapValueChanged(s,r,t);if(null==s){const t=this.stringMap.get(e);this.stringMap.delete(e);t&&this.stringMapKeyRemoved(r,e,t)}else this.stringMap.set(e,s)}}stringMapKeyAdded(e,t){this.delegate.stringMapKeyAdded&&this.delegate.stringMapKeyAdded(e,t)}stringMapValueChanged(e,t,r){this.delegate.stringMapValueChanged&&this.delegate.stringMapValueChanged(e,t,r)}stringMapKeyRemoved(e,t,r){this.delegate.stringMapKeyRemoved&&this.delegate.stringMapKeyRemoved(e,t,r)}get knownAttributeNames(){return Array.from(new Set(this.currentAttributeNames.concat(this.recordedAttributeNames)))}get currentAttributeNames(){return Array.from(this.element.attributes).map((e=>e.name))}get recordedAttributeNames(){return Array.from(this.stringMap.keys())}}class TokenListObserver{constructor(e,t,r){this.attributeObserver=new AttributeObserver(e,t,this);this.delegate=r;this.tokensByElement=new Multimap}get started(){return this.attributeObserver.started}start(){this.attributeObserver.start()}pause(e){this.attributeObserver.pause(e)}stop(){this.attributeObserver.stop()}refresh(){this.attributeObserver.refresh()}get element(){return this.attributeObserver.element}get attributeName(){return this.attributeObserver.attributeName}elementMatchedAttribute(e){this.tokensMatched(this.readTokensForElement(e))}elementAttributeValueChanged(e){const[t,r]=this.refreshTokensForElement(e);this.tokensUnmatched(t);this.tokensMatched(r)}elementUnmatchedAttribute(e){this.tokensUnmatched(this.tokensByElement.getValuesForKey(e))}tokensMatched(e){e.forEach((e=>this.tokenMatched(e)))}tokensUnmatched(e){e.forEach((e=>this.tokenUnmatched(e)))}tokenMatched(e){this.delegate.tokenMatched(e);this.tokensByElement.add(e.element,e)}tokenUnmatched(e){this.delegate.tokenUnmatched(e);this.tokensByElement.delete(e.element,e)}refreshTokensForElement(e){const t=this.tokensByElement.getValuesForKey(e);const r=this.readTokensForElement(e);const s=zip(t,r).findIndex((([e,t])=>!tokensAreEqual(e,t)));return-1==s?[[],[]]:[t.slice(s),r.slice(s)]}readTokensForElement(e){const t=this.attributeName;const r=e.getAttribute(t)||"";return parseTokenString(r,e,t)}}function parseTokenString(e,t,r){return e.trim().split(/\s+/).filter((e=>e.length)).map(((e,s)=>({element:t,attributeName:r,content:e,index:s})))}function zip(e,t){const r=Math.max(e.length,t.length);return Array.from({length:r},((r,s)=>[e[s],t[s]]))}function tokensAreEqual(e,t){return e&&t&&e.index==t.index&&e.content==t.content}class ValueListObserver{constructor(e,t,r){this.tokenListObserver=new TokenListObserver(e,t,this);this.delegate=r;this.parseResultsByToken=new WeakMap;this.valuesByTokenByElement=new WeakMap}get started(){return this.tokenListObserver.started}start(){this.tokenListObserver.start()}stop(){this.tokenListObserver.stop()}refresh(){this.tokenListObserver.refresh()}get element(){return this.tokenListObserver.element}get attributeName(){return this.tokenListObserver.attributeName}tokenMatched(e){const{element:t}=e;const{value:r}=this.fetchParseResultForToken(e);if(r){this.fetchValuesByTokenForElement(t).set(e,r);this.delegate.elementMatchedValue(t,r)}}tokenUnmatched(e){const{element:t}=e;const{value:r}=this.fetchParseResultForToken(e);if(r){this.fetchValuesByTokenForElement(t).delete(e);this.delegate.elementUnmatchedValue(t,r)}}fetchParseResultForToken(e){let t=this.parseResultsByToken.get(e);if(!t){t=this.parseToken(e);this.parseResultsByToken.set(e,t)}return t}fetchValuesByTokenForElement(e){let t=this.valuesByTokenByElement.get(e);if(!t){t=new Map;this.valuesByTokenByElement.set(e,t)}return t}parseToken(e){try{const t=this.delegate.parseValueForToken(e);return{value:t}}catch(e){return{error:e}}}}class BindingObserver{constructor(e,t){this.context=e;this.delegate=t;this.bindingsByAction=new Map}start(){if(!this.valueListObserver){this.valueListObserver=new ValueListObserver(this.element,this.actionAttribute,this);this.valueListObserver.start()}}stop(){if(this.valueListObserver){this.valueListObserver.stop();delete this.valueListObserver;this.disconnectAllActions()}}get element(){return this.context.element}get identifier(){return this.context.identifier}get actionAttribute(){return this.schema.actionAttribute}get schema(){return this.context.schema}get bindings(){return Array.from(this.bindingsByAction.values())}connectAction(e){const t=new Binding(this.context,e);this.bindingsByAction.set(e,t);this.delegate.bindingConnected(t)}disconnectAction(e){const t=this.bindingsByAction.get(e);if(t){this.bindingsByAction.delete(e);this.delegate.bindingDisconnected(t)}}disconnectAllActions(){this.bindings.forEach((e=>this.delegate.bindingDisconnected(e,true)));this.bindingsByAction.clear()}parseValueForToken(e){const t=Action.forToken(e,this.schema);if(t.identifier==this.identifier)return t}elementMatchedValue(e,t){this.connectAction(t)}elementUnmatchedValue(e,t){this.disconnectAction(t)}}class ValueObserver{constructor(e,t){this.context=e;this.receiver=t;this.stringMapObserver=new StringMapObserver(this.element,this);this.valueDescriptorMap=this.controller.valueDescriptorMap}start(){this.stringMapObserver.start();this.invokeChangedCallbacksForDefaultValues()}stop(){this.stringMapObserver.stop()}get element(){return this.context.element}get controller(){return this.context.controller}getStringMapKeyForAttribute(e){if(e in this.valueDescriptorMap)return this.valueDescriptorMap[e].name}stringMapKeyAdded(e,t){const r=this.valueDescriptorMap[t];this.hasValue(e)||this.invokeChangedCallback(e,r.writer(this.receiver[e]),r.writer(r.defaultValue))}stringMapValueChanged(e,t,r){const s=this.valueDescriptorNameMap[t];if(null!==e){null===r&&(r=s.writer(s.defaultValue));this.invokeChangedCallback(t,e,r)}}stringMapKeyRemoved(e,t,r){const s=this.valueDescriptorNameMap[e];this.hasValue(e)?this.invokeChangedCallback(e,s.writer(this.receiver[e]),r):this.invokeChangedCallback(e,s.writer(s.defaultValue),r)}invokeChangedCallbacksForDefaultValues(){for(const{key:e,name:t,defaultValue:r,writer:s}of this.valueDescriptors)void 0==r||this.controller.data.has(e)||this.invokeChangedCallback(t,s(r),void 0)}invokeChangedCallback(e,t,r){const s=`${e}Changed`;const n=this.receiver[s];if("function"==typeof n){const s=this.valueDescriptorNameMap[e];try{const e=s.reader(t);let i=r;r&&(i=s.reader(r));n.call(this.receiver,e,i)}catch(e){e instanceof TypeError&&(e.message=`Stimulus Value "${this.context.identifier}.${s.name}" - ${e.message}`);throw e}}}get valueDescriptors(){const{valueDescriptorMap:e}=this;return Object.keys(e).map((t=>e[t]))}get valueDescriptorNameMap(){const e={};Object.keys(this.valueDescriptorMap).forEach((t=>{const r=this.valueDescriptorMap[t];e[r.name]=r}));return e}hasValue(e){const t=this.valueDescriptorNameMap[e];const r=`has${capitalize(t.name)}`;return this.receiver[r]}}class TargetObserver{constructor(e,t){this.context=e;this.delegate=t;this.targetsByName=new Multimap}start(){if(!this.tokenListObserver){this.tokenListObserver=new TokenListObserver(this.element,this.attributeName,this);this.tokenListObserver.start()}}stop(){if(this.tokenListObserver){this.disconnectAllTargets();this.tokenListObserver.stop();delete this.tokenListObserver}}tokenMatched({element:e,content:t}){this.scope.containsElement(e)&&this.connectTarget(e,t)}tokenUnmatched({element:e,content:t}){this.disconnectTarget(e,t)}connectTarget(e,t){var r;if(!this.targetsByName.has(t,e)){this.targetsByName.add(t,e);null===(r=this.tokenListObserver)||void 0===r?void 0:r.pause((()=>this.delegate.targetConnected(e,t)))}}disconnectTarget(e,t){var r;if(this.targetsByName.has(t,e)){this.targetsByName.delete(t,e);null===(r=this.tokenListObserver)||void 0===r?void 0:r.pause((()=>this.delegate.targetDisconnected(e,t)))}}disconnectAllTargets(){for(const e of this.targetsByName.keys)for(const t of this.targetsByName.getValuesForKey(e))this.disconnectTarget(t,e)}get attributeName(){return`data-${this.context.identifier}-target`}get element(){return this.context.element}get scope(){return this.context.scope}}function readInheritableStaticArrayValues(e,t){const r=getAncestorsForConstructor(e);return Array.from(r.reduce(((e,r)=>{getOwnStaticArrayValues(r,t).forEach((t=>e.add(t)));return e}),new Set))}function readInheritableStaticObjectPairs(e,t){const r=getAncestorsForConstructor(e);return r.reduce(((e,r)=>{e.push(...getOwnStaticObjectPairs(r,t));return e}),[])}function getAncestorsForConstructor(e){const t=[];while(e){t.push(e);e=Object.getPrototypeOf(e)}return t.reverse()}function getOwnStaticArrayValues(e,t){const r=e[t];return Array.isArray(r)?r:[]}function getOwnStaticObjectPairs(e,t){const r=e[t];return r?Object.keys(r).map((e=>[e,r[e]])):[]}class OutletObserver{constructor(e,t){this.started=false;this.context=e;this.delegate=t;this.outletsByName=new Multimap;this.outletElementsByName=new Multimap;this.selectorObserverMap=new Map;this.attributeObserverMap=new Map}start(){if(!this.started){this.outletDefinitions.forEach((e=>{this.setupSelectorObserverForOutlet(e);this.setupAttributeObserverForOutlet(e)}));this.started=true;this.dependentContexts.forEach((e=>e.refresh()))}}refresh(){this.selectorObserverMap.forEach((e=>e.refresh()));this.attributeObserverMap.forEach((e=>e.refresh()))}stop(){if(this.started){this.started=false;this.disconnectAllOutlets();this.stopSelectorObservers();this.stopAttributeObservers()}}stopSelectorObservers(){if(this.selectorObserverMap.size>0){this.selectorObserverMap.forEach((e=>e.stop()));this.selectorObserverMap.clear()}}stopAttributeObservers(){if(this.attributeObserverMap.size>0){this.attributeObserverMap.forEach((e=>e.stop()));this.attributeObserverMap.clear()}}selectorMatched(e,t,{outletName:r}){const s=this.getOutlet(e,r);s&&this.connectOutlet(s,e,r)}selectorUnmatched(e,t,{outletName:r}){const s=this.getOutletFromMap(e,r);s&&this.disconnectOutlet(s,e,r)}selectorMatchElement(e,{outletName:t}){const r=this.selector(t);const s=this.hasOutlet(e,t);const n=e.matches(`[${this.schema.controllerAttribute}~=${t}]`);return!!r&&(s&&n&&e.matches(r))}elementMatchedAttribute(e,t){const r=this.getOutletNameFromOutletAttributeName(t);r&&this.updateSelectorObserverForOutlet(r)}elementAttributeValueChanged(e,t){const r=this.getOutletNameFromOutletAttributeName(t);r&&this.updateSelectorObserverForOutlet(r)}elementUnmatchedAttribute(e,t){const r=this.getOutletNameFromOutletAttributeName(t);r&&this.updateSelectorObserverForOutlet(r)}connectOutlet(e,t,r){var s;if(!this.outletElementsByName.has(r,t)){this.outletsByName.add(r,e);this.outletElementsByName.add(r,t);null===(s=this.selectorObserverMap.get(r))||void 0===s?void 0:s.pause((()=>this.delegate.outletConnected(e,t,r)))}}disconnectOutlet(e,t,r){var s;if(this.outletElementsByName.has(r,t)){this.outletsByName.delete(r,e);this.outletElementsByName.delete(r,t);null===(s=this.selectorObserverMap.get(r))||void 0===s?void 0:s.pause((()=>this.delegate.outletDisconnected(e,t,r)))}}disconnectAllOutlets(){for(const e of this.outletElementsByName.keys)for(const t of this.outletElementsByName.getValuesForKey(e))for(const r of this.outletsByName.getValuesForKey(e))this.disconnectOutlet(r,t,e)}updateSelectorObserverForOutlet(e){const t=this.selectorObserverMap.get(e);t&&(t.selector=this.selector(e))}setupSelectorObserverForOutlet(e){const t=this.selector(e);const r=new SelectorObserver(document.body,t,this,{outletName:e});this.selectorObserverMap.set(e,r);r.start()}setupAttributeObserverForOutlet(e){const t=this.attributeNameForOutletName(e);const r=new AttributeObserver(this.scope.element,t,this);this.attributeObserverMap.set(e,r);r.start()}selector(e){return this.scope.outlets.getSelectorForOutletName(e)}attributeNameForOutletName(e){return this.scope.schema.outletAttributeForScope(this.identifier,e)}getOutletNameFromOutletAttributeName(e){return this.outletDefinitions.find((t=>this.attributeNameForOutletName(t)===e))}get outletDependencies(){const e=new Multimap;this.router.modules.forEach((t=>{const r=t.definition.controllerConstructor;const s=readInheritableStaticArrayValues(r,"outlets");s.forEach((r=>e.add(r,t.identifier)))}));return e}get outletDefinitions(){return this.outletDependencies.getKeysForValue(this.identifier)}get dependentControllerIdentifiers(){return this.outletDependencies.getValuesForKey(this.identifier)}get dependentContexts(){const e=this.dependentControllerIdentifiers;return this.router.contexts.filter((t=>e.includes(t.identifier)))}hasOutlet(e,t){return!!this.getOutlet(e,t)||!!this.getOutletFromMap(e,t)}getOutlet(e,t){return this.application.getControllerForElementAndIdentifier(e,t)}getOutletFromMap(e,t){return this.outletsByName.getValuesForKey(t).find((t=>t.element===e))}get scope(){return this.context.scope}get schema(){return this.context.schema}get identifier(){return this.context.identifier}get application(){return this.context.application}get router(){return this.application.router}}class Context{constructor(e,t){this.logDebugActivity=(e,t={})=>{const{identifier:r,controller:s,element:n}=this;t=Object.assign({identifier:r,controller:s,element:n},t);this.application.logDebugActivity(this.identifier,e,t)};this.module=e;this.scope=t;this.controller=new e.controllerConstructor(this);this.bindingObserver=new BindingObserver(this,this.dispatcher);this.valueObserver=new ValueObserver(this,this.controller);this.targetObserver=new TargetObserver(this,this);this.outletObserver=new OutletObserver(this,this);try{this.controller.initialize();this.logDebugActivity("initialize")}catch(e){this.handleError(e,"initializing controller")}}connect(){this.bindingObserver.start();this.valueObserver.start();this.targetObserver.start();this.outletObserver.start();try{this.controller.connect();this.logDebugActivity("connect")}catch(e){this.handleError(e,"connecting controller")}}refresh(){this.outletObserver.refresh()}disconnect(){try{this.controller.disconnect();this.logDebugActivity("disconnect")}catch(e){this.handleError(e,"disconnecting controller")}this.outletObserver.stop();this.targetObserver.stop();this.valueObserver.stop();this.bindingObserver.stop()}get application(){return this.module.application}get identifier(){return this.module.identifier}get schema(){return this.application.schema}get dispatcher(){return this.application.dispatcher}get element(){return this.scope.element}get parentElement(){return this.element.parentElement}handleError(e,t,r={}){const{identifier:s,controller:n,element:i}=this;r=Object.assign({identifier:s,controller:n,element:i},r);this.application.handleError(e,`Error ${t}`,r)}targetConnected(e,t){this.invokeControllerMethod(`${t}TargetConnected`,e)}targetDisconnected(e,t){this.invokeControllerMethod(`${t}TargetDisconnected`,e)}outletConnected(e,t,r){this.invokeControllerMethod(`${namespaceCamelize(r)}OutletConnected`,e,t)}outletDisconnected(e,t,r){this.invokeControllerMethod(`${namespaceCamelize(r)}OutletDisconnected`,e,t)}invokeControllerMethod(e,...t){const r=this.controller;"function"==typeof r[e]&&r[e](...t)}}function bless(e){return shadow(e,getBlessedProperties(e))}function shadow(e,t){const r=i(e);const s=getShadowProperties(e.prototype,t);Object.defineProperties(r.prototype,s);return r}function getBlessedProperties(e){const t=readInheritableStaticArrayValues(e,"blessings");return t.reduce(((t,r)=>{const s=r(e);for(const e in s){const r=t[e]||{};t[e]=Object.assign(r,s[e])}return t}),{})}function getShadowProperties(e,t){return n(t).reduce(((r,s)=>{const n=getShadowedDescriptor(e,t,s);n&&Object.assign(r,{[s]:n});return r}),{})}function getShadowedDescriptor(e,t,r){const s=Object.getOwnPropertyDescriptor(e,r);const n=s&&"value"in s;if(!n){const e=Object.getOwnPropertyDescriptor(t,r).value;if(s){e.get=s.get||e.get;e.set=s.set||e.set}return e}}const n=(()=>"function"==typeof Object.getOwnPropertySymbols?e=>[...Object.getOwnPropertyNames(e),...Object.getOwnPropertySymbols(e)]:Object.getOwnPropertyNames)();const i=(()=>{function extendWithReflect(e){function extended(){return Reflect.construct(e,arguments,new.target)}extended.prototype=Object.create(e.prototype,{constructor:{value:extended}});Reflect.setPrototypeOf(extended,e);return extended}function testReflectExtension(){const a=function(){this.a.call(this)};const e=extendWithReflect(a);e.prototype.a=function(){};return new e}try{testReflectExtension();return extendWithReflect}catch(e){return e=>class extended extends e{}}})();function blessDefinition(e){return{identifier:e.identifier,controllerConstructor:bless(e.controllerConstructor)}}class Module{constructor(e,t){this.application=e;this.definition=blessDefinition(t);this.contextsByScope=new WeakMap;this.connectedContexts=new Set}get identifier(){return this.definition.identifier}get controllerConstructor(){return this.definition.controllerConstructor}get contexts(){return Array.from(this.connectedContexts)}connectContextForScope(e){const t=this.fetchContextForScope(e);this.connectedContexts.add(t);t.connect()}disconnectContextForScope(e){const t=this.contextsByScope.get(e);if(t){this.connectedContexts.delete(t);t.disconnect()}}fetchContextForScope(e){let t=this.contextsByScope.get(e);if(!t){t=new Context(this,e);this.contextsByScope.set(e,t)}return t}}class ClassMap{constructor(e){this.scope=e}has(e){return this.data.has(this.getDataKey(e))}get(e){return this.getAll(e)[0]}getAll(e){const t=this.data.get(this.getDataKey(e))||"";return tokenize(t)}getAttributeName(e){return this.data.getAttributeNameForKey(this.getDataKey(e))}getDataKey(e){return`${e}-class`}get data(){return this.scope.data}}class DataMap{constructor(e){this.scope=e}get element(){return this.scope.element}get identifier(){return this.scope.identifier}get(e){const t=this.getAttributeNameForKey(e);return this.element.getAttribute(t)}set(e,t){const r=this.getAttributeNameForKey(e);this.element.setAttribute(r,t);return this.get(e)}has(e){const t=this.getAttributeNameForKey(e);return this.element.hasAttribute(t)}delete(e){if(this.has(e)){const t=this.getAttributeNameForKey(e);this.element.removeAttribute(t);return true}return false}getAttributeNameForKey(e){return`data-${this.identifier}-${dasherize(e)}`}}class Guide{constructor(e){this.warnedKeysByObject=new WeakMap;this.logger=e}warn(e,t,r){let s=this.warnedKeysByObject.get(e);if(!s){s=new Set;this.warnedKeysByObject.set(e,s)}if(!s.has(t)){s.add(t);this.logger.warn(r,e)}}}function attributeValueContainsToken(e,t){return`[${e}~="${t}"]`}class TargetSet{constructor(e){this.scope=e}get element(){return this.scope.element}get identifier(){return this.scope.identifier}get schema(){return this.scope.schema}has(e){return null!=this.find(e)}find(...e){return e.reduce(((e,t)=>e||this.findTarget(t)||this.findLegacyTarget(t)),void 0)}findAll(...e){return e.reduce(((e,t)=>[...e,...this.findAllTargets(t),...this.findAllLegacyTargets(t)]),[])}findTarget(e){const t=this.getSelectorForTargetName(e);return this.scope.findElement(t)}findAllTargets(e){const t=this.getSelectorForTargetName(e);return this.scope.findAllElements(t)}getSelectorForTargetName(e){const t=this.schema.targetAttributeForScope(this.identifier);return attributeValueContainsToken(t,e)}findLegacyTarget(e){const t=this.getLegacySelectorForTargetName(e);return this.deprecate(this.scope.findElement(t),e)}findAllLegacyTargets(e){const t=this.getLegacySelectorForTargetName(e);return this.scope.findAllElements(t).map((t=>this.deprecate(t,e)))}getLegacySelectorForTargetName(e){const t=`${this.identifier}.${e}`;return attributeValueContainsToken(this.schema.targetAttribute,t)}deprecate(e,t){if(e){const{identifier:r}=this;const s=this.schema.targetAttribute;const n=this.schema.targetAttributeForScope(r);this.guide.warn(e,`target:${t}`,`Please replace ${s}="${r}.${t}" with ${n}="${t}". The ${s} attribute is deprecated and will be removed in a future version of Stimulus.`)}return e}get guide(){return this.scope.guide}}class OutletSet{constructor(e,t){this.scope=e;this.controllerElement=t}get element(){return this.scope.element}get identifier(){return this.scope.identifier}get schema(){return this.scope.schema}has(e){return null!=this.find(e)}find(...e){return e.reduce(((e,t)=>e||this.findOutlet(t)),void 0)}findAll(...e){return e.reduce(((e,t)=>[...e,...this.findAllOutlets(t)]),[])}getSelectorForOutletName(e){const t=this.schema.outletAttributeForScope(this.identifier,e);return this.controllerElement.getAttribute(t)}findOutlet(e){const t=this.getSelectorForOutletName(e);if(t)return this.findElement(t,e)}findAllOutlets(e){const t=this.getSelectorForOutletName(e);return t?this.findAllElements(t,e):[]}findElement(e,t){const r=this.scope.queryElements(e);return r.filter((r=>this.matchesElement(r,e,t)))[0]}findAllElements(e,t){const r=this.scope.queryElements(e);return r.filter((r=>this.matchesElement(r,e,t)))}matchesElement(e,t,r){const s=e.getAttribute(this.scope.schema.controllerAttribute)||"";return e.matches(t)&&s.split(" ").includes(r)}}class Scope{constructor(e,t,r,s){this.targets=new TargetSet(this);this.classes=new ClassMap(this);this.data=new DataMap(this);this.containsElement=e=>e.closest(this.controllerSelector)===this.element;this.schema=e;this.element=t;this.identifier=r;this.guide=new Guide(s);this.outlets=new OutletSet(this.documentScope,t)}findElement(e){return this.element.matches(e)?this.element:this.queryElements(e).find(this.containsElement)}findAllElements(e){return[...this.element.matches(e)?[this.element]:[],...this.queryElements(e).filter(this.containsElement)]}queryElements(e){return Array.from(this.element.querySelectorAll(e))}get controllerSelector(){return attributeValueContainsToken(this.schema.controllerAttribute,this.identifier)}get isDocumentScope(){return this.element===document.documentElement}get documentScope(){return this.isDocumentScope?this:new Scope(this.schema,document.documentElement,this.identifier,this.guide.logger)}}class ScopeObserver{constructor(e,t,r){this.element=e;this.schema=t;this.delegate=r;this.valueListObserver=new ValueListObserver(this.element,this.controllerAttribute,this);this.scopesByIdentifierByElement=new WeakMap;this.scopeReferenceCounts=new WeakMap}start(){this.valueListObserver.start()}stop(){this.valueListObserver.stop()}get controllerAttribute(){return this.schema.controllerAttribute}parseValueForToken(e){const{element:t,content:r}=e;return this.parseValueForElementAndIdentifier(t,r)}parseValueForElementAndIdentifier(e,t){const r=this.fetchScopesByIdentifierForElement(e);let s=r.get(t);if(!s){s=this.delegate.createScopeForElementAndIdentifier(e,t);r.set(t,s)}return s}elementMatchedValue(e,t){const r=(this.scopeReferenceCounts.get(t)||0)+1;this.scopeReferenceCounts.set(t,r);1==r&&this.delegate.scopeConnected(t)}elementUnmatchedValue(e,t){const r=this.scopeReferenceCounts.get(t);if(r){this.scopeReferenceCounts.set(t,r-1);1==r&&this.delegate.scopeDisconnected(t)}}fetchScopesByIdentifierForElement(e){let t=this.scopesByIdentifierByElement.get(e);if(!t){t=new Map;this.scopesByIdentifierByElement.set(e,t)}return t}}class Router{constructor(e){this.application=e;this.scopeObserver=new ScopeObserver(this.element,this.schema,this);this.scopesByIdentifier=new Multimap;this.modulesByIdentifier=new Map}get element(){return this.application.element}get schema(){return this.application.schema}get logger(){return this.application.logger}get controllerAttribute(){return this.schema.controllerAttribute}get modules(){return Array.from(this.modulesByIdentifier.values())}get contexts(){return this.modules.reduce(((e,t)=>e.concat(t.contexts)),[])}start(){this.scopeObserver.start()}stop(){this.scopeObserver.stop()}loadDefinition(e){this.unloadIdentifier(e.identifier);const t=new Module(this.application,e);this.connectModule(t);const r=e.controllerConstructor.afterLoad;r&&r.call(e.controllerConstructor,e.identifier,this.application)}unloadIdentifier(e){const t=this.modulesByIdentifier.get(e);t&&this.disconnectModule(t)}getContextForElementAndIdentifier(e,t){const r=this.modulesByIdentifier.get(t);if(r)return r.contexts.find((t=>t.element==e))}proposeToConnectScopeForElementAndIdentifier(e,t){const r=this.scopeObserver.parseValueForElementAndIdentifier(e,t);r?this.scopeObserver.elementMatchedValue(r.element,r):console.error(`Couldn't find or create scope for identifier: "${t}" and element:`,e)}handleError(e,t,r){this.application.handleError(e,t,r)}createScopeForElementAndIdentifier(e,t){return new Scope(this.schema,e,t,this.logger)}scopeConnected(e){this.scopesByIdentifier.add(e.identifier,e);const t=this.modulesByIdentifier.get(e.identifier);t&&t.connectContextForScope(e)}scopeDisconnected(e){this.scopesByIdentifier.delete(e.identifier,e);const t=this.modulesByIdentifier.get(e.identifier);t&&t.disconnectContextForScope(e)}connectModule(e){this.modulesByIdentifier.set(e.identifier,e);const t=this.scopesByIdentifier.getValuesForKey(e.identifier);t.forEach((t=>e.connectContextForScope(t)))}disconnectModule(e){this.modulesByIdentifier.delete(e.identifier);const t=this.scopesByIdentifier.getValuesForKey(e.identifier);t.forEach((t=>e.disconnectContextForScope(t)))}}const o={controllerAttribute:"data-controller",actionAttribute:"data-action",targetAttribute:"data-target",targetAttributeForScope:e=>`data-${e}-target`,outletAttributeForScope:(e,t)=>`data-${e}-${t}-outlet`,keyMappings:Object.assign(Object.assign({enter:"Enter",tab:"Tab",esc:"Escape",space:" ",up:"ArrowUp",down:"ArrowDown",left:"ArrowLeft",right:"ArrowRight",home:"Home",end:"End",page_up:"PageUp",page_down:"PageDown"},objectFromEntries("abcdefghijklmnopqrstuvwxyz".split("").map((e=>[e,e])))),objectFromEntries("0123456789".split("").map((e=>[e,e]))))};function objectFromEntries(e){return e.reduce(((e,[t,r])=>Object.assign(Object.assign({},e),{[t]:r})),{})}class Application{constructor(t=document.documentElement,r=o){this.logger=console;this.debug=false;this.logDebugActivity=(e,t,r={})=>{this.debug&&this.logFormattedMessage(e,t,r)};this.element=t;this.schema=r;this.dispatcher=new Dispatcher(this);this.router=new Router(this);this.actionDescriptorFilters=Object.assign({},e)}static start(e,t){const r=new this(e,t);r.start();return r}async start(){await domReady();this.logDebugActivity("application","starting");this.dispatcher.start();this.router.start();this.logDebugActivity("application","start")}stop(){this.logDebugActivity("application","stopping");this.dispatcher.stop();this.router.stop();this.logDebugActivity("application","stop")}register(e,t){this.load({identifier:e,controllerConstructor:t})}registerActionOption(e,t){this.actionDescriptorFilters[e]=t}load(e,...t){const r=Array.isArray(e)?e:[e,...t];r.forEach((e=>{e.controllerConstructor.shouldLoad&&this.router.loadDefinition(e)}))}unload(e,...t){const r=Array.isArray(e)?e:[e,...t];r.forEach((e=>this.router.unloadIdentifier(e)))}get controllers(){return this.router.contexts.map((e=>e.controller))}getControllerForElementAndIdentifier(e,t){const r=this.router.getContextForElementAndIdentifier(e,t);return r?r.controller:null}handleError(e,t,r){var s;this.logger.error("%s\n\n%o\n\n%o",t,e,r);null===(s=window.onerror)||void 0===s?void 0:s.call(window,t,"",0,0,e)}logFormattedMessage(e,t,r={}){r=Object.assign({application:this},r);this.logger.groupCollapsed(`${e} #${t}`);this.logger.log("details:",Object.assign({},r));this.logger.groupEnd()}}function domReady(){return new Promise((e=>{"loading"==document.readyState?document.addEventListener("DOMContentLoaded",(()=>e())):e()}))}function ClassPropertiesBlessing(e){const t=readInheritableStaticArrayValues(e,"classes");return t.reduce(((e,t)=>Object.assign(e,propertiesForClassDefinition(t))),{})}function propertiesForClassDefinition(e){return{[`${e}Class`]:{get(){const{classes:t}=this;if(t.has(e))return t.get(e);{const r=t.getAttributeName(e);throw new Error(`Missing attribute "${r}"`)}}},[`${e}Classes`]:{get(){return this.classes.getAll(e)}},[`has${capitalize(e)}Class`]:{get(){return this.classes.has(e)}}}}function OutletPropertiesBlessing(e){const t=readInheritableStaticArrayValues(e,"outlets");return t.reduce(((e,t)=>Object.assign(e,propertiesForOutletDefinition(t))),{})}function getOutletController(e,t,r){return e.application.getControllerForElementAndIdentifier(t,r)}function getControllerAndEnsureConnectedScope(e,t,r){let s=getOutletController(e,t,r);if(s)return s;e.application.router.proposeToConnectScopeForElementAndIdentifier(t,r);s=getOutletController(e,t,r);return s||void 0}function propertiesForOutletDefinition(e){const t=namespaceCamelize(e);return{[`${t}Outlet`]:{get(){const t=this.outlets.find(e);const r=this.outlets.getSelectorForOutletName(e);if(t){const r=getControllerAndEnsureConnectedScope(this,t,e);if(r)return r;throw new Error(`The provided outlet element is missing an outlet controller "${e}" instance for host controller "${this.identifier}"`)}throw new Error(`Missing outlet element "${e}" for host controller "${this.identifier}". Stimulus couldn't find a matching outlet element using selector "${r}".`)}},[`${t}Outlets`]:{get(){const t=this.outlets.findAll(e);return t.length>0?t.map((t=>{const r=getControllerAndEnsureConnectedScope(this,t,e);if(r)return r;console.warn(`The provided outlet element is missing an outlet controller "${e}" instance for host controller "${this.identifier}"`,t)})).filter((e=>e)):[]}},[`${t}OutletElement`]:{get(){const t=this.outlets.find(e);const r=this.outlets.getSelectorForOutletName(e);if(t)return t;throw new Error(`Missing outlet element "${e}" for host controller "${this.identifier}". Stimulus couldn't find a matching outlet element using selector "${r}".`)}},[`${t}OutletElements`]:{get(){return this.outlets.findAll(e)}},[`has${capitalize(t)}Outlet`]:{get(){return this.outlets.has(e)}}}}function TargetPropertiesBlessing(e){const t=readInheritableStaticArrayValues(e,"targets");return t.reduce(((e,t)=>Object.assign(e,propertiesForTargetDefinition(t))),{})}function propertiesForTargetDefinition(e){return{[`${e}Target`]:{get(){const t=this.targets.find(e);if(t)return t;throw new Error(`Missing target element "${e}" for "${this.identifier}" controller`)}},[`${e}Targets`]:{get(){return this.targets.findAll(e)}},[`has${capitalize(e)}Target`]:{get(){return this.targets.has(e)}}}}function ValuePropertiesBlessing(e){const t=readInheritableStaticObjectPairs(e,"values");const r={valueDescriptorMap:{get(){return t.reduce(((e,t)=>{const r=parseValueDefinitionPair(t,this.identifier);const s=this.data.getAttributeNameForKey(r.key);return Object.assign(e,{[s]:r})}),{})}}};return t.reduce(((e,t)=>Object.assign(e,propertiesForValueDefinitionPair(t))),r)}function propertiesForValueDefinitionPair(e,t){const r=parseValueDefinitionPair(e,t);const{key:s,name:n,reader:i,writer:o}=r;return{[n]:{get(){const e=this.data.get(s);return null!==e?i(e):r.defaultValue},set(e){void 0===e?this.data.delete(s):this.data.set(s,o(e))}},[`has${capitalize(n)}`]:{get(){return this.data.has(s)||r.hasCustomDefaultValue}}}}function parseValueDefinitionPair([e,t],r){return valueDescriptorForTokenAndTypeDefinition({controller:r,token:e,typeDefinition:t})}function parseValueTypeConstant(e){switch(e){case Array:return"array";case Boolean:return"boolean";case Number:return"number";case Object:return"object";case String:return"string"}}function parseValueTypeDefault(e){switch(typeof e){case"boolean":return"boolean";case"number":return"number";case"string":return"string"}return Array.isArray(e)?"array":"[object Object]"===Object.prototype.toString.call(e)?"object":void 0}function parseValueTypeObject(e){const{controller:t,token:r,typeObject:s}=e;const n=isSomething(s.type);const i=isSomething(s.default);const o=n&&i;const c=n&&!i;const l=!n&&i;const h=parseValueTypeConstant(s.type);const u=parseValueTypeDefault(e.typeObject.default);if(c)return h;if(l)return u;if(h!==u){const e=t?`${t}.${r}`:r;throw new Error(`The specified default value for the Stimulus Value "${e}" must match the defined type "${h}". The provided default value of "${s.default}" is of type "${u}".`)}return o?h:void 0}function parseValueTypeDefinition(e){const{controller:t,token:r,typeDefinition:s}=e;const n={controller:t,token:r,typeObject:s};const i=parseValueTypeObject(n);const o=parseValueTypeDefault(s);const c=parseValueTypeConstant(s);const l=i||o||c;if(l)return l;const h=t?`${t}.${s}`:r;throw new Error(`Unknown value type "${h}" for "${r}" value`)}function defaultValueForDefinition(e){const t=parseValueTypeConstant(e);if(t)return c[t];const r=hasProperty(e,"default");const s=hasProperty(e,"type");const n=e;if(r)return n.default;if(s){const{type:e}=n;const t=parseValueTypeConstant(e);if(t)return c[t]}return e}function valueDescriptorForTokenAndTypeDefinition(e){const{token:t,typeDefinition:r}=e;const s=`${dasherize(t)}-value`;const n=parseValueTypeDefinition(e);return{type:n,key:s,name:camelize(s),get defaultValue(){return defaultValueForDefinition(r)},get hasCustomDefaultValue(){return void 0!==parseValueTypeDefault(r)},reader:l[n],writer:h[n]||h.default}}const c={get array(){return[]},boolean:false,number:0,get object(){return{}},string:""};const l={array(e){const t=JSON.parse(e);if(!Array.isArray(t))throw new TypeError(`expected value of type "array" but instead got value "${e}" of type "${parseValueTypeDefault(t)}"`);return t},boolean(e){return!("0"==e||"false"==String(e).toLowerCase())},number(e){return Number(e.replace(/_/g,""))},object(e){const t=JSON.parse(e);if(null===t||"object"!=typeof t||Array.isArray(t))throw new TypeError(`expected value of type "object" but instead got value "${e}" of type "${parseValueTypeDefault(t)}"`);return t},string(e){return e}};const h={default:writeString,array:writeJSON,object:writeJSON};function writeJSON(e){return JSON.stringify(e)}function writeString(e){return`${e}`}class Controller{constructor(e){this.context=e}static get shouldLoad(){return true}static afterLoad(e,t){}get application(){return this.context.application}get scope(){return this.context.scope}get element(){return this.scope.element}get identifier(){return this.scope.identifier}get targets(){return this.scope.targets}get outlets(){return this.scope.outlets}get classes(){return this.scope.classes}get data(){return this.scope.data}initialize(){}connect(){}disconnect(){}dispatch(e,{target:t=this.element,detail:r={},prefix:s=this.identifier,bubbles:n=true,cancelable:i=true}={}){const o=s?`${s}:${e}`:e;const c=new CustomEvent(o,{detail:r,bubbles:n,cancelable:i});t.dispatchEvent(c);return c}}Controller.blessings=[ClassPropertiesBlessing,TargetPropertiesBlessing,ValuePropertiesBlessing,OutletPropertiesBlessing];Controller.targets=[];Controller.outlets=[];Controller.values={};export{Application,AttributeObserver,Context,Controller,ElementObserver,IndexedMultimap,Multimap,SelectorObserver,StringMapObserver,TokenListObserver,ValueListObserver,add,o as defaultSchema,del,fetch,prune};
================================================
FILE: spec/support/test_app/vendor/javascript/@stimulus-components--rails-nested-form.js
================================================
import{Controller as e}from"@hotwired/stimulus";const t=class _RailsNestedForm extends e{add(e){e.preventDefault();const t=this.templateTarget.innerHTML.replace(/NEW_RECORD/g,(new Date).getTime().toString());this.targetTarget.insertAdjacentHTML("beforebegin",t);const r=new CustomEvent("rails-nested-form:add",{bubbles:!0});this.element.dispatchEvent(r)}remove(e){e.preventDefault();const t=e.target.closest(this.wrapperSelectorValue);if(t.dataset.newRecord==="true")t.remove();else{t.style.display="none";const e=t.querySelector("input[name*='_destroy']");e.value="1"}const r=new CustomEvent("rails-nested-form:remove",{bubbles:!0});this.element.dispatchEvent(r)}};t.targets=["target","template"],t.values={wrapperSelector:{type:String,default:".nested-form-wrapper"}};let r=t;export{r as default};
================================================
FILE: spec/support/test_app/vendor/javascript/jquery.ui.datepicker.locales.js
================================================
$.datepicker.regional['en'] = {
closeText: 'Done',
prevText: 'Prev',
nextText: 'Next',
currentText: 'Today',
monthNames: ['January','February','March','April','May','June',
'July','August','September','October','November','December'],
monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'],
weekHeader: 'Wk',
dateFormat: 'dd/mm/yy',
firstDay: 1,
isRTL: false,
showMonthAfterYear: false,
yearSuffix: ''};
$.datepicker.regional['fr'] = {
closeText: 'Fermer',
prevText: '<Préc',
nextText: 'Suiv>',
currentText: 'Courant',
monthNames: ['Janvier','Février','Mars','Avril','Mai','Juin',
'Juillet','Août','Septembre','Octobre','Novembre','Décembre'],
monthNamesShort: ['Jan','Fév','Mar','Avr','Mai','Jun',
'Jul','Aoû','Sep','Oct','Nov','Déc'],
dayNames: ['Dimanche','Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi'],
dayNamesShort: ['Dim','Lun','Mar','Mer','Jeu','Ven','Sam'],
dayNamesMin: ['Di','Lu','Ma','Me','Je','Ve','Sa'],
weekHeader: 'Sm',
dateFormat: 'dd/mm/yy',
firstDay: 1,
isRTL: false,
showMonthAfterYear: false,
yearSuffix: ''};
$.datepicker.regional.nl = {
closeText: 'Sluiten',
prevText: '←',
nextText: '→',
currentText: 'Vandaag',
monthNames: ['januari', 'februari', 'maart', 'april', 'mei', 'juni',
'juli', 'augustus', 'september', 'oktober', 'november', 'december'],
monthNamesShort: ['jan', 'feb', 'maa', 'apr', 'mei', 'jun',
'jul', 'aug', 'sep', 'okt', 'nov', 'dec'],
dayNames: ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'],
dayNamesShort: ['zon', 'maa', 'din', 'woe', 'don', 'vri', 'zat'],
dayNamesMin: ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'],
weekHeader: 'Wk',
dateFormat: 'dd/mm/yy',
firstDay: 1,
isRTL: false,
showMonthAfterYear: false,
yearSuffix: ''};
================================================
FILE: spec/support/test_app/vendor/javascript/reload_on_change.js
================================================
const init = () => $("select.reload-on-change").change(function() {
this.form.submit();
});
$(document).on('turbo:load', init);
================================================
FILE: spec/wice/grid_output_buffer_spec.rb
================================================
describe Wice::GridOutputBuffer do
subject(:buffer){Wice::GridOutputBuffer.new}
let(:key) {'key'}
let(:filter_code) {'here filter code'}
describe '#to_s' do
subject(:method_to_s) {buffer.to_s}
it 'has class ActiveSupport::SafeBuffer' do
is_expected.to be_an ActiveSupport::SafeBuffer
end
end
describe '#add_filter(key, filter_code)' do
subject(:add_filter) {buffer.add_filter key, filter_code}
it 'returns filter_code' do
is_expected.to be filter_code
end
end
describe '#filter_for(key)' do
subject(:filter_for) {buffer.filter_for key}
before do
buffer.return_empty_strings_for_nonexistent_filters = false
end
context 'when #add_filter has been called with the key' do
before do
buffer.add_filter(key, filter_code)
end
it 'returns the code saved under the key' do
is_expected.to be filter_code
end
it 'removes the code and railses Wice::WiceGridException when called again' do
buffer.filter_for key
expect { filter_for }.to raise_error Wice::WiceGridException
end
end
context 'when #add_filter has not been called with the key' do
it 'railses Wice::WiceGridException' do
expect { filter_for }.to raise_error Wice::WiceGridException
end
context 'when #return_empty_strings_for_nonexistent_filters is set to true' do
before do
buffer.return_empty_strings_for_nonexistent_filters = true
end
it 'returns empty string' do
is_expected.to eq ''
end
end
end
end
end
================================================
FILE: spec/wice/table_column_matrix_spec.rb
================================================
describe Wice::TableColumnMatrix do
subject(:table) {Wice::TableColumnMatrix.new}
let(:conditions) {'general_conditions'}
let(:column) {'key'}
let(:model) {Dummy}
let(:column_name) {:name}
describe '#add_condition(column, conditions)' do
subject(:add_condition) {table.add_condition column, conditions}
it 'adds the pair column, conditions to #generated_conditions' do
expect{add_condition}.to change(table.generated_conditions, :size).by 1
expect(table.generated_conditions.last).to eq [column, conditions]
end
it 'adds conditions to #conditions' do
expect(table.conditions).to eq []
add_condition
expect(table.conditions).to eq [conditions]
end
end
describe 'default_model_class=(model)' do
subject(:set_default_model_class) {table.default_model_class = model}
it 'assingns model to #default_model_class' do
expect{set_default_model_class}.to change(table, :default_model_class).to model
end
it 'calls #init_columns_of_table with model' do
expect(table).to receive(:init_columns_of_table).with model
set_default_model_class
end
end
describe '#get_column_by_model_class_and_column_name(model_class, column_name)' do
before do
table.default_model_class = model
end
subject(:get_column_by_model_class_and_column_name) do
table.get_column_by_model_class_and_column_name model, column_name
end
it 'returns an instace of ActiveRecord::ConnectionAdapters::Column' do
is_expected.to be_an ActiveRecord::ConnectionAdapters::Column
end
end
describe '#get_column_in_default_model_class_by_column_name(column_name)' do
subject(:get_column_in_default_model_class_by_column_name) do
table.get_column_in_default_model_class_by_column_name column_name
end
context 'when #default_model_class is defined' do
before do
table.default_model_class = model
end
it 'returns an instace of ActiveRecord::ConnectionAdapters::Column' do
is_expected.to be_an ActiveRecord::ConnectionAdapters::Column
end
end
context 'when #default_model_class is undefined' do
it 'raises Wice::WiceGridException' do
expect{subject}.to raise_error Wice::WiceGridException
end
end
end
describe '#get_column_by_model_class_and_column_name(model_class, column_name)' do
before do
table.default_model_class = model
end
subject(:get_column_by_model_class_and_column_name) do
table.get_column_by_model_class_and_column_name model, column_name
end
it 'returns an instace of ActiveRecord::ConnectionAdapters::Column' do
is_expected.to be_an ActiveRecord::ConnectionAdapters::Column
end
end
end
================================================
FILE: spec/wice/wice_grid_misc_spec.rb
================================================
describe Wice do
describe 'class method' do
describe '::assoc_list_to_hash(assocs)' do
subject(:assoc_list_to_hash) {described_class.assoc_list_to_hash assocs}
context 'when assocs size is 1' do
let(:assocs) {[:foo1]}
it 'it returns the first element' do
is_expected.to be :foo1
end
end
context 'when assocs size is 2' do
let(:assocs) {%i[foo1 foo2]}
it 'it returns the the Hash with the key of the first element and the value of the second' do
is_expected.to eq(foo1: :foo2)
end
end
context 'when assocs size > 2' do
let(:assocs) {%i[foo1 foo2 foo3 foo4 foo5]}
it 'it returns the the Hash with the key of the first element and the value as the result of ::assoc_list_to_hash called with the assocs without the first itemd' do
is_expected.to eq(foo1: {foo2: {foo3: {foo4: :foo5}}})
end
end
end
describe '::build_includes((existing_includes, new_assocs))' do
subject(:build_includes) do
described_class.build_includes existing_includes, new_assocs
end
let(:existing_includes) {original_includes.dup}
let(:original_includes) {[:a, :b, :c, :d, :e]}
let(:new_assocs) {[:b]}
it 'calls ::assoc_list_to_hash with new_assocs' do
expect(described_class).to receive(:assoc_list_to_hash).with(new_assocs)
.and_call_original
build_includes
end
context 'when existing_includes is an Array of Symbols' do
context 'and new_assocs is an Array of one Symbol that is present in existing_includes' do
it 'does not change existing_includes' do
expect(existing_includes).to eq original_includes
end
it 'returns existing_includes' do
is_expected.to eq original_includes
end
end
context 'and new_assocs is an Array of one Symbol that is not present in existing_includes' do
let(:new_assocs) {[:x]}
it 'does not change existing_includes' do
build_includes
expect(existing_includes).to eq original_includes
end
it 'adds new_assocs to existing_includes' do
is_expected.to eq original_includes + new_assocs
end
it 'returns the updated existing_includes' do
is_expected.to eq original_includes + new_assocs
end
end
context 'and new_assocs is an Array of two Symbols the first of which is not present in existing_includes' do
let(:new_assocs) {[:x, :b]}
it 'does not change existing_includes' do
build_includes
expect(existing_includes).to eq original_includes
end
it 'returns existing_includes + a Hash built of the new_assocs by ::assoc_list_to_hash' do
is_expected.to eq existing_includes + [{x: :b}]
end
end
context 'and new_assocs is an Array of two Symbols the first of which is present in existing_includes and the second one is not' do
let(:new_assocs) {[:b, :x]}
it 'changes existing_includes' do
build_includes
expect(existing_includes).not_to eq original_includes
end
it 'replaces the present symbol in existing_includes with ::assoc_list_to_hash(new_assocs)' do
is_expected.to eq [:a, {:b=>:x}, :c, :d, :e]
end
it 'returns the updated existing_includes' do
is_expected.to be existing_includes
end
end
end # when existing_includes is an Array of Symbols
context 'when existing_includes is an Array that contains a Hash' do
let(:original_includes) {[{a: :x}, :b, :c, :d, :e]}
context 'and new_assocs is an Array of one Symbol that is present in existing_includes' do
it 'does not change existing_includes' do
expect(build_includes).to eq original_includes
end
it 'returns existing_includes' do
is_expected.to eq original_includes
end
end
context 'and new_assocs is an Array of two Symbols the first of which is the key of the hash' do
let(:new_assocs) {[:a, :x]}
it 'does not change existing_includes' do
build_includes
expect(existing_includes).to eq original_includes
end
it 'replaces the present symbol in existing_includes with ::assoc_list_to_hash(new_assocs)' do
is_expected.to eq [{a: :x}, :b, :c, :d, :e]
end
it 'returns the existing_includes' do
is_expected.to be existing_includes
end
end
context 'and new_assocs is an Array of size > 2 where the first and the second items are the key and the value of the Hash in existing_includes' do
let(:new_assocs) {[:a, :x, :y]}
it 'changes existing_includes' do
build_includes
expect(existing_includes).not_to eq original_includes
end
it 'replaces the present the hash in existing_includes with ::assoc_list_to_hash(new_assocs)' do
is_expected.to eq [{a: {x: :y}}, :b, :c, :d, :e]
end
it 'returns the updated existing_includes' do
is_expected.to be existing_includes
end
end
end # when existing_includes contains a Hash
context 'when existing_includes is an Array that contains only one Hash' do
let(:original_includes) {[a: :x]}
context 'and new_assocs is an Array of two Symbols the first of which is the key of the hash' do
let(:new_assocs) {[:a, :x]}
it 'does not change existing_includes' do
build_includes
expect(existing_includes).to eq original_includes
end
it 'returns ::assoc_list_to_hash(new_assocs)' do
is_expected.to eq(a: :x)
end
end
context 'and new_assocs is an Array of size > 2 where the first and the second items are the key and the value of the Hash in existing_includes' do
let(:new_assocs) {[:a, :x, :y]}
it 'changes existing_includes' do
build_includes
expect(existing_includes).not_to eq original_includes
end
it 'replaces the hash in existing_includes with ::assoc_list_to_hash(new_assocs)' do
is_expected.to eq(a: {x: :y})
end
it 'returns the first element of updated existing_includes' do
is_expected.to be existing_includes.first
end
end
end # when existing_includes contains only one Hash
context 'when existing_includes is an Array that contains only one Hash with a value as a second Hash' do
let(:original_includes) {[a: {x: :y}]}
context 'and new_assocs is an Array of size 3 where the first and the second items are the keys of the first and the second Hash in existing_includes but the third is not the value of the second Hash' do
let(:new_assocs) {[:a, :x, :z]}
it 'changes existing_includes' do
build_includes
expect(existing_includes).not_to eq original_includes
end
it 'replaces the value of the hash in existing_includes with an Array whre ther first item is the value in the original existing_includes second Hash and the second is the last item in new_assocs' do
is_expected.to eq(a: [:y, :z])
end
it 'returns the first element of updated existing_includes' do
is_expected.to be existing_includes.first
end
end
context 'and new_assocs is an Array of size 3 where the first and the second items are the keys of the first and the second Hash in existing_includes and the third is the value of the second Hash' do
let(:new_assocs) {[:a, :x, :y]}
it 'does not change existing_includes' do
build_includes
expect(existing_includes).to eq original_includes
end
it 'returns the Hash of existing_includes' do
is_expected.to be existing_includes.first
end
end
end # when existing_includes contains only one Hash with a value as a second Hash
context 'when existing_includes is an Array that contains only one Symbol' do
let(:original_includes) {[:b]}
context 'and new_assocs is an empty Array' do
let(:new_assocs) {[]}
it 'does not change existing_includes' do
build_includes
expect(existing_includes).to eq original_includes
end
it 'returns the Symbol' do
is_expected.to be existing_includes.first
end
end
end # when existing_includes is an Array that contains only one Symbol
context 'when existing_includes is a Symbol' do
let(:original_includes) {:b}
context 'and new_assocs is an empty Array' do
let(:new_assocs) {[]}
it 'does not change existing_includes' do
build_includes
expect(existing_includes).to eq original_includes
end
it 'returns the Symbol' do
is_expected.to be existing_includes
end
end
context 'and new_assocs is an Array that does not start with the symbol' do
let(:new_assocs) {[:a, :x]}
it 'does not change existing_includes' do
build_includes
expect(existing_includes).to eq original_includes
end
it 'returns an Array that contains the symbol and ::assoc_list_to_hash(new_assocs)' do
is_expected.to eq([:b, described_class.assoc_list_to_hash(new_assocs)])
end
end
end # when existing_includes is a Symbol
context 'when existing_includes is nil' do
let(:original_includes) {}
context 'and new_assocs is an Array' do
let(:new_assocs) {[:a, :x]}
it 'does not change existing_includes' do
build_includes
expect(existing_includes).to eq original_includes
end
it 'returns ::assoc_list_to_hash(new_assocs)' do
is_expected.to eq described_class.assoc_list_to_hash(new_assocs)
end
end
end # when existing_includes is nil
end # ::build_includes((existing_includes, new_assocs))
describe '::get_query_store_model' do
subject(:get_query_store_model) {described_class.get_query_store_model}
it 'returns WiceGridSerializedQuery' do
is_expected.to be WiceGridSerializedQuery
end
end
describe '::get_string_matching_operators(model)' do
subject(:get_string_matching_operators) do
described_class.get_string_matching_operators model
end
let(:model) {Dummy}
it 'returns Wice::ConfigurationProvider.value_for(:STRING_MATCHING_OPERATOR)' do
is_expected
.to be Wice::ConfigurationProvider.value_for :STRING_MATCHING_OPERATOR
end
end
end # class method
end
================================================
FILE: spec/wice/wice_grid_spreadsheet_spec.rb
================================================
describe Wice::Spreadsheet do
subject(:spreadsheet){Wice::Spreadsheet.new('hello', ';')}
describe '#<<(row)' do
subject(:add_row) {spreadsheet << row}
let(:row) {%w(hello world!)}
it 'sends :<< to @csv' do
expect(spreadsheet.instance_variable_get :@csv).to receive(:<<).with row
add_row
end
end
end
================================================
FILE: vendor/assets/javascripts/wice_grid.js
================================================
//= require wice_grid_processor
//= require wice_grid_init
//= require wice_grid_saved_queries_init
================================================
FILE: vendor/assets/javascripts/wice_grid_init.js.coffee
================================================
if Turbo?
$(document).on 'turbo:load', -> initWiceGrid()
else
$ -> initWiceGrid()
$(document).on 'turbolinks:render', -> initWiceGrid() if Turbolinks?
globalVarForAllGrids = 'wiceGrids'
initWiceGrid = ->
$(".wice-grid-container").each (index, wiceGridContainer) ->
gridName = wiceGridContainer.id
dataDiv = $(".wg-data", wiceGridContainer)
processorInitializerArguments = dataDiv.data("processor-initializer-arguments")
filterDeclarations = dataDiv.data("filter-declarations")
focusElementIfNeeded dataDiv.data("foc")
gridProcessor = new WiceGridProcessor(gridName,
processorInitializerArguments[0], processorInitializerArguments[1],
processorInitializerArguments[2], processorInitializerArguments[3],
processorInitializerArguments[4], processorInitializerArguments[5])
for filterDeclaration in filterDeclarations
do (filterDeclaration) ->
if filterDeclaration?
gridProcessor.register
filterName : filterDeclaration.filterName
detached : filterDeclaration.detached
templates : filterDeclaration.declaration.templates
ids : filterDeclaration.declaration.ids
unless window[globalVarForAllGrids]
window[globalVarForAllGrids] = {}
window[globalVarForAllGrids][gridName] = gridProcessor
# setting up stuff for in the context of each grid
setupSubmitReset wiceGridContainer, gridProcessor
setupCsvExport wiceGridContainer, gridProcessor
setupHidingShowingOfFilterRow wiceGridContainer
setupShowingAllRecords wiceGridContainer, gridProcessor
setupMultiSelectToggle wiceGridContainer
setupAutoreloadsForInternalFilters wiceGridContainer, gridProcessor
setupBulkToggleForActionColumn wiceGridContainer
setupAutoreloadsForExternalFilters()
setupExternalSubmitReset()
setupExternalCsvExport()
setupDatepicker()
# for all grids on oage because it does not matter which grid it is
setupMultiSelectToggle $('.wg-detached-filter')
moveDateBoundIfInvalidPeriod = (dataFieldNameWithTheOtherDatepicker, datepickerHiddenField, selectedDate, dateFormat, predicate) ->
if (datepickerId = datepickerHiddenField.data(dataFieldNameWithTheOtherDatepicker)) &&
(theOtherDatepicker = $(_datepickerId = "#" + datepickerId)) &&
(theOtherDate = theOtherDatepicker.datepicker('getDate')) &&
predicate(theOtherDate, selectedDate)
theOtherDatepicker.datepicker("setDate", selectedDate)
theOtherDatepicker.next().next().html $.datepicker.formatDate(dateFormat, selectedDate)
setupDatepicker = ->
if $('.date-filter.wg-jquery-datepicker').length != 0
setupJqueryUiDatepicker()
if $('.date-filter.wg-bootstrap-datepicker').length != 0
setupBootstrapDatepicker()
setupBootstrapDatepicker = ->
# check for bootstrap datepicker
unless $.fn.datepicker
alert """Seems like you do not have Bootstrap datepicker gem (https://github.com/Nerian/bootstrap-datepicker-rails)
installed. Either install it pick another filter with :filter_type.
"""
return
$('.date-filter.wg-bootstrap-datepicker input:text[data-provide=datepicker]').each (index, dateField) ->
$(dateField).datepicker().on 'hide', (event) ->
$self = $(event.currentTarget)
eventToTriggerOnChange = $self.data('close-calendar-event-name')
if eventToTriggerOnChange
$self.trigger(eventToTriggerOnChange)
else if $self.attr('id').split('_').pop() == 'fr'
$to = $self.parent().next().find('input:text.check-for-bsdatepicker')
if $to.length > 0
$to.datepicker 'show'
setupJqueryUiDatepicker = ->
# check jquery ui datepickeer
unless $.datepicker
alert """Seems like you do not have jQuery datepicker (http://jqueryui.com/demos/datepicker/)
installed. Either install it pick another filter with :filter_type.
"""
# setting up the locale for datepicker
if locale = $('.date-filter.wg-jquery-datepicker input[type=hidden]').data('locale')
$.datepicker.setDefaults($.datepicker.regional[locale]);
$('.date-filter.wg-jquery-datepicker .date-label').each (index, removeLink) ->
datepickerHiddenField = $('#' + $(removeLink).data('dom-id'))
eventToTriggerOnChange = datepickerHiddenField.data('close-calendar-event-name')
# setting up the remove link for datepicker
$(removeLink).click (event) ->
$(this).html('')
datepickerHiddenField.val('')
if eventToTriggerOnChange
datepickerHiddenField.trigger(eventToTriggerOnChange)
event.preventDefault()
false
that = this
dateFormat = datepickerHiddenField.data('date-format')
yearRange = datepickerHiddenField.data('date-year-range')
labelText = datepickerHiddenField.data('button-text')
# datepicker constructor
datepickerHiddenField.datepicker
firstDay: 1
dateFormat: dateFormat
changeMonth: true
changeYear: true
yearRange: yearRange
onSelect: (dateText, inst) ->
selectedDate = $(this).datepicker("getDate")
moveDateBoundIfInvalidPeriod(
'the-other-datepicker-id-to',
datepickerHiddenField,
selectedDate,
dateFormat,
(theOther, selected)-> theOther < selected
)
moveDateBoundIfInvalidPeriod(
'the-other-datepicker-id-from',
datepickerHiddenField,
selectedDate,
dateFormat,
(theOther, selected)-> theOther > selected
)
$(that).html(dateText)
if eventToTriggerOnChange
datepickerHiddenField.trigger(eventToTriggerOnChange)
datepickerContainer = datepickerHiddenField.parent()
$(removeLink).before(" ")
newlyAdded = $('.fa-calendar', datepickerContainer)
newlyAdded.click ->
datepickerHiddenField.datepicker("show")
# hiding and showing the row with filters
setupHidingShowingOfFilterRow = (wiceGridContainer) ->
hideFilter = '.wg-hide-filter'
showFilter = '.wg-show-filter'
filterRow = '.wg-filter-row'
$(hideFilter, wiceGridContainer).click ->
$(this).hide()
$(showFilter, wiceGridContainer).show()
$(filterRow, wiceGridContainer).hide()
$(showFilter, wiceGridContainer).click ->
$(this).hide()
$(hideFilter, wiceGridContainer).show()
$(filterRow, wiceGridContainer).show()
setupCsvExport = (wiceGridContainer, gridProcessor) ->
$('.export-to-csv-button', wiceGridContainer).click ->
gridProcessor.exportToCsv()
# trigger submit/reset from within the grid
setupSubmitReset = (wiceGridContainer, gridProcessor) ->
$('.submit', wiceGridContainer).click ->
gridProcessor.process()
$('.reset', wiceGridContainer).click ->
gridProcessor.reset()
$('.wg-filter-row input[type=text], .wg-filter-row input:text[data-provide=datepicker]', wiceGridContainer).keydown (event) ->
if event.keyCode == 13
event.preventDefault()
gridProcessor.process()
SetEnd = (txt) ->
if txt.createTextRange
#IE
FieldRange = txt.createTextRange()
FieldRange.moveStart 'character', txt.value.length
FieldRange.collapse()
FieldRange.select()
else
#Firefox and Opera
txt.focus()
length = txt.value.length
txt.setSelectionRange length, length
return
focusElementIfNeeded = (focusId) ->
elements = $('#' + focusId)
if elToFocus = elements[0]
SetEnd elToFocus
# autoreload for internal filters
setupAutoreloadsForInternalFilters = (wiceGridContainer, gridProcessor) ->
$('select.auto-reload, input.native-datepicker.auto-reload', wiceGridContainer).change ->
gridProcessor.process()
$('input.auto-reload', wiceGridContainer).keyup (event)->
if isKeySignificant event.which
gridProcessor.setProcessTimer(this.id)
$('input.negation-checkbox.auto-reload', wiceGridContainer).click ->
gridProcessor.process()
$(document).bind 'wg:calendarChanged_' + gridProcessor.name, ->
gridProcessor.process()
isKeySignificant = (keyCode, func)->
[37, 38, 39, 40, 9, 27].indexOf(keyCode) == -1
# autoreload for internal filters
setupAutoreloadsForExternalFilters = ->
$('.wg-detached-filter').each (index, detachedFilterContainer) ->
gridProcessor = getGridProcessorForElement(detachedFilterContainer)
if gridProcessor
$('select.auto-reload, input.native-datepicker.auto-reload', detachedFilterContainer).change ->
gridProcessor.process()
$('input.auto-reload', detachedFilterContainer).keyup (event)->
if isKeySignificant event.which
gridProcessor.setProcessTimer(this.id)
$('input.negation-checkbox.auto-reload', detachedFilterContainer).click ->
gridProcessor.process()
# trigger the all records mode
setupShowingAllRecords = (wiceGridContainer, gridProcessor) ->
$('.wg-show-all-link, .wg-back-to-pagination-link', wiceGridContainer).click (event) ->
event.preventDefault()
gridState = $(this).data("grid-state")
confirmationMessage = $(this).data("confim-message")
reloadGrid = ->
gridProcessor.reloadPageForGivenGridState gridState
if confirmationMessage
if confirm(confirmationMessage)
reloadGrid()
else
reloadGrid()
# dropdown filter multiselect
setupMultiSelectToggle = (wiceGridContainer)->
$('.expand-multi-select-icon', wiceGridContainer).click ->
$(this).prev().each (index, select) ->
select.multiple = true
$(this).next().show()
$(this).hide()
$('.collapse-multi-select-icon', wiceGridContainer).click ->
$(this).prev().prev().each (index, select) ->
select.multiple = false
$(this).prev().show()
$(this).hide()
setupBulkToggleForActionColumn = (wiceGridContainer) ->
$('.select-all', wiceGridContainer).click ->
$('.sel input', wiceGridContainer).prop('checked', true).trigger('change')
$('.deselect-all', wiceGridContainer).click ->
$('.sel input', wiceGridContainer).prop('checked', false).trigger('change')
$('.wg-select-all', wiceGridContainer).click ->
$('.sel input', wiceGridContainer).prop('checked', $(this).prop('checked')).trigger('change')
getGridProcessorForElement = (element) ->
gridName = $(element).data('grid-name')
if gridName && window[globalVarForAllGrids]
window[globalVarForAllGrids][gridName]
else
null
setupExternalCsvExport = ->
$(".wg-external-csv-export-button").each (index, externalCsvExportButton) ->
gridProcessor = getGridProcessorForElement(externalCsvExportButton)
if gridProcessor
$(externalCsvExportButton).click (event) ->
gridProcessor.exportToCsv()
setupExternalSubmitReset = ->
$(".wg-external-submit-button").each (index, externalSubmitButton) ->
gridProcessor = getGridProcessorForElement(externalSubmitButton)
if gridProcessor
$(externalSubmitButton).click (event) ->
gridProcessor.process()
event.preventDefault()
false
$(".wg-external-reset-button").each (index, externalResetButton) ->
gridProcessor = getGridProcessorForElement(externalResetButton)
if gridProcessor
$(externalResetButton).click (event) ->
gridProcessor.reset()
event.preventDefault()
false
$('.wg-detached-filter').each (index, detachedFilterContainer) ->
gridProcessor = getGridProcessorForElement(detachedFilterContainer)
if gridProcessor
$('input[type=text], input:text[data-provide=datepicker]', this).keydown (event) ->
if event.keyCode == 13
gridProcessor.process()
event.preventDefault()
false
window['getGridProcessorForElement'] = getGridProcessorForElement
window['initWiceGrid'] = initWiceGrid
================================================
FILE: vendor/assets/javascripts/wice_grid_processor.js.coffee
================================================
class WiceGridProcessor
constructor: (@name, @baseRequestForFilter, @baseLinkForShowAllRecords, @linkForExport, @parameterNameForQueryLoading, @parameterNameForFocus, @environment) ->
@filterDeclarations = new Array();
@checkIfJsFrameworkIsLoaded()
checkIfJsFrameworkIsLoaded : ->
if ! jQuery
alert "jQuery not loaded, WiceGrid cannot proceed!"
toString : ->
""
process : (domIdToFocus)->
@visit @buildUrlWithParams(domIdToFocus)
visit : (path, use_turbo = true) ->
if Turbo? and use_turbo
Turbo.visit path
else if Turbolinks? and use_turbo
Turbolinks.visit path
else
window.location = path
setProcessTimer : (domIdToFocus)->
if @timer
clearTimeout(@timer)
@timer = null
processor = this
@timer = setTimeout(
-> processor.process(domIdToFocus)
1000
)
reloadPageForGivenGridState : (gridState)->
requestPath = @gridStateToRequest(gridState)
@visit @appendToUrl(@baseLinkForShowAllRecords, requestPath)
gridStateToRequest : (gridState)->
jQuery.map(
gridState
(pair) -> encodeURIComponent(pair[0]) + '=' + encodeURIComponent(pair[1])
).join('&')
appendToUrl : (url, str)->
sep = if url.indexOf('?') != -1
if /[&\?]$/.exec(url)
''
else
'&'
else
'?'
url + sep + str
buildUrlWithParams : (domIdToFocus)->
results = new Array()
jQuery.each(
@filterDeclarations
(i, filterDeclaration)=>
param = @readValuesAndFormQueryString(filterDeclaration.filterName, filterDeclaration.detached, filterDeclaration.templates, filterDeclaration.ids)
if param && param != ''
results.push(param)
)
res = @baseRequestForFilter
if results.length != 0
allFilterParams = results.join('&')
res = @appendToUrl(res, allFilterParams)
if domIdToFocus
res = @appendToUrl(res, @parameterNameForFocus + domIdToFocus)
res
reset : ->
@visit @baseRequestForFilter
exportToCsv : ->
@visit @linkForExport, false
register : (func)->
@filterDeclarations.push(func)
readValuesAndFormQueryString : (filterName, detached, templates, ids)->
res = new Array()
for i in [0 .. templates.length-1]
if $(ids[i]) == null
if this.environment == "development"
message = 'WiceGrid: Error reading state of filter "' + filterName + '". No DOM element with id "' + ids[i] + '" found.'
if detached
message += 'You have declared "' + filterName + '" as a detached filter but have not output it anywhere in the template. Read documentation about detached filters.'
alert(message);
return ''
el = $('#' + ids[i])
if el[0] && el[0].type == 'checkbox'
if el[0].checked
val = 1;
else
val = el.val()
if val instanceof Array
for j in [0 .. val.length-1]
if val[j] && val[j] != ""
res.push(templates[i] + encodeURIComponent(val[j]))
else if val && val != ''
res.push(templates[i] + encodeURIComponent(val));
res.join('&');
this
WiceGridProcessor._version = '3.4'
window['WiceGridProcessor'] = WiceGridProcessor
================================================
FILE: vendor/assets/javascripts/wice_grid_saved_queries_init.js.coffee
================================================
if Turbo?
$(document).on 'turbo:load', -> savedQueriesInit()
else
$(document).on 'page:load ready', -> savedQueriesInit()
$(document).on 'turbolinks:render', -> savedQueriesInit() if Turbolinks?
savedQueriesInit = ->
$('.wice-grid-save-query-field').keydown (event) ->
if event.keyCode == 13
saveQuery($(this).next(), event)
$(".wice-grid-save-query-button").click (event) ->
saveQuery(this, event)
$(".wice-grid-delete-query").click (event) ->
deleteQuery(this, event)
$(".wice-grid-query-load-link").click (event) ->
loadQuery(this, event)
loadQuery = (loadLink, event) ->
if gridProcessor = window.getGridProcessorForElement(loadLink)
queryId = $(loadLink).data('query-id')
request = gridProcessor.appendToUrl(
gridProcessor.buildUrlWithParams(),
gridProcessor.parameterNameForQueryLoading + encodeURIComponent(queryId)
)
gridProcessor.visit request
event.preventDefault()
event.stopPropagation()
false
deleteQuery = (deleteQueryButton, event) ->
confirmation = $(deleteQueryButton).data('wg-confirm')
invokeConfirmation = if confirmation
-> confirm(confirmation)
else
-> true
if invokeConfirmation() && (gridProcessor = window.getGridProcessorForElement(deleteQueryButton))
jQuery.ajax
url: $(deleteQueryButton).attr('href')
async: true
dataType: 'json'
success: (data, textStatus, jqXHR) ->
onChangeToQueryList(data, gridProcessor.name)
type: 'POST'
event.preventDefault()
event.stopPropagation()
false
saveQuery = (saveQueryButton, event) ->
if gridProcessor = window.getGridProcessorForElement(saveQueryButton)
_saveQueryButton = $(saveQueryButton)
basePathToQueryController = _saveQueryButton.data('base-path-to-query-controller')
gridState = _saveQueryButton.data('parameters')
inputIds = _saveQueryButton.data('ids')
inputField = _saveQueryButton.prev()
if inputIds instanceof Array
inputIds.each (domId) ->
gridState.push(['extra[' + domId + ']', $('#'+ domId).val()])
queryName = inputField.val()
requestPath = gridProcessor.gridStateToRequest(gridState)
jQuery.ajax
url: basePathToQueryController
async: true
data: requestPath + '&query_name=' + encodeURIComponent(queryName)
dataType: 'json'
success: (data, textStatus, jqXHR) ->
onChangeToQueryList(data, gridProcessor.name, queryName, inputField)
type: 'POST'
event.preventDefault()
false
onChangeToQueryList = (data, gridName, queryName, inputField) ->
notificationMessagesDomId = "##{gridName}_notification_messages"
gridTitleId = "##{gridName}_title"
queryListId = "##{gridName}_query_list"
inputField.val('') if queryName
if errorMessages = data['error_messages']
$(notificationMessagesDomId).text(errorMessages)
else
if notificationMessages = data['notification_messages']
$(notificationMessagesDomId).text(notificationMessages)
$(gridTitleId).html("#{queryName} ") if queryName
$(queryListId).replaceWith(data['query_list'])
$(queryListId).effect('highlight') if jQuery.ui
$(".wice-grid-delete-query", $(queryListId)).click (event) ->
deleteQuery(this, event)
$(".wice-grid-query-load-link", $(queryListId)).click (event) ->
loadQuery(this, event)
================================================
FILE: vendor/assets/stylesheets/wice_grid.scss
================================================
/*!
* WiceGrid CSS
*
* @import "font-awesome"
*/
//@import "font-awesome-sprockets";
@import "font-awesome";
/*!
* WiceGrid CSS
*
* @import "jquery-ui/core"
*/
@import "jquery-ui/core";
/*!
* WiceGrid CSS
*
* @import "jquery-ui/theme"
*/
@import "jquery-ui/theme";
/*!
* WiceGrid CSS
*
* @import "jquery-ui/datepicker"
*/
@import "jquery-ui/datepicker";
//@import "jquery-ui";
/*!
* WiceGrid CSS
*
* self
*/
.wg-detached-filter, .wice-grid{
.text-filter-container {
input{
width:auto;
margin-right: 10px;
display: inline;
}
}
thead th select {
display: inline-block;
}
a.date-label {text-decoration: none;}
a.date-label:hover {text-decoration: line-through;}
.clickable{
cursor: pointer;
margin-bottom: 2px;
margin-right: 2px;
}
.ui-datepicker-trigger, .wg-detached-filter .ui-datepicker-trigger{
cursor: pointer;
}
.custom-dropdown-container {
.expand-multi-select-icon, .collapse-multi-select-icon{
width: 10px;
height: 10px;
display: inline-block;
margin-left: 5px;
vertical-align: top;
}
}
}
.wice-grid{
.desc, .asc{
padding-right: 18px;
text-decoration:none;
}
.clickable.select-all, .clickable.deselect-all{
float:left;
}
/* in case of twitter bootstrap :) */
thead th select{
width: auto;
}
.pagination{
margin: 0px;
float: left;
}
tr.wg-filter-row input[type=text] {
width: 100px;
}
.pagination_status {
font-weight: bold;
float: right;
}
}
.wice-grid-query-panel{
li {list-style-type: none; }
ul {margin-left: 0 }
}
input.wice-grid-save-query-field{
width: auto;
display: inline-block;
margin-right: 10px;
}
================================================
FILE: wice_grid.gemspec
================================================
Gem::Specification.new do |s|
s.name = 'wice_grid'
s.version = '7.1.4'
s.authors = ['Yuri Leikind, Dimitri Kulk, and contributors']
s.email = ['dim.kulk@gmail.com']
s.homepage = 'https://github.com/leikind/wice_grid'
s.summary = 'A Rails grid plugin to quickly create grids with sorting, pagination, and filters.'
s.description = 'A Rails grid plugin to create grids with sorting, pagination, and filters generated automatically based on column types. ' \
'The contents of the cell are up for the developer, just like one does when rendering a collection via a simple table. ' \
'WiceGrid automates implementation of filters, ordering, paginations, CSV export, and so on. ' \
'Ruby blocks provide an elegant means for this.'
s.files = `git ls-files`.split $INPUT_RECORD_SEPARATOR
s.license = 'MIT'
s.require_paths = ['lib']
s.date = `date +%Y-%m-%d`
s.add_dependency 'rails', '~> 8.0'
s.add_dependency 'kaminari'
s.add_dependency 'coffee-rails', '>= 5.0.0'
s.add_dependency 'jquery-rails'
s.add_development_dependency 'appraisal'
s.add_development_dependency 'byebug'
s.add_development_dependency 'capybara'
s.add_development_dependency 'capybara-screenshot'
s.add_development_dependency 'csv'
s.add_development_dependency 'faker'
s.add_development_dependency 'phantomjs', '>= 2.1.1'
s.add_development_dependency 'poltergeist'
s.add_development_dependency 'rake'
s.add_development_dependency 'rspec'
s.add_development_dependency 'rspec-rails'
s.add_development_dependency 'selenium-webdriver'
s.add_development_dependency 'shoulda-matchers'
# Required by the test app.
s.add_development_dependency 'bootstrap'
s.add_development_dependency 'bundler'
s.add_development_dependency 'coderay'
s.add_development_dependency 'dartsass-rails'
s.add_development_dependency 'font-awesome-sass'
s.add_development_dependency 'guard-rspec'
s.add_development_dependency 'haml'
s.add_development_dependency 'inch'
s.add_development_dependency 'importmap-rails'
s.add_development_dependency 'jquery-ui-rails'
s.add_development_dependency 'jquery-ui-themes'
s.add_development_dependency 'rdoc'
s.add_development_dependency 'simplecov'
s.add_development_dependency 'sprockets-rails'
s.add_development_dependency 'stimulus-rails'
s.add_development_dependency 'sqlite3', '~> 1.4'
s.add_development_dependency 'therubyracer'
s.add_development_dependency 'turbo-rails'
s.add_development_dependency 'yard'
end