From 1f1fa79a89ccf977d2cbd654e4b36573cb4b0431 Mon Sep 17 00:00:00 2001 From: Syphax Bouazzouni Date: Thu, 2 Nov 2023 07:25:29 +0100 Subject: [PATCH] tmp --- .../workflows/dependencies-security-audit.yml | 25 + .github/workflows/js-lint.yml | 38 + .github/workflows/lint-rubocop.yml | 48 + .github/workflows/tests.yml | 51 + Capfile | 8 +- Dockerfile | 34 +- Gemfile | 51 +- Gemfile.lock | 76 +- Rakefile | 4 +- .../agent_search_input_component.rb | 3 +- app/components/alerts_container_component.rb | 1 - .../buttons/regular_button_component.rb | 86 +- app/components/card_message_component.rb | 46 +- app/components/chip_button_component.rb | 18 +- app/components/chips_component.rb | 27 +- .../circle_progress_bar_component.rb | 3 +- app/components/collapsable_block_component.rb | 3 +- app/components/concept_details_component.rb | 42 +- app/components/date_time_field_component.rb | 4 +- app/components/display/alert_component.rb | 67 +- .../display/button_loader_component.rb | 30 +- app/components/display/header_component.rb | 28 +- app/components/display/image_component.rb | 47 +- .../display/info_tooltip_component.rb | 19 +- app/components/dropdown_button_component.rb | 1 - .../dropdown_container_component.rb | 2 +- .../dropdown_section_button_component.rb | 1 - .../external_link_text_component.rb | 1 - app/components/field_container_component.rb | 1 - app/components/infinite_scroll_component.rb | 2 - app/components/input/date_component.rb | 21 +- app/components/input/email_component.rb | 15 +- app/components/input/file_input_component.rb | 11 +- app/components/input/input_field_component.rb | 68 +- .../input/language_selector_component.rb | 38 +- app/components/input/password_component.rb | 15 +- app/components/input/select_component.rb | 35 +- app/components/input/text_area_component.rb | 10 +- app/components/input/text_input_component.rb | 19 +- app/components/input/url_component.rb | 15 +- app/components/label_link_component.rb | 1 - app/components/language_field_component.rb | 8 +- .../language_field_component.html.haml | 2 +- app/components/layout/card_component.rb | 16 +- .../layout/horizontal_list_component.rb | 21 +- app/components/layout/list_component.rb | 23 +- .../layout/progress_pages_component.rb | 13 +- app/components/layout/reveal_component.rb | 30 +- app/components/license_field_component.rb | 4 +- app/components/link_field_component.rb | 3 - app/components/link_text_component.rb | 1 - .../nested_agent_search_input_component.rb | 6 +- .../nested_form_inputs_component.rb | 1 - app/components/notification_component.rb | 4 +- .../ontology_browse_card_component.rb | 4 +- .../ontology_search_input_component.rb | 1 - app/components/pill_button_component.rb | 1 - app/components/popup_link_text_component.rb | 2 - app/components/rounded_button_component.rb | 19 +- app/components/search_input_component.rb | 9 +- app/components/select_input_component.rb | 8 +- app/components/square_badge_component.rb | 5 +- .../submission_metadata_component.rb | 50 +- app/components/submission_status_component.rb | 21 +- app/components/summary_section_component.rb | 2 +- app/components/switch_input_component.rb | 6 +- app/components/tab_item_component.rb | 3 - app/components/table_cell_component.rb | 3 +- app/components/table_component.rb | 5 +- app/components/table_row_component.rb | 7 +- app/components/tabs_container_component.rb | 1 - app/components/text_area_field_component.rb | 6 +- .../tree_infinite_scroll_component.rb | 2 +- app/components/turbo_frame_component.rb | 4 +- app/components/turbo_modal_component.rb | 1 - app/controllers/about_controller.rb | 5 +- .../admin/categories_controller.rb | 183 +- app/controllers/admin/groups_controller.rb | 178 +- app/controllers/admin/licenses_controller.rb | 42 +- app/controllers/admin_controller.rb | 196 +- app/controllers/agents_controller.rb | 36 +- app/controllers/ajax_proxy_controller.rb | 61 +- app/controllers/analytics_controller.rb | 42 +- app/controllers/annotator_controller.rb | 187 +- app/controllers/annotatorplus_controller.rb | 178 +- app/controllers/application_controller.rb | 435 +- app/controllers/collections_controller.rb | 10 +- app/controllers/concepts_controller.rb | 117 +- .../concerns/mapping_statistics.rb | 29 +- app/controllers/concerns/ontology_updater.rb | 16 +- app/controllers/concerns/submission_filter.rb | 33 +- .../concerns/submission_updater.rb | 65 +- app/controllers/errors_controller.rb | 4 +- app/controllers/fair_score_controller.rb | 5 +- app/controllers/history_controller.rb | 21 +- app/controllers/home_controller.rb | 44 +- app/controllers/instances_controller.rb | 17 +- app/controllers/label_xl_controller.rb | 7 +- app/controllers/landscape_controller.rb | 620 +- app/controllers/language_controller.rb | 32 +- app/controllers/login_controller.rb | 91 +- app/controllers/mappings_controller.rb | 98 +- .../ncbo_annotatorplus_controller.rb | 178 +- app/controllers/notes_controller.rb | 74 +- app/controllers/ontolobridge_controller.rb | 37 +- app/controllers/ontologies_controller.rb | 170 +- .../ontologies_metadata_curator_controller.rb | 54 +- app/controllers/precache_controller.rb | 27 +- app/controllers/projects_controller.rb | 46 +- app/controllers/recommender_controller.rb | 9 +- app/controllers/redirect_controller.rb | 17 +- app/controllers/reviews_controller.rb | 68 +- app/controllers/robots_controller.rb | 14 +- app/controllers/schemes_controller.rb | 8 +- app/controllers/search_controller.rb | 101 +- app/controllers/submissions_controller.rb | 41 +- app/controllers/subscriptions_controller.rb | 51 +- app/controllers/users_controller.rb | 147 +- .../virtual_appliance_controller.rb | 11 +- app/controllers/visits_controller.rb | 8 +- app/decorators/base_decorator.rb | 6 +- app/decorators/note_decorator.rb | 30 +- app/decorators/view_decorator.rb | 9 +- app/helpers/about_helper.rb | 2 + app/helpers/admin/licenses_helper.rb | 29 +- app/helpers/admin_helper.rb | 2 + app/helpers/agent_helper.rb | 24 +- app/helpers/application_helper.rb | 351 +- app/helpers/collections_helper.rb | 14 +- app/helpers/components_helper.rb | 15 +- app/helpers/concepts_helper.rb | 27 +- app/helpers/error_helpers.rb | 16 +- app/helpers/fair_score_helper.rb | 52 +- app/helpers/home_helper.rb | 13 +- app/helpers/inputs_helper.rb | 12 +- app/helpers/instances_helper.rb | 33 +- app/helpers/label_xl_helper.rb | 5 +- app/helpers/landscape_helper.rb | 2 + app/helpers/mappings_helper.rb | 107 +- app/helpers/metadata_helper.rb | 34 +- app/helpers/modal_helper.rb | 3 +- app/helpers/multi_languages_helper.rb | 6 +- app/helpers/notes_helper.rb | 65 +- app/helpers/ontologies_helper.rb | 173 +- app/helpers/ontology_metrics_helper.rb | 34 +- app/helpers/reviews_helper.rb | 4 +- app/helpers/schemes_helper.rb | 19 +- app/helpers/submission_inputs_helper.rb | 78 +- app/helpers/submissions_helper.rb | 104 +- app/helpers/turbo_helper.rb | 17 +- app/jobs/application_job.rb | 2 + app/lib/kgcl/issue_content_generator.rb | 2 +- app/mailers/application_mailer.rb | 3 +- app/mailers/notifier.rb | 30 +- app/mailers/subscribe_mailer.rb | 75 +- app/models/analytics.rb | 2 + app/models/application_record.rb | 4 +- app/models/bpid_resolver.rb | 23 +- app/models/history.rb | 4 +- app/models/license.rb | 8 +- app/models/mapping_page.rb | 2 + app/models/ontology.rb | 4 +- app/models/remote_file.rb | 32 +- .../resource_index_result_paginatable.rb | 10 +- app/models/virtual_appliance_user.rb | 2 + app/services/application_service.rb | 4 +- app/services/issue_creator_service.rb | 4 +- app/services/license_key_decrypter.rb | 10 +- app/validators/encrypted_key_validator.rb | 12 +- .../virtual_appliance_id_validator.rb | 22 +- app/views/projects/index.html.haml | 2 +- bin/bundle | 2 + bin/rails | 8 +- bin/rake | 6 +- bin/setup | 18 +- bin/update | 2 + bin/wait-for-it | 182 + bin/yarn | 16 +- config.ru | 4 +- config/application.rb | 15 +- config/bioportal_config_test.rb | 172 + config/boot.rb | 6 +- config/database.yml.sample | 3 +- config/deploy.rb | 19 +- config/deploy/appliance.rb | 18 +- config/deploy/production.rb | 14 +- config/deploy/staging.rb | 14 +- config/environment.rb | 4 +- config/environments/appliance.rb | 8 +- config/environments/development.rb | 14 +- config/environments/production.rb | 19 +- config/environments/staging.rb | 9 +- config/environments/test.rb | 10 +- .../application_controller_renderer.rb | 1 + config/initializers/assets.rb | 4 +- config/initializers/backtrace_silencers.rb | 4 +- config/initializers/cache_output.rb | 3 +- .../initializers/content_security_policy.rb | 1 + config/initializers/cookies_serializer.rb | 2 + config/initializers/cube_reporter.rb | 22 +- .../initializers/filter_parameter_logging.rb | 6 +- config/initializers/haml.rb | 4 +- config/initializers/inflections.rb | 1 + config/initializers/mime_types.rb | 1 + config/initializers/miniprofiler.rb | 2 + config/initializers/monkeypatches.rb | 4 +- .../new_framework_defaults_6_0.rb | 2 + .../new_framework_defaults_6_1.rb | 1 + .../new_framework_defaults_7_0.rb | 1 + config/initializers/omniauth.rb | 7 +- config/initializers/ontologies_api_client.rb | 2 + config/initializers/open_uri_no_temp_files.rb | 11 +- .../initializers/passenger_memcache_reset.rb | 26 +- config/initializers/permissions_policy.rb | 1 + config/initializers/recaptcha.rb | 2 + config/initializers/session_store.rb | 2 + config/initializers/sigtrap.rb | 4 +- config/initializers/wrap_parameters.rb | 2 + config/initializers/zeitwerk.rb | 8 + config/puma.rb | 8 +- config/routes.rb | 84 +- config/spring.rb | 6 +- ...14000857_create_virtual_appliance_users.rb | 2 + .../20120223203256_create_timeouts_table.rb | 2 + db/migrate/20120719010735_create_analytics.rb | 2 + ...3_change_virtual_appliance_user_id_type.rb | 2 + db/migrate/20140306012927_drop_old_tables.rb | 40 +- ...20150806211835_change_slice_column_name.rb | 2 + db/migrate/20200220191815_create_licenses.rb | 2 + .../20200921120918_create_ontologies.rb | 2 + db/schema.rb | 66 +- db/seeds.rb | 1 + docker-compose.yml | 24 +- lib/log.rb | 28 +- lib/resolver/acronym_from_virtual.rb | 1070 +- lib/resolver/virtual_from_acronym.rb | 1066 +- lib/resolver/virtual_from_version.rb | 14288 ++++++++-------- lib/tasks/generate_component_previews.rake | 26 +- package.json | 13 +- public/dispatch.fcgi | 4 +- public/dispatch.rb | 13 +- script/about | 6 +- script/breakpointer | 6 +- script/console | 4 +- script/dbconsole | 4 +- script/destroy | 6 +- script/generate | 6 +- script/performance/benchmarker | 4 +- script/performance/profiler | 4 +- script/plugin | 6 +- script/process/inspector | 4 +- script/process/reaper | 4 +- script/process/spawner | 4 +- script/rails | 6 +- script/runner | 6 +- script/server | 4 +- script/ssl_server | 83 +- .../alerts_container_component_spec.rb | 2 +- spec/components/turbo_frame_component_spec.rb | 2 +- spec/components/turbo_modal_component_spec.rb | 2 +- spec/mailers/subscribe_spec.rb | 32 +- spec/models/license_spec.rb | 86 +- spec/rails_helper.rb | 4 +- spec/spec_helper.rb | 98 +- .../buttons/chip_button_component_preview.rb | 18 +- ...logy_subscribe_button_component_preview.rb | 8 +- .../buttons/pill_button_component_preview.rb | 10 +- .../regular_button_component_preview.rb | 83 +- .../rounded_button_component_preview.rb | 15 +- .../concept_details_component_preview.rb | 31 +- .../display/alert_component_preview.rb | 67 +- .../circle_progress_bar_component_preview.rb | 13 +- .../date_time_field_component_preview.rb | 16 +- .../field_container_component_preview.rb | 15 +- .../display/header_component_preview.rb | 13 +- .../display/image_component_preview.rb | 8 +- .../display/info_tooltip_component_preview.rb | 11 +- .../language_field_component_preview.rb | 14 +- .../license_field_component_preview.rb | 14 +- .../display/link_field_component_preview.rb | 14 +- .../display/link_text_component_preview.rb | 37 +- .../text_area_field_component_preview.rb | 21 +- .../previews/input/chips_component_preview.rb | 14 +- .../input/input_field_component_preview.rb | 183 +- .../nested_form_input_component_preview.rb | 27 +- .../input/select_component_preview.rb | 45 +- .../input/switch_input_component_preview.rb | 11 +- .../previews/layout/card_component_preview.rb | 12 +- .../layout/card_message_component_preview.rb | 31 +- .../dropdown_container_component_preview.rb | 17 +- .../previews/layout/list_component_preview.rb | 22 +- .../progress_pages_component_preview.rb | 17 +- .../summary_section_component_preview.rb | 27 +- .../layout/table_component_preview.rb | 56 +- .../tabs_container_component_preview.rb | 110 +- .../layout/turbo_modal_component_preview.rb | 20 +- .../previews/loader_component_preview.rb | 1 - .../notification_component_preview.rb | 9 +- .../application_controller_test.rb | 15 + test/controllers/landscape_controller_test.rb | 6 +- .../controllers/ontologies_controller_test.rb | 21 + test/models/virtual_appliance_user_test.rb | 4 +- test/test_helper.rb | 18 +- yarn.lock | 1842 ++ 304 files changed, 15086 insertions(+), 12314 deletions(-) create mode 100644 .github/workflows/dependencies-security-audit.yml create mode 100644 .github/workflows/js-lint.yml create mode 100644 .github/workflows/lint-rubocop.yml create mode 100644 .github/workflows/tests.yml mode change 100644 => 100755 Rakefile create mode 100755 bin/wait-for-it create mode 100644 config/bioportal_config_test.rb create mode 100644 config/initializers/zeitwerk.rb create mode 100644 test/controllers/application_controller_test.rb create mode 100644 test/controllers/ontologies_controller_test.rb diff --git a/.github/workflows/dependencies-security-audit.yml b/.github/workflows/dependencies-security-audit.yml new file mode 100644 index 0000000000..90489c65b8 --- /dev/null +++ b/.github/workflows/dependencies-security-audit.yml @@ -0,0 +1,25 @@ +# This workflow uses actions that are not certified by GitHub. +# They are provided by a third-party and are governed by +# separate terms of service, privacy policy, and support +# documentation. +# This workflow will download a prebuilt Ruby version, install dependencies and run tests with Rake +# For more information see: https://github.com/marketplace/actions/setup-ruby-jruby-and-truffleruby +name: "Security audit dependencies" +on: + push: + branches: [ master , development ] + pull_request: + branches: [ master , development] +jobs: + lint: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v3 + - name: Install Ruby and gems + uses: ruby/setup-ruby@v1 + with: + ruby-version: 2.7.8 + bundler-cache: true + - name: Security audit dependencies + run: bundle exec bundler-audit --update \ No newline at end of file diff --git a/.github/workflows/js-lint.yml b/.github/workflows/js-lint.yml new file mode 100644 index 0000000000..b6fdab59d3 --- /dev/null +++ b/.github/workflows/js-lint.yml @@ -0,0 +1,38 @@ +# This workflow uses actions that are not certified by GitHub. +# They are provided by a third-party and are governed by +# separate terms of service, privacy policy, and support +# documentation. +# This workflow will download a prebuilt Ruby version, install dependencies and run tests with Rake +# For more information see: https://github.com/marketplace/actions/setup-ruby-jruby-and-truffleruby +name: "Lint JS files using eslint" + +on: + push: + pull_request_target: + types: [ opened, reopened ] +jobs: + lint: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Set up Node.js + uses: actions/setup-node@v1 + with: + node-version: '14' + + - name: Install dependencies + run: yarn install --frozen-lockfile + + - name: Run ESLint and generate SARIF output + run: yarn eslint 'app/**/*.js' --format json --output-file eslint-output.json + + - name: Convert ESLint output to SARIF + run: yarn sarif-convert -o eslint-output.sarif eslint-output.json + + - name: Upload SARIF output + uses: github/codeql-action/upload-sarif@v1 + with: + sarif_file: eslint-output.sarif \ No newline at end of file diff --git a/.github/workflows/lint-rubocop.yml b/.github/workflows/lint-rubocop.yml new file mode 100644 index 0000000000..7cf318db03 --- /dev/null +++ b/.github/workflows/lint-rubocop.yml @@ -0,0 +1,48 @@ +# This workflow uses actions that are not certified by GitHub. +# They are provided by a third-party and are governed by +# separate terms of service, privacy policy, and support +# documentation. +# This workflow will download a prebuilt Ruby version, install dependencies and run tests with Rake +# For more information see: https://github.com/marketplace/actions/setup-ruby-jruby-and-truffleruby +name: "Lint Ruby files using Rubocop" + +on: + push: + pull_request_target: + types: [ opened, reopened ] + +jobs: + rubocop: + runs-on: ubuntu-latest + strategy: + fail-fast: false + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + # If running on a self-hosted runner, check it meets the requirements + # listed at https://github.com/ruby/setup-ruby#using-self-hosted-runners + - name: Set up Ruby + uses: ruby/setup-ruby@55283cc23133118229fd3f97f9336ee23a179fcf # v1.146.0 + with: + ruby-version: 2.7.8 + + # This step is not necessary if you add the gem to your Gemfile + - name: Install Code Scanning integration + run: bundle add code-scanning-rubocop --version 0.3.0 --skip-install + + - name: Install dependencies + run: bundle install + + - name: Rubocop run + run: | + bash -c " + bundle exec rubocop --require code_scanning --format CodeScanning::SarifFormatter -o rubocop.sarif + [[ $? -ne 2 ]] + " + + - name: Upload Sarif output + uses: github/codeql-action/upload-sarif@v2 + with: + sarif_file: rubocop.sarif diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 0000000000..ec6dde7e74 --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,51 @@ +# This workflow uses actions that are not certified by GitHub. +# They are provided by a third-party and are governed by +# separate terms of service, privacy policy, and support +# documentation. +# This workflow will download a prebuilt Ruby version, install dependencies and run tests with Rake +# For more information see: https://github.com/marketplace/actions/setup-ruby-jruby-and-truffleruby +name: "Ruby on Rails CI" + +on: + push: + pull_request_target: + types: [ opened, reopened ] +env: + API_URL: ${{ secrets.API_URL }} + API_KEY: ${{ secrets.API_KEY }} + BIOMIXER_URL: ${{ secrets.BIOMIXER_URL }} + FAIRNESS_URL: ${{ secrets.FAIRNESS_URL }} + ANNOTATOR_URL: ${{ secrets.ANNOTATOR_URL }} +jobs: + test: + runs-on: ubuntu-latest + services: + mysql: + image: mysql:latest + ports: + - "3306:3306" + env: + MYSQL_ROOT_PASSWORD: 'bp_user' + memcached: + image: memcached:1.6 + ports: + - 11211:11211 + steps: + - name: Checkout code + uses: actions/checkout@v3 + # Add or replace dependency steps here + - name: Install Ruby and gems + uses: ruby/setup-ruby@v1 + with: + ruby-version: 2.7.8 + bundler-cache: true + # Add or replace database setup steps here + - name: set up config file + run: cp config/database.yml.sample config/database.yml + - name: Set up database schema + run: RAILS_ENV=test bin/rails db:setup + - name: Set up yarn + run: yarn install + # Add or replace test runners here + - name: Run tests + run: RAILS_ENV=test bin/rails test -v \ No newline at end of file diff --git a/Capfile b/Capfile index 8cbf6f87e4..1b52aa2baa 100644 --- a/Capfile +++ b/Capfile @@ -1,3 +1,5 @@ +# frozen_string_literal: true + # Load DSL and Setup Up Stages require 'capistrano/setup' @@ -18,10 +20,10 @@ require 'capistrano/deploy' # require 'capistrano/rbenv' # require 'capistrano/chruby' require 'capistrano/bundler' -require "capistrano/scm/git" +require 'capistrano/scm/git' install_plugin Capistrano::SCM::Git -#require 'capistrano/rails/assets' -#require 'capistrano/rails/migrations' +# require 'capistrano/rails/assets' +# require 'capistrano/rails/migrations' require 'capistrano/rails' require 'capistrano/yarn' require 'capistrano/locally' diff --git a/Dockerfile b/Dockerfile index 88f019fdb5..d5950edb14 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM ruby:2.7.5-alpine AS app +FROM ruby:2.7.8-alpine AS app WORKDIR /app @@ -17,34 +17,26 @@ RUN apk add --no-cache \ less \ && addgroup --gid ${GID} ruby \ && adduser -u ${UID} -G ruby -D ruby \ - && chown ruby:ruby -R /app \ - && mkdir /node_modules \ - && chown ruby:ruby -R /node_modules /app + && mkdir /node_modules -USER ruby - -COPY --chown=ruby:ruby bin/ ./bin -RUN chmod 0755 bin/* +COPY --chown=ruby:ruby Gemfile* ./ +COPY --chown=ruby:ruby package.json *yarn* ./ -ARG RAILS_ENV="production" +# Set ownership and permissions +RUN chown -R ruby:ruby /app -ENV RAILS_ENV="${RAILS_ENV}" \ - NODE_ENV="${NODE_ENV}" \ - PATH="${PATH}:/home/ruby/.local/bin:/node_modules/.bin" \ - USER="ruby" \ - BUNDLE_PATH=/usr/local/bundle +USER ruby -COPY --chown=ruby:ruby Gemfile* ./ +# Install dependencies RUN bundle install --jobs "$(nproc)" -RUN gem install rails - - +RUN gem install rails +RUN yarn install RUN echo "--modules-folder /node_modules" > .yarnrc -COPY --chown=ruby:ruby package.json *yarn* ./ -RUN yarn install +# Copy application code +COPY --chown=ruby:ruby . . EXPOSE 3000 -CMD ["sh"] \ No newline at end of file +CMD ["bash"] \ No newline at end of file diff --git a/Gemfile b/Gemfile index fd3d45f4bb..b51aff080a 100644 --- a/Gemfile +++ b/Gemfile @@ -5,8 +5,8 @@ gem 'rails', '7.0.3' gem 'jsbundling-rails' -gem 'sassc-rails' #sass-rails replacent -gem 'terser' #ugilifer replacent +gem 'sassc-rails' # sass-rails replacent +gem 'terser' # ugilifer replacent # See https://github.com/rails/execjs#readme for more supported runtimes # gem 'therubyracer', platforms: :ruby @@ -18,11 +18,9 @@ gem 'jquery-rails' gem 'jquery-ui-rails' gem 'select2-rails' - # The original asset pipeline for Rails [https://github.com/rails/sprockets-rails] gem 'sprockets-rails' - # Use the Puma web server [https://github.com/puma/puma] gem 'puma', '~> 5.0' @@ -36,10 +34,10 @@ gem 'turbo-rails' gem 'stimulus-rails' # Build JSON APIs with ease [https://github.com/rails/jbuilder] -#gem "jbuilder" +# gem "jbuilder" # Windows does not include zoneinfo files, so bundle the tzinfo-data gem -gem 'tzinfo-data', platforms: %i[ mingw mswin x64_mingw jruby ] +gem 'tzinfo-data', platforms: %i[mingw mswin x64_mingw jruby] # To use ActiveModel has_secure_password # gem 'bcrypt-ruby', '~> 3.0.0' @@ -50,41 +48,42 @@ gem 'bootsnap', require: false gem 'cube-ruby', require: 'cube' gem 'dalli' +gem 'flag-icons-rails', '~> 3.4' gem 'flamegraph' gem 'graphql-client' gem 'haml', '~> 5.1' gem 'i18n' -gem 'rails-i18n', '~> 7.0.0' gem 'iconv' +gem 'inline_svg' +gem 'iso-639', '~> 0.3.6' +gem 'lookbook', '~> 1.5.5' gem 'multi_json' -gem 'mysql2', '0.5.3' +gem 'mysql2' gem 'oj' +gem 'ontologies_api_client', git: 'https://github.com/ontoportal-lirmm/ontologies_api_ruby_client.git', + branch: 'development' gem 'open_uri_redirections' gem 'pry' -gem 'psych', '< 4' +gem 'psych' gem 'rack-mini-profiler' gem 'rails_autolink' +gem 'rails-i18n', '~> 7.0.0' gem 'rdoc' gem 'recaptcha', '~> 5.9.0' gem 'rest-client' gem 'stackprof', require: false gem 'thin' -gem 'view_component', '~> 2.72' gem 'turnout' +gem 'view_component', '~> 2.72' gem 'will_paginate', '~> 3.0' -gem 'inline_svg' -gem "lookbook", '~> 1.5.5' -gem 'ontologies_api_client', git: 'https://github.com/ontoportal-lirmm/ontologies_api_ruby_client.git', branch: 'development' -gem "flag-icons-rails", "~> 3.4" -gem "iso-639", "~> 0.3.6" # Multi-Provider Authentication gem 'omniauth' -gem "omniauth-rails_csrf_protection" gem 'omniauth-github' gem 'omniauth-google-oauth2' -gem 'omniauth-orcid' gem 'omniauth-keycloak' +gem 'omniauth-orcid' +gem 'omniauth-rails_csrf_protection' group :staging, :production, :appliance do # application monitoring @@ -106,21 +105,22 @@ group :development do gem 'ed25519', '>= 1.2', '< 2.0', require: false # https://github.com/miloserdow/capistrano-deploy/issues/42 gem 'html2haml' gem 'listen' - # static code analysis - gem 'brakeman', require: false - gem 'rubocop', require: false # gem 'i18n-debug' # See https://guides.rubyonrails.org/debugging_rails_applications.html#debugging-with-the-debug-gem - gem 'debug', platforms: %i[ mri mingw x64_mingw ] + gem 'debug', platforms: %i[mri mingw x64_mingw] # Use console on exceptions pages [https://github.com/rails/web-console] - gem 'web-console' - gem 'i18n-tasks' gem 'deepl-rb' + gem 'i18n-tasks' + gem 'web-console' end group :test, :development do + gem 'brakeman' gem 'rspec-rails' + gem 'rubocop' + gem 'rubocop-rails' + gem 'ruby_audit' end group :test do @@ -130,7 +130,4 @@ group :test do gem 'webdrivers' end - -gem "net-ftp", "~> 0.2.0", require: false -gem "net-http" - +gem 'net-ftp', '~> 0.2.0', require: false \ No newline at end of file diff --git a/Gemfile.lock b/Gemfile.lock index e1035012ca..01f503b979 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -101,7 +101,7 @@ GEM smart_properties bindata (2.4.15) bindex (0.8.1) - bootsnap (1.16.0) + bootsnap (1.17.0) msgpack (~> 1.2) bootstrap (4.2.1) autoprefixer-rails (>= 9.1.0) @@ -109,6 +109,9 @@ GEM sassc-rails (>= 2.0.0) brakeman (5.4.1) builder (3.2.4) + bundler-audit (0.9.1) + bundler (>= 1.2.0, < 3) + thor (~> 1.0) capistrano (3.18.0) airbrussh (>= 1.0.0) i18n @@ -156,7 +159,7 @@ GEM erubi (1.12.0) erubis (2.7.0) eventmachine (1.2.7) - excon (0.103.0) + excon (0.104.0) execjs (2.9.1) faraday (2.0.1) faraday-net_http (~> 2.0) @@ -169,13 +172,13 @@ GEM faraday-multipart (1.0.4) multipart-post (~> 2) faraday-net_http (2.1.0) - ffi (1.16.1) + ffi (1.16.3) flag-icons-rails (3.4.6.1) sass-rails flamegraph (0.9.5) globalid (1.2.1) activesupport (>= 6.1) - graphql (2.1.3) + graphql (2.1.6) racc (~> 1.4) graphql-client (0.18.0) activesupport (>= 3.0) @@ -197,20 +200,21 @@ GEM domain_name (~> 0.5) i18n (1.14.1) concurrent-ruby (~> 1.0) - i18n-tasks (1.0.12) + i18n-tasks (1.0.13) activesupport (>= 4.0.2) ast (>= 2.1.0) better_html (>= 1.0, < 3.0) erubi highline (>= 2.0.0) i18n - parser (>= 2.2.3.0) + parser (>= 3.2.2.1) rails-i18n rainbow (>= 2.2.2, < 4.0) terminal-table (>= 1.5.1) iconv (1.0.8) - importmap-rails (1.2.1) + importmap-rails (1.2.3) actionpack (>= 6.0.0) + activesupport (>= 6.0.0) railties (>= 6.0.0) inline_svg (1.9.0) activesupport (>= 3.0) @@ -274,13 +278,11 @@ GEM multi_json (1.15.0) multi_xml (0.6.0) multipart-post (2.3.0) - mysql2 (0.5.3) + mysql2 (0.5.5) net-ftp (0.2.0) net-protocol time - net-http (0.3.2) - uri - net-imap (0.4.1) + net-imap (0.4.3) date net-protocol net-pop (0.1.2) @@ -293,7 +295,8 @@ GEM net-protocol net-ssh (7.2.0) netrc (0.11.0) - newrelic_rpm (9.5.0) + newrelic_rpm (9.6.0) + base64 nio4r (2.5.9) nokogiri (1.15.4-x86_64-darwin) racc (~> 1.4) @@ -341,11 +344,12 @@ GEM pry (0.14.2) coderay (~> 1.1) method_source (~> 1.0) - psych (3.3.4) + psych (5.1.1.1) + stringio public_suffix (5.0.3) puma (5.6.7) nio4r (~> 2.0) - racc (1.7.1) + racc (1.7.2) rack (2.2.8) rack-accept (0.4.5) rack (>= 0.4) @@ -391,16 +395,17 @@ GEM thor (~> 1.0) zeitwerk (~> 2.5) rainbow (3.1.1) - rake (13.0.6) + rake (13.1.0) rb-fsevent (0.11.2) rb-inotify (0.10.1) ffi (~> 1.0) - rdoc (6.3.3) + rdoc (6.5.0) + psych (>= 4.0.0) recaptcha (5.9.0) json redcarpet (3.6.0) - regexp_parser (2.8.1) - reline (0.3.8) + regexp_parser (2.8.2) + reline (0.3.9) io-console (~> 0.5) rest-client (2.1.0) http-accept (>= 1.7.0, < 2.0) @@ -408,7 +413,7 @@ GEM mime-types (>= 1.16, < 4.0) netrc (~> 0.8) rexml (3.2.6) - rouge (4.1.3) + rouge (4.2.0) rspec-core (3.12.2) rspec-support (~> 3.12.0) rspec-expectations (3.12.3) @@ -426,8 +431,7 @@ GEM rspec-mocks (~> 3.12) rspec-support (~> 3.12) rspec-support (3.12.1) - rubocop (1.56.3) - base64 (~> 0.1.1) + rubocop (1.57.2) json (~> 2.3) language_server-protocol (>= 3.17.0) parallel (~> 1.10) @@ -438,10 +442,16 @@ GEM rubocop-ast (>= 1.28.1, < 2.0) ruby-progressbar (~> 1.7) unicode-display_width (>= 2.4.0, < 3.0) - rubocop-ast (1.29.0) + rubocop-ast (1.30.0) parser (>= 3.2.1.0) + rubocop-rails (2.22.1) + activesupport (>= 4.2.0) + rack (>= 1.1) + rubocop (>= 1.33.0, < 2.0) ruby-progressbar (1.13.0) ruby2_keywords (0.0.5) + ruby_audit (2.2.0) + bundler-audit (~> 0.9.0) ruby_dig (0.0.2) ruby_parser (3.20.3) sexp_processor (~> 4.16) @@ -480,16 +490,17 @@ GEM stackprof (0.2.25) stimulus-rails (1.3.0) railties (>= 6.0.0) - temple (0.10.2) + stringio (3.0.8) + temple (0.10.3) terminal-table (3.0.2) unicode-display_width (>= 1.1.1, < 3) - terser (1.1.18) + terser (1.1.19) execjs (>= 0.3.0, < 3) thin (1.8.2) daemons (~> 1.0, >= 1.0.9) eventmachine (~> 1.0, >= 1.0.4) rack (>= 1, < 3) - thor (1.2.2) + thor (1.3.0) tilt (2.3.0) time (0.2.2) date @@ -509,7 +520,6 @@ GEM unf_ext unf_ext (0.0.8.2) unicode-display_width (2.5.0) - uri (0.12.2) version_gem (1.1.3) view_component (2.82.0) activesupport (>= 5.2.0, < 8.0) @@ -532,12 +542,11 @@ GEM xpath (3.2.0) nokogiri (~> 1.8) yard (0.9.34) - zeitwerk (2.6.11) + zeitwerk (2.6.12) PLATFORMS - x86_64-darwin-21 + x86_64-darwin-23 x86_64-linux - x86_64-linux-musl DEPENDENCIES bcrypt_pbkdf (>= 1.0, < 2.0) @@ -574,9 +583,8 @@ DEPENDENCIES listen lookbook (~> 1.5.5) multi_json - mysql2 (= 0.5.3) + mysql2 net-ftp (~> 0.2.0) - net-http newrelic_rpm oj omniauth @@ -588,7 +596,7 @@ DEPENDENCIES ontologies_api_client! open_uri_redirections pry - psych (< 4) + psych puma (~> 5.0) rack-mini-profiler rails (= 7.0.3) @@ -599,6 +607,8 @@ DEPENDENCIES rest-client rspec-rails rubocop + rubocop-rails + ruby_audit sassc-rails select2-rails selenium-webdriver @@ -616,4 +626,4 @@ DEPENDENCIES will_paginate (~> 3.0) BUNDLED WITH - 2.4.12 + 2.4.21 diff --git a/Rakefile b/Rakefile old mode 100644 new mode 100755 index 59ea504776..78cd2cb4f9 --- a/Rakefile +++ b/Rakefile @@ -1,7 +1,9 @@ #!/usr/bin/env rake +# frozen_string_literal: true + # Add your own tasks in files placed in lib/tasks ending in .rake, # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. -require File.expand_path('../config/application', __FILE__) +require File.expand_path('config/application', __dir__) BioportalWebUi::Application.load_tasks diff --git a/app/components/agent_search_input_component.rb b/app/components/agent_search_input_component.rb index 3bebfa5655..a9e4ce63ab 100644 --- a/app/components/agent_search_input_component.rb +++ b/app/components/agent_search_input_component.rb @@ -1,8 +1,7 @@ # frozen_string_literal: true class AgentSearchInputComponent < ViewComponent::Base - - def initialize(id:, agent_type: nil, name_prefix: nil, parent_id: , edit_on_modal: false) + def initialize(id:, parent_id:, agent_type: nil, name_prefix: nil, edit_on_modal: false) super @id = id @agent_type = agent_type diff --git a/app/components/alerts_container_component.rb b/app/components/alerts_container_component.rb index 43681a9e02..ca602af644 100644 --- a/app/components/alerts_container_component.rb +++ b/app/components/alerts_container_component.rb @@ -5,5 +5,4 @@ class AlertsContainerComponent < ViewComponent::Base def initialize(id:) @id = id end - end diff --git a/app/components/buttons/regular_button_component.rb b/app/components/buttons/regular_button_component.rb index 1e994e8039..e422d0cf8a 100644 --- a/app/components/buttons/regular_button_component.rb +++ b/app/components/buttons/regular_button_component.rb @@ -1,49 +1,57 @@ -class Buttons::RegularButtonComponent < ViewComponent::Base - renders_one :icon_left - renders_one :icon_right +# frozen_string_literal: true - def initialize(id: , value:, variant: "primary", color: "normal", href: "", size: "normal", state: "animate", type: 'button') - @id = id - @value = value - @variant = variant - @color = color - @href = href - @size = size - @state = state - @type = type - end +module Buttons + class RegularButtonComponent < ViewComponent::Base + renders_one :icon_left + renders_one :icon_right - def button_label - hide_icon_left = icon_left == nil ? "hide" : " " - hide_icon_right = icon_right == nil ? "hide" : " " - content_tag(:span, icon_left, class: "#{@variant}-button-icon left-button-icon #{hide_icon_left}") + content_tag(:div, @value) + content_tag(:span, icon_right, class: "#{@variant}-button-icon right-button-icon #{hide_icon_right}") - end + def initialize(id:, value:, variant: 'primary', color: 'normal', href: '', size: 'normal', state: 'animate', + type: 'button') + @id = id + @value = value + @variant = variant + @color = color + @href = href + @size = size + @state = state + @type = type + end - def button_elem - slim_class = @size == "slim" ? "slim " : " " - danger_class = @color == "danger" ? "danger-button " : " " - warning_class = @color == "warning" ? "warning-button " : " " - disabled_class = @state == "disabled" ? "disabled-button " : " " - class_style = "#{@variant}-button regular-button " + danger_class + warning_class + disabled_class + slim_class - on_click_event = load_animation? ? "displayAnimation(this, '#{@id}-loading-animation')" : '' + def button_label + hide_icon_left = icon_left.nil? ? 'hide' : ' ' + hide_icon_right = icon_right.nil? ? 'hide' : ' ' + content_tag(:span, icon_left, + class: "#{@variant}-button-icon left-button-icon #{hide_icon_left}") + content_tag(:div, + @value) + content_tag( + :span, icon_right, class: "#{@variant}-button-icon right-button-icon #{hide_icon_right}" + ) + end - if link? - link_to(@href, class: class_style, onclick: on_click_event, id: @id) do - button_label - end - else - button_tag(type: @type, class: class_style, onclick: on_click_event, id: @id) do - button_label + def button_elem + slim_class = @size == 'slim' ? 'slim ' : ' ' + danger_class = @color == 'danger' ? 'danger-button ' : ' ' + warning_class = @color == 'warning' ? 'warning-button ' : ' ' + disabled_class = @state == 'disabled' ? 'disabled-button ' : ' ' + class_style = "#{@variant}-button regular-button " + danger_class + warning_class + disabled_class + slim_class + on_click_event = load_animation? ? "displayAnimation(this, '#{@id}-loading-animation')" : '' + + if link? + link_to(@href, class: class_style, onclick: on_click_event, id: @id) do + button_label + end + else + button_tag(type: @type, class: class_style, onclick: on_click_event, id: @id) do + button_label + end end end - end - def link? - @href && !@href.empty? - end + def link? + @href && !@href.empty? + end - def load_animation? - @state == "animate" + def load_animation? + @state == 'animate' + end end - end diff --git a/app/components/card_message_component.rb b/app/components/card_message_component.rb index d0f15d0622..76b9dc401a 100644 --- a/app/components/card_message_component.rb +++ b/app/components/card_message_component.rb @@ -1,28 +1,30 @@ +# frozen_string_literal: true + class CardMessageComponent < ViewComponent::Base - def initialize(title: nil ,message:, button_text: nil, button_link: "/" ,type:) - @title = title - @message = message - @button_text = button_text - @type = type - @button_link = button_link - end + def initialize(message:, type:, title: nil, button_text: nil, button_link: '/') + @title = title + @message = message + @button_text = button_text + @type = type + @button_link = button_link + end - def no_title? - @title.nil? - end + def no_title? + @title.nil? + end - def no_button? - @button_text.nil? - end + def no_button? + @button_text.nil? + end - def icon - case @type - when "success" - "green-check.svg" - when "failure" - "red-warning.svg" - when "warning" - "orange-warning.svg" - end + def icon + case @type + when 'success' + 'green-check.svg' + when 'failure' + 'red-warning.svg' + when 'warning' + 'orange-warning.svg' end + end end diff --git a/app/components/chip_button_component.rb b/app/components/chip_button_component.rb index f503dca5aa..2205daafe4 100644 --- a/app/components/chip_button_component.rb +++ b/app/components/chip_button_component.rb @@ -1,9 +1,11 @@ +# frozen_string_literal: true + class ChipButtonComponent < ViewComponent::Base - def initialize(url: nil, text: nil, type: "static", disabled: false, **html_options) - @url = url - @text = text - @type = type - @disabled = disabled - @html_options = html_options.merge({href: @url}) - end -end \ No newline at end of file + def initialize(url: nil, text: nil, type: 'static', disabled: false, **html_options) + @url = url + @text = text + @type = type + @disabled = disabled + @html_options = html_options.merge({ href: @url }) + end +end diff --git a/app/components/chips_component.rb b/app/components/chips_component.rb index 0e9628bec9..1dfb2a0227 100644 --- a/app/components/chips_component.rb +++ b/app/components/chips_component.rb @@ -1,15 +1,16 @@ -class ChipsComponent < ViewComponent::Base +# frozen_string_literal: true - renders_one :count - def initialize(id:nil, name:, label: nil, value:, checked: false) - @id = id || name - @name = name - @value = value - @checked = checked - @label = label || @value - end +class ChipsComponent < ViewComponent::Base + renders_one :count + def initialize(name:, value:, id: nil, label: nil, checked: false) + @id = id || name + @name = name + @value = value + @checked = checked + @label = label || @value + end - def checked? - @checked - end -end \ No newline at end of file + def checked? + @checked + end +end diff --git a/app/components/circle_progress_bar_component.rb b/app/components/circle_progress_bar_component.rb index e3e746b605..d7a7e03e67 100644 --- a/app/components/circle_progress_bar_component.rb +++ b/app/components/circle_progress_bar_component.rb @@ -1,8 +1,7 @@ # frozen_string_literal: true class CircleProgressBarComponent < ViewComponent::Base - - def initialize(count: , max: ) + def initialize(count:, max:) super @count = count @max = max diff --git a/app/components/collapsable_block_component.rb b/app/components/collapsable_block_component.rb index 7941f2d960..b1bb6a80a2 100644 --- a/app/components/collapsable_block_component.rb +++ b/app/components/collapsable_block_component.rb @@ -3,7 +3,6 @@ class CollapsableBlockComponent < ViewComponent::Base renders_one :header - def initialize(id: '', parent_id: '', collapsed: true, title: '') super @id = id @@ -17,6 +16,6 @@ def collapsed? end def collapsed_class - collapsed? ? 'collapsed' : 'show' + collapsed? ? 'collapsed' : 'show' end end diff --git a/app/components/concept_details_component.rb b/app/components/concept_details_component.rb index 87c6d3572d..52ef2da853 100644 --- a/app/components/concept_details_component.rb +++ b/app/components/concept_details_component.rb @@ -29,7 +29,6 @@ def add_sections(keys, &block) table_row.create(*row) end end - end def row_hash_properties(properties_set, ontology_acronym, &block) @@ -43,12 +42,10 @@ def row_hash_properties(properties_set, ontology_acronym, &block) ajax_links = values.map do |v| if block_given? block.call(v) + elsif v.is_a?(String) + get_link_for_cls_ajax(v, ontology_acronym, '_blank') else - if v.is_a?(String) - get_link_for_cls_ajax(v, ontology_acronym, '_blank') - else - display_in_multiple_languages([v].to_h) - end + display_in_multiple_languages([v].to_h) end end @@ -111,37 +108,41 @@ def concept_properties2hash(properties) next if properties[key].nil? # ignore :context and :links when nil. # Shorten the key into a simple label - k = key.to_s if key.kind_of?(Symbol) + k = key.to_s if key.is_a?(Symbol) k ||= key label = key - if k.start_with?("http") - label = LinkedData::Client::HTTP.get("/ontologies/#{@ontology.acronym}/properties/#{CGI.escape(k)}/label").label rescue "" + if k.start_with?('http') + label = begin + LinkedData::Client::HTTP.get("/ontologies/#{@ontology.acronym}/properties/#{CGI.escape(k)}/label").label + rescue StandardError + '' + end if label.nil? || label.empty? k = k.gsub(/.*#/, '') # greedy regex replace everything up to last '#' - k = k.gsub(/.*\//, '') # greedy regex replace everything up to last '/' + k = k.gsub(%r{.*/}, '') # greedy regex replace everything up to last '/' # That might take care of nearly everything to be shortened. label = k end end begin # Try to simplify the property values, when they are a struct. - if properties[key].is_a?(OpenStruct) - values = language_hash(properties[key]) - else - values = properties[key].map { |v| v.string } - end - rescue + values = if properties[key].is_a?(OpenStruct) + language_hash(properties[key]) + else + properties[key].map(&:string) + end + rescue StandardError # Each value is probably a simple datatype already. values = properties[key] end - data = { :key => key, :values => values } + data = { key: key, values: values } properties_data[label] = data end - return properties_data + properties_data end def exclude_relation?(relation_to_check, ontology = nil) - excluded_relations = ["type", "rdf:type", "[R]", "SuperClass", "InstanceCount"] + excluded_relations = ['type', 'rdf:type', '[R]', 'SuperClass', 'InstanceCount'] # Show or hide property based on the property and ontology settings if ontology @@ -155,7 +156,6 @@ def exclude_relation?(relation_to_check, ontology = nil) excluded_relations.each do |relation| return true if relation_to_check.include?(relation) end - return false + false end - end diff --git a/app/components/date_time_field_component.rb b/app/components/date_time_field_component.rb index 35ec91b38d..657ac84aa0 100644 --- a/app/components/date_time_field_component.rb +++ b/app/components/date_time_field_component.rb @@ -1,8 +1,7 @@ # frozen_string_literal: true class DateTimeFieldComponent < ViewComponent::Base - - def initialize(value: , format: :monthfull_day_year) + def initialize(value:, format: :monthfull_day_year) super @value = value @format = format @@ -11,5 +10,4 @@ def initialize(value: , format: :monthfull_day_year) def call l(Date.parse(@value), format: @format.to_sym) if @value end - end diff --git a/app/components/display/alert_component.rb b/app/components/display/alert_component.rb index c381f2a37e..f528819b67 100644 --- a/app/components/display/alert_component.rb +++ b/app/components/display/alert_component.rb @@ -1,47 +1,48 @@ -class Display::AlertComponent < ViewComponent::Base - def initialize(message: nil, closable: true, type: "info", auto_close_delay: nil) - @message = message - @closable = closable - @type = type - @auto_close_delay = auto_close_delay +# frozen_string_literal: true + +module Display + class AlertComponent < ViewComponent::Base + def initialize(message: nil, closable: true, type: 'info', auto_close_delay: nil) + @message = message + @closable = closable + @type = type + @auto_close_delay = auto_close_delay end def closable? - @closable + @closable end - def message - @message - end + attr_reader :message def alert_type_class - case @type - when "info" - "alert-info-type" - when "warning" - "alert-warning-type" - when "danger" - "alert-danger-type" - when "success" - "alert-success-type" - end + case @type + when 'info' + 'alert-info-type' + when 'warning' + 'alert-warning-type' + when 'danger' + 'alert-danger-type' + when 'success' + 'alert-success-type' + end end def alert_icon - case @type - when "info" - "info.svg" - when "warning" - "warning.svg" - when "danger" - "danger.svg" - when "success" - "success.svg" - end + case @type + when 'info' + 'info.svg' + when 'warning' + 'warning.svg' + when 'danger' + 'danger.svg' + when 'success' + 'success.svg' + end end def auto_close? - !@auto_close_delay.nil? + !@auto_close_delay.nil? end - -end \ No newline at end of file + end +end diff --git a/app/components/display/button_loader_component.rb b/app/components/display/button_loader_component.rb index 202cd4cf9d..ec9dab61c8 100644 --- a/app/components/display/button_loader_component.rb +++ b/app/components/display/button_loader_component.rb @@ -1,22 +1,22 @@ # frozen_string_literal: true -class Display::ButtonLoaderComponent < ViewComponent::Base - - def initialize(id: nil, slim: false, color: 'normal') - @slim = slim - @color = color - @id = id - end - +module Display + class ButtonLoaderComponent < ViewComponent::Base + def initialize(id: nil, slim: false, color: 'normal') + @slim = slim + @color = color + @id = id + end - def call - slim_class = @slim ? "slim " : "" - danger_class = @color == "danger" ? "danger-button " : "" - warning_class = @color == "warning" ? "warning-button " : "" + def call + slim_class = @slim ? 'slim ' : '' + danger_class = @color == 'danger' ? 'danger-button ' : '' + warning_class = @color == 'warning' ? 'warning-button ' : '' - content_tag(:div, class: "animation-container #{danger_class} #{warning_class} #{slim_class}", id: @id) do - content_tag(:div, class: "lds-ellipsis") do - 4.times.map { content_tag(:div) }.join.html_safe + content_tag(:div, class: "animation-container #{danger_class} #{warning_class} #{slim_class}", id: @id) do + content_tag(:div, class: 'lds-ellipsis') do + 4.times.map { content_tag(:div) }.join.html_safe + end end end end diff --git a/app/components/display/header_component.rb b/app/components/display/header_component.rb index b814f55fc1..7aa8b08809 100644 --- a/app/components/display/header_component.rb +++ b/app/components/display/header_component.rb @@ -1,23 +1,21 @@ # frozen_string_literal: true -class Display::HeaderComponent < ViewComponent::Base +module Display + class HeaderComponent < ViewComponent::Base + renders_one :text - renders_one :text - - def initialize(text: nil, tooltip: nil) - super - @text = text - @info = tooltip - end + def initialize(text: nil, tooltip: nil) + super + @text = text + @info = tooltip + end - def call - content_tag(:div, class: 'header-component') do - out = content_tag(:p, text || @text) - if @info && !@info.empty? - out = out + render(Display::InfoTooltipComponent.new(text: @info)) + def call + content_tag(:div, class: 'header-component') do + out = content_tag(:p, text || @text) + out += render(Display::InfoTooltipComponent.new(text: @info)) if @info && !@info.empty? + out end - out end end - end diff --git a/app/components/display/image_component.rb b/app/components/display/image_component.rb index 36bcb10fe7..8015598c4a 100644 --- a/app/components/display/image_component.rb +++ b/app/components/display/image_component.rb @@ -1,34 +1,35 @@ # frozen_string_literal: true -class Display::ImageComponent < ViewComponent::Base - include ModalHelper +module Display + class ImageComponent < ViewComponent::Base + include ModalHelper - def initialize(src: , title: '', enable_zoom: true) - super - @src = src - @title = title - @enable_zoom = enable_zoom - end + def initialize(src:, title: '', enable_zoom: true) + super + @src = src + @title = title + @enable_zoom = enable_zoom + end - def call - content_tag(:div, class: 'image-container ') do - depiction_with_modal(@src) + def call + content_tag(:div, class: 'image-container ') do + depiction_with_modal(@src) + end end - end - def depiction_with_modal(depiction_url) - img_tag = image_tag(depiction_url, class: 'image-content') - loop_icon_tag = content_tag(:span , image_tag('icons/loop.svg'), class: 'loop_icon') - modal_url = "/ajax/images/show?url=#{depiction_url}" - modal_options = { data: { show_modal_title_value: @title, show_modal_size_value: 'modal-xl' } } + def depiction_with_modal(depiction_url) + img_tag = image_tag(depiction_url, class: 'image-content') + loop_icon_tag = content_tag(:span, image_tag('icons/loop.svg'), class: 'loop_icon') + modal_url = "/ajax/images/show?url=#{depiction_url}" + modal_options = { data: { show_modal_title_value: @title, show_modal_size_value: 'modal-xl' } } - if @enable_zoom - link_to_modal(nil, modal_url, modal_options) do - loop_icon_tag + img_tag + if @enable_zoom + link_to_modal(nil, modal_url, modal_options) do + loop_icon_tag + img_tag + end + else + img_tag end - else - img_tag end - end end diff --git a/app/components/display/info_tooltip_component.rb b/app/components/display/info_tooltip_component.rb index 824ae908e9..af77f2f610 100644 --- a/app/components/display/info_tooltip_component.rb +++ b/app/components/display/info_tooltip_component.rb @@ -1,14 +1,15 @@ # frozen_string_literal: true -class Display::InfoTooltipComponent < ViewComponent::Base +module Display + class InfoTooltipComponent < ViewComponent::Base + def initialize(text: nil, icon: 'info.svg') + super + @text = text + @icon = icon + end - def initialize(text: nil , icon: "info.svg") - super - @text = text - @icon = icon + def call + image_tag("icons/#{@icon}", data: { controller: 'tooltip', 'tooltip-interactive-value': 'true' }, title: @text) + end end - def call - image_tag("icons/#{@icon}", data:{controller:'tooltip', 'tooltip-interactive-value': 'true'}, title: @text) - end - end diff --git a/app/components/dropdown_button_component.rb b/app/components/dropdown_button_component.rb index 08c97795cc..a091fa27ea 100644 --- a/app/components/dropdown_button_component.rb +++ b/app/components/dropdown_button_component.rb @@ -1,7 +1,6 @@ # frozen_string_literal: true class DropdownButtonComponent < ViewComponent::Base - renders_one :header renders_many :sections, DropdownSectionButtonComponent diff --git a/app/components/dropdown_container_component.rb b/app/components/dropdown_container_component.rb index 3d785f85e8..3d727bf789 100644 --- a/app/components/dropdown_container_component.rb +++ b/app/components/dropdown_container_component.rb @@ -2,7 +2,7 @@ class DropdownContainerComponent < ViewComponent::Base renders_one :empty_state - def initialize(title:, id:, tooltip:nil) + def initialize(title:, id:, tooltip: nil) super @title = title @id = id diff --git a/app/components/dropdown_section_button_component.rb b/app/components/dropdown_section_button_component.rb index c46074f758..56a8d6fcda 100644 --- a/app/components/dropdown_section_button_component.rb +++ b/app/components/dropdown_section_button_component.rb @@ -1,7 +1,6 @@ # frozen_string_literal: true class DropdownSectionButtonComponent < ViewComponent::Base - renders_one :header renders_many :items diff --git a/app/components/external_link_text_component.rb b/app/components/external_link_text_component.rb index 05bed2cfbb..28e18b47f8 100644 --- a/app/components/external_link_text_component.rb +++ b/app/components/external_link_text_component.rb @@ -1,7 +1,6 @@ # frozen_string_literal: true class ExternalLinkTextComponent < LinkTextComponent - def initialize(text:) super(text: text, icon: 'icons/external-link.svg') end diff --git a/app/components/field_container_component.rb b/app/components/field_container_component.rb index d45e42e0ea..7fff131f63 100644 --- a/app/components/field_container_component.rb +++ b/app/components/field_container_component.rb @@ -1,7 +1,6 @@ # frozen_string_literal: true class FieldContainerComponent < ViewComponent::Base - renders_one :label def initialize(label: nil, value: nil) super diff --git a/app/components/infinite_scroll_component.rb b/app/components/infinite_scroll_component.rb index ecbfa3a88d..426b4c8071 100644 --- a/app/components/infinite_scroll_component.rb +++ b/app/components/infinite_scroll_component.rb @@ -14,7 +14,5 @@ def initialize(id:, collection:, next_url:, current_page:, next_page:) @next_url = next_url @current_page = current_page @next_page = next_page - end - end diff --git a/app/components/input/date_component.rb b/app/components/input/date_component.rb index 6d26ad4c20..fd03790806 100644 --- a/app/components/input/date_component.rb +++ b/app/components/input/date_component.rb @@ -1,14 +1,19 @@ # frozen_string_literal: true -class Input::DateComponent < Input::InputFieldComponent - def initialize(label: '', name:, value: Date.today, placeholder: '', error_message: '', helper_text: '', id: nil, max_date: nil) - data_flat_picker = { controller: "flatpickr", flatpickr_date_format: "Y-m-d", flatpickr_alt_input: "true", flatpickr_alt_format: "F j, Y"} - data_flat_picker[:flatpickr_max_date] = max_date if max_date +module Input + class DateComponent < Input::InputFieldComponent + def initialize(name:, label: '', value: Date.today, placeholder: '', error_message: '', helper_text: '', id: nil, + max_date: nil) + data_flat_picker = { controller: 'flatpickr', flatpickr_date_format: 'Y-m-d', flatpickr_alt_input: 'true', + flatpickr_alt_format: 'F j, Y' } + data_flat_picker[:flatpickr_max_date] = max_date if max_date - super(label: label, name: name, value: value, placeholder: placeholder, error_message: error_message, helper_text: helper_text, data: data_flat_picker, id: id) - end + super(label: label, name: name, value: value, placeholder: placeholder, error_message: error_message, helper_text: helper_text, data: data_flat_picker, id: id) + end - def call - render Input::InputFieldComponent.new(label: @label, name: @name, value: @value, placeholder: @placeholder, error_message: @error_message, helper_text: @helper_text, data: @data, type: 'date', id: @id) + def call + render Input::InputFieldComponent.new(label: @label, name: @name, value: @value, placeholder: @placeholder, + error_message: @error_message, helper_text: @helper_text, data: @data, type: 'date', id: @id) + end end end diff --git a/app/components/input/email_component.rb b/app/components/input/email_component.rb index 8d68ba3bc7..ba88f55a19 100644 --- a/app/components/input/email_component.rb +++ b/app/components/input/email_component.rb @@ -1,11 +1,14 @@ # frozen_string_literal: true -class Input::EmailComponent < Input::InputFieldComponent - def initialize(label: '', name:, value: nil, placeholder: '', error_message: '', helper_text: '') - super(label: label, name: name, value: value, placeholder: placeholder, error_message: error_message, helper_text: helper_text) - end +module Input + class EmailComponent < Input::InputFieldComponent + def initialize(name:, label: '', value: nil, placeholder: '', error_message: '', helper_text: '') + super(label: label, name: name, value: value, placeholder: placeholder, error_message: error_message, helper_text: helper_text) + end - def call - render Input::InputFieldComponent.new(label: @label, name: @name, value: @value, placeholder: @placeholder, error_message: @error_message, helper_text: @helper_text, type: "email") + def call + render Input::InputFieldComponent.new(label: @label, name: @name, value: @value, placeholder: @placeholder, + error_message: @error_message, helper_text: @helper_text, type: 'email') + end end end diff --git a/app/components/input/file_input_component.rb b/app/components/input/file_input_component.rb index 41de28bce3..639585e6b5 100644 --- a/app/components/input/file_input_component.rb +++ b/app/components/input/file_input_component.rb @@ -1,9 +1,10 @@ # frozen_string_literal: true -class Input::FileInputComponent < ViewComponent::Base - def initialize(name:, html_options: '') - @name = name - @html_options = html_options +module Input + class FileInputComponent < ViewComponent::Base + def initialize(name:, html_options: '') + @name = name + @html_options = html_options + end end - end diff --git a/app/components/input/input_field_component.rb b/app/components/input/input_field_component.rb index bed61a95fd..eae9ac73f6 100644 --- a/app/components/input/input_field_component.rb +++ b/app/components/input/input_field_component.rb @@ -1,33 +1,35 @@ -class Input::InputFieldComponent < ViewComponent::Base - def initialize(label: "" , name:, value: '', type: 'text', placeholder: "", error_message: "", helper_text: "", disabled: false, data: nil, id: '') - @label = label - @name = name - @placeholder = placeholder - @error_message = error_message - @helper_text = helper_text - @value = value - @type = type - @disabled = disabled - @id = id - @data = data - end - - - def error_style - "border-color: var(--error-color);" if error? - end - - def error? - !@error_message&.empty? - end - - def help? - !@helper_text&.empty? - end - - def label? - !@label&.empty? - end -end - - +# frozen_string_literal: true + +module Input + class InputFieldComponent < ViewComponent::Base + def initialize(name:, label: '', value: '', type: 'text', placeholder: '', error_message: '', helper_text: '', + disabled: false, data: nil, id: '') + @label = label + @name = name + @placeholder = placeholder + @error_message = error_message + @helper_text = helper_text + @value = value + @type = type + @disabled = disabled + @id = id + @data = data + end + + def error_style + 'border-color: var(--error-color);' if error? + end + + def error? + !@error_message&.empty? + end + + def help? + !@helper_text&.empty? + end + + def label? + !@label&.empty? + end + end +end diff --git a/app/components/input/language_selector_component.rb b/app/components/input/language_selector_component.rb index 3a7ec435c3..f7f2be8ac5 100644 --- a/app/components/input/language_selector_component.rb +++ b/app/components/input/language_selector_component.rb @@ -1,26 +1,28 @@ # frozen_string_literal: true -class Input::LanguageSelectorComponent < ViewComponent::Base - - def initialize(languages:, selected: nil, id: '', name: '' ) - super - @languages = languages - @id = id - @name = languages - @selected = selected - end +module Input + class LanguageSelectorComponent < ViewComponent::Base + def initialize(languages:, selected: nil, id: '', name: '') + super + @languages = languages + @id = id + @name = languages + @selected = selected + end - def languages_options - values = [['All languages', 'all']] + def languages_options + values = [['All languages', 'all']] - @languages.each do |key, label| - option = "
#{render(LanguageFieldComponent.new(value: key.to_s.downcase, label: label))}
" - values += [[option, key.to_s.downcase]] + @languages.each do |key, label| + option = "
#{render(LanguageFieldComponent.new(value: key.to_s.downcase, label: label))}
" + values += [[option, key.to_s.downcase]] + end + values end - values - end - def call - render SelectInputComponent.new(id: @id, name: @name, values: languages_options, selected: @selected, placeholder: 'Select a language') + def call + render SelectInputComponent.new(id: @id, name: @name, values: languages_options, selected: @selected, + placeholder: 'Select a language') + end end end diff --git a/app/components/input/password_component.rb b/app/components/input/password_component.rb index 435692a5b5..3b612ad29e 100644 --- a/app/components/input/password_component.rb +++ b/app/components/input/password_component.rb @@ -1,11 +1,14 @@ # frozen_string_literal: true -class Input::PasswordComponent < Input::InputFieldComponent - def initialize(label: '', name:, value: nil, placeholder: '', error_message: '', helper_text: '') - super(label: label, name: name, value: value, placeholder: placeholder, error_message: error_message, helper_text: helper_text) - end +module Input + class PasswordComponent < Input::InputFieldComponent + def initialize(name:, label: '', value: nil, placeholder: '', error_message: '', helper_text: '') + super(label: label, name: name, value: value, placeholder: placeholder, error_message: error_message, helper_text: helper_text) + end - def call - render Input::InputFieldComponent.new(label: @label, name: @name, value: @value, placeholder: @placeholder, error_message: @error_message, helper_text: @helper_text, type: "password") + def call + render Input::InputFieldComponent.new(label: @label, name: @name, value: @value, placeholder: @placeholder, + error_message: @error_message, helper_text: @helper_text, type: 'password') + end end end diff --git a/app/components/input/select_component.rb b/app/components/input/select_component.rb index 5e08a37056..13875c375f 100644 --- a/app/components/input/select_component.rb +++ b/app/components/input/select_component.rb @@ -1,22 +1,25 @@ # frozen_string_literal: true -class Input::SelectComponent < Input::InputFieldComponent - - def initialize(id: nil, label: '', name:, value: [], selected: '', placeholder: '', error_message: '', helper_text: '', multiple: false, open_to_add_values: false, data: {}, tooltip: nil) - super(label: label, name: name, value: value, placeholder: placeholder, error_message: error_message, - helper_text: helper_text, data: data) - @values = value - @selected = selected - @open_to_add_values = open_to_add_values - @multiple = multiple - @id = id - end +module Input + class SelectComponent < Input::InputFieldComponent + def initialize(name:, id: nil, label: '', value: [], selected: '', placeholder: '', error_message: '', + helper_text: '', multiple: false, open_to_add_values: false, data: {}, tooltip: nil) + super(label: label, name: name, value: value, placeholder: placeholder, error_message: error_message, + helper_text: helper_text, data: data) + @values = value + @selected = selected + @open_to_add_values = open_to_add_values + @multiple = multiple + @id = id + end - def call - render Input::InputFieldComponent.new(name: @name, error_message: @error_message, helper_text: @helper_text, label: @label) do - render SelectInputComponent.new(id: @id, name: @name, values: @values, selected: @selected, - placeholder: @placeholder, - multiple: @multiple, open_to_add_values: @open_to_add_values, data: @data) + def call + render Input::InputFieldComponent.new(name: @name, error_message: @error_message, helper_text: @helper_text, + label: @label) do + render SelectInputComponent.new(id: @id, name: @name, values: @values, selected: @selected, + placeholder: @placeholder, + multiple: @multiple, open_to_add_values: @open_to_add_values, data: @data) + end end end end diff --git a/app/components/input/text_area_component.rb b/app/components/input/text_area_component.rb index 940a8b9352..c950b274be 100644 --- a/app/components/input/text_area_component.rb +++ b/app/components/input/text_area_component.rb @@ -1,8 +1,10 @@ # frozen_string_literal: true -class Input::TextAreaComponent < Input::InputFieldComponent - def initialize(label: '', name:, value: nil, placeholder: '', error_message: '', helper_text: '', rows: "5") - super(label: label, name: name, value: value, placeholder: placeholder, error_message: error_message, helper_text: helper_text) - @rows = rows +module Input + class TextAreaComponent < Input::InputFieldComponent + def initialize(name:, label: '', value: nil, placeholder: '', error_message: '', helper_text: '', rows: '5') + super(label: label, name: name, value: value, placeholder: placeholder, error_message: error_message, helper_text: helper_text) + @rows = rows + end end end diff --git a/app/components/input/text_input_component.rb b/app/components/input/text_input_component.rb index aad3006da9..09f72c42e8 100644 --- a/app/components/input/text_input_component.rb +++ b/app/components/input/text_input_component.rb @@ -1,13 +1,16 @@ # frozen_string_literal: true -class Input::TextInputComponent < Input::InputFieldComponent - def initialize(label: '', name:, value: nil, placeholder: '', error_message: '', helper_text: '', disabled: false, id: '', data: {}) - super(label: label, name: name, value: value, placeholder: placeholder, error_message: error_message, helper_text: helper_text, disabled: disabled, id: id) - end +module Input + class TextInputComponent < Input::InputFieldComponent + def initialize(name:, label: '', value: nil, placeholder: '', error_message: '', helper_text: '', disabled: false, + id: '', data: {}) + super(label: label, name: name, value: value, placeholder: placeholder, error_message: error_message, helper_text: helper_text, disabled: disabled, id: id) + end - def call - render Input::InputFieldComponent.new(label: @label, name: @name, value: @value, placeholder: @placeholder, - error_message: @error_message, helper_text: @helper_text, - type: @type, disabled: @disabled) + def call + render Input::InputFieldComponent.new(label: @label, name: @name, value: @value, placeholder: @placeholder, + error_message: @error_message, helper_text: @helper_text, + type: @type, disabled: @disabled) + end end end diff --git a/app/components/input/url_component.rb b/app/components/input/url_component.rb index 01db0eb682..8d342124f3 100644 --- a/app/components/input/url_component.rb +++ b/app/components/input/url_component.rb @@ -1,11 +1,14 @@ # frozen_string_literal: true -class Input::UrlComponent < Input::InputFieldComponent - def initialize(label: '', name:, value: nil, placeholder: '', error_message: '', helper_text: '') - super(label: label, name: name, value: value, placeholder: placeholder, error_message: error_message, helper_text: helper_text) - end +module Input + class UrlComponent < Input::InputFieldComponent + def initialize(name:, label: '', value: nil, placeholder: '', error_message: '', helper_text: '') + super(label: label, name: name, value: value, placeholder: placeholder, error_message: error_message, helper_text: helper_text) + end - def call - render Input::InputFieldComponent.new(label: @label, name: @name, value: @value, placeholder: @placeholder, error_message: @error_message, helper_text: @helper_text, type: "url") + def call + render Input::InputFieldComponent.new(label: @label, name: @name, value: @value, placeholder: @placeholder, + error_message: @error_message, helper_text: @helper_text, type: 'url') + end end end diff --git a/app/components/label_link_component.rb b/app/components/label_link_component.rb index 3d8ecee988..9343e4d745 100644 --- a/app/components/label_link_component.rb +++ b/app/components/label_link_component.rb @@ -1,7 +1,6 @@ # frozen_string_literal: true class LabelLinkComponent < ViewComponent::Base - def initialize(id:, text:, icon: 'popup-link') @id = id @text = text diff --git a/app/components/language_field_component.rb b/app/components/language_field_component.rb index f4080d0980..08834c595d 100644 --- a/app/components/language_field_component.rb +++ b/app/components/language_field_component.rb @@ -1,14 +1,14 @@ # frozen_string_literal: true + require 'iso-639' class LanguageFieldComponent < ViewComponent::Base - include FlagIconsRails::Rails::ViewHelpers def initialize(value:, label: nil) super @value = value - @lang_code = ISO_639.find(value.split('/').last)&.alpha2 || nil + @lang_code = value&.is_a?(String) ? ISO_639.find(value.split('/').last)&.alpha2 : nil @label = label end @@ -16,4 +16,8 @@ def lang_code @lang_code = 'gb' if @lang_code.eql?('en') @lang_code end + + def value + @value&.is_a?(String) ? @value.to_s.split('/').last : 'NO-LANG' + end end diff --git a/app/components/language_field_component/language_field_component.html.haml b/app/components/language_field_component/language_field_component.html.haml index e5ebf47b32..8530fae3d4 100644 --- a/app/components/language_field_component/language_field_component.html.haml +++ b/app/components/language_field_component/language_field_component.html.haml @@ -5,4 +5,4 @@ %div.ml-1 = @label - else - = render ChipButtonComponent.new(text: @value ? @value.split('/').last : 'NO-LANG') \ No newline at end of file + = render ChipButtonComponent.new(text: value) \ No newline at end of file diff --git a/app/components/layout/card_component.rb b/app/components/layout/card_component.rb index ceebc820c0..7e160ffe77 100644 --- a/app/components/layout/card_component.rb +++ b/app/components/layout/card_component.rb @@ -1,13 +1,15 @@ # frozen_string_literal: true -class Layout::CardComponent < ViewComponent::Base - renders_one :header, Display::HeaderComponent +module Layout + class CardComponent < ViewComponent::Base + renders_one :header, Display::HeaderComponent - def call - content_tag(:div, class: 'summary-card') do - out = '' - out = header if header? - raw(out.to_s + content) + def call + content_tag(:div, class: 'summary-card') do + out = '' + out = header if header? + raw(out.to_s + content) + end end end end diff --git a/app/components/layout/horizontal_list_component.rb b/app/components/layout/horizontal_list_component.rb index aed504b7af..ab5340a439 100644 --- a/app/components/layout/horizontal_list_component.rb +++ b/app/components/layout/horizontal_list_component.rb @@ -1,18 +1,19 @@ # frozen_string_literal: true -class Layout::HorizontalListComponent < ViewComponent::Base - renders_many :elements +module Layout + class HorizontalListComponent < ViewComponent::Base + renders_many :elements - def call - return if elements.empty? + def call + return if elements.empty? - content_tag(:div, class: 'd-flex flex-wrap') do - out = '' - elements.each do |element| - out = out + content_tag(:div, element, class: 'mr-1 mb-1 text-truncate overflow-hidden') + content_tag(:div, class: 'd-flex flex-wrap') do + out = '' + elements.each do |element| + out += content_tag(:div, element, class: 'mr-1 mb-1 text-truncate overflow-hidden') + end + raw out end - raw out end end - end diff --git a/app/components/layout/list_component.rb b/app/components/layout/list_component.rb index edf75b865d..37653d297b 100644 --- a/app/components/layout/list_component.rb +++ b/app/components/layout/list_component.rb @@ -1,20 +1,21 @@ # frozen_string_literal: true -class Layout::ListComponent < ViewComponent::Base +module Layout + class ListComponent < ViewComponent::Base + renders_many :rows - renders_many :rows + def call + return if rows.map(&:to_s).reject(&:empty?).empty? - def call - return if rows.map(&:to_s).reject(&:empty?).empty? + content_tag(:div, style: 'padding: 0px 20px 20px 20px;') do + out = '' + rows.each do |row| + next if row.nil? || row.to_s.empty? - content_tag(:div, style: 'padding: 0px 20px 20px 20px;') do - out = "" - rows.each do |row| - next if row.nil? || row.to_s.empty? - out = out + content_tag(:div, row.to_s, class: 'mb-1') + out += content_tag(:div, row.to_s, class: 'mb-1') + end + out.html_safe end - out.html_safe end end - end diff --git a/app/components/layout/progress_pages_component.rb b/app/components/layout/progress_pages_component.rb index 1680e4e494..bafa12be4f 100644 --- a/app/components/layout/progress_pages_component.rb +++ b/app/components/layout/progress_pages_component.rb @@ -1,10 +1,11 @@ # frozen_string_literal: true -class Layout::ProgressPagesComponent < ViewComponent::Base - - renders_many :pages - def initialize(pages_title: []) - super - @pages_title = pages_title +module Layout + class ProgressPagesComponent < ViewComponent::Base + renders_many :pages + def initialize(pages_title: []) + super + @pages_title = pages_title + end end end diff --git a/app/components/layout/reveal_component.rb b/app/components/layout/reveal_component.rb index f6211ffed7..42b444cbc1 100644 --- a/app/components/layout/reveal_component.rb +++ b/app/components/layout/reveal_component.rb @@ -1,20 +1,22 @@ # frozen_string_literal: true -class Layout::RevealComponent < ViewComponent::Base - renders_one :button +module Layout + class RevealComponent < ViewComponent::Base + renders_one :button - def initialize(init_show: false, show_condition: nil,hidden_class: 'd-none') - @hidden_class = hidden_class - @init_show = init_show - @show_condition = show_condition - end + def initialize(init_show: false, show_condition: nil, hidden_class: 'd-none') + @hidden_class = hidden_class + @init_show = init_show + @show_condition = show_condition + end - def container_data - out = { - controller: 'reveal-component', - 'reveal-component-hidden-class': @hidden_class - } - out['reveal-component-condition-value'] = @show_condition if @show_condition - out + def container_data + out = { + controller: 'reveal-component', + 'reveal-component-hidden-class': @hidden_class + } + out['reveal-component-condition-value'] = @show_condition if @show_condition + out + end end end diff --git a/app/components/license_field_component.rb b/app/components/license_field_component.rb index 6baf0f86fa..5b108b5395 100644 --- a/app/components/license_field_component.rb +++ b/app/components/license_field_component.rb @@ -1,10 +1,8 @@ # frozen_string_literal: true class LicenseFieldComponent < ViewComponent::Base - - def initialize(value: ) + def initialize(value:) super @value = value end - end diff --git a/app/components/link_field_component.rb b/app/components/link_field_component.rb index 211851b715..0608a45e48 100644 --- a/app/components/link_field_component.rb +++ b/app/components/link_field_component.rb @@ -1,16 +1,13 @@ # frozen_string_literal: true class LinkFieldComponent < ViewComponent::Base - def initialize(value:, raw: false) super @value = value @raw = raw end - def internal_link? @value.to_s.include?(URI.parse($REST_URL).hostname) || @value.to_s.include?($UI_HOSTNAME) end - end diff --git a/app/components/link_text_component.rb b/app/components/link_text_component.rb index ffd3b8b089..25efbab8ec 100644 --- a/app/components/link_text_component.rb +++ b/app/components/link_text_component.rb @@ -1,7 +1,6 @@ # frozen_string_literal: true class LinkTextComponent < ViewComponent::Base - def initialize(text:, icon: nil) @text = text @icon = icon diff --git a/app/components/nested_agent_search_input_component.rb b/app/components/nested_agent_search_input_component.rb index 98cbbd4893..9d10de62da 100644 --- a/app/components/nested_agent_search_input_component.rb +++ b/app/components/nested_agent_search_input_component.rb @@ -1,10 +1,10 @@ # frozen_string_literal: true class NestedAgentSearchInputComponent < ViewComponent::Base + include AgentHelper + include Turbo::FramesHelper - include Turbo::FramesHelper, AgentHelper - - def initialize(label: nil, agents:, agent_type:, name_prefix:, edit_on_modal: false, parent_id: nil) + def initialize(agents:, agent_type:, name_prefix:, label: nil, edit_on_modal: false, parent_id: nil) super @agents = agents @agent_type = agent_type diff --git a/app/components/nested_form_inputs_component.rb b/app/components/nested_form_inputs_component.rb index f538185805..d064607023 100644 --- a/app/components/nested_form_inputs_component.rb +++ b/app/components/nested_form_inputs_component.rb @@ -1,7 +1,6 @@ # frozen_string_literal: true class NestedFormInputsComponent < ViewComponent::Base - renders_one :template renders_one :header renders_many :rows diff --git a/app/components/notification_component.rb b/app/components/notification_component.rb index 49f82354a3..7c2e9e944f 100644 --- a/app/components/notification_component.rb +++ b/app/components/notification_component.rb @@ -1,7 +1,6 @@ # frozen_string_literal: true class NotificationComponent < ViewComponent::Base - def initialize(title:, comment: '', type: 'success', auto_remove: true) super @title = title @@ -31,9 +30,8 @@ def notification_class end private + def svg_icon(name) inline_svg_tag("icons/#{name}.svg", class: notification_type_class) end - - end diff --git a/app/components/ontology_browse_card_component.rb b/app/components/ontology_browse_card_component.rb index 84251d7f0d..f21536fbcc 100644 --- a/app/components/ontology_browse_card_component.rb +++ b/app/components/ontology_browse_card_component.rb @@ -8,7 +8,5 @@ def initialize(ontology: nil) @ontology = ontology end - def ontology - @ontology - end + attr_reader :ontology end diff --git a/app/components/ontology_search_input_component.rb b/app/components/ontology_search_input_component.rb index 2bbecab9d4..68eeb32edb 100644 --- a/app/components/ontology_search_input_component.rb +++ b/app/components/ontology_search_input_component.rb @@ -1,7 +1,6 @@ # frozen_string_literal: true class OntologySearchInputComponent < ViewComponent::Base - def initialize(name: 'search', placeholder: t('ontologies.ontology_search_prompt'), scroll_down: true) @name = name @placeholder = placeholder diff --git a/app/components/pill_button_component.rb b/app/components/pill_button_component.rb index 5371bee439..4b51ee0ec0 100644 --- a/app/components/pill_button_component.rb +++ b/app/components/pill_button_component.rb @@ -1,7 +1,6 @@ # frozen_string_literal: true class PillButtonComponent < ViewComponent::Base - def initialize(text: nil) super @text = text diff --git a/app/components/popup_link_text_component.rb b/app/components/popup_link_text_component.rb index d6dbc41e4d..d269e926ff 100644 --- a/app/components/popup_link_text_component.rb +++ b/app/components/popup_link_text_component.rb @@ -1,9 +1,7 @@ # frozen_string_literal: true class PopupLinkTextComponent < LinkTextComponent - def initialize(text:) super(text: text, icon: 'icons/popup-link.svg') end - end diff --git a/app/components/rounded_button_component.rb b/app/components/rounded_button_component.rb index b2a0ce49c6..76f5ab08ab 100644 --- a/app/components/rounded_button_component.rb +++ b/app/components/rounded_button_component.rb @@ -1,5 +1,7 @@ +# frozen_string_literal: true + class RoundedButtonComponent < ViewComponent::Base - def initialize(icon: "json.svg", link: "#", size: "small", target: '', title: '') + def initialize(icon: 'json.svg', link: '#', size: 'small', target: '', title: '') @icon = icon @link = link @size = size @@ -9,13 +11,12 @@ def initialize(icon: "json.svg", link: "#", size: "small", target: '', title: '' def size case @size - when "small" - ["32px", "1", "16px"] - when "medium" - ["45px", "1", "23px"] - when "big" - ["100px", "2.5", "50px"] + when 'small' + %w[32px 1 16px] + when 'medium' + %w[45px 1 23px] + when 'big' + ['100px', '2.5', '50px'] end end - -end \ No newline at end of file +end diff --git a/app/components/search_input_component.rb b/app/components/search_input_component.rb index 97b5c8b78d..ee8ff03128 100644 --- a/app/components/search_input_component.rb +++ b/app/components/search_input_component.rb @@ -1,14 +1,10 @@ # frozen_string_literal: true class SearchInputComponent < ViewComponent::Base - renders_one :template - def initialize(name: '', placeholder: '', actions_links: {}, + def initialize(ajax_url:, item_base_url:, id_key:, name: '', placeholder: '', actions_links: {}, scroll_down: true, use_cache: true, - ajax_url:, - item_base_url:, - id_key:, links_target: '_top') super @name = name @@ -21,9 +17,10 @@ def initialize(name: '', placeholder: '', actions_links: {}, @id_key = id_key @links_target = links_target end + def action_link_info(value) if value.is_a?(Hash) - [value[:link] , value[:target]] + [value[:link], value[:target]] else [value, '_top'] end diff --git a/app/components/select_input_component.rb b/app/components/select_input_component.rb index 6aee690253..d359a0baae 100644 --- a/app/components/select_input_component.rb +++ b/app/components/select_input_component.rb @@ -1,8 +1,8 @@ # frozen_string_literal: true class SelectInputComponent < ViewComponent::Base - - def initialize(id:, name:, values:, selected: nil, multiple: false, open_to_add_values: false, data: {}, placeholder: '') + def initialize(id:, name:, values:, selected: nil, multiple: false, open_to_add_values: false, data: {}, + placeholder: '') super @id = id || '' @name = name @@ -15,7 +15,8 @@ def initialize(id:, name:, values:, selected: nil, multiple: false, open_to_add_ end def call - select_input_tag(@id, @name, @values, @selected, multiple: @multiple, open_to_add_values: @open_to_add_values, placeholder: @placeholder) + select_input_tag(@id, @name, @values, @selected, multiple: @multiple, open_to_add_values: @open_to_add_values, + placeholder: @placeholder) end private @@ -38,6 +39,5 @@ def select_input_tag(id, name, values, selected, options = {}) data: data } select_tag(name, options_for_select(values, selected), select_html_options) - end end diff --git a/app/components/square_badge_component.rb b/app/components/square_badge_component.rb index 9d85a8c34f..65ac08a7a1 100644 --- a/app/components/square_badge_component.rb +++ b/app/components/square_badge_component.rb @@ -1,12 +1,12 @@ # frozen_string_literal: true class SquareBadgeComponent < ViewComponent::Base - - def initialize(label: , count: ,link: nil) + def initialize(label:, count:, link: nil) @label = label @count = count @link = link end + def call return if @count.to_i.zero? @@ -15,5 +15,4 @@ def call concat(content_tag(:p, @label, class: 'browse-card-text')) end end - end diff --git a/app/components/submission_metadata_component.rb b/app/components/submission_metadata_component.rb index 69c23f9bdf..f48e1d6008 100644 --- a/app/components/submission_metadata_component.rb +++ b/app/components/submission_metadata_component.rb @@ -1,9 +1,12 @@ # frozen_string_literal: true class SubmissionMetadataComponent < ViewComponent::Base - include ApplicationHelper, MetadataHelper,OntologiesHelper, AgentHelper + include AgentHelper + include OntologiesHelper + include MetadataHelper + include ApplicationHelper - def initialize(submission: , submission_metadata:) + def initialize(submission:, submission_metadata:) super @submission = submission @@ -11,42 +14,39 @@ def initialize(submission: , submission_metadata:) metadata_list = {} # Get extracted metadata and put them in a hash with their label, if one, as value @json_metadata.each do |metadata| - metadata_list[metadata["attribute"]] = metadata["label"] + metadata_list[metadata['attribute']] = metadata['label'] end @metadata_list = metadata_list.sort end def display_attributes(metadata) - if Array(@submission.send(metadata)).empty? - out = 'N/A' - else - out = Array(@submission.send(metadata)).map do |value| - content_tag(:div, class: 'm-1 f32') do - display_attribute(metadata, value) - end - end.join - end + out = if Array(@submission.send(metadata)).empty? + 'N/A' + else + Array(@submission.send(metadata)).map do |value| + content_tag(:div, class: 'm-1 f32') do + display_attribute(metadata, value) + end + end.join + end out.html_safe end + def attribute_help_text(attr) - if !attr["namespace"].nil? - help_text = "#{attr["namespace"]}:#{attr["attribute"]}" - else - help_text = "bioportal:#{attr["attribute"]}" - end + help_text = if !attr['namespace'].nil? + "#{attr['namespace']}:#{attr['attribute']}" + else + "bioportal:#{attr['attribute']}" + end - if (attr["metadataMappings"] != nil) - help_text += " (#{attr["metadataMappings"].join(", ")})" - end + help_text += " (#{attr['metadataMappings'].join(', ')})" unless attr['metadataMappings'].nil? - if (!attr["enforce"].nil? && attr["enforce"].include?("uri")) - help_text += "
This metadata should be an URI" + if !attr['enforce'].nil? && attr['enforce'].include?('uri') + help_text += '
This metadata should be an URI' end - if (attr["helpText"] != nil) - help_text += "

#{attr["helpText"]}" - end + help_text += "

#{attr['helpText']}" unless attr['helpText'].nil? help_text.html_safe end end diff --git a/app/components/submission_status_component.rb b/app/components/submission_status_component.rb index eb33b10bec..1d12012449 100644 --- a/app/components/submission_status_component.rb +++ b/app/components/submission_status_component.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + class SubmissionStatusComponent < ViewComponent::Base include OntologiesHelper @@ -7,23 +9,22 @@ def initialize(submission, latest) end def submission_version - @submission.version.to_s if @submission.version.present? + @submission.version.to_s if @submission.version.present? end def submission_link - if @submission.version.present? - if @submission.ontology.summaryOnly || !@latest - submission_version - else - link_to submission_version, ontology_path(@submission.ontology.acronym) - end + return unless @submission.version.present? + + if @submission.ontology.summaryOnly || !@latest + submission_version + else + link_to submission_version, ontology_path(@submission.ontology.acronym) end end def submission_status return unless @submission.submissionStatus.present? - statuses = submission_status2string(@submission) - end + submission_status2string(@submission) + end end - \ No newline at end of file diff --git a/app/components/summary_section_component.rb b/app/components/summary_section_component.rb index 0ca33932f6..ea26a08cf1 100644 --- a/app/components/summary_section_component.rb +++ b/app/components/summary_section_component.rb @@ -3,7 +3,7 @@ class SummarySectionComponent < ViewComponent::Base renders_many :action_links - def initialize(title: , link: nil, link_title: nil, show_card: true) + def initialize(title:, link: nil, link_title: nil, show_card: true) super @title = title @link = link diff --git a/app/components/switch_input_component.rb b/app/components/switch_input_component.rb index 3b7f677817..83346a2f0a 100644 --- a/app/components/switch_input_component.rb +++ b/app/components/switch_input_component.rb @@ -1,9 +1,7 @@ # frozen_string_literal: true class SwitchInputComponent < ViewComponent::Base - - - def initialize(id:, name: , label: '', value: '', checked: false, boolean_switch: false) + def initialize(id:, name:, label: '', value: '', checked: false, boolean_switch: false) super @id = id @name = name @@ -22,6 +20,6 @@ def check_box_name end def check_box_id - @boolean_switch ? @id +"_checkbox" :@id + @boolean_switch ? "#{@id}_checkbox" : @id end end diff --git a/app/components/tab_item_component.rb b/app/components/tab_item_component.rb index b6612bb5be..4e5f39590f 100644 --- a/app/components/tab_item_component.rb +++ b/app/components/tab_item_component.rb @@ -1,7 +1,6 @@ # frozen_string_literal: true class TabItemComponent < ViewComponent::Base - include ActionView::Helpers::UrlHelper def initialize(id: nil, title: nil, path: nil, page_name: '', selected: false) @@ -25,7 +24,6 @@ def target_id "#{item_id}_content" end - def id @title || @id end @@ -47,5 +45,4 @@ def call end end end - end diff --git a/app/components/table_cell_component.rb b/app/components/table_cell_component.rb index 2e459cb32a..7ea9c43317 100644 --- a/app/components/table_cell_component.rb +++ b/app/components/table_cell_component.rb @@ -1,8 +1,7 @@ # frozen_string_literal: true class TableCellComponent < ViewComponent::Base - - def initialize(width: nil, colspan: nil,type: 'td') + def initialize(width: nil, colspan: nil, type: 'td') super @width = width @type = type diff --git a/app/components/table_component.rb b/app/components/table_component.rb index 9670464db6..af4f1cfdfc 100644 --- a/app/components/table_component.rb +++ b/app/components/table_component.rb @@ -1,11 +1,10 @@ # frozen_string_literal: true class TableComponent < ViewComponent::Base - renders_one :header, TableRowComponent renders_many :rows, TableRowComponent - def initialize(id: '', stripped: true, borderless: false, layout_fixed: false ) + def initialize(id: '', stripped: true, borderless: false, layout_fixed: false) super @id = id @stripped = stripped @@ -26,6 +25,6 @@ def layout_fixed_class end def add_row(*array, &block) - self.row.create(*array, &block) + row.create(*array, &block) end end diff --git a/app/components/table_row_component.rb b/app/components/table_row_component.rb index 68620a05c3..31f640fce8 100644 --- a/app/components/table_row_component.rb +++ b/app/components/table_row_component.rb @@ -1,7 +1,6 @@ # frozen_string_literal: true class TableRowComponent < ViewComponent::Base - renders_many :cells, TableCellComponent def initialize(id: '', class_css: '') @@ -13,16 +12,16 @@ def initialize(id: '', class_css: '') def create(*array, &block) array.each do |key_value| key, value = key_value.to_a.first - self.cell(type: key) { value&.to_s } + cell(type: key) { value&.to_s } end block.call(self) if block_given? end def th(width: nil, colspan: nil, &block) - self.cell(type: 'th', width: width, colspan: colspan, &block) + cell(type: 'th', width: width, colspan: colspan, &block) end def td(width: nil, colspan: nil, &block) - self.cell(type: 'td', width: width, colspan: colspan, &block) + cell(type: 'td', width: width, colspan: colspan, &block) end end diff --git a/app/components/tabs_container_component.rb b/app/components/tabs_container_component.rb index bb9ecaa21c..1b1eb7ed42 100644 --- a/app/components/tabs_container_component.rb +++ b/app/components/tabs_container_component.rb @@ -1,7 +1,6 @@ # frozen_string_literal: true class TabsContainerComponent < ViewComponent::Base - renders_many :items, TabItemComponent renders_many :item_contents renders_one :pinned_right diff --git a/app/components/text_area_field_component.rb b/app/components/text_area_field_component.rb index 5da424e33f..36aa9b7a08 100644 --- a/app/components/text_area_field_component.rb +++ b/app/components/text_area_field_component.rb @@ -1,12 +1,10 @@ # frozen_string_literal: true class TextAreaFieldComponent < ViewComponent::Base - - def initialize(value: , see_more_text:'See more...' , see_less_text: 'See less...') + def initialize(value:, see_more_text: 'See more...', see_less_text: 'See less...') super @value = value @see_more_text = see_more_text @see_less_text = see_less_text end - -end \ No newline at end of file +end diff --git a/app/components/tree_infinite_scroll_component.rb b/app/components/tree_infinite_scroll_component.rb index 4d751bf17b..07666cee9d 100644 --- a/app/components/tree_infinite_scroll_component.rb +++ b/app/components/tree_infinite_scroll_component.rb @@ -1,8 +1,8 @@ # frozen_string_literal: true class TreeInfiniteScrollComponent < ViewComponent::Base - attr_reader :collection + renders_one :error def initialize(id:, collection:, next_url:, current_page:, next_page:, auto_click: false) diff --git a/app/components/turbo_frame_component.rb b/app/components/turbo_frame_component.rb index d25322e154..3190f9aadb 100644 --- a/app/components/turbo_frame_component.rb +++ b/app/components/turbo_frame_component.rb @@ -30,9 +30,7 @@ def turbo_frame_html_options @html_options[:class] += " #{out[:class]}" end - if @src && !@src.empty? - @html_options[:src] = @src - end + @html_options[:src] = @src if @src && !@src.empty? @html_options end diff --git a/app/components/turbo_modal_component.rb b/app/components/turbo_modal_component.rb index 3cb4af7782..cf8624bd9f 100644 --- a/app/components/turbo_modal_component.rb +++ b/app/components/turbo_modal_component.rb @@ -10,5 +10,4 @@ def initialize(id: '', title: '', size: 'modal-lg', show: false) @size = size @show = show end - end diff --git a/app/controllers/about_controller.rb b/app/controllers/about_controller.rb index 4b9b5e8366..36fa1938d7 100644 --- a/app/controllers/about_controller.rb +++ b/app/controllers/about_controller.rb @@ -1,5 +1,6 @@ +# frozen_string_literal: true + class AboutController < ApplicationController layout 'ontology' - def index - end + def index; end end diff --git a/app/controllers/admin/categories_controller.rb b/app/controllers/admin/categories_controller.rb index 8d52212bb1..8784974f38 100644 --- a/app/controllers/admin/categories_controller.rb +++ b/app/controllers/admin/categories_controller.rb @@ -1,111 +1,120 @@ -class Admin::CategoriesController < ApplicationController - include SubmissionUpdater +# frozen_string_literal: true - layout :determine_layout - before_action :unescape_id, only: [:edit, :show, :update, :destroy] - before_action :authorize_admin +module Admin + class CategoriesController < ApplicationController + include SubmissionUpdater - CATEGORIES_URL = "#{LinkedData::Client.settings.rest_url}/categories" - ATTRIBUTE_TO_INCLUDE = 'name,acronym,created,description,parentCategory,ontologies' + layout :determine_layout + before_action :unescape_id, only: %i[edit show update destroy] + before_action :authorize_admin - def index - response = _categories - render :json => response - end - - def new - @category = LinkedData::Client::Models::Category.new + CATEGORIES_URL = "#{LinkedData::Client.settings.rest_url}/categories" + ATTRIBUTE_TO_INCLUDE = 'name,acronym,created,description,parentCategory,ontologies' - respond_to do |format| - format.html { render "new", :layout => false } + def index + response = _categories + render json: response end - end - def edit - @category = LinkedData::Client::Models::Category.find_by_acronym(params[:id], include:'name,acronym,created,description,parentCategory,ontologies' ).first - @ontologies_category = LinkedData::Client::Models::Ontology.all(include: 'acronym').map {|o|[o.acronym, o.id] } - respond_to do |format| - format.html { render "edit", :layout => false } - end - end + def new + @category = LinkedData::Client::Models::Category.new - def create - response = { errors: '', success: '' } - start = Time.now - begin - category = LinkedData::Client::Models::Category.new(values: category_params) - category_saved = category.save - if response_error?(category_saved) - response[:errors] = response_errors(category_saved) - else - response[:success] = "category successfully created in #{Time.now - start}s" + respond_to do |format| + format.html { render 'new', layout: false } end - rescue Exception => e - response[:errors] = "Problem creating the category - #{e.message}" end - render json: response, status: (response[:errors] == '' ? :created : :internal_server_error) - end + def edit + @category = LinkedData::Client::Models::Category.find_by_acronym(params[:id], + include: 'name,acronym,created,description,parentCategory,ontologies').first + @ontologies_category = LinkedData::Client::Models::Ontology.all(include: 'acronym').map { |o| [o.acronym, o.id] } + respond_to do |format| + format.html { render 'edit', layout: false } + end + end - def update - response = { errors: '', success: ''} - start = Time.now - begin - category = LinkedData::Client::Models::Category.find_by_acronym(params[:id], include: ATTRIBUTE_TO_INCLUDE ).first - add_ontologies_to_object(category_params[:ontologies],category) if (category_params[:ontologies].present? && category_params[:ontologies].size > 0 && category_params[:ontologies].first != '') - delete_ontologies_from_object(category_params[:ontologies],category.ontologies,category) - category.update_from_params(category_params) - category_update = category.update - if response_error?(category_update) - response[:errors] = response_errors(category_update) - else - response[:success] = "category successfully updated in #{Time.now - start}s" + def create + response = { errors: '', success: '' } + start = Time.now + begin + category = LinkedData::Client::Models::Category.new(values: category_params) + category_saved = category.save + if response_error?(category_saved) + response[:errors] = response_errors(category_saved) + else + response[:success] = "category successfully created in #{Time.now - start}s" + end + rescue Exception => e + response[:errors] = "Problem creating the category - #{e.message}" end - rescue Exception => e - response[:errors] = "Problem updating the category - #{e.message}" + render json: response, status: (response[:errors] == '' ? :created : :internal_server_error) end - render json: response, status: (response[:errors] == '' ? :ok : :internal_server_error) - end - def destroy - response = { errors: '', success: ''} - start = Time.now - begin - category = LinkedData::Client::Models::Category.find_by_acronym(params[:id]).first - error_response = category.delete - - if response_error?(error_response) - response[:errors] = response_errors(error_response) - else - response[:success] = "category successfully deleted in #{Time.now - start}s" + def update + response = { errors: '', success: '' } + start = Time.now + begin + category = LinkedData::Client::Models::Category.find_by_acronym(params[:id], + include: ATTRIBUTE_TO_INCLUDE).first + if category_params[:ontologies].present? && category_params[:ontologies].size.positive? && category_params[:ontologies].first != '' + add_ontologies_to_object(category_params[:ontologies], + category) + end + delete_ontologies_from_object(category_params[:ontologies], category.ontologies, category) + category.update_from_params(category_params) + category_update = category.update + if response_error?(category_update) + response[:errors] = response_errors(category_update) + else + response[:success] = "category successfully updated in #{Time.now - start}s" + end + rescue Exception => e + response[:errors] = "Problem updating the category - #{e.message}" end - rescue Exception => e - response[:errors] = "Problem deleting the category - #{e.message}" + render json: response, status: (response[:errors] == '' ? :ok : :internal_server_error) end - render json: response, status: (response[:errors] == '' ? :ok : :internal_server_error) - end - private + def destroy + response = { errors: '', success: '' } + start = Time.now + begin + category = LinkedData::Client::Models::Category.find_by_acronym(params[:id]).first + error_response = category.delete + + if response_error?(error_response) + response[:errors] = response_errors(error_response) + else + response[:success] = "category successfully deleted in #{Time.now - start}s" + end + rescue Exception => e + response[:errors] = "Problem deleting the category - #{e.message}" + end + render json: response, status: (response[:errors] == '' ? :ok : :internal_server_error) + end - def unescape_id - params[:id] = CGI.unescape(params[:id]) - end + private - def category_params - params.require(:category).permit(:acronym, :name, :description, :parentCategory, {ontologies:[]}).to_h - end + def unescape_id + params[:id] = CGI.unescape(params[:id]) + end - def _categories - response = { categories: Hash.new, errors: '', success: '' } - start = Time.now - begin - response[:categories] = JSON.parse(LinkedData::Client::HTTP.get(CATEGORIES_URL, { include: ATTRIBUTE_TO_INCLUDE }, raw: true)) + def category_params + params.require(:category).permit(:acronym, :name, :description, :parentCategory, { ontologies: [] }).to_h + end - response[:success] = "categories successfully retrieved in #{Time.now - start}s" - LOG.add :debug, "Categories - retrieved #{response[:categories].length} groups in #{Time.now - start}s" - rescue Exception => e - response[:errors] = "Problem retrieving categories - #{e.message}" + def _categories + response = { categories: {}, errors: '', success: '' } + start = Time.now + begin + response[:categories] = + JSON.parse(LinkedData::Client::HTTP.get(CATEGORIES_URL, { include: ATTRIBUTE_TO_INCLUDE }, raw: true)) + + response[:success] = "categories successfully retrieved in #{Time.now - start}s" + LOG.add :debug, "Categories - retrieved #{response[:categories].length} groups in #{Time.now - start}s" + rescue Exception => e + response[:errors] = "Problem retrieving categories - #{e.message}" + end + response end - response end end diff --git a/app/controllers/admin/groups_controller.rb b/app/controllers/admin/groups_controller.rb index 3df27d2e02..207608b310 100644 --- a/app/controllers/admin/groups_controller.rb +++ b/app/controllers/admin/groups_controller.rb @@ -1,111 +1,117 @@ -class Admin::GroupsController < ApplicationController - include SubmissionUpdater +# frozen_string_literal: true - layout :determine_layout - before_action :unescape_id, only: [:edit, :show, :update, :destroy] - before_action :authorize_admin +module Admin + class GroupsController < ApplicationController + include SubmissionUpdater - GROUPS_URL = "#{LinkedData::Client.settings.rest_url}/groups" + layout :determine_layout + before_action :unescape_id, only: %i[edit show update destroy] + before_action :authorize_admin - def index - response = _groups - render :json => response - end - - def new - @group = LinkedData::Client::Models::Group.new + GROUPS_URL = "#{LinkedData::Client.settings.rest_url}/groups" - respond_to do |format| - format.html { render "new", :layout => false } + def index + response = _groups + render json: response end - end - def edit - @group = LinkedData::Client::Models::Group.find_by_acronym(params[:id]).first - @acronyms = @group.ontologies.map { |url| url.match(/\/([^\/]+)$/)[1] } - @ontologies_group = LinkedData::Client::Models::Ontology.all(include: 'acronym').map {|o|[o.acronym, o.id] } - respond_to do |format| - format.html { render "edit", :layout => false } + def new + @group = LinkedData::Client::Models::Group.new + + respond_to do |format| + format.html { render 'new', layout: false } + end end - end - def create - response = { errors: '', success: '' } - start = Time.now - begin - group = LinkedData::Client::Models::Group.new(values: group_params) - group_saved = group.save - if response_error?(group_saved) - response[:errors] = response_errors(group_saved) - else - response[:success] = "group successfully created in #{Time.now - start}s" + def edit + @group = LinkedData::Client::Models::Group.find_by_acronym(params[:id]).first + @acronyms = @group.ontologies.map { |url| url.match(%r{/([^/]+)$})[1] } + @ontologies_group = LinkedData::Client::Models::Ontology.all(include: 'acronym').map { |o| [o.acronym, o.id] } + respond_to do |format| + format.html { render 'edit', layout: false } end - rescue Exception => e - response[:errors] = "Problem creating the group - #{e.message}" end - render json: response, status: (response[:errors] == '' ? :created : :internal_server_error) - end + def create + response = { errors: '', success: '' } + start = Time.now + begin + group = LinkedData::Client::Models::Group.new(values: group_params) + group_saved = group.save + if response_error?(group_saved) + response[:errors] = response_errors(group_saved) + else + response[:success] = "group successfully created in #{Time.now - start}s" + end + rescue Exception => e + response[:errors] = "Problem creating the group - #{e.message}" + end + render json: response, status: (response[:errors] == '' ? :created : :internal_server_error) + end - def update - response = { errors: '', success: ''} - start = Time.now - begin - group = LinkedData::Client::Models::Group.find_by_acronym(params[:id]).first - add_ontologies_to_object(group_params[:ontologies],group) if (group_params[:ontologies].present? && group_params[:ontologies].size > 0 && group_params[:ontologies].first != '') - delete_ontologies_from_object(group_params[:ontologies],group.ontologies,group) - group.update_from_params(group_params) - group_updated = group.update - if response_error?(group_updated) - response[:errors] = response_errors(group_updated) - else - response[:success] = "group successfully updated in #{Time.now - start}s" + def update + response = { errors: '', success: '' } + start = Time.now + begin + group = LinkedData::Client::Models::Group.find_by_acronym(params[:id]).first + if group_params[:ontologies].present? && group_params[:ontologies].size.positive? && group_params[:ontologies].first != '' + add_ontologies_to_object(group_params[:ontologies], + group) + end + delete_ontologies_from_object(group_params[:ontologies], group.ontologies, group) + group.update_from_params(group_params) + group_updated = group.update + if response_error?(group_updated) + response[:errors] = response_errors(group_updated) + else + response[:success] = "group successfully updated in #{Time.now - start}s" + end + rescue Exception => e + response[:errors] = "Problem updating the group - #{e.message}" end - rescue Exception => e - response[:errors] = "Problem updating the group - #{e.message}" + render json: response, status: (response[:errors] == '' ? :ok : :internal_server_error) end - render json: response, status: (response[:errors] == '' ? :ok : :internal_server_error) - end - def destroy - response = { errors: '', success: ''} - start = Time.now - begin - group = LinkedData::Client::Models::Group.find_by_acronym(params[:id]).first - error_response = group.delete - - if response_error?(error_response) - response[:errors] = response_errors(error_response) - else - response[:success] = "group successfully deleted in #{Time.now - start}s" + def destroy + response = { errors: '', success: '' } + start = Time.now + begin + group = LinkedData::Client::Models::Group.find_by_acronym(params[:id]).first + error_response = group.delete + + if response_error?(error_response) + response[:errors] = response_errors(error_response) + else + response[:success] = "group successfully deleted in #{Time.now - start}s" + end + rescue Exception => e + response[:errors] = "Problem deleting the group - #{e.message}" end - rescue Exception => e - response[:errors] = "Problem deleting the group - #{e.message}" + render json: response, status: (response[:errors] == '' ? :ok : :internal_server_error) end - render json: response, status: (response[:errors] == '' ? :ok : :internal_server_error) - end - private + private - def unescape_id - params[:id] = CGI.unescape(params[:id]) - end + def unescape_id + params[:id] = CGI.unescape(params[:id]) + end - def group_params - params.require(:group).permit(:acronym, :name, :description, {ontologies:[]}).to_h() - end + def group_params + params.require(:group).permit(:acronym, :name, :description, { ontologies: [] }).to_h + end - def _groups - response = { groups: Hash.new, errors: '', success: '' } - start = Time.now - begin - response[:groups] = JSON.parse(LinkedData::Client::HTTP.get(GROUPS_URL, { include: 'all' }, raw: true)) + def _groups + response = { groups: {}, errors: '', success: '' } + start = Time.now + begin + response[:groups] = JSON.parse(LinkedData::Client::HTTP.get(GROUPS_URL, { include: 'all' }, raw: true)) - response[:success] = "groups successfully retrieved in #{Time.now - start}s" - LOG.add :debug, "Groups - retrieved #{response[:groups].length} groups in #{Time.now - start}s" - rescue Exception => e - response[:errors] = "Problem retrieving groups - #{e.message}" + response[:success] = "groups successfully retrieved in #{Time.now - start}s" + LOG.add :debug, "Groups - retrieved #{response[:groups].length} groups in #{Time.now - start}s" + rescue Exception => e + response[:errors] = "Problem retrieving groups - #{e.message}" + end + response end - response end end diff --git a/app/controllers/admin/licenses_controller.rb b/app/controllers/admin/licenses_controller.rb index 75cfbbdfa7..5f2b81a89a 100644 --- a/app/controllers/admin/licenses_controller.rb +++ b/app/controllers/admin/licenses_controller.rb @@ -1,30 +1,32 @@ -class Admin::LicensesController < ApplicationController +# frozen_string_literal: true - def index - @licenses = License.current_license - respond_to :js - end +module Admin + class LicensesController < ApplicationController + def index + @licenses = License.current_license + respond_to :js + end - def new - @license = License.new - end + def new + @license = License.new + end - def create - @license = License.new(license_params) + def create + @license = License.new(license_params) - respond_to do |format| - if @license.save - format.js { flash.now[:notice] = t(".success") } - else - format.js { render :new } + respond_to do |format| + if @license.save + format.js { flash.now[:notice] = t('.success') } + else + format.js { render :new } + end end end - end - private + private - def license_params - params.require(:license).permit(:encrypted_key) + def license_params + params.require(:license).permit(:encrypted_key) + end end - end diff --git a/app/controllers/admin_controller.rb b/app/controllers/admin_controller.rb index 90af90d254..68b4a8f3b0 100644 --- a/app/controllers/admin_controller.rb +++ b/app/controllers/admin_controller.rb @@ -1,175 +1,168 @@ +# frozen_string_literal: true + class AdminController < ApplicationController include TurboHelper layout :determine_layout before_action :cache_setup - DEBUG_BLACKLIST = [:"$,", :$ADDITIONAL_ONTOLOGY_DETAILS, :$rdebug_state, - :$PROGRAM_NAME, :$LOADED_FEATURES, :$KCODE, :$-i, :$rails_rake_task, :$$, :$gems_build_rake_task, - :$daemons_stop_proc, :$VERBOSE, :$DAEMONS_ARGV, :$daemons_sigterm, - :$DEBUG_BEFORE, :$stdout, :$-0, :$-l, :$-I, :$DEBUG, :$', - :$gems_rake_task, :$_, :$CODERAY_DEBUG, :$-F, :$", :$0, :$=, :$FILENAME, :$?, - :$!, :$rdebug_in_irb, :$-K, :$TESTING, :$fileutils_rb_have_lchmod, - :$EMAIL_EXCEPTIONS, :$binding, :$-v, :$>, :$SAFE, :$/, - :$fileutils_rb_have_lchown, :$-p, :$-W, :$:, :$__dbg_interface, - :$stderr, :$\, :$&, :$<, :$debug, :$;, :$~, :$-a, - :$DEBUG_RDOC, :$CGI_ENV, :$LOAD_PATH, :$-d, :$*, :$., :$-w, :$+, - :$@, :$`, :$stdin, :$1, :$2, :$3, :$4, :$5, :$6, :$7, :$8, :$9] + DEBUG_BLACKLIST = [:$,, :$ADDITIONAL_ONTOLOGY_DETAILS, :$rdebug_state, :$PROGRAM_NAME, :$LOADED_FEATURES, :$KCODE, + :$-i, :$rails_rake_task, :$$, :$gems_build_rake_task, :$daemons_stop_proc, :$VERBOSE, :$DAEMONS_ARGV, :$daemons_sigterm, :$DEBUG_BEFORE, :$stdout, :$-0, :$-l, :$-I, :$DEBUG, :$', :$gems_rake_task, :$_, :$CODERAY_DEBUG, :$-F, :$", :$0, :$=, :$FILENAME, :$?, :$!, :$rdebug_in_irb, :$-K, :$TESTING, :$fileutils_rb_have_lchmod, :$EMAIL_EXCEPTIONS, :$binding, :$-v, :$>, :$SAFE, :$/, :$fileutils_rb_have_lchown, :$-p, :$-W, :$:, :$__dbg_interface, :$stderr, :'$ $&', :$<, :$debug, :$;, :$~, :$-a, :$DEBUG_RDOC, :$CGI_ENV, :$LOAD_PATH, :$-d, :$*, :$., :$-w, :$+, :$@, :$`, :$stdin, :$1, :$2, :$3, :$4, :$5, :$6, :$7, :$8, :$9].freeze ADMIN_URL = "#{LinkedData::Client.settings.rest_url}/admin/" ONTOLOGIES_URL = "#{ADMIN_URL}ontologies_report" USERS_URL = "#{LinkedData::Client.settings.rest_url}/users" - ONTOLOGY_URL = lambda { |acronym| "#{ADMIN_URL}ontologies/#{acronym}" } - PARSE_LOG_URL = lambda { |acronym| "#{ONTOLOGY_URL.call(acronym)}/log" } - REPORT_NEVER_GENERATED = "NEVER GENERATED" + ONTOLOGY_URL = ->(acronym) { "#{ADMIN_URL}ontologies/#{acronym}" } + PARSE_LOG_URL = ->(acronym) { "#{ONTOLOGY_URL.call(acronym)}/log" } + REPORT_NEVER_GENERATED = 'NEVER GENERATED' def index @users = LinkedData::Client::Models::User.all if session[:user].nil? || !session[:user].admin? - redirect_to :controller => 'login', :action => 'index', :redirect => '/admin' + redirect_to controller: 'login', action: 'index', redirect: '/admin' else - render action: "index" + render action: 'index' end end def update_info - response = {update_info: Hash.new, errors: '', success: '', notices: ''} + response = { update_info: {}, errors: '', success: '', notices: '' } json = LinkedData::Client::HTTP.get("#{ADMIN_URL}update_info", params, raw: true) begin update_info = JSON.parse(json) - if update_info["error"] - response[:errors] = update_info["error"] + if update_info['error'] + response[:errors] = update_info['error'] else response[:update_info] = update_info - response[:notices] = update_info["notes"] if update_info["notes"] - response[:success] = "Update info successfully retrieved" + response[:notices] = update_info['notes'] if update_info['notes'] + response[:success] = 'Update info successfully retrieved' end rescue Exception => e response[:errors] = "Problem retrieving update info - #{e.message}" end - render :json => response + render json: response end def update_check_enabled enabled = LinkedData::Client::HTTP.get("#{ADMIN_URL}update_check_enabled", {}, raw: false) - render :json => enabled + render json: enabled end def submissions @submissions = nil - @acronym = params["acronym"] - @ontology = LinkedData::Client::Models::Ontology.find_by_acronym(params["acronym"]).first + @acronym = params['acronym'] + @ontology = LinkedData::Client::Models::Ontology.find_by_acronym(params['acronym']).first begin submissions = @ontology.explore.submissions - @submissions = submissions.sort {|a,b| b.submissionId <=> a.submissionId } - rescue + @submissions = submissions.sort { |a, b| b.submissionId <=> a.submissionId } + rescue StandardError @submissions = [] end - render :partial => "layouts/ontology_report_submissions" + render partial: 'layouts/ontology_report_submissions' end def parse_log - @acronym = params["acronym"] - @parse_log = LinkedData::Client::HTTP.get(PARSE_LOG_URL.call(params["acronym"]), {}, raw: false) + @acronym = params['acronym'] + @parse_log = LinkedData::Client::HTTP.get(PARSE_LOG_URL.call(params['acronym']), {}, raw: false) ontologies_report = _ontologies_report - ontology = ontologies_report[:ontologies][params["acronym"].to_sym] + ontology = ontologies_report[:ontologies][params['acronym'].to_sym] @log_file_path = '' if ontology full_log_file_path = ontology[:logFilePath] - @log_file_path = /#{params["acronym"]}\/\d+\/[-a-zA-Z0-9_]+\.log$/.match(full_log_file_path) + @log_file_path = %r{#{params['acronym']}/\d+/[-a-zA-Z0-9_]+\.log$}.match(full_log_file_path) else - @parse_log = "No record exists for ontology #{params["acronym"]}" - @log_file_path = "None" + @parse_log = "No record exists for ontology #{params['acronym']}" + @log_file_path = 'None' end - render action: "parse_log" + render action: 'parse_log' end def clearcache - response = {errors: '', success: ''} + response = { errors: '', success: '' } if @cache.respond_to?(:flush_all) begin @cache.flush_all - response[:success] = "UI cache successfully flushed" + response[:success] = 'UI cache successfully flushed' rescue Exception => e response[:errors] = "Problem flushing the UI cache - #{e.class}: #{e.message}" end else response[:errors] = "The UI cache does not respond to the 'flush_all' command" end - render :json => response + render json: response end def resetcache - response = {errors: '', success: ''} + response = { errors: '', success: '' } if @cache.respond_to?(:reset) begin @cache.reset - response[:success] = "UI cache connection successfully reset" + response[:success] = 'UI cache connection successfully reset' rescue Exception => e response[:errors] = "Problem resetting the UI cache connection - #{e.message}" end else response[:errors] = "The UI cache does not respond to the 'reset' command" end - render :json => response + render json: response end def clear_goo_cache - response = {errors: '', success: ''} + response = { errors: '', success: '' } begin - response_raw = LinkedData::Client::HTTP.post("#{ADMIN_URL}clear_goo_cache", params, raw: true) - response[:success] = "Goo cache successfully flushed" + LinkedData::Client::HTTP.post("#{ADMIN_URL}clear_goo_cache", params, raw: true) + response[:success] = 'Goo cache successfully flushed' rescue Exception => e response[:errors] = "Problem flushing the Goo cache - #{e.class}: #{e.message}" end - render :json => response + render json: response end def clear_http_cache - response = {errors: '', success: ''} + response = { errors: '', success: '' } begin - response_raw = LinkedData::Client::HTTP.post("#{ADMIN_URL}clear_http_cache", params, raw: true) - response[:success] = "HTTP cache successfully flushed" + LinkedData::Client::HTTP.post("#{ADMIN_URL}clear_http_cache", params, raw: true) + response[:success] = 'HTTP cache successfully flushed' rescue Exception => e response[:errors] = "Problem flushing the HTTP cache - #{e.class}: #{e.message}" end - render :json => response + render json: response end def ontologies_report response = _ontologies_report - render :json => response + render json: response end def refresh_ontologies_report - response = {errors: '', success: ''} + response = { errors: '', success: '' } begin response_raw = LinkedData::Client::HTTP.post(ONTOLOGIES_URL, params, raw: true) - response_json = JSON.parse(response_raw, :symbolize_names => true) + response_json = JSON.parse(response_raw, symbolize_names: true) if response_json[:errors] _process_errors(response_json[:errors], response, true) else response = response_json - if params["ontologies"].nil? || params["ontologies"].empty? - response[:success] = "Refresh of ontologies report started successfully"; + if params['ontologies'].nil? || params['ontologies'].empty? + response[:success] = 'Refresh of ontologies report started successfully' else - ontologies = params["ontologies"].split(",").map {|o| o.strip} - response[:success] = "Refresh of report for ontologies: #{ontologies.join(", ")} started successfully"; + ontologies = params['ontologies'].split(',').map(&:strip) + response[:success] = "Refresh of report for ontologies: #{ontologies.join(', ')} started successfully" end end rescue Exception => e response[:errors] = "Problem refreshing report - #{e.class}: #{e.message}" # puts "#{e.class}: #{e.message}\n#{e.backtrace.join("\n\t")}" end - render :json => response + render json: response end def process_ontologies @@ -182,9 +175,9 @@ def delete_ontologies def delete_submission response = { errors: '', success: '' } - submission_id = params["id"] + submission_id = params['id'] begin - ont = params["acronym"] + ont = params['acronym'] ontology = LinkedData::Client::Models::Ontology.find_by_acronym(ont).first if ontology @@ -196,57 +189,56 @@ def delete_submission errors = response_errors(error_response) _process_errors(errors, response, true) else - response[:success] << "Submission #{params["id"]} for ontology #{ont} was deleted successfully" + response[:success] << "Submission #{params['id']} for ontology #{ont} was deleted successfully" end else - response[:errors] << "Submission #{params["id"]} for ontology #{ont} was not found in the system" + response[:errors] << "Submission #{params['id']} for ontology #{ont} was not found in the system" end else response[:errors] << "Ontology #{ont} was not found in the system" end rescue Exception => e - response[:errors] << "Problem deleting submission #{params["id"]} for ontology #{ont} - #{e.class}: #{e.message}" + response[:errors] << "Problem deleting submission #{params['id']} for ontology #{ont} - #{e.class}: #{e.message}" end if params[:turbo_stream] if response[:errors].empty? - render_turbo_stream( alert_success { response[:success] }, remove('submission_' + submission_id.to_s)) + render_turbo_stream(alert_success { response[:success] }, remove("submission_#{submission_id}")) else - render_turbo_stream alert_error { response[:errors] } + render_turbo_stream(alert_error { response[:errors] }) end else - render :json => response + render json: response end - end def users response = _users - render :json => response + render json: response end - private def cache_setup - @cache = Rails.cache.instance_variable_get("@data") + @cache = Rails.cache.instance_variable_get('@data') end def _ontologies_report - response = {ontologies: Hash.new, report_date_generated: REPORT_NEVER_GENERATED, errors: '', success: ''} + response = { ontologies: {}, report_date_generated: REPORT_NEVER_GENERATED, errors: '', success: '' } start = Time.now begin ontologies_data = LinkedData::Client::HTTP.get(ONTOLOGIES_URL, {}, raw: true) - ontologies_data_parsed = JSON.parse(ontologies_data, :symbolize_names => true) + ontologies_data_parsed = JSON.parse(ontologies_data, symbolize_names: true) if ontologies_data_parsed[:errors] _process_errors(ontologies_data_parsed[:errors], response, true) else response.merge!(ontologies_data_parsed) response[:success] = "Report successfully regenerated on #{ontologies_data_parsed[:report_date_generated]}" - LOG.add :debug, "Ontologies Report - retrieved #{response[:ontologies].length} ontologies in #{Time.now - start}s" + LOG.add :debug, + "Ontologies Report - retrieved #{response[:ontologies].length} ontologies in #{Time.now - start}s" end rescue Exception => e response[:errors] = "Problem retrieving ontologies report - #{e.message}" @@ -254,25 +246,24 @@ def _ontologies_report response end - def _process_errors(errors, response, remove_trailing_comma=true) + def _process_errors(errors, response, remove_trailing_comma = true) if errors.is_a?(Hash) errors.each do |_, v| - if v.kind_of?(Array) - response[:errors] << v.join(", ") - response[:errors] << ", " + if v.is_a?(Array) + response[:errors] << v.join(', ') + response[:errors] << ', ' else response[:errors] << "#{v}, " end end - elsif errors.kind_of?(Array) - errors.each {|err| response[:errors] << "#{err}, "} + elsif errors.is_a?(Array) + errors.each { |err| response[:errors] << "#{err}, " } end response[:errors] = response[:errors][0...-2] if remove_trailing_comma end - def _delete_ontology(ontology, params) - error_response = ontology.delete - error_response + def _delete_ontology(ontology, _params) + ontology.delete end def _process_ontology(ontology, params) @@ -280,50 +271,47 @@ def _process_ontology(ontology, params) end def _process_ontologies(success_keyword, error_keyword, process_proc) - response = {errors: '', success: ''} + response = { errors: '', success: '' } - if params["ontologies"].nil? || params["ontologies"].empty? - response[:errors] = "No ontologies parameter passed. Syntax: ?ontologies=ONT1,ONT2,...,ONTN" + if params['ontologies'].nil? || params['ontologies'].empty? + response[:errors] = 'No ontologies parameter passed. Syntax: ?ontologies=ONT1,ONT2,...,ONTN' else - ontologies = params["ontologies"].split(",").map {|o| o.strip} + ontologies = params['ontologies'].split(',').map(&:strip) ontologies.each do |ont| - begin - ontology = LinkedData::Client::Models::Ontology.find_by_acronym(ont).first - - if ontology - error_response = self.send(process_proc, ontology, params) - if response_error?(error_response) - errors = response_errors(error_response) # see application_controller::response_errors - _process_errors(errors, response, false) - else - response[:success] << "Ontology #{ont} #{success_keyword} successfully, " - end + ontology = LinkedData::Client::Models::Ontology.find_by_acronym(ont).first + + if ontology + error_response = send(process_proc, ontology, params) + if response_error?(error_response) + errors = response_errors(error_response) # see application_controller::response_errors + _process_errors(errors, response, false) else - response[:errors] << "Ontology #{ont} was not found in the system, " + response[:success] << "Ontology #{ont} #{success_keyword} successfully, " end - rescue Exception => e - response[:errors] << "Problem #{error_keyword} ontology #{ont} - #{e.class}: #{e.message}, " + else + response[:errors] << "Ontology #{ont} was not found in the system, " end + rescue Exception => e + response[:errors] << "Problem #{error_keyword} ontology #{ont} - #{e.class}: #{e.message}, " end response[:success] = response[:success][0...-2] unless response[:success].empty? response[:errors] = response[:errors][0...-2] unless response[:errors].empty? end - render :json => response + render json: response end def _users - response = {users: Hash.new , errors: '', success: ''} + response = { users: {}, errors: '', success: '' } start = Time.now begin - response[:users] = JSON.parse(LinkedData::Client::HTTP.get(USERS_URL, {include: 'all'}, raw: true)) + response[:users] = JSON.parse(LinkedData::Client::HTTP.get(USERS_URL, { include: 'all' }, raw: true)) response[:success] = "users successfully retrieved in #{Time.now - start}s" - LOG.add :debug, "Users - retrieved #{response[:users].length} users in #{Time.now - start}s" + LOG.add :debug, "Users - retrieved #{response[:users].length} users in #{Time.now - start}s" rescue Exception => e response[:errors] = "Problem retrieving users - #{e.message}" end response end - end diff --git a/app/controllers/agents_controller.rb b/app/controllers/agents_controller.rb index 9029a989fd..f0dd4811e7 100644 --- a/app/controllers/agents_controller.rb +++ b/app/controllers/agents_controller.rb @@ -1,6 +1,9 @@ +# frozen_string_literal: true + class AgentsController < ApplicationController - include TurboHelper, AgentHelper - before_action :authorize_and_redirect, :only => [:edit, :update, :create, :new] + include AgentHelper + include TurboHelper + before_action :authorize_and_redirect, only: %i[edit update create new] def index @agents = LinkedData::Client::Models::Agent.all @@ -56,7 +59,10 @@ def create streams << prepend('agents_table_content', partial: 'agents/show_line', locals: { agent: new_agent }) - streams << replace_agent_form(new_agent, frame_id: params[:id], parent_id: parent_id, name_prefix: name_prefix) if params[:parent_id] + if params[:parent_id] + streams << replace_agent_form(new_agent, frame_id: params[:id], parent_id: parent_id, + name_prefix: name_prefix) + end render_turbo_stream(*streams) end @@ -80,8 +86,7 @@ def update table_line_id = agent_table_line_id(agent_id(agent)) streams = [alert_success(id: alert_id) { success_message }, - replace(table_line_id, partial: 'agents/show_line', locals: { agent: agent }) - ] + replace(table_line_id, partial: 'agents/show_line', locals: { agent: agent })] streams << replace_agent_form(agent, parent_id: parent_id) if params[:parent_id] @@ -120,17 +125,15 @@ def destroy end format.html { render json: { success: success_text, error: error } } end - end private - def replace_agent_form(agent, frame_id: nil, parent_id:, partial: 'agents/agent_show', name_prefix: '') - + def replace_agent_form(agent, parent_id:, frame_id: nil, partial: 'agents/agent_show', name_prefix: '') frame_id = frame_id ? agent_id_frame_id(frame_id, parent_id) : agent_frame_id(agent, parent_id) replace(frame_id, partial: partial, - locals: { agent: agent, name_prefix: name_prefix, parent_id: parent_id, edit_on_modal: false }) + locals: { agent: agent, name_prefix: name_prefix, parent_id: parent_id, edit_on_modal: false }) end def save_agent(params) @@ -142,7 +145,10 @@ def save_agent(params) def update_agent(id = params[:id], params) agent = LinkedData::Client::Models::Agent.find("#{REST_URI}/Agents/#{id}") - params[:creator] = session[:user].id if (agent.creator.nil? || agent.creator.empty?) && (params[:creator] || '').empty? + if (agent.creator.nil? || agent.creator.empty?) && (params[:creator] || '').empty? + params[:creator] = + session[:user].id + end res = agent.update(values: params) [res, agent.update_from_params(params)] @@ -150,9 +156,8 @@ def update_agent(id = params[:id], params) def agent_params p = params.permit(:agentType, :name, :email, :acronym, :homepage, :creator, - { identifiers: [:notation, :schemaAgency, :creator] }, - { affiliations: [:id, :agentType, :name, :homepage, :acronym, :creator, { identifiers: [:notation, :schemaAgency, :creator] }] } - ) + { identifiers: %i[notation schemaAgency creator] }, + { affiliations: [:id, :agentType, :name, :homepage, :acronym, :creator, { identifiers: %i[notation schemaAgency creator] }] }) p = p.to_h p.transform_values do |v| if v.is_a? Hash @@ -166,7 +171,10 @@ def agent_params p[:identifiers] = (p[:identifiers] || {}).values p[:affiliations] = (p[:affiliations] || {}).values p[:affiliations].each do |affiliation| - affiliation[:identifiers] = affiliation[:identifiers].values if affiliation.is_a?(Hash) && affiliation[:identifiers] + if affiliation.is_a?(Hash) && affiliation[:identifiers] + affiliation[:identifiers] = + affiliation[:identifiers].values + end end p end diff --git a/app/controllers/ajax_proxy_controller.rb b/app/controllers/ajax_proxy_controller.rb index d1feda69af..403523a86d 100644 --- a/app/controllers/ajax_proxy_controller.rb +++ b/app/controllers/ajax_proxy_controller.rb @@ -1,17 +1,15 @@ +# frozen_string_literal: true + require 'open-uri' require 'net/http' require 'uri' require 'cgi' class AjaxProxyController < ApplicationController - - def get - page = open(params[:url]) - content = page.read - render :text => content - + content = page.read + render text: content end def jsonp @@ -27,23 +25,24 @@ def jsonp url = URI.parse($LEGACY_REST_URL + params[:path]) url.port = $REST_PORT.to_i - full_path = (url.query.blank?) ? url.path : "#{url.path}?#{url.query}" - full_path = full_path.include?("?") ? full_path + "&apikey=#{params[:apikey]}&userapikey=#{params[:userapikey]}" : full_path + "?apikey=#{params[:apikey]}&userapikey=#{params[:userapikey]}" + full_path = url.query.blank? ? url.path : "#{url.path}?#{url.query}" + full_path = full_path.include?('?') ? full_path + "&apikey=#{params[:apikey]}&userapikey=#{params[:userapikey]}" : full_path + "?apikey=#{params[:apikey]}&userapikey=#{params[:userapikey]}" http = Net::HTTP.new(url.host, url.port) - headers = { "Accept" => "application/json" } + headers = { 'Accept' => 'application/json' } res = http.get(full_path, headers) - response = res.code.to_i >= 400 ? { :status => res.code.to_i, :body => res.body }.to_json : res.body - render_json response, {:status => 200} + response = res.code.to_i >= 400 ? { status: res.code.to_i, body: res.body }.to_json : res.body + render_json response, { status: 200 } end def json_class concept_not_found if params[:conceptid].nil? || params[:conceptid].empty? params[:ontology] ||= params[:ontologyid] - if params[:ontologyid].to_i > 0 - params_cleanup_new_api() - stop_words = ["controller", "action", "ontologyid"] - redirect_to "#{request.path}#{params_string_for_redirect(params, stop_words: stop_words)}", :status => :moved_permanently + if params[:ontologyid].to_i.positive? + params_cleanup_new_api + stop_words = %w[controller action ontologyid] + redirect_to "#{request.path}#{params_string_for_redirect(params, stop_words: stop_words)}", + status: :moved_permanently return end @@ -56,7 +55,6 @@ def json_class render_json @concept.to_json end - def json_ontology @ontology = LinkedData::Client::Models::Ontology.find_by_acronym(params[:ontology]).first ontology_not_found(params[:ontology]) if @ontology.nil? @@ -65,25 +63,24 @@ def json_ontology end def loading_spinner - render :partial => "loading_spinner" + render partial: 'loading_spinner' end private - def render_json(json, options={}) - callback, variable = params[:callback], params[:variable] - response = begin - if callback && variable - "var #{variable} = #{json};\n#{callback}(#{variable});" - elsif variable - "var #{variable} = #{json};" - elsif callback - "#{callback}(#{json});" - else - json - end - end - render({plain: response, content_type: "application/json"}.merge(options)) + def render_json(json, options = {}) + callback = params[:callback] + variable = params[:variable] + response = if callback && variable + "var #{variable} = #{json};\n#{callback}(#{variable});" + elsif variable + "var #{variable} = #{json};" + elsif callback + "#{callback}(#{json});" + else + json + end + + render({ plain: response, content_type: 'application/json' }.merge(options)) end - end diff --git a/app/controllers/analytics_controller.rb b/app/controllers/analytics_controller.rb index ccb9af6ca8..f2faf3616d 100644 --- a/app/controllers/analytics_controller.rb +++ b/app/controllers/analytics_controller.rb @@ -1,7 +1,8 @@ +# frozen_string_literal: true + require 'csv' class AnalyticsController < ApplicationController - def track entry = Analytics.new entry.segment = params[:segment] @@ -15,52 +16,53 @@ def track end def search_result_clicked - clicks = Analytics.where(:segment => "search", :action => "result_clicked").all - rows = [["query", "position_clicked", "ontology_clicked", "higher_rated_ontologies", "additional_result", "exact_match", "concept_id", "time", "user", "bp_slice", "ip_address"]] + clicks = Analytics.where(segment: 'search', action: 'result_clicked').all + rows = [%w[query position_clicked ontology_clicked higher_rated_ontologies additional_result + exact_match concept_id time user bp_slice ip_address]] clicks.each do |click| next if click.params.empty? + rows << [ - click.params["query"].delete("\t"), - click.params["position"], - click.params["ontology_clicked"], - click.params["higher_ontologies"].nil? ? "" : click.params["higher_ontologies"].join(";"), - click.params["additional_result"], - click.params["exact_match"], - click.params["concept_id"], + click.params['query'].delete("\t"), + click.params['position'], + click.params['ontology_clicked'], + click.params['higher_ontologies'].nil? ? '' : click.params['higher_ontologies'].join(';'), + click.params['additional_result'], + click.params['exact_match'], + click.params['concept_id'], click.created_at, click.user, click.bp_slice, click.ip ] end - respond_with_csv_file(rows, "search_result_clicked") + respond_with_csv_file(rows, 'search_result_clicked') end def user_intention_surveys - surveys = Analytics.where(:segment => "users", :action => "intention_survey").all - rows = [["page", "response", "email", "time", "user", "bp_slice", "ip_address"]] + surveys = Analytics.where(segment: 'users', action: 'intention_survey').all + rows = [%w[page response email time user bp_slice ip_address]] surveys.each do |survey| rows << [ - survey.params["page"], - survey.params["intention_response"], - survey.params["contest_email"], + survey.params['page'], + survey.params['intention_response'], + survey.params['contest_email'], survey.created_at, survey.user, survey.bp_slice, survey.ip ] end - respond_with_csv_file(rows, "user_intention_survey") + respond_with_csv_file(rows, 'user_intention_survey') end private - def respond_with_csv_file(rows, filename = "output") + def respond_with_csv_file(rows, filename = 'output') output = '' rows.each do |row| output << row.to_csv.force_encoding('UTF-8') end - send_data output, :type => 'text/csv', :disposition => "attachment; filename=#{filename}.csv" + send_data output, type: 'text/csv', disposition: "attachment; filename=#{filename}.csv" end - end diff --git a/app/controllers/annotator_controller.rb b/app/controllers/annotator_controller.rb index ae05a3a317..d6de7aef0c 100644 --- a/app/controllers/annotator_controller.rb +++ b/app/controllers/annotator_controller.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'json' require 'cgi' @@ -5,7 +7,7 @@ class AnnotatorController < ApplicationController layout :determine_layout # REST_URI is defined in application_controller.rb - #ANNOTATOR_URI = REST_URI + "/annotator" + # ANNOTATOR_URI = REST_URI + "/annotator" ANNOTATOR_URI = $ANNOTATOR_URL def index @@ -13,97 +15,102 @@ def index @semantic_groups_for_select = [] @semantic_types ||= get_semantic_types @sem_type_ont = LinkedData::Client::Models::Ontology.find_by_acronym('STY').first - @semantic_groups ||= {"ACTI" => "Activities & Behaviors", "ANAT" => "Anatomy", "CHEM" => "Chemicals & Drugs","CONC" => "Concepts & Ideas","DEVI" => "Devices", "DISO" => "Disorders", "GENE" => "Genes & Molecular Sequences", "GEOG" => "Geographic Areas", "LIVB" => "Living Beings","OBJC" => "Objects", "OCCU" => "Occupations", "ORGA" => "Organizations", "PHEN" => "Phenomena", "PHYS" => "Physiology","PROC" => "Procedures"} + @semantic_groups ||= { 'ACTI' => 'Activities & Behaviors', 'ANAT' => 'Anatomy', 'CHEM' => 'Chemicals & Drugs', + 'CONC' => 'Concepts & Ideas', 'DEVI' => 'Devices', 'DISO' => 'Disorders', 'GENE' => 'Genes & Molecular Sequences', 'GEOG' => 'Geographic Areas', 'LIVB' => 'Living Beings', 'OBJC' => 'Objects', 'OCCU' => 'Occupations', 'ORGA' => 'Organizations', 'PHEN' => 'Phenomena', 'PHYS' => 'Physiology', 'PROC' => 'Procedures' } @semantic_types.each_pair do |code, label| @semantic_types_for_select << ["#{label} (#{code})", code] end @semantic_groups.each_pair do |group, label| - @semantic_groups_for_select << ["#{label} (#{group})", group] - end - @semantic_types_for_select.sort! {|a,b| a[0] <=> b[0]} - @semantic_groups_for_select.sort! {|a,b| a[0] <=> b[0]} - if !$MULTIPLE_RECOGNIZERS.nil? && $MULTIPLE_RECOGNIZERS == true - # Get recognizers from ontologies_api only if asked - @recognizers = parse_json(REST_URI + "/annotator/recognizers") - else - @recognizers = [] + @semantic_groups_for_select << ["#{label} (#{group})", group] end + @semantic_types_for_select.sort! { |a, b| a[0] <=> b[0] } + @semantic_groups_for_select.sort! { |a, b| a[0] <=> b[0] } + @recognizers = if !$MULTIPLE_RECOGNIZERS.nil? && $MULTIPLE_RECOGNIZERS == true + # Get recognizers from ontologies_api only if asked + parse_json("#{REST_URI}/annotator/recognizers") + else + [] + end @annotator_ontologies = LinkedData::Client::Models::Ontology.all @text = params[:text] end - def create params[:mappings] ||= [] params[:max_level] ||= 0 params[:ontologies] ||= [] params[:semantic_types] ||= [] params[:semantic_groups] ||= [] - text_to_annotate = params[:text].strip.gsub("\r\n", " ").gsub("\n", " ") - - options = { :ontologies => params[:ontologies], - :class_hierarchy_max_level => params[:class_hierarchy_max_level].to_i, - :expand_class_hierarchy => params[:class_hierarchy_max_level].to_i > 0, - :semantic_types => params[:semantic_types], - :semantic_groups => params[:semantic_groups], - :expand_mappings => params[:expand_mappings], - :longest_only => params[:longest_only], - :exclude_numbers => params[:exclude_numbers] ||= "false", # service default is false - :whole_word_only => params[:whole_word_only] ||= "true", # service default is true - :exclude_synonyms => params[:exclude_synonyms] ||= "false", # service default is false - :fast_context => params[:fast_context] ||= "false", # service default is false - :score => params[:score], - :score_threshold => params[:score_threshold] ||=-1, - :confidence_threshold => params[:confidence_threshold] ||=-1, - :lemmatize => params[:lemmatize] ||= "false", - :ncbo_slice => params[:ncbo_slice] || '' - } + text_to_annotate = params[:text].strip.gsub("\r\n", ' ').gsub("\n", ' ') + + options = { ontologies: params[:ontologies], + class_hierarchy_max_level: params[:class_hierarchy_max_level].to_i, + expand_class_hierarchy: params[:class_hierarchy_max_level].to_i.positive?, + semantic_types: params[:semantic_types], + semantic_groups: params[:semantic_groups], + expand_mappings: params[:expand_mappings], + longest_only: params[:longest_only], + exclude_numbers: params[:exclude_numbers] ||= 'false', # service default is false + whole_word_only: params[:whole_word_only] ||= 'true', # service default is true + exclude_synonyms: params[:exclude_synonyms] ||= 'false', # service default is false + fast_context: params[:fast_context] ||= 'false', # service default is false + score: params[:score], + score_threshold: params[:score_threshold] ||= -1, + confidence_threshold: params[:confidence_threshold] ||= -1, + lemmatize: params[:lemmatize] ||= 'false', + ncbo_slice: params[:ncbo_slice] || '' } start = Time.now query = ANNOTATOR_URI - query += "?text=" + CGI.escape(text_to_annotate) - #query += "&apikey=" + annotator_apikey - #query += "&include=prefLabel" + query += "?text=#{CGI.escape(text_to_annotate)}" + # query += "&apikey=" + annotator_apikey + # query += "&include=prefLabel" # Include= prefLabel causes an internal error when retrieving mappings - query += "&expand_class_hierarchy=true" if options[:class_hierarchy_max_level] > 0 - query += "&class_hierarchy_max_level=" + options[:class_hierarchy_max_level].to_s if options[:class_hierarchy_max_level] > 0 - query += "&score=" + options[:score] unless options[:score] == "" - query += "&score_threshold=" + options[:score_threshold] unless options[:score] == "" or options[:score_threshold]==-1 - query += "&confidence_threshold=" + options[:confidence_threshold] unless options[:score] == "" or options[:confidence_threshold]==-1 - query += "&fast_context=" + options[:fast_context] unless options[:fast_context].empty? - query += "&ontologies=" + CGI.escape(options[:ontologies].join(',')) unless options[:ontologies].empty? - query += "&semantic_types=" + options[:semantic_types].join(',') unless options[:semantic_types].empty? - query += "&semantic_groups=" + options[:semantic_groups].join(',') unless options[:semantic_groups].empty? - query += "&expand_mappings=" + options[:expand_mappings].to_s unless options[:expand_mappings].empty? + query += '&expand_class_hierarchy=true' if (options[:class_hierarchy_max_level]).positive? + if (options[:class_hierarchy_max_level]).positive? + query += "&class_hierarchy_max_level=#{options[:class_hierarchy_max_level]}" + end + query += "&score=#{options[:score]}" unless options[:score] == '' + unless (options[:score] == '') || (options[:score_threshold] == -1) + query += "&score_threshold=#{options[:score_threshold]}" + end + unless (options[:score] == '') || (options[:confidence_threshold] == -1) + query += "&confidence_threshold=#{options[:confidence_threshold]}" + end + query += "&fast_context=#{options[:fast_context]}" unless options[:fast_context].empty? + query += "&ontologies=#{CGI.escape(options[:ontologies].join(','))}" unless options[:ontologies].empty? + query += "&semantic_types=#{options[:semantic_types].join(',')}" unless options[:semantic_types].empty? + query += "&semantic_groups=#{options[:semantic_groups].join(',')}" unless options[:semantic_groups].empty? + query += "&expand_mappings=#{options[:expand_mappings]}" unless options[:expand_mappings].empty? query += "&longest_only=#{options[:longest_only]}" query += "&recognizer=#{params[:recognizer]}" - query += "&exclude_numbers=" + options[:exclude_numbers].to_s unless options[:exclude_numbers].empty? - query += "&lemmatize=" + options[:lemmatize].to_s unless options[:lemmatize].empty? - query += "&whole_word_only=" + options[:whole_word_only].to_s unless options[:whole_word_only].empty? - query += "&exclude_synonyms=" + options[:exclude_synonyms].to_s unless options[:exclude_synonyms].empty? - query += "&ncbo_slice=" + options[:ncbo_slice].to_s unless options[:ncbo_slice].empty? - + query += "&exclude_numbers=#{options[:exclude_numbers]}" unless options[:exclude_numbers].empty? + query += "&lemmatize=#{options[:lemmatize]}" unless options[:lemmatize].empty? + query += "&whole_word_only=#{options[:whole_word_only]}" unless options[:whole_word_only].empty? + query += "&exclude_synonyms=#{options[:exclude_synonyms]}" unless options[:exclude_synonyms].empty? + query += "&ncbo_slice=#{options[:ncbo_slice]}" unless options[:ncbo_slice].empty? + annotations = parse_json(query) # See application_controller.rb - #annotations = LinkedData::Client::HTTP.get(query) + # annotations = LinkedData::Client::HTTP.get(query) LOG.add :debug, "Query: #{query}" LOG.add :debug, "Retrieved #{annotations.length} annotations: #{Time.now - start}s" - if annotations.empty? || params[:raw] == "true" + if annotations.empty? || params[:raw] == 'true' # TODO: if params contains select ontologies and/or semantic types, only return those selected. response = { - annotations: annotations, - ontologies: get_simplified_ontologies_hash, # application_controller - semantic_types: get_semantic_types # application_controller + annotations: annotations, + ontologies: get_simplified_ontologies_hash, # application_controller + semantic_types: get_semantic_types # application_controller } else massage_annotated_classes(annotations, options) response = { - annotations: annotations, - ontologies: {}, # ontology data are in annotations already. - semantic_types: {} # semantic types are in annotations already. + annotations: annotations, + ontologies: {}, # ontology data are in annotations already. + semantic_types: {} # semantic types are in annotations already. } end - render :json => response + render json: response end private @@ -112,16 +119,16 @@ def get_semantic_types semantic_types = {} sty_ont = LinkedData::Client::Models::Ontology.find_by_acronym('STY').first return semantic_types if sty_ont.nil? + # The first 500 items should be more than sufficient to get all semantic types. - sty_classes = sty_ont.explore.classes({'pagesize'=>500, include: 'prefLabel'}) + sty_classes = sty_ont.explore.classes({ 'pagesize' => 500, include: 'prefLabel' }) sty_classes.collection.each do |cls| - code = cls.id.split("/").last - semantic_types[ code ] = cls.prefLabel + code = cls.id.split('/').last + semantic_types[code] = cls.prefLabel end semantic_types end - def massage_annotated_classes(annotations, options) # Get the class details required for display, assume this is necessary # for every element of the annotations array because the API returns a set. @@ -131,13 +138,13 @@ def massage_annotated_classes(annotations, options) class_details = get_annotated_classes(annotations, semantic_types) simplify_annotated_classes(annotations, class_details) # repeat the simplification for any annotation hierarchy or mappings. - hierarchy = annotations.map {|a| a if a.keys.include? 'hierarchy' }.compact + hierarchy = annotations.map { |a| a if a.keys.include? 'hierarchy' }.compact hierarchy.each do |a| - simplify_annotated_classes(a['hierarchy'], class_details) if not a['hierarchy'].empty? + simplify_annotated_classes(a['hierarchy'], class_details) unless a['hierarchy'].empty? end - mappings = annotations.map {|a| a if a.keys.include? 'mappings' }.compact + mappings = annotations.map { |a| a if a.keys.include? 'mappings' }.compact mappings.each do |a| - simplify_annotated_classes(a['mappings'], class_details) if not a['mappings'].empty? + simplify_annotated_classes(a['mappings'], class_details) unless a['mappings'].empty? end LOG.add :debug, "Completed massage for annotated classes: #{Time.now - start}s" end @@ -160,57 +167,57 @@ def simplify_annotated_classes(annotations, class_details) end def get_annotated_class_hash(a) - return { - :class => a['annotatedClass']['@id'], - :ontology => a['annotatedClass']['links']['ontology'] + { + class: a['annotatedClass']['@id'], + ontology: a['annotatedClass']['links']['ontology'] } end - def get_annotated_classes(annotations, semantic_types=[]) + def get_annotated_classes(annotations, semantic_types = []) # Use batch service to get class prefLabels class_list = [] - annotations.each {|a| class_list << get_annotated_class_hash(a) } - hierarchy = annotations.map {|a| a if a.keys.include? 'hierarchy' }.compact + annotations.each { |a| class_list << get_annotated_class_hash(a) } + hierarchy = annotations.map { |a| a if a.keys.include? 'hierarchy' }.compact hierarchy.each do |a| - a['hierarchy'].each {|h| class_list << get_annotated_class_hash(h) } + a['hierarchy'].each { |h| class_list << get_annotated_class_hash(h) } end - mappings = annotations.map {|a| a if a.keys.include? 'mappings' }.compact + mappings = annotations.map { |a| a if a.keys.include? 'mappings' }.compact mappings.each do |a| - a['mappings'].each {|m| class_list << get_annotated_class_hash(m) } + a['mappings'].each { |m| class_list << get_annotated_class_hash(m) } end classes_simple = {} return classes_simple if class_list.empty? + # remove duplicates class_set = class_list.to_set # get unique class:ontology set class_list = class_set.to_a # collection requires a list in batch call # make the batch call properties = 'prefLabel' - properties = 'prefLabel,semanticType' if not semantic_types.empty? - call_params = {'http://www.w3.org/2002/07/owl#Class'=>{'collection'=>class_list, 'include'=>properties}} + properties = 'prefLabel,semanticType' unless semantic_types.empty? + call_params = { 'http://www.w3.org/2002/07/owl#Class' => { 'collection' => class_list, 'include' => properties } } classes_json = get_batch_results(call_params) # Simplify the response data for the UI @ontologies_hash ||= get_simplified_ontologies_hash # application_controller classes_data = JSON.parse(classes_json) - classes_data["http://www.w3.org/2002/07/owl#Class"].each do |cls| + classes_data['http://www.w3.org/2002/07/owl#Class'].each do |cls| c = simplify_class_model(cls) - ont_details = @ontologies_hash[ c[:ontology] ] + ont_details = @ontologies_hash[c[:ontology]] next if ont_details.nil? # NO DISPLAY FOR ANNOTATIONS ON ANY CLASS OUTSIDE THE BIOPORTAL ONTOLOGY SET. + c[:ontology] = ont_details - unless semantic_types.empty? || cls['semanticType'].nil? - @semantic_types ||= get_semantic_types # application_controller + if semantic_types.empty? || cls['semanticType'].nil? + c[:semantic_types] = [] + else + @semantic_types ||= get_semantic_types # application_controller # Extract the semantic type descriptions that are requested. semanticTypeURI = 'http://bioportal.bioontology.org/ontologies/umls/sty/' - semanticCodes = cls['semanticType'].map {|t| t.sub( semanticTypeURI, '') } - requestedCodes = semanticCodes.map {|code| (semantic_types.include? code and code) || nil }.compact - requestedDescriptions = requestedCodes.map {|code| @semantic_types[code] }.compact + semanticCodes = cls['semanticType'].map { |t| t.sub(semanticTypeURI, '') } + requestedCodes = semanticCodes.map { |code| (semantic_types.include? code and code) || nil }.compact + requestedDescriptions = requestedCodes.map { |code| @semantic_types[code] }.compact c[:semantic_types] = requestedDescriptions - else - c[:semantic_types] = [] end classes_simple[c[:id]] = c end - return classes_simple + classes_simple end - end - diff --git a/app/controllers/annotatorplus_controller.rb b/app/controllers/annotatorplus_controller.rb index abf8f02fd4..9a1184aca9 100644 --- a/app/controllers/annotatorplus_controller.rb +++ b/app/controllers/annotatorplus_controller.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'json' require 'cgi' @@ -5,101 +7,105 @@ class AnnotatorplusController < ApplicationController layout :determine_layout # REST_URI is defined in application_controller.rb - ANNOTATOR_URI = PROXY_URI + "/annotatorplus/" + ANNOTATOR_URI = "#{PROXY_URI}/annotatorplus/" def index @semantic_types_for_select = [] @semantic_types ||= get_semantic_types @sem_type_ont = LinkedData::Client::Models::Ontology.find_by_acronym('STY').first - @semantic_groups ||= {"ACTI" => "Activities & Behaviors", "ANAT" => "Anatomy", "CHEM" => "Chemicals & Drugs","CONC" => "Concepts & Ideas", - "DEVI" => "Devices", "DISO" => "Disorders", "GENE" => "Genes & Molecular Sequences", "GEOG" => "Geographic Areas", "LIVB" => "Living Beings", - "OBJC" => "Objects", "OCCU" => "Occupations", "ORGA" => "Organizations", "PHEN" => "Phenomena", "PHYS" => "Physiology","PROC" => "Procedures"} + @semantic_groups ||= { 'ACTI' => 'Activities & Behaviors', 'ANAT' => 'Anatomy', 'CHEM' => 'Chemicals & Drugs', 'CONC' => 'Concepts & Ideas', + 'DEVI' => 'Devices', 'DISO' => 'Disorders', 'GENE' => 'Genes & Molecular Sequences', 'GEOG' => 'Geographic Areas', 'LIVB' => 'Living Beings', + 'OBJC' => 'Objects', 'OCCU' => 'Occupations', 'ORGA' => 'Organizations', 'PHEN' => 'Phenomena', 'PHYS' => 'Physiology', 'PROC' => 'Procedures' } @semantic_groups_for_select = [] @semantic_types.each_pair do |code, label| @semantic_types_for_select << ["#{label} (#{code})", code] end - @semantic_groups.each_pair do |group, label| + @semantic_groups.each_pair do |group, label| @semantic_groups_for_select << ["#{label} (#{group})", group] end - @semantic_types_for_select.sort! {|a,b| a[0] <=> b[0]} - @semantic_groups_for_select.sort! {|a,b| a[0] <=> b[0]} - @recognizers = parse_json(REST_URI + "/annotator/recognizers") + @semantic_types_for_select.sort! { |a, b| a[0] <=> b[0] } + @semantic_groups_for_select.sort! { |a, b| a[0] <=> b[0] } + @recognizers = parse_json("#{REST_URI}/annotator/recognizers") @annotator_ontologies = LinkedData::Client::Models::Ontology.all @annotator_ontologies.sort_by! { |ont| ont.name.strip.downcase } end - def create params[:mappings] ||= [] params[:max_level] ||= 0 params[:ontologies] ||= [] params[:semantic_types] ||= [] params[:semantic_groups] ||= [] - text_to_annotate = params[:text].strip.gsub("\r\n", " ").gsub("\n", " ") - - options = { :ontologies => params[:ontologies], - :class_hierarchy_max_level => params[:class_hierarchy_max_level].to_i, - :expand_class_hierarchy => params[:class_hierarchy_max_level].to_i > 0, - :semantic_types => params[:semantic_types], - :semantic_groups => params[:semantic_groups], - :mappings => params[:mappings], - :longest_only => params[:longest_only], - :exclude_numbers => params[:exclude_numbers] ||= "false", # service default is false - :whole_word_only => (params[:whole_word_only] == "true") ? "false" : "true", # service default is true - :exclude_synonyms => params[:exclude_synonyms] ||= "false", # service default is false - :negation => params[:negation] ||= "false", # service default is false - :experiencer => params[:experiencer] ||= "false", # service default is false - :temporality => params[:temporality] ||= "false", # service default is false - :score => params[:score], - :score_threshold => params[:score_threshold] ||=-1, - :confidence_threshold => params[:confidence_threshold] ||=-1, - :ncbo_slice => params[:ncbo_slice] || '' - } + text_to_annotate = params[:text].strip.gsub("\r\n", ' ').gsub("\n", ' ') + + options = { ontologies: params[:ontologies], + class_hierarchy_max_level: params[:class_hierarchy_max_level].to_i, + expand_class_hierarchy: params[:class_hierarchy_max_level].to_i.positive?, + semantic_types: params[:semantic_types], + semantic_groups: params[:semantic_groups], + mappings: params[:mappings], + longest_only: params[:longest_only], + exclude_numbers: params[:exclude_numbers] ||= 'false', # service default is false + whole_word_only: params[:whole_word_only] == 'true' ? 'false' : 'true', # service default is true + exclude_synonyms: params[:exclude_synonyms] ||= 'false', # service default is false + negation: params[:negation] ||= 'false', # service default is false + experiencer: params[:experiencer] ||= 'false', # service default is false + temporality: params[:temporality] ||= 'false', # service default is false + score: params[:score], + score_threshold: params[:score_threshold] ||= -1, + confidence_threshold: params[:confidence_threshold] ||= -1, + ncbo_slice: params[:ncbo_slice] || '' } start = Time.now query = ANNOTATOR_URI - query += "?text=" + CGI.escape(text_to_annotate) - query += "&include=prefLabel" - query += "&expand_class_hierarchy=true" if options[:class_hierarchy_max_level] > 0 - query += "&class_hierarchy_max_level=" + options[:class_hierarchy_max_level].to_s if options[:class_hierarchy_max_level] > 0 - query += "&score=" + options[:score] unless options[:score] == "" - query += "&score_threshold=" + options[:score_threshold] unless options[:score] == "" or options[:score_threshold]==-1 - query += "&confidence_threshold=" + options[:confidence_threshold] unless options[:score] == "" or options[:confidence_threshold]==-1 - query += "&negation=" + options[:negation] unless options[:negation].empty? - query += "&experiencer=" + options[:experiencer] unless options[:experiencer].empty? - query += "&temporality=" + options[:temporality] unless options[:temporality].empty? - query += "&ontologies=" + CGI.escape(options[:ontologies].join(',')) unless options[:ontologies].empty? - query += "&semantic_types=" + options[:semantic_types].join(',') unless options[:semantic_types].empty? - query += "&semantic_groups=" + options[:semantic_groups].join(',') unless options[:semantic_groups].empty? - query += "&mappings=" + options[:mappings].join(',') unless options[:mappings].empty? + query += "?text=#{CGI.escape(text_to_annotate)}" + query += '&include=prefLabel' + query += '&expand_class_hierarchy=true' if (options[:class_hierarchy_max_level]).positive? + if (options[:class_hierarchy_max_level]).positive? + query += "&class_hierarchy_max_level=#{options[:class_hierarchy_max_level]}" + end + query += "&score=#{options[:score]}" unless options[:score] == '' + unless (options[:score] == '') || (options[:score_threshold] == -1) + query += "&score_threshold=#{options[:score_threshold]}" + end + unless (options[:score] == '') || (options[:confidence_threshold] == -1) + query += "&confidence_threshold=#{options[:confidence_threshold]}" + end + query += "&negation=#{options[:negation]}" unless options[:negation].empty? + query += "&experiencer=#{options[:experiencer]}" unless options[:experiencer].empty? + query += "&temporality=#{options[:temporality]}" unless options[:temporality].empty? + query += "&ontologies=#{CGI.escape(options[:ontologies].join(','))}" unless options[:ontologies].empty? + query += "&semantic_types=#{options[:semantic_types].join(',')}" unless options[:semantic_types].empty? + query += "&semantic_groups=#{options[:semantic_groups].join(',')}" unless options[:semantic_groups].empty? + query += "&mappings=#{options[:mappings].join(',')}" unless options[:mappings].empty? query += "&longest_only=#{options[:longest_only]}" query += "&recognizer=#{params[:recognizer]}" - query += "&exclude_numbers=" + options[:exclude_numbers].to_s unless options[:exclude_numbers].empty? - query += "&whole_word_only=" + options[:whole_word_only].to_s unless options[:whole_word_only].empty? - query += "&exclude_synonyms=" + options[:exclude_synonyms].to_s unless options[:exclude_synonyms].empty? - query += "&ncbo_slice=" + options[:ncbo_slice].to_s unless options[:ncbo_slice].empty? + query += "&exclude_numbers=#{options[:exclude_numbers]}" unless options[:exclude_numbers].empty? + query += "&whole_word_only=#{options[:whole_word_only]}" unless options[:whole_word_only].empty? + query += "&exclude_synonyms=#{options[:exclude_synonyms]}" unless options[:exclude_synonyms].empty? + query += "&ncbo_slice=#{options[:ncbo_slice]}" unless options[:ncbo_slice].empty? annotations = parse_json(query) # See application_controller.rb - #annotations = LinkedData::Client::HTTP.get(query) + # annotations = LinkedData::Client::HTTP.get(query) LOG.add :debug, "Retrieved #{annotations.length} annotations: #{Time.now - start}s" - if annotations.empty? || params[:raw] == "true" + if annotations.empty? || params[:raw] == 'true' # TODO: if params contains select ontologies and/or semantic types, only return those selected. response = { - annotations: annotations, - ontologies: get_simplified_ontologies_hash, # application_controller - semantic_types: get_semantic_types # application_controller + annotations: annotations, + ontologies: get_simplified_ontologies_hash, # application_controller + semantic_types: get_semantic_types # application_controller } else massage_annotated_classes(annotations, options) response = { - annotations: annotations, - ontologies: {}, # ontology data are in annotations already. - semantic_types: {} # semantic types are in annotations already. + annotations: annotations, + ontologies: {}, # ontology data are in annotations already. + semantic_types: {} # semantic types are in annotations already. } end - render :json => response + render json: response end private @@ -108,11 +114,12 @@ def get_semantic_types semantic_types = {} sty_ont = LinkedData::Client::Models::Ontology.find_by_acronym('STY').first return semantic_types if sty_ont.nil? + # The first 500 items should be more than sufficient to get all semantic types. - sty_classes = sty_ont.explore.classes({'pagesize'=>500, include: 'prefLabel'}) + sty_classes = sty_ont.explore.classes({ 'pagesize' => 500, include: 'prefLabel' }) sty_classes.collection.each do |cls| - code = cls.id.split("/").last - semantic_types[ code ] = cls.prefLabel + code = cls.id.split('/').last + semantic_types[code] = cls.prefLabel end semantic_types end @@ -126,13 +133,13 @@ def massage_annotated_classes(annotations, options) class_details = get_annotated_classes(annotations, semantic_types) simplify_annotated_classes(annotations, class_details) # repeat the simplification for any annotation hierarchy or mappings. - hierarchy = annotations.map {|a| a if a.keys.include? 'hierarchy' }.compact + hierarchy = annotations.map { |a| a if a.keys.include? 'hierarchy' }.compact hierarchy.each do |a| - simplify_annotated_classes(a['hierarchy'], class_details) if not a['hierarchy'].empty? + simplify_annotated_classes(a['hierarchy'], class_details) unless a['hierarchy'].empty? end - mappings = annotations.map {|a| a if a.keys.include? 'mappings' }.compact + mappings = annotations.map { |a| a if a.keys.include? 'mappings' }.compact mappings.each do |a| - simplify_annotated_classes(a['mappings'], class_details) if not a['mappings'].empty? + simplify_annotated_classes(a['mappings'], class_details) unless a['mappings'].empty? end LOG.add :debug, "Completed massage for annotated classes: #{Time.now - start}s" end @@ -155,56 +162,57 @@ def simplify_annotated_classes(annotations, class_details) end def get_annotated_class_hash(a) - return { - :class => a['annotatedClass']['@id'], - :ontology => a['annotatedClass']['links']['ontology'] + { + class: a['annotatedClass']['@id'], + ontology: a['annotatedClass']['links']['ontology'] } end - def get_annotated_classes(annotations, semantic_types=[]) + def get_annotated_classes(annotations, semantic_types = []) # Use batch service to get class prefLabels class_list = [] - annotations.each {|a| class_list << get_annotated_class_hash(a) } - hierarchy = annotations.map {|a| a if a.keys.include? 'hierarchy' }.compact + annotations.each { |a| class_list << get_annotated_class_hash(a) } + hierarchy = annotations.map { |a| a if a.keys.include? 'hierarchy' }.compact hierarchy.each do |a| - a['hierarchy'].each {|h| class_list << get_annotated_class_hash(h) } + a['hierarchy'].each { |h| class_list << get_annotated_class_hash(h) } end - mappings = annotations.map {|a| a if a.keys.include? 'mappings' }.compact + mappings = annotations.map { |a| a if a.keys.include? 'mappings' }.compact mappings.each do |a| - a['mappings'].each {|m| class_list << get_annotated_class_hash(m) } + a['mappings'].each { |m| class_list << get_annotated_class_hash(m) } end classes_simple = {} return classes_simple if class_list.empty? + # remove duplicates class_set = class_list.to_set # get unique class:ontology set class_list = class_set.to_a # collection requires a list in batch call # make the batch call properties = 'prefLabel' - properties = 'prefLabel,semanticType' if not semantic_types.empty? - call_params = {'http://www.w3.org/2002/07/owl#Class'=>{'collection'=>class_list, 'include'=>properties}} + properties = 'prefLabel,semanticType' unless semantic_types.empty? + call_params = { 'http://www.w3.org/2002/07/owl#Class' => { 'collection' => class_list, 'include' => properties } } classes_json = get_batch_results(call_params) # Simplify the response data for the UI @ontologies_hash ||= get_simplified_ontologies_hash # application_controller classes_data = JSON.parse(classes_json) - classes_data["http://www.w3.org/2002/07/owl#Class"].each do |cls| + classes_data['http://www.w3.org/2002/07/owl#Class'].each do |cls| c = simplify_class_model(cls) - ont_details = @ontologies_hash[ c[:ontology] ] + ont_details = @ontologies_hash[c[:ontology]] next if ont_details.nil? # NO DISPLAY FOR ANNOTATIONS ON ANY CLASS OUTSIDE THE BIOPORTAL ONTOLOGY SET. + c[:ontology] = ont_details - unless semantic_types.empty? || cls['semanticType'].nil? - @semantic_types ||= get_semantic_types # application_controller + if semantic_types.empty? || cls['semanticType'].nil? + c[:semantic_types] = [] + else + @semantic_types ||= get_semantic_types # application_controller # Extract the semantic type descriptions that are requested. semanticTypeURI = 'http://bioportal.bioontology.org/ontologies/umls/sty/' - semanticCodes = cls['semanticType'].map {|t| t.sub( semanticTypeURI, '') } - requestedCodes = semanticCodes.map {|code| (semantic_types.include? code and code) || nil }.compact - requestedDescriptions = requestedCodes.map {|code| @semantic_types[code] }.compact + semanticCodes = cls['semanticType'].map { |t| t.sub(semanticTypeURI, '') } + requestedCodes = semanticCodes.map { |code| (semantic_types.include? code and code) || nil }.compact + requestedDescriptions = requestedCodes.map { |code| @semantic_types[code] }.compact c[:semantic_types] = requestedDescriptions - else - c[:semantic_types] = [] end classes_simple[c[:id]] = c end - return classes_simple + classes_simple end - end diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 1c3bc48a0b..22c6f4c9da 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'uri' require 'open-uri' require 'net/http' @@ -13,18 +15,17 @@ # Likewise, all the methods added will be available for all controllers. class ApplicationController < ActionController::Base - before_action :set_locale # Sets the locale based on the locale cookie or the value returned by detect_locale. - def set_locale + def set_locale I18n.locale = cookies[:locale] || detect_locale cookies.permanent[:locale] = I18n.locale if cookies[:locale].nil? logger.debug "* Locale set to '#{I18n.locale}'" end # Returns detedted locale based on the Accept-Language header of the request or the default locale if none is found. - def detect_locale + def detect_locale languages = request.headers['Accept-Language']&.split(',') supported_languages = I18n.available_locales @@ -32,10 +33,9 @@ def detect_locale language_code = language.split(/[-;]/).first.downcase.to_sym return language_code if supported_languages.include?(language_code) end - - return I18n.default_locale + + I18n.default_locale end - helper :all # include all helpers, all the time helper_method :bp_config_json, :current_license, :using_captcha? @@ -44,7 +44,7 @@ def detect_locale REST_URI = $REST_URL API_KEY = $API_KEY PROXY_URI = $PROXY_URL - REST_URI_BATCH = REST_URI + '/batch' + REST_URI_BATCH = "#{REST_URI}/batch" # Rails.cache expiration EXPIRY_RI_STATS = 60 * 60 * 24 # 24:00 hours @@ -53,42 +53,39 @@ def detect_locale EXPIRY_RECENT_MAPPINGS = 60 * 60 # 1:00 hours EXPIRY_ONTOLOGY_SIMPLIFIED = 60 * 1 # 0:01 minute - - $DATA_CATALOG_VALUES = {"fairsharing.org/" => "FAIRsharing", - "aber-owl.net" => "AberOWL", - "vest.agrisemantics.org" => "VEST Registry", - "bioportal.bioontology.org" => "BioPortal", - "ontobee.org" => "Ontobee", - "obofoundry.org" => "The OBO Foundry", - "ebi.ac.uk/ols" => "EBI Ontology Lookup"} - - RESOLVE_NAMESPACE = {:omv => "http://omv.ontoware.org/2005/05/ontology#", :skos => "http://www.w3.org/2004/02/skos/core#", :owl => "http://www.w3.org/2002/07/owl#", - :rdf => "http://www.w3.org/1999/02/22-rdf-syntax-ns#", :rdfs => "http://www.w3.org/2000/01/rdf-schema#", :metadata => "http://data.bioontology.org/metadata/", - :metadata_def => "http://data.bioontology.org/metadata/def/", :dc => "http://purl.org/dc/elements/1.1/", :xsd => "http://www.w3.org/2001/XMLSchema#", - :oboinowl_gen => "http://www.geneontology.org/formats/oboInOwl#", :obo_purl => "http://purl.obolibrary.org/obo/", - :umls => "http://bioportal.bioontology.org/ontologies/umls/", :door => "http://kannel.open.ac.uk/ontology#", :dct => "http://purl.org/dc/terms/", - :void => "http://rdfs.org/ns/void#", :foaf => "http://xmlns.com/foaf/0.1/", :vann => "http://purl.org/vocab/vann/", :adms => "http://www.w3.org/ns/adms#", - :voaf => "http://purl.org/vocommons/voaf#", :dcat => "http://www.w3.org/ns/dcat#", :mod => "http://www.isibang.ac.in/ns/mod#", :prov => "http://www.w3.org/ns/prov#", - :cc => "http://creativecommons.org/ns#", :schema => "http://schema.org/", :doap => "http://usefulinc.com/ns/doap#", :bibo => "http://purl.org/ontology/bibo/", - :wdrs => "http://www.w3.org/2007/05/powder-s#", :cito => "http://purl.org/spar/cito/", :pav => "http://purl.org/pav/", :nkos => "http://w3id.org/nkos/nkostype#", - :oboInOwl => "http://www.geneontology.org/formats/oboInOwl#", :idot => "http://identifiers.org/idot/", :sd => "http://www.w3.org/ns/sparql-service-description#", - :cclicense => "http://creativecommons.org/licenses/"} + $DATA_CATALOG_VALUES = { 'fairsharing.org/' => 'FAIRsharing', + 'aber-owl.net' => 'AberOWL', + 'vest.agrisemantics.org' => 'VEST Registry', + 'bioportal.bioontology.org' => 'BioPortal', + 'ontobee.org' => 'Ontobee', + 'obofoundry.org' => 'The OBO Foundry', + 'ebi.ac.uk/ols' => 'EBI Ontology Lookup' } + + RESOLVE_NAMESPACE = { omv: 'http://omv.ontoware.org/2005/05/ontology#', skos: 'http://www.w3.org/2004/02/skos/core#', owl: 'http://www.w3.org/2002/07/owl#', + rdf: 'http://www.w3.org/1999/02/22-rdf-syntax-ns#', rdfs: 'http://www.w3.org/2000/01/rdf-schema#', metadata: 'http://data.bioontology.org/metadata/', + metadata_def: 'http://data.bioontology.org/metadata/def/', dc: 'http://purl.org/dc/elements/1.1/', xsd: 'http://www.w3.org/2001/XMLSchema#', + oboinowl_gen: 'http://www.geneontology.org/formats/oboInOwl#', obo_purl: 'http://purl.obolibrary.org/obo/', + umls: 'http://bioportal.bioontology.org/ontologies/umls/', door: 'http://kannel.open.ac.uk/ontology#', dct: 'http://purl.org/dc/terms/', + void: 'http://rdfs.org/ns/void#', foaf: 'http://xmlns.com/foaf/0.1/', vann: 'http://purl.org/vocab/vann/', adms: 'http://www.w3.org/ns/adms#', + voaf: 'http://purl.org/vocommons/voaf#', dcat: 'http://www.w3.org/ns/dcat#', mod: 'http://www.isibang.ac.in/ns/mod#', prov: 'http://www.w3.org/ns/prov#', + cc: 'http://creativecommons.org/ns#', schema: 'http://schema.org/', doap: 'http://usefulinc.com/ns/doap#', bibo: 'http://purl.org/ontology/bibo/', + wdrs: 'http://www.w3.org/2007/05/powder-s#', cito: 'http://purl.org/spar/cito/', pav: 'http://purl.org/pav/', nkos: 'http://w3id.org/nkos/nkostype#', + oboInOwl: 'http://www.geneontology.org/formats/oboInOwl#', idot: 'http://identifiers.org/idot/', sd: 'http://www.w3.org/ns/sparql-service-description#', + cclicense: 'http://creativecommons.org/licenses/' }.freeze $trial_license_initialized = false - if !$EMAIL_EXCEPTIONS.nil? && $EMAIL_EXCEPTIONS == true - include ExceptionNotifiable - end + include ExceptionNotifiable if !$EMAIL_EXCEPTIONS.nil? && $EMAIL_EXCEPTIONS == true # See ActionController::RequestForgeryProtection for details protect_from_forgery - before_action :set_global_thread_values, :domain_ontology_set, :authorize_miniprofiler, :clean_empty_strings_from_params_arrays, :init_trial_license - + before_action :set_global_thread_values, :domain_ontology_set, :authorize_miniprofiler, + :clean_empty_strings_from_params_arrays, :init_trial_license def show_image_modal url = params[:url] - render turbo_stream: helpers.prepend('application_modal_content') { helpers.image_tag(url, style:'width: 100%') } + render turbo_stream: helpers.prepend('application_modal_content') { helpers.image_tag(url, style: 'width: 100%') } end def set_global_thread_values @@ -98,27 +95,27 @@ def set_global_thread_values def clean_empty_strings_from_params_arrays(params = nil) params ||= params() - params.keys.each do |k| + params.each_key do |k| clean_empty_strings_from_params_arrays(params[k]) if params[k].is_a?(Hash) - params[k] = params[k].select {|e| !e.eql?("")} if params[k].is_a?(Array) + params[k] = params[k].reject { |e| e.eql?('') } if params[k].is_a?(Array) end end def domain_ontology_set - @subdomain_filter = { :active => false, :name => "", :acronym => "" } + @subdomain_filter = { active: false, name: '', acronym: '' } if !$ENABLE_SLICES.nil? && $ENABLE_SLICES == true host = request.host - host_parts = host.split(".") + host_parts = host.split('.') subdomain = host_parts[0].downcase slices = LinkedData::Client::Models::Slice.all - slices_acronyms = slices.map {|s| s.acronym} + slices_acronyms = slices.map(&:acronym) # Set custom ontologies if we're on a subdomain that has them # Else, make sure user ontologies are set appropriately - if slices_acronyms && slices_acronyms.include?(subdomain) - slice = slices.select {|s| s.acronym.eql?(subdomain)}.first + if slices_acronyms&.include?(subdomain) + slice = slices.select { |s| s.acronym.eql?(subdomain) }.first @subdomain_filter[:active] = true @subdomain_filter[:name] = slice.name @subdomain_filter[:acronym] = slice.acronym @@ -128,11 +125,6 @@ def domain_ontology_set Thread.current[:slice] = @subdomain_filter end - def anonymous_user - user = DataAccess.getUser($ANONYMOUS_USER) - user ||= User.new({"id" => 0}) - end - def ontology_not_found(ontology_acronym) not_found("Ontology #{ontology_acronym} not found") end @@ -143,25 +135,23 @@ def concept_not_found(concept_id) def not_found(message = '') if request.xhr? - render plain: message || "Error: load failed" + render plain: message || 'Error: load failed' return end - raise ActiveRecord::RecordNotFound.new(message || 'Not Found') + raise ActiveRecord::RecordNotFound, message || 'Not Found' end - NOTIFICATION_TYPES = { :notes => "CREATE_NOTE_NOTIFICATION", :all => "ALL_NOTIFICATION" } + NOTIFICATION_TYPES = { notes: 'CREATE_NOTE_NOTIFICATION', all: 'ALL_NOTIFICATION' }.freeze - def to_param(name) # Paramaterizes URLs without encoding - unless name.nil? - name.to_s.gsub(' ',"_") - end + # Paramaterizes URLs without encoding + def to_param(name) + name&.to_s&.gsub(' ', '_') end - def undo_param(name) #Undo Paramaterization - unless name.nil? - name.to_s.gsub('_'," ") - end + # Undo Paramaterization + def undo_param(name) + name&.to_s&.gsub('_', ' ') end def bp_config_json @@ -169,23 +159,26 @@ def bp_config_json # config/bioportal_config.rb # config/initializers/ontologies_api_client.rb config = { - org: $ORG, - org_url: $ORG_URL, - site: $SITE, - org_site: $ORG_SITE, - ui_url: $UI_URL, - apikey: LinkedData::Client.settings.apikey, - userapikey: get_apikey, - rest_url: LinkedData::Client.settings.rest_url, - proxy_url: $PROXY_URL, - biomixer_url: $BIOMIXER_URL, - annotator_url: $ANNOTATOR_URL, - ncbo_annotator_url: $NCBO_ANNOTATOR_URL, - ncbo_apikey: $NCBO_API_KEY, - interportal_hash: $INTERPORTAL_HASH, - resolve_namespace: RESOLVE_NAMESPACE + org: $ORG, + org_url: $ORG_URL, + site: $SITE, + org_site: $ORG_SITE, + ui_url: $UI_URL, + apikey: LinkedData::Client.settings.apikey, + userapikey: get_apikey, + rest_url: LinkedData::Client.settings.rest_url, + proxy_url: $PROXY_URL, + biomixer_url: $BIOMIXER_URL, + annotator_url: $ANNOTATOR_URL, + ncbo_annotator_url: $NCBO_ANNOTATOR_URL, + ncbo_apikey: $NCBO_API_KEY, + interportal_hash: $INTERPORTAL_HASH, + resolve_namespace: RESOLVE_NAMESPACE } - config[:ncbo_slice] = @subdomain_filter[:acronym] if (@subdomain_filter[:active] && !@subdomain_filter[:acronym].empty?) + if @subdomain_filter[:active] && !@subdomain_filter[:acronym].empty? + config[:ncbo_slice] = + @subdomain_filter[:acronym] + end config.to_json end @@ -193,13 +186,12 @@ def remote_file_exists?(url) begin url = URI.parse(url) - if url.kind_of?(URI::FTP) - check = check_ftp_file(url) - else - check = check_http_file(url) - end - - rescue + check = if url.is_a?(URI::FTP) + check_ftp_file(url) + else + check_http_file(url) + end + rescue StandardError return false end @@ -219,12 +211,12 @@ def check_ftp_file(uri) ftp = Net::FTP.new(uri.host, uri.user, uri.password) ftp.login begin - file_exists = ftp.size(uri.path) > 0 - rescue + file_exists = ftp.size(uri.path).positive? + rescue StandardError # Check using another method - path = uri.path.split("/") + path = uri.path.split('/') filename = path.pop - path = path.join("/") + path = path.join('/') ftp.chdir(path) files = ftp.dir # Dumb check, just see if the filename is somewhere in the list @@ -246,9 +238,10 @@ def parse_response_body(response) def response_errors(error_response) error_struct = parse_response_body(error_response) - errors = {error: "There was an error, please try again"} + errors = { error: 'There was an error, please try again' } return errors unless error_struct return errors unless error_struct.respond_to?(:errors) + errors = {} error_struct.errors.each do |error| if error.is_a?(OpenStruct) || error.is_a?(Struct) @@ -264,7 +257,7 @@ def response_success?(response) return true if response.nil? if response.respond_to?(:status) && response.status - response.status.to_i < 400 + response.status.to_i < 400 else !(response.respond_to?(:errors) && response.errors) end @@ -277,31 +270,35 @@ def response_error?(response) def struct_to_hash(struct) hash = {} struct.members.each do |attr| - next if [:links, :context].include?(attr) - if struct[attr].is_a?(Struct) || struct[attr].is_a?(OpenStruct) - hash[attr] = struct_to_hash(struct[attr]) - else - hash[attr] = struct[attr] - end + next if %i[links context].include?(attr) + + hash[attr] = if struct[attr].is_a?(Struct) || struct[attr].is_a?(OpenStruct) + struct_to_hash(struct[attr]) + else + struct[attr] + end end hash end - def redirect_to_browse # Redirect to the browse Ontologies page - redirect_to "/ontologies" + # Redirect to the browse Ontologies page + def redirect_to_browse + redirect_to '/ontologies' end - def redirect_to_home # Redirect to Home Page - redirect_to "/" + # Redirect to Home Page + def redirect_to_home + redirect_to '/' end - def redirect_to_history # Redirects to the correct tab through the history system + # Redirects to the correct tab through the history system + def redirect_to_history if session[:redirect].nil? redirect_to_home else tab = find_tab(session[:redirect][:ontology]) - session[:redirect]=nil - redirect_to uri_url(:ontology=>tab.ontology_id,:conceptid=>tab.concept) + session[:redirect] = nil + redirect_to uri_url(ontology: tab.ontology_id, conceptid: tab.concept) end end @@ -310,43 +307,43 @@ def redirect_new_api(class_view = false) params[:ontology] = params[:ontology].nil? ? params[:ontologyid] : params[:ontology] # Error checking if params[:ontology].nil? || params[:id] && params[:ontology].nil? - @error = "Please provide an ontology id or concept id with an ontology id." + @error = 'Please provide an ontology id or concept id with an ontology id.' return end acronym = BpidResolver.id_to_acronym(params[:ontology]) ontology_not_found(params[:ontology]) unless acronym if class_view @ontology = LinkedData::Client::Models::Ontology.find_by_acronym(acronym).first - concept = get_class(params).first.to_s - redirect_to "/ontologies/#{acronym}?p=classes#{params_string_for_redirect(params, prefix: "&")}", :status => :moved_permanently + get_class(params).first.to_s + redirect_to "/ontologies/#{acronym}?p=classes#{params_string_for_redirect(params, prefix: '&')}", + status: :moved_permanently else - redirect_to "/ontologies/#{acronym}#{params_string_for_redirect(params)}", :status => :moved_permanently + redirect_to "/ontologies/#{acronym}#{params_string_for_redirect(params)}", status: :moved_permanently end end def params_cleanup_new_api params = @_params - if params[:ontology] && params[:ontology].to_i > 0 - params[:ontology] = BpidResolver.id_to_acronym(params[:ontology]) - end + params[:ontology] = BpidResolver.id_to_acronym(params[:ontology]) if params[:ontology]&.to_i&.positive? params end def params_string_for_redirect(params, options = {}) - prefix = options[:prefix] || "?" - stop_words = options[:stop_words] || ["ontology", "controller", "action", "id", "acronym"] + prefix = options[:prefix] || '?' + stop_words = options[:stop_words] || %w[ontology controller action id acronym] params_array = [] - params.each do |key,value| + params.each do |key, value| next if stop_words.include?(key.to_s) || value.nil? || value.empty? + params_array << "#{key}=#{CGI.escape(value)}" end - params_array.empty? ? "" : "#{prefix}#{params_array.join('&')}" + params_array.empty? ? '' : "#{prefix}#{params_array.join('&')}" end # rack-mini-profiler authorization def authorize_miniprofiler - if params[:enable_profiler] && params[:enable_profiler].eql?("true") && session[:user] && session[:user].admin? + if params[:enable_profiler].eql?('true') && session[:user] && session[:user].admin? Rack::MiniProfiler.authorize_request else Rack::MiniProfiler.deauthorize_request @@ -355,88 +352,83 @@ def authorize_miniprofiler # Verifies if user is logged in def authorize_and_redirect - unless session[:user] - redirect_to_home - end + return if session[:user] + + redirect_to_home end # Verifies that a user owns an object - def authorize_owner(id=nil) - if id.nil? - id = params[:id].to_i - end + def authorize_owner(id = nil) + id = params[:id].to_i if id.nil? - id.map! {|i| i.to_i} if id.kind_of?(Array) + id.map!(&:to_i) if id.is_a?(Array) if session[:user].nil? redirect_to_home - else - if id.kind_of?(Array) - redirect_to_home if !session[:user].admin? && !id.include?(session[:user].id.to_i) - else - redirect_to_home if !session[:user].admin? && !session[:user].id.to_i.eql?(id) - end + elsif id.is_a?(Array) + redirect_to_home if !session[:user].admin? && !id.include?(session[:user].id.to_i) + elsif !session[:user].admin? && !session[:user].id.to_i.eql?(id) + redirect_to_home end end def authorize_admin - admin = session[:user] && session[:user].admin? + admin = session[:user]&.admin? redirect_to_home unless admin end def current_user_admin? - session[:user] && session[:user].admin? + session[:user]&.admin? end def ontology_restricted?(acronym) restrict_downloads = $NOT_DOWNLOADABLE restrict_downloads.include? acronym end + # updates the 'history' tab with the current selected concept def update_tab(ontology, concept) array = session[:ontologies] || [] found = false - for item in array + array.each do |item| if item.ontology_id.eql?(ontology.id) - item.concept=concept - found=true + item.concept = concept + found = true end end - unless found - array << History.new(ontology.id, ontology.name, ontology.acronym, concept) - end + array << History.new(ontology.id, ontology.name, ontology.acronym, concept) unless found - session[:ontologies]=array + session[:ontologies] = array end # Removes a 'history' tab def remove_tab(ontology_id) array = session[:ontologies] array.delete(find_tab(ontology_id)) - session[:ontologies]=array + session[:ontologies] = array end # Returns a specific 'history' tab def find_tab(ontology_id) array = session[:ontologies] - for item in array - if item.ontology_id.eql?(ontology_id) - return item - end + array.each do |item| + return item if item.ontology_id.eql?(ontology_id) end - return nil + nil end def check_delete_mapping_permission(mappings) # ensure mappings is an Array of mappings (some calls may provide only a single mapping instance) mappings = [mappings] if mappings.instance_of? LinkedData::Client::Models::Mapping - return false if mappings.all? {|m| m.id.to_s.empty?} + return false if mappings.all? { |m| m.id.to_s.empty? } + delete_mapping_permission = false if session[:user] delete_mapping_permission = session[:user].admin? mappings.each do |mapping| break if delete_mapping_permission + delete_mapping_permission = mapping.creator == session[:user].id end end @@ -448,28 +440,26 @@ def using_captcha? end def get_class(params) - lang = request_lang - + if @ontology.flat? ignore_concept_param = params[:conceptid].nil? || - params[:conceptid].empty? || - params[:conceptid].eql?("root") || - params[:conceptid].eql?("bp_fake_root") + params[:conceptid].empty? || + params[:conceptid].eql?('root') || + params[:conceptid].eql?('bp_fake_root') if ignore_concept_param # Don't display any classes in the tree @concept = LinkedData::Client::Models::Class.new - @concept.prefLabel = "Please search for a class using the Jump To field above" + @concept.prefLabel = 'Please search for a class using the Jump To field above' @concept.obsolete = false - @concept.id = "bp_fake_root" + @concept.id = 'bp_fake_root' @concept.properties = {} - @concept.children = [] else # Display only the requested class in the tree - @concept = @ontology.explore.single_class({full: true, lang: lang }, params[:conceptid]) - @concept.children = [] + @concept = @ontology.explore.single_class({ full: true, lang: lang }, params[:conceptid]) end + @concept.children = [] @root = LinkedData::Client::Models::Class.new @root.children = [@concept] @@ -478,21 +468,21 @@ def get_class(params) # not ignoring 'bp_fake_root' here include = 'prefLabel,hasChildren,obsolete' ignore_concept_param = params[:conceptid].nil? || - params[:conceptid].empty? || - params[:conceptid].eql?("root") + params[:conceptid].empty? || + params[:conceptid].eql?('root') if ignore_concept_param # get the top level nodes for the root # TODO_REV: Support views? Replace old view call: @ontology.top_level_classes(view) - @roots = @ontology.explore.roots(concept_schemes: params[:concept_schemes]) + @roots = @ontology.explore.roots(concept_schemes: params[:concept_schemes]) if @roots.nil? || @roots.empty? LOG.add :debug, "Missing @roots for #{@ontology.acronym}" classes = @ontology.explore.classes.collection @concept = classes.first.explore.self(full: true) if classes.first return end - + @root = LinkedData::Client::Models::Class.new(read_only: true) - @root.children = @roots.sort{|x,y| (x.prefLabel || "").downcase <=> (y.prefLabel || "").downcase} + @root.children = @roots.sort { |x, y| (x.prefLabel || '').downcase <=> (y.prefLabel || '').downcase } # get the initial concept to display root_child = @root.children.first @@ -505,7 +495,7 @@ def get_class(params) end else # if the id is coming from a param, use that to get concept - @concept = @ontology.explore.single_class({full: true, lang: lang}, params[:conceptid]) + @concept = @ontology.explore.single_class({ full: true, lang: lang }, params[:conceptid]) if @concept.nil? || @concept.errors LOG.add :debug, "Missing class #{@ontology.acronym} / #{params[:conceptid]}" not_found("Missing class #{@ontology.acronym} / #{params[:conceptid]}") @@ -520,40 +510,39 @@ def get_class(params) @concept = @ontology.explore.classes.collection.first.explore.self(full: true) return end - if @roots.any? {|c| c.id == @concept.id} - rootNode = @roots - else - rootNode = [@concept] - end + rootNode = if @roots.any? { |c| c.id == @concept.id } + @roots + else + [@concept] + end end @root = LinkedData::Client::Models::Class.new(read_only: true) - @root.children = rootNode.sort{|x,y| (x.prefLabel || "").downcase <=> (y.prefLabel || "").downcase} + @root.children = rootNode.sort { |x, y| (x.prefLabel || '').downcase <=> (y.prefLabel || '').downcase } end end @concept end - def get_ontology_submission_ready(ontology) # Get the latest 'ready' submission - submission = ontology.explore.latest_submission({:include_status => 'ready'}) + submission = ontology.explore.latest_submission({ include_status: 'ready' }) # Fallback to the latest submission, even if it's not ready. submission = ontology.explore.latest_submission if submission.nil? - return submission + submission end - def get_simplified_ontologies_hash() + def get_simplified_ontologies_hash # Note the simplify_ontology_model will cache individual ontology data. simple_ontologies = {} begin - ontology_models = LinkedData::Client::Models::Ontology.all({:include_views => true}) - ontology_models.each {|o| simple_ontologies[o.id] = simplify_ontology_model(o) } + ontology_models = LinkedData::Client::Models::Ontology.all({ include_views: true }) + ontology_models.each { |o| simple_ontologies[o.id] = simplify_ontology_model(o) } rescue Exception => e LOG.add :error, e.message return nil end - return simple_ontologies + simple_ontologies end def get_ontology_details(ont_uri) @@ -565,7 +554,7 @@ def get_ontology_details(ont_uri) LOG.add :error, e.message return nil end - return ont + ont end def simplify_classes(classes) @@ -573,7 +562,7 @@ def simplify_classes(classes) # It takes a list of class objects (hashes or models) and the # data structure returned is a hash of class hashes, which will # contain details for the ontology they belong to. For example: - #{ + # { # "http://ncicb.nci.nih.gov/xml/owl/EVS/Thesaurus.owl#C12439" => { # :id => "http://ncicb.nci.nih.gov/xml/owl/EVS/Thesaurus.owl#C12439", # :ui => "http://ncbo-stg-app-12.stanford.edu/ontologies/NCIT?p=classes&conceptid=http%3A%2F%2Fncicb.nci.nih.gov%2Fxml%2Fowl%2FEVS%2FThesaurus.owl%23C12439", @@ -587,29 +576,29 @@ def simplify_classes(classes) # :ui => "http://ncbo-stg-app-12.stanford.edu/ontologies/NCIT" # }, # }, - #} + # } @ontologies_hash ||= get_simplified_ontologies_hash classes_hash = {} classes.each do |cls| c = simplify_class_model(cls) - c[:ontology] = @ontologies_hash[ c[:ontology] ] + c[:ontology] = @ontologies_hash[c[:ontology]] classes_hash[c[:id]] = c end - return classes_hash + classes_hash end def simplify_class_model(cls_model) # Simplify the class required required by the UI. # No modification of the class ontology here, see simplify_classes. # Default simple class model - cls = { :id => nil, :ontology => nil, :prefLabel => nil, :uri => nil, :ui => nil, :obsolete => false } + cls = { id: nil, ontology: nil, prefLabel: nil, uri: nil, ui: nil, obsolete: false } begin if cls_model.instance_of? Hash cls = { - :id => cls_model['@id'], - :ui => cls_model['links']['ui'], - :uri => cls_model['links']['self'], # different from id - :ontology => cls_model['links']['ontology'] + id: cls_model['@id'], + ui: cls_model['links']['ui'], + uri: cls_model['links']['self'], # different from id + ontology: cls_model['links']['ontology'] } # Try to carry through a prefLabel and the obsolete attribute, if they exist. cls[:prefLabel] = cls_model['prefLabel'] @@ -618,10 +607,10 @@ def simplify_class_model(cls_model) # try to work with a struct object or a LinkedData::Client::Models::Class # if not a struct, then: cls_model.instance_of? LinkedData::Client::Models::Class cls = { - :id => cls_model.id, - :ui => cls_model.links['ui'], - :uri => cls_model.links['self'], # different from id - :ontology => cls_model.links['ontology'], + id: cls_model.id, + ui: cls_model.links['ui'], + uri: cls_model.links['self'], # different from id + ontology: cls_model.links['ontology'] } # Try to carry through a prefLabel and the obsolete attribute, if they exist. cls[:prefLabel] = cls_model.prefLabel if cls_model.respond_to?('prefLabel') @@ -631,7 +620,7 @@ def simplify_class_model(cls_model) LOG.add :error, e.message LOG.add :error, "Failure to simplify class: #{cls}" end - return cls + cls end def simplify_ontology_model(ont_model) @@ -643,6 +632,7 @@ def simplify_ontology_model(ont_model) end ont = Rails.cache.read(id) return ont unless ont.nil? + # No cache or it has expired LOG.add :debug, "No cache or expired cache for ontology: #{id}" ont = {} @@ -662,50 +652,47 @@ def simplify_ontology_model(ont_model) # Only cache a complete representation of a simplified ontology if ont[:id].nil? || ont[:uri].nil? || ont[:acronym].nil? || ont[:name].nil? || ont[:ui].nil? raise "Incomplete simple ontology: #{id}, #{ont}" - else - Rails.cache.write(ont[:id], ont, expires_in: EXPIRY_ONTOLOGY_SIMPLIFIED) end - return ont + + Rails.cache.write(ont[:id], ont, expires_in: EXPIRY_ONTOLOGY_SIMPLIFIED) + + ont end - def get_apikey() + def get_apikey apikey = API_KEY - if session[:user] - apikey = session[:user].apikey - end - return apikey + apikey = session[:user].apikey if session[:user] + apikey end def parse_json(uri) uri = URI.parse(uri) begin - response = open(uri, "Authorization" => "apikey token=#{get_apikey}").read - rescue Exception => error + response = open(uri, 'Authorization' => "apikey token=#{get_apikey}").read + rescue Exception => e @retries ||= 0 - if @retries < 1 # retry once only - @retries += 1 - retry - else - raise error - end + raise e unless @retries < 1 # retry once only + + @retries += 1 + retry end JSON.parse(response) end - def get_batch_results(params) begin - response = RestClient.post REST_URI_BATCH, params.to_json, :content_type => :json, :accept => :json, :authorization => "apikey token=#{get_apikey}" - rescue Exception => error + response = RestClient.post REST_URI_BATCH, params.to_json, content_type: :json, accept: :json, + authorization: "apikey token=#{get_apikey}" + rescue Exception => e @retries ||= 0 - if @retries < 1 # retry once only + if @retries < 1 # retry once only @retries += 1 retry else LOG.add :error, "\nERROR: batch POST, uri: #{REST_URI_BATCH}" LOG.add :error, "\nERROR: batch POST, params: #{params.to_json}" - LOG.add :error, "\nERROR: batch POST, error response: #{error.response}" - raise error + LOG.add :error, "\nERROR: batch POST, error response: #{e.response}" + raise e end end response @@ -716,17 +703,17 @@ def get_batch_results(params) # Each class in the list maps to all other classes in the list. def get_recent_mappings recent_mappings = { - :mappings => [], - :classes => {} + mappings: [], + classes: {} } begin recent_url = "#{REST_URI}/mappings/recent/" cached_mappings_key = recent_url cached_mappings = Rails.cache.read(cached_mappings_key) - return cached_mappings unless (cached_mappings.nil? || cached_mappings.empty?) + return cached_mappings unless cached_mappings.nil? || cached_mappings.empty? + # No cache or it has expired - class_details = {} - mappings = LinkedData::Client::HTTP.get(recent_url, {size: 20, display: "prefLabel"}) + mappings = LinkedData::Client::HTTP.get(recent_url, { size: 20, display: 'prefLabel' }) recent_mappings[:mappings] = mappings unless mappings.nil? || mappings.empty? # Only cache a successful retrieval @@ -736,12 +723,12 @@ def get_recent_mappings LOG.add :error, e.message # leave recent mappings empty. end - return recent_mappings + recent_mappings end def total_mapping_count total_count = 0 - + begin stats = LinkedData::Client::HTTP.get("#{REST_URI}/mappings/statistics/ontologies") unless stats.blank? @@ -750,11 +737,11 @@ def total_mapping_count stats.transform_values!(&:to_i) total_count = stats.values.sum end - rescue + rescue StandardError LOG.add :error, e.message end - - return total_count + + total_count end def determine_layout @@ -770,24 +757,26 @@ def current_license end def init_trial_license - unless $trial_license_initialized - unless License.where(encrypted_key: 'trial').exists? - License.create(encrypted_key: 'trial', created_at: Time.current) - end - $trial_license_initialized = true + return if $trial_license_initialized + + unless License.where(encrypted_key: 'trial').exists? + License.create(encrypted_key: 'trial', created_at: Time.current) end + $trial_license_initialized = true end - + # Get the submission metadata from the REST API. def submission_metadata - @metadata ||= JSON.parse(Net::HTTP.get(URI.parse("#{REST_URI}/submission_metadata?apikey=#{API_KEY}"))) + @submission_metadata ||= JSON.parse(Net::HTTP.get(URI.parse("#{REST_URI}/submission_metadata?apikey=#{API_KEY}"))) end helper_method :submission_metadata def request_lang helpers.request_lang end + private + def not_found_record(exception) @error_message = exception.message render 'errors/not_found', status: 404 diff --git a/app/controllers/collections_controller.rb b/app/controllers/collections_controller.rb index ad125dd170..3253bb063c 100644 --- a/app/controllers/collections_controller.rb +++ b/app/controllers/collections_controller.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + class CollectionsController < ApplicationController include CollectionsHelper def show @@ -6,9 +8,9 @@ def show def show_label collection_label = '' - collection = get_request_collection - collection_label = collection['prefLabel'] if collection - collection_label = params[:id] if collection_label.nil? || collection_label.empty? + collection = get_request_collection + collection_label = collection['prefLabel'] if collection + collection_label = params[:id] if collection_label.nil? || collection_label.empty? render LabelLinkComponent.inline(params[:id], helpers.main_language_label(collection_label)) end @@ -18,7 +20,7 @@ def show_members @collection = get_request_collection page = params[:page] || '1' @auto_click = page.to_s.eql?('1') - @page = @collection.explore.members({page: page, language: request_lang}) + @page = @collection.explore.members({ page: page, language: request_lang }) @concepts = @page.collection if @ontology.nil? ontology_not_found params[:ontology] diff --git a/app/controllers/concepts_controller.rb b/app/controllers/concepts_controller.rb index 52d23a8bb4..d70ca7b293 100644 --- a/app/controllers/concepts_controller.rb +++ b/app/controllers/concepts_controller.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'cgi' class ConceptsController < ApplicationController @@ -6,10 +8,10 @@ class ConceptsController < ApplicationController layout 'ontology' def show_concept - params[:id] = params[:id] ? params[:id] : params[:conceptid] + params[:id] = params[:id] || params[:conceptid] if params[:id].nil? || params[:id].empty? - render :text => "Error: You must provide a valid concept id" + render text: 'Error: You must provide a valid concept id' return end @@ -19,20 +21,20 @@ def show_concept @submission = get_ontology_submission_ready(@ontology) @ob_instructions = helpers.ontolobridge_instructions_template(@ontology) - @concept = @ontology.explore.single_class({full: true, language: request_lang}, params[:id]) + @concept = @ontology.explore.single_class({ full: true, language: request_lang }, params[:id]) @instances_concept_id = @concept.id concept_not_found(params[:id]) if @concept.nil? gather_details - render :partial => 'show' + render partial: 'show' end def show # Handle multiple methods of passing concept ids - params[:id] = params[:id] ? params[:id] : params[:conceptid] + params[:id] = params[:id] || params[:conceptid] if params[:id].nil? || params[:id].empty? - render :text => "Error: You must provide a valid concept id" + render text: 'Error: You must provide a valid concept id' return end @@ -41,31 +43,31 @@ def show @ob_instructions = helpers.ontolobridge_instructions_template(@ontology) if request.xhr? - display = params[:callback].eql?('load') ? {full: true} : {display: "prefLabel"} + display = params[:callback].eql?('load') ? { full: true } : { display: 'prefLabel' } @concept = @ontology.explore.single_class(display, params[:id]) concept_not_found(params[:id]) if @concept.nil? @schemes = params[:concept_schemes]&.split(',') - show_ajax_request # process an ajax call else # Get the latest 'ready' submission, or fallback to any latest submission # TODO: change the logic here if the fallback will crash the visualization - @submission = get_ontology_submission_ready(@ontology) # application_controller + @submission = get_ontology_submission_ready(@ontology) # application_controller - @concept = @ontology.explore.single_class({full: true}, params[:id]) + @concept = @ontology.explore.single_class({ full: true }, params[:id]) concept_not_found(params[:id]) if @concept.nil? @schemes = params[:concept_schemes].split(',') - show_ajax_request # process a full call end + show_ajax_request end def show_label - cls_id = params[:concept] || params[:id] # cls_id should be a full URI - ont_id = params[:ontology] # ont_id could be a full URI or an acronym - - if ont_id.to_i > 0 - params_cleanup_new_api() - stop_words = ["controller", "action"] - redirect_to "#{request.path}#{params_string_for_redirect(params, stop_words: stop_words)}", :status => :moved_permanently + cls_id = params[:concept] || params[:id] # cls_id should be a full URI + ont_id = params[:ontology] # ont_id could be a full URI or an acronym + + if ont_id.to_i.positive? + params_cleanup_new_api + stop_words = %w[controller action] + redirect_to "#{request.path}#{params_string_for_redirect(params, stop_words: stop_words)}", + status: :moved_permanently return end @@ -73,29 +75,31 @@ def show_label end def show_definition - if params[:ontology].to_i > 0 - params_cleanup_new_api() - stop_words = ["controller", "action"] - redirect_to "#{request.path}#{params_string_for_redirect(params, stop_words: stop_words)}", :status => :moved_permanently + if params[:ontology].to_i.positive? + params_cleanup_new_api + stop_words = %w[controller action] + redirect_to "#{request.path}#{params_string_for_redirect(params, stop_words: stop_words)}", + status: :moved_permanently return end @ontology = LinkedData::Client::Models::Ontology.find(params[:ontology]) cls = @ontology.explore.single_class(params[:concept]) - render :text => cls.definition + render text: cls.definition end def show_tree - if params[:ontology].to_i > 0 - params_cleanup_new_api() - stop_words = ["controller", "action"] - redirect_to "#{request.path}#{params_string_for_redirect(params, stop_words: stop_words)}", :status => :moved_permanently + if params[:ontology].to_i.positive? + params_cleanup_new_api + stop_words = %w[controller action] + redirect_to "#{request.path}#{params_string_for_redirect(params, stop_words: stop_words)}", + status: :moved_permanently return end @ontology = LinkedData::Client::Models::Ontology.find_by_acronym(params[:ontology]).first if @ontology.nil? ontology_not_found(params[:ontology]) - else - get_class(params) #application_controller + else + get_class(params) # application_controller render partial: 'ontologies/treeview', locals: { autoCLick: params[:auto_click] || true } end end @@ -110,8 +114,8 @@ def show_date_sorted_list auto_click = page.to_s.eql?('1') params = { page: page, - sortby:'modified,created', - order:'desc,desc', + sortby: 'modified,created', + order: 'desc,desc', display: 'prefLabel,modified,created', language: request_lang } @@ -126,14 +130,14 @@ def show_date_sorted_list render partial: 'concepts/date_sorted_list', locals: { auto_click: auto_click } end - end def property_tree - if params[:ontology].to_i > 0 - params_cleanup_new_api() - stop_words = ["controller", "action"] - redirect_to "#{request.path}#{params_string_for_redirect(params, stop_words: stop_words)}", :status => :moved_permanently + if params[:ontology].to_i.positive? + params_cleanup_new_api + stop_words = %w[controller action] + redirect_to "#{request.path}#{params_string_for_redirect(params, stop_words: stop_words)}", + status: :moved_permanently return end @ontology = LinkedData::Client::Models::Ontology.find_by_acronym(params[:ontology]).first @@ -146,52 +150,53 @@ def property_tree def details concept_not_found('') if params[:conceptid].nil? || params[:conceptid].empty? - if params[:ontology].to_i > 0 + if params[:ontology].to_i.positive? orig_id = params[:ontology] - params_cleanup_new_api() - options = {stop_words: ["controller", "action", "id"]} - redirect_to "#{request.path.sub(orig_id, params[:ontology])}#{params_string_for_redirect(params, options)}", :status => :moved_permanently + params_cleanup_new_api + options = { stop_words: %w[controller action id] } + redirect_to "#{request.path.sub(orig_id, params[:ontology])}#{params_string_for_redirect(params, options)}", + status: :moved_permanently return end @ontology = LinkedData::Client::Models::Ontology.find_by_acronym(params[:ontology]).first ontology_not_found(params[:ontology]) if @ontology.nil? - @concept = @ontology.explore.single_class({full: true}, CGI.unescape(params[:conceptid])) + @concept = @ontology.explore.single_class({ full: true }, CGI.unescape(params[:conceptid])) concept_not_found(CGI.unescape(params[:conceptid])) if @concept.nil? - if params[:styled].eql?("true") - render :partial => "details", :layout => "partial" + if params[:styled].eql?('true') + render partial: 'details', layout: 'partial' else - render :partial => "details" + render partial: 'details' end end - def biomixer @ontology = LinkedData::Client::Models::Ontology.find_by_acronym(params[:ontology]).first ontology_not_found(params[:ontology]) if @ontology.nil? - @concept = @ontology.explore.single_class({full: true}, params[:conceptid]) + @concept = @ontology.explore.single_class({ full: true }, params[:conceptid]) concept_not_found(params[:conceptid]) if @concept.nil? @immediate_load = true - render partial: "biomixer", layout: false + render partial: 'biomixer', layout: false end -# PRIVATE ----------------------------------------- -private + # PRIVATE ----------------------------------------- + private def show_ajax_request case params[:callback] when 'load' # Load pulls in all the details of a node gather_details - render :partial => 'load' + render partial: 'load' when 'children' # Children is called only for drawing the tree - @children = @concept.explore.children(pagesize: 750, concept_schemes: @schemes.join(','), language: request_lang, display: 'prefLabel,obsolete,hasChildren').collection || [] - @children.sort! { |x, y| (x.prefLabel || "").downcase <=> (y.prefLabel || "").downcase } unless @children.empty? - render :partial => 'child_nodes' + @children = @concept.explore.children(pagesize: 750, concept_schemes: @schemes.join(','), language: request_lang, + display: 'prefLabel,obsolete,hasChildren').collection || [] + @children.sort! { |x, y| (x.prefLabel || '').downcase <=> (y.prefLabel || '').downcase } unless @children.empty? + render partial: 'child_nodes' end end @@ -203,18 +208,18 @@ def show_uri_request def gather_details @notes = @concept.explore.notes - update_tab(@ontology, @concept.id) #updates the 'history' tab with the current node + update_tab(@ontology, @concept.id) # updates the 'history' tab with the current node end def build_tree # find path to root - rootNode = @concept.explore.tree(include: "prefLabel,hasChildren,obsolete,subClassOf") + rootNode = @concept.explore.tree(include: 'prefLabel,hasChildren,obsolete,subClassOf') @root = LinkedData::Client::Models::Class.new(read_only: true) @root.children = rootNode unless rootNode.nil? end def filter_concept_with_no_date(concepts) - concepts.filter { |c| !concept_date(c).nil?} + concepts.filter { |c| !concept_date(c).nil? } end def concepts_to_years_months(concepts) diff --git a/app/controllers/concerns/mapping_statistics.rb b/app/controllers/concerns/mapping_statistics.rb index 6d70552e2a..9c272bfa47 100644 --- a/app/controllers/concerns/mapping_statistics.rb +++ b/app/controllers/concerns/mapping_statistics.rb @@ -3,15 +3,14 @@ module MappingStatistics extend ActiveSupport::Concern - MAPPINGS_URL = "#{LinkedData::Client.settings.rest_url}/mappings" MAPPING_STATISTICS_URL = "#{LinkedData::Client.settings.rest_url}/mappings/statistics/ontologies/" MAPPING_STATISTICS_EXTERNAL = "#{LinkedData::Client.settings.rest_url}/mappings/statistics/external" MAPPING_STATISTICS_INTERNAL = "#{LinkedData::Client.settings.rest_url}/mappings/statistics/interportal/" - EXTERNAL_MAPPINGS_GRAPH = "http://data.bioontology.org/metadata/ExternalMappings" - INTERPORTAL_MAPPINGS_GRAPH = "http://data.bioontology.org/metadata/InterportalMappings" + EXTERNAL_MAPPINGS_GRAPH = 'http://data.bioontology.org/metadata/ExternalMappings' + INTERPORTAL_MAPPINGS_GRAPH = 'http://data.bioontology.org/metadata/InterportalMappings' def mapping_counts(source_acronym) mapping_counts = [] @@ -25,17 +24,16 @@ def mapping_counts(source_acronym) statistics = get_statistics source_acronym statistics&.each_pair do |target_acronym, count| if target_acronym.to_s == EXTERNAL_MAPPINGS_GRAPH - ont = OpenStruct.new({:id => target_acronym.to_s, :name => "External Mappings"}) + ont = OpenStruct.new({ id: target_acronym.to_s, name: 'External Mappings' }) elsif target_acronym.to_s.start_with?(INTERPORTAL_MAPPINGS_GRAPH) - ont =OpenStruct.new( {:id => target_acronym.to_s, :name => "#{target_acronym.to_s.split("/")[-1].upcase} Interportal"}) + ont = OpenStruct.new({ id: target_acronym.to_s, + name: "#{target_acronym.to_s.split('/')[-1].upcase} Interportal" }) else ont = ontologies.find { |o| o.acronym.eql? target_acronym.to_s } # Handle the case where statistics are still present for a deleted ontology next if ont.nil? || ont.summaryOnly end - - mapping_counts << { target_ontology: ont, count: count } end @@ -43,18 +41,15 @@ def mapping_counts(source_acronym) end private + def get_statistics(source_acronym) - ontology_label = source_acronym.split(":") - if ontology_label[-1] == "external" - counts = LinkedData::Client::HTTP.get(MAPPING_STATISTICS_EXTERNAL) - elsif ontology_label[0] == "interportal" - counts = LinkedData::Client::HTTP.get("#{MAPPING_STATISTICS_INTERNAL}#{ontology_label[-1]}") + ontology_label = source_acronym.split(':') + if ontology_label[-1] == 'external' + LinkedData::Client::HTTP.get(MAPPING_STATISTICS_EXTERNAL) + elsif ontology_label[0] == 'interportal' + LinkedData::Client::HTTP.get("#{MAPPING_STATISTICS_INTERNAL}#{ontology_label[-1]}") else - counts = LinkedData::Client::HTTP.get("#{MAPPING_STATISTICS_URL}#{source_acronym}") + LinkedData::Client::HTTP.get("#{MAPPING_STATISTICS_URL}#{source_acronym}") end - counts end - - - end diff --git a/app/controllers/concerns/ontology_updater.rb b/app/controllers/concerns/ontology_updater.rb index a5faefefef..1876577181 100644 --- a/app/controllers/concerns/ontology_updater.rb +++ b/app/controllers/concerns/ontology_updater.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module OntologyUpdater extend ActiveSupport::Concern include SubmissionUpdater @@ -22,17 +24,18 @@ def ontology_params p = params.require(:ontology).permit(:name, :acronym, { administeredBy: [] }, :viewingRestriction, { acl: [] }, { hasDomain: [] }, :viewOf, :isView, :subscribe_notifications, { group: [] }) - p[:administeredBy].reject!(&:blank?) if p[:administeredBy] + p[:administeredBy]&.reject!(&:blank?) # p[:acl].reject!(&:blank?) - p[:hasDomain].reject!(&:blank?) if p[:hasDomain] - p[:group].reject!(&:blank?) if p[:group] + p[:hasDomain]&.reject!(&:blank?) + p[:group]&.reject!(&:blank?) p[:viewOf] = '' if p.key?(:viewOf) && !p.key?(:isView) p.to_h end def show_new_errors(object, redirection = 'ontologies/new') - # TODO optimize - @ontologies = LinkedData::Client::Models::Ontology.all(include: 'acronym', include_views: true, display_links: false, display_context: false) + # TODO: optimize + @ontologies = LinkedData::Client::Models::Ontology.all(include: 'acronym', include_views: true, + display_links: false, display_context: false) @categories = LinkedData::Client::Models::Category.all @groups = LinkedData::Client::Models::Group.all(display_links: false, display_context: false) @user_select_list = LinkedData::Client::Models::User.all.map { |u| [u.username, u.id] } @@ -61,7 +64,7 @@ def new_submission_hash(ontology) submission_params = submission_params(params[:submission]) if @submission - submission_params = submission_params(ActionController::Parameters.new(@submission.to_hash.delete_if do |k, v| + submission_params = submission_params(ActionController::Parameters.new(@submission.to_hash.delete_if do |_k, v| v.nil? || v.respond_to?(:empty?) && v.empty? end.merge(submission_params))) end @@ -78,6 +81,7 @@ def update_submission_hash(acronym) end private + def reset_agent_attributes helpers.agent_attributes.each do |attr| current_val = @submission[attr] diff --git a/app/controllers/concerns/submission_filter.rb b/app/controllers/concerns/submission_filter.rb index 19094449b4..d0d1de7b5c 100644 --- a/app/controllers/concerns/submission_filter.rb +++ b/app/controllers/concerns/submission_filter.rb @@ -1,9 +1,11 @@ +# frozen_string_literal: true + module SubmissionFilter extend ActiveSupport::Concern - BROWSE_ATTRIBUTES = ['ontology', 'submissionStatus', 'description', 'pullLocation', 'creationDate', - 'contact', 'released', 'naturalLanguage', 'hasOntologyLanguage', - 'hasFormalityLevel', 'isOfType', 'deprecated', 'status', 'metrics'] + BROWSE_ATTRIBUTES = %w[ontology submissionStatus description pullLocation creationDate + contact released naturalLanguage hasOntologyLanguage + hasFormalityLevel isOfType deprecated status metrics].freeze def init_filters(params) @show_views = params[:show_views]&.eql?('true') @@ -79,7 +81,6 @@ def filters_params(params, includes: BROWSE_ATTRIBUTES.join(','), page: 1, pages @filters[:show_retired] = 'true' end - filters_values_map.each do |filter, api_key| next if params[filter].nil? || params[filter].empty? @@ -145,7 +146,7 @@ def add_submission_attributes(ont_hash, sub) end def add_ontology_attributes(ont_hash, ont) - return if ont.nil? + return if ont.nil? ont_hash[:id] = ont.id ont_hash[:type] = ont.viewOf.nil? ? 'ontology' : 'ontology_view' @@ -173,12 +174,16 @@ def add_fair_score_metrics(ont_hash, ont) end def ontology_filters_init(categories, groups) - @languages = submission_metadata.select { |x| x['@id']['naturalLanguage'] }.first['enforcedValues'].map do |id, name| + @languages = submission_metadata.select do |x| + x['@id']['naturalLanguage'] + end.first['enforcedValues'].map do |id, name| { 'id' => id, 'name' => name, 'value' => id.split('/').last, 'acronym' => name } end - @formalityLevel = submission_metadata.select { |x| x['@id']['hasFormalityLevel'] }.first['enforcedValues'].map do |id, name| - { 'id' => id, 'name' => name, 'acronym' => name.camelize(:lower), 'value' => name.delete(' ')} + @formalityLevel = submission_metadata.select do |x| + x['@id']['hasFormalityLevel'] + end.first['enforcedValues'].map do |id, name| + { 'id' => id, 'name' => name, 'acronym' => name.camelize(:lower), 'value' => name.delete(' ') } end @isOfType = submission_metadata.select { |x| x['@id']['isOfType'] }.first['enforcedValues'].map do |id, name| @@ -193,7 +198,7 @@ def ontology_filters_init(categories, groups) ['Sort by upload date', 'creationDate'], ['Sort by release date', 'released'], ['Sort by FAIR score', 'fair'], - ['Sort by popularity', 'visits'], + ['Sort by popularity', 'visits'] ] init_filters(params) @@ -213,13 +218,15 @@ def ontology_filters_init(categories, groups) groups: object_filter(groups, :groups), naturalLanguage: object_filter(@languages, :naturalLanguage), hasFormalityLevel: object_filter(@formalityLevel, :hasFormalityLevel), - isOfType: object_filter(@isOfType, :isOfType), - #missingStatus: object_filter(@missingStatus, :missingStatus) + isOfType: object_filter(@isOfType, :isOfType) + # missingStatus: object_filter(@missingStatus, :missingStatus) } end def check_id(name_value, objects, name_key) - selected_category = objects.select { |x| x[name_key].parameterize.underscore.eql?(name_value.parameterize.underscore) } + selected_category = objects.select do |x| + x[name_key].parameterize.underscore.eql?(name_value.parameterize.underscore) + end selected_category.first && selected_category.first['id'] end @@ -243,7 +250,6 @@ def count_objects(ontologies) @filters = ontology_filters_init(@categories, @groups) object_names = @filters.keys - @filters.each do |filter, values| objects = values.first objects_count[filter] = objects.map { |v| [v['id'], 0] }.to_h @@ -260,5 +266,4 @@ def count_objects(ontologies) end objects_count end - end diff --git a/app/controllers/concerns/submission_updater.rb b/app/controllers/concerns/submission_updater.rb index b98a2fb441..2fd29aecbb 100644 --- a/app/controllers/concerns/submission_updater.rb +++ b/app/controllers/concerns/submission_updater.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module SubmissionUpdater extend ActiveSupport::Concern @@ -5,6 +7,7 @@ def submission_from_params(new_submission_hash) convert_values_to_types(new_submission_hash) LinkedData::Client::Models::OntologySubmission.new(values: submission_params(new_submission_hash)) end + def save_submission(new_submission_hash) @submission = submission_from_params(new_submission_hash) @@ -13,7 +16,6 @@ def save_submission(new_submission_hash) end def update_submission(new_submission_hash, submission_id) - convert_values_to_types(new_submission_hash) @ontology = LinkedData::Client::Models::Ontology.find_by_acronym(new_submission_hash[:ontology]).first @@ -31,11 +33,12 @@ def update_submission(new_submission_hash, submission_id) [@submission, @submission.update(values: new_values, cache_refresh_all: false)] end - def add_ontologies_to_object(ontologies,object) + def add_ontologies_to_object(ontologies, object) ontologies.each do |ont| next if object.ontologies.include?(ont) + ontology = LinkedData::Client::Models::Ontology.find(ont) - if object.type.match(/\/([^\/]+)$/)[1] == 'Group' + if object.type.match(%r{/([^/]+)$})[1] == 'Group' ontology.group.push(object.id) else ontology.hasDomain.push(object.id) @@ -44,12 +47,12 @@ def add_ontologies_to_object(ontologies,object) end end - def delete_ontologies_from_object(new_ontologies,old_ontologies,object) + def delete_ontologies_from_object(new_ontologies, old_ontologies, object) new_ontologies = [] if new_ontologies.nil? ontologies = old_ontologies - new_ontologies ontologies.each do |ont| ontology = LinkedData::Client::Models::Ontology.find(ont) - if object.type.match(/\/([^\/]+)$/)[1] == 'Group' + if object.type.match(%r{/([^/]+)$})[1] == 'Group' ontology.group.delete(object.id) else ontology.hasDomain.delete(object.id) @@ -67,30 +70,29 @@ def update_ontology_summary_only(is_remote = @submission.isRemote) def convert_values_to_types(new_submission_hash) unless new_submission_hash[:contact].nil? - new_submission_hash[:contact] = new_submission_hash[:contact].values unless new_submission_hash[:contact].is_a?(Array) + unless new_submission_hash[:contact].is_a?(Array) + new_submission_hash[:contact] = + new_submission_hash[:contact].values + end new_submission_hash[:contact].delete_if { |c| c[:name].empty? || c[:email].empty? } end # Convert metadata that needs to be integer to int submission_metadata.map do |hash| - if hash["enforce"].include?("integer") - if !new_submission_hash[hash["attribute"]].nil? && !new_submission_hash[hash["attribute"]].eql?("") - new_submission_hash[hash["attribute"].to_s.to_sym] = Integer(new_submission_hash[hash["attribute"].to_s.to_sym]) - end - end - if hash["enforce"].include?("boolean") && !new_submission_hash[hash["attribute"]].nil? - if new_submission_hash[hash["attribute"]].eql?("true") - new_submission_hash[hash["attribute"].to_s.to_sym] = true - elsif new_submission_hash[hash["attribute"]].eql?("false") - new_submission_hash[hash["attribute"].to_s.to_sym] = false - else - new_submission_hash[hash["attribute"].to_s.to_sym] = nil - end + if hash['enforce'].include?('integer') && (!new_submission_hash[hash['attribute']].nil? && !new_submission_hash[hash['attribute']].eql?('')) + new_submission_hash[hash['attribute'].to_s.to_sym] = + Integer(new_submission_hash[hash['attribute'].to_s.to_sym]) end + next unless hash['enforce'].include?('boolean') && !new_submission_hash[hash['attribute']].nil? + + new_submission_hash[hash['attribute'].to_s.to_sym] = if new_submission_hash[hash['attribute']].eql?('true') + true + elsif new_submission_hash[hash['attribute']].eql?('false') + false + end end end - def submission_params(params) attributes = [ :ontology, @@ -108,24 +110,23 @@ def submission_params(params) :isRemote, :pullLocation, :filePath, - { contact: [:name, :email] }, + { contact: %i[name email] }, :homepage, :documentation, :publication ] submission_metadata.each do |m| + m_attr = m['attribute'].to_sym - m_attr = m["attribute"].to_sym - - attributes << if m["enforce"].include?("list") - [{ m_attr => {} }, { m_attr => []}] + attributes << if m['enforce'].include?('list') + [{ m_attr => {} }, { m_attr => [] }] else m_attr end end p = params.permit(attributes.uniq) - p['pullLocation'] = '' if p['isRemote']&.eql?('3') + p['pullLocation'] = '' if p['isRemote'].eql?('3') p = p.to_h.transform_values do |v| if v.is_a? Hash @@ -139,10 +140,14 @@ def submission_params(params) submission_metadata.each do |m| m_attr = m['attribute'].to_sym - if p[m_attr] && m['enforce'].include?('list') - p[m_attr] = Array(p[m_attr]) unless p[m_attr].is_a?(Array) - p[m_attr] = p[m_attr].map { |x| x.is_a?(Hash) ? x.values.reject(&:empty?) : x.reject(&:empty?) }.flatten.uniq if m['enforce'].include?('Agent') - end + next unless p[m_attr] && m['enforce'].include?('list') + + p[m_attr] = Array(p[m_attr]) unless p[m_attr].is_a?(Array) + next unless m['enforce'].include?('Agent') + + p[m_attr] = p[m_attr].map do |x| + x.is_a?(Hash) ? x.values.reject(&:empty?) : x.reject(&:empty?) + end.flatten.uniq end p diff --git a/app/controllers/errors_controller.rb b/app/controllers/errors_controller.rb index b5ffb1eecc..f3263f33ad 100644 --- a/app/controllers/errors_controller.rb +++ b/app/controllers/errors_controller.rb @@ -1,5 +1,6 @@ -class ErrorsController < ApplicationController +# frozen_string_literal: true +class ErrorsController < ApplicationController layout :determine_layout def not_found @@ -9,5 +10,4 @@ def not_found def internal_server_error render status: 500 end - end diff --git a/app/controllers/fair_score_controller.rb b/app/controllers/fair_score_controller.rb index 9564a5875e..36d2dc8dff 100644 --- a/app/controllers/fair_score_controller.rb +++ b/app/controllers/fair_score_controller.rb @@ -1,5 +1,6 @@ -class FairScoreController < ApplicationController +# frozen_string_literal: true +class FairScoreController < ApplicationController helper FairScoreHelper include FairScoreHelper def details_html @@ -31,4 +32,4 @@ def get_fair raise StandardError, 'Error: load failed' end end -end \ No newline at end of file +end diff --git a/app/controllers/history_controller.rb b/app/controllers/history_controller.rb index 687839df59..f47304b0f4 100644 --- a/app/controllers/history_controller.rb +++ b/app/controllers/history_controller.rb @@ -1,15 +1,16 @@ +# frozen_string_literal: true + class HistoryController < ApplicationController - - def remove # removes a 'history' tab - remove_tab(undo_param(params[:ontology])) - render :text =>"success" + # removes a 'history' tab + def remove + remove_tab(undo_param(params[:ontology])) + render text: 'success' end - - def update # updates the 'history' tab to point to the new node + + # updates the 'history' tab to point to the new node + def update ontology = DataAccess.getOntology(params[:ontology]) - update_tab(ontology,params[:concept]) - render :text =>"success" + update_tab(ontology, params[:concept]) + render text: 'success' end - - end diff --git a/app/controllers/home_controller.rb b/app/controllers/home_controller.rb index bf1bc3316a..2d957ab616 100644 --- a/app/controllers/home_controller.rb +++ b/app/controllers/home_controller.rb @@ -3,11 +3,10 @@ class HomeController < ApplicationController layout :determine_layout - include FairScoreHelper def index - @analytics = helpers.ontologies_analytics + @analytics = helpers.ontologies_analytics # Calculate BioPortal summary statistics @ont_count = @analytics.keys.size metrics = LinkedData::Client::Models::Metrics.all @@ -25,18 +24,17 @@ def index @upload_benefits = [ t('home.benefit1'), t('home.benefit2'), - t('home.benefit3'), + t('home.benefit3'), t('home.benefit4'), t('home.benefit5') ] @anal_ont_names = [] @anal_ont_numbers = [] - @analytics.sort_by{|ont, count| -count}[0..4].each do |ont, count| + @analytics.sort_by { |_ont, count| -count }[0..4].each do |ont, count| @anal_ont_names << ont @anal_ont_numbers << count end - end def render_layout_partial @@ -64,34 +62,22 @@ def feedback end @tags = [] - unless params[:bug].nil? || params[:bug].empty? - @tags << "Bug" - end - unless params[:proposition].nil? || params[:proposition].empty? - @tags << "Proposition" - end - unless params[:question].nil? || params[:question].empty? - @tags << "Question" - end + @tags << 'Bug' unless params[:bug].nil? || params[:bug].empty? + @tags << 'Proposition' unless params[:proposition].nil? || params[:proposition].empty? + @tags << 'Question' unless params[:question].nil? || params[:question].empty? unless params[:ontology_submissions_request].nil? || params[:ontology_submissions_request].empty? - @tags << "Ontology submissions request" + @tags << 'Ontology submissions request' end @errors = [] - if params[:name].nil? || params[:name].empty? - @errors << 'Please include your name' - end - if params[:email].nil? || params[:email].length < 1 || !params[:email].match(/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i) + @errors << 'Please include your name' if params[:name].nil? || params[:name].empty? + if params[:email].nil? || params[:email].empty? || !params[:email].match(/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i) @errors << 'Please include your email' end - if params[:comment].nil? || params[:comment].empty? - @errors << 'Please include your comment' - end - if using_captcha? && !session[:user] - unless verify_recaptcha - @errors << 'Please fill in the proper text from the supplied image' - end + @errors << 'Please include your comment' if params[:comment].nil? || params[:comment].empty? + if using_captcha? && !session[:user] && !verify_recaptcha + @errors << 'Please fill in the proper text from the supplied image' end unless @errors.empty? @@ -129,7 +115,7 @@ def account @user_ontologies = @user.customOntology @user_ontologies ||= [] - onts = LinkedData::Client::Models::Ontology.all(include_views: true); + onts = LinkedData::Client::Models::Ontology.all(include_views: true) @admin_ontologies = onts.select { |o| o.administeredBy.include? @user.id } projects = LinkedData::Client::Models::Project.all @@ -148,9 +134,9 @@ def validate_ontology_file end def annotator_recommender_form - if params[:submit_button] == "annotator" + if params[:submit_button] == 'annotator' redirect_to "/annotator?text=#{params[:text]}" - elsif params[:submit_button] == "recommender" + elsif params[:submit_button] == 'recommender' redirect_to "/recommender?text=#{params[:text]}" end end diff --git a/app/controllers/instances_controller.rb b/app/controllers/instances_controller.rb index 5d346ef3b0..f7ba67a44b 100644 --- a/app/controllers/instances_controller.rb +++ b/app/controllers/instances_controller.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + class InstancesController < ApplicationController include InstancesHelper def index_by_ontology @@ -12,7 +14,7 @@ def index_by_class end def show - @instance = get_instance_details_json(params[:ontology_id], params[:instance_id], {include: 'all'}) + @instance = get_instance_details_json(params[:ontology_id], params[:instance_id], { include: 'all' }) render partial: 'instances/instance_details' end @@ -22,9 +24,10 @@ def get_ontology(params) @ontology = LinkedData::Client::Models::Ontology.find_by_acronym(params[:ontology]).first ontology_not_found(params[:ontology]) if @ontology.nil? end + # json render + adding next and prev pages links def custom_render(instances) - instances[:collection].map! { |i| add_labels_to_print(i, @ontology.acronym)} + instances[:collection].map! { |i| add_labels_to_print(i, @ontology.acronym) } if (instances.respond_to? :links) && (!instances.respond_to? :errors) instances.links = { nextPage: get_page_link(instances.nextPage), @@ -38,16 +41,16 @@ def custom_render(instances) def get_page_link(page_number) return nil if page_number.nil? - if request.query_parameters.has_key?(:page) + if request.query_parameters.key?(:page) request.original_url.gsub(/page=\d+/, "page=#{page_number}") elsif request.query_parameters.empty? - request.original_url + "?" + "page=#{page_number}" + "#{request.original_url}?page=#{page_number}" else - request.original_url + "&" + "page=#{page_number}" + "#{request.original_url}&page=#{page_number}" end end def get_query_parameters - request.query_parameters.slice(:include, :display, :page, :pagesize, :search , :sortby , :order) || {} + request.query_parameters.slice(:include, :display, :page, :pagesize, :search, :sortby, :order) || {} end -end \ No newline at end of file +end diff --git a/app/controllers/label_xl_controller.rb b/app/controllers/label_xl_controller.rb index d38fd870c6..c12821c8a4 100644 --- a/app/controllers/label_xl_controller.rb +++ b/app/controllers/label_xl_controller.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + class LabelXlController < ApplicationController include LabelXlHelper @@ -16,8 +18,8 @@ def show_label private def get_request_label_xl - params[:id] = params[:id] ? params[:id] : params[:label_xl_id] - params[:ontology_id] = params[:ontology_id] ? params[:ontology_id] : params[:ontology] + params[:id] = params[:id] || params[:label_xl_id] + params[:ontology_id] = params[:ontology_id] || params[:ontology] if params[:id].nil? || params[:id].empty? render text: 'Error: You must provide a valid label_xl id' return @@ -26,5 +28,4 @@ def get_request_label_xl @ontology_acronym = @ontology.acronym get_label_xl(@ontology, params[:id]) end - end diff --git a/app/controllers/landscape_controller.rb b/app/controllers/landscape_controller.rb index c3f81dc9a8..89791b7de1 100644 --- a/app/controllers/landscape_controller.rb +++ b/app/controllers/landscape_controller.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'action_view' include ActionView::Helpers::NumberHelper @@ -7,21 +9,22 @@ class LandscapeController < ApplicationController include FairScoreHelper def index - #@ontologies = LinkedData::Client::Models::Ontology.all(include_views: false) - #@submissions = LinkedData::Client::Models::OntologySubmission.all(values: params[:submission]) + # @ontologies = LinkedData::Client::Models::Ontology.all(include_views: false) + # @submissions = LinkedData::Client::Models::OntologySubmission.all(values: params[:submission]) # Array with color codes for the pie charts. iterate color_index to change color - pie_colors_array = ["#2484c1", "#0c6197", "#4daa4b", "#90c469", "#daca61", "#e4a14b", "#e98125", "#cb2121", "#830909", "#923e99", "#ae83d5", "#bf273e", "#ce2aeb", "#bca44a", "#618d1b", "#1ee67b", "#b0ec44", "#a4a0c9", "#322849", "#86f71a", "#d1c87f", "#7d9058", "#44b9b0", "#7c37c0", "#cc9fb1", "#e65414", "#8b6834", "#248838"]; + pie_colors_array = ['#2484c1', '#0c6197', '#4daa4b', '#90c469', '#daca61', '#e4a14b', '#e98125', '#cb2121', + '#830909', '#923e99', '#ae83d5', '#bf273e', '#ce2aeb', '#bca44a', '#618d1b', '#1ee67b', '#b0ec44', '#a4a0c9', '#322849', '#86f71a', '#d1c87f', '#7d9058', '#44b9b0', '#7c37c0', '#cc9fb1', '#e65414', '#8b6834', '#248838'] groups_count_hash = {} domains_count_hash = {} # A hash for counting ontologies in size ranges size_slices_hash = {} - size_slices_hash["< 100"] = 0 - size_slices_hash["< #{number_with_delimiter(1000, delimiter: " ")}"] = 0 - size_slices_hash["< #{number_with_delimiter(10000, delimiter: " ")}"] = 0 - size_slices_hash["< #{number_with_delimiter(100000, delimiter: " ")}"] = 0 - size_slices_hash["100k+"] = 0 + size_slices_hash['< 100'] = 0 + size_slices_hash["< #{number_with_delimiter(1000, delimiter: ' ')}"] = 0 + size_slices_hash["< #{number_with_delimiter(10_000, delimiter: ' ')}"] = 0 + size_slices_hash["< #{number_with_delimiter(100_000, delimiter: ' ')}"] = 0 + size_slices_hash['100k+'] = 0 natural_language_hash = {} licenseProperty_hash = {} @@ -41,259 +44,255 @@ def index ontology_relations_array = [] - ontologyFormatsCount = {"OWL" => 0, "SKOS" => 0, "UMLS" => 0, "OBO" => 0} + ontologyFormatsCount = { 'OWL' => 0, 'SKOS' => 0, 'UMLS' => 0, 'OBO' => 0 } - @metrics_average = [{attr: "numberOfClasses", label: "Number of classes", array: []}, - {attr: "numberOfIndividuals", label: "Number of individuals", array: []}, - {attr: "numberOfProperties", label: "Number of properties", array: []}, - {attr: "maxDepth", label: "Max depth", array: []}, - {attr: "maxChildCount", label: "Max child count", array: []}, - {attr: "averageChildCount", label: "Average child count", array: []}, - {attr: "classesWithOneChild", label: "Classes with one child", array: []}, - {attr: "classesWithMoreThan25Children", label: "Classes with more than 25 children", array: []}, - {attr: "classesWithNoDefinition", label: "Classes with no definition ", array: []}, - {attr: "numberOfAxioms", label: "Number of axioms (triples)", array: []}] + @metrics_average = [{ attr: 'numberOfClasses', label: 'Number of classes', array: [] }, + { attr: 'numberOfIndividuals', label: 'Number of individuals', array: [] }, + { attr: 'numberOfProperties', label: 'Number of properties', array: [] }, + { attr: 'maxDepth', label: 'Max depth', array: [] }, + { attr: 'maxChildCount', label: 'Max child count', array: [] }, + { attr: 'averageChildCount', label: 'Average child count', array: [] }, + { attr: 'classesWithOneChild', label: 'Classes with one child', array: [] }, + { attr: 'classesWithMoreThan25Children', label: 'Classes with more than 25 children', + array: [] }, + { attr: 'classesWithNoDefinition', label: "Classes with no definition\t", array: [] }, + { attr: 'numberOfAxioms', label: 'Number of axioms (triples)', array: [] }] # Attributes to include. To avoid to get everything and make it faster # They are also used to get the value of each property later in the controller # TODO: define here the attributes you want to retrieve to create visualization - sub_attributes = [:submissionId, :ontology, :group, :hasDomain, :hasOntologyLanguage, :naturalLanguage, :hasLicense, - :hasFormalityLevel, :isOfType, :contact, :name, :email, :usedOntologyEngineeringTool] + sub_attributes = %i[submissionId ontology group hasDomain hasOntologyLanguage naturalLanguage hasLicense + hasFormalityLevel isOfType contact name email usedOntologyEngineeringTool] - pref_properties_attributes = [:prefLabelProperty, :synonymProperty, :definitionProperty, :authorProperty] + pref_properties_attributes = %i[prefLabelProperty synonymProperty definitionProperty authorProperty] # Be careful, if you add attributes to those lists you will need to add them when generating the JSON for the tag clouds # org_count_json_cloud and people_count_json_cloud - contributors_attr_list = [:hasContributor, :hasCreator, :curatedBy] - org_attr_list = [:fundedBy, :endorsedBy, :publisher] + contributors_attr_list = %i[hasContributor hasCreator curatedBy] + org_attr_list = %i[fundedBy endorsedBy publisher] - @relations_array = ["omv:useImports", "door:isAlignedTo", "door:ontologyRelatedTo", "omv:isBackwardCompatibleWith", "omv:isIncompatibleWith", "door:comesFromTheSameDomain", "door:similarTo", - "door:explanationEvolution", "voaf:generalizes", "door:hasDisparateModelling", "dct:hasPart", "voaf:usedBy", "schema:workTranslation", "schema:translationOfWork"] + @relations_array = ['omv:useImports', 'door:isAlignedTo', 'door:ontologyRelatedTo', 'omv:isBackwardCompatibleWith', 'omv:isIncompatibleWith', 'door:comesFromTheSameDomain', 'door:similarTo', + 'door:explanationEvolution', 'voaf:generalizes', 'door:hasDisparateModelling', 'dct:hasPart', 'voaf:usedBy', 'schema:workTranslation', 'schema:translationOfWork'] # "omv:hasPriorVersion" has been removed from this list to generate # We need prefixes to display them, we remove them to call them in the include - relations_attributes = @relations_array.map {|r| r.to_s.split(":")[1]} - metrics_attributes = @metrics_average.map {|m| m[:attr]} + relations_attributes = @relations_array.map { |r| r.to_s.split(':')[1] } + metrics_attributes = @metrics_average.map { |m| m[:attr] } # Concat all attributes array and generate a string separated with comma for include param all_attributes = sub_attributes.concat(contributors_attr_list).concat(org_attr_list) - .concat(relations_attributes).concat(metrics_attributes).concat(pref_properties_attributes).join(",") - + .concat(relations_attributes).concat(metrics_attributes).concat(pref_properties_attributes).join(',') # Special treatment for includedInDataCatalog: arrays with a lot of different values, so it trigger the SPARQL default # when we retrieve multiple attr with multiple values in the array, and make the request slower - data_catalog_submissions = LinkedData::Client::Models::OntologySubmission.all(include_status: "any", include_views: true, display_links: false, display_context: false, include: "includedInDataCatalog") + data_catalog_submissions = LinkedData::Client::Models::OntologySubmission.all(include_status: 'any', + include_views: true, display_links: false, display_context: false, include: 'includedInDataCatalog') dataCatalog_count_hash = {} # Add our Portal to the dataCatalog list dataCatalog_count_hash[$ORG_SITE] = data_catalog_submissions.length # Set all data_catalog count to 0 - $DATA_CATALOG_VALUES.map {|uri,name| dataCatalog_count_hash[name] = 0} + $DATA_CATALOG_VALUES.map { |_uri, name| dataCatalog_count_hash[name] = 0 } data_catalog_submissions.each do |catalog_sub| catalog_sub.includedInDataCatalog.each do |data_catalog| $DATA_CATALOG_VALUES.each do |uri, name| - if data_catalog[uri] - dataCatalog_count_hash[name] += 1 - end + dataCatalog_count_hash[name] += 1 if data_catalog[uri] end end end # Get all latest submissions with the needed attributes (this request can be slow) - @submissions = LinkedData::Client::Models::OntologySubmission.all(include_status: "any", include_views: true, display_links: false, display_context: false, include: all_attributes) + @submissions = LinkedData::Client::Models::OntologySubmission.all(include_status: 'any', include_views: true, + display_links: false, display_context: false, include: all_attributes) # Iterate ontologies to get the submissions with all metadata @submissions.each do |sub| ont = sub.ontology - if !sub.nil? - # Get hash of natural language use - if !sub.naturalLanguage.nil? && !sub.naturalLanguage.empty? - sub.naturalLanguage.each do |sub_lang| - # replace lexvo URI by lexvo prefix - prefixed_sub_lang = sub_lang - if sub_lang.start_with?("http://lexvo.org/id/iso639-3/") - prefixed_sub_lang = sub_lang.sub("http://lexvo.org/id/iso639-3/", "lexvo:") - end - # If lang already in hash then we increment the count of the lang in the hash - if natural_language_hash.has_key?(prefixed_sub_lang.to_s) - natural_language_hash[prefixed_sub_lang.to_s]["count"] = natural_language_hash[prefixed_sub_lang.to_s]["count"] + 1 - else - natural_language_hash[prefixed_sub_lang.to_s] = {} - natural_language_hash[prefixed_sub_lang.to_s]["count"] = 1 - natural_language_hash[prefixed_sub_lang.to_s]["uri"] = sub_lang - end + next if sub.nil? + + # Get hash of natural language use + if !sub.naturalLanguage.nil? && !sub.naturalLanguage.empty? + sub.naturalLanguage.each do |sub_lang| + next unless sub_lang.is_a?(String) + + # replace lexvo URI by lexvo prefix + prefixed_sub_lang = sub_lang + if sub_lang.start_with?('http://lexvo.org/id/iso639-3/') + prefixed_sub_lang = sub_lang.sub('http://lexvo.org/id/iso639-3/', 'lexvo:') + end + # If lang already in hash then we increment the count of the lang in the hash + if natural_language_hash.key?(prefixed_sub_lang.to_s) + natural_language_hash[prefixed_sub_lang.to_s]['count'] = + natural_language_hash[prefixed_sub_lang.to_s]['count'] + 1 + else + natural_language_hash[prefixed_sub_lang.to_s] = {} + natural_language_hash[prefixed_sub_lang.to_s]['count'] = 1 + natural_language_hash[prefixed_sub_lang.to_s]['uri'] = sub_lang end end + end - licenseProperty_hash = get_used_properties(sub.hasLicense, nil, licenseProperty_hash) + licenseProperty_hash = get_used_properties(sub.hasLicense, nil, licenseProperty_hash) - formalityProperty_hash = get_used_properties(sub.hasFormalityLevel, nil, formalityProperty_hash) + formalityProperty_hash = get_used_properties(sub.hasFormalityLevel, nil, formalityProperty_hash) - isOfTypeProperty_hash = get_used_properties(sub.isOfType, nil, isOfTypeProperty_hash) + isOfTypeProperty_hash = get_used_properties(sub.isOfType, nil, isOfTypeProperty_hash) - # Get the prefLabelProperty used for OWL properties in a hash - if sub.hasOntologyLanguage.eql?("OWL") - prefLabelProperty_hash = get_used_properties(sub.prefLabelProperty, "http://www.w3.org/2004/02/skos/core#prefLabel", prefLabelProperty_hash) + # Get the prefLabelProperty used for OWL properties in a hash + if sub.hasOntologyLanguage.eql?('OWL') + prefLabelProperty_hash = get_used_properties(sub.prefLabelProperty, + 'http://www.w3.org/2004/02/skos/core#prefLabel', prefLabelProperty_hash) - synonymProperty_hash = get_used_properties(sub.synonymProperty, "http://www.w3.org/2004/02/skos/core#altLabel", synonymProperty_hash) + synonymProperty_hash = get_used_properties(sub.synonymProperty, + 'http://www.w3.org/2004/02/skos/core#altLabel', synonymProperty_hash) - definitionProperty_hash = get_used_properties(sub.definitionProperty, "http://www.w3.org/2004/02/skos/core#definition", definitionProperty_hash) + definitionProperty_hash = get_used_properties(sub.definitionProperty, + 'http://www.w3.org/2004/02/skos/core#definition', definitionProperty_hash) - authorProperty_hash = get_used_properties(sub.authorProperty, "http://purl.org/dc/elements/1.1/creator", authorProperty_hash) - end - - get_metrics_for_average(sub) + authorProperty_hash = get_used_properties(sub.authorProperty, 'http://purl.org/dc/elements/1.1/creator', + authorProperty_hash) + end - # Count the number of classes (individuals for skos by ontologies) to get number of ontologies by slice of size - if sub.hasOntologyLanguage.eql?("SKOS") - ontology_size = sub.numberOfIndividuals + get_metrics_for_average(sub) + + # Count the number of classes (individuals for skos by ontologies) to get number of ontologies by slice of size + ontology_size = if sub.hasOntologyLanguage.eql?('SKOS') + sub.numberOfIndividuals + else + sub.numberOfClasses + end + unless ontology_size.nil? + if ontology_size >= 100_000 + size_slices_hash['100k+'] += 1 else - ontology_size = sub.numberOfClasses - end - if (!ontology_size.nil?) - if (ontology_size >= 100000) - size_slices_hash["100k+"] += 1 - else - [100, 1000, 10000, 100000].each do |slice_size| - if (ontology_size < slice_size) - size_slices_hash["< #{number_with_delimiter(slice_size, delimiter: " ")}"] += 1 - break; - end + [100, 1000, 10_000, 100_000].each do |slice_size| + if ontology_size < slice_size + size_slices_hash["< #{number_with_delimiter(slice_size, delimiter: ' ')}"] += 1 + break end end end + end - # Get number of ontologies for each format (for horizontal bar chart) - ontologyFormatsCount[sub.hasOntologyLanguage] += 1 - - # Count number of ontologies for each group (bar chart) - ont.group.each do |group| - group_acro = group.to_s.split("/")[-1] - if groups_count_hash.has_key?(group_acro) - groups_count_hash[group_acro] += 1 - else - groups_count_hash[group_acro] = 1 - end - end + # Get number of ontologies for each format (for horizontal bar chart) + ontologyFormatsCount[sub.hasOntologyLanguage] += 1 - # Count number of ontologies for each domain (bar chart) - ont.hasDomain.each do |domain| - domain_acro = domain.to_s.split("/")[-1] - if domains_count_hash.has_key?(domain_acro) - domains_count_hash[domain_acro] += 1 - else - domains_count_hash[domain_acro] = 1 - end + # Count number of ontologies for each group (bar chart) + ont.group.each do |group| + group_acro = group.to_s.split('/')[-1] + if groups_count_hash.key?(group_acro) + groups_count_hash[group_acro] += 1 + else + groups_count_hash[group_acro] = 1 end + end - # Get the count for usedOntologyEngineeringTool (to create a tag cloud) - if (engineering_tool_count.has_key?(sub.usedOntologyEngineeringTool)) - engineering_tool_count[sub.usedOntologyEngineeringTool] += 1 + # Count number of ontologies for each domain (bar chart) + ont.hasDomain.each do |domain| + domain_acro = domain.to_s.split('/')[-1] + if domains_count_hash.key?(domain_acro) + domains_count_hash[domain_acro] += 1 else - engineering_tool_count[sub.usedOntologyEngineeringTool] = 1 + domains_count_hash[domain_acro] = 1 end + end - # Get people that are mentioned as ontology actors (contact, contributors, creators, curator) to create a tag cloud - # hasContributor hasCreator contact(explore,name) curatedBy - contributors_attr_list.each do |contributor_attr| - contributor_label = sub.send(contributor_attr.to_s).to_s - if !contributor_label.nil? - contributors_split = contributor_label.split(",") - contributors_split.each do |contrib| - if people_count_hash.has_key?(contrib) - people_count_hash[contrib][contributor_attr] += 1 - else - # Create the contributor entry in the Hash and create the attr entries that will be incremented - people_count_hash[contrib] = {} - people_count_hash[contrib][:contact] = 0 - contributors_attr_list.each do |create_contributor_attr| - people_count_hash[contrib][create_contributor_attr] = 0 - end - people_count_hash[contrib][contributor_attr] += 1 - end + # Get the count for usedOntologyEngineeringTool (to create a tag cloud) + if engineering_tool_count.key?(sub.usedOntologyEngineeringTool) + engineering_tool_count[sub.usedOntologyEngineeringTool] += 1 + else + engineering_tool_count[sub.usedOntologyEngineeringTool] = 1 + end + + # Get people that are mentioned as ontology actors (contact, contributors, creators, curator) to create a tag cloud + # hasContributor hasCreator contact(explore,name) curatedBy + contributors_attr_list.each do |contributor_attr| + contributor_label = sub.send(contributor_attr.to_s).to_s + next if contributor_label.nil? + + contributors_split = contributor_label.split(',') + contributors_split.each do |contrib| + unless people_count_hash.key?(contrib) + # Create the contributor entry in the Hash and create the attr entries that will be incremented + people_count_hash[contrib] = {} + people_count_hash[contrib][:contact] = 0 + contributors_attr_list.each do |create_contributor_attr| + people_count_hash[contrib][create_contributor_attr] = 0 end end + people_count_hash[contrib][contributor_attr] += 1 end - sub.contact.each do |contact| - contributor_label = contact.name - if !contributor_label.nil? - if people_count_hash.has_key?(contributor_label) - people_count_hash[contributor_label][:contact] += 1 - else - # Create the contrinutor entry in the Hash and create the attr entries that will be incremented - people_count_hash[contributor_label] = {} - people_count_hash[contributor_label][:contact] = 0 - contributors_attr_list.each do |create_contributor_attr| - people_count_hash[contributor_label][create_contributor_attr] = 0 - end - people_count_hash[contributor_label][:contact] += 1 - end - people_count_emails[contributor_label] = contact.email if !contact.email.nil? + end + sub.contact.each do |contact| + contributor_label = contact.name + next if contributor_label.nil? + + unless people_count_hash.key?(contributor_label) + # Create the contrinutor entry in the Hash and create the attr entries that will be incremented + people_count_hash[contributor_label] = {} + people_count_hash[contributor_label][:contact] = 0 + contributors_attr_list.each do |create_contributor_attr| + people_count_hash[contributor_label][create_contributor_attr] = 0 end end + people_count_hash[contributor_label][:contact] += 1 + people_count_emails[contributor_label] = contact.email unless contact.email.nil? + end - org_attr_list.each do |org_attr| - # If the attribute object is not a list we make it a list of the single object we get - orgs_list = sub.send(org_attr.to_s) - if !orgs_list.kind_of?(Array) - orgs_list = [orgs_list] - end + org_attr_list.each do |org_attr| + # If the attribute object is not a list we make it a list of the single object we get + orgs_list = sub.send(org_attr.to_s) + orgs_list = [orgs_list] unless orgs_list.is_a?(Array) + + orgs_list.each do |orgs_comma_list| + next unless !orgs_comma_list.nil? && + (orgs_comma_split = orgs_comma_list.split(',')) + + orgs_comma_split.each do |org_str| + # TODO: handle badly formatted strings and URI + org_uri = nil + # Check if the organization is actually an URL + if org_str =~ /\A#{URI::DEFAULT_PARSER.make_regexp}\z/ + org_uri = org_str + # Remove http, www and last / from URI + org_str = org_str.sub('http://', '').sub('https://', '').sub('www.', '') + org_str = org_str[0..-2] if org_str.last.eql?('/') + + end - orgs_list.each do |orgs_comma_list| - if !orgs_comma_list.nil? && - orgs_comma_split = orgs_comma_list.split(",") - orgs_comma_split.each do |org_str| - # TODO: handle badly formatted strings and URI - org_uri = nil - # Check if the organization is actually an URL - if org_str =~ /\A#{URI::regexp}\z/ - org_uri = org_str - # Remove http, www and last / from URI - org_str = org_str.sub("http://", "").sub("https://", "").sub("www.", "") - org_str = org_str[0..-2] if org_str.last.eql?("/") - - end - - if org_count_hash.has_key?(org_str) - org_count_hash[org_str][org_attr] += 1 - else - # Create the contrinutor entry in the Hash and create the attr entries that will be incremented - org_count_hash[org_str] = {} - org_attr_list.each do |create_org_attr| - org_count_hash[org_str][create_org_attr] = 0 - end - org_count_hash[org_str][:uri] = org_uri if !org_uri.nil? - org_count_hash[org_str][org_attr] += 1 - end + unless org_count_hash.key?(org_str) + # Create the contrinutor entry in the Hash and create the attr entries that will be incremented + org_count_hash[org_str] = {} + org_attr_list.each do |create_org_attr| + org_count_hash[org_str][create_org_attr] = 0 end + org_count_hash[org_str][:uri] = org_uri unless org_uri.nil? end + org_count_hash[org_str][org_attr] += 1 end end + end - # Get ontology relations between each other (ex: STY isAlignedTo GO) - @relations_array.each do |relation_attr| - relation_values = sub.send(relation_attr.to_s.split(":")[1]) - if !relation_values.nil? && !relation_values.empty? - if !relation_values.kind_of?(Array) - relation_values = [relation_values] - end - relation_values.each do |relation_value| - target_id = relation_value - target_in_portal = false - # if we find our portal URL in the ontology URL, then we just keep the ACRONYM to try to get the ontology. - if relation_value.include?($UI_URL) - relation_value = relation_value.split('/').last - end - # Use acronym to get ontology from the portal - target_ont = LinkedData::Client::Models::Ontology.find_by_acronym(relation_value).first - if target_ont - target_id = target_ont.acronym - target_in_portal = true - end - ontology_relations_array.push({source: ont.acronym, target: target_id, relation: relation_attr.to_s, targetInPortal: target_in_portal}) - end + # Get ontology relations between each other (ex: STY isAlignedTo GO) + @relations_array.each do |relation_attr| + relation_values = sub.send(relation_attr.to_s.split(':')[1]) + next unless !relation_values.nil? && !relation_values.empty? + + relation_values = [relation_values] unless relation_values.is_a?(Array) + relation_values.each do |relation_value| + target_id = relation_value + target_in_portal = false + # if we find our portal URL in the ontology URL, then we just keep the ACRONYM to try to get the ontology. + relation_value = relation_value.split('/').last if relation_value.include?($UI_URL) + # Use acronym to get ontology from the portal + target_ont = LinkedData::Client::Models::Ontology.find_by_acronym(relation_value).first + if target_ont + target_id = target_ont.acronym + target_in_portal = true end + ontology_relations_array.push({ source: ont.acronym, target: target_id, relation: relation_attr.to_s, + targetInPortal: target_in_portal }) end end end @@ -303,7 +302,6 @@ def index metrics[:average] = (metrics[:array].sum / metrics[:array].size.to_f).round(2) end - notes_people_count_hash = {} notes_ontologies_count_hash = {} @@ -311,7 +309,8 @@ def index reviews = LinkedData::Client::Models::Review.all reviews.each do |review| notes_people_count_hash = notes_create_hash_entry(review.creator, :reviews, notes_people_count_hash) - notes_ontologies_count_hash = notes_create_hash_entry(review.ontologyReviewed, :reviews, notes_ontologies_count_hash) + notes_ontologies_count_hash = notes_create_hash_entry(review.ontologyReviewed, :reviews, + notes_ontologies_count_hash) end projects = LinkedData::Client::Models::Project.all @@ -336,47 +335,49 @@ def index notes_ontologies_json_cloud = [] notes_people_json_cloud = [] - notes_people_count_hash.each do |people,hash_counts| + notes_people_count_hash.each do |people, hash_counts| # Random color for each word in the cloud - colour = "%06x" % (rand * 0xffffff) + colour = format('%06x', (rand * 0xffffff)) title_array = [] total_count = 0 - if hash_counts.has_key?(:projects) + if hash_counts.key?(:projects) title_array.push("#{hash_counts[:projects]} projects") total_count += hash_counts[:projects] end - if hash_counts.has_key?(:notes) + if hash_counts.key?(:notes) title_array.push("#{hash_counts[:notes]} notes") total_count += hash_counts[:notes] end - if hash_counts.has_key?(:reviews) + if hash_counts.key?(:reviews) title_array.push("#{hash_counts[:reviews]} reviews") total_count += hash_counts[:reviews] end - if total_count > 0 - notes_people_json_cloud.push({"text"=>people.to_s,"weight"=>total_count, "html" => {style: "color: ##{colour};", title: title_array.join(", ")}, "link" => hash_counts[:uri]}) + if total_count.positive? + notes_people_json_cloud.push({ 'text' => people.to_s, 'weight' => total_count, + 'html' => { style: "color: ##{colour};", title: title_array.join(', ') }, 'link' => hash_counts[:uri] }) end end - notes_ontologies_count_hash.each do |onto,hash_counts| + notes_ontologies_count_hash.each do |onto, hash_counts| # Random color for each word in the cloud - colour = "%06x" % (rand * 0xffffff) + colour = format('%06x', (rand * 0xffffff)) title_array = [] total_count = 0 - if hash_counts.has_key?(:projects) + if hash_counts.key?(:projects) title_array.push("#{hash_counts[:projects]} projects") total_count += hash_counts[:projects] end - if hash_counts.has_key?(:notes) + if hash_counts.key?(:notes) title_array.push("#{hash_counts[:notes]} notes") total_count += hash_counts[:notes] end - if hash_counts.has_key?(:reviews) + if hash_counts.key?(:reviews) title_array.push("#{hash_counts[:reviews]} reviews") total_count += hash_counts[:reviews] end - if total_count > 0 - notes_ontologies_json_cloud.push({"text"=>onto.to_s,"weight"=>total_count, "html" => {style: "color: ##{colour};", title: title_array.join(", ")}, "link" => hash_counts[:uri]}) + if total_count.positive? + notes_ontologies_json_cloud.push({ 'text' => onto.to_s, 'weight' => total_count, + 'html' => { style: "color: ##{colour};", title: title_array.join(', ') }, 'link' => hash_counts[:uri] }) end end @@ -391,157 +392,168 @@ def index # Get the different people and organizations to generate a tag cloud people_count_json_cloud = [] - people_count_hash.each do |people,hash_count| + people_count_hash.each do |people, hash_count| # Random color for each word in the cloud - colour = "%06x" % (rand * 0xffffff) + colour = format('%06x', (rand * 0xffffff)) title_array = [] total_count = 0 - if hash_count[:contact] > 0 + if (hash_count[:contact]).positive? title_array.push("#{hash_count[:contact]} as contact") total_count += hash_count[:contact] end - if hash_count[:hasContributor] > 0 + if (hash_count[:hasContributor]).positive? title_array.push("#{hash_count[:hasContributor]} as contributor") total_count += hash_count[:hasContributor] end - if hash_count[:hasCreator] > 0 + if (hash_count[:hasCreator]).positive? title_array.push("#{hash_count[:hasCreator]} as creator") total_count += hash_count[:hasCreator] end - if hash_count[:curatedBy] > 0 + if (hash_count[:curatedBy]).positive? title_array.push("#{hash_count[:curatedBy]} as curator") total_count += hash_count[:curatedBy] end - title_str = "Contributions: #{title_array.join(", ")}" + title_str = "Contributions: #{title_array.join(', ')}" if total_count > 1 if people_count_emails[people.to_s].nil? - people_count_json_cloud.push({"text"=>people.to_s,"weight"=>total_count, "html" => {style: "color: ##{colour};", title: title_str}}) + people_count_json_cloud.push({ 'text' => people.to_s, 'weight' => total_count, + 'html' => { style: "color: ##{colour};", title: title_str } }) else - people_count_json_cloud.push({"text"=>people.to_s,"weight"=>total_count, "html" => {style: "color: ##{colour};", title: title_str}, "link" => "mailto:#{people_count_emails[people.to_s]}"}) + people_count_json_cloud.push({ 'text' => people.to_s, 'weight' => total_count, + 'html' => { style: "color: ##{colour};", title: title_str }, 'link' => "mailto:#{people_count_emails[people.to_s]}" }) end end end org_count_json_cloud = [] - org_count_hash.each do |org,hash_count| + org_count_hash.each do |org, hash_count| # Random color for each word in the cloud - colour = "%06x" % (rand * 0xffffff) + colour = format('%06x', (rand * 0xffffff)) title_array = [] total_count = 0 - if hash_count[:publisher] > 0 + if (hash_count[:publisher]).positive? title_array.push("published #{hash_count[:publisher]} ontologies") total_count += hash_count[:publisher] end - if hash_count[:fundedBy] > 0 + if (hash_count[:fundedBy]).positive? title_array.push("funded #{hash_count[:fundedBy]} ontologies") total_count += hash_count[:fundedBy] end - if hash_count[:endorsedBy] > 0 + if (hash_count[:endorsedBy]).positive? title_array.push("endorsed #{hash_count[:endorsedBy]} ontologies") total_count += hash_count[:endorsedBy] end - title_str = "Contributions: #{title_array.join(", ")}" + title_str = "Contributions: #{title_array.join(', ')}" if total_count > 1 - if hash_count.has_key?(:uri) - org_count_json_cloud.push({"text"=>org.to_s,"weight"=>total_count, "html" => {style: "color: ##{colour};", title: title_str}, "link" => "#{hash_count[:uri]}"}) + if hash_count.key?(:uri) + org_count_json_cloud.push({ 'text' => org.to_s, 'weight' => total_count, + 'html' => { style: "color: ##{colour};", title: title_str }, 'link' => (hash_count[:uri]).to_s }) else - org_count_json_cloud.push({"text"=>org.to_s,"weight"=>total_count, "html" => {style: "color: ##{colour};", title: title_str}}) + org_count_json_cloud.push({ 'text' => org.to_s, 'weight' => total_count, + 'html' => { style: "color: ##{colour};", title: title_str } }) end end end engineering_tool_cloud_json = [] - engineering_tool_count.each do |tool,count| + engineering_tool_count.each do |tool, count| # Random color for each word in the cloud - colour = "%06x" % (rand * 0xffffff) - engineering_tool_cloud_json.push({"text"=>tool.to_s,"weight"=>count, "html" => {style: "color: ##{colour};", title: "Used to build #{count.to_s} ontologies."}}) + colour = format('%06x', (rand * 0xffffff)) + engineering_tool_cloud_json.push({ 'text' => tool.to_s, 'weight' => count, + 'html' => { style: "color: ##{colour};", title: "Used to build #{count} ontologies." } }) end # Push the results in hash formatted for the Javascript lib that will be displaying it color_index = 0 - natural_language_hash.each do |lang,count_hash| - natural_language_json_pie.push({"label"=>lang.to_s,"value"=>count_hash["count"], "color"=>pie_colors_array[color_index], "uri"=>count_hash["uri"]}) + natural_language_hash.each do |lang, count_hash| + natural_language_json_pie.push({ 'label' => lang.to_s, 'value' => count_hash['count'], + 'color' => pie_colors_array[color_index], 'uri' => count_hash['uri'] }) color_index += 1 end color_index = 0 - licenseProperty_hash.each do |license,count_hash| - licenseProperty_json_pie.push({"label"=>license.to_s,"value"=>count_hash["count"], "color"=>pie_colors_array[color_index], "uri"=>count_hash["uri"]}) + licenseProperty_hash.each do |license, count_hash| + licenseProperty_json_pie.push({ 'label' => license.to_s, 'value' => count_hash['count'], + 'color' => pie_colors_array[color_index], 'uri' => count_hash['uri'] }) color_index += 1 end formalityLevelCount = {} - formalityProperty_hash.each do |formality_level,count_hash| + formalityProperty_hash.each do |formality_level, count_hash| # Generate formalityLevel JSON used to get the bar charts - formalityLevelCount[formality_level.to_s] = count_hash["count"] + formalityLevelCount[formality_level.to_s] = count_hash['count'] end isOfTypeCount = {} - isOfTypeProperty_hash.each do |isOfType,count_hash| - isOfTypeCount[isOfType.to_s] = count_hash["count"] + isOfTypeProperty_hash.each do |isOfType, count_hash| + isOfTypeCount[isOfType.to_s] = count_hash['count'] end color_index = 0 - prefLabelProperty_hash.each do |pref_label,count_hash| - prefLabelProperty_json_pie.push({"label"=>pref_label.to_s,"value"=>count_hash["count"], "color"=>pie_colors_array[color_index], "uri"=>count_hash["uri"]}) + prefLabelProperty_hash.each do |pref_label, count_hash| + prefLabelProperty_json_pie.push({ 'label' => pref_label.to_s, 'value' => count_hash['count'], + 'color' => pie_colors_array[color_index], 'uri' => count_hash['uri'] }) color_index += 2 end color_index = 1 - synonymProperty_hash.each do |synonym,count_hash| - synonymProperty_json_pie.push({"label"=>synonym.to_s,"value"=>count_hash["count"], "color"=>pie_colors_array[color_index], "uri"=>count_hash["uri"]}) + synonymProperty_hash.each do |synonym, count_hash| + synonymProperty_json_pie.push({ 'label' => synonym.to_s, 'value' => count_hash['count'], + 'color' => pie_colors_array[color_index], 'uri' => count_hash['uri'] }) color_index += 2 end color_index = 0 - definitionProperty_hash.each do |definition,count_hash| - definitionProperty_json_pie.push({"label"=>definition.to_s,"value"=>count_hash["count"], "color"=>pie_colors_array[color_index], "uri"=>count_hash["uri"]}) + definitionProperty_hash.each do |definition, count_hash| + definitionProperty_json_pie.push({ 'label' => definition.to_s, 'value' => count_hash['count'], + 'color' => pie_colors_array[color_index], 'uri' => count_hash['uri'] }) color_index += 2 end color_index = 1 - authorProperty_hash.each do |author,count_hash| - authorProperty_json_pie.push({"label"=>author.to_s,"value"=>count_hash["count"], "color"=>pie_colors_array[color_index], "uri"=>count_hash["uri"]}) + authorProperty_hash.each do |author, count_hash| + authorProperty_json_pie.push({ 'label' => author.to_s, 'value' => count_hash['count'], + 'color' => pie_colors_array[color_index], 'uri' => count_hash['uri'] }) color_index += 2 end # Format the ontologyFormatsCount hash as the JSON needed to generate the chart ontologyFormatsChartJson = { labels: ontologyFormatsCount.keys, - datasets: [{ label: "Number of ontologies using this format", - data: ontologyFormatsCount.values, - backgroundColor: pie_colors_array[3]}] } + datasets: [{ label: 'Number of ontologies using this format', + data: ontologyFormatsCount.values, + backgroundColor: pie_colors_array[3] }] } isOfTypeChartJson = { labels: isOfTypeCount.keys, - datasets: [{ label: "Number of ontologies of this ontology type", - data: isOfTypeCount.values, - backgroundColor: pie_colors_array[0]}] } + datasets: [{ label: 'Number of ontologies of this ontology type', + data: isOfTypeCount.values, + backgroundColor: pie_colors_array[0] }] } formalityLevelChartJson = { labels: formalityLevelCount.keys, - datasets: [{ label: "Number of ontologies of this formality level", - data: formalityLevelCount.values, - backgroundColor: pie_colors_array[2]}] } + datasets: [{ label: 'Number of ontologies of this formality level', + data: formalityLevelCount.values, + backgroundColor: pie_colors_array[2] }] } dataCatalogChartJson = { labels: dataCatalog_count_hash.keys, - datasets: [{ label: "Number of ontologies in this catalog", data: dataCatalog_count_hash.values, - backgroundColor: pie_colors_array[5]}] } + datasets: [{ label: 'Number of ontologies in this catalog', data: dataCatalog_count_hash.values, + backgroundColor: pie_colors_array[5] }] } # Format the groupOntologiesCount hash as the JSON needed to generate the chart groupCountChartJson = { labels: groups_count_hash.keys, - datasets: [{ label: "Number of ontologies", data: groups_count_hash.values, - backgroundColor: pie_colors_array[3]}] } + datasets: [{ label: 'Number of ontologies', data: groups_count_hash.values, + backgroundColor: pie_colors_array[3] }] } domainCountChartJson = { labels: domains_count_hash.keys, - datasets: [{ label: "Number of ontologies", data: domains_count_hash.values, - backgroundColor: pie_colors_array[4]}] } + datasets: [{ label: 'Number of ontologies', data: domains_count_hash.values, + backgroundColor: pie_colors_array[4] }] } # Format the groupOntologiesCount hash as the JSON needed to generate the chart sizeSlicesChartJson = { labels: size_slices_hash.keys, - datasets: [{ label: "Number of ontologies with a class count in this range", - data: size_slices_hash.values, - backgroundColor: pie_colors_array[2]}] } + datasets: [{ label: 'Number of ontologies with a class count in this range', + data: size_slices_hash.values, + backgroundColor: pie_colors_array[2] }] } # Also pass groups and hasDomain name to resolve it and better label of bar charts - groups = LinkedData::Client::Models::Group.all(include: "acronym,name,description") - domains = LinkedData::Client::Models::Category.all(include: "acronym,name,description") + groups = LinkedData::Client::Models::Group.all(include: 'acronym,name,description') + domains = LinkedData::Client::Models::Category.all(include: 'acronym,name,description') groups_info_hash = {} groups.each do |group| @@ -550,7 +562,9 @@ def index groups_info_hash[group.acronym][:name] = group.name groups_info_hash[group.acronym][:description] = [] # Slice the description in 6 words string to avoid too long sentence in the bar chart tooltip in js - group.description.split(" ").each_slice(6) {|slice| groups_info_hash[group.acronym][:description].push(slice.join(" ")) } + group.description.split(' ').each_slice(6) do |slice| + groups_info_hash[group.acronym][:description].push(slice.join(' ')) + end end domains_info_hash = {} @@ -560,61 +574,58 @@ def index domains_info_hash[domain.acronym][:name] = domain.name domains_info_hash[domain.acronym][:description] = [] # Slice the description in 6 words string to avoid too long sentence in the bar chart tooltip in js - domain.description.split(" ").each_slice(6) {|slice| domains_info_hash[domain.acronym][:description].push(slice.join(" ")) } + domain.description.split(' ').each_slice(6) do |slice| + domains_info_hash[domain.acronym][:description].push(slice.join(' ')) + end end @landscape_data = { - people_count_json_cloud: people_count_json_cloud, - org_count_json_cloud: org_count_json_cloud, - engineering_tool_cloud_json: engineering_tool_cloud_json, - notes_ontologies_json_cloud: notes_ontologies_json_cloud, - notes_people_json_cloud: notes_people_json_cloud, - natural_language_json_pie: natural_language_json_pie, - licenseProperty_json_pie: licenseProperty_json_pie, - ontology_relations_array: ontology_relations_array, - prefLabelProperty_json_pie: prefLabelProperty_json_pie, - synonymProperty_json_pie: synonymProperty_json_pie, - definitionProperty_json_pie: definitionProperty_json_pie, - authorProperty_json_pie: authorProperty_json_pie, - ontologyFormatsChartJson: ontologyFormatsChartJson, - isOfTypeChartJson: isOfTypeChartJson, - formalityLevelChartJson: formalityLevelChartJson, - dataCatalogChartJson: dataCatalogChartJson, - groupCountChartJson: groupCountChartJson, - groupsInfoHash: groups_info_hash, - domainCountChartJson: domainCountChartJson, - domainsInfoHash: domains_info_hash, - sizeSlicesChartJson: sizeSlicesChartJson + people_count_json_cloud: people_count_json_cloud, + org_count_json_cloud: org_count_json_cloud, + engineering_tool_cloud_json: engineering_tool_cloud_json, + notes_ontologies_json_cloud: notes_ontologies_json_cloud, + notes_people_json_cloud: notes_people_json_cloud, + natural_language_json_pie: natural_language_json_pie, + licenseProperty_json_pie: licenseProperty_json_pie, + ontology_relations_array: ontology_relations_array, + prefLabelProperty_json_pie: prefLabelProperty_json_pie, + synonymProperty_json_pie: synonymProperty_json_pie, + definitionProperty_json_pie: definitionProperty_json_pie, + authorProperty_json_pie: authorProperty_json_pie, + ontologyFormatsChartJson: ontologyFormatsChartJson, + isOfTypeChartJson: isOfTypeChartJson, + formalityLevelChartJson: formalityLevelChartJson, + dataCatalogChartJson: dataCatalogChartJson, + groupCountChartJson: groupCountChartJson, + groupsInfoHash: groups_info_hash, + domainCountChartJson: domainCountChartJson, + domainsInfoHash: domains_info_hash, + sizeSlicesChartJson: sizeSlicesChartJson }.to_json.html_safe - end private + # For notes takes the hash and create the entry if not already existing # To create hash like this: {"user1": {"reviews": 3, "notes": 4, "projects": 4}} def notes_create_hash_entry(uri_id, notes_type, hash) id = uri_id.split('/').last - if !hash.has_key?(id) - hash[id] = {uri: uri_id} - end - if !hash[id].has_key?(notes_type) + hash[id] = { uri: uri_id } unless hash.key?(id) + if !hash[id].key?(notes_type) hash[id][notes_type] = 1 else hash[id][notes_type] += 1 end - return hash + hash end - ## # Add metrics metadata from the param sub to the @metrics_average var to get the average for each metrics def get_metrics_for_average(sub) # Adding metrics to their arrays @metrics_average.each do |metrics| - if !sub.send(metrics[:attr]).nil? - metrics[:array].push(sub.send(metrics[:attr])) - end + metrics[:array].push(sub.send(metrics[:attr])) unless sub.send(metrics[:attr]).nil? end end @@ -624,9 +635,8 @@ def get_metrics_for_average(sub) def get_used_properties(attr_value, default_property, property_hash) if attr_value.nil? || attr_value.empty? # if property null then we increment the default value - if default_property.nil? - return property_hash - end + return property_hash if default_property.nil? + attr_value = default_property else attr_value = attr_value.to_s @@ -637,18 +647,18 @@ def get_used_properties(attr_value, default_property, property_hash) RESOLVE_NAMESPACE.each do |prefix, namespace| if attr_value.start_with?(namespace) prefixed_attr_value = attr_value.sub(namespace, "#{prefix}:") - break; + break end end # If attribute value property already in hash then we increment the count of the property in the hash - if property_hash.has_key?(prefixed_attr_value) - property_hash[prefixed_attr_value]["count"] += 1 + if property_hash.key?(prefixed_attr_value) + property_hash[prefixed_attr_value]['count'] += 1 else property_hash[prefixed_attr_value] = {} - property_hash[prefixed_attr_value]["count"] = 1 - property_hash[prefixed_attr_value]["uri"] = attr_value + property_hash[prefixed_attr_value]['count'] = 1 + property_hash[prefixed_attr_value]['uri'] = attr_value end - return property_hash + property_hash end end diff --git a/app/controllers/language_controller.rb b/app/controllers/language_controller.rb index ed1ec7c79d..dde8656a15 100644 --- a/app/controllers/language_controller.rb +++ b/app/controllers/language_controller.rb @@ -1,21 +1,21 @@ -class LanguageController < ApplicationController - - # set locale to the language selected by the user - def set_locale_language - language = params[:language].strip.downcase.to_sym - supported_languages = I18n.available_locales +# frozen_string_literal: true - if language - if supported_languages.include?(language) - cookies.permanent[:locale] = language - else - # in case we want to show a message if the language is not available - flash.now[:notice] = "#{language} translation not available" - logger.error flash.now[:notice] - end - end +class LanguageController < ApplicationController + # set locale to the language selected by the user + def set_locale_language + language = params[:language].strip.downcase.to_sym + supported_languages = I18n.available_locales - redirect_to request.referer || root_path + if language + if supported_languages.include?(language) + cookies.permanent[:locale] = language + else + # in case we want to show a message if the language is not available + flash.now[:notice] = "#{language} translation not available" + logger.error flash.now[:notice] + end end + redirect_to request.referer || root_path + end end diff --git a/app/controllers/login_controller.rb b/app/controllers/login_controller.rb index aa50c31b9a..9cbc2b66e0 100755 --- a/app/controllers/login_controller.rb +++ b/app/controllers/login_controller.rb @@ -1,5 +1,6 @@ -class LoginController < ApplicationController +# frozen_string_literal: true +class LoginController < ApplicationController layout :determine_layout def index @@ -7,7 +8,7 @@ def index if params[:redirect] # Get the original, encoded redirect uri = URI.parse(request.url) - orig_params = Hash[uri.query.split("&").map {|e| e.split("=",2)}].symbolize_keys + orig_params = Hash[uri.query.split('&').map { |e| e.split('=', 2) }].symbolize_keys session[:redirect] = orig_params[:redirect] else session[:redirect] = request.referer @@ -17,53 +18,48 @@ def index # logs in a user def create @errors = validate(params[:user]) - if @errors.size < 1 + if @errors.empty? logged_in_user = LinkedData::Client::Models::User.authenticate(params[:user][:username], params[:user][:password]) if logged_in_user && !logged_in_user.errors login(logged_in_user) - redirect = "/" - - if session[:redirect] - redirect = CGI.unescape(session[:redirect]) - end + redirect = '/' + redirect = CGI.unescape(session[:redirect]) if session[:redirect] redirect_to redirect else - @errors << "Invalid account name/password combination" - render :action => 'index' + @errors << 'Invalid account name/password combination' + render action: 'index' end else - render :action => 'index' + render action: 'index' end end - def create_omniauth auth_data = request.env['omniauth.auth'] auth_code = auth_data.credentials.token token_provider = helpers.omniauth_token_provider(params[:provider]) - logged_in_user = LinkedData::Client::HTTP.post("#{LinkedData::Client.settings.rest_url}/users/authenticate", { access_token: auth_code , token_provider: token_provider}) + logged_in_user = LinkedData::Client::HTTP.post("#{LinkedData::Client.settings.rest_url}/users/authenticate", + { access_token: auth_code, token_provider: token_provider }) if logged_in_user && !logged_in_user.errors login(logged_in_user) - redirect = "/" + redirect = '/' - if session[:redirect] - redirect = CGI.unescape(session[:redirect]) - end + redirect = CGI.unescape(session[:redirect]) if session[:redirect] redirect_to redirect else - @errors = ["#{params[:provider]} authentication failed"] - render :action => 'index' + @errors = ["#{params[:provider]} authentication failed"] + render action: 'index' end end # Login as the provided username (only for admin users) def login_as - unless session[:user] && session[:user].admin? - redirect_to "/" + unless session[:user]&.admin? + redirect_to '/' return end @@ -76,8 +72,8 @@ def login_as session[:user].apikey = session[:admin_user].apikey end - #redirect_to request.referer rescue redirect_to "/" - redirect_to "/" + # redirect_to request.referer rescue redirect_to "/" + redirect_to '/' end # logs out a user @@ -86,32 +82,30 @@ def destroy old_user = session[:user] session[:user] = session[:admin_user] session.delete(:admin_user) - flash[:success] = "Logged out #{old_user.username}, returned to #{session[:user].username}".html_safe + flash[:success] = + "Logged out #{old_user.username}, returned to #{session[:user].username}".html_safe else session[:user] = nil - flash[:success] = "You have successfully logged out" + flash[:success] = 'You have successfully logged out' end - redirect_to request.referer || "/" + redirect_to request.referer || '/' end - def lost_password - end - - def lost_password_success - end + def lost_password; end + def lost_password_success; end # Sends a new password to the user def send_pass username = params[:user][:account_name] email = params[:user][:email] - resp = LinkedData::Client::HTTP.post("/users/create_reset_password_token", {username: username, email: email}) + resp = LinkedData::Client::HTTP.post('/users/create_reset_password_token', { username: username, email: email }) if resp.nil? - redirect_to "/lost_pass_success" + redirect_to '/lost_pass_success' else - flash[:notice] = resp.errors.first + ". Please try again." - redirect_to "/lost_pass" + flash[:notice] = "#{resp.errors.first}. Please try again." + redirect_to '/lost_pass' end end @@ -119,14 +113,14 @@ def reset_password username = params[:un] email = params[:em] token = params[:tk] - @user = LinkedData::Client::HTTP.post("/users/reset_password", {username: username, email: email, token: token}) + @user = LinkedData::Client::HTTP.post('/users/reset_password', { username: username, email: email, token: token }) if @user.is_a?(LinkedData::Client::Models::User) @user.validate_password = true login(@user) - render "users/edit" + render 'users/edit' else - flash[:notice] = @user.errors.first + ". Please reset your password again." - redirect_to "/lost_pass" + flash[:notice] = "#{@user.errors.first}. Please reset your password again." + redirect_to '/lost_pass' end end @@ -134,24 +128,19 @@ def reset_password def login(user) return unless user + session[:user] = user - custom_ontologies_text = session[:user].customOntology && !session[:user].customOntology.empty? ? "The display is now based on your Custom Ontology Set." : "" - notice = "Welcome " + user.username.to_s + "! " + custom_ontologies_text + custom_ontologies_text = session[:user].customOntology && !session[:user].customOntology.empty? ? "The display is now based on your Custom Ontology Set." : '' + notice = "Welcome #{user.username}! #{custom_ontologies_text}" flash[:success] = notice.html_safe end def validate(params) - errors=[] + errors = [] - if params[:username].nil? || params[:username].length <1 - errors << "Please enter an account name" - end - if params[:password].nil? || params[:password].length <1 - errors << "Please enter a password" - end + errors << 'Please enter an account name' if params[:username].nil? || params[:username].empty? + errors << 'Please enter a password' if params[:password].nil? || params[:password].empty? - return errors + errors end - - end diff --git a/app/controllers/mappings_controller.rb b/app/controllers/mappings_controller.rb index b8baeda3a7..c5361be2fd 100644 --- a/app/controllers/mappings_controller.rb +++ b/app/controllers/mappings_controller.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'cgi' class MappingsController < ApplicationController @@ -7,15 +9,15 @@ class MappingsController < ApplicationController include MappingsHelper include TurboHelper layout :determine_layout - before_action :authorize_and_redirect, only: [:create, :new, :destroy] + before_action :authorize_and_redirect, only: %i[create new destroy] - EXTERNAL_URL_PARAM_STR = "mappings:external" - INTERPORTAL_URL_PARAM_STR = "interportal:" + EXTERNAL_URL_PARAM_STR = 'mappings:external' + INTERPORTAL_URL_PARAM_STR = 'interportal:' INTERPORTAL_HASH = $INTERPORTAL_HASH ||= {} def index - ontology_list = LinkedData::Client::Models::Ontology.all.select { |o| !o.summaryOnly } + ontology_list = LinkedData::Client::Models::Ontology.all.reject(&:summaryOnly) ontologies_mapping_count = LinkedData::Client::HTTP.get("#{MAPPINGS_URL}/statistics/ontologies") ontologies_hash = {} ontology_list.each do |ontology| @@ -32,16 +34,24 @@ def index # Adding external and interportal mappings to the dropdown list if ontology_acronym.to_s == EXTERNAL_MAPPINGS_GRAPH mapping_count = ontologies_mapping_count[ontology_acronym.to_s] || 0 - select_text = "External Mappings (#{number_with_delimiter(mapping_count, delimiter: ',')})" if mapping_count >= 0 + if mapping_count >= 0 + select_text = "External Mappings (#{number_with_delimiter(mapping_count, + delimiter: ',')})" + end ontology_acronym = EXTERNAL_URL_PARAM_STR elsif ontology_acronym.to_s.start_with?(INTERPORTAL_MAPPINGS_GRAPH) mapping_count = ontologies_mapping_count[ontology_acronym.to_s] || 0 - select_text = "Interportal Mappings - #{ontology_acronym.to_s.split("/")[-1].upcase} (#{number_with_delimiter(mapping_count, delimiter: ',')})" if mapping_count >= 0 - ontology_acronym = INTERPORTAL_URL_PARAM_STR + ontology_acronym.to_s.split("/")[-1] + if mapping_count >= 0 + select_text = "Interportal Mappings - #{ontology_acronym.to_s.split('/')[-1].upcase} (#{number_with_delimiter( + mapping_count, delimiter: ',' + )})" + end + ontology_acronym = INTERPORTAL_URL_PARAM_STR + ontology_acronym.to_s.split('/')[-1] else ontology = ontologies_hash[ontology_acronym.to_s] mapping_count = ontologies_mapping_count[ontology_acronym] || 0 - next unless ontology && mapping_count > 0 + next unless ontology && mapping_count.positive? + select_text = "#{ontology.name} - #{ontology.acronym} (#{number_with_delimiter(mapping_count, delimiter: ',')})" end @options[select_text] = ontology_acronym @@ -59,21 +69,21 @@ def count def loader @example_code = [{ - "classes": ["http://bioontology.org/ontologies/BiomedicalResourceOntology.owl#Image_Algorithm", - "http://purl.org/incf/ontology/Computational_Neurosciences/cno_alpha.owl#cno_0000202"], - - "name": 'This is the mappings produced to test the bulk load', - "source": 'https://w3id.org/semapv/LexicalMatching', - "comment": 'mock data', - "relation": [ - 'http://www.w3.org/2002/07/owl#subClassOf' - ], - "subject_source_id": 'http://bioontology.org/ontologies/BiomedicalResources.owl', - "object_source_id": 'http://purl.org/incf/ontology/Computational_Neurosciences/cno_alpha.owl', - "source_name": 'https://w3id.org/sssom/mapping/tests/data/basic.tsv', - "source_contact_info": 'orcid:1234,orcid:5678', - "date": '2020-05-30' - }] + "classes": ['http://bioontology.org/ontologies/BiomedicalResourceOntology.owl#Image_Algorithm', + 'http://purl.org/incf/ontology/Computational_Neurosciences/cno_alpha.owl#cno_0000202'], + + "name": 'This is the mappings produced to test the bulk load', + "source": 'https://w3id.org/semapv/LexicalMatching', + "comment": 'mock data', + "relation": [ + 'http://www.w3.org/2002/07/owl#subClassOf' + ], + "subject_source_id": 'http://bioontology.org/ontologies/BiomedicalResources.owl', + "object_source_id": 'http://purl.org/incf/ontology/Computational_Neurosciences/cno_alpha.owl', + "source_name": 'https://w3id.org/sssom/mapping/tests/data/basic.tsv', + "source_contact_info": 'orcid:1234,orcid:5678', + "date": '2020-05-30' + }] render partial: 'mappings/bulk_loader/loader' end @@ -99,7 +109,6 @@ def show respond_to do |format| format.html { render 'mappings/edit', layout: false } end - end def show_mappings @@ -111,9 +120,9 @@ def show_mappings if @ontology.nil? ontology_acronym = params[:id] if params[:id] == EXTERNAL_URL_PARAM_STR - @ontology_name = "External Mappings" + @ontology_name = 'External Mappings' elsif params[:id].start_with?(INTERPORTAL_URL_PARAM_STR) - @ontology_name = params[:id].sub(":", " - ") + @ontology_name = params[:id].sub(':', ' - ') end else ontology_acronym = @ontology.acronym @@ -122,10 +131,10 @@ def show_mappings if @target_ontology.nil? if params[:target] == EXTERNAL_MAPPINGS_GRAPH target_acronym = EXTERNAL_URL_PARAM_STR - @target_ontology_name = "External Mappings" + @target_ontology_name = 'External Mappings' elsif params[:target].start_with?(INTERPORTAL_MAPPINGS_GRAPH) - target_acronym = "#{INTERPORTAL_URL_PARAM_STR}:#{params[:target].split("/")[-1]}" - @target_ontology_name = "Interportal - #{params[:target].split("/")[-1].upcase}" + target_acronym = "#{INTERPORTAL_URL_PARAM_STR}:#{params[:target].split('/')[-1]}" + @target_ontology_name = "Interportal - #{params[:target].split('/')[-1].upcase}" end else target_acronym = @target_ontology.acronym @@ -134,7 +143,7 @@ def show_mappings ontologies = [ontology_acronym, target_acronym] - @mapping_pages = LinkedData::Client::HTTP.get("#{MAPPINGS_URL}", { page: page, ontologies: ontologies.join(',') }) + @mapping_pages = LinkedData::Client::HTTP.get(MAPPINGS_URL.to_s, { page: page, ontologies: ontologies.join(',') }) @mappings = @mapping_pages.collection @delete_mapping_permission = check_delete_mapping_permission(@mappings) @@ -148,7 +157,8 @@ def show_mappings total_results = @mapping_pages.pageCount * @mapping_pages.collection.length # This converts the mappings into an object that can be used with the pagination plugin - @page_results = WillPaginate::Collection.create(@mapping_pages.page, @mapping_pages.collection.length, total_results) do |pager| + @page_results = WillPaginate::Collection.create(@mapping_pages.page, @mapping_pages.collection.length, + total_results) do |pager| pager.replace(@mapping_pages.collection) end @@ -163,10 +173,9 @@ def get_concept_table @delete_mapping_permission = check_delete_mapping_permission(@mappings) render turbo_stream: [ - replace('mapping_count') { "#{@mappings.size}" }, + replace('mapping_count') { @mappings.size.to_s }, replace('concept_mappings', partial: 'mappings/concept_mappings') ] - end def new @@ -220,12 +229,12 @@ def update else render_turbo_stream( alert_success { 'Mapping updated' }, - replace(@mapping.id.split('/').last, partial: 'show_line', locals: { map: request_mapping, concept: @concept }) + replace(@mapping.id.split('/').last, partial: 'show_line', + locals: { map: request_mapping, concept: @concept }) ) end end end - end def destroy @@ -253,7 +262,6 @@ def destroy end format.html { render json: { success: success_text, error: error } } end - end private @@ -294,13 +302,13 @@ def mapping_form(mapping: nil) end @mapping_relation_options = [ - ["Identical (skos:exactMatch)", "http://www.w3.org/2004/02/skos/core#exactMatch"], - ["Similar (skos:closeMatch)", "http://www.w3.org/2004/02/skos/core#closeMatch"], - ["Related (skos:relatedMatch)", "http://www.w3.org/2004/02/skos/core#relatedMatch"], - ["Broader (skos:broadMatch)", "http://www.w3.org/2004/02/skos/core#broadMatch"], - ["Narrower (skos:narrowMatch)", "http://www.w3.org/2004/02/skos/core#narrowMatch"], - ["Translation (gold:translation)", "http://purl.org/linguistics/gold/translation"], - ["Free Translation (gold:freeTranslation)", "http://purl.org/linguistics/gold/freeTranslation"] + ['Identical (skos:exactMatch)', 'http://www.w3.org/2004/02/skos/core#exactMatch'], + ['Similar (skos:closeMatch)', 'http://www.w3.org/2004/02/skos/core#closeMatch'], + ['Related (skos:relatedMatch)', 'http://www.w3.org/2004/02/skos/core#relatedMatch'], + ['Broader (skos:broadMatch)', 'http://www.w3.org/2004/02/skos/core#broadMatch'], + ['Narrower (skos:narrowMatch)', 'http://www.w3.org/2004/02/skos/core#narrowMatch'], + ['Translation (gold:translation)', 'http://purl.org/linguistics/gold/translation'], + ['Free Translation (gold:freeTranslation)', 'http://purl.org/linguistics/gold/freeTranslation'] ] @mapping_name = mapping.process&.name @mapping_comment = mapping.process&.comment @@ -341,9 +349,7 @@ def request_mapping def valid_values?(values) errors = [] - if values[:classes].reject(&:blank?).size != 2 - errors << 'Source and target concepts need to be specified' - end + errors << 'Source and target concepts need to be specified' if values[:classes].reject(&:blank?).size != 2 errors end end diff --git a/app/controllers/ncbo_annotatorplus_controller.rb b/app/controllers/ncbo_annotatorplus_controller.rb index d6a418a304..0fcb9caeb4 100644 --- a/app/controllers/ncbo_annotatorplus_controller.rb +++ b/app/controllers/ncbo_annotatorplus_controller.rb @@ -1,6 +1,8 @@ +# frozen_string_literal: true + class NcboAnnotatorplusController < ApplicationController layout :determine_layout - + before_action :check_ncbo_annotatorplus_enabled NCBO_ANNOTATOR_URI = $NCBO_ANNOTATOR_URL @@ -11,91 +13,95 @@ def index @semantic_groups_for_select = [] @semantic_types ||= get_semantic_types @sem_type_ont = LinkedData::Client::Models::Ontology.find_by_acronym('STY').first - @semantic_groups ||= {"ACTI" => "Activities & Behaviors", "ANAT" => "Anatomy", "CHEM" => "Chemicals & Drugs","CONC" => "Concepts & Ideas", - "DEVI" => "Devices", "DISO" => "Disorders", "GENE" => "Genes & Molecular Sequences", "GEOG" => "Geographic Areas", "LIVB" => "Living Beings", - "OBJC" => "Objects", "OCCU" => "Occupations", "ORGA" => "Organizations", "PHEN" => "Phenomena", "PHYS" => "Physiology","PROC" => "Procedures"} + @semantic_groups ||= { 'ACTI' => 'Activities & Behaviors', 'ANAT' => 'Anatomy', 'CHEM' => 'Chemicals & Drugs', 'CONC' => 'Concepts & Ideas', + 'DEVI' => 'Devices', 'DISO' => 'Disorders', 'GENE' => 'Genes & Molecular Sequences', 'GEOG' => 'Geographic Areas', 'LIVB' => 'Living Beings', + 'OBJC' => 'Objects', 'OCCU' => 'Occupations', 'ORGA' => 'Organizations', 'PHEN' => 'Phenomena', 'PHYS' => 'Physiology', 'PROC' => 'Procedures' } @semantic_types.each_pair do |code, label| @semantic_types_for_select << ["#{label} (#{code})", code] end @semantic_groups.each_pair do |group, label| @semantic_groups_for_select << ["#{label} (#{group})", group] end - @semantic_types_for_select.sort! {|a,b| a[0] <=> b[0]} - @semantic_groups_for_select.sort! {|a,b| a[0] <=> b[0]} - @recognizers = parse_json(REST_URI + "/annotator/recognizers") + @semantic_types_for_select.sort! { |a, b| a[0] <=> b[0] } + @semantic_groups_for_select.sort! { |a, b| a[0] <=> b[0] } + @recognizers = parse_json("#{REST_URI}/annotator/recognizers") @annotator_ontologies = LinkedData::Client::Models::Ontology.all @ontologies_for_select = get_ontologies_for_select end - def create params[:mappings] ||= [] params[:max_level] ||= 0 params[:ontologies] ||= [] params[:semantic_types] ||= [] params[:semantic_groups] ||= [] - text_to_annotate = params[:text].strip.gsub("\r\n", " ").gsub("\n", " ") - - options = { :ontologies => params[:ontologies], - :class_hierarchy_max_level => params[:class_hierarchy_max_level].to_i, - :expand_class_hierarchy => params[:class_hierarchy_max_level].to_i > 0, - :semantic_types => params[:semantic_types], - :semantic_groups => params[:semantic_groups], - :mappings => params[:mappings], - :longest_only => params[:longest_only], - :exclude_numbers => params[:exclude_numbers] ||= "false", # service default is false - :whole_word_only => params[:whole_word_only] ||= "true", # service default is true - :exclude_synonyms => params[:exclude_synonyms] ||= "false", # service default is false - :fast_context => params[:fast_context] ||= "false", # service default is false - :score => params[:score], - :score_threshold => params[:score_threshold] ||=-1, - :confidence_threshold => params[:confidence_threshold] ||=-1, - :ncbo_slice => params[:ncbo_slice] || '' - } + text_to_annotate = params[:text].strip.gsub("\r\n", ' ').gsub("\n", ' ') + + options = { ontologies: params[:ontologies], + class_hierarchy_max_level: params[:class_hierarchy_max_level].to_i, + expand_class_hierarchy: params[:class_hierarchy_max_level].to_i.positive?, + semantic_types: params[:semantic_types], + semantic_groups: params[:semantic_groups], + mappings: params[:mappings], + longest_only: params[:longest_only], + exclude_numbers: params[:exclude_numbers] ||= 'false', # service default is false + whole_word_only: params[:whole_word_only] ||= 'true', # service default is true + exclude_synonyms: params[:exclude_synonyms] ||= 'false', # service default is false + fast_context: params[:fast_context] ||= 'false', # service default is false + score: params[:score], + score_threshold: params[:score_threshold] ||= -1, + confidence_threshold: params[:confidence_threshold] ||= -1, + ncbo_slice: params[:ncbo_slice] || '' } start = Time.now query = NCBO_ANNOTATOR_URI - query += "?text=" + CGI.escape(text_to_annotate) - query += "&apikey=" + NCBO_API_KEY - query += "&include=prefLabel" - query += "&expand_class_hierarchy=true" if options[:class_hierarchy_max_level] > 0 - query += "&class_hierarchy_max_level=" + options[:class_hierarchy_max_level].to_s if options[:class_hierarchy_max_level] > 0 - query += "&score=" + options[:score] unless options[:score] == "" - query += "&score_threshold=" + options[:score_threshold] unless options[:score] == "" or options[:score_threshold]==-1 - query += "&confidence_threshold=" + options[:confidence_threshold] unless options[:score] == "" or options[:confidence_threshold]==-1 - query += "&fast_context=" + options[:fast_context] unless options[:fast_context].empty? - query += "&ontologies=" + CGI.escape(options[:ontologies].join(',')) unless options[:ontologies].empty? - query += "&semantic_types=" + options[:semantic_types].join(',') unless options[:semantic_types].empty? - query += "&semantic_groups=" + options[:semantic_groups].join(',') unless options[:semantic_groups].empty? - query += "&mappings=" + options[:mappings].join(',') unless options[:mappings].empty? + query += "?text=#{CGI.escape(text_to_annotate)}" + query += "&apikey=#{NCBO_API_KEY}" + query += '&include=prefLabel' + query += '&expand_class_hierarchy=true' if (options[:class_hierarchy_max_level]).positive? + if (options[:class_hierarchy_max_level]).positive? + query += "&class_hierarchy_max_level=#{options[:class_hierarchy_max_level]}" + end + query += "&score=#{options[:score]}" unless options[:score] == '' + unless (options[:score] == '') || (options[:score_threshold] == -1) + query += "&score_threshold=#{options[:score_threshold]}" + end + unless (options[:score] == '') || (options[:confidence_threshold] == -1) + query += "&confidence_threshold=#{options[:confidence_threshold]}" + end + query += "&fast_context=#{options[:fast_context]}" unless options[:fast_context].empty? + query += "&ontologies=#{CGI.escape(options[:ontologies].join(','))}" unless options[:ontologies].empty? + query += "&semantic_types=#{options[:semantic_types].join(',')}" unless options[:semantic_types].empty? + query += "&semantic_groups=#{options[:semantic_groups].join(',')}" unless options[:semantic_groups].empty? + query += "&mappings=#{options[:mappings].join(',')}" unless options[:mappings].empty? query += "&longest_only=#{options[:longest_only]}" query += "&recognizer=#{params[:recognizer]}" - query += "&exclude_numbers=" + options[:exclude_numbers].to_s unless options[:exclude_numbers].empty? - query += "&whole_word_only=" + options[:whole_word_only].to_s unless options[:whole_word_only].empty? - query += "&exclude_synonyms=" + options[:exclude_synonyms].to_s unless options[:exclude_synonyms].empty? - query += "&ncbo_slice=" + options[:ncbo_slice].to_s unless options[:ncbo_slice].empty? + query += "&exclude_numbers=#{options[:exclude_numbers]}" unless options[:exclude_numbers].empty? + query += "&whole_word_only=#{options[:whole_word_only]}" unless options[:whole_word_only].empty? + query += "&exclude_synonyms=#{options[:exclude_synonyms]}" unless options[:exclude_synonyms].empty? + query += "&ncbo_slice=#{options[:ncbo_slice]}" unless options[:ncbo_slice].empty? annotations = parse_json(query) # See application_controller.rb - #annotations = LinkedData::Client::HTTP.get(query) + # annotations = LinkedData::Client::HTTP.get(query) LOG.add :debug, "Query: #{query}" LOG.add :debug, "Retrieved #{annotations.length} annotations: #{Time.now - start}s" - if annotations.empty? || params[:raw] == "true" + if annotations.empty? || params[:raw] == 'true' # TODO: if params contains select ontologies and/or semantic types, only return those selected. response = { - annotations: annotations, - ontologies: get_simplified_ontologies_hash, # application_controller - semantic_types: get_semantic_types # application_controller + annotations: annotations, + ontologies: get_simplified_ontologies_hash, # application_controller + semantic_types: get_semantic_types # application_controller } else massage_annotated_classes(annotations, options) response = { - annotations: annotations, - ontologies: {}, # ontology data are in annotations already. - semantic_types: {} # semantic types are in annotations already. + annotations: annotations, + ontologies: {}, # ontology data are in annotations already. + semantic_types: {} # semantic types are in annotations already. } end - render :json => response + render json: response end private @@ -104,11 +110,12 @@ def get_semantic_types semantic_types = {} sty_ont = LinkedData::Client::Models::Ontology.find_by_acronym('STY').first return semantic_types if sty_ont.nil? + # The first 500 items should be more than sufficient to get all semantic types. - sty_classes = sty_ont.explore.classes({'pagesize'=>500, include: 'prefLabel'}) + sty_classes = sty_ont.explore.classes({ 'pagesize' => 500, include: 'prefLabel' }) sty_classes.collection.each do |cls| - code = cls.id.split("/").last - semantic_types[ code ] = cls.prefLabel + code = cls.id.split('/').last + semantic_types[code] = cls.prefLabel end semantic_types end @@ -122,13 +129,13 @@ def massage_annotated_classes(annotations, options) class_details = get_annotated_classes(annotations, semantic_types) simplify_annotated_classes(annotations, class_details) # repeat the simplification for any annotation hierarchy or mappings. - hierarchy = annotations.map {|a| a if a.keys.include? 'hierarchy' }.compact + hierarchy = annotations.map { |a| a if a.keys.include? 'hierarchy' }.compact hierarchy.each do |a| - simplify_annotated_classes(a['hierarchy'], class_details) if not a['hierarchy'].empty? + simplify_annotated_classes(a['hierarchy'], class_details) unless a['hierarchy'].empty? end - mappings = annotations.map {|a| a if a.keys.include? 'mappings' }.compact + mappings = annotations.map { |a| a if a.keys.include? 'mappings' }.compact mappings.each do |a| - simplify_annotated_classes(a['mappings'], class_details) if not a['mappings'].empty? + simplify_annotated_classes(a['mappings'], class_details) unless a['mappings'].empty? end LOG.add :debug, "Completed massage for annotated classes: #{Time.now - start}s" end @@ -151,56 +158,58 @@ def simplify_annotated_classes(annotations, class_details) end def get_annotated_class_hash(a) - return { - :class => a['annotatedClass']['@id'], - :ontology => a['annotatedClass']['links']['ontology'] + { + class: a['annotatedClass']['@id'], + ontology: a['annotatedClass']['links']['ontology'] } end - def get_annotated_classes(annotations, semantic_types=[]) + def get_annotated_classes(annotations, semantic_types = []) # Use batch service to get class prefLabels class_list = [] - annotations.each {|a| class_list << get_annotated_class_hash(a) } - hierarchy = annotations.map {|a| a if a.keys.include? 'hierarchy' }.compact + annotations.each { |a| class_list << get_annotated_class_hash(a) } + hierarchy = annotations.map { |a| a if a.keys.include? 'hierarchy' }.compact hierarchy.each do |a| - a['hierarchy'].each {|h| class_list << get_annotated_class_hash(h) } + a['hierarchy'].each { |h| class_list << get_annotated_class_hash(h) } end - mappings = annotations.map {|a| a if a.keys.include? 'mappings' }.compact + mappings = annotations.map { |a| a if a.keys.include? 'mappings' }.compact mappings.each do |a| - a['mappings'].each {|m| class_list << get_annotated_class_hash(m) } + a['mappings'].each { |m| class_list << get_annotated_class_hash(m) } end classes_simple = {} return classes_simple if class_list.empty? + # remove duplicates class_set = class_list.to_set # get unique class:ontology set class_list = class_set.to_a # collection requires a list in batch call # make the batch call properties = 'prefLabel' - properties = 'prefLabel,semanticType' if not semantic_types.empty? - call_params = {'http://www.w3.org/2002/07/owl#Class'=>{'collection'=>class_list, 'include'=>properties}} + properties = 'prefLabel,semanticType' unless semantic_types.empty? + call_params = { 'http://www.w3.org/2002/07/owl#Class' => { 'collection' => class_list, 'include' => properties } } classes_json = get_batch_results(call_params) # Simplify the response data for the UI @ontologies_hash ||= get_simplified_ontologies_hash # application_controller classes_data = JSON.parse(classes_json) - classes_data["http://www.w3.org/2002/07/owl#Class"].each do |cls| + classes_data['http://www.w3.org/2002/07/owl#Class'].each do |cls| c = simplify_class_model(cls) - ont_details = @ontologies_hash[ c[:ontology] ] + ont_details = @ontologies_hash[c[:ontology]] next if ont_details.nil? # NO DISPLAY FOR ANNOTATIONS ON ANY CLASS OUTSIDE THE BIOPORTAL ONTOLOGY SET. + c[:ontology] = ont_details - unless semantic_types.empty? || cls['semanticType'].nil? - @semantic_types ||= get_semantic_types # application_controller + if semantic_types.empty? || cls['semanticType'].nil? + c[:semantic_types] = [] + else + @semantic_types ||= get_semantic_types # application_controller # Extract the semantic type descriptions that are requested. semanticTypeURI = 'http://bioportal.bioontology.org/ontologies/umls/sty/' - semanticCodes = cls['semanticType'].map {|t| t.sub( semanticTypeURI, '') } - requestedCodes = semanticCodes.map {|code| (semantic_types.include? code and code) || nil }.compact - requestedDescriptions = requestedCodes.map {|code| @semantic_types[code] }.compact + semanticCodes = cls['semanticType'].map { |t| t.sub(semanticTypeURI, '') } + requestedCodes = semanticCodes.map { |code| (semantic_types.include? code and code) || nil }.compact + requestedDescriptions = requestedCodes.map { |code| @semantic_types[code] }.compact c[:semantic_types] = requestedDescriptions - else - c[:semantic_types] = [] end classes_simple[c[:id]] = c end - return classes_simple + classes_simple end # Get the ontologies from NCBO to populate select onto for the Annotator plus @@ -212,13 +221,12 @@ def get_ontologies_for_select ontologies_array.push(["#{onto['name']} (#{onto['acronym']})", onto['acronym']]) end - return ontologies_array + ontologies_array end - + protected - + def check_ncbo_annotatorplus_enabled - raise ActionController::RoutingError.new('Not Found') unless $NCBO_ANNOTATORPLUS_ENABLED == true + raise ActionController::RoutingError, 'Not Found' unless $NCBO_ANNOTATORPLUS_ENABLED == true end - end diff --git a/app/controllers/notes_controller.rb b/app/controllers/notes_controller.rb index b47208ac24..a466fe67cc 100644 --- a/app/controllers/notes_controller.rb +++ b/app/controllers/notes_controller.rb @@ -1,11 +1,13 @@ +# frozen_string_literal: true + class NotesController < ApplicationController include TurboHelper layout 'ontology' NOTES_PROPOSAL_TYPES = { - ProposalNewClass: "New Class Proposal", - ProposalChangeHierarchy: "New Relationship Proposal", - ProposalChangeProperty: "Change Property Value Proposal" - } + ProposalNewClass: 'New Class Proposal', + ProposalChangeHierarchy: 'New Relationship Proposal', + ProposalChangeProperty: 'Change Property Value Proposal' + }.freeze def show id = clean_note_id(params[:id]) @@ -13,10 +15,10 @@ def show @note = LinkedData::Client::Models::Note.get(id, include_threads: true) @ontology = (@notes.explore.relatedOntology || []).first - if request.xhr? - render :partial => 'thread' - return - end + return unless request.xhr? + + render partial: 'thread' + nil end def new_comment @@ -33,8 +35,8 @@ def new_proposal def new_reply render 'notes/reply/new', locals: { frame_id: "#{params[:parent_id]}_new_reply", - parent_id: params[:parent_id], type: 'reply', - user_id: session[:user].id } + parent_id: params[:parent_id], type: 'reply', + user_id: session[:user].id } end def virtual_show @@ -51,12 +53,12 @@ def virtual_show elsif concept_id @notes = @ontology.explore.single_class(concept_id).explore.notes @note_link = "/notes/virtual/#{@ontology.ontologyId}/?noteid=" - render :partial => 'list', :layout => 'ontology' + render partial: 'list', layout: 'ontology' return else @notes = @ontology.explore.notes @note_link = "/notes/virtual/#{@ontology.ontologyId}/?noteid=" - render :partial => 'list', :layout => 'ontology' + render partial: 'list', layout: 'ontology' return end @@ -66,30 +68,31 @@ def virtual_show end render 'notes/show', layout: false - end + end def create - if params[:type].eql?("reply") + if params[:type].eql?('reply') note = LinkedData::Client::Models::Reply.new(values: note_params) new_note = note.save success_message = '' - locals = { note: new_note, parent_id: params[:parent]} + locals = { note: new_note, parent_id: params[:parent] } partial = 'notes/reply/reply' container_id = "#{params[:parent]}_thread_replay_container" alerts_container_id = "#{params[:parent]}_reply" else if params[:proposal] - cast_to_list = [:synonym, :definition, :newRelationshipType] + cast_to_list = %i[synonym definition newRelationshipType] cast_to_list.each do |property| params[:proposal][property] = params[:proposal][property].split(',') if params[:proposal][property] end - params[:subject] = "#{NOTES_PROPOSAL_TYPES[params[:proposal][:type].to_sym]}: #{params[:proposal][:reasonForChange]}" + params[:subject] = + "#{NOTES_PROPOSAL_TYPES[params[:proposal][:type].to_sym]}: #{params[:proposal][:reasonForChange]}" end - if params[:type].eql?("ontology") + if params[:type].eql?('ontology') params[:relatedOntology] = [params.delete(:parent)] - elsif params[:type].eql?("class") + elsif params[:type].eql?('class') related_class = params.delete(:parent) ontology_id = params.delete(:ontology_id) params[:relatedClass] = [{ ontology: ontology_id, class: related_class }] @@ -98,7 +101,7 @@ def create note = LinkedData::Client::Models::Note.new(values: note_params) new_note = note.save - parent_type = params[:type].eql?("ontology") ? 'ontology' : 'class' + parent_type = params[:type].eql?('ontology') ? 'ontology' : 'class' ontology_acronym = new_note.relatedOntology.first.split('/').last success_message = 'New comment added successfully' locals = { note: new_note, ontology_acronym: ontology_acronym, parent_type: parent_type } @@ -107,14 +110,13 @@ def create alerts_container_id = nil end - if new_note.errors render_turbo_stream alert_error(id: alerts_container_id) { response_errors(new_note).to_s } else streams = [prepend(container_id, partial: partial, locals: locals)] - streams.unshift(alert_success { success_message }) unless params[:type].eql?("reply") + streams.unshift(alert_success { success_message }) unless params[:type].eql?('reply') - render_turbo_stream *streams + render_turbo_stream(*streams) end end @@ -138,46 +140,46 @@ def destroy if response[:errors] render_turbo_stream alert_error(id: alerts_container_id) { response[:errors].join(',').to_s } else - render_turbo_stream(alert_success(id: alerts_container_id) { response[:success] }, remove("#{note_id}_tr_#{parent_type}")) + render_turbo_stream(alert_success(id: alerts_container_id) do + response[:success] + end, remove("#{note_id}_tr_#{parent_type}")) end - end def archive ontology = DataAccess.getLatestOntology(params[:ontology_virtual_id]) unless ontology.admin?(session[:user]) - render :json => nil.to_json, :status => 500 + render json: nil.to_json, status: 500 return end @archive = DataAccess.archiveNote(params) - unless @archive.nil? - render :json => @archive.to_json - end + return if @archive.nil? + + render json: @archive.to_json end def show_concept_list - params[:p] = "classes" - params[:t] = "notes" + params[:p] = 'classes' + params[:t] = 'notes' redirect_new_api end private def note_params - p = params.permit(:parent, :type, :subject, :body, :creator, { relatedClass:[:class, :ontology] }, { relatedOntology:[] }, - proposal: [:type, :reasonForChange, :classId, :label, { synonym:[] }, { definition:[] }, - :parent, :newTarget, :oldTarget, { newRelationshipType:[] }, :propertyId, + p = params.permit(:parent, :type, :subject, :body, :creator, { relatedClass: %i[class ontology] }, { relatedOntology: [] }, + proposal: [:type, :reasonForChange, :classId, :label, { synonym: [] }, { definition: [] }, + :parent, :newTarget, :oldTarget, { newRelationshipType: [] }, :propertyId, :newValue, :oldValue]) p.to_h end # Fix noteid parameters with bad prefixes (some application servers, e.g., Apache, NGINX, mangle encoded slashes). def clean_note_id(id) - id = id.match(/\Ahttp:\/\w/) ? id.sub('http:/', 'http://') : id + id = id.match(%r{\Ahttp:/\w}) ? id.sub('http:/', 'http://') : id CGI.unescape(id) end - end diff --git a/app/controllers/ontolobridge_controller.rb b/app/controllers/ontolobridge_controller.rb index 476f3efa55..7e8cd4aa06 100644 --- a/app/controllers/ontolobridge_controller.rb +++ b/app/controllers/ontolobridge_controller.rb @@ -1,8 +1,9 @@ +# frozen_string_literal: true + require 'rest-client' require 'multi_json' class OntolobridgeController < ApplicationController - # POST /ontolobridge # POST /ontolobridge.xml def create @@ -11,32 +12,31 @@ def create def request_term response = {} - endpoint = "/RequestTerm" + endpoint = '/RequestTerm' h_params = {} - response_raw = nil code = 200 begin - params.delete("controller") - params.delete("action") - params.each { |k, v| - if v === "on" - h_params[k] = true - else - h_params[k] = v - end - } - - headers = {'Authorization' => $ONTOLOBRIDGE_AUTHENTICATION_TOKEN} + params.delete('controller') + params.delete('action') + params.each do |k, v| + h_params[k] = if v === 'on' + true + else + v + end + end + + headers = { 'Authorization' => $ONTOLOBRIDGE_AUTHENTICATION_TOKEN } response_raw = RestClient.post("#{$ONTOLOBRIDGE_BASE_URL}#{endpoint}", h_params, headers) code = response_raw.code response.merge!(MultiJson.load(response_raw)) rescue RestClient::BadRequest => e code = 400 - response["error"] = e.message + response['error'] = e.message rescue Exception => e code = 500 - response["error"] = "Problem creating a new term #{endpoint}: #{e.class} - #{e.message}" + response['error'] = "Problem creating a new term #{endpoint}: #{e.class} - #{e.message}" end render json: [response, code], status: code @@ -44,7 +44,7 @@ def request_term def save_new_term_instructions code = 200 - response = {error: '', success: ''} + response = { error: '', success: '' } response[:success] = "New term request instructions for #{params['acronym']} saved" ont_data = Ontology.find_by(acronym: params['acronym']) ont_data ||= Ontology.new @@ -53,12 +53,11 @@ def save_new_term_instructions begin ont_data.save - rescue Exception => e + rescue Exception code = 500 response[:error] = "Unable to save new term instructions for #{params['acronym']} due to a server error" end sleep(1) render json: [response, code], status: code end - end diff --git a/app/controllers/ontologies_controller.rb b/app/controllers/ontologies_controller.rb index 689235b337..326b85e322 100644 --- a/app/controllers/ontologies_controller.rb +++ b/app/controllers/ontologies_controller.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + class OntologiesController < ApplicationController include MappingsHelper include FairScoreHelper @@ -20,11 +22,12 @@ class OntologiesController < ApplicationController layout 'ontology' - before_action :authorize_and_redirect, :only => [:edit, :update, :create, :new] + before_action :authorize_and_redirect, only: %i[edit update create new] before_action :submission_metadata, only: [:show] - KNOWN_PAGES = Set.new(["terms", "classes", "mappings", "notes", "widgets", "summary", "properties", "instances", "schemes", "collections"]) - EXTERNAL_MAPPINGS_GRAPH = "http://data.bioontology.org/metadata/ExternalMappings" - INTERPORTAL_MAPPINGS_GRAPH = "http://data.bioontology.org/metadata/InterportalMappings" + KNOWN_PAGES = Set.new(%w[terms classes mappings notes widgets summary properties instances + schemes collections]) + EXTERNAL_MAPPINGS_GRAPH = 'http://data.bioontology.org/metadata/ExternalMappings' + INTERPORTAL_MAPPINGS_GRAPH = 'http://data.bioontology.org/metadata/InterportalMappings' # GET /ontologies def index @@ -51,22 +54,24 @@ def ontologies_filter count_streams = [ replace('ontologies_filter_count_request') do - helpers.content_tag(:p, class: "browse-desc-text", style: "margin-bottom: 12px !important;") { "Showing #{@ontologies.size} of #{@analytics.keys.size}" } + helpers.content_tag(:p, class: 'browse-desc-text', style: 'margin-bottom: 12px !important;') { + "Showing #{@ontologies.size} of #{@analytics.keys.size}" + } end ] + update_filters_counts - streams =if params[:page].nil? - [ - prepend('ontologies_list_container', partial: 'ontologies/browser/ontologies'), - prepend('ontologies_list_container') { - helpers.turbo_frame_tag("ontologies_filter_count_request") do - helpers.browser_counter_loader - end - } - ] - else - [replace("ontologies_list_view-page-1", partial: 'ontologies/browser/ontologies')] - end + streams = if params[:page].nil? + [ + prepend('ontologies_list_container', partial: 'ontologies/browser/ontologies'), + prepend('ontologies_list_container') do + helpers.turbo_frame_tag('ontologies_filter_count_request') do + helpers.browser_counter_loader + end + end + ] + else + [replace('ontologies_list_view-page-1', partial: 'ontologies/browser/ontologies')] + end render turbo_stream: streams + count_streams end @@ -92,9 +97,7 @@ def classes @current_purl = @concept.purl if $PURL_ENABLED - unless @concept.nil? || @concept.id == 'bp_fake_root' - @notes = @concept.explore.notes - end + @notes = @concept.explore.notes unless @concept.nil? || @concept.id == 'bp_fake_root' if request.xhr? render 'ontologies/sections/visualize', layout: false @@ -104,11 +107,9 @@ def classes end def properties - if request.xhr? - return render 'ontologies/sections/properties', layout: false - else - return render 'ontologies/sections/properties', layout: 'ontology_viewer' - end + return render 'ontologies/sections/properties', layout: false if request.xhr? + + render 'ontologies/sections/properties', layout: 'ontology_viewer' end def create @@ -132,7 +133,9 @@ def create def edit @ontology = LinkedData::Client::Models::Ontology.find_by_acronym(params[:id]).first - redirect_to_home unless session[:user] && @ontology.administeredBy.include?(session[:user].id) || session[:user].admin? + unless session[:user] && @ontology.administeredBy.include?(session[:user].id) || session[:user].admin? + redirect_to_home + end submission = @ontology.explore.latest_submission(include: 'submissionId') if submission @@ -155,7 +158,8 @@ def mappings def new @ontology = LinkedData::Client::Models::Ontology.new @submission = LinkedData::Client::Models::OntologySubmission.new - @ontologies = LinkedData::Client::Models::Ontology.all(include: 'acronym', include_views: true, display_links: false, display_context: false) + @ontologies = LinkedData::Client::Models::Ontology.all(include: 'acronym', include_views: true, + display_links: false, display_context: false) @categories = LinkedData::Client::Models::Category.all @groups = LinkedData::Client::Models::Group.all @user_select_list = LinkedData::Client::Models::User.all.map { |u| [u.username, u.id] } @@ -210,7 +214,6 @@ def collections # GET /ontologies/ACRONYM # GET /ontologies/1.xml def show - # Hack to make ontologyid and conceptid work in addition to id and ontology params params[:id] = params[:id].nil? ? params[:ontologyid] : params[:id] params[:ontology] = params[:ontology].nil? ? params[:id] : params[:ontology] @@ -225,11 +228,12 @@ def show else params[:conceptid] = params.delete(:purl_conceptid) end - redirect_to "/ontologies/#{params[:acronym]}?p=classes#{params_string_for_redirect(params, prefix: "&")}", status: :moved_permanently + redirect_to "/ontologies/#{params[:acronym]}?p=classes#{params_string_for_redirect(params, prefix: '&')}", + status: :moved_permanently return end - if params[:ontology].to_i > 0 + if params[:ontology].to_i.positive? acronym = BPIDResolver.id_to_acronym(params[:ontology]) if acronym redirect_new_api @@ -237,23 +241,27 @@ def show end end - # Note: find_by_acronym includes ontology views + # NOTE: find_by_acronym includes ontology views @ontology = LinkedData::Client::Models::Ontology.find_by_acronym(params[:ontology]).first ontology_not_found(params[:ontology]) if @ontology.nil? # Handle the case where an ontology is converted to summary only. # See: https://github.com/ncbo/bioportal_web_ui/issues/133. if @ontology.summaryOnly && params[:p].present? - pages = KNOWN_PAGES - ['summary', 'notes'] + pages = KNOWN_PAGES - %w[summary notes] if pages.include?(params[:p]) redirect_to(ontology_path(params[:ontology]), status: :temporary_redirect) and return end end - #@ob_instructions = helpers.ontolobridge_instructions_template(@ontology) + # @ob_instructions = helpers.ontolobridge_instructions_template(@ontology) # Get the latest submission (not necessarily the latest 'ready' submission) - @submission_latest = @ontology.explore.latest_submission(include: 'all') rescue @ontology.explore.latest_submission(include: '') + @submission_latest = begin + @ontology.explore.latest_submission(include: 'all') + rescue StandardError + @ontology.explore.latest_submission(include: '') + end # Is the ontology downloadable? @ont_restricted = ontology_restricted?(@ontology.acronym) @@ -267,27 +275,26 @@ def show params[:p] = 'classes' redirect_to "/ontologies/#{params[:ontology]}#{params_string_for_redirect(params)}", status: :moved_permanently when 'classes' - self.classes #rescue self.summary + classes # rescue self.summary when 'mappings' - self.mappings #rescue self.summary + mappings # rescue self.summary when 'notes' - self.notes #rescue self.summary + notes # rescue self.summary when 'widgets' - self.widgets #rescue self.summary + widgets # rescue self.summary when 'properties' - self.properties #rescue self.summary + properties # rescue self.summary when 'summary' - self.summary + summary when 'instances' - self.instances + instances when 'schemes' - self.schemes + schemes when 'collections' - self.collections + collections else - self.summary + summary end - end def submit_success @@ -297,9 +304,12 @@ def submit_success # Main ontology description page (with metadata): /ontologies/ACRONYM def summary - - @metrics = @ontology.explore.metrics rescue [] - #@reviews = @ontology.explore.reviews.sort {|a,b| b.created <=> a.created} || [] + @metrics = begin + @ontology.explore.metrics + rescue StandardError + [] + end + # @reviews = @ontology.explore.reviews.sort {|a,b| b.created <=> a.created} || [] @projects = @ontology.explore.projects.sort { |a, b| a.name.downcase <=> b.name.downcase } || [] @analytics = LinkedData::Client::HTTP.get(@ontology.links['analytics']) @@ -311,19 +321,24 @@ def summary @view_decorators = @views.map { |view| ViewDecorator.new(view, view_context) } @ontology_relations_data = ontology_relations_data - category_attributes = submission_metadata.group_by{|x| x['category']}.transform_values{|x| x.map{|attr| attr['attribute']} } + category_attributes = submission_metadata.group_by { |x| x['category'] }.transform_values do |x| + x.map do |attr| + attr['attribute'] + end + end @relations_array_display = @relations_array.map do |relation| attr = relation.split(':').last ["#{helpers.attr_label(attr, attr_metadata: helpers.attr_metadata(attr), show_tooltip: false)}(#{relation})", relation] end - @methodology_properties = properties_hash_values(category_attributes["methodology"]) - @agents_properties = properties_hash_values(category_attributes["persons and organizations"]) - @dates_properties = properties_hash_values(category_attributes["dates"]) - @links_properties = properties_hash_values(category_attributes["links"]) - @identifiers = properties_hash_values([:URI, :versionIRI, :identifier]) - @projects_properties = properties_hash_values(category_attributes["usage"]) - @ontology_icon_links = [%w[summary/download dataDump], %w[summary/homepage homepage], %w[summary/documentation documentation], %w[icons/github repository], %w[summary/sparql endpoint]] + @methodology_properties = properties_hash_values(category_attributes['methodology']) + @agents_properties = properties_hash_values(category_attributes['persons and organizations']) + @dates_properties = properties_hash_values(category_attributes['dates']) + @links_properties = properties_hash_values(category_attributes['links']) + @identifiers = properties_hash_values(%i[URI versionIRI identifier]) + @projects_properties = properties_hash_values(category_attributes['usage']) + @ontology_icon_links = [%w[summary/download dataDump], %w[summary/homepage homepage], + %w[summary/documentation documentation], %w[icons/github repository], %w[summary/sparql endpoint]] if request.xhr? render partial: 'ontologies/sections/metadata', layout: false else @@ -331,7 +346,6 @@ def summary end end - def virtual redirect_new_api end @@ -347,42 +361,38 @@ def widgets render partial: 'ontologies/sections/widgets', layout: 'ontology_viewer' end end - def show_additional_metadata @metadata = submission_metadata @ontology = LinkedData::Client::Models::Ontology.find_by_acronym(params[:id]).first - @submission_latest = @ontology.explore.latest_submission(include: 'all', display_context: false, display_links: false) + @submission_latest = @ontology.explore.latest_submission(include: 'all', display_context: false, + display_links: false) render partial: 'ontologies/sections/additional_metadata' end def show_licenses - @metadata = submission_metadata @ontology = LinkedData::Client::Models::Ontology.find_by_acronym(params[:id]).first - @licenses= ["hasLicense","morePermissions","copyrightHolder"] - @submission_latest = @ontology.explore.latest_submission(include: @licenses.join(",")) + @licenses = %w[hasLicense morePermissions copyrightHolder] + @submission_latest = @ontology.explore.latest_submission(include: @licenses.join(',')) render partial: 'ontologies/sections/licenses' end - def ajax_ontologies - + def ajax_ontologies render json: LinkedData::Client::Models::Ontology.all(include_views: true, display: 'acronym,name', display_links: false, display_context: false) end - - def metrics_evolution @ontology = LinkedData::Client::Models::Ontology.find_by_acronym(params[:ontology_id]).first key = params[:metrics_key] ontology_not_found(params[:ontology_id]) if @ontology.nil? # Retrieve submissions in descending submissionId order (should be reverse chronological order) - @submissions = @ontology.explore.submissions({ include: "metrics" }) - .sort { |a, b| a.submissionId.to_i <=> b.submissionId.to_i }.reverse || [] + @submissions = @ontology.explore.submissions({ include: 'metrics' }) + .sort { |a, b| a.submissionId.to_i <=> b.submissionId.to_i }.reverse || [] - metrics = @submissions.map { |s| s.metrics } + metrics = @submissions.map(&:metrics) data = { key => metrics.map { |m| m.nil? ? 0 : m[key] } @@ -392,18 +402,19 @@ def metrics_evolution end private + def get_views(ontology) views = ontology.explore.views || [] - views.select!{ |view| view.access?(session[:user]) } - views.sort{ |a,b| a.acronym.downcase <=> b.acronym.downcase } + views.select! { |view| view.access?(session[:user]) } + views.sort { |a, b| a.acronym.downcase <=> b.acronym.downcase } end def ontology_relations_data(sub = @submission_latest) ontology_relations_array = [] - @relations_array = ["omv:useImports", "door:isAlignedTo", "door:ontologyRelatedTo", "omv:isBackwardCompatibleWith", "omv:isIncompatibleWith", "door:comesFromTheSameDomain", "door:similarTo", - "door:explanationEvolution", "voaf:generalizes", "door:hasDisparateModelling", "dct:hasPart", "voaf:usedBy", "schema:workTranslation", "schema:translationOfWork"] + @relations_array = ['omv:useImports', 'door:isAlignedTo', 'door:ontologyRelatedTo', 'omv:isBackwardCompatibleWith', 'omv:isIncompatibleWith', 'door:comesFromTheSameDomain', 'door:similarTo', + 'door:explanationEvolution', 'voaf:generalizes', 'door:hasDisparateModelling', 'dct:hasPart', 'voaf:usedBy', 'schema:workTranslation', 'schema:translationOfWork'] - return if sub.nil? + return if sub.nil? ont = sub.ontology # Get ontology relations between each other (ex: STY isAlignedTo GO) @@ -411,7 +422,7 @@ def ontology_relations_data(sub = @submission_latest) relation_values = sub.send(relation_attr.to_s.split(':')[1]) next if relation_values.nil? || relation_values.empty? - relation_values = [relation_values] unless relation_values.kind_of?(Array) + relation_values = [relation_values] unless relation_values.is_a?(Array) relation_values.each do |relation_value| next if relation_value.eql?(ont.acronym) @@ -428,12 +439,14 @@ def ontology_relations_data(sub = @submission_latest) target_in_portal = true end - ontology_relations_array.push({ source: ont.acronym, target: target_id, relation: relation_attr.to_s, targetInPortal: target_in_portal }) + ontology_relations_array.push({ source: ont.acronym, target: target_id, relation: relation_attr.to_s, + targetInPortal: target_in_portal }) end end ontology_relations_array end + def properties_hash_values(properties, sub = @submission_latest) return {} if sub.nil? @@ -444,8 +457,8 @@ def get_metrics_hash metrics_hash = {} # TODO: Metrics do not return for views on the backend, need to enable include_views param there @metrics = LinkedData::Client::Models::Metrics.all(include_views: true) - @metrics.each {|m| metrics_hash[m.links['ontology']] = m } - return metrics_hash + @metrics.each { |m| metrics_hash[m.links['ontology']] = m } + metrics_hash end def determine_layout @@ -456,5 +469,4 @@ def determine_layout super end end - end diff --git a/app/controllers/ontologies_metadata_curator_controller.rb b/app/controllers/ontologies_metadata_curator_controller.rb index 5d25ab6a77..aad7dd1a5e 100644 --- a/app/controllers/ontologies_metadata_curator_controller.rb +++ b/app/controllers/ontologies_metadata_curator_controller.rb @@ -1,8 +1,12 @@ +# frozen_string_literal: true + class OntologiesMetadataCuratorController < ApplicationController - include TurboHelper, SubmissionsHelper, ActionView::Helpers::FormHelper + include ActionView::Helpers::FormHelper + include SubmissionsHelper + include TurboHelper include SubmissionUpdater layout :determine_layout - before_action :submission_metadata, only: [:result, :edit, :update, :show_metadata_by_ontology] + before_action :submission_metadata, only: %i[result edit update show_metadata_by_ontology] def result @ontologies_ids = params[:ontology] ? params[:ontology][:ontologyId] : [] @@ -21,34 +25,38 @@ def result display_attribute = equivalent_properties(@metadata_sel) + %w[submissionId] @ontologies.each do |ont| - if @show_submissions - submissions = ont.explore.submissions({ include: display_attribute.join(',') }) - else - submissions = [ont.explore.latest_submission({ include: display_attribute.join(',') })] - end + submissions = if @show_submissions + ont.explore.submissions({ include: display_attribute.join(',') }) + else + [ont.explore.latest_submission({ include: display_attribute.join(',') })] + end submissions.each { |sub| append_submission(ont, sub) } end respond_to do |format| format.html { redirect_to admin_index_path } - format.turbo_stream { render turbo_stream: [ - replace("selection_metadata_form", partial: "ontologies_metadata_curator/metadata_table"), - replace('edit_metadata_btn') do - " - #{helpers.button_tag("Start bulk edit", onclick: 'showEditForm(event)', class: "btn btn-outline-primary mx-1 w-100")} + format.turbo_stream do + render turbo_stream: [ + replace('selection_metadata_form', partial: 'ontologies_metadata_curator/metadata_table'), + replace('edit_metadata_btn') do + " + #{helpers.button_tag('Start bulk edit', onclick: 'showEditForm(event)', + class: 'btn btn-outline-primary mx-1 w-100')} #{raw helpers.help_tooltip('To use the bulk edit select in the table submissions (the rows) and metadata properties (the columns) for which you want to edit')} ".html_safe - end - ]} + end + ] + end end end def show_metadata_by_ontology @acronym = params[:ontology] - inline_save = params[:inline_save] && params[:inline_save].eql?('true') + inline_save = params[:inline_save]&.eql?('true') display_submission_attributes(@acronym, params[:properties]&.split(','), submissionId: params[:submission_id], inline_save: inline_save) - render partial: 'submissions/form_content', locals: { id: params[:form_id] || '', acronym: @acronym, submissionId: params[:submission_id] } + render partial: 'submissions/form_content', + locals: { id: params[:form_id] || '', acronym: @acronym, submissionId: params[:submission_id] } end def show_metadata_value @@ -63,9 +71,10 @@ def show_metadata_value end def edit - if params[:selected_acronyms].nil? || params[:selected_metadata].nil? - render_turbo_stream alert_error(id: 'application_modal_content') {'Select in the table submissions (rows) and metadata properties (columns) to start the bulk edit'} + render_turbo_stream alert_error(id: 'application_modal_content') { + 'Select in the table submissions (rows) and metadata properties (columns) to start the bulk edit' + } return end @@ -102,8 +111,11 @@ def update else streams = [alert_success { 'Submissions were successfully updated' }] @submissions.each do |submission| - submission.ontology = OpenStruct.new({acronym: submission.ontology}) - streams << replace("#{ontology_submission_id_label(submission.ontology.acronym, submission.submissionId)}_row", partial: 'ontologies_metadata_curator/metadata_table_row', locals: {submission: submission, attributes: @all_metadata }) + submission.ontology = OpenStruct.new({ acronym: submission.ontology }) + streams << replace( + "#{ontology_submission_id_label(submission.ontology.acronym, + submission.submissionId)}_row", partial: 'ontologies_metadata_curator/metadata_table_row', locals: { submission: submission, attributes: @all_metadata } + ) end render_turbo_stream(*streams) end @@ -113,7 +125,6 @@ def update private - def append_submission(ontology, submission) sub = submission return if sub.nil? @@ -121,5 +132,4 @@ def append_submission(ontology, submission) sub.ontology = ontology @submissions << sub end - end diff --git a/app/controllers/precache_controller.rb b/app/controllers/precache_controller.rb index 54f2290743..57500e792c 100644 --- a/app/controllers/precache_controller.rb +++ b/app/controllers/precache_controller.rb @@ -1,18 +1,18 @@ +# frozen_string_literal: true + require 'uri' class PrecacheController < ApplicationController - - $UI_PORT = "80" + $UI_PORT = '80' # $UI_PORT = "3000" - def self.precache_all(delete_cache = false) if delete_cache - p "Deleting general cache info" - CACHE.delete("act_ont_list") - CACHE.delete("ont_list") - CACHE.delete("ontology_acronyms") - CACHE.delete("classes_all_ontologies") + p 'Deleting general cache info' + CACHE.delete('act_ont_list') + CACHE.delete('ont_list') + CACHE.delete('ontology_acronyms') + CACHE.delete('classes_all_ontologies') end get_url("http://localhost:#{$UI_PORT}") @@ -53,9 +53,7 @@ def self.precache_ontology_summary(delete_cache = false) def self.precache_ontology_mappings(delete_cache = false) ontologies = DataAccess.getOntologyList ontologies.each do |ont| - if delete_cache - CACHE.delete("between_ontologies::map_count::#{ont.ontologyId}") - end + CACHE.delete("between_ontologies::map_count::#{ont.ontologyId}") if delete_cache get_url("http://localhost:#{$UI_PORT}/ontologies/#{ont.ontologyId}?p=mappings") end @@ -81,10 +79,10 @@ def self.get_url(url) begin timer = Time.now - res = http.start { |con| - path = uri.path.empty? ? "/" : uri.path + res = http.start do |con| + path = uri.path.empty? ? '/' : uri.path con.get(path) - } + end p "Retrieved in #{(Time.now - timer).to_f.round(2)}s" rescue Exception => e p "Failed to get #{url}: #{e.message}" @@ -92,5 +90,4 @@ def self.get_url(url) res.body end - end diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index eb9f35297b..364a4d65c4 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + class ProjectsController < ApplicationController # GET /projects # GET /projects.xml @@ -7,13 +9,13 @@ class ProjectsController < ApplicationController def index @projects = LinkedData::Client::Models::Project.all @projects.reject! { |p| p.name.nil? } - @projects.sort! { |a,b| a.name.downcase <=> b.name.downcase } + @projects.sort! { |a, b| a.name.downcase <=> b.name.downcase } @ontologies = LinkedData::Client::Models::Ontology.all(include_views: true) - @ontologies_hash = Hash[@ontologies.map {|ont| [ont.id, ont]}] + @ontologies_hash = Hash[@ontologies.map { |ont| [ont.id, ont] }] if request.xhr? - render action: "index", layout: false + render action: 'index', layout: false else - render action: "index" + render action: 'index' end end @@ -26,28 +28,26 @@ def show redirect_to projects_path return end - + @project = projects.first @ontologies_used = [] onts_used = @project.ontologyUsed onts_used.each do |ont_used| ont = LinkedData::Client::Models::Ontology.find(ont_used) - unless ont.nil? - @ontologies_used << Hash["name", ont.name, "acronym", ont.acronym] - end + @ontologies_used << Hash['name', ont.name, 'acronym', ont.acronym] unless ont.nil? end - @ontologies_used.sort_by!{ |o| o["name"].downcase } + @ontologies_used.sort_by! { |o| o['name'].downcase } end # GET /projects/new # GET /projects/new.xml def new if session[:user].nil? - redirect_to :controller => 'login', :action => 'index' + redirect_to controller: 'login', action: 'index' else @project = LinkedData::Client::Models::Project.new - @user_select_list = LinkedData::Client::Models::User.all.map {|u| [u.username, u.id]} - @user_select_list.sort! {|a,b| a[1].downcase <=> b[1].downcase} + @user_select_list = LinkedData::Client::Models::User.all.map { |u| [u.username, u.id] } + @user_select_list.sort! { |a, b| a[1].downcase <=> b[1].downcase } end end @@ -60,8 +60,8 @@ def edit return end @project = projects.first - @user_select_list = LinkedData::Client::Models::User.all.map {|u| [u.username, u.id]} - @user_select_list.sort! {|a,b| a[1].downcase <=> b[1].downcase} + @user_select_list = LinkedData::Client::Models::User.all.map { |u| [u.username, u.id] } + @user_select_list.sort! { |a, b| a[1].downcase <=> b[1].downcase } @usedOntologies = @project.ontologyUsed || [] @ontologies = LinkedData::Client::Models::Ontology.all end @@ -76,7 +76,7 @@ def create @project = LinkedData::Client::Models::Project.new(values: project_params) @project_saved = @project.save - + # Project successfully created. if response_success?(@project_saved) flash[:notice] = 'Project successfully created' @@ -93,9 +93,9 @@ def create end @project = LinkedData::Client::Models::Project.new(values: project_params) - @user_select_list = LinkedData::Client::Models::User.all.map {|u| [u.username, u.id]} - @user_select_list.sort! {|a,b| a[1].downcase <=> b[1].downcase} - render action: "new" + @user_select_list = LinkedData::Client::Models::User.all.map { |u| [u.username, u.id] } + @user_select_list.sort! { |a, b| a[1].downcase <=> b[1].downcase } + render action: 'new' end # PUT /projects/1 @@ -113,8 +113,8 @@ def update end @project = projects.first @project.update_from_params(project_params) - @user_select_list = LinkedData::Client::Models::User.all.map {|u| [u.username, u.id]} - @user_select_list.sort! {|a,b| a[1].downcase <=> b[1].downcase} + @user_select_list = LinkedData::Client::Models::User.all.map { |u| [u.username, u.id] } + @user_select_list.sort! { |a, b| a[1].downcase <=> b[1].downcase } @usedOntologies = @project.ontologyUsed || [] @ontologies = LinkedData::Client::Models::Ontology.all error_response = @project.update @@ -152,14 +152,13 @@ def destroy format.xml { head :ok } end end - end private def project_params - p = params.require(:project).permit(:name, :acronym, :institution, :contacts, { creator:[] }, :homePage, - :description, { ontologyUsed:[] }) + p = params.require(:project).permit(:name, :acronym, :institution, :contacts, { creator: [] }, :homePage, + :description, { ontologyUsed: [] }) p[:creator].reject!(&:blank?) p[:ontologyUsed].reject!(&:blank?) p.to_h @@ -171,5 +170,4 @@ def flash_error(msg) html << msg html << ''.html_safe end - end diff --git a/app/controllers/recommender_controller.rb b/app/controllers/recommender_controller.rb index 256fee3e49..0a9cc599d7 100644 --- a/app/controllers/recommender_controller.rb +++ b/app/controllers/recommender_controller.rb @@ -1,8 +1,10 @@ +# frozen_string_literal: true + class RecommenderController < ApplicationController layout :determine_layout # REST_URI is defined in application_controller.rb - RECOMMENDER_URI = "/recommender" + RECOMMENDER_URI = '/recommender' def index @text = params[:text] @@ -30,9 +32,9 @@ def index # NOTE: this call (POST) works at a local environment but not in staging def create start = Time.now - input = params[:input].strip.gsub("\r\n", " ").gsub("\n", " ") + input = params[:input].strip.gsub("\r\n", ' ').gsub("\n", ' ') # Default values are set at the service level) - form_data = Hash.new + form_data = {} form_data['input'] = input form_data['ontologies'] = params[:ontologies].join(',') unless params[:ontologies].nil? form_data['input_type'] = params[:input_type] unless params[:input_type].nil? @@ -46,5 +48,4 @@ def create LOG.add :debug, "Retrieved #{recommendations.length} recommendations: #{Time.now - start}s" render json: recommendations end - end diff --git a/app/controllers/redirect_controller.rb b/app/controllers/redirect_controller.rb index c36d4c2f56..3dc29a954e 100644 --- a/app/controllers/redirect_controller.rb +++ b/app/controllers/redirect_controller.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'cgi' # The redirect controller allows for routes-based redirects @@ -6,21 +8,22 @@ class RedirectController < ApplicationController def index if params[:url] # We were provided with a url to redirect to - params_string = "" + params_string = '' # Trigger to switch the placeholders first_param = true # Loop through the given params, ignore ones we know about or are provided by default params.each do |param, value| - next if ["url", "action", "controller"].include?(param) - seperator = first_param ? "?" : "&" + next if %w[url action controller].include?(param) + + seperator = first_param ? '?' : '&' first_param = false - params_string += seperator + param + "=" + CGI.escape(value) + params_string += "#{seperator}#{param}=#{CGI.escape(value)}" end # Redirect with params intact - redirect_to params[:url] + params_string, :status=>:moved_permanently - return + redirect_to params[:url] + params_string, status: :moved_permanently + nil else # Default redirect to the home page - redirect_to "/", :status=>:moved_permanently + redirect_to '/', status: :moved_permanently end end end diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb index c36ef5b7b7..4173c48d7b 100644 --- a/app/controllers/reviews_controller.rb +++ b/app/controllers/reviews_controller.rb @@ -1,24 +1,26 @@ -class ReviewsController < ApplicationController +# frozen_string_literal: true +class ReviewsController < ApplicationController layout 'ontology_viewer' - RATING_TYPES = [ - :usabilityRating, - :coverageRating, - :qualityRating, - :formalityRating, - :correctnessRating, - :documentationRating + RATING_TYPES = %i[ + usabilityRating + coverageRating + qualityRating + formalityRating + correctnessRating + documentationRating ].freeze def new @rating_types = RATING_TYPES @ontology = LinkedData::Client::Models::Ontology.find(params[:ontology]) - @review = LinkedData::Client::Models::Review.new(values: {ontologyReviewed: @ontology.id, creator: session[:user].id}) + @review = LinkedData::Client::Models::Review.new(values: { ontologyReviewed: @ontology.id, + creator: session[:user].id }) - if request.xhr? - render layout: false - end + return unless request.xhr? + + render layout: false end # GET /reviews/1/edit @@ -26,9 +28,9 @@ def edit @review = Review.find(params[:id]) @rating_types = RatingType.all - if request.xhr? - render layout: false - end + return unless request.xhr? + + render layout: false end def create @@ -37,7 +39,7 @@ def create @review_saved = @review.save if response_error?(@review_saved) @errors = response_errors(@review_saved) - render :action => "new" + render action: 'new' else respond_to do |format| format.html do @@ -55,25 +57,25 @@ def create # PUT /reviews/1.xml def update @review = Review.find(params[:id]) - ratings = Hash[*(@review.ratings.map{|rate| [rate.id.to_i, rate] }.flatten)] - #puts ratings.inspect - for rating_key in params.keys - if rating_key.include?("star") - #puts rating_key.split("_")[1].to_i - ratings[rating_key.split("_")[1].to_i].value=params[rating_key].to_i - ratings[rating_key.split("_")[1].to_i].save - end - end - if @review.update_attributes(params[:review]) - @review.reload - if request.xhr? - render :action=>'show', :layout=>false - else - redirect_to reviews(:ontology=>review.ontology_id) - end + ratings = Hash[*@review.ratings.map { |rate| [rate.id.to_i, rate] }.flatten] + # puts ratings.inspect + params.each_key do |rating_key| + next unless rating_key.include?('star') + + # puts rating_key.split("_")[1].to_i + ratings[rating_key.split('_')[1].to_i].value = params[rating_key].to_i + ratings[rating_key.split('_')[1].to_i].save + end + if @review.update_attributes(params[:review]) + @review.reload + if request.xhr? + render action: 'show', layout: false else - render :action => "edit" + redirect_to reviews(ontology: review.ontology_id) end + else + render action: 'edit' + end end # DELETE /reviews/1 diff --git a/app/controllers/robots_controller.rb b/app/controllers/robots_controller.rb index 342f6cf9c8..6095a7215b 100644 --- a/app/controllers/robots_controller.rb +++ b/app/controllers/robots_controller.rb @@ -1,14 +1,16 @@ +# frozen_string_literal: true + class RobotsController < ApplicationController def index # Slices (subdomains) should not be indexed - if @subdomain_filter[:active] - robots = <<-EOF.gsub(/^\s+/, "") + robots = if @subdomain_filter[:active] + <<-EOF.gsub(/^\s+/, '') User-agent: *\n Disallow: / - EOF - else - robots = File.read(Rails.root + "config/robots/#{Rails.env}.txt") - end + EOF + else + File.read(Rails.root + "config/robots/#{Rails.env}.txt") + end render plain: robots end end diff --git a/app/controllers/schemes_controller.rb b/app/controllers/schemes_controller.rb index 34956040ee..d9914dd26c 100644 --- a/app/controllers/schemes_controller.rb +++ b/app/controllers/schemes_controller.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + class SchemesController < ApplicationController include SchemesHelper @@ -16,11 +18,11 @@ def show_label private def get_request_scheme - params[:id] = params[:id] ? params[:id] : params[:scheme_id] - params[:ontology_id] = params[:ontology_id] ? params[:ontology_id] : params[:ontology] + params[:id] = params[:id] || params[:scheme_id] + params[:ontology_id] = params[:ontology_id] || params[:ontology] if params[:id].nil? || params[:id].empty? - render :text => "Error: You must provide a valid scheme id" + render text: 'Error: You must provide a valid scheme id' return end @ontology = LinkedData::Client::Models::Ontology.find_by_acronym(params[:ontology_id]).first diff --git a/app/controllers/search_controller.rb b/app/controllers/search_controller.rb index b5d0525832..35c6ce027b 100644 --- a/app/controllers/search_controller.rb +++ b/app/controllers/search_controller.rb @@ -1,47 +1,48 @@ +# frozen_string_literal: true + require 'uri' class SearchController < ApplicationController - skip_before_action :verify_authenticity_token layout :determine_layout def index @search_query = params[:query].nil? ? params[:q] : params[:query] - @search_query ||= "" + @index ||= '' end def json_search if params[:q].nil? - render :text => "No search class provided" + render text: 'No search class provided' return end check_params_query(params) - check_params_ontologies(params) # Filter on ontology_id + check_params_ontologies(params) # Filter on ontology_id search_page = LinkedData::Client::Models::Class.search(params[:q], params) @results = search_page.collection - response = "" - obsolete_response = "" - separator = (params[:separator].nil?) ? "~!~" : params[:separator] - for result in @results + response = '' + obsolete_response = '' + separator = params[:separator].nil? ? '~!~' : params[:separator] + @results.each do |result| # TODO_REV: Format the response with type information, target information # record_type = format_record_type(result[:recordType], result[:obsolete]) - record_type = "" + record_type = '' target_value = result.prefLabel case params[:target] - when "name" - target_value = result.prefLabel - when "shortid" - target_value = result.id - when "uri" - target_value = result.id + when 'name' + target_value = result.prefLabel + when 'shortid' + target_value = result.id + when 'uri' + target_value = result.id end json = [] - json << "#{target_value}" - json << " [obsolete]" if result.obsolete? # used by JS in ontologies/visualize to markup obsolete classes + json << target_value.to_s + json << ' [obsolete]' if result.obsolete? # used by JS in ontologies/visualize to markup obsolete classes json << "|#{result.id}" json << "|#{record_type}" json << "|#{result.explore.ontology.acronym}" @@ -50,14 +51,12 @@ def json_search # This is nasty, but hard to workaround unless we rewrite everything (form_autocomplete, jump_to, crossdomain_autocomplete) # to use JSON from the bottom up. To avoid this, we pass a tab separated column list # Columns: synonym - json << "|#{(result.synonym || []).join(";")}" - if params[:id] && params[:id].split(",").length == 1 - json << "|#{CGI.escape((result.definition || []).join(". "))}#{separator}" - else + json << "|#{(result.synonym || []).join(';')}" + unless params[:id] && params[:id].split(',').length == 1 json << "|#{result.explore.ontology.name}" json << "|#{result.explore.ontology.acronym}" - json << "|#{CGI.escape((result.definition || []).join(". "))}#{separator}" end + json << "|#{CGI.escape((result.definition || []).join('. '))}#{separator}" # Obsolete results go at the end if result.obsolete? @@ -70,54 +69,50 @@ def json_search # Obsolete results merge response << obsolete_response - content_type = "text/html" - if params[:response].eql?("json") - response = response.gsub("\"","'") + content_type = 'text/html' + if params[:response].eql?('json') + response = response.gsub('"', "'") response = "#{params[:callback]}({data:\"#{response}\"})" - content_type = "application/javascript" + content_type = 'application/javascript' end render plain: response, content_type: content_type end - private def check_params_query(params) params[:q] = params[:q].strip - params[:q] = params[:q] + '*' unless params[:q].end_with?("*") # Add wildcard + params[:q] = "#{params[:q]}*" unless params[:q].end_with?('*') # Add wildcard end def check_params_ontologies(params) params[:ontologies] ||= params[:id] - if params[:ontologies] - if params[:ontologies].include?(",") - params[:ontologies] = params[:ontologies].split(",") - else - params[:ontologies] = [params[:ontologies]] - end - if params[:ontologies].first.to_i > 0 - params[:ontologies].map! {|o| BpidResolver.id_to_acronym(o)} - end - params[:ontologies] = params[:ontologies].join(",") - end + return unless params[:ontologies] + + params[:ontologies] = if params[:ontologies].include?(',') + params[:ontologies].split(',') + else + [params[:ontologies]] + end + params[:ontologies].map! { |o| BpidResolver.id_to_acronym(o) } if params[:ontologies].first.to_i.positive? + params[:ontologies] = params[:ontologies].join(',') end def format_record_type(record_type, obsolete = false) - case record_type - when "apreferredname" - record_text = "Preferred Name" - when "bconceptid" - record_text = "Class ID" - when "csynonym" - record_text = "Synonym" - when "dproperty" - record_text = "Property" - else - record_text = "" - end - record_text = "Obsolete Class" if obsolete + record_text = case record_type + when 'apreferredname' + 'Preferred Name' + when 'bconceptid' + 'Class ID' + when 'csynonym' + 'Synonym' + when 'dproperty' + 'Property' + else + '' + end + record_text = 'Obsolete Class' if obsolete record_text end - end diff --git a/app/controllers/submissions_controller.rb b/app/controllers/submissions_controller.rb index 55fd28d3e9..488adbc6c2 100644 --- a/app/controllers/submissions_controller.rb +++ b/app/controllers/submissions_controller.rb @@ -1,9 +1,12 @@ +# frozen_string_literal: true + class SubmissionsController < ApplicationController - include SubmissionsHelper, SubmissionUpdater, OntologyUpdater + include OntologyUpdater + include SubmissionUpdater + include SubmissionsHelper layout :determine_layout - before_action :authorize_and_redirect, :only => [:edit, :update, :create, :new] - before_action :submission_metadata, only: [:create, :edit, :new, :update, :index] - + before_action :authorize_and_redirect, only: %i[edit update create new] + before_action :submission_metadata, only: %i[create edit new update index] def index @ontology = LinkedData::Client::Models::Ontology.find_by_acronym(params[:ontology_id]).first @@ -13,11 +16,12 @@ def index @ont_restricted = ontology_restricted?(@ontology.acronym) # Retrieve submissions in descending submissionId order (should be reverse chronological order) - @submissions = @ontology.explore.submissions({include: "submissionId,creationDate,released,modificationDate,submissionStatus,hasOntologyLanguage,version,diffFilePath,ontology"}) - .sort {|a,b| b.submissionId.to_i <=> a.submissionId.to_i } || [] + @submissions = @ontology.explore.submissions({ include: 'submissionId,creationDate,released,modificationDate,submissionStatus,hasOntologyLanguage,version,diffFilePath,ontology' }) + .sort do |a, b| + b.submissionId.to_i <=> a.submissionId.to_i + end || [] LOG.add :error, "No submissions for ontology: #{@ontology.id}" if @submissions.empty? - end # When getting "Add submission" form to display @@ -27,10 +31,10 @@ def new @submission.id = nil @categories = LinkedData::Client::Models::Category.all @groups = LinkedData::Client::Models::Group.all - @user_select_list = LinkedData::Client::Models::User.all.map {|u| [u.username, u.id]} - @user_select_list.sort! {|a,b| a[1].downcase <=> b[1].downcase} + @user_select_list = LinkedData::Client::Models::User.all.map { |u| [u.username, u.id] } + @user_select_list.sort! { |a, b| a[1].downcase <=> b[1].downcase } @is_update_ontology = true - render "ontologies/new" + render 'ontologies/new' end # Called when form to "Add submission" is submitted @@ -57,23 +61,27 @@ def create # Called when form to "Edit submission" is submitted def edit_properties display_submission_attributes params[:ontology_id], params[:properties]&.split(','), submissionId: params[:submission_id], - inline_save: params[:inline_save]&.eql?('true') + inline_save: params[:inline_save]&.eql?('true') attribute_template_output = render_to_string(inline: helpers.render_submission_inputs(params[:container_id] || 'metadata_by_ontology')) render inline: attribute_template_output - end def edit @ontology = LinkedData::Client::Models::Ontology.find_by_acronym(params[:ontology_id]).first ontology_not_found(params[:ontology_id]) unless @ontology - category_attributes = submission_metadata.group_by{|x| x['category']}.transform_values{|x| x.map{|attr| attr['attribute']} } - category_attributes = category_attributes.reject{|key| ['no'].include?(key.to_s)} + category_attributes = submission_metadata.group_by { |x| x['category'] }.transform_values do |x| + x.map do |attr| + attr['attribute'] + end + end + category_attributes = category_attributes.reject { |key| ['no'].include?(key.to_s) } category_attributes['general'] << %w[acronym name groups administeredBy categories] category_attributes['licensing'] << 'viewingRestriction' category_attributes['relations'] << 'viewOf' - @categories_order = ['general', 'description', 'dates', 'licensing', 'persons and organizations', 'links', 'media', 'community', 'usage' ,'relations', 'content','methodology', 'object description properties'] + @categories_order = ['general', 'description', 'dates', 'licensing', 'persons and organizations', 'links', 'media', + 'community', 'usage', 'relations', 'content', 'methodology', 'object description properties'] @category_attributes = category_attributes end @@ -110,8 +118,5 @@ def update reset_agent_attributes render_submission_attribute(params[:attribute]) end - end - - end diff --git a/app/controllers/subscriptions_controller.rb b/app/controllers/subscriptions_controller.rb index 54040a4158..e17dfc73ff 100644 --- a/app/controllers/subscriptions_controller.rb +++ b/app/controllers/subscriptions_controller.rb @@ -1,41 +1,41 @@ -class SubscriptionsController < ApplicationController +# frozen_string_literal: true +class SubscriptionsController < ApplicationController def create # Try to get the user linked data instance user_id = params[:user_id] u = LinkedData::Client::Models::User.find(user_id) - raise Exception if u.nil? + raise StandardError if u.nil? # Try to get the ontology linked data instance ontology_id = params[:ontology_id] - if ontology_id.start_with? 'http' - ont = LinkedData::Client::Models::Ontology.find(ontology_id) - else - ont = LinkedData::Client::Models::Ontology.find_by_acronym(ontology_id).first - end - raise Exception if ont.nil? + ont = if ontology_id.start_with? 'http' + LinkedData::Client::Models::Ontology.find(ontology_id) + else + LinkedData::Client::Models::Ontology.find_by_acronym(ontology_id).first + end + raise StandardError if ont.nil? # Is this request to add or remove a subscription? - subscribed = params[:subbed] # string (not boolean) - if subscribed.eql?("true") + subscribed = params[:subbed] # string (not boolean) + if subscribed.eql?('true') # Already subscribed, so this request must be a delete # Note that this routine removes ALL subscriptions for the ontology, regardless of type. # Previous way to delete subscription: error when u.update if more than 1 subscription in the subscription array: - #u.subscription.delete_if {|sub| sub[:ontology].split('/').last.eql?(ont.acronym) } + # u.subscription.delete_if {|sub| sub[:ontology].split('/').last.eql?(ont.acronym) } # So here we re-generate a new subscription Array (instead of directly updating it, which causes error) all_subs = [] u.subscription.each do |subs| # Add all subscription to the array, but not the one to be deleted - if !subs.ontology.split('/').last.eql?(ont.acronym) - all_subs.push({ontology: subs.ontology, notification_type: subs.notification_type}) + unless subs.ontology.split('/').last.eql?(ont.acronym) + all_subs.push({ ontology: subs.ontology, notification_type: subs.notification_type }) end end - u.subscription = all_subs else # Not subscribed yet, so this request must be for adding subscription # Old way: - #subscription = {ontology: ont.acronym, notification_type: "NOTES"} #NOTIFICATION_TYPES[:notes]} - #u.subscription.push(subscription) + # subscription = {ontology: ont.acronym, notification_type: "NOTES"} #NOTIFICATION_TYPES[:notes]} + # u.subscription.push(subscription) # This way was not working, updating subscription is failing when more than 1 subscription in the array # And we were updating with different types of object in the subscription array : OpenStruct and hash # So we are generating an array with only hash @@ -43,17 +43,17 @@ def create all_subs = [] u.subscription.each do |subs| # add all existing subscriptions - all_subs.push({ontology: subs.ontology, notification_type: subs.notification_type}) - if subs.ontology.split("/").last == ont.acronym && subs.notification_type == "NOTES" + all_subs.push({ ontology: subs.ontology, notification_type: subs.notification_type }) + if subs.ontology.split('/').last == ont.acronym && subs.notification_type == 'NOTES' # avoid to subscribe many times to the same ontology already_subscribed = true end end if already_subscribed == false - all_subs.push({ontology: ont.acronym, notification_type: "NOTES"}) # the new subscription + all_subs.push({ ontology: ont.acronym, notification_type: 'NOTES' }) # the new subscription end - u.subscription = all_subs end + u.subscription = all_subs # Try to update the user instance and the session user. begin @@ -61,27 +61,26 @@ def create if response_success?(error_response) updated_sub = true session[:user].subscription = u.subscription - #session[:user] = u + # session[:user] = u # NOTES: # - Cannot update session[:user] as above. The session user object is special because it only # gets set when someone logs in and the user object returned when authenticating is the # only one that will contain the api key for security reasons. So we actually need to use # the update_from_params method, can’t just set the object to the user linked data instance. # - #session[:user].update_from_params(params[:user]) + # session[:user].update_from_params(params[:user]) # update_from_params first gets all attributes from the REST service for the object being updated, # then sets the values provided in the params hash where the param keys match setter names on the # object (in this case, for example, :subscription would set the @subscription value on the instance). # That’s all it does, no saving or anything. else updated_sub = false - #errors = response_errors(error_response) + # errors = response_errors(error_response) end - rescue + rescue StandardError updated_sub = false end - render :json => { :updated_sub => updated_sub, :user_subscriptions => u.subscription } + render json: { updated_sub: updated_sub, user_subscriptions: u.subscription } end - end diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 86d9a2e6ae..3801af9c77 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -1,15 +1,15 @@ +# frozen_string_literal: true + class UsersController < ApplicationController - - before_action :unescape_id, only: [:edit, :show, :update] - before_action :verify_owner, only: [:edit, :show, :subscribe, :un_subscribe] - before_action :authorize_admin, only: [:index,:subscribe, :un_subscribe] + before_action :unescape_id, only: %i[edit show update] + before_action :verify_owner, only: %i[edit show subscribe un_subscribe] + before_action :authorize_admin, only: %i[index subscribe un_subscribe] layout :determine_layout - # GET /users/1 # GET /users/1.xml def show - @user = if session[:user].admin? && params.has_key?(:id) + @user = if session[:user].admin? && params.key?(:id) LinkedData::Client::Models::User.find_by_username(params[:id]).first else LinkedData::Client::Models::User.find(session[:user].id) @@ -23,11 +23,11 @@ def show @user_ontologies = @user.customOntology ## Copied from home controller , account action - onts = LinkedData::Client::Models::Ontology.all; - @admin_ontologies = onts.select {|o| o.administeredBy.include? @user.id } + onts = LinkedData::Client::Models::Ontology.all + @admin_ontologies = onts.select { |o| o.administeredBy.include? @user.id } - projects = LinkedData::Client::Models::Project.all; - @user_projects = projects.select {|p| p.creator.include? @user.id } + projects = LinkedData::Client::Models::Project.all + @user_projects = projects.select { |p| p.creator.include? @user.id } end # GET /users/new @@ -40,9 +40,9 @@ def edit @user = LinkedData::Client::Models::User.find(params[:id]) @user ||= LinkedData::Client::Models::User.find_by_username(params[:id]).first - if (params[:password].eql?("true")) - @user.validate_password = true - end + return unless params[:password].eql?('true') + + @user.validate_password = true end # POST /users @@ -51,16 +51,20 @@ def create @errors = validate(user_params) @user = LinkedData::Client::Models::User.new(values: user_params) - if @errors.size < 1 + if @errors.empty? @user_saved = @user.save if response_error?(@user_saved) @errors = response_errors(@user_saved) # @errors = {acronym: "Username already exists, please use another"} if @user_saved.status == 409 - render action: "new" + render action: 'new' else # Attempt to register user to list if params[:user][:register_mail_list] - SubscribeMailer.register_for_announce_list(@user.email,@user.firstName,@user.lastName).deliver rescue nil + begin + SubscribeMailer.register_for_announce_list(@user.email, @user.firstName, @user.lastName).deliver + rescue StandardError + nil + end end flash[:notice] = 'Account was successfully created' @@ -68,7 +72,7 @@ def create redirect_to_browse end else - render action: "new" + render action: 'new' end end @@ -78,16 +82,14 @@ def update @user = LinkedData::Client::Models::User.find(params[:id]) @user = LinkedData::Client::Models::User.find_by_username(params[:id]).first if @user.nil? @errors = validate_update(user_params) - if @errors.size < 1 + if @errors.empty? if params[:user][:password] error_response = @user.update(values: { password: params[:user][:password] }) else user_roles = @user.role - if @user.admin? != (params[:user][:admin].to_i == 1) - user_roles = update_role(@user) - end + user_roles = update_role(@user) if @user.admin? != (params[:user][:admin].to_i == 1) @user.update_from_params(user_params.merge!(role: user_roles)) error_response = @user.update @@ -96,26 +98,24 @@ def update if response_error?(error_response) @errors = response_errors(error_response) # @errors = {acronym: "Username already exists, please use another"} if error_response.status == 409 - render action: "edit" + render action: 'edit' else flash[:notice] = 'Account was successfully updated' - if session[:user].username == @user.username - session[:user].update_from_params(user_params) - end + session[:user].update_from_params(user_params) if session[:user].username == @user.username redirect_to user_path(@user.username) end else - render action: "edit" + render action: 'edit' end end # DELETE /users/1 def destroy - response = {errors: '', success: ''} + response = { errors: '', success: '' } @user = LinkedData::Client::Models::User.find(params[:id]) @user = LinkedData::Client::Models::User.find_by_username(params[:id]).first if @user.nil? - if(session[:user].admin?) + if session[:user].admin? @user.delete response[:success] << 'User deleted successfully ' @@ -149,42 +149,40 @@ def custom_ontologies redirect_to user_path(@user.username) end - def subscribe @user = LinkedData::Client::Models::User.find_by_username(params[:username]).first - deliver "subscribe", SubscribeMailer.register_for_announce_list(@user.email,@user.firstName,@user.lastName) + deliver 'subscribe', SubscribeMailer.register_for_announce_list(@user.email, @user.firstName, @user.lastName) end def un_subscribe - @email = params[:email] - deliver "unsubscribe", SubscribeMailer.unregister_for_announce_list(@email) + @email = params[:email] + deliver 'unsubscribe', SubscribeMailer.unregister_for_announce_list(@email) end - private - def deliver(action,job) + def deliver(action, job) begin job.deliver - to_or_from = action.eql?("subscribe") ? "to" : "from" + to_or_from = action.eql?('subscribe') ? 'to' : 'from' flash[:success] = "You have successfully #{action} #{to_or_from} our user mailing list: #{$ANNOUNCE_LIST}" - rescue => exception - flash[:error] = "Something went wrong ..." + rescue StandardError + flash[:error] = 'Something went wrong ...' end redirect_to '/account' end def user_params - params[:user]["orcidId"] = extract_id_from_url(params[:user]["orcidId"], 'orcid.org') - params[:user]["githubId"] = extract_id_from_url(params[:user]["githubId"], 'github.com') + params[:user]['orcidId'] = extract_id_from_url(params[:user]['orcidId'], 'orcid.org') + params[:user]['githubId'] = extract_id_from_url(params[:user]['githubId'], 'github.com') p = params.require(:user).permit(:firstName, :lastName, :username, :orcidId, :githubId, :email, :email_confirmation, :password, :password_confirmation, :register_mail_list, :admin) p.to_h end - + def extract_id_from_url(url, pattern) - if url && url.include?(pattern) - url.split('/').last + if url&.include?(pattern) + url.split('/').last else url end @@ -196,68 +194,58 @@ def unescape_id def verify_owner return if current_user_admin? + if session[:user].nil? || (!session[:user].id.eql?(params[:id]) && !session[:user].username.eql?(params[:id])) redirect_to controller: 'login', action: 'index', redirect: "/accounts/#{params[:id]}" end end def get_ontology_list(ont_hash) - return "" if ont_hash.nil? + return '' if ont_hash.nil? + ontologies = [] ont_hash.each do |ont, checked| ontologies << ont if checked.to_i == 1 end - ontologies.join(";") + ontologies.join(';') end def validate(params) errors = [] - if params[:email].nil? || params[:email].length < 1 || !params[:email].match(/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}$/i) - errors << "Please enter an email address" - end - if params[:password].nil? || params[:password].length < 1 - errors << "Please enter a password" + if params[:email].nil? || params[:email].empty? || !params[:email].match(/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}$/i) + errors << 'Please enter an email address' end - if !params[:password].eql?(params[:password_confirmation]) - errors << "Your Password and Password Confirmation do not match" - end - if using_captcha? - if !verify_recaptcha - errors << "Please fill in the proper text from the supplied image" - end + errors << 'Please enter a password' if params[:password].nil? || params[:password].empty? + unless params[:password].eql?(params[:password_confirmation]) + errors << 'Your Password and Password Confirmation do not match' end - if ((!params[:orcidId].match(/^\d{4}+(-\d{4})+$/)) || (params[:orcidId].length != 19)) && !(params[:orcidId].nil? || params[:orcidId].length < 1) - errors << "Please enter a valide orcid id" + errors << 'Please fill in the proper text from the supplied image' if using_captcha? && !verify_recaptcha + if (!params[:orcidId].match(/^\d{4}+(-\d{4})+$/) || (params[:orcidId].length != 19)) && !(params[:orcidId].nil? || params[:orcidId].empty?) + errors << 'Please enter a valide orcid id' end - if params[:username].nil? || params[:username].length < 1 || !params[:username].match(/^[a-zA-Z0-9]([._-](?![._-])|[a-zA-Z0-9]){3,18}[a-zA-Z0-9]$/) - errors << "please enter a valid username" + if params[:username].nil? || params[:username].empty? || !params[:username].match(/^[a-zA-Z0-9]([._-](?![._-])|[a-zA-Z0-9]){3,18}[a-zA-Z0-9]$/) + errors << 'please enter a valid username' end - return errors + errors end def validate_update(params) errors = [] - if params[:email].nil? || params[:email].length < 1 || !params[:email].match(/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i) - errors << "Please enter a valid email adresse" + if params[:email].nil? || params[:email].empty? || !params[:email].match(/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i) + errors << 'Please enter a valid email adresse' end - if params[:firstName].nil? || params[:firstName].length < 1 - errors << "First name field is required" + errors << 'First name field is required' if params[:firstName].nil? || params[:firstName].empty? + errors << 'Last name field is required' if params[:lastName].nil? || params[:lastName].empty? + errors << 'Last name field is required' if params[:username].nil? || params[:username].empty? + if params[:orcidId].present? && (!params[:orcidId].match(/^\d{4}-\d{4}-\d{4}-\d{4}$/) || (params[:orcidId].length != 19)) + errors << 'Please enter a valide orcide id' end - if params[:lastName].nil? || params[:lastName].length < 1 - errors << "Last name field is required" - end - if params[:username].nil? || params[:username].length < 1 - errors << "Last name field is required" - end - if params[:orcidId].present? && ((!params[:orcidId].match(/^\d{4}-\d{4}-\d{4}-\d{4}$/)) || (params[:orcidId].length != 19)) - errors << "Please enter a valide orcide id" - end - if !params[:password].eql?(params[:password_confirmation]) - errors << "Your Password and Password Confirmation do not match" + unless params[:password].eql?(params[:password_confirmation]) + errors << 'Your Password and Password Confirmation do not match' end - return errors + errors end def update_role(user) @@ -266,13 +254,12 @@ def update_role(user) if session[:user].admin? user_roles = user_roles.dup if user.admin? - user_roles.map!{ |role| role == "ADMINISTRATOR" ? "LIBRARIAN" : role} + user_roles.map! { |role| role == 'ADMINISTRATOR' ? 'LIBRARIAN' : role } else - user_roles.map!{ |role| role == "LIBRARIAN" ? "ADMINISTRATOR" : role} + user_roles.map! { |role| role == 'LIBRARIAN' ? 'ADMINISTRATOR' : role } end end user_roles end - end diff --git a/app/controllers/virtual_appliance_controller.rb b/app/controllers/virtual_appliance_controller.rb index 5b3701711f..4b6144942c 100644 --- a/app/controllers/virtual_appliance_controller.rb +++ b/app/controllers/virtual_appliance_controller.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + class VirtualApplianceController < ApplicationController layout 'ontology' before_action :require_login @@ -8,9 +10,7 @@ def index @virtual_appliance_user = VirtualApplianceUser.where(user_id: @user.id) @virtual_appliance_access = false - if !@virtual_appliance_user.nil? && !@virtual_appliance_user.empty? || @user.admin? - @virtual_appliance_access = true - end + @virtual_appliance_access = true if !@virtual_appliance_user.nil? && !@virtual_appliance_user.empty? || @user.admin? @va_users = VirtualApplianceUser.order(:user_id) end @@ -19,7 +19,8 @@ def create user = LinkedData::Client::Models::User.find_by_username(params[:appliance_user][:user_id]).first if user.nil? - flash[:error] = "Problem adding account #{params[:appliance_user][:user_id]}: account does not exist".html_safe + flash[:error] = + "Problem adding account #{params[:appliance_user][:user_id]}: account does not exist".html_safe redirect_to action: 'index' and return end @@ -30,7 +31,7 @@ def create @new_user.save end - redirect_to :action => 'index' + redirect_to action: 'index' end private diff --git a/app/controllers/visits_controller.rb b/app/controllers/visits_controller.rb index f6c5253325..2a1c9898de 100644 --- a/app/controllers/visits_controller.rb +++ b/app/controllers/visits_controller.rb @@ -1,12 +1,12 @@ -class VisitsController < ApplicationController +# frozen_string_literal: true +class VisitsController < ApplicationController layout :determine_layout def index @ontologies_views = LinkedData::Client::Models::Ontology.all(include_views: true) - @ontologies = @ontologies_views.select {|o| !o.viewOf} - @ontologies_hash = Hash[@ontologies_views.map {|o| [o.acronym, o]}] + @ontologies = @ontologies_views.reject(&:viewOf) + @ontologies_hash = Hash[@ontologies_views.map { |o| [o.acronym, o] }] @analytics = LinkedData::Client::Analytics.last_month end - end diff --git a/app/decorators/base_decorator.rb b/app/decorators/base_decorator.rb index f67b514eb6..ca45bffbb9 100644 --- a/app/decorators/base_decorator.rb +++ b/app/decorators/base_decorator.rb @@ -1,5 +1,6 @@ -class BaseDecorator < SimpleDelegator +# frozen_string_literal: true +class BaseDecorator < SimpleDelegator attr_reader :view_context def initialize(object, view_context) @@ -10,5 +11,4 @@ def initialize(object, view_context) def self.wrap_collection(objects, view_context) objects.map { |object| new(object, view_context) } end - -end \ No newline at end of file +end diff --git a/app/decorators/note_decorator.rb b/app/decorators/note_decorator.rb index e91e05a88d..b020ced77e 100644 --- a/app/decorators/note_decorator.rb +++ b/app/decorators/note_decorator.rb @@ -1,36 +1,38 @@ +# frozen_string_literal: true + class NoteDecorator < BaseDecorator - include ApplicationHelper, NotesHelper + include NotesHelper + include ApplicationHelper def author - view_context.content_tag(:span, get_username(creator), class: "note_author") + view_context.content_tag(:span, get_username(creator), class: 'note_author') end def body_content - view_context.content_tag(:div, view_context.simple_format(body), class: "note_body") unless body.blank? + view_context.content_tag(:div, view_context.simple_format(body), class: 'note_body') unless body.blank? end def created_date - view_context.time_ago_in_words(DateTime.parse(created)) + " ago" + "#{view_context.time_ago_in_words(DateTime.parse(created))} ago" end def proposal_content - if proposal - view_context.content_tag(:div, (proposal_html(self)).html_safe, class: "proposal") - end + return unless proposal + + view_context.content_tag(:div, proposal_html(self).html_safe, class: 'proposal') end def reply_link - view_context.link_to("reply", "#reply", class: "reply_reply", data: { parent_id: "#{id}", parent_type: "reply" }) + view_context.link_to('reply', '#reply', class: 'reply_reply', data: { parent_id: id.to_s, parent_type: 'reply' }) end def status - if archived - view_context.content_tag(:span, "archived", class: "archived_note") - end + return unless archived + + view_context.content_tag(:span, 'archived', class: 'archived_note') end def title - view_context.content_tag(:span, "#{subject}", class: "note_title") + view_context.content_tag(:span, subject.to_s, class: 'note_title') end - -end \ No newline at end of file +end diff --git a/app/decorators/view_decorator.rb b/app/decorators/view_decorator.rb index 4693aea61b..81cd912a52 100644 --- a/app/decorators/view_decorator.rb +++ b/app/decorators/view_decorator.rb @@ -1,8 +1,11 @@ +# frozen_string_literal: true + class ViewDecorator attr_reader :view, :view_context def initialize(view, view_context) - @view, @view_context = view, view_context + @view = view + @view_context = view_context end def linked_name @@ -11,6 +14,6 @@ def linked_name def description latest_submission = view.explore.latest_submission - latest_submission.nil? ? "No description provided" : latest_submission.description + latest_submission.nil? ? 'No description provided' : latest_submission.description end -end \ No newline at end of file +end diff --git a/app/helpers/about_helper.rb b/app/helpers/about_helper.rb index 68e69aee14..0f57a7b5e3 100644 --- a/app/helpers/about_helper.rb +++ b/app/helpers/about_helper.rb @@ -1,2 +1,4 @@ +# frozen_string_literal: true + module AboutHelper end diff --git a/app/helpers/admin/licenses_helper.rb b/app/helpers/admin/licenses_helper.rb index 4d11f0b1f1..7e9c8a69e3 100644 --- a/app/helpers/admin/licenses_helper.rb +++ b/app/helpers/admin/licenses_helper.rb @@ -1,17 +1,20 @@ -module Admin::LicensesHelper +# frozen_string_literal: true - def license_notification(license) - days = license.days_remaining - - if (days == 0) - msg = (t(".license_expired") << " " << t(".license_contact")).html_safe - notification = tag.div msg, class: "alert alert-danger mt-3", role: "alert" - elsif license.is_trial? - msg = (t(".license_trial", count: days) << " " << t(".license_obtain") << " " << t(".license_contact")).html_safe - notification = tag.div msg, class: "alert alert-info mt-3", role: "alert" +module Admin + module LicensesHelper + def license_notification(license) + days = license.days_remaining + + if days.zero? + msg = (t('.license_expired') << ' ' << t('.license_contact')).html_safe + notification = tag.div msg, class: 'alert alert-danger mt-3', role: 'alert' + elsif license.is_trial? + msg = (t('.license_trial', + count: days) << ' ' << t('.license_obtain') << ' ' << t('.license_contact')).html_safe + notification = tag.div msg, class: 'alert alert-info mt-3', role: 'alert' + end + + notification || '' end - - notification ||= "" end - end diff --git a/app/helpers/admin_helper.rb b/app/helpers/admin_helper.rb index 7553a567df..f56600d5b7 100644 --- a/app/helpers/admin_helper.rb +++ b/app/helpers/admin_helper.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module AdminHelper def selected_admin_section?(section_title) current_section = params[:section] || 'site' diff --git a/app/helpers/agent_helper.rb b/app/helpers/agent_helper.rb index 39ee7aef4d..1b352ecc67 100644 --- a/app/helpers/agent_helper.rb +++ b/app/helpers/agent_helper.rb @@ -1,5 +1,6 @@ -module AgentHelper +# frozen_string_literal: true +module AgentHelper def agent_id_alert_container_id(agent_id, parent_id) "agents_alerts_#{agent_id_frame_id(agent_id, parent_id)}" end @@ -12,7 +13,7 @@ def agent_alert_container(agent, parent_id) render_alerts_container(agent_alert_container_id(agent, parent_id)) end - def agent_id_alert_container(agent_id, parent_id) + def agent_id_alert_container(_agent_id, parent_id) render_alerts_container(agent_alert_container_id(agent, parent_id)) end @@ -33,21 +34,24 @@ def agent_id_frame_id(agent_id, parent_id) end def agent_id(agent) - return if agent.nil? + return if agent.nil? agent_id = agent.is_a?(String) ? agent : agent.id agent_id ? agent_id.split('/').last : '' end def link_to_agent_edit_modal(agent, parent_id = nil) - - link_to_modal(nil, edit_agent_path(agent_id(agent), parent_id: parent_id, show_affiliations: parent_id.nil? || parent_id.empty?), class: 'btn btn-sm btn-light', data: { show_modal_title_value: "Edit agent #{agent.id}" }) do + link_to_modal(nil, + edit_agent_path(agent_id(agent), parent_id: parent_id, show_affiliations: parent_id.nil? || parent_id.empty?), class: 'btn btn-sm btn-light', data: { show_modal_title_value: "Edit agent #{agent.id}" }) do content_tag(:i, '', class: 'far fa-edit') end end def link_to_agent_edit(agent, parent_id = nil) - link_to(edit_agent_path(agent_id(agent), parent_id: parent_id, show_affiliations: parent_id.nil? || parent_id.empty?), class: 'btn btn-sm btn-light') do + link_to( + edit_agent_path(agent_id(agent), parent_id: parent_id, + show_affiliations: parent_id.nil? || parent_id.empty?), class: 'btn btn-sm btn-light' + ) do content_tag(:i, '', class: 'far fa-edit') end end @@ -62,16 +66,16 @@ def identifier_link(link, link_to: true) else link end - end def display_identifiers(identifiers, link: true) schemes_urls = { ORCID: 'https://orcid.org/', ISNI: 'https://isni.org/', ROR: 'https://ror.org/', GRID: 'https://www.grid.ac/' } Array(identifiers).map do |i| - if i["schemaAgency"] - schema_agency, notation = [i["schemaAgency"], i["notation"]] + if i['schemaAgency'] + schema_agency = i['schemaAgency'] + notation = i['notation'] else - schema_agency, notation = (i["id"] || i["@id"]).split('Identifiers/').last.delete(' ').split(':') + schema_agency, notation = (i['id'] || i['@id']).split('Identifiers/').last.delete(' ').split(':') end value = "#{schemes_urls[schema_agency.to_sym]}#{notation}" identifier_link(value, link_to: link) diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 0befcf29c3..f472c15d49 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + # Methods added to this helper will be available to all templates in the application. require 'uri' @@ -9,20 +11,20 @@ module ApplicationHelper REST_URI = $REST_URL API_KEY = $API_KEY - include ModalHelper, MultiLanguagesHelper - - RESOLVE_NAMESPACE = {:omv => "http://omv.ontoware.org/2005/05/ontology#", :skos => "http://www.w3.org/2004/02/skos/core#", :owl => "http://www.w3.org/2002/07/owl#", - :rdf => "http://www.w3.org/1999/02/22-rdf-syntax-ns#", :rdfs => "http://www.w3.org/2000/01/rdf-schema#", :metadata => "http://data.bioontology.org/metadata/", - :metadata_def => "http://data.bioontology.org/metadata/def/", :dc => "http://purl.org/dc/elements/1.1/", :xsd => "http://www.w3.org/2001/XMLSchema#", - :oboinowl_gen => "http://www.geneontology.org/formats/oboInOwl#", :obo_purl => "http://purl.obolibrary.org/obo/", - :umls => "http://bioportal.bioontology.org/ontologies/umls/", :door => "http://kannel.open.ac.uk/ontology#", :dct => "http://purl.org/dc/terms/", - :void => "http://rdfs.org/ns/void#", :foaf => "http://xmlns.com/foaf/0.1/", :vann => "http://purl.org/vocab/vann/", :adms => "http://www.w3.org/ns/adms#", - :voaf => "http://purl.org/vocommons/voaf#", :dcat => "http://www.w3.org/ns/dcat#", :mod => "http://www.isibang.ac.in/ns/mod#", :prov => "http://www.w3.org/ns/prov#", - :cc => "http://creativecommons.org/ns#", :schema => "http://schema.org/", :doap => "http://usefulinc.com/ns/doap#", :bibo => "http://purl.org/ontology/bibo/", - :wdrs => "http://www.w3.org/2007/05/powder-s#", :cito => "http://purl.org/spar/cito/", :pav => "http://purl.org/pav/", :nkos => "http://w3id.org/nkos/nkostype#", - :oboInOwl => "http://www.geneontology.org/formats/oboInOwl#", :idot => "http://identifiers.org/idot/", :sd => "http://www.w3.org/ns/sparql-service-description#", - :cclicense => "http://creativecommons.org/licenses/"} - + include MultiLanguagesHelper + include ModalHelper + + RESOLVE_NAMESPACE = { omv: 'http://omv.ontoware.org/2005/05/ontology#', skos: 'http://www.w3.org/2004/02/skos/core#', owl: 'http://www.w3.org/2002/07/owl#', + rdf: 'http://www.w3.org/1999/02/22-rdf-syntax-ns#', rdfs: 'http://www.w3.org/2000/01/rdf-schema#', metadata: 'http://data.bioontology.org/metadata/', + metadata_def: 'http://data.bioontology.org/metadata/def/', dc: 'http://purl.org/dc/elements/1.1/', xsd: 'http://www.w3.org/2001/XMLSchema#', + oboinowl_gen: 'http://www.geneontology.org/formats/oboInOwl#', obo_purl: 'http://purl.obolibrary.org/obo/', + umls: 'http://bioportal.bioontology.org/ontologies/umls/', door: 'http://kannel.open.ac.uk/ontology#', dct: 'http://purl.org/dc/terms/', + void: 'http://rdfs.org/ns/void#', foaf: 'http://xmlns.com/foaf/0.1/', vann: 'http://purl.org/vocab/vann/', adms: 'http://www.w3.org/ns/adms#', + voaf: 'http://purl.org/vocommons/voaf#', dcat: 'http://www.w3.org/ns/dcat#', mod: 'http://www.isibang.ac.in/ns/mod#', prov: 'http://www.w3.org/ns/prov#', + cc: 'http://creativecommons.org/ns#', schema: 'http://schema.org/', doap: 'http://usefulinc.com/ns/doap#', bibo: 'http://purl.org/ontology/bibo/', + wdrs: 'http://www.w3.org/2007/05/powder-s#', cito: 'http://purl.org/spar/cito/', pav: 'http://purl.org/pav/', nkos: 'http://w3id.org/nkos/nkostype#', + oboInOwl: 'http://www.geneontology.org/formats/oboInOwl#', idot: 'http://identifiers.org/idot/', sd: 'http://www.w3.org/ns/sparql-service-description#', + cclicense: 'http://creativecommons.org/licenses/' }.freeze def ontologies_analytics LinkedData::Client::Analytics.all.to_h.map do |key, ontology_analytics| @@ -33,11 +35,9 @@ def ontologies_analytics end def get_apikey - unless session[:user].nil? - return session[:user].apikey - else - return LinkedData::Client.settings.apikey - end + return LinkedData::Client.settings.apikey if session[:user].nil? + + session[:user].apikey end def omniauth_providers_info @@ -45,7 +45,7 @@ def omniauth_providers_info end def omniauth_provider_info(strategy) - omniauth_providers_info.select {|k,v| v[:strategy].eql?(strategy.to_sym) || k.eql?(strategy)} + omniauth_providers_info.select { |k, v| v[:strategy].eql?(strategy.to_sym) || k.eql?(strategy) } end def omniauth_token_provider(strategy) @@ -53,17 +53,16 @@ def omniauth_token_provider(strategy) end def isOwner?(id) - unless session[:user].nil? - if session[:user].admin? - return true - elsif session[:user].id.eql?(id) - return true - else - return false - end + return if session[:user].nil? + + if session[:user].admin? + true + elsif session[:user].id.eql?(id) + true + else + false end end - def encode_param(string) CGI.escape(string) @@ -78,23 +77,21 @@ def unescape(string) end def clean(string) - string = string.gsub("\"",'\'') - return string.gsub("\n",'') + string = string.gsub('"', '\'') + string.gsub("\n", '') end def clean_id(string) - new_string = string.gsub(":","").gsub("-","_").gsub(".","_") - return new_string + string.gsub(':', '').gsub('-', '_').gsub('.', '_') end def to_param(string) - "#{encode_param(string.gsub(" ","_"))}" + encode_param(string.gsub(' ', '_')).to_s end def get_username(user_id) user = LinkedData::Client::Models::User.find(user_id) - username = user.nil? ? user_id : user.username - username + user.nil? ? user_id : user.username end def current_user @@ -102,52 +99,49 @@ def current_user end def current_user_admin? - session[:user] && session[:user].admin? + session[:user]&.admin? end def remove_owl_notation(string) # TODO_REV: No OWL notation, but should we modify the IRI? return string - unless string.nil? - strings = string.split(":") - if strings.size<2 - #return string.titleize - return string - else - #return strings[1].titleize - return strings[1] - end + return if string.nil? + + strings = string.split(':') + if strings.size < 2 + # return string.titleize + string + else + # return strings[1].titleize + strings[1] end end - def draw_note_tree(notes,key) - output = "" - draw_note_tree_leaves(notes,0,output,key) - return output + def draw_note_tree(notes, key) + output = '' + draw_note_tree_leaves(notes, 0, output, key) + output end - def draw_note_tree_leaves(notes,level,output,key) - for note in notes - name="Anonymous" - unless note.user.nil? - name=note.user.username - end - headertext="" - notetext="" + def draw_note_tree_leaves(notes, level, output, key) + notes.each do |note| + name = 'Anonymous' + name = note.user.username unless note.user.nil? + headertext = '' + notetext = '' if note.note_type.eql?(5) - headertext<< "
" + headertext << "
" notetext << " #{note.comment}" else - headertext<< "
" + headertext << "
" - notetext<< "#{simple_format(note.comment)}" + notetext << "#{simple_format(note.comment)}" end - output << " -
+
#{headertext}
@@ -165,12 +159,10 @@ def draw_note_tree_leaves(notes,level,output,key) #{notetext}" if session[:user].nil? output << "" + elsif @modal + output << "" else - if @modal - output << "" - else - output << "" - end + output << "" end output << "
@@ -179,8 +171,8 @@ def draw_note_tree_leaves(notes,level,output,key)
" - if(!note.children.nil? && note.children.size>0) - draw_note_tree_leaves(note.children,level+1,output,key) + if !note.children.nil? && note.children.size.positive? + draw_note_tree_leaves(note.children, level + 1, output, key) end end end @@ -193,12 +185,13 @@ def draw_tree(root, acronym, id = nil, concept_schemes = nil) end def build_tree(node, string, id, acronym, concept_schemes: nil) - return string if node.children.nil? || node.children.empty? - - node.children.sort! { |a, b| (main_language_label(a.prefLabel) || a.id).downcase <=> (main_language_label(a.prefLabel) || b.id).downcase } + + node.children.sort! do |a, b| + (main_language_label(a.prefLabel) || a.id).downcase <=> (main_language_label(a.prefLabel) || b.id).downcase + end node.children.each do |child| - active_style = child.id.eql?(id) ? "active" : '' + active_style = child.id.eql?(id) ? 'active' : '' # This fake root will be present at the root of "flat" ontologies, we need to keep the id intact @@ -227,11 +220,11 @@ def tree_link_to_concept(child:, ontology_acronym:, active_style:, node: nil, sk open = child.expanded? ? "class='open'" : '' icons = child.relation_icon(node) muted_style = skos && Array(child.isInActiveScheme).empty? ? 'text-muted' : nil - muted_title = muted_style && !child.obsolete? ? "title='is not in a scheme'" : nil + muted_title = muted_style && !child.obsolete? ? "title='is not in a scheme'" : nil href = ontology_acronym.blank? ? '#' : "/ontologies/#{child.explore.ontology.acronym}/concepts/?id=#{CGI.escape(child.id)}&language=#{language}" link = <<-EOS #{link} #{icons}" end - - def tree_link_to_children(child:, acronym: ,concept_schemes: nil) + def tree_link_to_children(child:, acronym:, concept_schemes: nil) language = request_lang li_id = child.id.eql?('bp_fake_root') ? 'bp_fake_root' : short_uuid - concept_schemes = "&concept_schemes=#{concept_schemes.map{|x| CGI.escape(x)}.join(',')}" if concept_schemes + concept_schemes = "&concept_schemes=#{concept_schemes.map { |x| CGI.escape(x) }.join(',')}" if concept_schemes link = "ajax_class" "
  • #{link}
" end def loading_spinner(padding = false, include_text = true) - loading_text = include_text ? " loading..." : "" + loading_text = include_text ? ' loading...' : '' if padding - raw('
' + image_tag("spinners/spinner_000000_16px.gif", style: "vertical-align: text-bottom;") + loading_text + '
') + raw('
' + image_tag('spinners/spinner_000000_16px.gif', + style: 'vertical-align: text-bottom;') + loading_text + '
') else - raw(image_tag("spinners/spinner_000000_16px.gif", style: "vertical-align: text-bottom;") + loading_text) + raw(image_tag('spinners/spinner_000000_16px.gif', style: 'vertical-align: text-bottom;') + loading_text) end end @@ -269,11 +262,11 @@ def short_uuid end def help_icon(link, html_attribs = {}) - html_attribs["title"] ||= "Help" + html_attribs['title'] ||= 'Help' attribs = [] - html_attribs.each {|k,v| attribs << "#{k.to_s}='#{v}'"} - return <<-BLOCK - + html_attribs.each { |k, v| attribs << "#{k}='#{v}'" } + <<-BLOCK + BLOCK @@ -281,11 +274,11 @@ def help_icon(link, html_attribs = {}) # Create a popup button with a ? inside to display help when hovered def help_tooltip(content, html_attribs = {}, icon = 'fas fa-question-circle', css_class = nil, text = nil) - html_attribs["title"] = content + html_attribs['title'] = content attribs = [] - html_attribs.each {|k,v| attribs << "#{k.to_s}='#{v}'"} - return <<-BLOCK - + html_attribs.each { |k, v| attribs << "#{k}='#{v}'" } + <<-BLOCK + #{text} BLOCK @@ -293,6 +286,7 @@ def help_tooltip(content, html_attribs = {}, icon = 'fas fa-question-circle', cs def error_message_text return @errors if @errors.is_a?(String) + @errors = @errors[:error] if @errors && @errors[:error] "Errors in fields #{@errors.keys.join(', ')}" end @@ -309,19 +303,19 @@ def anonymous_user # # TODO: Fix and failures from removing 'DataAccess' call here. # - #user = DataAccess.getUser($ANONYMOUS_USER) - user ||= User.new({"id" => 0}) + # user = DataAccess.getUser($ANONYMOUS_USER) + user || User.new({ 'id' => 0 }) end def render_advanced_picker(custom_ontologies = nil, selected_ontologies = [], align_to_dom_id = nil) selected_ontologies ||= [] init_ontology_picker(custom_ontologies, selected_ontologies) - render :partial => "shared/ontology_picker_advanced", :locals => { - :custom_ontologies => custom_ontologies, :selected_ontologies => selected_ontologies, :align_to_dom_id => align_to_dom_id + render partial: 'shared/ontology_picker_advanced', locals: { + custom_ontologies: custom_ontologies, selected_ontologies: selected_ontologies, align_to_dom_id: align_to_dom_id } end - def init_ontology_picker(ontologies = nil, selected_ontologies = []) + def init_ontology_picker(ontologies = nil, _selected_ontologies = []) get_ontologies_data(ontologies) get_groups_data get_categories_data @@ -336,7 +330,7 @@ def init_ontology_picker_single end def get_ontologies_data(ontologies = nil) - ontologies ||= LinkedData::Client::Models::Ontology.all(include: "acronym,name") + ontologies ||= LinkedData::Client::Models::Ontology.all(include: 'acronym,name') @onts_for_select = [] @onts_acronym_map = {} @onts_uri2acronym_map = {} @@ -346,18 +340,19 @@ def get_ontologies_data(ontologies = nil) # ont.name instead of ont.ontology.name # ont.id instead of ont.ontology.id # TODO: annotator passes in 'custom_ontologies' to the ontologies parameter. - next if ( ont.acronym.nil? or ont.acronym.empty? ) + next if ont.acronym.nil? || ont.acronym.empty? + acronym = ont.acronym name = ont.name - #id = ont.id # ontology URI - abbreviation = acronym.empty? ? "" : "(#{acronym})" + # id = ont.id # ontology URI + abbreviation = acronym.empty? ? '' : "(#{acronym})" ont_label = "#{name.strip} #{abbreviation}" - #@onts_for_select << [ont_label, id] # using the URI crashes the UI checkbox selection behavior. + # @onts_for_select << [ont_label, id] # using the URI crashes the UI checkbox selection behavior. @onts_for_select << [ont_label, acronym] @onts_acronym_map[ont_label] = acronym - @onts_uri2acronym_map[ont.id] = acronym # required in ontologies_to_acronyms + @onts_uri2acronym_map[ont.id] = acronym # required in ontologies_to_acronyms end - @onts_for_select.sort! { |a,b| a[0].downcase <=> b[0].downcase } + @onts_for_select.sort! { |a, b| a[0].downcase <=> b[0].downcase } @onts_for_js = @onts_acronym_map.to_json end @@ -365,53 +360,53 @@ def categories_for_select # This method is called in the search index page. get_ontologies_data get_categories_data - return @categories_for_select + @categories_for_select end def get_categories_data @categories_for_select = [] @categories_map = {} - categories = LinkedData::Client::Models::Category.all(include: "name,ontologies") + categories = LinkedData::Client::Models::Category.all(include: 'name,ontologies') categories.each do |c| - @categories_for_select << [ c.name, c.id ] + @categories_for_select << [c.name, c.id] @categories_map[c.id] = ontologies_to_acronyms(c.ontologies) # c.ontologies is a list of URIs end - @categories_for_select.sort! { |a,b| a[0].downcase <=> b[0].downcase } + @categories_for_select.sort! { |a, b| a[0].downcase <=> b[0].downcase } @categories_for_js = @categories_map.to_json end def get_groups_data @groups_map = {} @groups_for_select = [] - groups = LinkedData::Client::Models::Group.all(include: "acronym,name,ontologies") + groups = LinkedData::Client::Models::Group.all(include: 'acronym,name,ontologies') groups.each do |g| - next if ( g.acronym.nil? or g.acronym.empty? ) - @groups_for_select << [ g.name + " (#{g.acronym})", g.acronym ] + next if g.acronym.nil? || g.acronym.empty? + + @groups_for_select << [g.name + " (#{g.acronym})", g.acronym] @groups_map[g.acronym] = ontologies_to_acronyms(g.ontologies) # g.ontologies is a list of URIs end - @groups_for_select.sort! { |a,b| a[0].downcase <=> b[0].downcase } + @groups_for_select.sort! { |a, b| a[0].downcase <=> b[0].downcase } @groups_for_js = @groups_map.to_json end def metadata_for_select get_metadata - return @metadata_for_select + @metadata_for_select end def get_metadata @metadata_for_select = [] submission_metadata.each do |data| - @metadata_for_select << data["attribute"] + @metadata_for_select << data['attribute'] end end - def ontologies_to_acronyms(ontologyIDs) acronyms = [] ontologyIDs.each do |id| - acronyms << @onts_uri2acronym_map[id] # hash generated in get_ontologies_data + acronyms << @onts_uri2acronym_map[id] # hash generated in get_ontologies_data end - return acronyms.compact # remove nil values from any failures to convert ontology URI to acronym + acronyms.compact # remove nil values from any failures to convert ontology URI to acronym end def at_slice? @@ -420,44 +415,44 @@ def at_slice? def truncate_with_more(text, options = {}) length ||= options[:length] ||= 30 - trailing_text ||= options[:trailing_text] ||= " ... " - link_more ||= options[:link_more] ||= "[more]" - link_less ||= options[:link_less] ||= "[less]" + trailing_text ||= options[:trailing_text] ||= ' ... ' + link_more ||= options[:link_more] ||= '[more]' + link_less ||= options[:link_less] ||= '[less]' more_text = " #{link_more}#{text} #{link_less}" - more = text.length > length ? more_text : "" - output = "#{truncate(text, :length => length, :omission => trailing_text)}" + more + "" + more = text.length > length ? more_text : '' + "#{truncate(text, length: length, + omission: trailing_text)}" + more + '' end - def add_comment_button(parent_id, parent_type) if session[:user].nil? - link_to "Add comment", login_index_path(redirect: request.url), class: "link_button" + link_to 'Add comment', login_index_path(redirect: request.url), class: 'link_button' else - link_to_modal "Add comment", notes_new_comment_path(parent_id: parent_id, parent_type: parent_type, ontology_id: @ontology.acronym), - class: "add_comment btn btn-primary", data: { show_modal_title_value: "Add a new comment"} + link_to_modal 'Add comment', notes_new_comment_path(parent_id: parent_id, parent_type: parent_type, ontology_id: @ontology.acronym), + class: 'add_comment btn btn-primary', data: { show_modal_title_value: 'Add a new comment' } end end def add_reply_button(parent_id) if session[:user].nil? - link_to "Reply", login_index_path, 'data-turbo': false + link_to 'Reply', login_index_path, 'data-turbo': false else - link_to 'Reply', notes_new_reply_path(parent_id: parent_id ), "data-turbo-frame": "#{parent_id}_new_reply" + link_to 'Reply', notes_new_reply_path(parent_id: parent_id), "data-turbo-frame": "#{parent_id}_new_reply" end end - def add_proposal_button(parent_id, parent_type) if session[:user].nil? - link_to "Add proposal", login_index_path(redirect: request.url), class: "link_button" + link_to 'Add proposal', login_index_path(redirect: request.url), class: 'link_button' else - link_to_modal "Add proposal", notes_new_proposal_path(parent_id: parent_id, parent_type: parent_type, ontology_id: @ontology.acronym), - class: "add_proposal btn btn-primary", data: { show_modal_title_value: "Add a new proposal"} + link_to_modal 'Add proposal', notes_new_proposal_path(parent_id: parent_id, parent_type: parent_type, ontology_id: @ontology.acronym), + class: 'add_proposal btn btn-primary', data: { show_modal_title_value: 'Add a new proposal' } end end def subscribe_button(ontology_id) return if ontology_id.nil? + ontology_acronym = ontology_id.split('/').last if session[:user].nil? @@ -467,24 +462,26 @@ def subscribe_button(ontology_id) else user = LinkedData::Client::Models::User.find(session[:user].id) subscribed = subscribed_to_ontology?(ontology_acronym, user) - link = "javascript:void(0);" + link = 'javascript:void(0);' user_id = user.id end count = count_subscriptions(ontology_id) - render OntologySubscribeButtonComponent.new(ontology_id: ontology_id, subscribed: subscribed, user_id: user_id, count: count, link: link) + render OntologySubscribeButtonComponent.new(ontology_id: ontology_id, subscribed: subscribed, user_id: user_id, + count: count, link: link) end def subscribed_to_ontology?(ontology_acronym, user) user.bring(:subscription) if user.subscription.nil? # user.subscription is an array of subscriptions like {ontology: ontology_id, notification_type: "NOTES"} - return false if user.subscription.nil? or user.subscription.empty? + return false if user.subscription.nil? || user.subscription.empty? + user.subscription.each do |sub| - #sub = {ontology: ontology_acronym, notification_type: "NOTES"} - sub_ont_acronym = sub[:ontology] ? sub[:ontology].split('/').last : nil # make sure we get the acronym, even if it's a full URI + # sub = {ontology: ontology_acronym, notification_type: "NOTES"} + sub_ont_acronym = sub[:ontology]&.split('/')&.last # make sure we get the acronym, even if it's a full URI return true if sub_ont_acronym == ontology_acronym end - return false + false end def ontolobridge_instructions_template(ontology) @@ -494,10 +491,9 @@ def ontolobridge_instructions_template(ontology) # http://stackoverflow.com/questions/1293573/rails-smart-text-truncation def smart_truncate(s, opts = {}) - opts = {:words => 20}.merge(opts) - if opts[:sentences] - return s.split(/\.(\s|$)+/)[0, opts[:sentences]].map{|s| s.strip}.join('. ') + '. ...' - end + opts = { words: 20 }.merge(opts) + return "#{s.split(/\.(\s|$)+/)[0, opts[:sentences]].map(&:strip).join('. ')}. ..." if opts[:sentences] + a = s.split(/\s/) # or /[ ]+/ to only split on spaces n = opts[:words] a[0...n].join(' ') + (a.size > n ? '...' : '') @@ -508,11 +504,11 @@ def smart_truncate(s, opts = {}) # => '06/27/2010' def xmldatetime_to_date(xml_date_time_str) require 'date' - d = DateTime.xmlschema( xml_date_time_str ).to_date + d = DateTime.xmlschema(xml_date_time_str).to_date # Return conventional US date format: - return sprintf("%02d/%02d/%4d", d.month, d.day, d.year) + format('%02d/%02d/%4d', d.month, d.day, d.year) # Or return "yyyy/mm/dd" format with: - #return DateTime.xmlschema( xml_date_time_str ).to_date.to_s + # return DateTime.xmlschema( xml_date_time_str ).to_date.to_s end def notification_type(flash_key) @@ -525,22 +521,22 @@ def notification_type(flash_key) bootstrap_alert_class[flash_key] end - ###BEGIN ruby equivalent of JS code in bp_ajax_controller. - ###Note: this code is used in concepts/_details partial. + # ##BEGIN ruby equivalent of JS code in bp_ajax_controller. + # ##Note: this code is used in concepts/_details partial. def bp_ont_link(ont_acronym) - return "/ontologies/#{ont_acronym}" + "/ontologies/#{ont_acronym}" end def bp_class_link(cls_id, ont_acronym) - return "#{bp_ont_link(ont_acronym)}?p=classes&conceptid=#{escape(cls_id)}&language=#{request_lang}" + "#{bp_ont_link(ont_acronym)}?p=classes&conceptid=#{escape(cls_id)}&language=#{request_lang}" end def bp_scheme_link(scheme_id, ont_acronym) - return "#{bp_ont_link(ont_acronym)}?p=schemes&schemeid=#{escape(scheme_id)}" + "#{bp_ont_link(ont_acronym)}?p=schemes&schemeid=#{escape(scheme_id)}" end def bp_label_xl_link(label_xl_id, ont_acronym) - return "#{bp_ont_link(ont_acronym)}/?label_xl_id=#{escape(label_xl_id)}" + "#{bp_ont_link(ont_acronym)}/?label_xl_id=#{escape(label_xl_id)}" end def bp_collection_link(collection_id, ont_acronym) @@ -554,8 +550,7 @@ def label_ajax_data_h(cls_id, ont_acronym, ajax_uri, cls_url) 'label-ajax-ontology-acronym-value': ont_acronym, 'label-ajax-ajax-url-value': ajax_uri, 'label-ajax-cls-id-url-value': cls_url - } - } + } } end def label_ajax_data(cls_id, ont_acronym, ajax_uri, cls_url) @@ -564,7 +559,7 @@ def label_ajax_data(cls_id, ont_acronym, ajax_uri, cls_url) def label_ajax_link(link, cls_id, ont_acronym, ajax_uri, cls_url, target = nil) data = label_ajax_data(cls_id, ont_acronym, ajax_uri, cls_url) - options = { 'data-controller': 'label-ajax' }.merge(data) + options = { 'data-controller': 'label-ajax' }.merge(data) options = options.merge({ target: target }) if target render ChipButtonComponent.new(url: link, text: cls_id, type: 'clickable', **options) @@ -575,7 +570,7 @@ def get_link_for_cls_ajax(cls_id, ont_acronym, target = nil) link = bp_class_link(cls_id, ont_acronym) ajax_url = '/ajax/classes/label' cls_url = "/ontologies/#{ont_acronym}?p=classes&conceptid=#{CGI.escape(cls_id)}" - label_ajax_link(link, cls_id, ont_acronym, ajax_url , cls_url ,target) + label_ajax_link(link, cls_id, ont_acronym, ajax_url, cls_url, target) else auto_link(cls_id, :all, target: '_blank') end @@ -585,7 +580,7 @@ def get_link_for_ont_ajax(ont_acronym) # ajax call will replace the acronym with an ontology name (triggered by class='ont4ajax') href_ont = " href='#{bp_ont_link(ont_acronym)}' " data_ont = " data-ont='#{ont_acronym}' " - return "#{ont_acronym}" + "#{ont_acronym}" end def get_link_for_scheme_ajax(scheme, ont_acronym, target = '_blank') @@ -602,7 +597,6 @@ def get_link_for_collection_ajax(collection, ont_acronym, target = '_blank') label_ajax_link(link, collection, ont_acronym, ajax_url, collection_url, target) end - def get_link_for_label_xl_ajax(label_xl, ont_acronym, cls_id, modal: true) link = label_xl ajax_uri = "/ajax/label_xl/label?cls_id=#{CGI.escape(cls_id)}" @@ -610,21 +604,17 @@ def get_link_for_label_xl_ajax(label_xl, ont_acronym, cls_id, modal: true) data = label_ajax_data_h(label_xl, ont_acronym, ajax_uri, label_xl_url) data[:data][:controller] = 'label-ajax' if modal - link_to_modal(cls_id, link, {data: data[:data] , class: 'btn btn-sm btn-light'}) + link_to_modal(cls_id, link, { data: data[:data], class: 'btn btn-sm btn-light' }) else - link_to(link,'', {data: data[:data], class: 'btn btn-sm btn-light', target: '_blank'}) + link_to(link, '', { data: data[:data], class: 'btn btn-sm btn-light', target: '_blank' }) end - - end - ###END ruby equivalent of JS code in bp_ajax_controller. + # ##END ruby equivalent of JS code in bp_ajax_controller. def ontology_viewer_page_name(ontology_name, concept_label, page) - ontology_name + " | " + main_language_label(concept_label) + " - #{page.capitalize}" + "#{ontology_name} | #{main_language_label(concept_label)} - #{page.capitalize}" end - - def uri?(url) url =~ /\A#{URI::DEFAULT_PARSER.make_regexp(%w[http https])}\z/ end @@ -633,10 +623,10 @@ def extract_label_from(uri) label = uri.to_s.chomp('/').chomp('#') index = label.index('#') if !index.nil? - label = label[(index + 1) , uri.length-1] + label = label[(index + 1), uri.length - 1] else index = label.rindex('/') - label = label[(index + 1), uri.length-1] if index > -1 && index < (uri.length - 1) + label = label[(index + 1), uri.length - 1] if index > -1 && index < (uri.length - 1) end label end @@ -652,7 +642,7 @@ def current_page?(path) def request_lang lang = params[:language] || params[:lang] - lang = 'EN' unless lang + lang ||= 'EN' lang.upcase end @@ -677,27 +667,32 @@ def bp_config_json interportal_hash: $INTERPORTAL_HASH, resolve_namespace: RESOLVE_NAMESPACE } - config[:ncbo_slice] = @subdomain_filter[:acronym] if (@subdomain_filter[:active] && !@subdomain_filter[:acronym].empty?) + if @subdomain_filter[:active] && !@subdomain_filter[:acronym].empty? + config[:ncbo_slice] = + @subdomain_filter[:acronym] + end config.to_json end + def portal_name $SITE - end + end + def navitems - items = [["/ontologies", t('layout.header.browse')], - ["/mappings", t('layout.header.mappings')], - ["/recommender", t("layout.header.recommender")], - ["/annotator", t("layout.header.annotator")], - ["/landscape", t("layout.header.landscape")]] + [['/ontologies', t('layout.header.browse')], + ['/mappings', t('layout.header.mappings')], + ['/recommender', t('layout.header.recommender')], + ['/annotator', t('layout.header.annotator')], + ['/landscape', t('layout.header.landscape')]] end def portal_language_selector(id: 'language-select') - languages = %w[en fr it de].map{|x| [x.upcase, x]} - select_tag('language',options_for_select(languages), id: id, class: 'nav-language', - data: { controller: "platform-language", action: "change->platform-language#handleLangChanged" }) - + languages = %w[en fr it de].map { |x| [x.upcase, x] } + select_tag('language', options_for_select(languages), id: id, class: 'nav-language', + data: { controller: 'platform-language', action: 'change->platform-language#handleLangChanged' }) end + def attribute_enforced_values(attr) - submission_metadata.select {|x| x['@id'][attr]}.first['enforcedValues'] + submission_metadata.select { |x| x['@id'][attr] }.first['enforcedValues'] end end diff --git a/app/helpers/collections_helper.rb b/app/helpers/collections_helper.rb index f1c8ca4d60..c339858d48 100644 --- a/app/helpers/collections_helper.rb +++ b/app/helpers/collections_helper.rb @@ -1,6 +1,6 @@ -module CollectionsHelper - +# frozen_string_literal: true +module CollectionsHelper def get_collections(ontology, add_colors: false) collections = ontology.explore.collections(language: request_lang) generate_collections_colors(collections) if add_colors @@ -8,7 +8,7 @@ def get_collections(ontology, add_colors: false) end def get_collection(ontology, collection_uri) - ontology.explore.collections({ include: 'all', language: request_lang},collection_uri) + ontology.explore.collections({ include: 'all', language: request_lang }, collection_uri) end def get_collection_label(collection) @@ -20,7 +20,6 @@ def get_collection_label(collection) end def get_collections_labels(collections, main_uri = '') - selected_label = nil collections_labels = [] collections.each do |x| @@ -29,7 +28,7 @@ def get_collections_labels(collections, main_uri = '') if id.eql? main_uri selected_label = { 'prefLabel' => label, '@id' => id } else - collections_labels.append( { 'prefLabel' => label, '@id' => id , 'color' => x['color'] }) + collections_labels.append({ 'prefLabel' => label, '@id' => id, 'color' => x['color'] }) end end @@ -62,9 +61,9 @@ def sort_collections_label(collections_labels) def link_to_collection(collection, selected_collection_id) pref_label_lang, pref_label_html = get_collection_label(collection) - tooltip = pref_label_lang.to_s.eql?('@none') ? '' : "data-controller='tooltip' data-tooltip-position-value='right' title='#{pref_label_lang.upcase}'" + tooltip = pref_label_lang.to_s.eql?('@none') ? '' : "data-controller='tooltip' data-tooltip-position-value='right' title='#{pref_label_lang.upcase}'" <<-EOS - @@ -81,4 +80,3 @@ def generate_collections_colors(collections) end end end - diff --git a/app/helpers/components_helper.rb b/app/helpers/components_helper.rb index 5b9c217d76..e93bec6987 100644 --- a/app/helpers/components_helper.rb +++ b/app/helpers/components_helper.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module ComponentsHelper def info_tooltip(text) render Display::InfoTooltipComponent.new(text: text) @@ -6,7 +8,7 @@ def info_tooltip(text) def empty_state_message(message) content_tag(:p, message.html_safe, class: 'font-italic field-description_text') end - + def properties_list_component(c, properties, &block) properties.each do |k, v| c.row do @@ -15,15 +17,14 @@ def properties_list_component(c, properties, &block) else v end - render FieldContainerComponent.new(label: attr_label(k, attr_metadata: attr_metadata(k), show_tooltip: false)) do + render FieldContainerComponent.new(label: attr_label(k, attr_metadata: attr_metadata(k), + show_tooltip: false)) do content end end end - end - def horizontal_list_container(values, &block) return if Array(values).empty? @@ -64,7 +65,11 @@ def properties_card(title, tooltip, properties, &block) def properties_dropdown(id, title, tooltip, properties, &block) render DropdownContainerComponent.new(title: title, id: id, tooltip: tooltip) do |d| d.empty_state do - properties_string = properties.keys[0..4].map{|key| "#{attr_label(key, attr_metadata: attr_metadata(key), show_tooltip: false)}" }.join(', ')+'... ' if properties + if properties + properties_string = properties.keys[0..4].map { |key| + "#{attr_label(key, attr_metadata: attr_metadata(key), show_tooltip: false)}" + }.join(', ') + '... ' + end empty_state_message "The fields #{properties_string} are empty" end diff --git a/app/helpers/concepts_helper.rb b/app/helpers/concepts_helper.rb index 4418e6d52c..e15ca22d70 100644 --- a/app/helpers/concepts_helper.rb +++ b/app/helpers/concepts_helper.rb @@ -1,4 +1,5 @@ # frozen_string_literal: true + module ConceptsHelper def exclude_relation?(relation_to_check, ontology = nil) excluded_relations = %w[type rdf:type [R] SuperClass InstanceCount] @@ -29,19 +30,19 @@ def get_concept_id(params, concept, root) end def sub_menu_active?(section) - params["sub_menu"]&.eql? section + params['sub_menu']&.eql? section end def sub_menu_active_class(section) - "active show" if sub_menu_active?(section) + 'active show' if sub_menu_active?(section) end def default_sub_menu? !sub_menu_active?('list') && !sub_menu_active?('date') end - + def default_sub_menu_class - "active show" if default_sub_menu? + 'active show' if default_sub_menu? end def concept_label(ont_id, cls_id) @@ -50,16 +51,16 @@ def concept_label(ont_id, cls_id) ontology_not_found(ont_id) unless @ontology # Retrieve a class prefLabel or return the class ID (URI) # - mappings may contain class URIs that are not in bioportal (e.g. obo-xrefs) - cls = @ontology.explore.single_class({language: request_lang, include: 'prefLabel'}, cls_id) + cls = @ontology.explore.single_class({ language: request_lang, include: 'prefLabel' }, cls_id) # TODO: log any cls.errors # TODO: NCBO-402 might be implemented here, but it throws off a lot of ajax result rendering. - #cls_label = cls.prefLabel({:use_html => true}) || cls_id + # cls_label = cls.prefLabel({:use_html => true}) || cls_id cls.prefLabel || cls_id end def concept_id_param_exist?(params) - !(params[:conceptid].nil? || params[:conceptid].empty? || params[:conceptid].eql?("root") || - params[:conceptid].eql?("bp_fake_root")) + !(params[:conceptid].nil? || params[:conceptid].empty? || params[:conceptid].eql?('root') || + params[:conceptid].eql?('bp_fake_root')) end def concept_date(concept) @@ -75,6 +76,7 @@ def sorted_by_date_url(page = 1, last_concept = nil) def same_period?(year, month, date) return false if date.nil? + date = Date.parse(date.to_s) year.eql?(date.year) && month.eql?(date.strftime('%B')) end @@ -88,7 +90,7 @@ def concepts_li_list(concepts) end def render_concepts_by_dates - return if @concepts_year_month.empty? + return if @concepts_year_month.empty? first_year, first_month_concepts = @concepts_year_month.shift first_month, first_concepts = first_month_concepts.shift @@ -106,9 +108,9 @@ def render_concepts_by_dates @concepts_year_month.each do |year, month_concepts| month_concepts.each do |month, concepts| - out += "
    #{month + ' ' + year.to_s}" + out += "
      #{"#{month} #{year}"}" out += concepts_li_list(concepts) - out += "
    " + out += '
' end end @@ -119,7 +121,6 @@ def concept_list_url(page = 1, collection_id, acronym) "/ajax/classes/list?ontology_id=#{acronym}&collection_id=#{collection_id}&page=#{page}" end - def add_synonym_button return unless change_requests_enabled?(@ontology.acronym) @@ -170,4 +171,4 @@ def synonym_qualifier_select(form) def concept_redirect_path ontology_path(@ontology.acronym, p: 'classes', conceptid: @concept.id) end -end \ No newline at end of file +end diff --git a/app/helpers/error_helpers.rb b/app/helpers/error_helpers.rb index 1bf058991f..cbf908ec56 100644 --- a/app/helpers/error_helpers.rb +++ b/app/helpers/error_helpers.rb @@ -1,14 +1,14 @@ -module ErrorHelpers +# frozen_string_literal: true +module ErrorHelpers def self.not_browsable_text(concept) case concept.type.downcase - when "individual" - return "Sorry, the class #{concept.label} cannot be viewed because it refers to an individual" - when "property" - return "Sorry, the class #{concept.label} cannot be viewed because it refers to a property" - else - return "Sorry, an error has occurred" + when 'individual' + "Sorry, the class #{concept.label} cannot be viewed because it refers to an individual" + when 'property' + "Sorry, the class #{concept.label} cannot be viewed because it refers to a property" + else + 'Sorry, an error has occurred' end end - end diff --git a/app/helpers/fair_score_helper.rb b/app/helpers/fair_score_helper.rb index 6febe47e6e..79decc3c3c 100644 --- a/app/helpers/fair_score_helper.rb +++ b/app/helpers/fair_score_helper.rb @@ -1,23 +1,23 @@ -module FairScoreHelper +# frozen_string_literal: true +module FairScoreHelper def user_apikey session[:user].nil? ? '' : session[:user].apikey end def fairness_service_enabled? - !$FAIRNESS_DISABLED + !$FAIRNESS_DISABLED || !$FAIRNESS_URL.blank? end def get_fairness_service_url(apikey = user_apikey) "#{$FAIRNESS_URL}?portal=#{$HOSTNAME.split('.')[0]}#{apikey.nil? || apikey.empty? ? '' : "&apikey=#{apikey}"}" end + def get_fairness_json(ontologies_acronyms, apikey = user_apikey) - begin - MultiJson.load(Faraday.get(get_fairness_service_url(apikey) + "&ontologies=#{ontologies_acronyms}&combined").body.force_encoding('ISO-8859-1').encode('UTF-8')) - rescue - Rails.logger.warn "FAIRness service issue unreachable" - {} - end + MultiJson.load(Faraday.get(get_fairness_service_url(apikey) + "&ontologies=#{ontologies_acronyms}&combined").body.force_encoding('ISO-8859-1').encode('UTF-8')) + rescue StandardError + Rails.logger.warn 'FAIRness service issue unreachable' + {} end def get_fair_score(ontologies_acronyms, apikey = user_apikey) @@ -28,30 +28,31 @@ def get_fair_combined_score(ontologies_acronyms, apikey = user_apikey) get_fairness_json(ontologies_acronyms, apikey)['combinedScores'] end - def create_fair_scores_data(fair_scores, count = nil) return nil if fair_scores.nil? fair_scores_data = {} - fair_scores_data[:principles] = {labels:[] , scores:[] , normalizedScores: [] , maxCredits: [] , portalMaxCredits: []} - fair_scores_data[:criteria] = { labels:[] , scores:[] , normalizedScores: [] , portalMaxCredits: [], questions: [] ,maxCredits: [] , descriptions: []} + fair_scores_data[:principles] = + { labels: [], scores: [], normalizedScores: [], maxCredits: [], portalMaxCredits: [] } + fair_scores_data[:criteria] = + { labels: [], scores: [], normalizedScores: [], portalMaxCredits: [], questions: [], maxCredits: [], + descriptions: [] } fair_scores_data[:score] = fair_scores['score'].to_f.round(2) fair_scores_data[:normalizedScore] = fair_scores['normalizedScore'].to_f.round(2) fair_scores_data[:minScore] = fair_scores['minScore'].to_f.round(2) fair_scores_data[:maxScore] = fair_scores['maxScore'].to_f.round(2) fair_scores_data[:medianScore] = fair_scores['medianScore'].to_f.round(2) fair_scores_data[:maxCredits] = fair_scores['maxCredits'].to_i - fair_scores_data[:resourceCount] = count unless count.nil? - - fair_scores.to_h.select { |k,v| (v.is_a? Hash) }.each do |key, principle| + fair_scores_data[:resourceCount] = count unless count.nil? + fair_scores.to_h.select { |_k, v| (v.is_a? Hash) }.each do |key, principle| fair_scores_data[:principles][:labels] << key fair_scores_data[:principles][:scores] << (principle['score'].to_f.round(2)) fair_scores_data[:principles][:normalizedScores] << (principle['normalizedScore'].to_f.round(2)) fair_scores_data[:principles][:maxCredits] << principle['maxCredits'] fair_scores_data[:principles][:portalMaxCredits] << principle['portalMaxCredits'] - principle.to_h.select { |k,v| (v.is_a? Hash) }.each do |key , criterion| + principle.to_h.select { |_k, v| (v.is_a? Hash) }.each do |key, criterion| fair_scores_data[:criteria][:labels] << key fair_scores_data[:criteria][:descriptions] << criterion['label'] fair_scores_data[:criteria][:scores] << (criterion['score'].to_f.round(2)) @@ -67,21 +68,20 @@ def create_fair_scores_data(fair_scores, count = nil) end def get_not_obtained_score(fair_scores_data, index) - fair_scores_data[:criteria][:portalMaxCredits][index] - fair_scores_data[:criteria][:scores][index] + fair_scores_data[:criteria][:portalMaxCredits][index] - fair_scores_data[:criteria][:scores][index] end def get_not_obtained_score_normalized(fair_scores_data, index) - score_rest = get_rest_score(fair_scores_data,index) - not_obtained_score = get_not_obtained_score(fair_scores_data , index) + score_rest = get_rest_score(fair_scores_data, index) + not_obtained_score = get_not_obtained_score(fair_scores_data, index) if not_obtained_score.positive? && score_rest.positive? - ((not_obtained_score / fair_scores_data[:criteria][:maxCredits][index]) * 100).round() + ((not_obtained_score / fair_scores_data[:criteria][:maxCredits][index]) * 100).round elsif score_rest.zero? - 100 - fair_scores_data[:criteria][:normalizedScores][index] + 100 - fair_scores_data[:criteria][:normalizedScores][index] else - 0 + 0 end - end def get_rest_score(fair_scores_data, index) @@ -89,15 +89,14 @@ def get_rest_score(fair_scores_data, index) end def get_rest_score_normalized(fair_scores_data, index) - score_rest = get_rest_score(fair_scores_data ,index) - not_obtained_score_normalized = get_not_obtained_score_normalized(fair_scores_data , index) + score_rest = get_rest_score(fair_scores_data, index) + not_obtained_score_normalized = get_not_obtained_score_normalized(fair_scores_data, index) if score_rest.positive? 100 - not_obtained_score_normalized - fair_scores_data[:criteria][:normalizedScores][index] else 0 end - end def not_implemented?(question) @@ -114,11 +113,10 @@ def default_score?(question) end def get_name_with_out_dot(name) - name.to_s.gsub(/\./,'') + name.to_s.gsub(/\./, '') end def print_score(score) number_with_precision(score, precision: 2, strip_insignificant_zeros: true) end end - diff --git a/app/helpers/home_helper.rb b/app/helpers/home_helper.rb index 7b14c5ba45..b831b1579b 100644 --- a/app/helpers/home_helper.rb +++ b/app/helpers/home_helper.rb @@ -1,15 +1,18 @@ +# frozen_string_literal: true + require 'open-uri' require 'open_uri_redirections' require 'nokogiri' module HomeHelper - def render_footer_link(options = {}) link_content = options[:text][I18n.locale] || options[:text][:en] if options[:text] link_content ||= image_tag(options[:img_src]) if options[:img_src] link_content ||= content_tag(:i, '', class: options[:icon]) if options[:icon] - - link_to(link_content, options[:url], target: options[:target], class: options[:css_class].to_s, style: options[:text].blank? ? 'text-decoration: none' : '').html_safe if link_content - end -end \ No newline at end of file + return unless link_content + + link_to(link_content, options[:url], target: options[:target], class: options[:css_class].to_s, + style: options[:text].blank? ? 'text-decoration: none' : '').html_safe + end +end diff --git a/app/helpers/inputs_helper.rb b/app/helpers/inputs_helper.rb index a2e81eb4fe..b9582b7763 100644 --- a/app/helpers/inputs_helper.rb +++ b/app/helpers/inputs_helper.rb @@ -1,5 +1,6 @@ -module InputsHelper +# frozen_string_literal: true +module InputsHelper def text_input(name:, value:, label: nil, disabled: false, help: nil, error_message: nil) render Input::TextInputComponent.new(label: input_label(label, name), name: name, value: value, error_message: error_message || input_error_message(name), @@ -19,13 +20,14 @@ def check_input(id:, name:, value:, label: '', checked: false) end def switch_input(id:, name:, label:, checked: false, value: '', boolean_switch: false) - render SwitchInputComponent.new(id: id, name: name, label: label, checked: checked, value: value, boolean_switch: boolean_switch) + render SwitchInputComponent.new(id: id, name: name, label: label, checked: checked, value: value, + boolean_switch: boolean_switch) end def url_input(name:, value:, label: nil, help: nil) render Input::UrlComponent.new(label: input_label(label, name), name: name, value: value, error_message: input_error_message(name), - helper_text: help) + helper_text: help) end def text_area_input(name:, value:, label: nil, help: nil) @@ -53,7 +55,7 @@ def input_label(label, name) end def attribute_error(attr) - return '' if @errors&.is_a?(String) + return '' if @errors.is_a?(String) return '' unless @errors && @errors[attr.to_sym] errors = @errors[attr.to_sym] @@ -64,4 +66,4 @@ def attribute_error(attr) def input_error_message(name) attribute_error(method_name(name)) end -end \ No newline at end of file +end diff --git a/app/helpers/instances_helper.rb b/app/helpers/instances_helper.rb index ec19cd36fc..076d7e1845 100644 --- a/app/helpers/instances_helper.rb +++ b/app/helpers/instances_helper.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module InstancesHelper include ConceptsHelper include ApplicationHelper @@ -9,7 +11,7 @@ def get_instances_by_ontology_json(ontology, query_parameters) ontology.explore.instances(query_parameters) end - def get_instance_details_json(ontology_acronym, instance_uri , query_parameters, raw: false) + def get_instance_details_json(ontology_acronym, instance_uri, query_parameters, raw: false) LinkedData::Client::HTTP .get("/ontologies/#{ontology_acronym}/instances/#{CGI.escape(instance_uri)}", query_parameters, raw: raw) @@ -19,9 +21,9 @@ def get_instance_and_type(instance_id) if instance_id.nil? [{}, nil] else - instance_details = JSON.parse(get_instance_details_json(@ontology.acronym,instance_id, {}, raw: true)) - if(!instance_details['types'].nil?) - types = instance_details['types'].reject{ |type| type.eql? 'http://www.w3.org/2002/07/owl#NamedIndividual'} + instance_details = JSON.parse(get_instance_details_json(@ontology.acronym, instance_id, {}, raw: true)) + if !instance_details['types'].nil? + types = instance_details['types'].reject { |type| type.eql? 'http://www.w3.org/2002/07/owl#NamedIndividual' } [instance_details, types[0]] else [{}, nil] @@ -31,41 +33,41 @@ def get_instance_and_type(instance_id) def instance_label(instance) labels = instance['label'] - labels = labels.first if labels.kind_of?(Array) + labels = labels.first if labels.is_a?(Array) labels || instance['prefLabel'] || extract_label_from(instance['@id']) end def type_of(instance) except_types = ['http://www.w3.org/2002/07/owl#NamedIndividual'] - out = instance['types'].filter{ |x| !except_types.include?(x)} + out = instance['types'].filter { |x| !except_types.include?(x) } if !out.empty? - out.first + out.first else - "" + '' end end def link_to_instance(instance, ontology_acronym) link_to instance_label(instance), - ontology_path(ontology_acronym, p: 'classes', conceptid:type_of(instance), instanceid:instance['@id']), - {target: '_blank'} + ontology_path(ontology_acronym, p: 'classes', conceptid: type_of(instance), instanceid: instance['@id']), + { target: '_blank' } end def link_to_class(ontology_acronym, conceptid) link_to concept_label(ontology_acronym, conceptid), - ontology_path(ontology_acronym, p: 'classes', conceptid:conceptid), - {target: '_blank'} + ontology_path(ontology_acronym, p: 'classes', conceptid: conceptid), + { target: '_blank' } end def link_to_property(property, ontology_acronym) link_to extract_label_from(property), ontology_path(ontology_acronym, p: 'properties'), - { target: '_blank'} + { target: '_blank' } end def instance_property_value(property, ontology_acronym) if uri?(property) - instance, types = get_instance_and_type(property) + instance, = get_instance_and_type(property) return link_to_instance instance, ontology_acronym unless instance.empty? end property @@ -73,8 +75,7 @@ def instance_property_value(property, ontology_acronym) def add_labels_to_print(instance, ontology_acronym) instance['labelToPrint'] = instance_label(instance) - instance['types'].map!{ |t| {type:t, labelToPrint:concept_label(ontology_acronym , t)}} + instance['types'].map! { |t| { type: t, labelToPrint: concept_label(ontology_acronym, t) } } instance end - end diff --git a/app/helpers/label_xl_helper.rb b/app/helpers/label_xl_helper.rb index d5081bb405..fee37cb62c 100644 --- a/app/helpers/label_xl_helper.rb +++ b/app/helpers/label_xl_helper.rb @@ -1,7 +1,8 @@ -module LabelXlHelper +# frozen_string_literal: true +module LabelXlHelper def get_label_xl(ontology, label_xl_uri) - ontology.explore.xl_labels({ include: 'all', lang: 'all'}, label_xl_uri) + ontology.explore.xl_labels({ include: 'all', lang: 'all' }, label_xl_uri) end def get_label_xl_label(label_xl) diff --git a/app/helpers/landscape_helper.rb b/app/helpers/landscape_helper.rb index 6cef3b1839..d8a3e26184 100644 --- a/app/helpers/landscape_helper.rb +++ b/app/helpers/landscape_helper.rb @@ -1,2 +1,4 @@ +# frozen_string_literal: true + module LandscapeHelper end diff --git a/app/helpers/mappings_helper.rb b/app/helpers/mappings_helper.rb index 2f32f16d7d..e734ca407e 100644 --- a/app/helpers/mappings_helper.rb +++ b/app/helpers/mappings_helper.rb @@ -1,37 +1,38 @@ -module MappingsHelper +# frozen_string_literal: true +module MappingsHelper RELATIONSHIP_URIS = { - "http://www.w3.org/2004/02/skos/core" => "skos:", - "http://www.w3.org/2000/01/rdf-schema" => "rdfs:", - "http://www.w3.org/2002/07/owl" => "owl:", - "http://www.w3.org/1999/02/22-rdf-syntax-ns" => "rdf:" - } + 'http://www.w3.org/2004/02/skos/core' => 'skos:', + 'http://www.w3.org/2000/01/rdf-schema' => 'rdfs:', + 'http://www.w3.org/2002/07/owl' => 'owl:', + 'http://www.w3.org/1999/02/22-rdf-syntax-ns' => 'rdf:' + }.freeze # Used to replace the full URI by the prefixed URI RELATIONSHIP_PREFIX = { - "http://www.w3.org/2004/02/skos/core#" => "skos:", - "http://www.w3.org/2000/01/rdf-schema#" => "rdfs:", - "http://www.w3.org/2002/07/owl#" => "owl:", - "http://www.w3.org/1999/02/22-rdf-syntax-ns#" => "rdf:", - "http://purl.org/linguistics/gold/" => "gold:", - "http://lemon-model.net/lemon#" => "lemon:" - } + 'http://www.w3.org/2004/02/skos/core#' => 'skos:', + 'http://www.w3.org/2000/01/rdf-schema#' => 'rdfs:', + 'http://www.w3.org/2002/07/owl#' => 'owl:', + 'http://www.w3.org/1999/02/22-rdf-syntax-ns#' => 'rdf:', + 'http://purl.org/linguistics/gold/' => 'gold:', + 'http://lemon-model.net/lemon#' => 'lemon:' + }.freeze INTERPORTAL_HASH = $INTERPORTAL_HASH def get_short_id(uri) - split = uri.split("#") + split = uri.split('#') name = split.length > 1 && RELATIONSHIP_URIS.keys.include?(split[0]) ? RELATIONSHIP_URIS[split[0]] + split[1] : uri "
#{name}" end # a little method that returns true if the URIs array contain a gold:translation or gold:freeTranslation def translation?(relation_array) - if relation_array.kind_of?(Array) + if relation_array.is_a?(Array) relation_array.map!(&:downcase) - if relation_array.include? "http://purl.org/linguistics/gold/translation" + if relation_array.include? 'http://purl.org/linguistics/gold/translation' true - elsif relation_array.include? "http://purl.org/linguistics/gold/freetranslation" + elsif relation_array.include? 'http://purl.org/linguistics/gold/freetranslation' true else false @@ -44,51 +45,47 @@ def translation?(relation_array) # a little method that returns the uri with a prefix : http://purl.org/linguistics/gold/translation become gold:translation def get_prefixed_uri(uri) RELATIONSHIP_PREFIX.each { |k, v| uri.sub!(k, v) } - return uri + uri end # method to get (using http) prefLabel for interportal classes # Using bp_ajax_controller.ajax_process_interportal_cls will try to resolve class labels. def ajax_to_inter_portal_cls(cls) - inter_portal_acronym = get_inter_portal_acronym(cls.links["ui"]) - href_cls = " href='#{cls.links["ui"]}' " + inter_portal_acronym = get_inter_portal_acronym(cls.links['ui']) + href_cls = " href='#{cls.links['ui']}' " if inter_portal_acronym - data_cls = " data-cls='#{cls.links["self"]}?apikey=' " + data_cls = " data-cls='#{cls.links['self']}?apikey=' " portal_cls = " portal-cls='#{inter_portal_acronym}' " raw("#{cls.id}") else raw("#{cls.id}") end - end def ajax_to_internal_cls(cls) - link_to("#{cls.id}".html_safe, + link_to("#{cls.id}".html_safe, ontology_path(cls.explore.ontology.acronym, p: 'classes', conceptid: cls.id)) end # to get the apikey from the interportal instance of the interportal class. # The best way to know from which interportal instance the class came is to compare the UI url def get_inter_portal_acronym(class_ui_url) - if !INTERPORTAL_HASH.nil? - INTERPORTAL_HASH.each do |key, value| - if class_ui_url.start_with?(value["ui"]) - return key - else - return nil - end - end + return if INTERPORTAL_HASH.nil? + + INTERPORTAL_HASH.each do |key, value| + return key if class_ui_url.start_with?(value['ui']) + + return nil end end # method to extract the prefLabel from the external class URI def get_label_for_external_cls(class_uri) - if class_uri.include? "#" - prefLabel = class_uri.split("#")[-1] + if class_uri.include? '#' + class_uri.split('#')[-1] else - prefLabel = class_uri.split("/")[-1] + class_uri.split('/')[-1] end - return prefLabel end def ajax_to_external_cls(cls) @@ -98,25 +95,26 @@ def ajax_to_external_cls(cls) # Replace the inter_portal mapping ontology URI (that link to the API) by the link to the ontology in the UI def get_inter_portal_ui_link(uri, process_name) process_name = '' if process_name.nil? - interportal_acronym = process_name.split(" ")[2] + interportal_acronym = process_name.split(' ')[2] if interportal_acronym.nil? || interportal_acronym.empty? uri else - uri.sub!(INTERPORTAL_HASH[interportal_acronym]["api"], INTERPORTAL_HASH[interportal_acronym]["ui"]) + uri.sub!(INTERPORTAL_HASH[interportal_acronym]['api'], INTERPORTAL_HASH[interportal_acronym]['ui']) end end def onts_and_views_for_select @onts_and_views_for_select = [] - ontologies = LinkedData::Client::Models::Ontology.all(include: "acronym,name", include_views: true) + ontologies = LinkedData::Client::Models::Ontology.all(include: 'acronym,name', include_views: true) ontologies.each do |ont| - next if (ont.acronym.nil? || ont.acronym.empty?) + next if ont.acronym.nil? || ont.acronym.empty? + ont_acronym = ont.acronym ont_display_name = "#{ont.name.strip} (#{ont_acronym})" @onts_and_views_for_select << [ont_display_name, ont_acronym] end @onts_and_views_for_select.sort! { |a, b| a[0].downcase <=> b[0].downcase } - return @onts_and_views_for_select + @onts_and_views_for_select end def get_concept_mappings(concept) @@ -124,14 +122,13 @@ def get_concept_mappings(concept) # Remove mappings where the destination class exists in an ontology that the logged in user doesn't have permissions to view. # Workaround for https://github.com/ncbo/ontologies_api/issues/52. mappings.delete_if do |mapping| - #mapping.classes.reject! { |cls| (cls.id == concept.id) && (cls.links['ontology'] == concept.links['ontology']) } - begin - ont = mapping.classes[0].explore.ontology - ont.errors && ont.errors.grep(/Access denied/).any? - rescue => e - Rails.logger.warn "Mapping issue with '#{mapping.inspect}' : #{e.message}" - false - end + # mapping.classes.reject! { |cls| (cls.id == concept.id) && (cls.links['ontology'] == concept.links['ontology']) } + + ont = mapping.classes[0].explore.ontology + ont.errors&.grep(/Access denied/)&.any? + rescue StandardError => e + Rails.logger.warn "Mapping issue with '#{mapping.inspect}' : #{e.message}" + false end end @@ -140,7 +137,7 @@ def internal_mapping?(cls) end def inter_portal_mapping?(cls) - !internal_mapping?(cls) && cls.links.has_key?("ui") + !internal_mapping?(cls) && cls.links.key?('ui') end def get_mappings_target_params @@ -161,7 +158,7 @@ def get_mappings_target_params [ontology_to, concept_to_id, external] end - def set_mapping_target(concept_to_id:, ontology_to:, mapping_type: ) + def set_mapping_target(concept_to_id:, ontology_to:, mapping_type:) case mapping_type when 'interportal' @map_to_interportal, @map_to_interportal_ontology = ontology_to.match(%r{(.*)/ontologies/(.*)}).to_a[1..] @@ -182,11 +179,11 @@ def get_mappings_target target_ontology = ontology_to target = concept_to_id else - if helpers.uri?(ontology_to) - target_ontology = LinkedData::Client::Models::Ontology.find(ontology_to) - else - target_ontology = LinkedData::Client::Models::Ontology.find_by_acronym(ontology_to).first - end + target_ontology = if helpers.uri?(ontology_to) + LinkedData::Client::Models::Ontology.find(ontology_to) + else + LinkedData::Client::Models::Ontology.find_by_acronym(ontology_to).first + end if target_ontology target = target_ontology.explore.single_class(concept_to_id).id target_ontology = target_ontology.id diff --git a/app/helpers/metadata_helper.rb b/app/helpers/metadata_helper.rb index fbb4a3c0fe..247d29cca6 100644 --- a/app/helpers/metadata_helper.rb +++ b/app/helpers/metadata_helper.rb @@ -1,17 +1,18 @@ -module MetadataHelper +# frozen_string_literal: true +module MetadataHelper def input_type?(attr, type) - attr["enforce"].include?(type) + attr['enforce'].include?(type) end def submission_metadata - @metadata ||= JSON.parse(Net::HTTP.get(URI.parse("#{$REST_URL}/submission_metadata?apikey=#{$API_KEY}"))) + @submission_metadata ||= JSON.parse(Net::HTTP.get(URI.parse("#{$REST_URL}/submission_metadata?apikey=#{$API_KEY}"))) end def attr_metadata(attr_key) - submission_metadata.select { |attr_hash| attr_hash["attribute"].to_s.eql?(attr_key) }.first + submission_metadata.select { |attr_hash| attr_hash['attribute'].to_s.eql?(attr_key) }.first end - + def integer?(attr_label) input_type?(attr_metadata(attr_label), 'integer') end @@ -25,11 +26,11 @@ def textarea?(attr_label) end def enforce_values?(attr) - !attr["enforcedValues"].nil? + !attr['enforcedValues'].nil? end def list?(attr_label) - input_type?(attr_metadata(attr_label), "list") + input_type?(attr_metadata(attr_label), 'list') end def isOntology?(attr_label) @@ -37,15 +38,15 @@ def isOntology?(attr_label) end def attr_uri?(attr_label) - input_type?(attr_metadata(attr_label), "uri") + input_type?(attr_metadata(attr_label), 'uri') end def boolean?(attr_label) - input_type?(attr_metadata(attr_label), "boolean") + input_type?(attr_metadata(attr_label), 'boolean') end def agent?(attr) - input_type?(attr_metadata(attr), "Agent") + input_type?(attr_metadata(attr), 'Agent') end def display_attribute(metadata, value) @@ -53,13 +54,13 @@ def display_attribute(metadata, value) if agent?(metadata) display_agent(value) - elsif metadata.eql?("naturalLanguage") + elsif metadata.eql?('naturalLanguage') render LanguageFieldComponent.new(value: value) - elsif metadata.to_s.eql?("hasLicense") + elsif metadata.to_s.eql?('hasLicense') render LicenseFieldComponent.new(value: value) - elsif metadata.to_s.eql?("endpoint") && (value.start_with?("http://sparql.") || value.start_with?("https://sparql.")) - link_to(value, :title => value, :target => "_blank", :style => "border-width:0;") do - image_tag('logos/sparql_logo.png', :title => value, :class => 'logo') + elsif metadata.to_s.eql?('endpoint') && (value.start_with?('http://sparql.') || value.start_with?('https://sparql.')) + link_to(value, title: value, target: '_blank', style: 'border-width:0;') do + image_tag('logos/sparql_logo.png', title: value, class: 'logo') end elsif date_time?(metadata) render DateTimeFieldComponent.new(value: value) @@ -71,5 +72,4 @@ def display_attribute(metadata, value) render TextAreaFieldComponent.new(value: value.to_s) end end - -end \ No newline at end of file +end diff --git a/app/helpers/modal_helper.rb b/app/helpers/modal_helper.rb index 568c0f866f..7436920445 100644 --- a/app/helpers/modal_helper.rb +++ b/app/helpers/modal_helper.rb @@ -1,5 +1,6 @@ +# frozen_string_literal: true + module ModalHelper - def link_to_modal(name, options = nil, html_options = nil, &block) html_options = modal_controller_data(html_options) if name.nil? diff --git a/app/helpers/multi_languages_helper.rb b/app/helpers/multi_languages_helper.rb index c52f7860d1..1be26b4425 100644 --- a/app/helpers/multi_languages_helper.rb +++ b/app/helpers/multi_languages_helper.rb @@ -1,7 +1,7 @@ -module MultiLanguagesHelper +# frozen_string_literal: true +module MultiLanguagesHelper def language_hash(concept_label) - return concept_label.first if concept_label.is_a?(Array) return concept_label.to_h.reject { |key, _| %i[links context].include?(key) } if concept_label.is_a?(OpenStruct) @@ -40,7 +40,7 @@ def display_in_multiple_languages(label) if label.nil? return render Display::AlertComponent.new(message: t('ontology_details.concept.no_preferred_name_for_selected_language'), - type: "warning", + type: 'warning', closable: true) end diff --git a/app/helpers/notes_helper.rb b/app/helpers/notes_helper.rb index 6c65c95fd6..b8f62c65c7 100644 --- a/app/helpers/notes_helper.rb +++ b/app/helpers/notes_helper.rb @@ -1,14 +1,16 @@ +# frozen_string_literal: true + require 'cgi' module NotesHelper - - NOTES_TAGS = %w(a br b em strong i) + NOTES_TAGS = %w[a br b em strong i].freeze def recurse_replies(replies) - return "" if replies.nil? - html = "" + return '' if replies.nil? + + html = '' replies.each do |reply| - reply_html = <<-html + reply_html = <<-HTML
#{get_username(reply.creator)} #{time_ago_in_words(DateTime.parse(@note.created))} ago @@ -25,17 +27,18 @@ def recurse_replies(replies)
- html + HTML html << reply_html end html end def proposal_html(note) - return "" unless note.respond_to?(:proposal) && note.proposal + return '' unless note.respond_to?(:proposal) && note.proposal + case note.proposal.type - when "ProposalNewClass" - html = <<-html + when 'ProposalNewClass' + html = <<-HTML @@ -56,20 +59,20 @@ def proposal_html(note) - + - +
Reason for Change
Synonyms#{note.proposal.synonym.join(", ")}#{note.proposal.synonym.join(', ')}
Definition#{note.proposal.definition.join(", ")}#{note.proposal.definition.join(', ')}
- html - when "ProposalChangeHierarchy" - html = <<-html + HTML + when 'ProposalChangeHierarchy' + html = <<-HTML - + @@ -87,9 +90,9 @@ def proposal_html(note)
Relationship Type#{note.proposal.newRelationshipType.join(", ")}#{note.proposal.newRelationshipType.join(', ')}
New Relationship Target#{note.proposal.contactInfo}
- html - when "ProposalChangeProperty" - html = <<-html + HTML + when 'ProposalChangeProperty' + html = <<-HTML @@ -111,7 +114,7 @@ def proposal_html(note)
Property id#{note.proposal.contactInfo}
- html + HTML end html @@ -119,17 +122,16 @@ def proposal_html(note) def get_note_type_text(note_type) case note_type - when "Comment" - return "Comment" - when "ProposalNewClass" - return "New Class Proposal" - when "ProposalChangeHierarchy" - return "New Relationship Proposal" - when "ProposalChangeProperty" - return "Change Property Value Proposal" + when 'Comment' + 'Comment' + when 'ProposalNewClass' + 'New Class Proposal' + when 'ProposalChangeHierarchy' + 'New Relationship Proposal' + when 'ProposalChangeProperty' + 'Change Property Value Proposal' end end - def delete_button user = session[:user] @@ -137,9 +139,10 @@ def delete_button # user ||= anonymous_user params = "data-bp_user_id='#{user.id}'" - spinner = '' + spinner = '' error = "" - return "Delete selected notes #{spinner} #{error}" + "Delete selected notes #{spinner} #{error}" end - end diff --git a/app/helpers/ontologies_helper.rb b/app/helpers/ontologies_helper.rb index 7831557ba6..03c620306c 100644 --- a/app/helpers/ontologies_helper.rb +++ b/app/helpers/ontologies_helper.rb @@ -1,9 +1,10 @@ +# frozen_string_literal: true + require 'iso-639' module OntologiesHelper - REST_URI = $REST_URL API_KEY = $API_KEY - LANGUAGE_FILTERABLE_SECTIONS = %w[classes schemes collections instances] + LANGUAGE_FILTERABLE_SECTIONS = %w[classes schemes collections instances].freeze def browse_filter_section_label(key) labels = { @@ -16,10 +17,10 @@ def browse_filter_section_label(key) end def browser_counter_loader - content_tag(:div, class: "browse-desc-text", style: "margin-bottom: 15px;") do - content_tag(:div, class: "d-flex align-items-center") do - str = content_tag(:span, "Showing") - str += content_tag(:span, "", class: "p-1 p-2", style: "color: #a7a7a7;") do + content_tag(:div, class: 'browse-desc-text', style: 'margin-bottom: 15px;') do + content_tag(:div, class: 'd-flex align-items-center') do + str = content_tag(:span, 'Showing') + str += content_tag(:span, '', class: 'p-1 p-2', style: 'color: #a7a7a7;') do render LoaderComponent.new(small: true) end str @@ -46,7 +47,8 @@ def ontologies_filter_url(filters, page: 1, count: false) end def additional_details - return "" if $ADDITIONAL_ONTOLOGY_DETAILS.nil? || $ADDITIONAL_ONTOLOGY_DETAILS[@ontology.acronym].nil? + return '' if $ADDITIONAL_ONTOLOGY_DETAILS.nil? || $ADDITIONAL_ONTOLOGY_DETAILS[@ontology.acronym].nil? + details = $ADDITIONAL_ONTOLOGY_DETAILS[@ontology.acronym] html = [] details.each do |title, value| @@ -62,11 +64,10 @@ def additional_details def display_data_catalog(value) if !value.nil? && value.any? # Buttons for data catalogs - content_tag(:div, { :class => "" }) do - + content_tag(:div, { class: '' }) do end else - "" + '' end end @@ -76,16 +77,14 @@ def agent?(sub_metadata, attr) end def display_contact(contacts) - contacts.map { |c| "#{c.name.humanize} at #{c.email}" if c.member?(:name) && c.member?(:email) }&.join(", ") + contacts.map { |c| "#{c.name.humanize} at #{c.email}" if c.member?(:name) && c.member?(:email) }&.join(', ') end def count_links(ont_acronym, page_name = 'summary', count = 0) ont_url = "/ontologies/#{ont_acronym}" - if count.nil? || count.zero? - return '0' - else - return "#{number_with_delimiter(count, delimiter: ',')}" - end + return '0' if count.nil? || count.zero? + + "#{number_with_delimiter(count, delimiter: ',')}" end def classes_link(ontology, count) @@ -110,14 +109,14 @@ def download_link(submission, ontology = nil) links << { href: uri, label: submission.pretty_format } latest = ontology.explore.latest_submission({ include_status: 'ready' }) if latest && latest.submissionId == submission.submissionId - links << { href: "#{ontology.id}/download?apikey=#{get_apikey}&download_format=csv", label: "CSV" } - if !latest.hasOntologyLanguage.eql?('UMLS') - links << { href: "#{ontology.id}/download?apikey=#{get_apikey}&download_format=rdf", label: "RDF/XML" } + links << { href: "#{ontology.id}/download?apikey=#{get_apikey}&download_format=csv", label: 'CSV' } + unless latest.hasOntologyLanguage.eql?('UMLS') + links << { href: "#{ontology.id}/download?apikey=#{get_apikey}&download_format=rdf", label: 'RDF/XML' } end end unless submission.diffFilePath.nil? uri = submission.id + "/download_diff?apikey=#{get_apikey}" - links << { href: uri, label: "DIFF" } + links << { href: uri, label: 'DIFF' } end end links @@ -139,8 +138,8 @@ def notes_link(ontology, count) # Creates a link based on the status of an ontology submission def status_link(submission, latest = false, target = '') - version_text = submission.version.nil? || submission.version.to_s.length == 0 ? 'unknown' : submission.version.to_s - status_text = " " + submission_status2string(submission) + '' + version_text = submission.version.nil? || submission.version.to_s.empty? ? 'unknown' : submission.version.to_s + status_text = " #{submission_status2string(submission)}" if submission.ontology.summaryOnly || latest == false version_link = version_text else @@ -149,10 +148,9 @@ def status_link(submission, latest = false, target = '') version_link + status_text end - def submission_status2string(data) return '' if data[:submissionStatus].nil? - + # Massage the submission status into a UI string # submission status values, from: # https://github.com/ncbo/ontologies_linked_data/blob/master/lib/ontologies_linked_data/models/submission_status.rb @@ -161,19 +159,21 @@ def submission_status2string(data) # The order of the codes must be assumed to be random, it is not an entirely # predictable sequence of ontology processing stages. codes = data[:submissionStatus].map { |s| s.split('/').last } - errors = codes.select { |c| c.start_with? 'ERROR' }.map { |c| c.gsub("_", " ").split(/(\W)/).map(&:capitalize).join }.compact + errors = codes.select do |c| + c.start_with? 'ERROR' + end.map { |c| c.gsub('_', ' ').split(/(\W)/).map(&:capitalize).join }.compact status = [] status.push('Parsed') if (codes.include? 'RDF') && (codes.include? 'RDF_LABELS') # The order of this array imposes an oder on the UI status code string - status_list = ['INDEXED', 'METRICS', 'ANNOTATOR', 'ARCHIVED'] + status_list = %w[INDEXED METRICS ANNOTATOR ARCHIVED] status_list.insert(0, 'UPLOADED') unless status.include?('Parsed') status_list.each do |c| status.push(c.capitalize) if codes.include? c end status.concat errors return '' if status.empty? - - '(' + status.join(', ') + ')' + + "(#{status.join(', ')})" end def status_string(data) @@ -181,16 +181,16 @@ def status_string(data) submission_status2string(data) end - + def submission_status_icons(status) if status.include?('Parsed') && !status.include?('Error Diff') - "success-icon.svg" + 'success-icon.svg' elsif status.include?('Error Diff') && !status.include?('Parsed') 'error-icon.svg' elsif status == '(Archived)' 'archive.svg' else - "alert-triangle.svg" + 'alert-triangle.svg' end end @@ -223,23 +223,25 @@ def visits_data(ontology = nil) return @visits_data if @visits_data visits_data = { visits: [], labels: [] } - years = @analytics[ontology.acronym.to_sym].to_h.keys.map { |e| e.to_s.to_i }.select { |e| e > 0 }.sort + years = @analytics[ontology.acronym.to_sym].to_h.keys.map { |e| e.to_s.to_i }.select(&:positive?).sort now = Time.now years.each do |year| - months = @analytics[ontology.acronym.to_sym].to_h[year.to_s.to_sym].to_h.keys.map { |e| e.to_s.to_i }.select { |e| e > 0 }.sort + months = @analytics[ontology.acronym.to_sym].to_h[year.to_s.to_sym].to_h.keys.map do |e| + e.to_s.to_i + end.select(&:positive?).sort months.each do |month| # No good data prior to Oct 2013 next if now.year == year && now.month <= month || (year == 2013 && month < 10) visits_data[:visits] << @analytics[ontology.acronym.to_sym].to_h[year.to_s.to_sym][month.to_s.to_sym] - visits_data[:labels] << DateTime.parse("#{year}/#{month}").strftime("%b %Y") + visits_data[:labels] << DateTime.parse("#{year}/#{month}").strftime('%b %Y') end end @visits_data = visits_data end def acronyms(ontologies) - ontologies.present? ? ontologies.map { |ont| ont.acronym } : [] + ontologies.present? ? ontologies.map(&:acronym) : [] end def change_requests_enabled?(ontology_acronym) @@ -249,14 +251,14 @@ def change_requests_enabled?(ontology_acronym) end def current_section - (params[:p]) ? params[:p] : 'summary' + params[:p] || 'summary' end def link_to_section(section_title) link_to(section_name(section_title), ontology_path(@ontology.acronym, p: section_title), id: "ont-#{section_title}-tab", class: "nav-link #{selected_section?(section_title) ? 'active show' : ''}", data: { action: 'click->ontology-viewer-tabs#selectTab', - toggle: "tab", target: "#ont_#{section_title}_content", 'bp-ont-page': section_title, + toggle: 'tab', target: "#ont_#{section_title}_content", 'bp-ont-page': section_title, 'bp-ont-page-name': ontology_viewer_page_name(@ontology.name, @concept&.prefLabel || '', section_title) }) end @@ -275,7 +277,8 @@ def ontology_data_section?(section_title = current_section) def section_data(section_title) if ontology_data_section?(section_title) url_value = selected_section?(section_title) ? request.fullpath : "/ontologies/#{@ontology.acronym}?p=#{section_title}" - { controller: "history turbo-frame", 'turbo-frame-url-value': url_value, action: "lang_changed->history#updateURL lang_changed->turbo-frame#updateFrame" } + { controller: 'history turbo-frame', 'turbo-frame-url-value': url_value, + action: 'lang_changed->history#updateURL lang_changed->turbo-frame#updateFrame' } else {} end @@ -285,19 +288,20 @@ def lazy_load_section(section_title, &block) if current_section.eql?(section_title) block.call else - render TurboFrameComponent.new(id: section_title, src: "/ontologies/#{@ontology.acronym}?p=#{section_title}", target: '_top', data: { "turbo-frame-target": "frame" }) + render TurboFrameComponent.new(id: section_title, src: "/ontologies/#{@ontology.acronym}?p=#{section_title}", + target: '_top', data: { "turbo-frame-target": 'frame' }) end end def visits_chart_dataset(visits_data) [{ - label: 'Visits', - data: visits_data, - backgroundColor: 'rgba(151, 187, 205, 0.2)', - borderColor: 'rgba(151, 187, 205, 1)', - pointBorderColor: 'rgba(151, 187, 205, 1)', - pointBackgroundColor: 'rgba(151, 187, 205, 1)', - }].to_json + label: 'Visits', + data: visits_data, + backgroundColor: 'rgba(151, 187, 205, 0.2)', + borderColor: 'rgba(151, 187, 205, 1)', + pointBorderColor: 'rgba(151, 187, 205, 1)', + pointBackgroundColor: 'rgba(151, 187, 205, 1)' + }].to_json end def sections_to_show @@ -311,39 +315,44 @@ def sections_to_show end sections end + def dispaly_complex_text(definitions) - html = "" + html = '' definitions.each do |definition| if definition.is_a?(String) - html += '

' + definition + '

' + html += "

#{definition}

" elsif definition.respond_to?(:uri) && definition.uri - html += '

' + definition.uri + '

' + html += "

#{definition.uri}

" end end - return html.html_safe + html.html_safe end def language_selector_tag(name) languages = languages_options if languages.empty? && @submission_latest - return unless @ontology.admin?(session[:user]) - content_tag(:div, data: { 'ontology-viewer-tabs-target': 'languageSelector' }, style: "visibility: #{ontology_data_section? ? 'visible' : 'hidden'} ; margin-bottom: -1px;") do - edit_submission_property_link(@ontology.acronym, @submission_latest.submissionId, :naturalLanguage, container_id: '') do - ("Enable multilingual display " + content_tag(:i, "", class: "fas fa-lg fa-question-circle")).html_safe + return unless @ontology.admin?(session[:user]) + + content_tag(:div, data: { 'ontology-viewer-tabs-target': 'languageSelector' }, + style: "visibility: #{ontology_data_section? ? 'visible' : 'hidden'} ; margin-bottom: -1px;") do + edit_submission_property_link(@ontology.acronym, @submission_latest.submissionId, :naturalLanguage, + container_id: '') do + "Enable multilingual display #{content_tag(:i, '', class: 'fas fa-lg fa-question-circle')}".html_safe end end else - select_tag name, languages_options, class: '', disabled: !ontology_data_section?, style: "visibility: #{ontology_data_section? ? 'visible' : 'hidden'}; border: none; outline: none;", data: { 'ontology-viewer-tabs-target': 'languageSelector' } + select_tag name, languages_options, class: '', disabled: !ontology_data_section?, + style: "visibility: #{ontology_data_section? ? 'visible' : 'hidden'}; border: none; outline: none;", data: { 'ontology-viewer-tabs-target': 'languageSelector' } end end def language_selector_hidden_tag(section) hidden_field_tag "language_selector_hidden_#{section}", '', - data: { controller: "language-change", 'language-change-section-value': section, action: "change->language-change#dispatchLangChangeEvent" } + data: { controller: 'language-change', 'language-change-section-value': section, action: 'change->language-change#dispatchLangChangeEvent' } end - def languages_options(submission = @submission || @submission_latest) + def languages_options(submission = @submission || @submission_latest) current_lang = request_lang.downcase submission_lang = submission_languages(submission) # Transform each language into a select option @@ -360,17 +369,17 @@ def languages_options(submission = @submission || @submission_latest) end def display_complex_text(definitions) - html = "" + html = '' definitions.each do |definition| - if definition.is_a?(String) - html += '

' + definition + '

' - elsif definition.respond_to?(:uri) && definition.uri - html += render LinkFieldComponent.new(value: definition.uri) - else - html += display_in_multiple_languages(definition) - end + html += if definition.is_a?(String) + "

#{definition}

" + elsif definition.respond_to?(:uri) && definition.uri + render LinkFieldComponent.new(value: definition.uri) + else + display_in_multiple_languages(definition) + end end - return html.html_safe + html.html_safe end def new_view_path(ont_id) @@ -383,12 +392,10 @@ def new_view_path(ont_id) end def new_element_link(title, link) - if session[:user].nil? - link = "/login?redirect=#{link}" - end + link = "/login?redirect=#{link}" if session[:user].nil? - link_to(link, title: title, class: "mx-1") do - inline_svg_tag("icons/plus.svg", width: '15px', height: '15px') + link_to(link, title: title, class: 'mx-1') do + inline_svg_tag('icons/plus.svg', width: '15px', height: '15px') end end @@ -396,7 +403,7 @@ def ontology_icon_links(links, submission_latest) links.map do |icon, attr| value = submission_latest.nil? ? nil : submission_latest.send(attr) - link_options = { style: "text-decoration: none; width: 30px; height: 30px" } + link_options = { style: 'text-decoration: none; width: 30px; height: 30px' } link_options[:class] = 'disabled-icon' if value.nil? link_to(inline_svg("#{icon}.svg"), Array(value).first || '', link_options) @@ -423,12 +430,11 @@ def metadata_formats_buttons ]) do |format, label| render ChipButtonComponent.new(type: 'clickable', 'data-action': "metadata-downloader#download#{format}") do concat content_tag(:span, label) - concat content_tag(:span, inline_svg("summary/download.svg", width: '15px', height: '15px')) + concat content_tag(:span, inline_svg('summary/download.svg', width: '15px', height: '15px')) end end end end - end def count_subscriptions(ontology_id) @@ -438,12 +444,14 @@ def count_subscriptions(ontology_id) def new_submission_button return unless @ontology.admin?(session[:user]) + render RoundedButtonComponent.new(link: new_ontology_submission_path(@ontology.acronym), icon: 'icons/plus.svg', size: 'medium', title: 'Add new submission') end def ontology_edit_button return unless @ontology.admin?(session[:user]) + render RoundedButtonComponent.new(link: edit_ontology_path(@ontology.acronym), icon: 'edit.svg', size: 'medium', title: 'Edit metadata') @@ -452,27 +460,27 @@ def ontology_edit_button def upload_ontology_button if session[:user].nil? render PillButtonComponent.new do - link_to "/login?redirect=/ontologies/new" do - inline_svg('upload.svg') + "Submit new ontology" + link_to '/login?redirect=/ontologies/new' do + "#{inline_svg('upload.svg')}Submit new ontology" end end else render PillButtonComponent.new do link_to new_ontology_path do - inline_svg('upload.svg') + "Submit new ontology" + "#{inline_svg('upload.svg')}Submit new ontology" end end end end def submission_json_button - render RoundedButtonComponent.new(link: "#{(@submission_latest || @ontology).id}?display=all", target: '_blank', size: 'medium') + render RoundedButtonComponent.new(link: "#{(@submission_latest || @ontology).id}?display=all", target: '_blank', + size: 'medium') end - def summary_only? - @ontology&.summaryOnly || @submission&.isRemote&.eql?('3') + @ontology&.summaryOnly || @submission&.isRemote.eql?('3') end def ontology_pull_location? @@ -482,7 +490,8 @@ def ontology_pull_location? private def submission_languages(submission = @submission) - Array(submission&.naturalLanguage).map { |natural_language| natural_language["iso639"] && natural_language.split('/').last }.compact + Array(submission&.naturalLanguage).map do |natural_language| + natural_language['iso639'] && natural_language.split('/').last + end.compact end end - diff --git a/app/helpers/ontology_metrics_helper.rb b/app/helpers/ontology_metrics_helper.rb index aed1241258..7368bce88a 100644 --- a/app/helpers/ontology_metrics_helper.rb +++ b/app/helpers/ontology_metrics_helper.rb @@ -1,29 +1,30 @@ -module OntologyMetricsHelper +# frozen_string_literal: true +module OntologyMetricsHelper def format_metric_list(metrics, metric, title) return 0 if metric.nil? - markup = "" + markup = '' # IF all of the classes triggered the metric, return the class count - if metric.include?("alltriggered") - markup = "#{metrics.numberOfClasses}" - elsif metric.kind_of?(Array) && metric.length == 1 && metric[0].include?("limitpassed") + if metric.include?('alltriggered') + markup = metrics.numberOfClasses.to_s + elsif metric.is_a?(Array) && metric.length == 1 && metric[0].include?('limitpassed') # Split at the magic marker and return the count - markup = metric[0].split(":")[1] - elsif metric.kind_of?(Hash) && metric.length == 1 && metric["limitpassed:"] + markup = metric[0].split(':')[1] + elsif metric.is_a?(Hash) && metric.length == 1 && metric['limitpassed:'] # Return the count, which is an int value to the key 'limitpassed:' - markup = metric["limitpassed:"] - elsif metric.kind_of?(Array) && metric.length == 0 + markup = metric['limitpassed:'] + elsif metric.is_a?(Array) && metric.empty? # If we have an empty array return 0 - markup = "0" - elsif metric.kind_of?(Array) + markup = '0' + elsif metric.is_a?(Array) markup << "#{metric.length}" markup << "" - elsif metric.kind_of?(Hash) + markup << metric.join('
') + markup << '

' + elsif metric.is_a?(Hash) counts = [] metric.each do |cls, count| counts << "#{cls} (#{count})" @@ -34,13 +35,12 @@ def format_metric_list(metrics, metric, title) markup << "#{metric.length}" markup << "" + markup << metric.join('
') + markup << '

' else markup = metric.to_s end markup end - end diff --git a/app/helpers/reviews_helper.rb b/app/helpers/reviews_helper.rb index bb859ee872..c6ade5b00d 100644 --- a/app/helpers/reviews_helper.rb +++ b/app/helpers/reviews_helper.rb @@ -1,6 +1,8 @@ +# frozen_string_literal: true + module ReviewsHelper def organize_ratings(review) - return [ + [ { name: :usability, value: review.usabilityRating.to_i }, { name: :coverage, value: review.coverageRating.to_i }, { name: :quality, value: review.qualityRating.to_i }, diff --git a/app/helpers/schemes_helper.rb b/app/helpers/schemes_helper.rb index f9c67d1324..0396e7a61b 100644 --- a/app/helpers/schemes_helper.rb +++ b/app/helpers/schemes_helper.rb @@ -1,11 +1,10 @@ module SchemesHelper - def get_schemes(ontology) ontology.explore.schemes(language: request_lang) end def get_scheme(ontology, scheme_uri) - ontology.explore.schemes({ include: 'all', language: request_lang}, scheme_uri) + ontology.explore.schemes({ include: 'all', language: request_lang }, scheme_uri) end def get_scheme_label(scheme) @@ -19,7 +18,6 @@ def get_scheme_label(scheme) end def get_schemes_labels(schemes, main_uri) - selected_label = nil schemes_labels = [] schemes.each do |x| @@ -29,7 +27,7 @@ def get_schemes_labels(schemes, main_uri) label[1] = "#{label[1]} (main)" unless label[0].empty? selected_label = { 'prefLabel' => label, '@id' => id } else - schemes_labels.append( { 'prefLabel' => label, '@id' => id }) + schemes_labels.append({ 'prefLabel' => label, '@id' => id }) end end @@ -65,6 +63,7 @@ def no_main_scheme_alert 'no main scheme defined in the URI attribute' end end + def no_schemes_alert render Display::AlertComponent.new do "#{@ontology.acronym} does not contain schemes (skos:ConceptScheme)" @@ -72,8 +71,8 @@ def no_schemes_alert end def schemes_data - schemes_labels, main_scheme = get_schemes_labels(@schemes,@submission.URI) - selected_scheme = @schemes.select{ |s| params[:concept_schemes]&.split(',')&.include?(s['@id']) } + schemes_labels, main_scheme = get_schemes_labels(@schemes, @submission.URI) + selected_scheme = @schemes.select { |s| params[:concept_schemes]&.split(',')&.include?(s['@id']) } selected_scheme = selected_scheme.empty? ? [main_scheme] : selected_scheme [schemes_labels, main_scheme, selected_scheme] end @@ -84,7 +83,7 @@ def tree_link_to_schemes(schemes_labels, main_scheme_label, selected_scheme_id) sorted_labels(schemes_labels).each do |s| next unless main_scheme_label.nil? || s['prefLabel'] != main_scheme_label['prefLabel'] - out << <<-EOS + out << <<-EOS
  • #{link_to_scheme(s, selected_scheme_id)}
  • @@ -92,11 +91,12 @@ def tree_link_to_schemes(schemes_labels, main_scheme_label, selected_scheme_id) end out end + def link_to_scheme(scheme, selected_scheme_id) pref_label_lang, pref_label_html = get_scheme_label(scheme) - tooltip = pref_label_lang.to_s.eql?('@none') ? '' : "data-controller='tooltip' data-tooltip-position-value='right' title='#{pref_label_lang.upcase}'" + tooltip = pref_label_lang.to_s.eql?('@none') ? '' : "data-controller='tooltip' data-tooltip-position-value='right' title='#{pref_label_lang.upcase}'" <<-EOS - @@ -105,4 +105,3 @@ def link_to_scheme(scheme, selected_scheme_id) EOS end end - diff --git a/app/helpers/submission_inputs_helper.rb b/app/helpers/submission_inputs_helper.rb index bdc113a75a..4b166b2dfb 100644 --- a/app/helpers/submission_inputs_helper.rb +++ b/app/helpers/submission_inputs_helper.rb @@ -1,9 +1,10 @@ -module SubmissionInputsHelper +# frozen_string_literal: true +module SubmissionInputsHelper class SubmissionMetadataInput include MetadataHelper - def initialize(attribute_key:, attr_metadata: , submission: nil, label: nil) + def initialize(attribute_key:, attr_metadata:, submission: nil, label: nil) @attribute_key = attribute_key @attr_metadata = attr_metadata @submission = submission @@ -82,10 +83,8 @@ def attribute_input(attr_key, long_text: false, label: nil, show_tooltip: true, value: attr.values) end end - end - def ontology_name_input(ontology = @ontology) text_input(name: 'ontology[name]', value: ontology.name) end @@ -98,10 +97,11 @@ def ontology_acronym_input(ontology = @ontology, update: @is_update_ontology) def ontology_administered_by_input(ontology = @ontology, users_list = @user_select_list) unless users_list - users_list = LinkedData::Client::Models::User.all(include: "username").map { |u| [u.username, u.id] } + users_list = LinkedData::Client::Models::User.all(include: 'username').map { |u| [u.username, u.id] } users_list.sort! { |a, b| a[1].downcase <=> b[1].downcase } end - select_input(label: "Administrator", name: "ontology[administeredBy]", values: users_list, selected: ontology.administeredBy || session[:user].id, multiple: true) + select_input(label: 'Administrator', name: 'ontology[administeredBy]', values: users_list, + selected: ontology.administeredBy || session[:user].id, multiple: true) end def ontology_categories_input(ontology = @ontology, categories = @categories) @@ -111,20 +111,24 @@ def ontology_categories_input(ontology = @ontology, categories = @categories) content_tag(:div, class: 'upload-ontology-chips-container') do hidden_field_tag('ontology[hasDomain][]') + categories.map do |category| - check_input(name: "ontology[hasDomain][]", id: category[:acronym], label: category[:acronym], value: category[:id], checked: ontology.hasDomain&.any? { |x| x.eql?(category[:id]) }) + check_input(name: 'ontology[hasDomain][]', id: category[:acronym], label: category[:acronym], value: category[:id], checked: ontology.hasDomain&.any? do |x| + x.eql?(category[:id]) + end) end.join.html_safe end end end def ontology_groups_input(ontology = @ontology, groups = @groups) - groups ||= LinkedData::Client::Models::Group.all(display_links: false, display_context: false) + groups ||= LinkedData::Client::Models::Group.all(display_links: false, display_context: false) render Input::InputFieldComponent.new(name: '', label: 'Groups') do content_tag(:div, class: 'upload-ontology-chips-container') do hidden_field_tag('ontology[group][]') + groups.map do |group| - check_input(name: "ontology[group][]", id: group[:acronym], label: group[:acronym], value: group[:id], checked: ontology.group&.any? { |x| x.eql?(group[:id]) }) + check_input(name: 'ontology[group][]', id: group[:acronym], label: group[:acronym], value: group[:id], checked: ontology.group&.any? do |x| + x.eql?(group[:id]) + end) end.join.html_safe end end @@ -132,16 +136,20 @@ def ontology_groups_input(ontology = @ontology, groups = @groups) def ontology_visibility_input(ontology = @ontology) unless @user_select_list - @user_select_list = LinkedData::Client::Models::User.all(include: "username").map { |u| [u.username, u.id] } + @user_select_list = LinkedData::Client::Models::User.all(include: 'username').map { |u| [u.username, u.id] } @user_select_list.sort! { |a, b| a[1].downcase <=> b[1].downcase } end - render(Layout::RevealComponent.new(init_show: ontology.viewingRestriction&.eql?('private'), show_condition: 'private')) do |c| + render(Layout::RevealComponent.new(init_show: ontology.viewingRestriction&.eql?('private'), + show_condition: 'private')) do |c| c.button do - select_input(label: "Visibility", name: "ontology[viewingRestriction]", values: %w[public private], selected: ontology.viewingRestriction ) + select_input(label: 'Visibility', name: 'ontology[viewingRestriction]', values: %w[public private], + selected: ontology.viewingRestriction) end content_tag(:div, class: 'upload-ontology-input-field-container') do - select_input(label: "Add or remove accounts that are allowed to view classes in this ontology using the account name", name: "ontology[acl]", values: @user_select_list, selected: ontology.acl, multiple: true) + select_input( + label: 'Add or remove accounts that are allowed to view classes in this ontology using the account name', name: 'ontology[acl]', values: @user_select_list, selected: ontology.acl, multiple: true + ) end end end @@ -150,12 +158,14 @@ def ontology_view_of_input(ontology = @ontology) render Layout::RevealComponent.new(init_show: ontology.view?) do |c| c.button do content_tag(:span, class: 'd-flex') do - switch_input(id: 'ontology_isView', name: 'ontology[isView]', label: 'Is a view of another ontology?', checked: ontology.view?) + switch_input(id: 'ontology_isView', name: 'ontology[isView]', label: 'Is a view of another ontology?', + checked: ontology.view?) end end content_tag(:div) do - render partial: "shared/ontology_picker_single", locals: {placeholder: "", field_name: "viewOf", selected: ontology.viewOf} + render partial: 'shared/ontology_picker_single', + locals: { placeholder: '', field_name: 'viewOf', selected: ontology.viewOf } end end end @@ -184,10 +194,12 @@ def contact_input(label: '', name: 'Contact', show_help: true) c.row do content_tag(:div, class: 'd-flex my-1') do out = content_tag(:div, class: 'w-50 mr-2') do - text_input(label: '', name: "submission[contact][#{i}][name]", value: contact['name'], error_message: '') + text_input(label: '', name: "submission[contact][#{i}][name]", value: contact['name'], + error_message: '') end out + content_tag(:div, class: 'w-50') do - text_input(label: '', name: "submission[contact][#{i}][email]", value: contact['email'], error_message: '') + text_input(label: '', name: "submission[contact][#{i}][email]", value: contact['email'], + error_message: '') end end end @@ -221,8 +233,9 @@ def agent_type(attr) end def generate_integer_input(attr) - # TODO to update to use a component - number_field object_name, attr.metadata['attribute'].to_s.to_sym, value: @submission.send(attr.metadata['attribute']), class: 'metadataInput form-control' + # TODO: to update to use a component + number_field object_name, attr.metadata['attribute'].to_s.to_sym, + value: @submission.send(attr.metadata['attribute']), class: 'metadataInput form-control' end def generate_agent_input(attr) @@ -233,7 +246,6 @@ def generate_agent_input(attr) name_prefix: attr.name, parent_id: '') end - end def generate_date_input(attr, max_date: nil) @@ -268,7 +280,7 @@ def generate_list_field_input(attr, name, label, values, &block) label end c.template do - block.call('', "#{name}[NEW_RECORD]", attr.metadata['attribute'].to_s + '_' + @ontology.acronym) + block.call('', "#{name}[NEW_RECORD]", "#{attr.metadata['attribute']}_#{@ontology.acronym}") end c.empty_state do @@ -277,12 +289,12 @@ def generate_list_field_input(attr, name, label, values, &block) Array(values).each_with_index do |metadata_val, i| c.row do - block.call(metadata_val, "#{name}[#{i}]", "submission_#{attr.metadata['attribute'].to_s}" + '_' + @ontology.acronym) + block.call(metadata_val, "#{name}[#{i}]", + "submission_#{attr.metadata['attribute']}_#{@ontology.acronym}") end end end end - end def generate_url_input(attr) @@ -290,7 +302,7 @@ def generate_url_input(attr) values = attr.values name = attr.name if attr.type?('list') - generate_list_field_input(attr, name, label, values) do |value, row_name, id| + generate_list_field_input(attr, name, label, values) do |value, row_name, _id| url_input(label: '', name: row_name, value: value) end else @@ -302,7 +314,7 @@ def generate_list_text_input(attr) label = attr_header_label(attr) values = attr.values || [''] name = attr.name - generate_list_field_input(attr, name, label, values) do |value, row_name, id| + generate_list_field_input(attr, name, label, values) do |value, row_name, _id| text_input(label: '', name: row_name, value: value) end end @@ -312,7 +324,8 @@ def generate_boolean_input(attr) value = value.to_s unless value.nil? name = attr.name content_tag(:div, class: 'd-flex') do - switch_input(id: name, name: name, label: attr_header_label(attr), checked: value.eql?('true'), value: value, boolean_switch: true) + switch_input(id: name, name: name, label: attr_header_label(attr), checked: value.eql?('true'), value: value, + boolean_switch: true) end end @@ -328,7 +341,7 @@ def selected_values(attr, enforced_values) metadata_values = attr.values select_values = enforced_values - if metadata_values.kind_of?(Array) + if metadata_values.is_a?(Array) metadata_values.map do |metadata| select_values << metadata unless select_values.flatten.include?(metadata) end @@ -338,8 +351,6 @@ def selected_values(attr, enforced_values) [metadata_values, select_values] end - private - def attr_header_label(attr, label = nil, show_tooltip: true) label ||= attr.label return '' if label.nil? || label.empty? @@ -347,7 +358,7 @@ def attr_header_label(attr, label = nil, show_tooltip: true) content_tag(:div) do tooltip_span = render(Display::InfoTooltipComponent.new(text: attribute_help_text(attr))) html = content_tag(:span, label) - html += content_tag(:span, '*', class: "text-danger") if attr.required? + html += content_tag(:span, '*', class: 'text-danger') if attr.required? html += content_tag(:span, tooltip_span, class: 'ml-1') if show_tooltip html end @@ -366,11 +377,12 @@ def attribute_help_text(attr) render SummarySectionComponent.new(title: title, show_card: false) do help_text = '' unless attr['metadataMappings'].nil? - help_text += render(FieldContainerComponent.new(label: 'Equivalents', value: attr['metadataMappings'].join(', '))) + help_text += render(FieldContainerComponent.new(label: 'Equivalents', + value: attr['metadataMappings'].join(', '))) end unless attr['enforce'].nil? || attr['enforce'].empty? - help_text += render(FieldContainerComponent.new(label: 'Validators', value: attr['enforce'].map do |x| + help_text += render(FieldContainerComponent.new(label: 'Validators', value: attr['enforce'].map do |x| content_tag(:span, x.humanize, class: 'badge badge-primary mx-1') end.join.html_safe)) end @@ -382,4 +394,4 @@ def attribute_help_text(attr) help_text end end -end \ No newline at end of file +end diff --git a/app/helpers/submissions_helper.rb b/app/helpers/submissions_helper.rb index 10f1dd8228..859432a373 100644 --- a/app/helpers/submissions_helper.rb +++ b/app/helpers/submissions_helper.rb @@ -1,15 +1,16 @@ +# frozen_string_literal: true + module SubmissionsHelper def metadata_help_link content_tag(:div, class: 'edit-ontology-desc') do html = content_tag(:span, 'To understand the ontologies metadata:') html += content_tag(:span, style: 'width: 10px; height: 10px') do - link_to(render(ExternalLinkTextComponent.new(text: 'see the Wiki')), "https://github.com/agroportal/documentation/wiki/Ontology-metadata") + link_to(render(ExternalLinkTextComponent.new(text: 'see the Wiki')), 'https://github.com/agroportal/documentation/wiki/Ontology-metadata') end html.html_safe end end - def ontology_submission_id_label(acronym, submission_id) [acronym, submission_id].join('#') end @@ -24,7 +25,8 @@ def ontology_and_submission_id(value) end def render_submission_attribute(attribute, submission = @submission, ontology = @ontology) - render partial: 'ontologies_metadata_curator/attribute_inline_editable', locals: { attribute: attribute, submission: submission, ontology: ontology } + render partial: 'ontologies_metadata_curator/attribute_inline_editable', + locals: { attribute: attribute, submission: submission, ontology: ontology } end def attribute_input_frame_id(acronym, submission_id, attribute) @@ -33,11 +35,11 @@ def attribute_input_frame_id(acronym, submission_id, attribute) def edit_submission_property_link(acronym, submission_id, attribute, container_id = nil, &block) link = "/ontologies/#{acronym}/submissions/#{submission_id}/edit_properties?properties=#{attribute}&inline_save=true" - if container_id - link += "&container_id=#{container_id}" - else - link += "&container_id=#{attribute_input_frame_id(acronym, submission_id, attribute)}" - end + link += if container_id + "&container_id=#{container_id}" + else + "&container_id=#{attribute_input_frame_id(acronym, submission_id, attribute)}" + end link_to link, data: { turbo: true }, class: 'btn btn-sm btn-light' do capture(&block) end @@ -48,17 +50,17 @@ def display_submission_attributes(acronym, attributes, submissionId: nil, inline @selected_attributes = attributes @inline_save = inline_save - if @selected_attributes && !@selected_attributes.empty? - display_properties = (equivalent_properties(@selected_attributes) + [:ontology, :submissionId]).join(',') - else - display_properties = 'all' - end + display_properties = if @selected_attributes && !@selected_attributes.empty? + (equivalent_properties(@selected_attributes) + %i[ontology submissionId]).join(',') + else + 'all' + end - if submissionId - @submission = @ontology.explore.submissions({ display: display_properties }, submissionId) - else - @submission = @ontology.explore.latest_submission({ display: display_properties }) - end + @submission = if submissionId + @ontology.explore.submissions({ display: display_properties }, submissionId) + else + @ontology.explore.latest_submission({ display: display_properties }) + end end def inline_save? @@ -75,20 +77,21 @@ def selected_attribute?(attr) def save_button content_tag :div do button_tag({ data: { controller: 'tooltip' }, title: 'Save', class: 'btn btn-sm btn-light mx-1' }) do - content_tag(:i, "", class: 'fas fa-check') + content_tag(:i, '', class: 'fas fa-check') end end - end - def cancel_link(acronym: @ontology.acronym, submission_id: @submission.submissionId, attribute:) + def cancel_link(attribute:, acronym: @ontology.acronym, submission_id: @submission.submissionId) "/ontologies_metadata_curator/#{acronym}/submissions/#{submission_id}/attributes/#{attribute}" end def cancel_button(href) content_tag :div do - link_to(href, { data: { turbo: true, controller: 'tooltip', turbo_frame: '_self' }, title: 'Cancel', class: 'btn btn-sm btn-light mx-1' }) do - content_tag(:i, "", class: 'fas fa-times') + link_to(href, + { data: { turbo: true, controller: 'tooltip', turbo_frame: '_self' }, title: 'Cancel', + class: 'btn btn-sm btn-light mx-1' }) do + content_tag(:i, '', class: 'fas fa-times') end end end @@ -119,7 +122,8 @@ def sections end def format_equivalent - %w[hasOntologyLanguage prefLabelProperty synonymProperty definitionProperty authorProperty obsoleteProperty obsoleteParent] + %w[hasOntologyLanguage prefLabelProperty synonymProperty definitionProperty authorProperty obsoleteProperty + obsoleteParent] end def location_equivalent @@ -160,49 +164,33 @@ def submission_editable_properties end end - - def attribute_infos(attr_label) - submission_metadata.select{ |attr_hash| attr_hash["attribute"].to_s.eql?(attr_label) }.first + submission_metadata.select { |attr_hash| attr_hash['attribute'].to_s.eql?(attr_label) }.first end - def object_name(acronym = @ontology.acronym, submissionId = @submission.submissionId) + def object_name(_acronym = @ontology.acronym, _submissionId = @submission.submissionId) # TO REMOVE or Update 'submission' end def agent_attributes - submission_metadata.select { |x| x["enforce"].include?('Agent') }.map { |x| x["attribute"] } + submission_metadata.select { |x| x['enforce'].include?('Agent') }.map { |x| x['attribute'] } end def render_submission_inputs(frame_id) - output = "" - - if selected_attribute?('acronym') - output += ontology_acronym_input(update: true) - end + output = '' - if selected_attribute?('name') - output += ontology_name_input - end + output += ontology_acronym_input(update: true) if selected_attribute?('acronym') + output += ontology_name_input if selected_attribute?('name') - if selected_attribute?('hasOntologyLanguage') - output += render partial: 'submissions/submission_format_form' - end + output += render partial: 'submissions/submission_format_form' if selected_attribute?('hasOntologyLanguage') - if selected_attribute?('categories') - output += ontology_categories_input - end - - if selected_attribute?('groups') - output += ontology_groups_input - end + output += ontology_categories_input if selected_attribute?('categories') + output += ontology_groups_input if selected_attribute?('groups') - if selected_attribute?('administeredBy') - output += ontology_administered_by_input - end + output += ontology_administered_by_input if selected_attribute?('administeredBy') if selected_attribute?('location') output += attribute_form_group_container('location') do @@ -212,7 +200,7 @@ def render_submission_inputs(frame_id) if selected_attribute?('contact') output += attribute_form_group_container('contact') do - @submission.contact = [] unless @submission.contact && @submission.contact.size > 0 + @submission.contact = [] unless @submission.contact&.size&.positive? contact_input(label: 'Contacts', name: '') end end @@ -223,7 +211,6 @@ def render_submission_inputs(frame_id) end end - if selected_attribute?('viewOf') output += attribute_form_group_container('viewOf') do ontology_view_of_input @@ -235,27 +222,26 @@ def render_submission_inputs(frame_id) if selected_attribute?('abstract') output += attribute_form_group_container('abstract') do - raw attribute_input('abstract',long_text: true, label: label) + raw attribute_input('abstract', long_text: true, label: label) end end if selected_attribute?('description') output += attribute_form_group_container('description') do - raw attribute_input('description',long_text: true, label: label) + raw attribute_input('description', long_text: true, label: label) end end - submission_metadata.reject { |attr| reject_metadata.include?(attr['attribute']) || !selected_attribute?(attr['attribute']) }.each do |attr| + submission_metadata.reject do |attr| + reject_metadata.include?(attr['attribute']) || !selected_attribute?(attr['attribute']) + end.each do |attr| output += attribute_form_group_container(attr['attribute']) do raw attribute_input(attr['attribute'], label: label) end end - - - render TurboFrameComponent.new(id: frame_id) do output.html_safe end end -end \ No newline at end of file +end diff --git a/app/helpers/turbo_helper.rb b/app/helpers/turbo_helper.rb index c1b0303b46..b80ef1f03b 100644 --- a/app/helpers/turbo_helper.rb +++ b/app/helpers/turbo_helper.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module TurboHelper def frame_id(id, suffix) "#{id}_#{suffix}" @@ -8,20 +10,23 @@ def alerts_container_id(id = nil) end def alert(id: nil, type: 'success', &block) - turbo_stream.prepend(id ||alerts_container_id) do + turbo_stream.prepend(id || alerts_container_id) do Display::AlertComponent.new(type: type).render_in(view_context, &block) end end def alert_error(id: nil, &block) - alert(id: id, type:'danger', &block) + alert(id: id, type: 'danger', &block) end + def alert_success(id: nil, &block) - alert(id: id, type:'success', &block) + alert(id: id, type: 'success', &block) end + def prepend(id, options = {}, &block) turbo_stream.prepend(id, options, &block) end + def replace(id, options = {}, &block) turbo_stream.replace(id, options, &block) end @@ -29,13 +34,13 @@ def replace(id, options = {}, &block) def remove(id) turbo_stream.remove(id) end + def render_turbo_stream(*streams) render turbo_stream: streams end def render_alerts_container(controller_class = nil) id = controller_class.is_a?(String) ? controller_class : alerts_container_id(controller_class&.controller_name) - render AlertsContainerComponent.new(id: id) + render AlertsContainerComponent.new(id: id) end - -end \ No newline at end of file +end diff --git a/app/jobs/application_job.rb b/app/jobs/application_job.rb index a009ace51c..d92ffddcb5 100644 --- a/app/jobs/application_job.rb +++ b/app/jobs/application_job.rb @@ -1,2 +1,4 @@ +# frozen_string_literal: true + class ApplicationJob < ActiveJob::Base end diff --git a/app/lib/kgcl/issue_content_generator.rb b/app/lib/kgcl/issue_content_generator.rb index dce34fb35e..1ae5244ebb 100644 --- a/app/lib/kgcl/issue_content_generator.rb +++ b/app/lib/kgcl/issue_content_generator.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -Dir[Rails.root.join('app', 'lib', 'kgcl', 'renderers', '*.rb')].sort.each { |file| require file } +Dir[Rails.root.join('app', 'lib', 'kgcl', 'renderers', '*.rb')].sort.each { |file| require_relative file } module KGCL module IssueContentGenerator diff --git a/app/mailers/application_mailer.rb b/app/mailers/application_mailer.rb index f2961e12cd..5c719f00ad 100644 --- a/app/mailers/application_mailer.rb +++ b/app/mailers/application_mailer.rb @@ -1,5 +1,6 @@ +# frozen_string_literal: true + class ApplicationMailer < ActionMailer::Base default from: 'noreply@lirmm.com' # layout 'mailer' end - diff --git a/app/mailers/notifier.rb b/app/mailers/notifier.rb index 7d517cf8f1..3bf842f60a 100644 --- a/app/mailers/notifier.rb +++ b/app/mailers/notifier.rb @@ -1,27 +1,28 @@ -class Notifier < ApplicationMailer +# frozen_string_literal: true +class Notifier < ApplicationMailer def lost_password(user, password) # Email header info MUST be added here recipients user.email - from "#{$SUPPORT_EMAIL}" + from $SUPPORT_EMAIL.to_s subject "[#{$ORG_SITE}] Password Reset" # Email body substitutions go here - body :user => user, :password => password + body user: user, password: password end def error(error) recipients $ERROR_EMAIL - from "#{$ADMIN_EMAIL}" - subject "Exception Mailer" - body :exception_message => error.message, :trace => error.backtrace + from $ADMIN_EMAIL.to_s + subject 'Exception Mailer' + body exception_message: error.message, trace: error.backtrace end def endlessloop(node) recipients $ERROR_EMAIL - from "#{$ADMIN_EMAIL}" - subject "Exception Mailer" - body :node => node.inspect + from $ADMIN_EMAIL.to_s + subject 'Exception Mailer' + body node: node.inspect end def feedback(name, email, comment, location, tags) @@ -31,13 +32,10 @@ def feedback(name, email, comment, location, tags) @location = location @tags = tags - mail(:to => "#{$SUPPORT_EMAIL}, #{email}", - :from => "#{$SUPPORT_EMAIL}", - :subject => "[#{$SITE}] Feedback from #{name}") - end - - def signup(user) - + mail(to: "#{$SUPPORT_EMAIL}, #{email}", + from: $SUPPORT_EMAIL.to_s, + subject: "[#{$SITE}] Feedback from #{name}") end + def signup(user); end end diff --git a/app/mailers/subscribe_mailer.rb b/app/mailers/subscribe_mailer.rb index c80a4538eb..bf510f30fb 100644 --- a/app/mailers/subscribe_mailer.rb +++ b/app/mailers/subscribe_mailer.rb @@ -1,42 +1,45 @@ +# frozen_string_literal: true + class SubscribeMailer < ApplicationMailer - - def register_for_announce_list(email,firstName,lastName) - if subscription_configs_valid? - if $ANNOUNCE_LIST_SERVICE.upcase.eql? "SYMPA" - mail( - :to => $ANNOUNCE_SERVICE_HOST, - :from => email, - :subject => "subscribe #{$ANNOUNCE_LIST} #{firstName} #{lastName}") - end - - mail( - :to => $SUPPORT_EMAIL, - :from => email, - :subject => "#{email} has been subscribe to our user mailing list #{$ANNOUNCE_LIST}") - end - end - - def unregister_for_announce_list(email) - if subscription_configs_valid? - if $ANNOUNCE_LIST_SERVICE.upcase.eql? "SYMPA" - mail( - :to => $ANNOUNCE_SERVICE_HOST, - :from => email, - :subject => "unsubscribe #{$ANNOUNCE_LIST}") - end - - mail( - :to => $SUPPORT_EMAIL, - :from => email, - :subject => "#{email} has been unsubscribe from our user mailing list #{$ANNOUNCE_LIST}") - end + def register_for_announce_list(email, firstName, lastName) + return unless subscription_configs_valid? + + if $ANNOUNCE_LIST_SERVICE.upcase.eql? 'SYMPA' + mail( + to: $ANNOUNCE_SERVICE_HOST, + from: email, + subject: "subscribe #{$ANNOUNCE_LIST} #{firstName} #{lastName}" + ) end - - private + mail( + to: $SUPPORT_EMAIL, + from: email, + subject: "#{email} has been subscribe to our user mailing list #{$ANNOUNCE_LIST}" + ) + end + + def unregister_for_announce_list(email) + return unless subscription_configs_valid? - def subscription_configs_valid? - $ANNOUNCE_SERVICE_HOST.present? && $ANNOUNCE_LIST_SERVICE.present? && $ANNOUNCE_LIST.present? + if $ANNOUNCE_LIST_SERVICE.upcase.eql? 'SYMPA' + mail( + to: $ANNOUNCE_SERVICE_HOST, + from: email, + subject: "unsubscribe #{$ANNOUNCE_LIST}" + ) end - + + mail( + to: $SUPPORT_EMAIL, + from: email, + subject: "#{email} has been unsubscribe from our user mailing list #{$ANNOUNCE_LIST}" + ) + end + + private + + def subscription_configs_valid? + $ANNOUNCE_SERVICE_HOST.present? && $ANNOUNCE_LIST_SERVICE.present? && $ANNOUNCE_LIST.present? + end end diff --git a/app/models/analytics.rb b/app/models/analytics.rb index 9493888906..1be4c25047 100644 --- a/app/models/analytics.rb +++ b/app/models/analytics.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + class Analytics < ApplicationRecord serialize :params end diff --git a/app/models/application_record.rb b/app/models/application_record.rb index 71a1a03cc9..71fbba5b32 100644 --- a/app/models/application_record.rb +++ b/app/models/application_record.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + class ApplicationRecord < ActiveRecord::Base self.abstract_class = true -end \ No newline at end of file +end diff --git a/app/models/bpid_resolver.rb b/app/models/bpid_resolver.rb index 3f345b39f1..037247781d 100644 --- a/app/models/bpid_resolver.rb +++ b/app/models/bpid_resolver.rb @@ -1,28 +1,28 @@ +# frozen_string_literal: true + require 'cgi' require 'ostruct' require 'json' require 'open-uri' class BpidResolver - require Rails.root + 'lib/resolver/acronym_from_virtual' - require Rails.root + 'lib/resolver/virtual_from_acronym' - require Rails.root + 'lib/resolver/virtual_from_version' + require "#{Rails.root}/lib/resolver/acronym_from_virtual" + require "#{Rails.root}/lib/resolver/virtual_from_acronym" + require "#{Rails.root}/lib/resolver/virtual_from_version" def self.id_to_acronym(id) - acronym = self.acronym_from_virtual_id(id) - acronym = self.acronym_from_version_id(id) unless acronym + acronym = acronym_from_virtual_id(id) + acronym ||= acronym_from_version_id(id) acronym end def self.acronym_to_virtual_id(acronym) - self.virtual_id_from_acronym(acronym) + virtual_id_from_acronym(acronym) end - private - def self.acronym_from_id(id) - acronym = self.acronym_from_virtual_id(id) - acronym = self.acronym_from_version_id(id) unless acronym + acronym = acronym_from_virtual_id(id) + acronym ||= acronym_from_version_id(id) acronym end @@ -42,5 +42,4 @@ def self.virtual_id_from_version_id(version_id) def self.virtual_id_from_acronym(acronym) VIRTUAL_FROM_ACRONYM["old:virtual_from_acronym:#{acronym}"] end - -end \ No newline at end of file +end diff --git a/app/models/history.rb b/app/models/history.rb index 56aac8792d..ed337aab03 100644 --- a/app/models/history.rb +++ b/app/models/history.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + class History attr_accessor :ontology_id, :ontology_name, :ontology_acronym, :concept @@ -7,4 +9,4 @@ def initialize(ontology_id, ontology_name, ontology_acronym, concept) self.ontology_acronym = ontology_acronym self.concept = concept end -end \ No newline at end of file +end diff --git a/app/models/license.rb b/app/models/license.rb index fffdb7b321..aed90154d7 100644 --- a/app/models/license.rb +++ b/app/models/license.rb @@ -1,5 +1,6 @@ -class License < ApplicationRecord +# frozen_string_literal: true +class License < ApplicationRecord attr_reader :appliance_id, :organization, :expiry_date validates :encrypted_key, presence: true, encrypted_key: true, virtual_appliance_id: true @@ -14,7 +15,7 @@ def is_trial? end def days_remaining - (@expiry_date < Date.current) ? 0 : (@expiry_date - Date.current).to_i + @expiry_date < Date.current ? 0 : (@expiry_date - Date.current).to_i end private @@ -28,7 +29,6 @@ def decrypt @appliance_id = license_data[0] @organization = license_data[1] @expiry_date = Date.parse(license_data[2]) - end + end end - end diff --git a/app/models/mapping_page.rb b/app/models/mapping_page.rb index 11966172f7..aee1483347 100644 --- a/app/models/mapping_page.rb +++ b/app/models/mapping_page.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + class MappingPage < Array attr_accessor :page, :pageCount, :collection end diff --git a/app/models/ontology.rb b/app/models/ontology.rb index 04662e1288..9d58713e4d 100644 --- a/app/models/ontology.rb +++ b/app/models/ontology.rb @@ -1,2 +1,4 @@ +# frozen_string_literal: true + class Ontology < ApplicationRecord -end \ No newline at end of file +end diff --git a/app/models/remote_file.rb b/app/models/remote_file.rb index e668987a9d..b7e9c70b83 100644 --- a/app/models/remote_file.rb +++ b/app/models/remote_file.rb @@ -1,32 +1,30 @@ +# frozen_string_literal: true + require 'open-uri' require 'digest/sha1' - + class RemoteFile < ::Tempfile - - def initialize(path, name = nil, tmpdir = Dir::tmpdir) + def initialize(path, name = nil, tmpdir = Dir.tmpdir) @original_filename = name.nil? ? File.basename(path) : name @remote_path = path - + super Digest::SHA1.hexdigest(path), tmpdir fetch end - + def fetch string_io = OpenURI.send(:open, @remote_path) - self.write string_io.read - self.rewind + write string_io.read + rewind self end - - def original_filename - @original_filename - end - + + attr_reader :original_filename + def content_type - mime = `file --mime -br #{self.path}`.strip - mime = mime.gsub(/^.*: */,"") - mime = mime.gsub(/;.*$/,"") - mime = mime.gsub(/,.*$/,"") - mime + mime = `file --mime -br #{path}`.strip + mime = mime.gsub(/^.*: */, '') + mime = mime.gsub(/;.*$/, '') + mime.gsub(/,.*$/, '') end end diff --git a/app/models/resource_index_result_paginatable.rb b/app/models/resource_index_result_paginatable.rb index 4e9c06b8c5..a7f0977719 100644 --- a/app/models/resource_index_result_paginatable.rb +++ b/app/models/resource_index_result_paginatable.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + class ResourceIndexResultPaginatable < WillPaginate::Collection attr_accessor :totalResults, :offset, :limit, :acronym @@ -11,10 +13,10 @@ def initialize(hash) # Fill out attributes needed by will_paginate @current_page = hash.page - @per_page = self.limit - self.total_entries = self.totalResults + @per_page = limit + self.total_entries = totalResults # Put the array elements in place - self.replace(hash.collection) + replace(hash.collection) end -end \ No newline at end of file +end diff --git a/app/models/virtual_appliance_user.rb b/app/models/virtual_appliance_user.rb index 6624753d01..d9c75403fe 100644 --- a/app/models/virtual_appliance_user.rb +++ b/app/models/virtual_appliance_user.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + class VirtualApplianceUser < ApplicationRecord self.implicit_order_column = 'user_id' end diff --git a/app/services/application_service.rb b/app/services/application_service.rb index 618af8a239..44262b0ea0 100644 --- a/app/services/application_service.rb +++ b/app/services/application_service.rb @@ -1,5 +1,7 @@ +# frozen_string_literal: true + class ApplicationService def self.call(*args, &block) new(*args, &block).call end -end \ No newline at end of file +end diff --git a/app/services/issue_creator_service.rb b/app/services/issue_creator_service.rb index 19d81ce475..fda0d5c0db 100644 --- a/app/services/issue_creator_service.rb +++ b/app/services/issue_creator_service.rb @@ -3,7 +3,6 @@ class IssueCreatorService < ApplicationService class QueryError < StandardError; end - def initialize(params) @title = params[:content][:title] @body = params[:content][:body] @@ -11,7 +10,6 @@ def initialize(params) end def call - findRepoQuery = GitHub::Client.parse <<-'GRAPHQL' query ($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { @@ -36,7 +34,7 @@ def call } } } - GRAPHQL + GRAPHQL data = query(findRepoQuery, variables: { owner: repo_owner, name: repo_name }) data = query(createIssueMutation, variables: { repositoryId: data.repository.id, title: @title, body: @body }) data.to_h.dig('createIssue', 'issue') diff --git a/app/services/license_key_decrypter.rb b/app/services/license_key_decrypter.rb index 54369fcabb..ea1703bcb0 100644 --- a/app/services/license_key_decrypter.rb +++ b/app/services/license_key_decrypter.rb @@ -1,19 +1,19 @@ -class LicenseKeyDecrypter < ApplicationService +# frozen_string_literal: true +class LicenseKeyDecrypter < ApplicationService def initialize(license_key) @license_key = license_key end def call - encrypted_key, encrypted_data = @license_key.split('|').map{ |a| Base64.decode64(a) } + encrypted_key, encrypted_data = @license_key.split('|').map { |a| Base64.decode64(a) } public_key_file = Rails.root.join('config', 'keys', 'public.pem') public_key = OpenSSL::PKey::RSA.new(File.read(public_key_file)) - cipher = OpenSSL::Cipher::AES256.new(:CBC) + cipher = OpenSSL::Cipher.new('aes-256-cbc') cipher.decrypt cipher.key = public_key.public_decrypt(encrypted_key) cipher.update(encrypted_data) + cipher.final end - -end \ No newline at end of file +end diff --git a/app/validators/encrypted_key_validator.rb b/app/validators/encrypted_key_validator.rb index e19ab707ee..52742bce27 100644 --- a/app/validators/encrypted_key_validator.rb +++ b/app/validators/encrypted_key_validator.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + # EncryptedKeyValidator # # Custom validator for encrypted license keys @@ -8,13 +10,12 @@ # class EncryptedKeyValidator < ActiveModel::EachValidator - def validate_each(record, attribute, value) return if record.is_trial? - unless valid_encrypted_key?(value) - record.errors.add(attribute, :invalid_license_key) - end + return if valid_encrypted_key?(value) + + record.errors.add(attribute, :invalid_license_key) end private @@ -24,5 +25,4 @@ def valid_encrypted_key?(value) rescue OpenSSL::Cipher::CipherError, OpenSSL::PKey::RSAError false end - -end \ No newline at end of file +end diff --git a/app/validators/virtual_appliance_id_validator.rb b/app/validators/virtual_appliance_id_validator.rb index 6bb5f300b1..51a86ce207 100644 --- a/app/validators/virtual_appliance_id_validator.rb +++ b/app/validators/virtual_appliance_id_validator.rb @@ -1,7 +1,9 @@ +# frozen_string_literal: true + # VirtualApplianceIdValidator # -# Custom validator for virtual appliance IDs. The virtual appliance ID in a -# license key must match the ID of the virtual appliance against which a +# Custom validator for virtual appliance IDs. The virtual appliance ID in a +# license key must match the ID of the virtual appliance against which a # license is submitted. # # class License < ApplicationRecord @@ -10,21 +12,20 @@ # class VirtualApplianceIdValidator < ActiveModel::EachValidator - def validate_each(record, attribute, value) return if record.is_trial? response = JSON.parse( - LinkedData::Client::HTTP.get(LinkedData::Client.settings.rest_url + "/admin/update_info", {}, raw: true) + LinkedData::Client::HTTP.get("#{LinkedData::Client.settings.rest_url}/admin/update_info", {}, raw: true) ) - if response["error"] + if response['error'] record.errors.add(attribute, :no_appliance_id_for_comparison) return false end - - unless valid_virtual_appliance_id?(value, response["appliance_id"]) - record.errors.add(attribute, :appliance_id_mismatch) - end + + return if valid_virtual_appliance_id?(value, response['appliance_id']) + + record.errors.add(attribute, :appliance_id_mismatch) end private @@ -36,5 +37,4 @@ def valid_virtual_appliance_id?(value, appliance_id) rescue OpenSSL::Cipher::CipherError, OpenSSL::PKey::RSAError false end - -end \ No newline at end of file +end diff --git a/app/views/projects/index.html.haml b/app/views/projects/index.html.haml index e17084d21d..1aaf9aed37 100644 --- a/app/views/projects/index.html.haml +++ b/app/views/projects/index.html.haml @@ -5,7 +5,7 @@ %h1.tab_header= t("projects.self") %p.tab_description = t("projects.index.intro", site: "#{$SITE}") - = link_to(help_path(anchor: "Projects_Tab"), id: "projects-help", aria: {label: t("projects.view_projects_help")}) do + = link_to("#{Rails.configuration.settings.links[:help]}#Projects_Tab", id: "projects-help", aria: {label: t("projects.view_projects_help")}) do %i.fas.fa-question-circle.fa-lg{aria: {hidden: "true"}, style: "margin-left: .25em"} %div{:style => "padding:10px;"} diff --git a/bin/bundle b/bin/bundle index f19acf5b5c..2dbb71769e 100755 --- a/bin/bundle +++ b/bin/bundle @@ -1,3 +1,5 @@ #!/usr/bin/env ruby +# frozen_string_literal: true + ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__) load Gem.bin_path('bundler', 'bundle') diff --git a/bin/rails b/bin/rails index efc0377492..a31728ab97 100755 --- a/bin/rails +++ b/bin/rails @@ -1,4 +1,6 @@ #!/usr/bin/env ruby -APP_PATH = File.expand_path("../config/application", __dir__) -require_relative "../config/boot" -require "rails/commands" +# frozen_string_literal: true + +APP_PATH = File.expand_path('../config/application', __dir__) +require_relative '../config/boot' +require 'rails/commands' diff --git a/bin/rake b/bin/rake index 4fbf10b960..c199955006 100755 --- a/bin/rake +++ b/bin/rake @@ -1,4 +1,6 @@ #!/usr/bin/env ruby -require_relative "../config/boot" -require "rake" +# frozen_string_literal: true + +require_relative '../config/boot' +require 'rake' Rake.application.run diff --git a/bin/setup b/bin/setup index ec47b79b3b..516b651e39 100755 --- a/bin/setup +++ b/bin/setup @@ -1,8 +1,10 @@ #!/usr/bin/env ruby -require "fileutils" +# frozen_string_literal: true + +require 'fileutils' # path to your application root. -APP_ROOT = File.expand_path("..", __dir__) +APP_ROOT = File.expand_path('..', __dir__) def system!(*args) system(*args) || abort("\n== Command #{args} failed ==") @@ -13,9 +15,9 @@ FileUtils.chdir APP_ROOT do # This script is idempotent, so that you can run it at any time and get an expectable outcome. # Add necessary setup steps to this file. - puts "== Installing dependencies ==" - system! "gem install bundler --conservative" - system("bundle check") || system!("bundle install") + puts '== Installing dependencies ==' + system! 'gem install bundler --conservative' + system('bundle check') || system!('bundle install') # puts "\n== Copying sample files ==" # unless File.exist?("config/database.yml") @@ -23,11 +25,11 @@ FileUtils.chdir APP_ROOT do # end puts "\n== Preparing database ==" - system! "bin/rails db:prepare" + system! 'bin/rails db:prepare' puts "\n== Removing old logs and tempfiles ==" - system! "bin/rails log:clear tmp:clear" + system! 'bin/rails log:clear tmp:clear' puts "\n== Restarting application server ==" - system! "bin/rails restart" + system! 'bin/rails restart' end diff --git a/bin/update b/bin/update index 58bfaed518..313c74b38b 100755 --- a/bin/update +++ b/bin/update @@ -1,4 +1,6 @@ #!/usr/bin/env ruby +# frozen_string_literal: true + require 'fileutils' include FileUtils diff --git a/bin/wait-for-it b/bin/wait-for-it new file mode 100755 index 0000000000..7888ed4326 --- /dev/null +++ b/bin/wait-for-it @@ -0,0 +1,182 @@ +#!/usr/bin/env sh +# Use this script to test if a given TCP host/port are available + +WAITFORIT_cmdname=${0##*/} + +echoerr() { if [[ $WAITFORIT_QUIET -ne 1 ]]; then echo "$@" 1>&2; fi } + +usage() +{ + cat << USAGE >&2 +Usage: + $WAITFORIT_cmdname host:port [-s] [-t timeout] [-- command args] + -h HOST | --host=HOST Host or IP under test + -p PORT | --port=PORT TCP port under test + Alternatively, you specify the host and port as host:port + -s | --strict Only execute subcommand if the test succeeds + -q | --quiet Don't output any status messages + -t TIMEOUT | --timeout=TIMEOUT + Timeout in seconds, zero for no timeout + -- COMMAND ARGS Execute command with args after the test finishes +USAGE + exit 1 +} + +wait_for() +{ + if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then + echoerr "$WAITFORIT_cmdname: waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT" + else + echoerr "$WAITFORIT_cmdname: waiting for $WAITFORIT_HOST:$WAITFORIT_PORT without a timeout" + fi + WAITFORIT_start_ts=$(date +%s) + while : + do + if [[ $WAITFORIT_ISBUSY -eq 1 ]]; then + nc -z $WAITFORIT_HOST $WAITFORIT_PORT + WAITFORIT_result=$? + else + (echo -n > /dev/tcp/$WAITFORIT_HOST/$WAITFORIT_PORT) >/dev/null 2>&1 + WAITFORIT_result=$? + fi + if [[ $WAITFORIT_result -eq 0 ]]; then + WAITFORIT_end_ts=$(date +%s) + echoerr "$WAITFORIT_cmdname: $WAITFORIT_HOST:$WAITFORIT_PORT is available after $((WAITFORIT_end_ts - WAITFORIT_start_ts)) seconds" + break + fi + sleep 1 + done + return $WAITFORIT_result +} + +wait_for_wrapper() +{ + # In order to support SIGINT during timeout: http://unix.stackexchange.com/a/57692 + if [[ $WAITFORIT_QUIET -eq 1 ]]; then + timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --quiet --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT & + else + timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT & + fi + WAITFORIT_PID=$! + trap "kill -INT -$WAITFORIT_PID" INT + wait $WAITFORIT_PID + WAITFORIT_RESULT=$? + if [[ $WAITFORIT_RESULT -ne 0 ]]; then + echoerr "$WAITFORIT_cmdname: timeout occurred after waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT" + fi + return $WAITFORIT_RESULT +} + +# process arguments +while [[ $# -gt 0 ]] +do + case "$1" in + *:* ) + WAITFORIT_hostport=(${1//:/ }) + WAITFORIT_HOST=${WAITFORIT_hostport[0]} + WAITFORIT_PORT=${WAITFORIT_hostport[1]} + shift 1 + ;; + --child) + WAITFORIT_CHILD=1 + shift 1 + ;; + -q | --quiet) + WAITFORIT_QUIET=1 + shift 1 + ;; + -s | --strict) + WAITFORIT_STRICT=1 + shift 1 + ;; + -h) + WAITFORIT_HOST="$2" + if [[ $WAITFORIT_HOST == "" ]]; then break; fi + shift 2 + ;; + --host=*) + WAITFORIT_HOST="${1#*=}" + shift 1 + ;; + -p) + WAITFORIT_PORT="$2" + if [[ $WAITFORIT_PORT == "" ]]; then break; fi + shift 2 + ;; + --port=*) + WAITFORIT_PORT="${1#*=}" + shift 1 + ;; + -t) + WAITFORIT_TIMEOUT="$2" + if [[ $WAITFORIT_TIMEOUT == "" ]]; then break; fi + shift 2 + ;; + --timeout=*) + WAITFORIT_TIMEOUT="${1#*=}" + shift 1 + ;; + --) + shift + WAITFORIT_CLI=("$@") + break + ;; + --help) + usage + ;; + *) + echoerr "Unknown argument: $1" + usage + ;; + esac +done + +if [[ "$WAITFORIT_HOST" == "" || "$WAITFORIT_PORT" == "" ]]; then + echoerr "Error: you need to provide a host and port to test." + usage +fi + +WAITFORIT_TIMEOUT=${WAITFORIT_TIMEOUT:-15} +WAITFORIT_STRICT=${WAITFORIT_STRICT:-0} +WAITFORIT_CHILD=${WAITFORIT_CHILD:-0} +WAITFORIT_QUIET=${WAITFORIT_QUIET:-0} + +# Check to see if timeout is from busybox? +WAITFORIT_TIMEOUT_PATH=$(type -p timeout) +WAITFORIT_TIMEOUT_PATH=$(realpath $WAITFORIT_TIMEOUT_PATH 2>/dev/null || readlink -f $WAITFORIT_TIMEOUT_PATH) + +WAITFORIT_BUSYTIMEFLAG="" +if [[ $WAITFORIT_TIMEOUT_PATH =~ "busybox" ]]; then + WAITFORIT_ISBUSY=1 + # Check if busybox timeout uses -t flag + # (recent Alpine versions don't support -t anymore) + if timeout &>/dev/stdout | grep -q -e '-t '; then + WAITFORIT_BUSYTIMEFLAG="-t" + fi +else + WAITFORIT_ISBUSY=0 +fi + +if [[ $WAITFORIT_CHILD -gt 0 ]]; then + wait_for + WAITFORIT_RESULT=$? + exit $WAITFORIT_RESULT +else + if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then + wait_for_wrapper + WAITFORIT_RESULT=$? + else + wait_for + WAITFORIT_RESULT=$? + fi +fi + +if [[ $WAITFORIT_CLI != "" ]]; then + if [[ $WAITFORIT_RESULT -ne 0 && $WAITFORIT_STRICT -eq 1 ]]; then + echoerr "$WAITFORIT_cmdname: strict mode, refusing to execute subprocess" + exit $WAITFORIT_RESULT + fi + exec "${WAITFORIT_CLI[@]}" +else + exit $WAITFORIT_RESULT +fi diff --git a/bin/yarn b/bin/yarn index 9fab2c3507..9da8e5c570 100755 --- a/bin/yarn +++ b/bin/yarn @@ -1,17 +1,19 @@ #!/usr/bin/env ruby +# frozen_string_literal: true + APP_ROOT = File.expand_path('..', __dir__) Dir.chdir(APP_ROOT) do - yarn = ENV["PATH"].split(File::PATH_SEPARATOR). - select { |dir| File.expand_path(dir) != __dir__ }. - product(["yarn", "yarn.cmd", "yarn.ps1"]). - map { |dir, file| File.expand_path(file, dir) }. - find { |file| File.executable?(file) } + yarn = ENV['PATH'].split(File::PATH_SEPARATOR) + .reject { |dir| File.expand_path(dir) == __dir__ } + .product(['yarn', 'yarn.cmd', 'yarn.ps1']) + .map { |dir, file| File.expand_path(file, dir) } + .find { |file| File.executable?(file) } if yarn exec yarn, *ARGV else - $stderr.puts "Yarn executable was not detected in the system." - $stderr.puts "Download Yarn at https://yarnpkg.com/en/docs/install" + warn 'Yarn executable was not detected in the system.' + warn 'Download Yarn at https://yarnpkg.com/en/docs/install' exit 1 end end diff --git a/config.ru b/config.ru index a8f6e4abd6..3c189ca528 100644 --- a/config.ru +++ b/config.ru @@ -1,6 +1,8 @@ +# frozen_string_literal: true + # This file is used by Rack-based servers to start the application. -require_relative "config/environment" +require_relative 'config/environment' run BioportalWebUi::Application Rails.application.load_server diff --git a/config/application.rb b/config/application.rb index 1213596fa4..eba0fdc731 100644 --- a/config/application.rb +++ b/config/application.rb @@ -1,6 +1,8 @@ -require_relative "boot" +# frozen_string_literal: true -require "rails/all" +require_relative 'boot' + +require 'rails/all' # Require the gems listed in Gemfile, including any gems # you've limited to :test, :development, or :production. @@ -12,21 +14,18 @@ class Application < Rails::Application config.load_defaults 7.0 # permitted locales available for the application - config.i18n.available_locales = [:en, :fr, :it, :de] + config.i18n.available_locales = %i[en fr it de] config.i18n.default_locale = :en - # Configuration for the application, engines, and railties goes here. # # These settings can be overridden in specific environments using the files # in config/environments, which are processed later. # # config.time_zone = "Central Time (US & Canada)" - config.exceptions_app = self.routes - + config.exceptions_app = routes config.autoload_paths += %W[#{config.root}/app/lib/kgcl] - config.settings = config_for :settings # Initialize configuration for KGCL change request functionality. config.change_request = config_for :change_request @@ -34,6 +33,6 @@ class Application < Rails::Application config.generators.template_engine = :haml # Set the default layout to app/views/layouts/component_preview.html.erb - config.view_component.default_preview_layout = "component_preview" + config.view_component.default_preview_layout = 'component_preview' end end diff --git a/config/bioportal_config_test.rb b/config/bioportal_config_test.rb new file mode 100644 index 0000000000..c76174deb8 --- /dev/null +++ b/config/bioportal_config_test.rb @@ -0,0 +1,172 @@ +# frozen_string_literal: true + +$SITE = 'Testportal' +$UI_HOSTNAME = 'localhost' +$UI_URL = "http://#{$UI_HOSTNAME}:3000" + +$API_KEY = ENV['API_KEY'] +$REST_URL = ENV['API_URL'] +$BIOMIXER_URL = ENV['BIOMIXER_URL'] +$ANNOTATOR_URL = $PROXY_URL = ENV['ANNOTATOR_URL'] +$FAIRNESS_URL = ENV['ANNOTATOR_URL'] + +# config/initializers/omniauth_providers.rb +$OMNIAUTH_PROVIDERS = { + github: { + client_id: 'id', + client_secret: 'secret', + icon: 'icons/github.svg' + }, + google: { + strategy: :google_oauth2, + client_id: 'id', + client_secret: 'secret', + icon: 'icons/google.svg' + }, + orcid: { + client_id: 'YOUR_ORCID_CLIENT_ID', + client_secret: 'YOUR_ORCID_CLIENT_SECRET', + icon: 'icons/orcid.svg' + }, + keycloak: { + strategy: :keycloak_openid, + client_id: 'YOUR_KEYCLOAK_CLIENT_ID', + client_secret: 'YOUR_KEYCLOAK_CLIENT_SECRET', + client_options: { site: 'KEYCLOAK_SITE', realm: 'KEYCLOAK_REALM' }, + name: 'keycloak', + icon: 'icons/keycloak.svg' + } +}.freeze + +$INTERPORTAL_HASH = {} + +# If your BioPortal installation includes Fairness score set this to true +$FAIRNESS_DISABLED = false + +# Pairing a name with an array of ontology virtual ids will allow you to filter ontologies based on a subdomain. +# If your main UI is hosted at example.org and you add custom.example.org pointing to the same Rails installation +# you could filter the ontologies visible at custom.example.org by adding this to the hash: "custom" => { :name => "Custom Slice", :ontologies => [1032, 1054, 1099] } +# Any number of slices can be added. Groups are added automatically using the group acronym as the subdomain. +$ENABLE_SLICES = true +$ONTOLOGY_SLICES = {} + +# Cube metrics reporting +$ENABLE_CUBE = false + +$NOT_DOWNLOADABLE = {} +# Enable client request caching +$CLIENT_REQUEST_CACHING = true + +# If you don't use Airbrake you can have exceptions emailed to the $ERROR_EMAIL address by setting this to 'true' +$EMAIL_EXCEPTIONS = false + +# Announcements mailman mailing list REQUEST address, EX: list-request@lists.example.org +# NOTE: You must use the REQUEST address for the mailing list. ONLY WORKS WITH MAILMAN LISTS. +$ANNOUNCE_LIST ||= 'appliance-users-request@localhost' + +# Email addresses used for sending notifications (errors, feedback, support) +$SUPPORT_EMAIL ||= 'support@localhost' +$ADMIN_EMAIL ||= 'admin@localhost' +$ERROR_EMAIL ||= 'errors@localhost' + +# Custom BioPortal logging +require 'log' +$REMOTE_LOGGING = false + +## +# Custom Ontology Details +# Custom details can be added on a per ontology basis using a key/value pair as columns of the details table +# +# Example: +# $ADDITIONAL_ONTOLOGY_DETAILS = { 1000 => { "Additional Detail" => "Text to be shown in the right-hand column." } } +## +$ADDITIONAL_ONTOLOGY_DETAILS = {} + +# Site notice appears on all pages and remains closed indefinitely. Stored below as a hash with a unique key and a +# EX: $SITE_NOTICE = { :unique_key => 'Put your message here (can include html if you use +$SITE_NOTICE = {} +################################ +## AUTO-GENERATED DO NOT MODIFY +################################# + +# Full string for site, EX: "NCBO BioPortal" +$ORG_SITE = $ORG.nil? || $ORG.empty? ? $SITE : "#{$ORG} #{$SITE}" + +$HOME_PAGE_LOGOS = { + supported_by: [ + { + img_src: 'logos/supports/numev.png', + url: 'http://www.lirmm.fr/numev', + target: '_blank' + }, + { + img_src: 'logos/supports/anr.png', + url: 'https://anr.fr/en', + target: '_blank' + }, + { + img_src: 'logos/supports/eu.png', + url: 'https://commission.europa.eu/research-and-innovation_en', + target: '_blank' + } + ], + with_the_collaboration_of: [ + { + img_src: 'logos/collaboration/d2kab.png', + url: 'http://d2kab.mystrikingly.com', + target: '_blank' + }, + { + img_src: 'logos/collaboration/lirmm.png', + url: 'http://www.lirmm.fr', + target: '_blank' + }, + { + img_src: 'logos/collaboration/inrae.png', + url: 'https://www.inrae.fr/enm', + target: '_blank' + }, + { + img_src: 'logos/collaboration/stanford.png', + url: 'https://www.stanford.edu', + target: '_blank' + } + ] +} + +$FOOTER_LINKS = { + social: [ + { logo: 'social/people.svg', link: 'https://github.com/orgs/agroportal/people' }, + { logo: 'social/github.svg', link: 'https://github.com/agroportal' }, + { logo: 'social/twitter.svg', link: 'https://twitter.com/lagroportal' } + ], + sections: { + products: { + ontoportal: 'https://ontoportal.org/', + release_notes: 'https://doc.jonquetlab.lirmm.fr/share/e6158eda-c109-4385-852c-51a42de9a412/doc/release-notes-btKjZk5tU2', + api: 'https://data.agroportal.lirmm.fr/', + sparql: 'https://sparql.agroportal.lirmm.fr/test/' + }, + support: { + contact_us: 'https://agroportal.lirmm.fr/feedback', + wiki: 'https://www.bioontology.org/wiki/', + documentation: 'https://ontoportal.github.io/documentation/' + }, + agreements: { + terms: '', + privacy_policy: '', + cite_us: '', + acknowledgments: '' + }, + about: { + about_us: 'https://github.com/agroportal/project-management', + projects: 'https://d2kab.mystrikingly.com/', + team: 'https://github.com/orgs/agroportal/people' + } + } +} + +$UI_THEME = :stageportal +if File.exist?('config/bioportal_config_development_testportal.lirmm.fr.rb') + require_relative 'bioportal_config_development_testportal.lirmm.fr' # local credentials +end diff --git a/config/boot.rb b/config/boot.rb index 340e433cb6..cac5b8f4d2 100644 --- a/config/boot.rb +++ b/config/boot.rb @@ -1,4 +1,6 @@ -ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) +# frozen_string_literal: true -require "bundler/setup" # Set up gems listed in the Gemfile. +ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__) + +require 'bundler/setup' # Set up gems listed in the Gemfile. require 'bootsnap/setup' diff --git a/config/database.yml.sample b/config/database.yml.sample index c92d72df20..463e3ebea9 100644 --- a/config/database.yml.sample +++ b/config/database.yml.sample @@ -12,10 +12,9 @@ default: &default adapter: mysql2 encoding: utf8mb4 - pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: root password: bp_user - host: db + host: 127.0.0.1 development: <<: *default diff --git a/config/deploy.rb b/config/deploy.rb index 1fe0d99900..9b103d7038 100644 --- a/config/deploy.rb +++ b/config/deploy.rb @@ -1,5 +1,7 @@ -set :author, "ontoportal-lirmm" -set :application, "bioportal_web_ui" +# frozen_string_literal: true + +set :author, 'ontoportal-lirmm' +set :application, 'bioportal_web_ui' set :repo_url, "https://github.com/#{fetch(:author)}/#{fetch(:application)}.git" @@ -33,7 +35,7 @@ # Default value for linked_dirs is [] # set :linked_dirs, %w{bin log tmp/pids tmp/cache public/system public/assets config/locales} -set :linked_dirs, %w{log tmp/pids tmp/cache public/system public/assets} +set :linked_dirs, %w[log tmp/pids tmp/cache public/system public/assets] # Default value for default_env is {} # set :default_env, { path: "/opt/ruby/bin:$PATH" } @@ -44,7 +46,7 @@ set :bundle_config, { deployment: true } # Defaults to [:web] -set :assets_roles, [:web, :app] +set :assets_roles, %i[web app] set :keep_assets, 3 # If you want to restart using `touch tmp/restart.txt`, add this to your config/deploy.rb: @@ -55,10 +57,10 @@ # If you don't set `:passenger_restart_with_touch`, capistrano-passenger will check what version of passenger you are running # and use `passenger-config restart-app` if it is available in that version. -desc "Check if agent forwarding is working" +desc 'Check if agent forwarding is working' task :forwarding do on roles(:all) do |h| - if test("env | grep SSH_AUTH_SOCK") + if test('env | grep SSH_AUTH_SOCK') info "Agent forwarding is up to #{h}" else error "Agent forwarding is NOT up to #{h}" @@ -70,7 +72,7 @@ desc 'display remote system env vars' task :show_remote_env do on roles(:all) do - remote_env = capture("env") + remote_env = capture('env') puts remote_env end end @@ -80,7 +82,7 @@ # or get config from local directory if LOCAL_CONFIG_PATH env var is set task :get_config do if defined?(PRIVATE_CONFIG_REPO) - TMP_CONFIG_PATH = "/tmp/#{SecureRandom.hex(15)}".freeze + TMP_CONFIG_PATH = "/tmp/#{SecureRandom.hex(15)}" on roles(:app) do execute "git clone -q #{PRIVATE_CONFIG_REPO} #{TMP_CONFIG_PATH}" execute "rsync -a #{TMP_CONFIG_PATH}/#{fetch(:application)}/ #{release_path}/" @@ -101,7 +103,6 @@ end end - after :publishing, :restart after :restart, :clear_cache do diff --git a/config/deploy/appliance.rb b/config/deploy/appliance.rb index 7b965a0fcd..f8169f6b0c 100644 --- a/config/deploy/appliance.rb +++ b/config/deploy/appliance.rb @@ -1,12 +1,14 @@ +# frozen_string_literal: true + # Simple Role Syntax # ================== # Supports bulk-adding hosts to roles, the primary # server in each group is considered to be the first # unless any hosts have the primary property set. # Don't declare `role :all`, it's a meta role -#role :app, %w{deploy@example.com} -#role :web, %w{deploy@example.com} -#role :db, %w{deploy@example.com} +# role :app, %w{deploy@example.com} +# role :web, %w{deploy@example.com} +# role :db, %w{deploy@example.com} # Extended Server Syntax # ====================== @@ -14,7 +16,7 @@ # definition into the server list. The second argument # something that quacks like a hash can be used to set # extended properties on the server. -server 'localhost', roles: %w{app db} +server 'localhost', roles: %w[app db] # you can set custom ssh options # it's possible to pass any option but you need to keep in mind that net/ssh understand limited list of options @@ -40,14 +42,14 @@ # BRANCH = ENV.include?('BRANCH') ? ENV['BRANCH'] : 'master' -set :branch, "#{BRANCH}" +set :branch, BRANCH.to_s set :deploy_to, "/srv/ontoportal/#{fetch(:application)}" # install gems into a common direcotry shared across ui, api and ncbo_cron to reduce disk usage set :bundle_path, '/srv/ontoportal/.bundle' -#private git repo for configuraiton -#PRIVATE_CONFIG_REPO = ENV.include?('PRIVATE_CONFIG_REPO') ? ENV['PRIVATE_CONFIG_REPO'] : 'git@github.com:your_org/private-config-repo.git' +# private git repo for configuraiton +# PRIVATE_CONFIG_REPO = ENV.include?('PRIVATE_CONFIG_REPO') ? ENV['PRIVATE_CONFIG_REPO'] : 'git@github.com:your_org/private-config-repo.git' -#location of configuration files +# location of configuration files LOCAL_CONFIG_PATH = ENV.include?('LOCAL_CONFIG_PATH') ? ENV['LOCAL_CONFIG_PATH'] : '/srv/ontoportal/virtual_appliance/appliance_config' diff --git a/config/deploy/production.rb b/config/deploy/production.rb index 78022105df..57e5e5b41f 100644 --- a/config/deploy/production.rb +++ b/config/deploy/production.rb @@ -1,11 +1,13 @@ +# frozen_string_literal: true + # Simple Role Syntax # ================== # Supports bulk-adding hosts to roles, the primary # server in each group is considered to be the first # unless any hosts have the primary property set. # Don't declare `role :all`, it's a meta role -role :app, %w{ui1.prd.ontoportal.org ui2.prd.ontoportal.org} -role :db, %w{ui1.prd.ontoportal.org} # sufficient to run db:migrate only on one system +role :app, %w[ui1.prd.ontoportal.org ui2.prd.ontoportal.org] +role :db, %w[ui1.prd.ontoportal.org] # sufficient to run db:migrate only on one system # Extended Server Syntax # ====================== @@ -13,7 +15,7 @@ # definition into the server list. The second argument # something that quacks like a hash can be used to set # extended properties on the server. -#server 'example.com', user: 'deploy', roles: %w{web app}, my_property: :my_value +# server 'example.com', user: 'deploy', roles: %w{web app}, my_property: :my_value set :log_level, :error # you can set custom ssh options # it's possible to pass any option but you need to keep in mind that net/ssh understand limited list of options @@ -39,11 +41,11 @@ set :ssh_options, { user: 'deployer', forward_agent: 'true', - keys: %w(config/deploy_id_rsa), - auth_methods: %w(publickey), + keys: %w[config/deploy_id_rsa], + auth_methods: %w[publickey], # use ssh proxy if UI servers are on a private network proxy: Net::SSH::Proxy::Command.new('ssh deployer@sshproxy.ontoportal.org -W %h:%p') } -#private git repo for configuraiton +# private git repo for configuraiton PRIVATE_CONFIG_REPO = ENV.include?('PRIVATE_CONFIG_REPO') ? ENV['PRIVATE_CONFIG_REPO'] : 'git@github.com:author/private_config_repo.git' diff --git a/config/deploy/staging.rb b/config/deploy/staging.rb index 2ad6dc6cd6..9a9b13906e 100644 --- a/config/deploy/staging.rb +++ b/config/deploy/staging.rb @@ -1,11 +1,13 @@ +# frozen_string_literal: true + # Simple Role Syntax # ================== # Supports bulk-adding hosts to roles, the primary # server in each group is considered to be the first # unless any hosts have the primary property set. # Don't declare `role :all`, it's a meta role -role :app, %w{stageportal.lirmm.fr} -role :db, %w{stageportal.lirmm.fr} # sufficient to run db:migrate only on one system +role :app, %w[stageportal.lirmm.fr] +role :db, %w[stageportal.lirmm.fr] # sufficient to run db:migrate only on one system # Extended Server Syntax # ====================== @@ -13,7 +15,7 @@ # definition into the server list. The second argument # something that quacks like a hash can be used to set # extended properties on the server. -#server 'example.com', user: 'deploy', roles: %w{web app}, my_property: :my_value +# server 'example.com', user: 'deploy', roles: %w{web app}, my_property: :my_value set :log_level, :error # you can set custom ssh options # it's possible to pass any option but you need to keep in mind that net/ssh understand limited list of options @@ -39,11 +41,11 @@ set :ssh_options, { user: 'deploy', forward_agent: 'true', - keys: %w(config/deploy_id_rsa), - auth_methods: %w(publickey), + keys: %w[config/deploy_id_rsa], + auth_methods: %w[publickey] # use ssh proxy if UI servers are on a private network # proxy: Net::SSH::Proxy::Command.new('ssh deployer@sshproxy.ontoportal.org -W %h:%p') } -#private git repo for configuraiton +# private git repo for configuraiton PRIVATE_CONFIG_REPO = ENV.include?('PRIVATE_CONFIG_REPO') ? ENV['PRIVATE_CONFIG_REPO'] : 'git@github.com:author/private_config_repo.git' diff --git a/config/environment.rb b/config/environment.rb index cac5315775..d5abe55806 100755 --- a/config/environment.rb +++ b/config/environment.rb @@ -1,5 +1,7 @@ +# frozen_string_literal: true + # Load the Rails application. -require_relative "application" +require_relative 'application' # Initialize the Rails application. Rails.application.initialize! diff --git a/config/environments/appliance.rb b/config/environments/appliance.rb index ec5f5e79f9..8eb7c6b594 100644 --- a/config/environments/appliance.rb +++ b/config/environments/appliance.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + BioportalWebUi::Application.configure do # Settings specified here will take precedence over those in config/application.rb. @@ -78,15 +80,15 @@ require Rails.root.join('config', "bioportal_config_#{Rails.env}.rb") # Use a different cache store in the appliance. - config.cache_store = :mem_cache_store, ENV["MEMCACHE_SERVERS"] || "localhost:11211", { :namespace => 'bioportal_web_ui', :expires_in => 1.day } - + config.cache_store = :mem_cache_store, ENV['MEMCACHE_SERVERS'] || 'localhost:11211', + { namespace: 'bioportal_web_ui', expires_in: 1.day } # Disable serving static files from the `/public` folder by default since # Apache or NGINX already handles this. config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present? # Add custom data attributes to sanitize allowed list - config.action_view.sanitized_allowed_attributes = ['id', 'class', 'style', 'data-cls', 'data-ont'] + config.action_view.sanitized_allowed_attributes = %w[id class style data-cls data-ont] config.view_component.show_previews = true # TODO: Fix this? # enable json logging format. Useful for logstash diff --git a/config/environments/development.rb b/config/environments/development.rb index b595b87cd8..cac6782afb 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -1,4 +1,6 @@ -require "active_support/core_ext/integer/time" +# frozen_string_literal: true + +require 'active_support/core_ext/integer/time' Rails.application.configure do # Settings specified here will take precedence over those in config/application.rb. @@ -19,13 +21,13 @@ # Enable/disable caching. By default caching is disabled. # Run rails dev:cache to toggle caching. - if Rails.root.join("tmp/caching-dev.txt").exist? + if Rails.root.join('tmp/caching-dev.txt').exist? config.action_controller.perform_caching = true config.action_controller.enable_fragment_cache_logging = true config.cache_store = :memory_store config.public_file_server.headers = { - "Cache-Control" => "public, max-age=#{2.days.to_i}" + 'Cache-Control' => "public, max-age=#{2.days.to_i}" } else config.action_controller.perform_caching = false @@ -63,10 +65,10 @@ config.cache_store = ActiveSupport::Cache::MemCacheStore.new('cache:11211', namespace: 'BioPortal') # Silence cache output - config.cache_store.logger = Logger.new("/dev/null") if config.cache_store.respond_to?(:logger) + config.cache_store.logger = Logger.new('/dev/null') if config.cache_store.respond_to?(:logger) # Add custom data attributes to sanitize allowed list - config.action_view.sanitized_allowed_attributes = ['id', 'class', 'style', 'data-cls', 'data-ont'] + config.action_view.sanitized_allowed_attributes = %w[id class style data-cls data-ont] config.view_component.generate.sidecar = true config.file_watcher = ActiveSupport::FileUpdateChecker @@ -82,4 +84,4 @@ # Uncomment if you wish to allow Action Cable access from any origin. # config.action_cable.disable_request_forgery_protection = true -end \ No newline at end of file +end diff --git a/config/environments/production.rb b/config/environments/production.rb index 3eea9fbc87..d963486b26 100644 --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -1,4 +1,6 @@ -require "active_support/core_ext/integer/time" +# frozen_string_literal: true + +require 'active_support/core_ext/integer/time' Rails.application.configure do # Settings specified here will take precedence over those in config/application.rb. @@ -22,7 +24,7 @@ # Disable serving static files from the `/public` folder by default since # Apache or NGINX already handles this. - config.public_file_server.enabled = ENV["RAILS_SERVE_STATIC_FILES"].present? + config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present? # Compress JavaScripts config.assets.js_compressor = :terser @@ -56,7 +58,7 @@ config.log_level = :info # Prepend all log lines with the following tags. - config.log_tags = [ :request_id ] + config.log_tags = [:request_id] # Use a different cache store in production. # config.cache_store = :mem_cache_store @@ -93,15 +95,16 @@ # Include the BioPortal-specific configuration options require Rails.root.join('config', "bioportal_config_#{Rails.env}.rb") - + # Use a different cache store in production. - config.cache_store = :mem_cache_store, ENV["MEMCACHE_SERVERS"] || "localhost:11211", { namespace: 'bioportal_web_ui', expires_in: 1.day } + config.cache_store = :mem_cache_store, ENV['MEMCACHE_SERVERS'] || 'localhost:11211', + { namespace: 'bioportal_web_ui', expires_in: 1.day } # Add custom data attributes to sanitize allowed list - config.action_view.sanitized_allowed_attributes = ['id', 'class', 'style', 'data-cls', 'data-ont'] + config.action_view.sanitized_allowed_attributes = %w[id class style data-cls data-ont] - if ENV["RAILS_LOG_TO_STDOUT"].present? - logger = ActiveSupport::Logger.new(STDOUT) + if ENV['RAILS_LOG_TO_STDOUT'].present? + logger = ActiveSupport::Logger.new($stdout) logger.formatter = config.log_formatter config.logger = ActiveSupport::TaggedLogging.new(logger) end diff --git a/config/environments/staging.rb b/config/environments/staging.rb index c24addeaf1..d0fcbec7b0 100644 --- a/config/environments/staging.rb +++ b/config/environments/staging.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + BioportalWebUi::Application.configure do # Settings specified here will take precedence over those in config/application.rb. @@ -78,15 +80,16 @@ require Rails.root.join('config', "bioportal_config_#{Rails.env}.rb") # Use a different cache store in staging. - config.cache_store = :mem_cache_store, ENV["MEMCACHE_SERVERS"] || "localhost:11211", { namespace: 'bioportal_web_ui', expires_in: 1.day } + config.cache_store = :mem_cache_store, ENV['MEMCACHE_SERVERS'] || 'localhost:11211', + { namespace: 'bioportal_web_ui', expires_in: 1.day } # Disable serving static files from the `/public` folder by default since # Apache or NGINX already handles this. config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present? # Add custom data attributes to sanitize allowed list - config.action_view.sanitized_allowed_attributes = ['id', 'class', 'style', 'data-cls', 'data-ont'] + config.action_view.sanitized_allowed_attributes = %w[id class style data-cls data-ont] # Include BioPortal-specific configuration options - require Rails.root.join('config', "bioportal_config_staging.rb") + require Rails.root.join('config', 'bioportal_config_staging.rb') end diff --git a/config/environments/test.rb b/config/environments/test.rb index 4448d0e8fb..d35b8d0f72 100644 --- a/config/environments/test.rb +++ b/config/environments/test.rb @@ -1,4 +1,6 @@ -require "active_support/core_ext/integer/time" +# frozen_string_literal: true + +require 'active_support/core_ext/integer/time' # The test environment is used exclusively to run your application's # test suite. You never need to work with it otherwise. Remember that @@ -14,18 +16,18 @@ # Eager loading loads your whole application. When running a single test locally, # this probably isn't necessary. It's a good idea to do in a continuous integration # system, or in some way before deploying your code. - config.eager_load = ENV["CI"].present? + config.eager_load = ENV['CI'].present? # Configure public file server for tests with Cache-Control for performance. config.public_file_server.enabled = true config.public_file_server.headers = { - "Cache-Control" => "public, max-age=#{1.hour.to_i}" + 'Cache-Control' => "public, max-age=#{1.hour.to_i}" } # Show full error reports and disable caching. config.consider_all_requests_local = true config.action_controller.perform_caching = false - config.cache_store = :null_store + config.cache_store = ActiveSupport::Cache::MemCacheStore.new('localhost:11211', namespace: 'BioPortal') # Raise exceptions instead of rendering exception templates. config.action_dispatch.show_exceptions = false diff --git a/config/initializers/application_controller_renderer.rb b/config/initializers/application_controller_renderer.rb index 89d2efab2b..f4556db399 100644 --- a/config/initializers/application_controller_renderer.rb +++ b/config/initializers/application_controller_renderer.rb @@ -1,3 +1,4 @@ +# frozen_string_literal: true # Be sure to restart your server when you modify this file. # ActiveSupport::Reloader.to_prepare do diff --git a/config/initializers/assets.rb b/config/initializers/assets.rb index 15e0202651..e6986f5c1e 100644 --- a/config/initializers/assets.rb +++ b/config/initializers/assets.rb @@ -1,7 +1,9 @@ +# frozen_string_literal: true + # Be sure to restart your server when you modify this file. # Version of your assets, change this if you want to expire all your assets. -Rails.application.config.assets.version = "1.0" +Rails.application.config.assets.version = '1.0' # Add additional assets to the asset load path. Rails.application.config.assets.paths << Rails.root.join('node_modules') diff --git a/config/initializers/backtrace_silencers.rb b/config/initializers/backtrace_silencers.rb index 33699c3091..d43cc1d2fe 100644 --- a/config/initializers/backtrace_silencers.rb +++ b/config/initializers/backtrace_silencers.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + # 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. @@ -5,4 +7,4 @@ # You can also remove all the silencers if you're trying to debug a problem that might stem from framework code # by setting BACKTRACE=1 before calling your invocation, like "BACKTRACE=1 ./bin/rails runner 'MyClass.perform'". -Rails.backtrace_cleaner.remove_silencers! if ENV["BACKTRACE"] +Rails.backtrace_cleaner.remove_silencers! if ENV['BACKTRACE'] diff --git a/config/initializers/cache_output.rb b/config/initializers/cache_output.rb index 3f1335b177..8a7218e3c3 100644 --- a/config/initializers/cache_output.rb +++ b/config/initializers/cache_output.rb @@ -1,2 +1,3 @@ -Rails.cache.silence! +# frozen_string_literal: true +Rails.cache.silence! diff --git a/config/initializers/content_security_policy.rb b/config/initializers/content_security_policy.rb index 54f47cf15f..691cfa11a6 100644 --- a/config/initializers/content_security_policy.rb +++ b/config/initializers/content_security_policy.rb @@ -1,3 +1,4 @@ +# frozen_string_literal: true # Be sure to restart your server when you modify this file. # Define an application-wide content security policy. diff --git a/config/initializers/cookies_serializer.rb b/config/initializers/cookies_serializer.rb index 5a6a32d371..ee8dff9c99 100644 --- a/config/initializers/cookies_serializer.rb +++ b/config/initializers/cookies_serializer.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + # Be sure to restart your server when you modify this file. # Specify a serializer for the signed and encrypted cookie jars. diff --git a/config/initializers/cube_reporter.rb b/config/initializers/cube_reporter.rb index 136f509dd5..315828989b 100644 --- a/config/initializers/cube_reporter.rb +++ b/config/initializers/cube_reporter.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'cube' ## @@ -5,9 +7,8 @@ # A cube server is required. See http://square.github.io/cube/ for more info. module Rack class CubeReporter - def initialize(app = nil, options = {}) - host = options[:cube_host] || "localhost" + host = options[:cube_host] || 'localhost' port = options[:cube_port] || 1180 @app = app @cube = ::Cube::Client.new(host, port) @@ -17,27 +18,26 @@ def call(env) start = Time.now data = @app.call(env) finish = Time.now - user = env["rack.session"] ? env["rack.session"][:user] : nil + user = env['rack.session'] ? env['rack.session'][:user] : nil apikey = user.apikey if user username = user.username if user req_data = { - duration_ms: ((finish - start)*1000).ceil, - path: env["REQUEST_PATH"], + duration_ms: ((finish - start) * 1000).ceil, + path: env['REQUEST_PATH'], status: data[0], user: { apikey: apikey, username: username, - ip: env["REMOTE_ADDR"], - user_agent: env["HTTP_USER_AGENT"] + ip: env['REMOTE_ADDR'], + user_agent: env['HTTP_USER_AGENT'] } } - @cube.send "ui_request", DateTime.now, req_data + @cube.send 'ui_request', DateTime.now, req_data data end - end end if global_variables.include?(:$ENABLE_CUBE) && $ENABLE_CUBE == true - Rails.configuration.middleware.use(::Rack::CubeReporter, {cube_host: $CUBE_HOST, cube_port: $CUBE_PORT}) -end \ No newline at end of file + Rails.configuration.middleware.use(::Rack::CubeReporter, { cube_host: $CUBE_HOST, cube_port: $CUBE_PORT }) +end diff --git a/config/initializers/filter_parameter_logging.rb b/config/initializers/filter_parameter_logging.rb index adc6568ce8..3df77c5bee 100644 --- a/config/initializers/filter_parameter_logging.rb +++ b/config/initializers/filter_parameter_logging.rb @@ -1,8 +1,10 @@ +# frozen_string_literal: true + # Be sure to restart your server when you modify this file. # Configure parameters to be filtered from the log file. Use this to limit dissemination of # sensitive information. See the ActiveSupport::ParameterFilter documentation for supported # notations and behaviors. -Rails.application.config.filter_parameters += [ - :passw, :secret, :token, :_key, :crypt, :salt, :certificate, :otp, :ssn +Rails.application.config.filter_parameters += %i[ + passw secret token _key crypt salt certificate otp ssn ] diff --git a/config/initializers/haml.rb b/config/initializers/haml.rb index bdcbd0c87d..8c4a797a01 100644 --- a/config/initializers/haml.rb +++ b/config/initializers/haml.rb @@ -1 +1,3 @@ -Haml::Template.options[:format] = :xhtml \ No newline at end of file +# frozen_string_literal: true + +Haml::Template.options[:format] = :xhtml diff --git a/config/initializers/inflections.rb b/config/initializers/inflections.rb index 3860f659ea..6c78420e71 100644 --- a/config/initializers/inflections.rb +++ b/config/initializers/inflections.rb @@ -1,3 +1,4 @@ +# frozen_string_literal: true # Be sure to restart your server when you modify this file. # Add new inflection rules using the following format. Inflections diff --git a/config/initializers/mime_types.rb b/config/initializers/mime_types.rb index dc1899682b..6e1d16f027 100644 --- a/config/initializers/mime_types.rb +++ b/config/initializers/mime_types.rb @@ -1,3 +1,4 @@ +# frozen_string_literal: true # Be sure to restart your server when you modify this file. # Add new mime types for use in respond_to blocks: diff --git a/config/initializers/miniprofiler.rb b/config/initializers/miniprofiler.rb index 05194cebbe..9d43c82ec4 100644 --- a/config/initializers/miniprofiler.rb +++ b/config/initializers/miniprofiler.rb @@ -1,2 +1,4 @@ +# frozen_string_literal: true + Rack::MiniProfiler.config.authorization_mode = :allow_authorized Rack::MiniProfiler.config.position = 'right' diff --git a/config/initializers/monkeypatches.rb b/config/initializers/monkeypatches.rb index e917a47cc2..7cd0c8195c 100644 --- a/config/initializers/monkeypatches.rb +++ b/config/initializers/monkeypatches.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + # Mixin for UTF-8 supported substring class String def utf8_slice(index, size = 1) @@ -6,7 +8,7 @@ def utf8_slice(index, size = 1) def utf8_slice!(index, size = 1) str = self[/.{#{index}}(.{#{size}})/, 1] - self[/.{#{index}}(.{#{size}})/, 1] = "" + self[/.{#{index}}(.{#{size}})/, 1] = '' str end end diff --git a/config/initializers/new_framework_defaults_6_0.rb b/config/initializers/new_framework_defaults_6_0.rb index 8c069c5f45..829ebeed93 100644 --- a/config/initializers/new_framework_defaults_6_0.rb +++ b/config/initializers/new_framework_defaults_6_0.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + # Be sure to restart your server when you modify this file. # # This file contains migration options to ease your Rails 6.0 upgrade. diff --git a/config/initializers/new_framework_defaults_6_1.rb b/config/initializers/new_framework_defaults_6_1.rb index 9526b835ab..0b4ce02317 100644 --- a/config/initializers/new_framework_defaults_6_1.rb +++ b/config/initializers/new_framework_defaults_6_1.rb @@ -1,3 +1,4 @@ +# frozen_string_literal: true # Be sure to restart your server when you modify this file. # # This file contains migration options to ease your Rails 6.1 upgrade. diff --git a/config/initializers/new_framework_defaults_7_0.rb b/config/initializers/new_framework_defaults_7_0.rb index a579326e20..9cf319f0a5 100644 --- a/config/initializers/new_framework_defaults_7_0.rb +++ b/config/initializers/new_framework_defaults_7_0.rb @@ -1,3 +1,4 @@ +# frozen_string_literal: true # Be sure to restart your server when you modify this file. # # This file eases your Rails 7.0 framework defaults upgrade. diff --git a/config/initializers/omniauth.rb b/config/initializers/omniauth.rb index af53788f9c..d1923e1675 100644 --- a/config/initializers/omniauth.rb +++ b/config/initializers/omniauth.rb @@ -1,5 +1,8 @@ +# frozen_string_literal: true + Rails.application.config.middleware.use OmniAuth::Builder do $OMNIAUTH_PROVIDERS.each do |provider, config| - provider config[:strategy] || provider, config[:client_id], config[:client_secret], client_options: {}.merge(config[:client_options].to_h) + provider config[:strategy] || provider, config[:client_id], config[:client_secret], + client_options: {}.merge(config[:client_options].to_h) end -end \ No newline at end of file +end diff --git a/config/initializers/ontologies_api_client.rb b/config/initializers/ontologies_api_client.rb index ca8f07e9eb..bcef2b067f 100644 --- a/config/initializers/ontologies_api_client.rb +++ b/config/initializers/ontologies_api_client.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + # ontologies_api_client init (default config works for the UI) require 'ontologies_api_client' LinkedData::Client.config do |config| diff --git a/config/initializers/open_uri_no_temp_files.rb b/config/initializers/open_uri_no_temp_files.rb index 461dc2bcbd..4424ffb76f 100644 --- a/config/initializers/open_uri_no_temp_files.rb +++ b/config/initializers/open_uri_no_temp_files.rb @@ -1,5 +1,6 @@ - # Don't allow downloaded files to be created as tempfiles. Force storage in memory using StringIO. - require 'open-uri' - OpenURI::Buffer.send :remove_const, 'StringMax' if OpenURI::Buffer.const_defined?('StringMax') - OpenURI::Buffer.const_set 'StringMax', 104857600 - \ No newline at end of file +# frozen_string_literal: true + +# Don't allow downloaded files to be created as tempfiles. Force storage in memory using StringIO. +require 'open-uri' +OpenURI::Buffer.send :remove_const, 'StringMax' if OpenURI::Buffer.const_defined?('StringMax') +OpenURI::Buffer.const_set 'StringMax', 104_857_600 diff --git a/config/initializers/passenger_memcache_reset.rb b/config/initializers/passenger_memcache_reset.rb index a69516ce23..ec3ad05334 100644 --- a/config/initializers/passenger_memcache_reset.rb +++ b/config/initializers/passenger_memcache_reset.rb @@ -1,12 +1,14 @@ - begin - PhusionPassenger.on_event(:starting_worker_process) do |forked| - if forked - # We're in smart spawning mode, so... - # Close duplicated memcached connections - they will open themselves - cache = Rails.cache.instance_variable_get("@data") - cache.reset if cache && cache.respond_to?(:reset) - end - end - rescue NameError - # In case you're not running under Passenger (i.e. devmode with mongrel) - end \ No newline at end of file +# frozen_string_literal: true + +begin + PhusionPassenger.on_event(:starting_worker_process) do |forked| + if forked + # We're in smart spawning mode, so... + # Close duplicated memcached connections - they will open themselves + cache = Rails.cache.instance_variable_get('@data') + cache.reset if cache.respond_to?(:reset) + end + end +rescue NameError + # In case you're not running under Passenger (i.e. devmode with mongrel) +end diff --git a/config/initializers/permissions_policy.rb b/config/initializers/permissions_policy.rb index 00f64d71b0..50bcf4eade 100644 --- a/config/initializers/permissions_policy.rb +++ b/config/initializers/permissions_policy.rb @@ -1,3 +1,4 @@ +# frozen_string_literal: true # Define an application-wide HTTP permissions policy. For further # information see https://developers.google.com/web/updates/2018/06/feature-policy # diff --git a/config/initializers/recaptcha.rb b/config/initializers/recaptcha.rb index ae2bcc95cf..f847577c1b 100644 --- a/config/initializers/recaptcha.rb +++ b/config/initializers/recaptcha.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + if ENV['USE_RECAPTCHA'].present? && ENV['USE_RECAPTCHA'] == 'true' Recaptcha.configure do |config| config.site_key = Rails.application.credentials.recaptcha[:site_key] diff --git a/config/initializers/session_store.rb b/config/initializers/session_store.rb index 1a4686867d..af5bbb34ee 100644 --- a/config/initializers/session_store.rb +++ b/config/initializers/session_store.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + # Be sure to restart your server when you modify this file. # BioportalWebUi::Application.config.session_store :cookie_store, key: '_bioportal_web_ui_session' diff --git a/config/initializers/sigtrap.rb b/config/initializers/sigtrap.rb index 70f601e846..755080a620 100644 --- a/config/initializers/sigtrap.rb +++ b/config/initializers/sigtrap.rb @@ -1,7 +1,9 @@ +# frozen_string_literal: true + # Run `kill -TTIN {pid}` to get backtraces for a running process trap 'TTIN' do Thread.list.each do |thread| puts "Thread TID-#{thread.object_id.to_s(36)}" - puts thread.backtrace.join("n") + puts thread.backtrace.join('n') end end diff --git a/config/initializers/wrap_parameters.rb b/config/initializers/wrap_parameters.rb index bbfc3961bf..2f3c0db471 100644 --- a/config/initializers/wrap_parameters.rb +++ b/config/initializers/wrap_parameters.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + # Be sure to restart your server when you modify this file. # This file contains settings for ActionController::ParamsWrapper which diff --git a/config/initializers/zeitwerk.rb b/config/initializers/zeitwerk.rb new file mode 100644 index 0000000000..edc750f48a --- /dev/null +++ b/config/initializers/zeitwerk.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +Rails.autoloaders.each do |autoloader| + autoloader.inflector = Zeitwerk::Inflector.new + autoloader.inflector.inflect( + 'kgcl' => 'KGCL' + ) +end diff --git a/config/puma.rb b/config/puma.rb index 1e19380dcb..ea3ca621c5 100644 --- a/config/puma.rb +++ b/config/puma.rb @@ -1,19 +1,21 @@ +# frozen_string_literal: true + # Puma can serve each request in a thread from an internal thread pool. # The `threads` method setting takes two numbers: a minimum and maximum. # Any libraries that use thread pools should be configured to match # the maximum value specified for Puma. Default is set to 5 threads for minimum # and maximum; this matches the default thread size of Active Record. # -threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 } +threads_count = ENV.fetch('RAILS_MAX_THREADS', 5) threads threads_count, threads_count # Specifies the `port` that Puma will listen on to receive requests; default is 3000. # -port ENV.fetch("PORT") { 3000 } +port ENV.fetch('PORT', 3000) # Specifies the `environment` that Puma will run in. # -environment ENV.fetch("RAILS_ENV") { "development" } +environment ENV.fetch('RAILS_ENV', 'development') # Specifies the number of `workers` to boot in clustered mode. # Workers are forked webserver processes. If using threads and workers together diff --git a/config/routes.rb b/config/routes.rb index 8e706eba1d..7d0e84c679 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,5 +1,6 @@ -Rails.application.routes.draw do +# frozen_string_literal: true +Rails.application.routes.draw do root to: 'home#index' get 'auth/:provider/callback', to: 'login#create_omniauth' @@ -16,16 +17,16 @@ post :save_new_term_instructions, on: :collection end - resources :projects, constraints: { id: /[^\/]+/ } + resources :projects, constraints: { id: %r{[^/]+} } - resources :users, path: :accounts, constraints: { id: /[\d\w\.\-\%\+ ]+/ } + resources :users, path: :accounts, constraints: { id: /[\d\w.\-%+ ]+/ } resources :reviews get '/users/subscribe/:username', to: 'users#subscribe' get '/users/un-subscribe/:email', to: 'users#un_subscribe' - get '/mappings/loader' , to: 'mappings#loader' + get '/mappings/loader', to: 'mappings#loader' post '/mappings/loader', to: 'mappings#loader_process' get 'mappings/count/:id', to: 'mappings#count', constraints: { id: /.+/ } get 'mappings/show_mappings', to: 'mappings#show_mappings' @@ -42,11 +43,11 @@ get 'ontologies/:ontology_id/concepts', to: 'concepts#show_concept' resources :ontologies do - resources :submissions do + resources :submissions do get 'edit_properties' - end + end - get 'instances/:instance_id', to: 'instances#show', constraints: { instance_id: /[^\/?]+/ } + get 'instances/:instance_id', to: 'instances#show', constraints: { instance_id: %r{[^/?]+} } get 'schemes/show_scheme', to: 'schemes#show' get 'collections/show' get 'metrics_evolution' @@ -57,9 +58,9 @@ resources :admin, only: [:index] namespace :admin do - resources :licenses, only: [:index, :create, :new] - resources :groups, only: [:index, :create, :new, :edit, :update, :destroy] - resources :categories, only: [:index, :create, :new, :edit, :update, :destroy] + resources :licenses, only: %i[index create new] + resources :groups, only: %i[index create new edit update destroy] + resources :categories, only: %i[index create new edit update destroy] end resources :subscriptions @@ -82,47 +83,48 @@ post '/result', to: 'ontologies_metadata_curator#result' post '/edit', to: 'ontologies_metadata_curator#edit' put '/update', to: 'ontologies_metadata_curator#update' - get '/:ontology/submissions/:submission_id/attributes/:attribute', to: 'ontologies_metadata_curator#show_metadata_value' + get '/:ontology/submissions/:submission_id/attributes/:attribute', + to: 'ontologies_metadata_curator#show_metadata_value' get '/:ontology/submissions/:submission_id', to: 'ontologies_metadata_curator#show_metadata_by_ontology' end - + get '' => 'home#index' # Top-level pages - match '/feedback', to: 'home#feedback', via: [:get, :post] + match '/feedback', to: 'home#feedback', via: %i[get post] get '/account' => 'home#account' get '/site_config' => 'home#site_config' get '/validate_ontology_file' => 'home#validate_ontology_file_show' post '/annotator_recommender_form' => 'home#annotator_recommender_form' - match '/validate_ontology_file' => 'home#validate_ontology_file', via: [:get, :post] + match '/validate_ontology_file' => 'home#validate_ontology_file', via: %i[get post] get '/layout_partial/:partial' => 'home#render_layout_partial' match '/visits', to: 'visits#index', via: :get # Error pages - match "/404", to: "errors#not_found", via: :all - match "/500", to: "errors#internal_server_error", via: :all + match '/404', to: 'errors#not_found', via: :all + match '/500', to: 'errors#internal_server_error', via: :all # Analytics - match 'analytics', to: 'analytics#track', via: [:post] - + match 'analytics', to: 'analytics#track', via: [:post] + # Robots.txt get '/robots.txt' => 'robots#index' # Ontologies - get '/ontologies/view/edit/:id' => 'ontologies#edit_view', :constraints => { id: /[^\/?]+/ } + get '/ontologies/view/edit/:id' => 'ontologies#edit_view', :constraints => { id: %r{[^/?]+} } get '/ontologies/view/new/:id' => 'ontologies#new_view' - + get '/ontologies/virtual/:ontology' => 'ontologies#virtual', :as => :ontology_virtual get '/ontologies/success/:id' => 'ontologies#submit_success' - match '/ontologies/:acronym' => 'ontologies#update', via: [:get, :post] - match '/ontologies/:acronym/submissions/:id' => 'submissions#update', via: [:get, :post] + match '/ontologies/:acronym' => 'ontologies#update', via: %i[get post] + match '/ontologies/:acronym/submissions/:id' => 'submissions#update', via: %i[get post] get '/ontologies/:ontology_id/submissions/new' => 'submissions#new', :ontology_id => /.+/ match '/ontologies/:ontology_id/submissions' => 'submissions#create', :ontology_id => /.+/, via: [:post] match '/ontologies/:ontology_id/submissions' => 'submissions#index', :ontology_id => /.+/, via: [:get] - get '/ontologies/:acronym/classes/:purl_conceptid', to: 'ontologies#show', constraints: { purl_conceptid: /[^\/]+/ } - get '/ontologies/:acronym/: f', to: 'ontologies#show', constraints: { purl_conceptid: /[^\/]+/ } - match '/ontologies/:acronym/submissions/:id/edit_metadata' => 'submissions#edit_metadata', via: [:get, :post] - get '/ontologies_filter', to: 'ontologies#ontologies_filter' + get '/ontologies/:acronym/classes/:purl_conceptid', to: 'ontologies#show', constraints: { purl_conceptid: %r{[^/]+} } + get '/ontologies/:acronym/: f', to: 'ontologies#show', constraints: { purl_conceptid: %r{[^/]+} } + match '/ontologies/:acronym/submissions/:id/edit_metadata' => 'submissions#edit_metadata', via: %i[get post] + get '/ontologies_filter', to: 'ontologies#ontologies_filter' # Analytics get '/analytics/:action' => 'analytics#(?-mix:search_result_clicked|user_intention_surveys)' @@ -133,7 +135,7 @@ # Ajax get '/ajax/' => 'ajax_proxy#get', :as => :ajax - get '/ajax_concepts/:ontology/' => 'concepts#show', :constraints => { id: /[^\/?]+/ } + get '/ajax_concepts/:ontology/' => 'concepts#show', :constraints => { id: %r{[^/?]+} } get '/ajax/class_details' => 'concepts#details' get '/ajax/mappings/get_concept_table' => 'mappings#get_concept_table' get '/ajax/json_ontology' => 'ajax_proxy#json_ontology' @@ -148,19 +150,20 @@ get '/ajax/classes/list' => 'collections#show_members' get '/ajax/classes/date_sorted_list' => 'concepts#show_date_sorted_list' get '/ajax/properties/tree' => 'concepts#property_tree' - get 'ajax/schemes/label', to: "schemes#show_label" - get 'ajax/collections/label', to: "collections#show_label" - get 'ajax/label_xl/label', to: "label_xl#show_label" - get 'ajax/label_xl', to: "label_xl#show" + get 'ajax/schemes/label', to: 'schemes#show_label' + get 'ajax/collections/label', to: 'collections#show_label' + get 'ajax/label_xl/label', to: 'label_xl#show_label' + get 'ajax/label_xl', to: 'label_xl#show' get '/ajax/biomixer' => 'concepts#biomixer' get '/ajax/fair_score/html' => 'fair_score#details_html' get '/ajax/submission/show_additional_metadata/:id' => 'ontologies#show_additional_metadata' get '/ajax/submission/show_licenses/:id' => 'ontologies#show_licenses' get '/ajax/fair_score/json' => 'fair_score#details_json' get '/ajax/:ontology/instances' => 'instances#index_by_ontology' - get '/ajax/:ontology/classes/:conceptid/instances' => 'instances#index_by_class', :constraints => { conceptid: /[^\/?]+/ } - get '/ajax/ontologies' , to:"ontologies#ajax_ontologies" - get '/ajax/agents' , to:"agents#ajax_agents" + get '/ajax/:ontology/classes/:conceptid/instances' => 'instances#index_by_class', + :constraints => { conceptid: %r{[^/?]+} } + get '/ajax/ontologies', to: 'ontologies#ajax_ontologies' + get '/ajax/agents', to: 'agents#ajax_agents' get '/ajax/images/show' => 'application#show_image_modal' # User get '/logout' => 'login#destroy', :as => :logout @@ -168,7 +171,7 @@ get '/lost_pass_success' => 'login#lost_password_success' get '/reset_password' => 'login#reset_password' post '/accounts/:id/custom_ontologies' => 'users#custom_ontologies', :as => :custom_ontologies - get '/login_as/:login_as' => 'login#login_as' , constraints: { login_as: /[\d\w\.\-\%\+ ]+/ } + get '/login_as/:login_as' => 'login#login_as', constraints: { login_as: /[\d\w.\-%+ ]+/ } post '/login/send_pass', to: 'login#send_pass' # History @@ -216,12 +219,13 @@ get '/ajax/json_term' => 'redirect#index', :url => '/ajax/json_class' # Visualize - get '/visualize/:ontology' => 'ontologies#visualize', :as => :visualize, :constraints => { ontology: /[^\/?]+/ } - get '/visualize/:ontology/:conceptid' => 'ontologies#visualize', :as => :uri, :constraints => { ontology: /[^\/?]+/, conceptid: /[^\/?]+/ } - get '/visualize' => 'ontologies#visualize', :as => :visualize_concept, :constraints => { ontology: /[^\/?]+/, id: /[^\/?]+/, ontologyid: /[^\/?]+/, conceptid: /[^\/?]+/ } + get '/visualize/:ontology' => 'ontologies#visualize', :as => :visualize, :constraints => { ontology: %r{[^/?]+} } + get '/visualize/:ontology/:conceptid' => 'ontologies#visualize', :as => :uri, + :constraints => { ontology: %r{[^/?]+}, conceptid: %r{[^/?]+} } + get '/visualize' => 'ontologies#visualize', :as => :visualize_concept, + :constraints => { ontology: %r{[^/?]+}, id: %r{[^/?]+}, ontologyid: %r{[^/?]+}, conceptid: %r{[^/?]+} } get '/exhibit/:ontology/:id' => 'concepts#exhibit' - mount Lookbook::Engine, at: "/lookbook" - + mount Lookbook::Engine, at: '/lookbook' end diff --git a/config/spring.rb b/config/spring.rb index c9119b40c0..c5933e491b 100644 --- a/config/spring.rb +++ b/config/spring.rb @@ -1,6 +1,8 @@ -%w( +# frozen_string_literal: true + +%w[ .ruby-version .rbenv-vars tmp/restart.txt tmp/caching-dev.txt -).each { |path| Spring.watch(path) } +].each { |path| Spring.watch(path) } diff --git a/db/migrate/20120114000857_create_virtual_appliance_users.rb b/db/migrate/20120114000857_create_virtual_appliance_users.rb index 06f8e1aaf0..d929ec2fb3 100644 --- a/db/migrate/20120114000857_create_virtual_appliance_users.rb +++ b/db/migrate/20120114000857_create_virtual_appliance_users.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + class CreateVirtualApplianceUsers < ActiveRecord::Migration[4.2] def self.up create_table :virtual_appliance_users do |t| diff --git a/db/migrate/20120223203256_create_timeouts_table.rb b/db/migrate/20120223203256_create_timeouts_table.rb index 22dfbb3e66..894027c6e7 100644 --- a/db/migrate/20120223203256_create_timeouts_table.rb +++ b/db/migrate/20120223203256_create_timeouts_table.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + class CreateTimeoutsTable < ActiveRecord::Migration[4.2] def self.up create_table :timeouts do |t| diff --git a/db/migrate/20120719010735_create_analytics.rb b/db/migrate/20120719010735_create_analytics.rb index 0a026e6c67..0d9842c3aa 100644 --- a/db/migrate/20120719010735_create_analytics.rb +++ b/db/migrate/20120719010735_create_analytics.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + class CreateAnalytics < ActiveRecord::Migration[4.2] def self.up create_table :analytics do |t| diff --git a/db/migrate/20130930214323_change_virtual_appliance_user_id_type.rb b/db/migrate/20130930214323_change_virtual_appliance_user_id_type.rb index cce4c2955c..43b5c5813c 100644 --- a/db/migrate/20130930214323_change_virtual_appliance_user_id_type.rb +++ b/db/migrate/20130930214323_change_virtual_appliance_user_id_type.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + class ChangeVirtualApplianceUserIdType < ActiveRecord::Migration[4.2] def self.up change_column :virtual_appliance_users, :user_id, :string diff --git a/db/migrate/20140306012927_drop_old_tables.rb b/db/migrate/20140306012927_drop_old_tables.rb index 692613e4f0..a2c5188936 100644 --- a/db/migrate/20140306012927_drop_old_tables.rb +++ b/db/migrate/20140306012927_drop_old_tables.rb @@ -1,25 +1,29 @@ +# frozen_string_literal: true + class DropOldTables < ActiveRecord::Migration[4.2] def self.up - old_tables = [ - :custom_ontologies, - :event_items, - :groups, - :mapping_import_errors, - :mappings, - :margin_notes, - :notes, - :notes_indices, - :projects, - :rating_types, - :ratings, - :reviews, - :surveys, - :users, - :uses, - :widget_logs + old_tables = %i[ + custom_ontologies + event_items + groups + mapping_import_errors + mappings + margin_notes + notes + notes_indices + projects + rating_types + ratings + reviews + surveys + users + uses + widget_logs ] old_tables.each do |table| - drop_table table rescue next + drop_table table + rescue StandardError + next end end diff --git a/db/migrate/20150806211835_change_slice_column_name.rb b/db/migrate/20150806211835_change_slice_column_name.rb index 65447a6aa6..202755118d 100644 --- a/db/migrate/20150806211835_change_slice_column_name.rb +++ b/db/migrate/20150806211835_change_slice_column_name.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + class ChangeSliceColumnName < ActiveRecord::Migration[4.2] def change rename_column :analytics, :slice, :bp_slice diff --git a/db/migrate/20200220191815_create_licenses.rb b/db/migrate/20200220191815_create_licenses.rb index 82d29bdf0f..fec50092fd 100644 --- a/db/migrate/20200220191815_create_licenses.rb +++ b/db/migrate/20200220191815_create_licenses.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + class CreateLicenses < ActiveRecord::Migration[5.1] def change create_table :licenses do |t| diff --git a/db/migrate/20200921120918_create_ontologies.rb b/db/migrate/20200921120918_create_ontologies.rb index d372192308..80409405a6 100644 --- a/db/migrate/20200921120918_create_ontologies.rb +++ b/db/migrate/20200921120918_create_ontologies.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + class CreateOntologies < ActiveRecord::Migration[5.1] def change create_table :ontologies do |t| diff --git a/db/schema.rb b/db/schema.rb index 22dc2b318a..d315a8b976 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + # 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. @@ -10,45 +12,45 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.0].define(version: 2020_09_21_120918) do - create_table "analytics", id: :integer, charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t| - t.string "segment" - t.string "action" - t.string "bp_slice" - t.string "ip" - t.integer "user" - t.text "params" - t.datetime "created_at", precision: nil - t.datetime "updated_at", precision: nil +ActiveRecord::Schema[7.0].define(version: 20_200_921_120_918) do + create_table 'analytics', id: :integer, charset: 'utf8mb4', collation: 'utf8mb4_0900_ai_ci', force: :cascade do |t| + t.string 'segment' + t.string 'action' + t.string 'bp_slice' + t.string 'ip' + t.integer 'user' + t.text 'params' + t.datetime 'created_at', precision: nil + t.datetime 'updated_at', precision: nil end - create_table "licenses", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t| - t.text "encrypted_key" - t.datetime "created_at", precision: nil, null: false - t.datetime "updated_at", precision: nil, null: false + create_table 'licenses', charset: 'utf8mb4', collation: 'utf8mb4_0900_ai_ci', force: :cascade do |t| + t.text 'encrypted_key' + t.datetime 'created_at', precision: nil, null: false + t.datetime 'updated_at', precision: nil, null: false end - create_table "ontologies", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t| - t.string "acronym", null: false - t.text "new_term_instructions" - t.text "custom_message" - t.datetime "created_at", precision: nil, null: false - t.datetime "updated_at", precision: nil, null: false - t.index ["acronym"], name: "index_ontologies_on_acronym", unique: true + create_table 'ontologies', charset: 'utf8mb4', collation: 'utf8mb4_0900_ai_ci', force: :cascade do |t| + t.string 'acronym', null: false + t.text 'new_term_instructions' + t.text 'custom_message' + t.datetime 'created_at', precision: nil, null: false + t.datetime 'updated_at', precision: nil, null: false + t.index ['acronym'], name: 'index_ontologies_on_acronym', unique: true end - create_table "timeouts", id: :integer, charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t| - t.string "path" - t.integer "ontology_id" - t.text "concept_id" - t.text "params" - t.timestamp "created" + create_table 'timeouts', id: :integer, charset: 'utf8mb4', collation: 'utf8mb4_0900_ai_ci', force: :cascade do |t| + t.string 'path' + t.integer 'ontology_id' + t.text 'concept_id' + t.text 'params' + t.timestamp 'created' end - create_table "virtual_appliance_users", id: :integer, charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t| - t.string "user_id" - t.datetime "created_at", precision: nil - t.datetime "updated_at", precision: nil + create_table 'virtual_appliance_users', id: :integer, charset: 'utf8mb4', collation: 'utf8mb4_0900_ai_ci', + force: :cascade do |t| + t.string 'user_id' + t.datetime 'created_at', precision: nil + t.datetime 'updated_at', precision: nil end - end diff --git a/db/seeds.rb b/db/seeds.rb index 4edb1e857e..c8774b7376 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -1,3 +1,4 @@ +# frozen_string_literal: true # 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). # diff --git a/docker-compose.yml b/docker-compose.yml index 38be0278fb..f8f8ecd249 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -18,7 +18,7 @@ x-app: &default-app tty: true volumes: - "${DOCKER_WEB_VOLUME}" - - bundle:/usr/local/bundle + - bundle:/usr/local/bundle - node:/node_modules services: @@ -26,7 +26,7 @@ services: environment: MYSQL_ROOT_PASSWORD: 'bp_user' image: "mysql:latest" - profiles: ["db"] + profiles: [ "cache-db", "db", "web", "test" ] ports: - "3306:3306" volumes: @@ -38,14 +38,28 @@ services: cpus: "${DOCKER_REDIS_CPUS:-0}" memory: "${DOCKER_REDIS_MEMORY:-0}" image: "memcached:1.6.17-bullseye" - profiles: ["cache"] + profiles: [ "cache-db", "cache", "web", "test" ] - web: + yarn: <<: *default-app ports: - "${DOCKER_WEB_PORT_FORWARD:-127.0.0.1:3000}:${PORT:-3000}" - profiles: ["web"] + profiles: [ "web" ] command: "yarn build --watch" + + web: + <<: *default-app + environment: + API_URL: ${API_URL} + API_KEY: ${API_KEY} + BIOMIXER_URL: ${BIOMIXER_URL} + FAIRNESS_URL: ${FAIRNESS_URL} + ANNOTATOR_URL: ${ANNOTATOR_URL} + BUNDLE_PATH: /usr/local/bundle + ports: + - "${DOCKER_WEB_PORT_FORWARD:-127.0.0.1:3000}:${PORT:-3000}" + profiles: [ "test" ] + command: RAILS_ENV=test bin/rails s volumes: db-v: bundle: diff --git a/lib/log.rb b/lib/log.rb index 00c815d600..34d4f6bc8e 100644 --- a/lib/log.rb +++ b/lib/log.rb @@ -1,7 +1,8 @@ +# frozen_string_literal: true + require 'rest_client' class LOG - # Log using local or remote methods # Local: provide the log level as a symbol (:debug, :info, :error, etc) # Remote: provide the request and a parameter hash @@ -13,25 +14,29 @@ class LOG # :concept_name def self.add(level, message, request = nil, remote_params = nil) if request - if !$REMOTE_LOGGING.nil? && $REMOTE_LOGGING - remote(level, message, request, remote_params) - end + remote(level, message, request, remote_params) if !$REMOTE_LOGGING.nil? && $REMOTE_LOGGING else local(level, message) end end - private - - def self.remote(level, event, request, params) + def self.remote(_level, event, request, params) params = {} if params.nil? params = convert_params(params) unless params.empty? - log = RestClient::Resource.new $LEGACY_REST_URL + "/log", :timeout => 30 + log = RestClient::Resource.new "#{$LEGACY_REST_URL}/log", timeout: 30 session = request.session - params[:user] = session[:user].username rescue "" - params[:userid] = session[:user].id rescue "" + params[:user] = begin + session[:user].username + rescue StandardError + '' + end + params[:userid] = begin + session[:user].id + rescue StandardError + '' + end params[:ipaddress] = request.remote_ip params[:sessionid] = request.session_options[:id] params[:eventtype] = event @@ -41,7 +46,7 @@ def self.remote(level, event, request, params) begin ms = Benchmark.ms { log.post(params) } LOG.add :debug, "Logging action remotely (#{ms}ms)" - rescue Exception=>e + rescue Exception => e LOG.add :debug, "Remote logging failed: #{e.message}" end end @@ -65,5 +70,4 @@ def self.local(level, message) p "#{level} || #{message}" end end - end diff --git a/lib/resolver/acronym_from_virtual.rb b/lib/resolver/acronym_from_virtual.rb index 5e753e84e3..21ecaae633 100644 --- a/lib/resolver/acronym_from_virtual.rb +++ b/lib/resolver/acronym_from_virtual.rb @@ -1,535 +1,537 @@ +# frozen_string_literal: true + BpidResolver::ACRONYM_FROM_VIRTUAL = { - "old:acronym_from_virtual:3013" => "DIAGONT", - "old:acronym_from_virtual:3245" => "SuicidO", - "old:acronym_from_virtual:1247" => "GEOSPECIES", - "old:acronym_from_virtual:1054" => "AMINO-ACID", - "old:acronym_from_virtual:2012" => "goslim_pir", - "old:acronym_from_virtual:3015" => "PMR", - "old:acronym_from_virtual:3212" => "GLYCOPROT", - "old:acronym_from_virtual:3271" => "BSAO", - "old:acronym_from_virtual:2099" => "GWAS_EFO_SKOS", - "old:acronym_from_virtual:1062" => "PR", - "old:acronym_from_virtual:3004" => "NATPRO", - "old:acronym_from_virtual:1584" => "MMO", - "old:acronym_from_virtual:1046" => "SBO", - "old:acronym_from_virtual:1545" => "CO-WHEAT", - "old:acronym_from_virtual:1016" => "FB-DV", - "old:acronym_from_virtual:1059" => "CPRO", - "old:acronym_from_virtual:3238" => "PDO", - "old:acronym_from_virtual:1576" => "FDA-MEDDEVICE", - "old:acronym_from_virtual:1114" => "BILA", - "old:acronym_from_virtual:1055" => "GALEN", - "old:acronym_from_virtual:1158" => "CBO", - "old:acronym_from_virtual:3151" => "GEXO", - "old:acronym_from_virtual:2109" => "ooevv-vaccine", - "old:acronym_from_virtual:1488" => "JERM", - "old:acronym_from_virtual:3234" => "BOF", - "old:acronym_from_virtual:3047" => "DEMOGRAPH", - "old:acronym_from_virtual:1613" => "BDO", - "old:acronym_from_virtual:1142" => "EP", - "old:acronym_from_virtual:3127" => "IMMDIS", - "old:acronym_from_virtual:1461" => "TMO", - "old:acronym_from_virtual:3146" => "CMS", - "old:acronym_from_virtual:1125" => "HP", - "old:acronym_from_virtual:2033" => "iceci-instrument_object_substance", - "old:acronym_from_virtual:1033" => "NMR", - "old:acronym_from_virtual:1666" => "MFOEM", - "old:acronym_from_virtual:1615" => "CHEMBIO", - "old:acronym_from_virtual:3184" => "ZIP3", - "old:acronym_from_virtual:3150" => "BRIDG", - "old:acronym_from_virtual:2054" => "NCBI_NMOsp_1_0_0", - "old:acronym_from_virtual:1370" => "ATO", - "old:acronym_from_virtual:3268" => "ERNO", - "old:acronym_from_virtual:3261" => "STNFRDRXDEMO", - "old:acronym_from_virtual:2032" => "iceci-details_for_place_of_occurrence", - "old:acronym_from_virtual:1402" => "NIFCELL", - "old:acronym_from_virtual:1427" => "RCD", - "old:acronym_from_virtual:1565" => "OMRSE", - "old:acronym_from_virtual:1517" => "EHDAA2", - "old:acronym_from_virtual:1347" => "MEDLINEPLUS", - "old:acronym_from_virtual:3243" => "NHSQI2009", - "old:acronym_from_virtual:1640" => "PEDTERM", - "old:acronym_from_virtual:1354" => "WHO-ART", - "old:acronym_from_virtual:1095" => "XAO", - "old:acronym_from_virtual:1661" => "UCSFXPLANT", - "old:acronym_from_virtual:3174" => "IDODEN", - "old:acronym_from_virtual:1146" => "ECG", - "old:acronym_from_virtual:1065" => "TADS", - "old:acronym_from_virtual:3028" => "SOY", - "old:acronym_from_virtual:1100" => "OGI", - "old:acronym_from_virtual:2086" => "SMD_NPLSM_BRST", - "old:acronym_from_virtual:1136" => "EFO", - "old:acronym_from_virtual:1050" => "ZEA", - "old:acronym_from_virtual:3124" => "VSO", - "old:acronym_from_virtual:2085" => "SMD_NPLSM", - "old:acronym_from_virtual:1047" => "GRO-CPD", - "old:acronym_from_virtual:1540" => "DDI", - "old:acronym_from_virtual:2007" => "goslim_generic_1_770", - "old:acronym_from_virtual:3155" => "ONTOKBCF", - "old:acronym_from_virtual:2045" => "ICF-d5", - "old:acronym_from_virtual:1350" => "LOINC", - "old:acronym_from_virtual:1099" => "ATMO", - "old:acronym_from_virtual:3231" => "GLYCANONT", - "old:acronym_from_virtual:3131" => "PROVO", - "old:acronym_from_virtual:1123" => "OBI", - "old:acronym_from_virtual:2035" => "iceci-mechanism", - "old:acronym_from_virtual:1420" => "MSHSPA_1", - "old:acronym_from_virtual:1304" => "BCGO", - "old:acronym_from_virtual:1042" => "OBOREL", - "old:acronym_from_virtual:1049" => "WB-LS", - "old:acronym_from_virtual:1328" => "HOM", - "old:acronym_from_virtual:1575" => "EXO", - "old:acronym_from_virtual:3077" => "ONTODM-KDD", - "old:acronym_from_virtual:2108" => "ooevv-tractTrace", - "old:acronym_from_virtual:3191" => "MPO", - "old:acronym_from_virtual:1349" => "PDQ", - "old:acronym_from_virtual:3239" => "CSSO", - "old:acronym_from_virtual:2038" => "iceci-details_for_activity", - "old:acronym_from_virtual:1522" => "BP", - "old:acronym_from_virtual:1587" => "PO", - "old:acronym_from_virtual:1116" => "BHO", - "old:acronym_from_virtual:3038" => "HOM-TEST", - "old:acronym_from_virtual:1001" => "GRO-CPGA", - "old:acronym_from_virtual:2025" => "NIF-RTH", - "old:acronym_from_virtual:1537" => "IDOBRU", - "old:acronym_from_virtual:1009" => "DOID", - "old:acronym_from_virtual:3178" => "CANONT", - "old:acronym_from_virtual:2036" => "iceci-place_of_occurrence", - "old:acronym_from_virtual:1112" => "UO", - "old:acronym_from_virtual:3153" => "NTDO", - "old:acronym_from_virtual:1010" => "EMAP", - "old:acronym_from_virtual:1541" => "MCCL", - "old:acronym_from_virtual:1067" => "WB-PHENOTYPE", - "old:acronym_from_virtual:1560" => "COGPO", - "old:acronym_from_virtual:1697" => "UCSFORTHO", - "old:acronym_from_virtual:1260" => "RID", - "old:acronym_from_virtual:1091" => "SPD", - "old:acronym_from_virtual:2103" => "ICPCFRE", - "old:acronym_from_virtual:1069" => "ENVO", - "old:acronym_from_virtual:1686" => "NEOMARK4", - "old:acronym_from_virtual:1527" => "VANDF", - "old:acronym_from_virtual:1057" => "RADLEX", - "old:acronym_from_virtual:3258" => "OBR-Scolio", - "old:acronym_from_virtual:1500" => "RNAO", - "old:acronym_from_virtual:3042" => "TEO", - "old:acronym_from_virtual:2114" => "citation", - "old:acronym_from_virtual:2003" => "BiositemapIM", - "old:acronym_from_virtual:2029" => "iceci-countermeasures", - "old:acronym_from_virtual:3264" => "WH", - "old:acronym_from_virtual:1144" => "DC-CL", - "old:acronym_from_virtual:1418" => "TOK", - "old:acronym_from_virtual:1497" => "PMA", - "old:acronym_from_virtual:2093" => "OBI_IEDB_view", - "old:acronym_from_virtual:3252" => "SSE", - "old:acronym_from_virtual:1183" => "LIPRO", - "old:acronym_from_virtual:1423" => "RXNORM", - "old:acronym_from_virtual:1026" => "MAO", - "old:acronym_from_virtual:1555" => "VSAO", - "old:acronym_from_virtual:3031" => "QUDT", - "old:acronym_from_virtual:3223" => "GCO", - "old:acronym_from_virtual:1172" => "VO", - "old:acronym_from_virtual:1068" => "SAO", - "old:acronym_from_virtual:1410" => "KISAO", - "old:acronym_from_virtual:1520" => "LSM", - "old:acronym_from_virtual:2050" => "ICF-d810-d839", - "old:acronym_from_virtual:3021" => "ATC", - "old:acronym_from_virtual:1063" => "CARO", - "old:acronym_from_virtual:1530" => "ADW", - "old:acronym_from_virtual:2120" => "provenance", - "old:acronym_from_virtual:3017" => "GCC", - "old:acronym_from_virtual:2056" => "NCBI_NMOsp_1_2_2", - "old:acronym_from_virtual:3206" => "HCPCS-HIMC", - "old:acronym_from_virtual:1104" => "BRO", - "old:acronym_from_virtual:1092" => "IDO", - "old:acronym_from_virtual:1413" => "SWO", - "old:acronym_from_virtual:3032" => "EPICMEDS", - "old:acronym_from_virtual:1456" => "MSHFRE", - "old:acronym_from_virtual:1077" => "MIRO", - "old:acronym_from_virtual:1051" => "ZFA", - "old:acronym_from_virtual:2055" => "NCBI_NMOsp_1_2_1", - "old:acronym_from_virtual:3090" => "ONTOMA", - "old:acronym_from_virtual:3104" => "USSOC", - "old:acronym_from_virtual:1573" => "TM-MER", - "old:acronym_from_virtual:3092" => "CLINIC", - "old:acronym_from_virtual:1616" => "PHYLONT", - "old:acronym_from_virtual:2023" => "NCBITaxonOWL", - "old:acronym_from_virtual:1656" => "PHENOMEBLAST", - "old:acronym_from_virtual:3219" => "MSTDE", - "old:acronym_from_virtual:1025" => "MP", - "old:acronym_from_virtual:1670" => "ICDO3", - "old:acronym_from_virtual:1089" => "BIRNLEX", - "old:acronym_from_virtual:3215" => "MIXS", - "old:acronym_from_virtual:1532" => "SIO", - "old:acronym_from_virtual:2105" => "SNMD_BDY", - "old:acronym_from_virtual:3022" => "BIOMODELS", - "old:acronym_from_virtual:2053" => "ICF-d840-d859%2Fd860-d879", - "old:acronym_from_virtual:3262" => "BCTEO", - "old:acronym_from_virtual:1168" => "Amino_Acid-zh_CN", - "old:acronym_from_virtual:1550" => "PHARE", - "old:acronym_from_virtual:1398" => "LDA", - "old:acronym_from_virtual:1428" => "NIC", - "old:acronym_from_virtual:1567" => "PVONTO", - "old:acronym_from_virtual:3211" => "TEST-PROD", - "old:acronym_from_virtual:2124" => "ICD9CM-PROC", - "old:acronym_from_virtual:3255" => "CHMO", - "old:acronym_from_virtual:3204" => "PORO", - "old:acronym_from_virtual:1043" => "REX", - "old:acronym_from_virtual:1689" => "FYPO", - "old:acronym_from_virtual:3008" => "CARELEX", - "old:acronym_from_virtual:1570" => "TM-CONST", - "old:acronym_from_virtual:2070" => "obi-fged", - "old:acronym_from_virtual:2002" => "BRO-AreaOfResearch", - "old:acronym_from_virtual:2020" => "SNOMEDCT-ANAT", - "old:acronym_from_virtual:2092" => "envo_153", - "old:acronym_from_virtual:3045" => "ICD9CM-KM", - "old:acronym_from_virtual:3108" => "CCONT", - "old:acronym_from_virtual:1438" => "MCBCC", - "old:acronym_from_virtual:1348" => "OMIM", - "old:acronym_from_virtual:1515" => "INO", - "old:acronym_from_virtual:3176" => "XEO", - "old:acronym_from_virtual:2009" => "goslim_plant", - "old:acronym_from_virtual:2078" => "H1_NMOABA", - "old:acronym_from_virtual:3183" => "IFAR", - "old:acronym_from_virtual:2046" => "ICF-d6", - "old:acronym_from_virtual:3186" => "I2B2-LOINC", - "old:acronym_from_virtual:3265" => "BNO", - "old:acronym_from_virtual:2110" => "DTVPrecision", - "old:acronym_from_virtual:1581" => "HLTHINDCTRS", - "old:acronym_from_virtual:3220" => "MSTDE-FRE", - "old:acronym_from_virtual:3009" => "MEO", - "old:acronym_from_virtual:1694" => "CPT-KM", - "old:acronym_from_virtual:1052" => "PRO-ONT", - "old:acronym_from_virtual:1290" => "ABA-AMB", - "old:acronym_from_virtual:3000" => "MIXSCV", - "old:acronym_from_virtual:1038" => "PSDS", - "old:acronym_from_virtual:1023" => "FBbi", - "old:acronym_from_virtual:1060" => "CTONT", - "old:acronym_from_virtual:1249" => "SBRO", - "old:acronym_from_virtual:1152" => "MAT", - "old:acronym_from_virtual:2101" => "test1", - "old:acronym_from_virtual:1083" => "NPO", - "old:acronym_from_virtual:1013" => "EVOC", - "old:acronym_from_virtual:1407" => "TEDDY", - "old:acronym_from_virtual:2113" => "bibliographic", - "old:acronym_from_virtual:2030" => "iceci-descriptor_for_intent", - "old:acronym_from_virtual:2084" => "OGMD_OWL", - "old:acronym_from_virtual:1053" => "FMA", - "old:acronym_from_virtual:1422" => "MEDDRA", - "old:acronym_from_virtual:2010" => "goslim_candida", - "old:acronym_from_virtual:3273" => "HRDO", - "old:acronym_from_virtual:3152" => "REXO", - "old:acronym_from_virtual:3222" => "RSA", - "old:acronym_from_virtual:3207" => "ATOL", - "old:acronym_from_virtual:1498" => "EDAM", - "old:acronym_from_virtual:1109" => "SO", - "old:acronym_from_virtual:1224" => "SYMP", - "old:acronym_from_virtual:3253" => "OntoVIP", - "old:acronym_from_virtual:1237" => "SITBAC", - "old:acronym_from_virtual:2042" => "ICF-d2", - "old:acronym_from_virtual:3263" => "OntoBioUSP", - "old:acronym_from_virtual:1649" => "OSHPD", - "old:acronym_from_virtual:3247" => "EDDA", - "old:acronym_from_virtual:1671" => "QIBO", - "old:acronym_from_virtual:1585" => "XCO", - "old:acronym_from_virtual:1006" => "CL", - "old:acronym_from_virtual:1424" => "NDDF", - "old:acronym_from_virtual:3114" => "RPO", - "old:acronym_from_virtual:1426" => "MDDB", - "old:acronym_from_virtual:3169" => "GLYCO", - "old:acronym_from_virtual:2065" => "obi-device", - "old:acronym_from_virtual:1192" => "CPTAC", - "old:acronym_from_virtual:1032" => "NCIT", - "old:acronym_from_virtual:2067" => "RCJI", - "old:acronym_from_virtual:1017" => "FB-CV", - "old:acronym_from_virtual:2014" => "goslim_yeast", - "old:acronym_from_virtual:3251" => "ADO", - "old:acronym_from_virtual:1081" => "TTO", - "old:acronym_from_virtual:3162" => "RETO", - "old:acronym_from_virtual:1362" => "HAO", - "old:acronym_from_virtual:3240" => "RNPRIO", - "old:acronym_from_virtual:3272" => "CARD", - "old:acronym_from_virtual:3217" => "CABRO", - "old:acronym_from_virtual:2069" => "H1_NMOABA_1_0", - "old:acronym_from_virtual:3208" => "IDQA", - "old:acronym_from_virtual:3228" => "ELIG", - "old:acronym_from_virtual:1651" => "SDO", - "old:acronym_from_virtual:3126" => "NIFSUBCELL", - "old:acronym_from_virtual:3157" => "GENETRIAL", - "old:acronym_from_virtual:1070" => "GO", - "old:acronym_from_virtual:2088" => "SNMD_BC", - "old:acronym_from_virtual:1414" => "OGMS", - "old:acronym_from_virtual:1516" => "ICD10", - "old:acronym_from_virtual:1429" => "ICPC2P", - "old:acronym_from_virtual:3241" => "UDEF", - "old:acronym_from_virtual:2034" => "iceci-intent", - "old:acronym_from_virtual:2074" => "H1_NMOABA_2_0", - "old:acronym_from_virtual:1024" => "LHN", - "old:acronym_from_virtual:3003" => "CNO", - "old:acronym_from_virtual:2083" => "H1_NMOABA_4_1", - "old:acronym_from_virtual:1039" => "PROPREO", - "old:acronym_from_virtual:1638" => "ONTODM-CORE", - "old:acronym_from_virtual:2008" => "goslim_goa", - "old:acronym_from_virtual:3250" => "ONL-MR-DA", - "old:acronym_from_virtual:3136" => "NHDS", - "old:acronym_from_virtual:1393" => "IAO", - "old:acronym_from_virtual:1332" => "BFO", - "old:acronym_from_virtual:3203" => "HINO", - "old:acronym_from_virtual:2122" => "SciRes", - "old:acronym_from_virtual:2013" => "goslim_pombe", - "old:acronym_from_virtual:1627" => "HOMERUN", - "old:acronym_from_virtual:2117" => "event", - "old:acronym_from_virtual:1190" => "OPL", - "old:acronym_from_virtual:3002" => "MF", - "old:acronym_from_virtual:1417" => "FLU", - "old:acronym_from_virtual:1314" => "CLO", - "old:acronym_from_virtual:1101" => "ICD9CM", - "old:acronym_from_virtual:3029" => "SPTO", - "old:acronym_from_virtual:1381" => "NIFDYS", - "old:acronym_from_virtual:1440" => "GFO-BIO", - "old:acronym_from_virtual:1344" => "ICPC", - "old:acronym_from_virtual:1351" => "MESH", - "old:acronym_from_virtual:1094" => "PTRANS", - "old:acronym_from_virtual:1115" => "YPO", - "old:acronym_from_virtual:2126" => "CPT-mod", - "old:acronym_from_virtual:1621" => "NBO", - "old:acronym_from_virtual:3007" => "UCSFICU", - "old:acronym_from_virtual:2041" => "ICF-d1", - "old:acronym_from_virtual:2080" => "H1_NMOABA_4_0", - "old:acronym_from_virtual:1501" => "NEOMARK3", - "old:acronym_from_virtual:3158" => "SWEET", - "old:acronym_from_virtual:1335" => "PEO", - "old:acronym_from_virtual:1571" => "TM-OTHER-FACTORS", - "old:acronym_from_virtual:1061" => "SOPHARM", - "old:acronym_from_virtual:1411" => "ICF", - "old:acronym_from_virtual:1394" => "SSO", - "old:acronym_from_virtual:2018" => "SNOMEDCT-CF", - "old:acronym_from_virtual:1676" => "RCTONT", - "old:acronym_from_virtual:1086" => "OGDI", - "old:acronym_from_virtual:1699" => "VIVO", - "old:acronym_from_virtual:2079" => "ECGT", - "old:acronym_from_virtual:2082" => "H3_HIPSeptotemporalAxis", - "old:acronym_from_virtual:1321" => "NEMO", - "old:acronym_from_virtual:3267" => "DCO", - "old:acronym_from_virtual:2001" => "BRO-Activity", - "old:acronym_from_virtual:2072" => "NCBI_NMOsp_1_4_0", - "old:acronym_from_virtual:1343" => "HL7", - "old:acronym_from_virtual:1630" => "UCSFEPIC", - "old:acronym_from_virtual:2119" => "foaf", - "old:acronym_from_virtual:3094" => "DWC-TEST", - "old:acronym_from_virtual:3201" => "BCO", - "old:acronym_from_virtual:1105" => "MS", - "old:acronym_from_virtual:3199" => "UCSFICD910CM", - "old:acronym_from_virtual:1085" => "OGMD", - "old:acronym_from_virtual:1494" => "TMA", - "old:acronym_from_virtual:1484" => "ICECI", - "old:acronym_from_virtual:3259" => "InterNano", - "old:acronym_from_virtual:1444" => "CHEMINF", - "old:acronym_from_virtual:2048" => "ICF-d8", - "old:acronym_from_virtual:2051" => "ICF-d840-d859", - "old:acronym_from_virtual:3226" => "SBOL", - "old:acronym_from_virtual:2063" => "UCare_Demographics", - "old:acronym_from_virtual:1134" => "BT", - "old:acronym_from_virtual:1430" => "AI-RHEUM", - "old:acronym_from_virtual:1528" => "HUGO", - "old:acronym_from_virtual:3025" => "CTX", - "old:acronym_from_virtual:1131" => "MO", - "old:acronym_from_virtual:1404" => "UBERON", - "old:acronym_from_virtual:3194" => "PHENOSCAPE-EXT", - "old:acronym_from_virtual:1526" => "CRISP", - "old:acronym_from_virtual:2116" => "dcterms", - "old:acronym_from_virtual:3233" => "CHD", - "old:acronym_from_virtual:2058" => "SNOMEDCT-MAS", - "old:acronym_from_virtual:3270" => "suicideo", - "old:acronym_from_virtual:1037" => "PTO", - "old:acronym_from_virtual:3269" => "BICSO", - "old:acronym_from_virtual:1110" => "TAO", - "old:acronym_from_virtual:1011" => "IEV", - "old:acronym_from_virtual:1341" => "COSTART", - "old:acronym_from_virtual:2019" => "SNOMEDCT-TF", - "old:acronym_from_virtual:3043" => "MEDABBS", - "old:acronym_from_virtual:2091" => "NDF-RT", - "old:acronym_from_virtual:1583" => "CMO", - "old:acronym_from_virtual:1539" => "NIGO", - "old:acronym_from_virtual:3016" => "ERO", - "old:acronym_from_virtual:2031" => "iceci-details_for_mechanism", - "old:acronym_from_virtual:1507" => "CCO", - "old:acronym_from_virtual:1076" => "OCRE", - "old:acronym_from_virtual:1078" => "BSPO", - "old:acronym_from_virtual:3218" => "TRON", - "old:acronym_from_virtual:1135" => "pseudo", - "old:acronym_from_virtual:1544" => "CO", - "old:acronym_from_virtual:3246" => "ONL-MSA", - "old:acronym_from_virtual:2017" => "BRO-Chinese", - "old:acronym_from_virtual:1439" => "GFO", - "old:acronym_from_virtual:1015" => "FB-BT", - "old:acronym_from_virtual:1041" => "PSIMOD", - "old:acronym_from_virtual:3232" => "SNMI", - "old:acronym_from_virtual:1064" => "FB-SP", - "old:acronym_from_virtual:1655" => "PHARMGKB", - "old:acronym_from_virtual:2111" => "documentStatus", - "old:acronym_from_virtual:1014" => "FIX", - "old:acronym_from_virtual:1521" => "NEUMORE", - "old:acronym_from_virtual:3181" => "ONTOPNEUMO", - "old:acronym_from_virtual:2040" => "SNOMEDCT-CORE", - "old:acronym_from_virtual:1632" => "WSIO", - "old:acronym_from_virtual:2127" => "NIAID-GSC-BRC", - "old:acronym_from_virtual:1639" => "EPILONT", - "old:acronym_from_virtual:3205" => "ICD0", - "old:acronym_from_virtual:3236" => "VTO", - "old:acronym_from_virtual:2047" => "ICF-d7", - "old:acronym_from_virtual:1489" => "OAE", - "old:acronym_from_virtual:2115" => "dcelements", - "old:acronym_from_virtual:1588" => "ONTODT", - "old:acronym_from_virtual:3242" => "NHSQI", - "old:acronym_from_virtual:3197" => "HIMC-CPT", - "old:acronym_from_virtual:1027" => "MFO", - "old:acronym_from_virtual:1311" => "IDOMAL", - "old:acronym_from_virtual:3224" => "UCSFI9I10CMPCS", - "old:acronym_from_virtual:1149" => "DERMLEX", - "old:acronym_from_virtual:1012" => "ECO", - "old:acronym_from_virtual:2026" => "NCIt-Activity", - "old:acronym_from_virtual:1035" => "PW", - "old:acronym_from_virtual:1108" => "PAE", - "old:acronym_from_virtual:2138" => "Radlex3.9.1", - "old:acronym_from_virtual:2136" => "DILIo", - "old:acronym_from_virtual:1572" => "TM-SIGNS-AND-SYMPTS", - "old:acronym_from_virtual:3230" => "EPSO", - "old:acronym_from_virtual:1510" => "CPTH", - "old:acronym_from_virtual:2052" => "ICF-d860-d879", - "old:acronym_from_virtual:1107" => "PATO", - "old:acronym_from_virtual:1005" => "BTO", - "old:acronym_from_virtual:1580" => "AERO", - "old:acronym_from_virtual:3159" => "VARIO", - "old:acronym_from_virtual:2062" => "HOM-UCSF_UCareDispostion", - "old:acronym_from_virtual:1574" => "VHOG", - "old:acronym_from_virtual:1031" => "MPATH", - "old:acronym_from_virtual:1529" => "HCPCS", - "old:acronym_from_virtual:3058" => "DWC", - "old:acronym_from_virtual:1569" => "HPIO", - "old:acronym_from_virtual:2100" => "HSDB_OCRe", - "old:acronym_from_virtual:1491" => "IMGT-ONTOLOGY", - "old:acronym_from_virtual:2125" => "HCPCS-mod", - "old:acronym_from_virtual:3120" => "PCO", - "old:acronym_from_virtual:1019" => "FAO", - "old:acronym_from_virtual:2043" => "ICF-d3", - "old:acronym_from_virtual:2049" => "ICF-d9", - "old:acronym_from_virtual:3139" => "MIRNAO", - "old:acronym_from_virtual:1352" => "NDFRT", - "old:acronym_from_virtual:1044" => "SEP", - "old:acronym_from_virtual:1130" => "ACGT-MO", - "old:acronym_from_virtual:3214" => "OGSF", - "old:acronym_from_virtual:3179" => "GENE-CDS", - "old:acronym_from_virtual:1425" => "ICD10PCS", - "old:acronym_from_virtual:1090" => "AAO", - "old:acronym_from_virtual:1030" => "TGMA", - "old:acronym_from_virtual:1007" => "CHEBI", - "old:acronym_from_virtual:1087" => "OGR", - "old:acronym_from_virtual:3019" => "RH-MESH", - "old:acronym_from_virtual:2037" => "iceci-substance_use", - "old:acronym_from_virtual:3137" => "ONSTR", - "old:acronym_from_virtual:3216" => "BAO-GPCR", - "old:acronym_from_virtual:2064" => "LOINC", - "old:acronym_from_virtual:3198" => "SEMPHYSKB-HUMAN", - "old:acronym_from_virtual:1586" => "OntoOrpha", - "old:acronym_from_virtual:3192" => "MCCV", - "old:acronym_from_virtual:2104" => "MDRFRE", - "old:acronym_from_virtual:3078" => "PHENX", - "old:acronym_from_virtual:3020" => "CPO", - "old:acronym_from_virtual:1148" => "BP-METADATA", - "old:acronym_from_virtual:1021" => "EHDAA", - "old:acronym_from_virtual:3221" => "DERMO", - "old:acronym_from_virtual:3012" => "NONRCTO", - "old:acronym_from_virtual:1222" => "APO", - "old:acronym_from_virtual:1126" => "FHHO", - "old:acronym_from_virtual:1552" => "REPO", - "old:acronym_from_virtual:2066" => "RXNORM", - "old:acronym_from_virtual:3200" => "ZIP5", - "old:acronym_from_virtual:3249" => "ONL-DP", - "old:acronym_from_virtual:3190" => "PATHLEX", - "old:acronym_from_virtual:1672" => "DIKB", - "old:acronym_from_virtual:3210" => "TRAK", - "old:acronym_from_virtual:3266" => "OBI_BCGO", - "old:acronym_from_virtual:3244" => "SEDI", - "old:acronym_from_virtual:1369" => "PHYFIELD", - "old:acronym_from_virtual:3189" => "TOP-MENELAS", - "old:acronym_from_virtual:2106" => "ICF-NoCodeLabel", - "old:acronym_from_virtual:2112" => "geopolitical", - "old:acronym_from_virtual:2121" => "skos", - "old:acronym_from_virtual:1257" => "MEGO", - "old:acronym_from_virtual:1397" => "GAZ", - "old:acronym_from_virtual:3062" => "I2B2-PATVISDIM", - "old:acronym_from_virtual:1568" => "AEO", - "old:acronym_from_virtual:2022" => "BRO-Resource", - "old:acronym_from_virtual:1650" => "UNITSONT", - "old:acronym_from_virtual:3119" => "OBIWS", - "old:acronym_from_virtual:1578" => "ELIXHAUSER", - "old:acronym_from_virtual:1082" => "GRO", - "old:acronym_from_virtual:1490" => "PLATSTG", - "old:acronym_from_virtual:2006" => "FMA-SUBSET", - "old:acronym_from_virtual:1122" => "SPO", - "old:acronym_from_virtual:1504" => "CPT", - "old:acronym_from_virtual:1128" => "CDAO", - "old:acronym_from_virtual:1533" => "BAO", - "old:acronym_from_virtual:3237" => "VBCV", - "old:acronym_from_virtual:3209" => "OPE", - "old:acronym_from_virtual:1000" => "MA", - "old:acronym_from_virtual:2015" => "SOFA", - "old:acronym_from_virtual:2000" => "BRO-Core", - "old:acronym_from_virtual:1416" => "SCTSPA", - "old:acronym_from_virtual:2073" => "ECGF", - "old:acronym_from_virtual:2021" => "SNOMEDCT-ORG", - "old:acronym_from_virtual:1506" => "GO-EXT", - "old:acronym_from_virtual:1401" => "ICNP", - "old:acronym_from_virtual:2059" => "HOM-ICD9", - "old:acronym_from_virtual:1696" => "SYN", - "old:acronym_from_virtual:1058" => "SNPO", - "old:acronym_from_virtual:3195" => "ICD09", - "old:acronym_from_virtual:2027" => "3.0_OWL", - "old:acronym_from_virtual:1582" => "CAO", - "old:acronym_from_virtual:1048" => "WB-BT", - "old:acronym_from_virtual:1415" => "CTCAE", - "old:acronym_from_virtual:1523" => "OBOE-SBC", - "old:acronym_from_virtual:3185" => "GPI", - "old:acronym_from_virtual:2004" => "NeuroFMA", - "old:acronym_from_virtual:1022" => "EHDA", - "old:acronym_from_virtual:1419" => "TAXRANK", - "old:acronym_from_virtual:2024" => "RadLex_OWL", - "old:acronym_from_virtual:2139" => "PROV", - "old:acronym_from_virtual:3274" => "MSV", - "old:acronym_from_virtual:1509" => "ICPS", - "old:acronym_from_virtual:1626" => "EMO", - "old:acronym_from_virtual:1036" => "PECO", - "old:acronym_from_virtual:1614" => "IXNO", - "old:acronym_from_virtual:3030" => "CANCO", - "old:acronym_from_virtual:2118" => "FaBiO", - "old:acronym_from_virtual:1487" => "ICD11-BODYSYSTEM", - "old:acronym_from_virtual:1665" => "SHR", - "old:acronym_from_virtual:1084" => "NIFSTD", - "old:acronym_from_virtual:2057" => "SNOMED-Ethnic-Group", - "old:acronym_from_virtual:1141" => "OPB", - "old:acronym_from_virtual:3227" => "OVAE", - "old:acronym_from_virtual:1029" => "IMR", - "old:acronym_from_virtual:1353" => "SNOMEDCT", - "old:acronym_from_virtual:2102" => "WHOFRE", - "old:acronym_from_virtual:1132" => "NCBITAXON", - "old:acronym_from_virtual:2028" => "iceci-activity", - "old:acronym_from_virtual:1538" => "ROLEO", - "old:acronym_from_virtual:2044" => "ICF-d4", - "old:acronym_from_virtual:1088" => "MHC", - "old:acronym_from_virtual:3167" => "GLOB", - "old:acronym_from_virtual:2081" => "H2_HIPClassicRegions", - "old:acronym_from_virtual:3147" => "CLIN-EVAL", - "old:acronym_from_virtual:3006" => "OOEVV", - "old:acronym_from_virtual:3180" => "MEDO", - "old:acronym_from_virtual:1505" => "OMIT", - "old:acronym_from_virtual:1553" => "ICD10CM", - "old:acronym_from_virtual:2107" => "BIOA3v", - "old:acronym_from_virtual:3046" => "MDCDRG", - "old:acronym_from_virtual:1633" => "COGAT", - "old:acronym_from_virtual:1659" => "VT", - "old:acronym_from_virtual:1040" => "PPIO", - "old:acronym_from_virtual:3129" => "CONSENT-ONT", - "old:acronym_from_virtual:1008" => "DDANAT", - "old:acronym_from_virtual:1020" => "HC", - "old:acronym_from_virtual:1150" => "RS" -} \ No newline at end of file + 'old:acronym_from_virtual:3013' => 'DIAGONT', + 'old:acronym_from_virtual:3245' => 'SuicidO', + 'old:acronym_from_virtual:1247' => 'GEOSPECIES', + 'old:acronym_from_virtual:1054' => 'AMINO-ACID', + 'old:acronym_from_virtual:2012' => 'goslim_pir', + 'old:acronym_from_virtual:3015' => 'PMR', + 'old:acronym_from_virtual:3212' => 'GLYCOPROT', + 'old:acronym_from_virtual:3271' => 'BSAO', + 'old:acronym_from_virtual:2099' => 'GWAS_EFO_SKOS', + 'old:acronym_from_virtual:1062' => 'PR', + 'old:acronym_from_virtual:3004' => 'NATPRO', + 'old:acronym_from_virtual:1584' => 'MMO', + 'old:acronym_from_virtual:1046' => 'SBO', + 'old:acronym_from_virtual:1545' => 'CO-WHEAT', + 'old:acronym_from_virtual:1016' => 'FB-DV', + 'old:acronym_from_virtual:1059' => 'CPRO', + 'old:acronym_from_virtual:3238' => 'PDO', + 'old:acronym_from_virtual:1576' => 'FDA-MEDDEVICE', + 'old:acronym_from_virtual:1114' => 'BILA', + 'old:acronym_from_virtual:1055' => 'GALEN', + 'old:acronym_from_virtual:1158' => 'CBO', + 'old:acronym_from_virtual:3151' => 'GEXO', + 'old:acronym_from_virtual:2109' => 'ooevv-vaccine', + 'old:acronym_from_virtual:1488' => 'JERM', + 'old:acronym_from_virtual:3234' => 'BOF', + 'old:acronym_from_virtual:3047' => 'DEMOGRAPH', + 'old:acronym_from_virtual:1613' => 'BDO', + 'old:acronym_from_virtual:1142' => 'EP', + 'old:acronym_from_virtual:3127' => 'IMMDIS', + 'old:acronym_from_virtual:1461' => 'TMO', + 'old:acronym_from_virtual:3146' => 'CMS', + 'old:acronym_from_virtual:1125' => 'HP', + 'old:acronym_from_virtual:2033' => 'iceci-instrument_object_substance', + 'old:acronym_from_virtual:1033' => 'NMR', + 'old:acronym_from_virtual:1666' => 'MFOEM', + 'old:acronym_from_virtual:1615' => 'CHEMBIO', + 'old:acronym_from_virtual:3184' => 'ZIP3', + 'old:acronym_from_virtual:3150' => 'BRIDG', + 'old:acronym_from_virtual:2054' => 'NCBI_NMOsp_1_0_0', + 'old:acronym_from_virtual:1370' => 'ATO', + 'old:acronym_from_virtual:3268' => 'ERNO', + 'old:acronym_from_virtual:3261' => 'STNFRDRXDEMO', + 'old:acronym_from_virtual:2032' => 'iceci-details_for_place_of_occurrence', + 'old:acronym_from_virtual:1402' => 'NIFCELL', + 'old:acronym_from_virtual:1427' => 'RCD', + 'old:acronym_from_virtual:1565' => 'OMRSE', + 'old:acronym_from_virtual:1517' => 'EHDAA2', + 'old:acronym_from_virtual:1347' => 'MEDLINEPLUS', + 'old:acronym_from_virtual:3243' => 'NHSQI2009', + 'old:acronym_from_virtual:1640' => 'PEDTERM', + 'old:acronym_from_virtual:1354' => 'WHO-ART', + 'old:acronym_from_virtual:1095' => 'XAO', + 'old:acronym_from_virtual:1661' => 'UCSFXPLANT', + 'old:acronym_from_virtual:3174' => 'IDODEN', + 'old:acronym_from_virtual:1146' => 'ECG', + 'old:acronym_from_virtual:1065' => 'TADS', + 'old:acronym_from_virtual:3028' => 'SOY', + 'old:acronym_from_virtual:1100' => 'OGI', + 'old:acronym_from_virtual:2086' => 'SMD_NPLSM_BRST', + 'old:acronym_from_virtual:1136' => 'EFO', + 'old:acronym_from_virtual:1050' => 'ZEA', + 'old:acronym_from_virtual:3124' => 'VSO', + 'old:acronym_from_virtual:2085' => 'SMD_NPLSM', + 'old:acronym_from_virtual:1047' => 'GRO-CPD', + 'old:acronym_from_virtual:1540' => 'DDI', + 'old:acronym_from_virtual:2007' => 'goslim_generic_1_770', + 'old:acronym_from_virtual:3155' => 'ONTOKBCF', + 'old:acronym_from_virtual:2045' => 'ICF-d5', + 'old:acronym_from_virtual:1350' => 'LOINC', + 'old:acronym_from_virtual:1099' => 'ATMO', + 'old:acronym_from_virtual:3231' => 'GLYCANONT', + 'old:acronym_from_virtual:3131' => 'PROVO', + 'old:acronym_from_virtual:1123' => 'OBI', + 'old:acronym_from_virtual:2035' => 'iceci-mechanism', + 'old:acronym_from_virtual:1420' => 'MSHSPA_1', + 'old:acronym_from_virtual:1304' => 'BCGO', + 'old:acronym_from_virtual:1042' => 'OBOREL', + 'old:acronym_from_virtual:1049' => 'WB-LS', + 'old:acronym_from_virtual:1328' => 'HOM', + 'old:acronym_from_virtual:1575' => 'EXO', + 'old:acronym_from_virtual:3077' => 'ONTODM-KDD', + 'old:acronym_from_virtual:2108' => 'ooevv-tractTrace', + 'old:acronym_from_virtual:3191' => 'MPO', + 'old:acronym_from_virtual:1349' => 'PDQ', + 'old:acronym_from_virtual:3239' => 'CSSO', + 'old:acronym_from_virtual:2038' => 'iceci-details_for_activity', + 'old:acronym_from_virtual:1522' => 'BP', + 'old:acronym_from_virtual:1587' => 'PO', + 'old:acronym_from_virtual:1116' => 'BHO', + 'old:acronym_from_virtual:3038' => 'HOM-TEST', + 'old:acronym_from_virtual:1001' => 'GRO-CPGA', + 'old:acronym_from_virtual:2025' => 'NIF-RTH', + 'old:acronym_from_virtual:1537' => 'IDOBRU', + 'old:acronym_from_virtual:1009' => 'DOID', + 'old:acronym_from_virtual:3178' => 'CANONT', + 'old:acronym_from_virtual:2036' => 'iceci-place_of_occurrence', + 'old:acronym_from_virtual:1112' => 'UO', + 'old:acronym_from_virtual:3153' => 'NTDO', + 'old:acronym_from_virtual:1010' => 'EMAP', + 'old:acronym_from_virtual:1541' => 'MCCL', + 'old:acronym_from_virtual:1067' => 'WB-PHENOTYPE', + 'old:acronym_from_virtual:1560' => 'COGPO', + 'old:acronym_from_virtual:1697' => 'UCSFORTHO', + 'old:acronym_from_virtual:1260' => 'RID', + 'old:acronym_from_virtual:1091' => 'SPD', + 'old:acronym_from_virtual:2103' => 'ICPCFRE', + 'old:acronym_from_virtual:1069' => 'ENVO', + 'old:acronym_from_virtual:1686' => 'NEOMARK4', + 'old:acronym_from_virtual:1527' => 'VANDF', + 'old:acronym_from_virtual:1057' => 'RADLEX', + 'old:acronym_from_virtual:3258' => 'OBR-Scolio', + 'old:acronym_from_virtual:1500' => 'RNAO', + 'old:acronym_from_virtual:3042' => 'TEO', + 'old:acronym_from_virtual:2114' => 'citation', + 'old:acronym_from_virtual:2003' => 'BiositemapIM', + 'old:acronym_from_virtual:2029' => 'iceci-countermeasures', + 'old:acronym_from_virtual:3264' => 'WH', + 'old:acronym_from_virtual:1144' => 'DC-CL', + 'old:acronym_from_virtual:1418' => 'TOK', + 'old:acronym_from_virtual:1497' => 'PMA', + 'old:acronym_from_virtual:2093' => 'OBI_IEDB_view', + 'old:acronym_from_virtual:3252' => 'SSE', + 'old:acronym_from_virtual:1183' => 'LIPRO', + 'old:acronym_from_virtual:1423' => 'RXNORM', + 'old:acronym_from_virtual:1026' => 'MAO', + 'old:acronym_from_virtual:1555' => 'VSAO', + 'old:acronym_from_virtual:3031' => 'QUDT', + 'old:acronym_from_virtual:3223' => 'GCO', + 'old:acronym_from_virtual:1172' => 'VO', + 'old:acronym_from_virtual:1068' => 'SAO', + 'old:acronym_from_virtual:1410' => 'KISAO', + 'old:acronym_from_virtual:1520' => 'LSM', + 'old:acronym_from_virtual:2050' => 'ICF-d810-d839', + 'old:acronym_from_virtual:3021' => 'ATC', + 'old:acronym_from_virtual:1063' => 'CARO', + 'old:acronym_from_virtual:1530' => 'ADW', + 'old:acronym_from_virtual:2120' => 'provenance', + 'old:acronym_from_virtual:3017' => 'GCC', + 'old:acronym_from_virtual:2056' => 'NCBI_NMOsp_1_2_2', + 'old:acronym_from_virtual:3206' => 'HCPCS-HIMC', + 'old:acronym_from_virtual:1104' => 'BRO', + 'old:acronym_from_virtual:1092' => 'IDO', + 'old:acronym_from_virtual:1413' => 'SWO', + 'old:acronym_from_virtual:3032' => 'EPICMEDS', + 'old:acronym_from_virtual:1456' => 'MSHFRE', + 'old:acronym_from_virtual:1077' => 'MIRO', + 'old:acronym_from_virtual:1051' => 'ZFA', + 'old:acronym_from_virtual:2055' => 'NCBI_NMOsp_1_2_1', + 'old:acronym_from_virtual:3090' => 'ONTOMA', + 'old:acronym_from_virtual:3104' => 'USSOC', + 'old:acronym_from_virtual:1573' => 'TM-MER', + 'old:acronym_from_virtual:3092' => 'CLINIC', + 'old:acronym_from_virtual:1616' => 'PHYLONT', + 'old:acronym_from_virtual:2023' => 'NCBITaxonOWL', + 'old:acronym_from_virtual:1656' => 'PHENOMEBLAST', + 'old:acronym_from_virtual:3219' => 'MSTDE', + 'old:acronym_from_virtual:1025' => 'MP', + 'old:acronym_from_virtual:1670' => 'ICDO3', + 'old:acronym_from_virtual:1089' => 'BIRNLEX', + 'old:acronym_from_virtual:3215' => 'MIXS', + 'old:acronym_from_virtual:1532' => 'SIO', + 'old:acronym_from_virtual:2105' => 'SNMD_BDY', + 'old:acronym_from_virtual:3022' => 'BIOMODELS', + 'old:acronym_from_virtual:2053' => 'ICF-d840-d859%2Fd860-d879', + 'old:acronym_from_virtual:3262' => 'BCTEO', + 'old:acronym_from_virtual:1168' => 'Amino_Acid-zh_CN', + 'old:acronym_from_virtual:1550' => 'PHARE', + 'old:acronym_from_virtual:1398' => 'LDA', + 'old:acronym_from_virtual:1428' => 'NIC', + 'old:acronym_from_virtual:1567' => 'PVONTO', + 'old:acronym_from_virtual:3211' => 'TEST-PROD', + 'old:acronym_from_virtual:2124' => 'ICD9CM-PROC', + 'old:acronym_from_virtual:3255' => 'CHMO', + 'old:acronym_from_virtual:3204' => 'PORO', + 'old:acronym_from_virtual:1043' => 'REX', + 'old:acronym_from_virtual:1689' => 'FYPO', + 'old:acronym_from_virtual:3008' => 'CARELEX', + 'old:acronym_from_virtual:1570' => 'TM-CONST', + 'old:acronym_from_virtual:2070' => 'obi-fged', + 'old:acronym_from_virtual:2002' => 'BRO-AreaOfResearch', + 'old:acronym_from_virtual:2020' => 'SNOMEDCT-ANAT', + 'old:acronym_from_virtual:2092' => 'envo_153', + 'old:acronym_from_virtual:3045' => 'ICD9CM-KM', + 'old:acronym_from_virtual:3108' => 'CCONT', + 'old:acronym_from_virtual:1438' => 'MCBCC', + 'old:acronym_from_virtual:1348' => 'OMIM', + 'old:acronym_from_virtual:1515' => 'INO', + 'old:acronym_from_virtual:3176' => 'XEO', + 'old:acronym_from_virtual:2009' => 'goslim_plant', + 'old:acronym_from_virtual:2078' => 'H1_NMOABA', + 'old:acronym_from_virtual:3183' => 'IFAR', + 'old:acronym_from_virtual:2046' => 'ICF-d6', + 'old:acronym_from_virtual:3186' => 'I2B2-LOINC', + 'old:acronym_from_virtual:3265' => 'BNO', + 'old:acronym_from_virtual:2110' => 'DTVPrecision', + 'old:acronym_from_virtual:1581' => 'HLTHINDCTRS', + 'old:acronym_from_virtual:3220' => 'MSTDE-FRE', + 'old:acronym_from_virtual:3009' => 'MEO', + 'old:acronym_from_virtual:1694' => 'CPT-KM', + 'old:acronym_from_virtual:1052' => 'PRO-ONT', + 'old:acronym_from_virtual:1290' => 'ABA-AMB', + 'old:acronym_from_virtual:3000' => 'MIXSCV', + 'old:acronym_from_virtual:1038' => 'PSDS', + 'old:acronym_from_virtual:1023' => 'FBbi', + 'old:acronym_from_virtual:1060' => 'CTONT', + 'old:acronym_from_virtual:1249' => 'SBRO', + 'old:acronym_from_virtual:1152' => 'MAT', + 'old:acronym_from_virtual:2101' => 'test1', + 'old:acronym_from_virtual:1083' => 'NPO', + 'old:acronym_from_virtual:1013' => 'EVOC', + 'old:acronym_from_virtual:1407' => 'TEDDY', + 'old:acronym_from_virtual:2113' => 'bibliographic', + 'old:acronym_from_virtual:2030' => 'iceci-descriptor_for_intent', + 'old:acronym_from_virtual:2084' => 'OGMD_OWL', + 'old:acronym_from_virtual:1053' => 'FMA', + 'old:acronym_from_virtual:1422' => 'MEDDRA', + 'old:acronym_from_virtual:2010' => 'goslim_candida', + 'old:acronym_from_virtual:3273' => 'HRDO', + 'old:acronym_from_virtual:3152' => 'REXO', + 'old:acronym_from_virtual:3222' => 'RSA', + 'old:acronym_from_virtual:3207' => 'ATOL', + 'old:acronym_from_virtual:1498' => 'EDAM', + 'old:acronym_from_virtual:1109' => 'SO', + 'old:acronym_from_virtual:1224' => 'SYMP', + 'old:acronym_from_virtual:3253' => 'OntoVIP', + 'old:acronym_from_virtual:1237' => 'SITBAC', + 'old:acronym_from_virtual:2042' => 'ICF-d2', + 'old:acronym_from_virtual:3263' => 'OntoBioUSP', + 'old:acronym_from_virtual:1649' => 'OSHPD', + 'old:acronym_from_virtual:3247' => 'EDDA', + 'old:acronym_from_virtual:1671' => 'QIBO', + 'old:acronym_from_virtual:1585' => 'XCO', + 'old:acronym_from_virtual:1006' => 'CL', + 'old:acronym_from_virtual:1424' => 'NDDF', + 'old:acronym_from_virtual:3114' => 'RPO', + 'old:acronym_from_virtual:1426' => 'MDDB', + 'old:acronym_from_virtual:3169' => 'GLYCO', + 'old:acronym_from_virtual:2065' => 'obi-device', + 'old:acronym_from_virtual:1192' => 'CPTAC', + 'old:acronym_from_virtual:1032' => 'NCIT', + 'old:acronym_from_virtual:2067' => 'RCJI', + 'old:acronym_from_virtual:1017' => 'FB-CV', + 'old:acronym_from_virtual:2014' => 'goslim_yeast', + 'old:acronym_from_virtual:3251' => 'ADO', + 'old:acronym_from_virtual:1081' => 'TTO', + 'old:acronym_from_virtual:3162' => 'RETO', + 'old:acronym_from_virtual:1362' => 'HAO', + 'old:acronym_from_virtual:3240' => 'RNPRIO', + 'old:acronym_from_virtual:3272' => 'CARD', + 'old:acronym_from_virtual:3217' => 'CABRO', + 'old:acronym_from_virtual:2069' => 'H1_NMOABA_1_0', + 'old:acronym_from_virtual:3208' => 'IDQA', + 'old:acronym_from_virtual:3228' => 'ELIG', + 'old:acronym_from_virtual:1651' => 'SDO', + 'old:acronym_from_virtual:3126' => 'NIFSUBCELL', + 'old:acronym_from_virtual:3157' => 'GENETRIAL', + 'old:acronym_from_virtual:1070' => 'GO', + 'old:acronym_from_virtual:2088' => 'SNMD_BC', + 'old:acronym_from_virtual:1414' => 'OGMS', + 'old:acronym_from_virtual:1516' => 'ICD10', + 'old:acronym_from_virtual:1429' => 'ICPC2P', + 'old:acronym_from_virtual:3241' => 'UDEF', + 'old:acronym_from_virtual:2034' => 'iceci-intent', + 'old:acronym_from_virtual:2074' => 'H1_NMOABA_2_0', + 'old:acronym_from_virtual:1024' => 'LHN', + 'old:acronym_from_virtual:3003' => 'CNO', + 'old:acronym_from_virtual:2083' => 'H1_NMOABA_4_1', + 'old:acronym_from_virtual:1039' => 'PROPREO', + 'old:acronym_from_virtual:1638' => 'ONTODM-CORE', + 'old:acronym_from_virtual:2008' => 'goslim_goa', + 'old:acronym_from_virtual:3250' => 'ONL-MR-DA', + 'old:acronym_from_virtual:3136' => 'NHDS', + 'old:acronym_from_virtual:1393' => 'IAO', + 'old:acronym_from_virtual:1332' => 'BFO', + 'old:acronym_from_virtual:3203' => 'HINO', + 'old:acronym_from_virtual:2122' => 'SciRes', + 'old:acronym_from_virtual:2013' => 'goslim_pombe', + 'old:acronym_from_virtual:1627' => 'HOMERUN', + 'old:acronym_from_virtual:2117' => 'event', + 'old:acronym_from_virtual:1190' => 'OPL', + 'old:acronym_from_virtual:3002' => 'MF', + 'old:acronym_from_virtual:1417' => 'FLU', + 'old:acronym_from_virtual:1314' => 'CLO', + 'old:acronym_from_virtual:1101' => 'ICD9CM', + 'old:acronym_from_virtual:3029' => 'SPTO', + 'old:acronym_from_virtual:1381' => 'NIFDYS', + 'old:acronym_from_virtual:1440' => 'GFO-BIO', + 'old:acronym_from_virtual:1344' => 'ICPC', + 'old:acronym_from_virtual:1351' => 'MESH', + 'old:acronym_from_virtual:1094' => 'PTRANS', + 'old:acronym_from_virtual:1115' => 'YPO', + 'old:acronym_from_virtual:2126' => 'CPT-mod', + 'old:acronym_from_virtual:1621' => 'NBO', + 'old:acronym_from_virtual:3007' => 'UCSFICU', + 'old:acronym_from_virtual:2041' => 'ICF-d1', + 'old:acronym_from_virtual:2080' => 'H1_NMOABA_4_0', + 'old:acronym_from_virtual:1501' => 'NEOMARK3', + 'old:acronym_from_virtual:3158' => 'SWEET', + 'old:acronym_from_virtual:1335' => 'PEO', + 'old:acronym_from_virtual:1571' => 'TM-OTHER-FACTORS', + 'old:acronym_from_virtual:1061' => 'SOPHARM', + 'old:acronym_from_virtual:1411' => 'ICF', + 'old:acronym_from_virtual:1394' => 'SSO', + 'old:acronym_from_virtual:2018' => 'SNOMEDCT-CF', + 'old:acronym_from_virtual:1676' => 'RCTONT', + 'old:acronym_from_virtual:1086' => 'OGDI', + 'old:acronym_from_virtual:1699' => 'VIVO', + 'old:acronym_from_virtual:2079' => 'ECGT', + 'old:acronym_from_virtual:2082' => 'H3_HIPSeptotemporalAxis', + 'old:acronym_from_virtual:1321' => 'NEMO', + 'old:acronym_from_virtual:3267' => 'DCO', + 'old:acronym_from_virtual:2001' => 'BRO-Activity', + 'old:acronym_from_virtual:2072' => 'NCBI_NMOsp_1_4_0', + 'old:acronym_from_virtual:1343' => 'HL7', + 'old:acronym_from_virtual:1630' => 'UCSFEPIC', + 'old:acronym_from_virtual:2119' => 'foaf', + 'old:acronym_from_virtual:3094' => 'DWC-TEST', + 'old:acronym_from_virtual:3201' => 'BCO', + 'old:acronym_from_virtual:1105' => 'MS', + 'old:acronym_from_virtual:3199' => 'UCSFICD910CM', + 'old:acronym_from_virtual:1085' => 'OGMD', + 'old:acronym_from_virtual:1494' => 'TMA', + 'old:acronym_from_virtual:1484' => 'ICECI', + 'old:acronym_from_virtual:3259' => 'InterNano', + 'old:acronym_from_virtual:1444' => 'CHEMINF', + 'old:acronym_from_virtual:2048' => 'ICF-d8', + 'old:acronym_from_virtual:2051' => 'ICF-d840-d859', + 'old:acronym_from_virtual:3226' => 'SBOL', + 'old:acronym_from_virtual:2063' => 'UCare_Demographics', + 'old:acronym_from_virtual:1134' => 'BT', + 'old:acronym_from_virtual:1430' => 'AI-RHEUM', + 'old:acronym_from_virtual:1528' => 'HUGO', + 'old:acronym_from_virtual:3025' => 'CTX', + 'old:acronym_from_virtual:1131' => 'MO', + 'old:acronym_from_virtual:1404' => 'UBERON', + 'old:acronym_from_virtual:3194' => 'PHENOSCAPE-EXT', + 'old:acronym_from_virtual:1526' => 'CRISP', + 'old:acronym_from_virtual:2116' => 'dcterms', + 'old:acronym_from_virtual:3233' => 'CHD', + 'old:acronym_from_virtual:2058' => 'SNOMEDCT-MAS', + 'old:acronym_from_virtual:3270' => 'suicideo', + 'old:acronym_from_virtual:1037' => 'PTO', + 'old:acronym_from_virtual:3269' => 'BICSO', + 'old:acronym_from_virtual:1110' => 'TAO', + 'old:acronym_from_virtual:1011' => 'IEV', + 'old:acronym_from_virtual:1341' => 'COSTART', + 'old:acronym_from_virtual:2019' => 'SNOMEDCT-TF', + 'old:acronym_from_virtual:3043' => 'MEDABBS', + 'old:acronym_from_virtual:2091' => 'NDF-RT', + 'old:acronym_from_virtual:1583' => 'CMO', + 'old:acronym_from_virtual:1539' => 'NIGO', + 'old:acronym_from_virtual:3016' => 'ERO', + 'old:acronym_from_virtual:2031' => 'iceci-details_for_mechanism', + 'old:acronym_from_virtual:1507' => 'CCO', + 'old:acronym_from_virtual:1076' => 'OCRE', + 'old:acronym_from_virtual:1078' => 'BSPO', + 'old:acronym_from_virtual:3218' => 'TRON', + 'old:acronym_from_virtual:1135' => 'pseudo', + 'old:acronym_from_virtual:1544' => 'CO', + 'old:acronym_from_virtual:3246' => 'ONL-MSA', + 'old:acronym_from_virtual:2017' => 'BRO-Chinese', + 'old:acronym_from_virtual:1439' => 'GFO', + 'old:acronym_from_virtual:1015' => 'FB-BT', + 'old:acronym_from_virtual:1041' => 'PSIMOD', + 'old:acronym_from_virtual:3232' => 'SNMI', + 'old:acronym_from_virtual:1064' => 'FB-SP', + 'old:acronym_from_virtual:1655' => 'PHARMGKB', + 'old:acronym_from_virtual:2111' => 'documentStatus', + 'old:acronym_from_virtual:1014' => 'FIX', + 'old:acronym_from_virtual:1521' => 'NEUMORE', + 'old:acronym_from_virtual:3181' => 'ONTOPNEUMO', + 'old:acronym_from_virtual:2040' => 'SNOMEDCT-CORE', + 'old:acronym_from_virtual:1632' => 'WSIO', + 'old:acronym_from_virtual:2127' => 'NIAID-GSC-BRC', + 'old:acronym_from_virtual:1639' => 'EPILONT', + 'old:acronym_from_virtual:3205' => 'ICD0', + 'old:acronym_from_virtual:3236' => 'VTO', + 'old:acronym_from_virtual:2047' => 'ICF-d7', + 'old:acronym_from_virtual:1489' => 'OAE', + 'old:acronym_from_virtual:2115' => 'dcelements', + 'old:acronym_from_virtual:1588' => 'ONTODT', + 'old:acronym_from_virtual:3242' => 'NHSQI', + 'old:acronym_from_virtual:3197' => 'HIMC-CPT', + 'old:acronym_from_virtual:1027' => 'MFO', + 'old:acronym_from_virtual:1311' => 'IDOMAL', + 'old:acronym_from_virtual:3224' => 'UCSFI9I10CMPCS', + 'old:acronym_from_virtual:1149' => 'DERMLEX', + 'old:acronym_from_virtual:1012' => 'ECO', + 'old:acronym_from_virtual:2026' => 'NCIt-Activity', + 'old:acronym_from_virtual:1035' => 'PW', + 'old:acronym_from_virtual:1108' => 'PAE', + 'old:acronym_from_virtual:2138' => 'Radlex3.9.1', + 'old:acronym_from_virtual:2136' => 'DILIo', + 'old:acronym_from_virtual:1572' => 'TM-SIGNS-AND-SYMPTS', + 'old:acronym_from_virtual:3230' => 'EPSO', + 'old:acronym_from_virtual:1510' => 'CPTH', + 'old:acronym_from_virtual:2052' => 'ICF-d860-d879', + 'old:acronym_from_virtual:1107' => 'PATO', + 'old:acronym_from_virtual:1005' => 'BTO', + 'old:acronym_from_virtual:1580' => 'AERO', + 'old:acronym_from_virtual:3159' => 'VARIO', + 'old:acronym_from_virtual:2062' => 'HOM-UCSF_UCareDispostion', + 'old:acronym_from_virtual:1574' => 'VHOG', + 'old:acronym_from_virtual:1031' => 'MPATH', + 'old:acronym_from_virtual:1529' => 'HCPCS', + 'old:acronym_from_virtual:3058' => 'DWC', + 'old:acronym_from_virtual:1569' => 'HPIO', + 'old:acronym_from_virtual:2100' => 'HSDB_OCRe', + 'old:acronym_from_virtual:1491' => 'IMGT-ONTOLOGY', + 'old:acronym_from_virtual:2125' => 'HCPCS-mod', + 'old:acronym_from_virtual:3120' => 'PCO', + 'old:acronym_from_virtual:1019' => 'FAO', + 'old:acronym_from_virtual:2043' => 'ICF-d3', + 'old:acronym_from_virtual:2049' => 'ICF-d9', + 'old:acronym_from_virtual:3139' => 'MIRNAO', + 'old:acronym_from_virtual:1352' => 'NDFRT', + 'old:acronym_from_virtual:1044' => 'SEP', + 'old:acronym_from_virtual:1130' => 'ACGT-MO', + 'old:acronym_from_virtual:3214' => 'OGSF', + 'old:acronym_from_virtual:3179' => 'GENE-CDS', + 'old:acronym_from_virtual:1425' => 'ICD10PCS', + 'old:acronym_from_virtual:1090' => 'AAO', + 'old:acronym_from_virtual:1030' => 'TGMA', + 'old:acronym_from_virtual:1007' => 'CHEBI', + 'old:acronym_from_virtual:1087' => 'OGR', + 'old:acronym_from_virtual:3019' => 'RH-MESH', + 'old:acronym_from_virtual:2037' => 'iceci-substance_use', + 'old:acronym_from_virtual:3137' => 'ONSTR', + 'old:acronym_from_virtual:3216' => 'BAO-GPCR', + 'old:acronym_from_virtual:2064' => 'LOINC', + 'old:acronym_from_virtual:3198' => 'SEMPHYSKB-HUMAN', + 'old:acronym_from_virtual:1586' => 'OntoOrpha', + 'old:acronym_from_virtual:3192' => 'MCCV', + 'old:acronym_from_virtual:2104' => 'MDRFRE', + 'old:acronym_from_virtual:3078' => 'PHENX', + 'old:acronym_from_virtual:3020' => 'CPO', + 'old:acronym_from_virtual:1148' => 'BP-METADATA', + 'old:acronym_from_virtual:1021' => 'EHDAA', + 'old:acronym_from_virtual:3221' => 'DERMO', + 'old:acronym_from_virtual:3012' => 'NONRCTO', + 'old:acronym_from_virtual:1222' => 'APO', + 'old:acronym_from_virtual:1126' => 'FHHO', + 'old:acronym_from_virtual:1552' => 'REPO', + 'old:acronym_from_virtual:2066' => 'RXNORM', + 'old:acronym_from_virtual:3200' => 'ZIP5', + 'old:acronym_from_virtual:3249' => 'ONL-DP', + 'old:acronym_from_virtual:3190' => 'PATHLEX', + 'old:acronym_from_virtual:1672' => 'DIKB', + 'old:acronym_from_virtual:3210' => 'TRAK', + 'old:acronym_from_virtual:3266' => 'OBI_BCGO', + 'old:acronym_from_virtual:3244' => 'SEDI', + 'old:acronym_from_virtual:1369' => 'PHYFIELD', + 'old:acronym_from_virtual:3189' => 'TOP-MENELAS', + 'old:acronym_from_virtual:2106' => 'ICF-NoCodeLabel', + 'old:acronym_from_virtual:2112' => 'geopolitical', + 'old:acronym_from_virtual:2121' => 'skos', + 'old:acronym_from_virtual:1257' => 'MEGO', + 'old:acronym_from_virtual:1397' => 'GAZ', + 'old:acronym_from_virtual:3062' => 'I2B2-PATVISDIM', + 'old:acronym_from_virtual:1568' => 'AEO', + 'old:acronym_from_virtual:2022' => 'BRO-Resource', + 'old:acronym_from_virtual:1650' => 'UNITSONT', + 'old:acronym_from_virtual:3119' => 'OBIWS', + 'old:acronym_from_virtual:1578' => 'ELIXHAUSER', + 'old:acronym_from_virtual:1082' => 'GRO', + 'old:acronym_from_virtual:1490' => 'PLATSTG', + 'old:acronym_from_virtual:2006' => 'FMA-SUBSET', + 'old:acronym_from_virtual:1122' => 'SPO', + 'old:acronym_from_virtual:1504' => 'CPT', + 'old:acronym_from_virtual:1128' => 'CDAO', + 'old:acronym_from_virtual:1533' => 'BAO', + 'old:acronym_from_virtual:3237' => 'VBCV', + 'old:acronym_from_virtual:3209' => 'OPE', + 'old:acronym_from_virtual:1000' => 'MA', + 'old:acronym_from_virtual:2015' => 'SOFA', + 'old:acronym_from_virtual:2000' => 'BRO-Core', + 'old:acronym_from_virtual:1416' => 'SCTSPA', + 'old:acronym_from_virtual:2073' => 'ECGF', + 'old:acronym_from_virtual:2021' => 'SNOMEDCT-ORG', + 'old:acronym_from_virtual:1506' => 'GO-EXT', + 'old:acronym_from_virtual:1401' => 'ICNP', + 'old:acronym_from_virtual:2059' => 'HOM-ICD9', + 'old:acronym_from_virtual:1696' => 'SYN', + 'old:acronym_from_virtual:1058' => 'SNPO', + 'old:acronym_from_virtual:3195' => 'ICD09', + 'old:acronym_from_virtual:2027' => '3.0_OWL', + 'old:acronym_from_virtual:1582' => 'CAO', + 'old:acronym_from_virtual:1048' => 'WB-BT', + 'old:acronym_from_virtual:1415' => 'CTCAE', + 'old:acronym_from_virtual:1523' => 'OBOE-SBC', + 'old:acronym_from_virtual:3185' => 'GPI', + 'old:acronym_from_virtual:2004' => 'NeuroFMA', + 'old:acronym_from_virtual:1022' => 'EHDA', + 'old:acronym_from_virtual:1419' => 'TAXRANK', + 'old:acronym_from_virtual:2024' => 'RadLex_OWL', + 'old:acronym_from_virtual:2139' => 'PROV', + 'old:acronym_from_virtual:3274' => 'MSV', + 'old:acronym_from_virtual:1509' => 'ICPS', + 'old:acronym_from_virtual:1626' => 'EMO', + 'old:acronym_from_virtual:1036' => 'PECO', + 'old:acronym_from_virtual:1614' => 'IXNO', + 'old:acronym_from_virtual:3030' => 'CANCO', + 'old:acronym_from_virtual:2118' => 'FaBiO', + 'old:acronym_from_virtual:1487' => 'ICD11-BODYSYSTEM', + 'old:acronym_from_virtual:1665' => 'SHR', + 'old:acronym_from_virtual:1084' => 'NIFSTD', + 'old:acronym_from_virtual:2057' => 'SNOMED-Ethnic-Group', + 'old:acronym_from_virtual:1141' => 'OPB', + 'old:acronym_from_virtual:3227' => 'OVAE', + 'old:acronym_from_virtual:1029' => 'IMR', + 'old:acronym_from_virtual:1353' => 'SNOMEDCT', + 'old:acronym_from_virtual:2102' => 'WHOFRE', + 'old:acronym_from_virtual:1132' => 'NCBITAXON', + 'old:acronym_from_virtual:2028' => 'iceci-activity', + 'old:acronym_from_virtual:1538' => 'ROLEO', + 'old:acronym_from_virtual:2044' => 'ICF-d4', + 'old:acronym_from_virtual:1088' => 'MHC', + 'old:acronym_from_virtual:3167' => 'GLOB', + 'old:acronym_from_virtual:2081' => 'H2_HIPClassicRegions', + 'old:acronym_from_virtual:3147' => 'CLIN-EVAL', + 'old:acronym_from_virtual:3006' => 'OOEVV', + 'old:acronym_from_virtual:3180' => 'MEDO', + 'old:acronym_from_virtual:1505' => 'OMIT', + 'old:acronym_from_virtual:1553' => 'ICD10CM', + 'old:acronym_from_virtual:2107' => 'BIOA3v', + 'old:acronym_from_virtual:3046' => 'MDCDRG', + 'old:acronym_from_virtual:1633' => 'COGAT', + 'old:acronym_from_virtual:1659' => 'VT', + 'old:acronym_from_virtual:1040' => 'PPIO', + 'old:acronym_from_virtual:3129' => 'CONSENT-ONT', + 'old:acronym_from_virtual:1008' => 'DDANAT', + 'old:acronym_from_virtual:1020' => 'HC', + 'old:acronym_from_virtual:1150' => 'RS' +}.freeze diff --git a/lib/resolver/virtual_from_acronym.rb b/lib/resolver/virtual_from_acronym.rb index fed4f1607d..aeab6e520b 100644 --- a/lib/resolver/virtual_from_acronym.rb +++ b/lib/resolver/virtual_from_acronym.rb @@ -1,533 +1,535 @@ +# frozen_string_literal: true + BpidResolver::VIRTUAL_FROM_ACRONYM = { - "JERM" => 1488, - "OGSF" => 3214, - "NATPRO" => 3004, - "citation" => 2114, - "ATC" => 3021, - "SNMD_BC" => 2088, - "WHO-ART" => 1354, - "ICD9CM-PROC" => 2124, - "OGR" => 1087, - "BAO" => 1533, - "ATMO" => 1099, - "goslim_candida" => 2010, - "CHEBI" => 1007, - "SNPO" => 1058, - "provenance" => 2120, - "WHOFRE" => 2102, - "EMAP" => 1010, - "CPT-mod" => 2126, - "CTONT" => 1060, - "BICSO" => 3269, - "NMR" => 1033, - "NPO" => 1083, - "NEOMARK4" => 1686, - "BRO" => 1104, - "TMA" => 1494, - "GLYCANONT" => 3231, - "ICF-d5" => 2045, - "GLOB" => 3167, - "SNOMED-Ethnic-Group" => 2057, - "SBRO" => 1249, - "YPO" => 1115, - "PO" => 1587, - "CPT" => 1504, - "EXO" => 1575, - "geopolitical" => 2112, - "NIC" => 1428, - "CCONT" => 3108, - "CLIN-EVAL" => 3147, - "MMO" => 1584, - "AMINO-ACID" => 1054, - "OBOREL" => 1042, - "IDOBRU" => 1537, - "ICF-d860-d879" => 2052, - "BP-METADATA" => 1148, - "QUDT" => 3031, - "HOM-UCSF_UCareDispostion" => 2062, - "MSTDE-FRE" => 3220, - "SNOMEDCT-ORG" => 2021, - "NCBI_NMOsp_1_4_0" => 2072, - "HP" => 1125, - "BTO" => 1005, - "UO" => 1112, - "SWEET" => 3158, - "OGMD" => 1085, - "VSAO" => 1555, - "ICF-d6" => 2046, - "RPO" => 3114, - "ECO" => 1012, - "HCPCS" => 1529, - "MIRO" => 1077, - "BSAO" => 3271, - "BiositemapIM" => 2003, - "ooevv-vaccine" => 2109, - "COGPO" => 1560, - "CMS" => 3146, - "CCO" => 1507, - "NHDS" => 3136, - "pseudo" => 1135, - "TGMA" => 1030, - "RID" => 1260, - "TM-SIGNS-AND-SYMPTS" => 1572, - "HAO" => 1362, - "VIVO" => 1699, - "EPSO" => 3230, - "OntoBioUSP" => 3263, - "suicideo" => 3270, - "SDO" => 1651, - "ABA-AMB" => 1290, - "HPIO" => 1569, - "AAO" => 1090, - "MCCL" => 1541, - "HOM-TEST" => 3038, - "HIMC-CPT" => 3197, - "ACGT-MO" => 1130, - "REX" => 1043, - "TM-MER" => 1573, - "PHENOSCAPE-EXT" => 3194, - "IEV" => 1011, - "EHDA" => 1022, - "FBbi" => 1023, - "CHEMBIO" => 1615, - "ICD10" => 1516, - "ROLEO" => 1538, - "GFO" => 1439, - "MF" => 3002, - "IMMDIS" => 3127, - "dcelements" => 2115, - "ADW" => 1530, - "BOF" => 3234, - "iceci-countermeasures" => 2029, - "GALEN" => 1055, - "PAE" => 1108, - "OBI" => 1123, - "HOM" => 1328, - "HOMERUN" => 1627, - "CABRO" => 3217, - "ICD9CM" => 1101, - "SNOMEDCT-MAS" => 2058, - "ICF" => 1411, - "WH" => 3264, - "CHMO" => 3255, - "H1_NMOABA_1_0" => 2069, - "BSPO" => 1078, - "MDRFRE" => 2104, - "ICF-NoCodeLabel" => 2106, - "GRO" => 1082, - "NCIT" => 1032, - "UCSFICD910CM" => 3199, - "ADO" => 3251, - "BDO" => 1613, - "NeuroFMA" => 2004, - "MCBCC" => 1438, - "ICD09" => 3195, - "ICF-d840-d859%2Fd860-d879" => 2053, - "RCTONT" => 1676, - "ERNO" => 3268, - "ONTODM-KDD" => 3077, - "IXNO" => 1614, - "ICNP" => 1401, - "KISAO" => 1410, - "EDDA" => 3247, - "GFO-BIO" => 1440, - "FaBiO" => 2118, - "UCare_Demographics" => 2063, - "OGMS" => 1414, - "Radlex3.9.1" => 2138, - "MEO" => 3009, - "SPTO" => 3029, - "CHEMINF" => 1444, - "CANONT" => 3178, - "HC" => 1020, - "PPIO" => 1040, - "H1_NMOABA" => 2078, - "EHDAA" => 1021, - "VSO" => 3124, - "NIGO" => 1539, - "SPO" => 1122, - "VTO" => 3236, - "MP" => 1025, - "GCC" => 3017, - "BILA" => 1114, - "iceci-descriptor_for_intent" => 2030, - "obi-device" => 2065, - "CL" => 1006, - "RH-MESH" => 3019, - "ICD10CM" => 1553, - "BRIDG" => 3150, - "UCSFI9I10CMPCS" => 3224, - "MIXS" => 3215, - "SNOMEDCT-CF" => 2018, - "FMA-SUBSET" => 2006, - "PTO" => 1037, - "CMO" => 1583, - "FB-SP" => 1064, - "EP" => 1142, - "SIO" => 1532, - "InterNano" => 3259, - "ICF-d1" => 2041, - "REPO" => 1552, - "PHARE" => 1550, - "UNITSONT" => 1650, - "REXO" => 3152, - "DOID" => 1009, - "ICDO3" => 1670, - "DIAGONT" => 3013, - "I2B2-PATVISDIM" => 3062, - "NCBI_NMOsp_1_2_1" => 2055, - "MDDB" => 1426, - "PROV" => 2139, - "ICF-d810-d839" => 2050, - "FLU" => 1417, - "DC-CL" => 1144, - "LIPRO" => 1183, - "UCSFICU" => 3007, - "SNOMEDCT-CORE" => 2040, - "NCIt-Activity" => 2026, - "CARO" => 1063, - "CPT-KM" => 1694, - "MFO" => 1027, - "GRO-CPGA" => 1001, - "RETO" => 3162, - "PATHLEX" => 3190, - "GEOSPECIES" => 1247, - "OAE" => 1489, - "EMO" => 1626, - "MPO" => 3191, - "OMIM" => 1348, - "CTX" => 3025, - "FAO" => 1019, - "goslim_plant" => 2009, - "NIFSTD" => 1084, - "iceci-substance_use" => 2037, - "BIOA3v" => 2107, - "QIBO" => 1671, - "iceci-details_for_activity" => 2038, - "BCTEO" => 3262, - "CANCO" => 3030, - "PDQ" => 1349, - "NDDF" => 1424, - "VO" => 1172, - "H1_NMOABA_4_1" => 2083, - "iceci-intent" => 2034, - "IAO" => 1393, - "RS" => 1150, - "ONL-DP" => 3249, - "SciRes" => 2122, - "CARD" => 3272, - "goslim_generic_1_770" => 2007, - "EVOC" => 1013, - "MSHSPA_1" => 1420, - "SNOMEDCT-TF" => 2019, - "MAT" => 1152, - "GRO-CPD" => 1047, - "GLYCO" => 3169, - "UCSFORTHO" => 1697, - "PCO" => 3120, - "CRISP" => 1526, - "IDODEN" => 3174, - "iceci-details_for_place_of_occurrence" => 2032, - "ICD0" => 3205, - "PVONTO" => 1567, - "GEXO" => 3151, - "DIKB" => 1672, - "FB-CV" => 1017, - "SBO" => 1046, - "PEO" => 1335, - "Amino_Acid-zh_CN" => 1168, - "RNAO" => 1500, - "PHYLONT" => 1616, - "GO-EXT" => 1506, - "ICF-d9" => 2049, - "ONL-MSA" => 3246, - "NIFSUBCELL" => 3126, - "PR" => 1062, - "CAO" => 1582, - "VBCV" => 3237, - "ICD9CM-KM" => 3045, - "FIX" => 1014, - "ICECI" => 1484, - "NEUMORE" => 1521, - "WSIO" => 1632, - "goslim_goa" => 2008, - "ICF-d3" => 2043, - "MDCDRG" => 3046, - "DWC-TEST" => 3094, - "BT" => 1134, - "H3_HIPSeptotemporalAxis" => 2082, - "MSV" => 3274, - "DILIo" => 2136, - "ICF-d840-d859" => 2051, - "MCCV" => 3192, - "HL7" => 1343, - "XCO" => 1585, - "ICF-d7" => 2047, - "ZIP5" => 3200, - "SSO" => 1394, - "RXNORM" => 2066, - "DERMO" => 3221, - "obi-fged" => 2070, - "RadLex_OWL" => 2024, - "H1_NMOABA_2_0" => 2074, - "MEDDRA" => 1422, - "BRO-Resource" => 2022, - "TMO" => 1461, - "LHN" => 1024, - "PROPREO" => 1039, - "CO-WHEAT" => 1545, - "CARELEX" => 3008, - "NDFRT" => 1352, - "iceci-instrument_object_substance" => 2033, - "PRO-ONT" => 1052, - "TADS" => 1065, - "HLTHINDCTRS" => 1581, - "WB-PHENOTYPE" => 1067, - "OGDI" => 1086, - "TEO" => 3042, - "PHYFIELD" => 1369, - "NEMO" => 1321, - "CBO" => 1158, - "CPO" => 3020, - "SNOMEDCT" => 1353, - "DWC" => 3058, - "foaf" => 2119, - "LDA" => 1398, - "HUGO" => 1528, - "AI-RHEUM" => 1430, - "MHC" => 1088, - "XAO" => 1095, - "UDEF" => 3241, - "ICF-d8" => 2048, - "H1_NMOABA_4_0" => 2080, - "test1" => 2101, - "TM-CONST" => 1570, - "FB-DV" => 1016, - "PORO" => 3204, - "TTO" => 1081, - "ECGF" => 2073, - "EHDAA2" => 1517, - "BCGO" => 1304, - "DERMLEX" => 1149, - "CO" => 1544, - "ICPCFRE" => 2103, - "TOP-MENELAS" => 3189, - "SMD_NPLSM_BRST" => 2086, - "OntoOrpha" => 1586, - "GAZ" => 1397, - "ELIXHAUSER" => 1578, - "CPTAC" => 1192, - "ONTOKBCF" => 3155, - "TAO" => 1110, - "UCSFXPLANT" => 1661, - "OBI_BCGO" => 3266, - "MEGO" => 1257, - "VARIO" => 3159, - "VT" => 1659, - "SYMP" => 1224, - "BRO-Activity" => 2001, - "SOY" => 3028, - "FHHO" => 1126, - "OPL" => 1190, - "iceci-mechanism" => 2035, - "IFAR" => 3183, - "NHSQI" => 3242, - "LOINC" => 2064, - "IDO" => 1092, - "OBIWS" => 3119, - "EFO" => 1136, - "ONTODT" => 1588, - "ONTOMA" => 3090, - "ICD10PCS" => 1425, - "SEDI" => 3244, - "RSA" => 3222, - "GENETRIAL" => 3157, - "SCTSPA" => 1416, - "iceci-details_for_mechanism" => 2031, - "SAO" => 1068, - "NIFDYS" => 1381, - "ENVO" => 1069, - "INO" => 1515, - "MA" => 1000, - "MFOEM" => 1666, - "BRO-Chinese" => 2017, - "NCBITAXON" => 1132, - "HCPCS-mod" => 2125, - "dcterms" => 2116, - "I2B2-LOINC" => 3186, - "EPICMEDS" => 3032, - "BRO-Core" => 2000, - "CDAO" => 1128, - "ICF-d4" => 2044, - "TEST-PROD" => 3211, - "BAO-GPCR" => 3216, - "ooevv-tractTrace" => 2108, - "PATO" => 1107, - "OBOE-SBC" => 1523, - "BP" => 1522, - "OCRE" => 1076, - "skos" => 2121, - "MIXSCV" => 3000, - "SPD" => 1091, - "BHO" => 1116, - "STNFRDRXDEMO" => 3261, - "FB-BT" => 1015, - "NCBI_NMOsp_1_2_2" => 2056, - "WB-LS" => 1049, - "SNOMEDCT-ANAT" => 2020, - "TRAK" => 3210, - "IDOMAL" => 1311, - "SMD_NPLSM" => 2085, - "goslim_pombe" => 2013, - "SSE" => 3252, - "CONSENT-ONT" => 3129, - "BCO" => 3201, - "RCD" => 1427, - "AEO" => 1568, - "TAXRANK" => 1419, - "PHENX" => 3078, - "goslim_pir" => 2012, - "MO" => 1131, - "PSDS" => 1038, - "ONTODM-CORE" => 1638, - "CHD" => 3233, - "PHARMGKB" => 1655, - "NIF-RTH" => 2025, - "OPB" => 1141, - "MSHFRE" => 1456, - "ZEA" => 1050, - "MEDLINEPLUS" => 1347, - "SO" => 1109, - "OBI_IEDB_view" => 2093, - "PSIMOD" => 1041, - "GPI" => 3185, - "IMGT-ONTOLOGY" => 1491, - "ONL-MR-DA" => 3250, - "SHR" => 1665, - "NHSQI2009" => 3243, - "FDA-MEDDEVICE" => 1576, - "OVAE" => 3227, - "NDF-RT" => 2091, - "CPRO" => 1059, - "CSSO" => 3239, - "event" => 2117, - "CLO" => 1314, - "ECG" => 1146, - "PMR" => 3015, - "IDQA" => 3208, - "OntoVIP" => 3253, - "ZFA" => 1051, - "HCPCS-HIMC" => 3206, - "OSHPD" => 1649, - "ICF-d2" => 2042, - "BIOMODELS" => 3022, - "PHENOMEBLAST" => 1656, - "OMIT" => 1505, - "SITBAC" => 1237, - "NIAID-GSC-BRC" => 2127, - "SNMI" => 3232, - "SOPHARM" => 1061, - "BNO" => 3265, - "DTVPrecision" => 2110, - "VANDF" => 1527, - "OOEVV" => 3006, - "HSDB_OCRe" => 2100, - "LSM" => 1520, - "BRO-AreaOfResearch" => 2002, - "WB-BT" => 1048, - "H2_HIPClassicRegions" => 2081, - "ERO" => 3016, - "EDAM" => 1498, - "HRDO" => 3273, - "OPE" => 3209, - "IMR" => 1029, - "SYN" => 1696, - "NONRCTO" => 3012, - "GCO" => 3223, - "RCJI" => 2067, - "GO" => 1070, - "OMRSE" => 1565, - "ONSTR" => 3137, - "SNMD_BDY" => 2105, - "BIRNLEX" => 1089, - "APO" => 1222, - "DDANAT" => 1008, - "ONTOPNEUMO" => 3181, - "NIFCELL" => 1402, - "SOFA" => 2015, - "ATO" => 1370, - "CLINIC" => 3092, - "PROVO" => 3131, - "NTDO" => 3153, - "RADLEX" => 1057, - "FYPO" => 1689, - "MAO" => 1026, - "MS" => 1105, - "VHOG" => 1574, - "PDO" => 3238, - "DDI" => 1540, - "PECO" => 1036, - "MESH" => 1351, - "COGAT" => 1633, - "CPTH" => 1510, - "MIRNAO" => 3139, - "goslim_yeast" => 2014, - "iceci-place_of_occurrence" => 2036, - "DCO" => 3267, - "FMA" => 1053, - "MPATH" => 1031, - "PTRANS" => 1094, - "ECGT" => 2079, - "bibliographic" => 2113, - "ATOL" => 3207, - "ELIG" => 3228, - "OGI" => 1100, - "USSOC" => 3104, - "GLYCOPROT" => 3212, - "AERO" => 1580, - "TEDDY" => 1407, - "HINO" => 3203, - "GENE-CDS" => 3179, - "TRON" => 3218, - "OBR-Scolio" => 3258, - "ZIP3" => 3184, - "OGMD_OWL" => 2084, - "ICPC2P" => 1429, - "SEP" => 1044, - "PW" => 1035, - "SBOL" => 3226, - "envo_153" => 2092, - "TOK" => 1418, - "COSTART" => 1341, - "ICPS" => 1509, - "UBERON" => 1404, - "NCBI_NMOsp_1_0_0" => 2054, - "PMA" => 1497, - "MEDABBS" => 3043, - "EPILONT" => 1639, - "NCBITaxonOWL" => 2023, - "BFO" => 1332, - "SEMPHYSKB-HUMAN" => 3198, - "ICD11-BODYSYSTEM" => 1487, - "MEDO" => 3180, - "CTCAE" => 1415, - "XEO" => 3176, - "NEOMARK3" => 1501, - "SWO" => 1413, - "SuicidO" => 3245, - "GWAS_EFO_SKOS" => 2099, - "documentStatus" => 2111, - "ICPC" => 1344, - "PEDTERM" => 1640, - "HOM-ICD9" => 2059, - "iceci-activity" => 2028, - "UCSFEPIC" => 1630, - "CNO" => 3003, - "PLATSTG" => 1490, - "3.0_OWL" => 2027, - "DEMOGRAPH" => 3047, - "TM-OTHER-FACTORS" => 1571, - "RNPRIO" => 3240, - "MSTDE" => 3219, - "NBO" => 1621 -} \ No newline at end of file + 'JERM' => 1488, + 'OGSF' => 3214, + 'NATPRO' => 3004, + 'citation' => 2114, + 'ATC' => 3021, + 'SNMD_BC' => 2088, + 'WHO-ART' => 1354, + 'ICD9CM-PROC' => 2124, + 'OGR' => 1087, + 'BAO' => 1533, + 'ATMO' => 1099, + 'goslim_candida' => 2010, + 'CHEBI' => 1007, + 'SNPO' => 1058, + 'provenance' => 2120, + 'WHOFRE' => 2102, + 'EMAP' => 1010, + 'CPT-mod' => 2126, + 'CTONT' => 1060, + 'BICSO' => 3269, + 'NMR' => 1033, + 'NPO' => 1083, + 'NEOMARK4' => 1686, + 'BRO' => 1104, + 'TMA' => 1494, + 'GLYCANONT' => 3231, + 'ICF-d5' => 2045, + 'GLOB' => 3167, + 'SNOMED-Ethnic-Group' => 2057, + 'SBRO' => 1249, + 'YPO' => 1115, + 'PO' => 1587, + 'CPT' => 1504, + 'EXO' => 1575, + 'geopolitical' => 2112, + 'NIC' => 1428, + 'CCONT' => 3108, + 'CLIN-EVAL' => 3147, + 'MMO' => 1584, + 'AMINO-ACID' => 1054, + 'OBOREL' => 1042, + 'IDOBRU' => 1537, + 'ICF-d860-d879' => 2052, + 'BP-METADATA' => 1148, + 'QUDT' => 3031, + 'HOM-UCSF_UCareDispostion' => 2062, + 'MSTDE-FRE' => 3220, + 'SNOMEDCT-ORG' => 2021, + 'NCBI_NMOsp_1_4_0' => 2072, + 'HP' => 1125, + 'BTO' => 1005, + 'UO' => 1112, + 'SWEET' => 3158, + 'OGMD' => 1085, + 'VSAO' => 1555, + 'ICF-d6' => 2046, + 'RPO' => 3114, + 'ECO' => 1012, + 'HCPCS' => 1529, + 'MIRO' => 1077, + 'BSAO' => 3271, + 'BiositemapIM' => 2003, + 'ooevv-vaccine' => 2109, + 'COGPO' => 1560, + 'CMS' => 3146, + 'CCO' => 1507, + 'NHDS' => 3136, + 'pseudo' => 1135, + 'TGMA' => 1030, + 'RID' => 1260, + 'TM-SIGNS-AND-SYMPTS' => 1572, + 'HAO' => 1362, + 'VIVO' => 1699, + 'EPSO' => 3230, + 'OntoBioUSP' => 3263, + 'suicideo' => 3270, + 'SDO' => 1651, + 'ABA-AMB' => 1290, + 'HPIO' => 1569, + 'AAO' => 1090, + 'MCCL' => 1541, + 'HOM-TEST' => 3038, + 'HIMC-CPT' => 3197, + 'ACGT-MO' => 1130, + 'REX' => 1043, + 'TM-MER' => 1573, + 'PHENOSCAPE-EXT' => 3194, + 'IEV' => 1011, + 'EHDA' => 1022, + 'FBbi' => 1023, + 'CHEMBIO' => 1615, + 'ICD10' => 1516, + 'ROLEO' => 1538, + 'GFO' => 1439, + 'MF' => 3002, + 'IMMDIS' => 3127, + 'dcelements' => 2115, + 'ADW' => 1530, + 'BOF' => 3234, + 'iceci-countermeasures' => 2029, + 'GALEN' => 1055, + 'PAE' => 1108, + 'OBI' => 1123, + 'HOM' => 1328, + 'HOMERUN' => 1627, + 'CABRO' => 3217, + 'ICD9CM' => 1101, + 'SNOMEDCT-MAS' => 2058, + 'ICF' => 1411, + 'WH' => 3264, + 'CHMO' => 3255, + 'H1_NMOABA_1_0' => 2069, + 'BSPO' => 1078, + 'MDRFRE' => 2104, + 'ICF-NoCodeLabel' => 2106, + 'GRO' => 1082, + 'NCIT' => 1032, + 'UCSFICD910CM' => 3199, + 'ADO' => 3251, + 'BDO' => 1613, + 'NeuroFMA' => 2004, + 'MCBCC' => 1438, + 'ICD09' => 3195, + 'ICF-d840-d859%2Fd860-d879' => 2053, + 'RCTONT' => 1676, + 'ERNO' => 3268, + 'ONTODM-KDD' => 3077, + 'IXNO' => 1614, + 'ICNP' => 1401, + 'KISAO' => 1410, + 'EDDA' => 3247, + 'GFO-BIO' => 1440, + 'FaBiO' => 2118, + 'UCare_Demographics' => 2063, + 'OGMS' => 1414, + 'Radlex3.9.1' => 2138, + 'MEO' => 3009, + 'SPTO' => 3029, + 'CHEMINF' => 1444, + 'CANONT' => 3178, + 'HC' => 1020, + 'PPIO' => 1040, + 'H1_NMOABA' => 2078, + 'EHDAA' => 1021, + 'VSO' => 3124, + 'NIGO' => 1539, + 'SPO' => 1122, + 'VTO' => 3236, + 'MP' => 1025, + 'GCC' => 3017, + 'BILA' => 1114, + 'iceci-descriptor_for_intent' => 2030, + 'obi-device' => 2065, + 'CL' => 1006, + 'RH-MESH' => 3019, + 'ICD10CM' => 1553, + 'BRIDG' => 3150, + 'UCSFI9I10CMPCS' => 3224, + 'MIXS' => 3215, + 'SNOMEDCT-CF' => 2018, + 'FMA-SUBSET' => 2006, + 'PTO' => 1037, + 'CMO' => 1583, + 'FB-SP' => 1064, + 'EP' => 1142, + 'SIO' => 1532, + 'InterNano' => 3259, + 'ICF-d1' => 2041, + 'REPO' => 1552, + 'PHARE' => 1550, + 'UNITSONT' => 1650, + 'REXO' => 3152, + 'DOID' => 1009, + 'ICDO3' => 1670, + 'DIAGONT' => 3013, + 'I2B2-PATVISDIM' => 3062, + 'NCBI_NMOsp_1_2_1' => 2055, + 'MDDB' => 1426, + 'PROV' => 2139, + 'ICF-d810-d839' => 2050, + 'FLU' => 1417, + 'DC-CL' => 1144, + 'LIPRO' => 1183, + 'UCSFICU' => 3007, + 'SNOMEDCT-CORE' => 2040, + 'NCIt-Activity' => 2026, + 'CARO' => 1063, + 'CPT-KM' => 1694, + 'MFO' => 1027, + 'GRO-CPGA' => 1001, + 'RETO' => 3162, + 'PATHLEX' => 3190, + 'GEOSPECIES' => 1247, + 'OAE' => 1489, + 'EMO' => 1626, + 'MPO' => 3191, + 'OMIM' => 1348, + 'CTX' => 3025, + 'FAO' => 1019, + 'goslim_plant' => 2009, + 'NIFSTD' => 1084, + 'iceci-substance_use' => 2037, + 'BIOA3v' => 2107, + 'QIBO' => 1671, + 'iceci-details_for_activity' => 2038, + 'BCTEO' => 3262, + 'CANCO' => 3030, + 'PDQ' => 1349, + 'NDDF' => 1424, + 'VO' => 1172, + 'H1_NMOABA_4_1' => 2083, + 'iceci-intent' => 2034, + 'IAO' => 1393, + 'RS' => 1150, + 'ONL-DP' => 3249, + 'SciRes' => 2122, + 'CARD' => 3272, + 'goslim_generic_1_770' => 2007, + 'EVOC' => 1013, + 'MSHSPA_1' => 1420, + 'SNOMEDCT-TF' => 2019, + 'MAT' => 1152, + 'GRO-CPD' => 1047, + 'GLYCO' => 3169, + 'UCSFORTHO' => 1697, + 'PCO' => 3120, + 'CRISP' => 1526, + 'IDODEN' => 3174, + 'iceci-details_for_place_of_occurrence' => 2032, + 'ICD0' => 3205, + 'PVONTO' => 1567, + 'GEXO' => 3151, + 'DIKB' => 1672, + 'FB-CV' => 1017, + 'SBO' => 1046, + 'PEO' => 1335, + 'Amino_Acid-zh_CN' => 1168, + 'RNAO' => 1500, + 'PHYLONT' => 1616, + 'GO-EXT' => 1506, + 'ICF-d9' => 2049, + 'ONL-MSA' => 3246, + 'NIFSUBCELL' => 3126, + 'PR' => 1062, + 'CAO' => 1582, + 'VBCV' => 3237, + 'ICD9CM-KM' => 3045, + 'FIX' => 1014, + 'ICECI' => 1484, + 'NEUMORE' => 1521, + 'WSIO' => 1632, + 'goslim_goa' => 2008, + 'ICF-d3' => 2043, + 'MDCDRG' => 3046, + 'DWC-TEST' => 3094, + 'BT' => 1134, + 'H3_HIPSeptotemporalAxis' => 2082, + 'MSV' => 3274, + 'DILIo' => 2136, + 'ICF-d840-d859' => 2051, + 'MCCV' => 3192, + 'HL7' => 1343, + 'XCO' => 1585, + 'ICF-d7' => 2047, + 'ZIP5' => 3200, + 'SSO' => 1394, + 'RXNORM' => 2066, + 'DERMO' => 3221, + 'obi-fged' => 2070, + 'RadLex_OWL' => 2024, + 'H1_NMOABA_2_0' => 2074, + 'MEDDRA' => 1422, + 'BRO-Resource' => 2022, + 'TMO' => 1461, + 'LHN' => 1024, + 'PROPREO' => 1039, + 'CO-WHEAT' => 1545, + 'CARELEX' => 3008, + 'NDFRT' => 1352, + 'iceci-instrument_object_substance' => 2033, + 'PRO-ONT' => 1052, + 'TADS' => 1065, + 'HLTHINDCTRS' => 1581, + 'WB-PHENOTYPE' => 1067, + 'OGDI' => 1086, + 'TEO' => 3042, + 'PHYFIELD' => 1369, + 'NEMO' => 1321, + 'CBO' => 1158, + 'CPO' => 3020, + 'SNOMEDCT' => 1353, + 'DWC' => 3058, + 'foaf' => 2119, + 'LDA' => 1398, + 'HUGO' => 1528, + 'AI-RHEUM' => 1430, + 'MHC' => 1088, + 'XAO' => 1095, + 'UDEF' => 3241, + 'ICF-d8' => 2048, + 'H1_NMOABA_4_0' => 2080, + 'test1' => 2101, + 'TM-CONST' => 1570, + 'FB-DV' => 1016, + 'PORO' => 3204, + 'TTO' => 1081, + 'ECGF' => 2073, + 'EHDAA2' => 1517, + 'BCGO' => 1304, + 'DERMLEX' => 1149, + 'CO' => 1544, + 'ICPCFRE' => 2103, + 'TOP-MENELAS' => 3189, + 'SMD_NPLSM_BRST' => 2086, + 'OntoOrpha' => 1586, + 'GAZ' => 1397, + 'ELIXHAUSER' => 1578, + 'CPTAC' => 1192, + 'ONTOKBCF' => 3155, + 'TAO' => 1110, + 'UCSFXPLANT' => 1661, + 'OBI_BCGO' => 3266, + 'MEGO' => 1257, + 'VARIO' => 3159, + 'VT' => 1659, + 'SYMP' => 1224, + 'BRO-Activity' => 2001, + 'SOY' => 3028, + 'FHHO' => 1126, + 'OPL' => 1190, + 'iceci-mechanism' => 2035, + 'IFAR' => 3183, + 'NHSQI' => 3242, + 'LOINC' => 2064, + 'IDO' => 1092, + 'OBIWS' => 3119, + 'EFO' => 1136, + 'ONTODT' => 1588, + 'ONTOMA' => 3090, + 'ICD10PCS' => 1425, + 'SEDI' => 3244, + 'RSA' => 3222, + 'GENETRIAL' => 3157, + 'SCTSPA' => 1416, + 'iceci-details_for_mechanism' => 2031, + 'SAO' => 1068, + 'NIFDYS' => 1381, + 'ENVO' => 1069, + 'INO' => 1515, + 'MA' => 1000, + 'MFOEM' => 1666, + 'BRO-Chinese' => 2017, + 'NCBITAXON' => 1132, + 'HCPCS-mod' => 2125, + 'dcterms' => 2116, + 'I2B2-LOINC' => 3186, + 'EPICMEDS' => 3032, + 'BRO-Core' => 2000, + 'CDAO' => 1128, + 'ICF-d4' => 2044, + 'TEST-PROD' => 3211, + 'BAO-GPCR' => 3216, + 'ooevv-tractTrace' => 2108, + 'PATO' => 1107, + 'OBOE-SBC' => 1523, + 'BP' => 1522, + 'OCRE' => 1076, + 'skos' => 2121, + 'MIXSCV' => 3000, + 'SPD' => 1091, + 'BHO' => 1116, + 'STNFRDRXDEMO' => 3261, + 'FB-BT' => 1015, + 'NCBI_NMOsp_1_2_2' => 2056, + 'WB-LS' => 1049, + 'SNOMEDCT-ANAT' => 2020, + 'TRAK' => 3210, + 'IDOMAL' => 1311, + 'SMD_NPLSM' => 2085, + 'goslim_pombe' => 2013, + 'SSE' => 3252, + 'CONSENT-ONT' => 3129, + 'BCO' => 3201, + 'RCD' => 1427, + 'AEO' => 1568, + 'TAXRANK' => 1419, + 'PHENX' => 3078, + 'goslim_pir' => 2012, + 'MO' => 1131, + 'PSDS' => 1038, + 'ONTODM-CORE' => 1638, + 'CHD' => 3233, + 'PHARMGKB' => 1655, + 'NIF-RTH' => 2025, + 'OPB' => 1141, + 'MSHFRE' => 1456, + 'ZEA' => 1050, + 'MEDLINEPLUS' => 1347, + 'SO' => 1109, + 'OBI_IEDB_view' => 2093, + 'PSIMOD' => 1041, + 'GPI' => 3185, + 'IMGT-ONTOLOGY' => 1491, + 'ONL-MR-DA' => 3250, + 'SHR' => 1665, + 'NHSQI2009' => 3243, + 'FDA-MEDDEVICE' => 1576, + 'OVAE' => 3227, + 'NDF-RT' => 2091, + 'CPRO' => 1059, + 'CSSO' => 3239, + 'event' => 2117, + 'CLO' => 1314, + 'ECG' => 1146, + 'PMR' => 3015, + 'IDQA' => 3208, + 'OntoVIP' => 3253, + 'ZFA' => 1051, + 'HCPCS-HIMC' => 3206, + 'OSHPD' => 1649, + 'ICF-d2' => 2042, + 'BIOMODELS' => 3022, + 'PHENOMEBLAST' => 1656, + 'OMIT' => 1505, + 'SITBAC' => 1237, + 'NIAID-GSC-BRC' => 2127, + 'SNMI' => 3232, + 'SOPHARM' => 1061, + 'BNO' => 3265, + 'DTVPrecision' => 2110, + 'VANDF' => 1527, + 'OOEVV' => 3006, + 'HSDB_OCRe' => 2100, + 'LSM' => 1520, + 'BRO-AreaOfResearch' => 2002, + 'WB-BT' => 1048, + 'H2_HIPClassicRegions' => 2081, + 'ERO' => 3016, + 'EDAM' => 1498, + 'HRDO' => 3273, + 'OPE' => 3209, + 'IMR' => 1029, + 'SYN' => 1696, + 'NONRCTO' => 3012, + 'GCO' => 3223, + 'RCJI' => 2067, + 'GO' => 1070, + 'OMRSE' => 1565, + 'ONSTR' => 3137, + 'SNMD_BDY' => 2105, + 'BIRNLEX' => 1089, + 'APO' => 1222, + 'DDANAT' => 1008, + 'ONTOPNEUMO' => 3181, + 'NIFCELL' => 1402, + 'SOFA' => 2015, + 'ATO' => 1370, + 'CLINIC' => 3092, + 'PROVO' => 3131, + 'NTDO' => 3153, + 'RADLEX' => 1057, + 'FYPO' => 1689, + 'MAO' => 1026, + 'MS' => 1105, + 'VHOG' => 1574, + 'PDO' => 3238, + 'DDI' => 1540, + 'PECO' => 1036, + 'MESH' => 1351, + 'COGAT' => 1633, + 'CPTH' => 1510, + 'MIRNAO' => 3139, + 'goslim_yeast' => 2014, + 'iceci-place_of_occurrence' => 2036, + 'DCO' => 3267, + 'FMA' => 1053, + 'MPATH' => 1031, + 'PTRANS' => 1094, + 'ECGT' => 2079, + 'bibliographic' => 2113, + 'ATOL' => 3207, + 'ELIG' => 3228, + 'OGI' => 1100, + 'USSOC' => 3104, + 'GLYCOPROT' => 3212, + 'AERO' => 1580, + 'TEDDY' => 1407, + 'HINO' => 3203, + 'GENE-CDS' => 3179, + 'TRON' => 3218, + 'OBR-Scolio' => 3258, + 'ZIP3' => 3184, + 'OGMD_OWL' => 2084, + 'ICPC2P' => 1429, + 'SEP' => 1044, + 'PW' => 1035, + 'SBOL' => 3226, + 'envo_153' => 2092, + 'TOK' => 1418, + 'COSTART' => 1341, + 'ICPS' => 1509, + 'UBERON' => 1404, + 'NCBI_NMOsp_1_0_0' => 2054, + 'PMA' => 1497, + 'MEDABBS' => 3043, + 'EPILONT' => 1639, + 'NCBITaxonOWL' => 2023, + 'BFO' => 1332, + 'SEMPHYSKB-HUMAN' => 3198, + 'ICD11-BODYSYSTEM' => 1487, + 'MEDO' => 3180, + 'CTCAE' => 1415, + 'XEO' => 3176, + 'NEOMARK3' => 1501, + 'SWO' => 1413, + 'SuicidO' => 3245, + 'GWAS_EFO_SKOS' => 2099, + 'documentStatus' => 2111, + 'ICPC' => 1344, + 'PEDTERM' => 1640, + 'HOM-ICD9' => 2059, + 'iceci-activity' => 2028, + 'UCSFEPIC' => 1630, + 'CNO' => 3003, + 'PLATSTG' => 1490, + '3.0_OWL' => 2027, + 'DEMOGRAPH' => 3047, + 'TM-OTHER-FACTORS' => 1571, + 'RNPRIO' => 3240, + 'MSTDE' => 3219, + 'NBO' => 1621 +}.freeze diff --git a/lib/resolver/virtual_from_version.rb b/lib/resolver/virtual_from_version.rb index 9e40cad015..4be9af5039 100644 --- a/lib/resolver/virtual_from_version.rb +++ b/lib/resolver/virtual_from_version.rb @@ -1,7144 +1,7146 @@ +# frozen_string_literal: true + BpidResolver::VIRTUAL_FROM_VERSION = { - "old:virtual_from_version:40876" => 1048, - "old:virtual_from_version:44059" => 1125, - "old:virtual_from_version:46266" => 1172, - "old:virtual_from_version:44870" => 1077, - "old:virtual_from_version:40446" => 1009, - "old:virtual_from_version:42230" => 1083, - "old:virtual_from_version:44261" => 1070, - "old:virtual_from_version:44863" => 1009, - "old:virtual_from_version:44231" => 1107, - "old:virtual_from_version:47370" => 1077, - "old:virtual_from_version:49429" => 1580, - "old:virtual_from_version:42156" => 1037, - "old:virtual_from_version:44222" => 1009, - "old:virtual_from_version:42381" => 1070, - "old:virtual_from_version:50050" => 3131, - "old:virtual_from_version:47704" => 1689, - "old:virtual_from_version:40625" => 1070, - "old:virtual_from_version:40934" => 1070, - "old:virtual_from_version:43002" => 2018, - "old:virtual_from_version:40941" => 1070, - "old:virtual_from_version:39314" => 1125, - "old:virtual_from_version:46950" => 1070, - "old:virtual_from_version:46093" => 1649, - "old:virtual_from_version:49425" => 1025, - "old:virtual_from_version:42731" => 1077, - "old:virtual_from_version:47095" => 1077, - "old:virtual_from_version:49684" => 1125, - "old:virtual_from_version:49229" => 1689, - "old:virtual_from_version:47012" => 3016, - "old:virtual_from_version:45228" => 1414, - "old:virtual_from_version:45287" => 1517, - "old:virtual_from_version:45569" => 1136, - "old:virtual_from_version:42525" => 1017, - "old:virtual_from_version:38363" => 1081, - "old:virtual_from_version:40404" => 1354, - "old:virtual_from_version:47677" => 1689, - "old:virtual_from_version:47916" => 1081, - "old:virtual_from_version:42239" => 1077, - "old:virtual_from_version:46908" => 1070, - "old:virtual_from_version:50341" => 3131, - "old:virtual_from_version:44232" => 1070, - "old:virtual_from_version:44622" => 1009, - "old:virtual_from_version:40556" => 1067, - "old:virtual_from_version:46102" => 1070, - "old:virtual_from_version:49057" => 1077, - "old:virtual_from_version:45091" => 1025, - "old:virtual_from_version:44599" => 1141, - "old:virtual_from_version:39208" => 1148, - "old:virtual_from_version:44055" => 1077, - "old:virtual_from_version:39055" => 1110, - "old:virtual_from_version:44779" => 1545, - "old:virtual_from_version:43073" => 2072, - "old:virtual_from_version:45955" => 1105, - "old:virtual_from_version:46215" => 1070, - "old:virtual_from_version:46917" => 1109, - "old:virtual_from_version:50608" => 1136, - "old:virtual_from_version:29952" => 1078, - "old:virtual_from_version:42084" => 1070, - "old:virtual_from_version:45919" => 1035, - "old:virtual_from_version:40589" => 1077, - "old:virtual_from_version:44604" => 1009, - "old:virtual_from_version:50267" => 3131, - "old:virtual_from_version:50174" => 1172, - "old:virtual_from_version:40681" => 1081, - "old:virtual_from_version:44915" => 1077, - "old:virtual_from_version:42810" => 1500, - "old:virtual_from_version:46938" => 3009, - "old:virtual_from_version:42177" => 1172, - "old:virtual_from_version:40398" => 1348, - "old:virtual_from_version:49002" => 1070, - "old:virtual_from_version:45570" => 1070, - "old:virtual_from_version:42980" => 1009, - "old:virtual_from_version:42557" => 1037, - "old:virtual_from_version:42070" => 1107, - "old:virtual_from_version:40634" => 1070, - "old:virtual_from_version:40441" => 1083, - "old:virtual_from_version:39905" => 1081, - "old:virtual_from_version:45020" => 1070, - "old:virtual_from_version:47294" => 1077, - "old:virtual_from_version:44738" => 1070, - "old:virtual_from_version:49659" => 3155, - "old:virtual_from_version:44158" => 1107, - "old:virtual_from_version:44939" => 1125, - "old:virtual_from_version:47658" => 1070, - "old:virtual_from_version:38751" => 1112, - "old:virtual_from_version:50316" => 1311, - "old:virtual_from_version:45554" => 1172, - "old:virtual_from_version:46320" => 1115, - "old:virtual_from_version:46790" => 1077, - "old:virtual_from_version:45799" => 1067, - "old:virtual_from_version:49263" => 1532, - "old:virtual_from_version:45033" => 1016, - "old:virtual_from_version:45005" => 1006, - "old:virtual_from_version:47430" => 1077, - "old:virtual_from_version:42607" => 1070, - "old:virtual_from_version:44878" => 1125, - "old:virtual_from_version:46763" => 1062, - "old:virtual_from_version:44050" => 1125, - "old:virtual_from_version:50616" => 1025, - "old:virtual_from_version:50308" => 1224, - "old:virtual_from_version:45330" => 1588, - "old:virtual_from_version:45783" => 1007, - "old:virtual_from_version:42948" => 1148, - "old:virtual_from_version:42159" => 1077, - "old:virtual_from_version:39932" => 1110, - "old:virtual_from_version:42828" => 1078, - "old:virtual_from_version:39175" => 1146, - "old:virtual_from_version:47474" => 1070, - "old:virtual_from_version:44796" => 1077, - "old:virtual_from_version:45353" => 1107, - "old:virtual_from_version:42081" => 1009, - "old:virtual_from_version:45491" => 1009, - "old:virtual_from_version:44302" => 1013, - "old:virtual_from_version:40848" => 1407, - "old:virtual_from_version:45954" => 1070, - "old:virtual_from_version:50612" => 1689, - "old:virtual_from_version:38407" => 1104, - "old:virtual_from_version:48010" => 2110, - "old:virtual_from_version:39483" => 1007, - "old:virtual_from_version:41000" => 2012, - "old:virtual_from_version:46948" => 1659, - "old:virtual_from_version:44362" => 1063, - "old:virtual_from_version:45446" => 1125, - "old:virtual_from_version:42256" => 1009, - "old:virtual_from_version:47113" => 3020, - "old:virtual_from_version:42442" => 1009, - "old:virtual_from_version:46735" => 1689, - "old:virtual_from_version:43021" => 2046, - "old:virtual_from_version:49586" => 1067, - "old:virtual_from_version:44579" => 1070, - "old:virtual_from_version:40892" => 1108, - "old:virtual_from_version:44692" => 1109, - "old:virtual_from_version:50607" => 1070, - "old:virtual_from_version:50177" => 1070, - "old:virtual_from_version:38801" => 1131, - "old:virtual_from_version:39897" => 1183, - "old:virtual_from_version:45015" => 1125, - "old:virtual_from_version:47406" => 1125, - "old:virtual_from_version:46305" => 1070, - "old:virtual_from_version:45506" => 1584, - "old:virtual_from_version:39737" => 1025, - "old:virtual_from_version:47427" => 1136, - "old:virtual_from_version:43086" => 2083, - "old:virtual_from_version:42914" => 1009, - "old:virtual_from_version:45928" => 1070, - "old:virtual_from_version:44656" => 1025, - "old:virtual_from_version:44637" => 1070, - "old:virtual_from_version:49610" => 1659, - "old:virtual_from_version:50200" => 1311, - "old:virtual_from_version:47516" => 1070, - "old:virtual_from_version:49208" => 1404, - "old:virtual_from_version:50668" => 3208, - "old:virtual_from_version:42598" => 1070, - "old:virtual_from_version:49324" => 1070, - "old:virtual_from_version:47473" => 1616, - "old:virtual_from_version:49225" => 1125, - "old:virtual_from_version:50763" => 1417, - "old:virtual_from_version:45121" => 1077, - "old:virtual_from_version:49776" => 3194, - "old:virtual_from_version:49217" => 1070, - "old:virtual_from_version:46356" => 1670, - "old:virtual_from_version:50726" => 3266, - "old:virtual_from_version:46452" => 1105, - "old:virtual_from_version:49589" => 1077, - "old:virtual_from_version:45476" => 1105, - "old:virtual_from_version:49352" => 1136, - "old:virtual_from_version:40828" => 1006, - "old:virtual_from_version:40651" => 1397, - "old:virtual_from_version:38793" => 1062, - "old:virtual_from_version:46893" => 1070, - "old:virtual_from_version:50209" => 1070, - "old:virtual_from_version:40645" => 1128, - "old:virtual_from_version:42563" => 1109, - "old:virtual_from_version:49413" => 1070, - "old:virtual_from_version:42408" => 1311, - "old:virtual_from_version:45296" => 1062, - "old:virtual_from_version:46543" => 1125, - "old:virtual_from_version:41017" => 2026, - "old:virtual_from_version:47043" => 1077, - "old:virtual_from_version:50353" => 1125, - "old:virtual_from_version:50721" => 1150, - "old:virtual_from_version:44922" => 1555, - "old:virtual_from_version:44822" => 1550, - "old:virtual_from_version:46901" => 1077, - "old:virtual_from_version:49205" => 1070, - "old:virtual_from_version:45289" => 1110, - "old:virtual_from_version:49676" => 1404, - "old:virtual_from_version:47640" => 1125, - "old:virtual_from_version:49390" => 1070, - "old:virtual_from_version:50534" => 1314, - "old:virtual_from_version:45730" => 1048, - "old:virtual_from_version:46420" => 1136, - "old:virtual_from_version:40902" => 1048, - "old:virtual_from_version:44030" => 1077, - "old:virtual_from_version:49732" => 1489, - "old:virtual_from_version:46240" => 1070, - "old:virtual_from_version:50700" => 3259, - "old:virtual_from_version:42470" => 1404, - "old:virtual_from_version:47364" => 1077, - "old:virtual_from_version:46495" => 1580, - "old:virtual_from_version:47445" => 1381, - "old:virtual_from_version:46823" => 3000, - "old:virtual_from_version:40512" => 1077, - "old:virtual_from_version:49158" => 1077, - "old:virtual_from_version:49930" => 1632, - "old:virtual_from_version:40552" => 1091, - "old:virtual_from_version:43036" => 2035, - "old:virtual_from_version:50499" => 3259, - "old:virtual_from_version:40778" => 1107, - "old:virtual_from_version:49503" => 1107, - "old:virtual_from_version:45553" => 1348, - "old:virtual_from_version:42806" => 1009, - "old:virtual_from_version:45109" => 1489, - "old:virtual_from_version:44247" => 1070, - "old:virtual_from_version:45377" => 1362, - "old:virtual_from_version:47983" => 3126, - "old:virtual_from_version:49979" => 1062, - "old:virtual_from_version:47162" => 3030, - "old:virtual_from_version:44217" => 1224, - "old:virtual_from_version:45925" => 1025, - "old:virtual_from_version:46708" => 1070, - "old:virtual_from_version:47490" => 1070, - "old:virtual_from_version:42876" => 1070, - "old:virtual_from_version:49178" => 1077, - "old:virtual_from_version:39149" => 1123, - "old:virtual_from_version:44564" => 1037, - "old:virtual_from_version:42252" => 1077, - "old:virtual_from_version:49696" => 1158, - "old:virtual_from_version:40797" => 1051, - "old:virtual_from_version:40811" => 1077, - "old:virtual_from_version:47730" => 1077, - "old:virtual_from_version:42231" => 1172, - "old:virtual_from_version:49064" => 1689, - "old:virtual_from_version:42493" => 1025, - "old:virtual_from_version:47153" => 1125, - "old:virtual_from_version:49233" => 1077, - "old:virtual_from_version:44129" => 1070, - "old:virtual_from_version:48039" => 2136, - "old:virtual_from_version:44101" => 1077, - "old:virtual_from_version:49504" => 1105, - "old:virtual_from_version:44725" => 1070, - "old:virtual_from_version:49102" => 1649, - "old:virtual_from_version:49138" => 1070, - "old:virtual_from_version:44140" => 1077, - "old:virtual_from_version:40745" => 1081, - "old:virtual_from_version:46622" => 1136, - "old:virtual_from_version:46415" => 1070, - "old:virtual_from_version:50290" => 3223, - "old:virtual_from_version:45423" => 1136, - "old:virtual_from_version:40576" => 1070, - "old:virtual_from_version:49455" => 3008, - "old:virtual_from_version:45272" => 1069, - "old:virtual_from_version:45866" => 1125, - "old:virtual_from_version:49024" => 1125, - "old:virtual_from_version:44190" => 1077, - "old:virtual_from_version:39281" => 1105, - "old:virtual_from_version:47997" => 1077, - "old:virtual_from_version:40244" => 1311, - "old:virtual_from_version:44403" => 1009, - "old:virtual_from_version:47733" => 1070, - "old:virtual_from_version:47817" => 3094, - "old:virtual_from_version:49682" => 1651, - "old:virtual_from_version:49897" => 1070, - "old:virtual_from_version:45686" => 1027, - "old:virtual_from_version:50084" => 1070, - "old:virtual_from_version:39995" => 2010, - "old:virtual_from_version:48018" => 2118, - "old:virtual_from_version:42385" => 1037, - "old:virtual_from_version:50070" => 1172, - "old:virtual_from_version:44770" => 1544, - "old:virtual_from_version:50310" => 1009, - "old:virtual_from_version:40733" => 1009, - "old:virtual_from_version:42743" => 1321, - "old:virtual_from_version:46092" => 1649, - "old:virtual_from_version:43044" => 2001, - "old:virtual_from_version:50478" => 3234, - "old:virtual_from_version:44888" => 1025, - "old:virtual_from_version:40995" => 1125, - "old:virtual_from_version:39517" => 1125, - "old:virtual_from_version:42313" => 1025, - "old:virtual_from_version:45694" => 1070, - "old:virtual_from_version:40843" => 1109, - "old:virtual_from_version:49219" => 1128, - "old:virtual_from_version:42701" => 1009, - "old:virtual_from_version:42002" => 1007, - "old:virtual_from_version:47863" => 1583, - "old:virtual_from_version:50681" => 1584, - "old:virtual_from_version:49818" => 3200, - "old:virtual_from_version:42512" => 1081, - "old:virtual_from_version:42486" => 1077, - "old:virtual_from_version:50244" => 1067, - "old:virtual_from_version:42832" => 1037, - "old:virtual_from_version:42953" => 1037, - "old:virtual_from_version:40717" => 1070, - "old:virtual_from_version:50219" => 1065, - "old:virtual_from_version:49957" => 1489, - "old:virtual_from_version:45404" => 1011, - "old:virtual_from_version:44969" => 1063, - "old:virtual_from_version:42383" => 1025, - "old:virtual_from_version:44108" => 1517, - "old:virtual_from_version:44987" => 1027, - "old:virtual_from_version:45574" => 1136, - "old:virtual_from_version:40216" => 1094, - "old:virtual_from_version:47914" => 1125, - "old:virtual_from_version:46211" => 1661, - "old:virtual_from_version:44768" => 1077, - "old:virtual_from_version:40919" => 1009, - "old:virtual_from_version:45131" => 1125, - "old:virtual_from_version:50128" => 3131, - "old:virtual_from_version:42448" => 1125, - "old:virtual_from_version:42608" => 1009, - "old:virtual_from_version:46720" => 1070, - "old:virtual_from_version:42986" => 1009, - "old:virtual_from_version:47312" => 1109, - "old:virtual_from_version:49920" => 3186, - "old:virtual_from_version:47475" => 1037, - "old:virtual_from_version:38675" => 1006, - "old:virtual_from_version:50482" => 1491, - "old:virtual_from_version:42922" => 1025, - "old:virtual_from_version:47962" => 1067, - "old:virtual_from_version:49131" => 3002, - "old:virtual_from_version:49541" => 1532, - "old:virtual_from_version:47915" => 1037, - "old:virtual_from_version:49551" => 1689, - "old:virtual_from_version:42250" => 1009, - "old:virtual_from_version:45542" => 1532, - "old:virtual_from_version:50451" => 1172, - "old:virtual_from_version:42368" => 1070, - "old:virtual_from_version:46428" => 1070, - "old:virtual_from_version:49445" => 1105, - "old:virtual_from_version:44355" => 1172, - "old:virtual_from_version:45896" => 1125, - "old:virtual_from_version:44543" => 1037, - "old:virtual_from_version:42372" => 1404, - "old:virtual_from_version:44616" => 1077, - "old:virtual_from_version:49270" => 1077, - "old:virtual_from_version:47858" => 1037, - "old:virtual_from_version:44531" => 1533, - "old:virtual_from_version:42080" => 1070, - "old:virtual_from_version:46889" => 1125, - "old:virtual_from_version:49243" => 3158, - "old:virtual_from_version:50638" => 1105, - "old:virtual_from_version:45243" => 1078, - "old:virtual_from_version:44525" => 1070, - "old:virtual_from_version:49966" => 1070, - "old:virtual_from_version:42319" => 1077, - "old:virtual_from_version:40984" => 1415, - "old:virtual_from_version:42482" => 1067, - "old:virtual_from_version:44694" => 1538, - "old:virtual_from_version:47671" => 1077, - "old:virtual_from_version:47865" => 1585, - "old:virtual_from_version:47675" => 1077, - "old:virtual_from_version:46492" => 1686, - "old:virtual_from_version:46218" => 1070, - "old:virtual_from_version:44483" => 1037, - "old:virtual_from_version:49045" => 1404, - "old:virtual_from_version:49244" => 1070, - "old:virtual_from_version:45036" => 1019, - "old:virtual_from_version:42693" => 1032, - "old:virtual_from_version:49958" => 3131, - "old:virtual_from_version:46097" => 1077, - "old:virtual_from_version:37419" => 1038, - "old:virtual_from_version:49709" => 1086, - "old:virtual_from_version:42386" => 1404, - "old:virtual_from_version:47690" => 1070, - "old:virtual_from_version:40740" => 1222, - "old:virtual_from_version:46986" => 3008, - "old:virtual_from_version:47001" => 1125, - "old:virtual_from_version:38955" => 1006, - "old:virtual_from_version:46660" => 1070, - "old:virtual_from_version:42676" => 1037, - "old:virtual_from_version:44618" => 1109, - "old:virtual_from_version:39242" => 1035, - "old:virtual_from_version:47297" => 1616, - "old:virtual_from_version:46832" => 1048, - "old:virtual_from_version:44764" => 1009, - "old:virtual_from_version:40259" => 1067, - "old:virtual_from_version:42169" => 1037, - "old:virtual_from_version:42686" => 1070, - "old:virtual_from_version:46268" => 1517, - "old:virtual_from_version:45899" => 1125, - "old:virtual_from_version:46592" => 1070, - "old:virtual_from_version:50075" => 1172, - "old:virtual_from_version:40973" => 1070, - "old:virtual_from_version:38378" => 1009, - "old:virtual_from_version:42012" => 1077, - "old:virtual_from_version:50049" => 1689, - "old:virtual_from_version:47752" => 1077, - "old:virtual_from_version:50637" => 1128, - "old:virtual_from_version:40617" => 1070, - "old:virtual_from_version:49810" => 1006, - "old:virtual_from_version:38662" => 1404, - "old:virtual_from_version:49394" => 1070, - "old:virtual_from_version:40719" => 1081, - "old:virtual_from_version:42920" => 1048, - "old:virtual_from_version:40542" => 1077, - "old:virtual_from_version:49234" => 1532, - "old:virtual_from_version:45216" => 1571, - "old:virtual_from_version:45478" => 1077, - "old:virtual_from_version:47044" => 3017, - "old:virtual_from_version:49347" => 1404, - "old:virtual_from_version:42006" => 1037, - "old:virtual_from_version:47959" => 1649, - "old:virtual_from_version:39103" => 1144, - "old:virtual_from_version:42234" => 1077, - "old:virtual_from_version:46537" => 1070, - "old:virtual_from_version:50424" => 3131, - "old:virtual_from_version:49670" => 1689, - "old:virtual_from_version:44665" => 1037, - "old:virtual_from_version:49189" => 1404, - "old:virtual_from_version:42650" => 1484, - "old:virtual_from_version:40718" => 1077, - "old:virtual_from_version:47953" => 1107, - "old:virtual_from_version:40430" => 1009, - "old:virtual_from_version:49076" => 1083, - "old:virtual_from_version:50373" => 1032, - "old:virtual_from_version:50379" => 1689, - "old:virtual_from_version:45401" => 1136, - "old:virtual_from_version:42933" => 1070, - "old:virtual_from_version:49129" => 1585, - "old:virtual_from_version:44001" => 1070, - "old:virtual_from_version:50446" => 3189, - "old:virtual_from_version:45486" => 1136, - "old:virtual_from_version:45763" => 1077, - "old:virtual_from_version:40702" => 1081, - "old:virtual_from_version:40613" => 1109, - "old:virtual_from_version:50030" => 3131, - "old:virtual_from_version:46243" => 1009, - "old:virtual_from_version:38918" => 1077, - "old:virtual_from_version:13305" => 1063, - "old:virtual_from_version:49044" => 1077, - "old:virtual_from_version:46970" => 1077, - "old:virtual_from_version:39902" => 1125, - "old:virtual_from_version:46923" => 1109, - "old:virtual_from_version:49701" => 1037, - "old:virtual_from_version:46338" => 1110, - "old:virtual_from_version:42136" => 1070, - "old:virtual_from_version:45242" => 1065, - "old:virtual_from_version:39604" => 1109, - "old:virtual_from_version:45677" => 1125, - "old:virtual_from_version:47778" => 1037, - "old:virtual_from_version:46733" => 1077, - "old:virtual_from_version:47564" => 1537, - "old:virtual_from_version:44379" => 1022, - "old:virtual_from_version:49943" => 1150, - "old:virtual_from_version:44021" => 1037, - "old:virtual_from_version:49015" => 1070, - "old:virtual_from_version:47694" => 1070, - "old:virtual_from_version:47091" => 1070, - "old:virtual_from_version:13426" => 1067, - "old:virtual_from_version:47439" => 1621, - "old:virtual_from_version:46784" => 1070, - "old:virtual_from_version:44631" => 1136, - "old:virtual_from_version:46801" => 1659, - "old:virtual_from_version:44477" => 1070, - "old:virtual_from_version:50551" => 1125, - "old:virtual_from_version:45425" => 1070, - "old:virtual_from_version:40305" => 1112, - "old:virtual_from_version:45770" => 1012, - "old:virtual_from_version:40734" => 1016, - "old:virtual_from_version:47017" => 1112, - "old:virtual_from_version:50352" => 1070, - "old:virtual_from_version:44313" => 1037, - "old:virtual_from_version:42338" => 1404, - "old:virtual_from_version:42017" => 1009, - "old:virtual_from_version:49878" => 1314, - "old:virtual_from_version:50083" => 3222, - "old:virtual_from_version:50508" => 1035, - "old:virtual_from_version:49644" => 3186, - "old:virtual_from_version:44451" => 1530, - "old:virtual_from_version:40706" => 1077, - "old:virtual_from_version:45010" => 1150, - "old:virtual_from_version:44457" => 1107, - "old:virtual_from_version:46905" => 1070, - "old:virtual_from_version:47785" => 1070, - "old:virtual_from_version:46321" => 1077, - "old:virtual_from_version:44852" => 1048, - "old:virtual_from_version:44508" => 1321, - "old:virtual_from_version:45055" => 1065, - "old:virtual_from_version:39997" => 1035, - "old:virtual_from_version:42029" => 1222, - "old:virtual_from_version:42663" => 1009, - "old:virtual_from_version:46657" => 1077, - "old:virtual_from_version:46896" => 1353, - "old:virtual_from_version:42507" => 1077, - "old:virtual_from_version:45259" => 1048, - "old:virtual_from_version:42188" => 1172, - "old:virtual_from_version:48019" => 2119, - "old:virtual_from_version:42209" => 1025, - "old:virtual_from_version:46880" => 1397, - "old:virtual_from_version:50465" => 1070, - "old:virtual_from_version:49739" => 1583, - "old:virtual_from_version:45371" => 1314, - "old:virtual_from_version:46171" => 1537, - "old:virtual_from_version:46810" => 1067, - "old:virtual_from_version:45059" => 1067, - "old:virtual_from_version:50217" => 3227, - "old:virtual_from_version:39354" => 1115, - "old:virtual_from_version:49157" => 1070, - "old:virtual_from_version:44322" => 1125, - "old:virtual_from_version:42746" => 1077, - "old:virtual_from_version:45687" => 1615, - "old:virtual_from_version:50597" => 1070, - "old:virtual_from_version:42479" => 1025, - "old:virtual_from_version:49339" => 3136, - "old:virtual_from_version:46926" => 1070, - "old:virtual_from_version:42605" => 1484, - "old:virtual_from_version:42105" => 1077, - "old:virtual_from_version:49476" => 1070, - "old:virtual_from_version:40692" => 1016, - "old:virtual_from_version:49496" => 1507, - "old:virtual_from_version:47003" => 1077, - "old:virtual_from_version:45792" => 1023, - "old:virtual_from_version:50453" => 1150, - "old:virtual_from_version:44890" => 1000, - "old:virtual_from_version:47232" => 1109, - "old:virtual_from_version:46702" => 1009, - "old:virtual_from_version:44378" => 1517, - "old:virtual_from_version:42582" => 1172, - "old:virtual_from_version:46247" => 1077, - "old:virtual_from_version:45161" => 1009, - "old:virtual_from_version:42262" => 1077, - "old:virtual_from_version:44521" => 1067, - "old:virtual_from_version:44338" => 1070, - "old:virtual_from_version:49802" => 3191, - "old:virtual_from_version:47624" => 1084, - "old:virtual_from_version:42423" => 1070, - "old:virtual_from_version:46511" => 1125, - "old:virtual_from_version:46817" => 1070, - "old:virtual_from_version:44284" => 1067, - "old:virtual_from_version:30037" => 1036, - "old:virtual_from_version:50325" => 3237, - "old:virtual_from_version:47149" => 3022, - "old:virtual_from_version:47900" => 1583, - "old:virtual_from_version:46573" => 1077, - "old:virtual_from_version:50411" => 3131, - "old:virtual_from_version:46419" => 1070, - "old:virtual_from_version:38247" => 1025, - "old:virtual_from_version:44690" => 1077, - "old:virtual_from_version:42644" => 1062, - "old:virtual_from_version:38625" => 1125, - "old:virtual_from_version:46666" => 1077, - "old:virtual_from_version:40397" => 1347, - "old:virtual_from_version:39628" => 1012, - "old:virtual_from_version:46331" => 1107, - "old:virtual_from_version:40963" => 1077, - "old:virtual_from_version:46809" => 1070, - "old:virtual_from_version:44106" => 1070, - "old:virtual_from_version:42186" => 1062, - "old:virtual_from_version:49856" => 3131, - "old:virtual_from_version:47556" => 3062, - "old:virtual_from_version:45382" => 1404, - "old:virtual_from_version:46890" => 1067, - "old:virtual_from_version:45818" => 1009, - "old:virtual_from_version:50045" => 3131, - "old:virtual_from_version:50016" => 1100, - "old:virtual_from_version:45003" => 1012, - "old:virtual_from_version:43053" => 2055, - "old:virtual_from_version:45459" => 1109, - "old:virtual_from_version:42689" => 1037, - "old:virtual_from_version:49478" => 1580, - "old:virtual_from_version:42476" => 1070, - "old:virtual_from_version:45717" => 1070, - "old:virtual_from_version:42211" => 1037, - "old:virtual_from_version:44840" => 1009, - "old:virtual_from_version:50601" => 1417, - "old:virtual_from_version:45468" => 1009, - "old:virtual_from_version:42473" => 1105, - "old:virtual_from_version:46330" => 1070, - "old:virtual_from_version:47960" => 1070, - "old:virtual_from_version:38682" => 1404, - "old:virtual_from_version:49560" => 1025, - "old:virtual_from_version:46582" => 1125, - "old:virtual_from_version:42101" => 1070, - "old:virtual_from_version:46508" => 1583, - "old:virtual_from_version:46610" => 1172, - "old:virtual_from_version:50553" => 1070, - "old:virtual_from_version:47056" => 1077, - "old:virtual_from_version:46687" => 1172, - "old:virtual_from_version:47258" => 1587, - "old:virtual_from_version:50617" => 1417, - "old:virtual_from_version:47701" => 1125, - "old:virtual_from_version:40096" => 1067, - "old:virtual_from_version:46861" => 1070, - "old:virtual_from_version:42391" => 1025, - "old:virtual_from_version:44186" => 1107, - "old:virtual_from_version:49218" => 1077, - "old:virtual_from_version:40624" => 1067, - "old:virtual_from_version:42114" => 1070, - "old:virtual_from_version:47530" => 1404, - "old:virtual_from_version:49835" => 3131, - "old:virtual_from_version:47094" => 1009, - "old:virtual_from_version:40877" => 1070, - "old:virtual_from_version:45934" => 1077, - "old:virtual_from_version:44926" => 1067, - "old:virtual_from_version:45884" => 1077, - "old:virtual_from_version:38833" => 1109, - "old:virtual_from_version:49462" => 1580, - "old:virtual_from_version:42016" => 1070, - "old:virtual_from_version:46153" => 1404, - "old:virtual_from_version:40608" => 1381, - "old:virtual_from_version:49882" => 1069, - "old:virtual_from_version:44212" => 1026, - "old:virtual_from_version:40110" => 1009, - "old:virtual_from_version:40910" => 1037, - "old:virtual_from_version:49798" => 1100, - "old:virtual_from_version:42634" => 1037, - "old:virtual_from_version:45477" => 1025, - "old:virtual_from_version:49238" => 1615, - "old:virtual_from_version:49924" => 3186, - "old:virtual_from_version:44275" => 1110, - "old:virtual_from_version:42167" => 1417, - "old:virtual_from_version:49515" => 1105, - "old:virtual_from_version:47662" => 1077, - "old:virtual_from_version:50581" => 1031, - "old:virtual_from_version:40855" => 1070, - "old:virtual_from_version:44965" => 1007, - "old:virtual_from_version:42138" => 1009, - "old:virtual_from_version:43005" => 2030, - "old:virtual_from_version:45342" => 1172, - "old:virtual_from_version:49003" => 1077, - "old:virtual_from_version:50733" => 1006, - "old:virtual_from_version:42751" => 1009, - "old:virtual_from_version:46607" => 1537, - "old:virtual_from_version:44929" => 1070, - "old:virtual_from_version:49228" => 1404, - "old:virtual_from_version:44805" => 1172, - "old:virtual_from_version:44781" => 1077, - "old:virtual_from_version:50350" => 3131, - "old:virtual_from_version:49785" => 1689, - "old:virtual_from_version:42584" => 1008, - "old:virtual_from_version:38347" => 1013, - "old:virtual_from_version:46738" => 1025, - "old:virtual_from_version:41009" => 2020, - "old:virtual_from_version:45082" => 1528, - "old:virtual_from_version:50154" => 1070, - "old:virtual_from_version:50409" => 1585, - "old:virtual_from_version:45754" => 1125, - "old:virtual_from_version:45605" => 1110, - "old:virtual_from_version:49414" => 1109, - "old:virtual_from_version:47100" => 1689, - "old:virtual_from_version:49460" => 1172, - "old:virtual_from_version:44760" => 1009, - "old:virtual_from_version:49576" => 1533, - "old:virtual_from_version:50735" => 1417, - "old:virtual_from_version:44062" => 1077, - "old:virtual_from_version:40403" => 1353, - "old:virtual_from_version:45031" => 1012, - "old:virtual_from_version:47695" => 1109, - "old:virtual_from_version:47329" => 1077, - "old:virtual_from_version:47799" => 1321, - "old:virtual_from_version:40978" => 1048, - "old:virtual_from_version:40386" => 1110, - "old:virtual_from_version:46445" => 1105, - "old:virtual_from_version:49566" => 1381, - "old:virtual_from_version:44024" => 1077, - "old:virtual_from_version:49174" => 1404, - "old:virtual_from_version:42202" => 1077, - "old:virtual_from_version:42278" => 1077, - "old:virtual_from_version:49935" => 1070, - "old:virtual_from_version:46041" => 1488, - "old:virtual_from_version:45482" => 1125, - "old:virtual_from_version:46822" => 1509, - "old:virtual_from_version:43016" => 2041, - "old:virtual_from_version:42179" => 1107, - "old:virtual_from_version:44800" => 1321, - "old:virtual_from_version:42912" => 1035, - "old:virtual_from_version:42567" => 1025, - "old:virtual_from_version:45237" => 1172, - "old:virtual_from_version:50415" => 1037, - "old:virtual_from_version:50166" => 1404, - "old:virtual_from_version:50280" => 1107, - "old:virtual_from_version:45539" => 1025, - "old:virtual_from_version:49232" => 1105, - "old:virtual_from_version:47961" => 1109, - "old:virtual_from_version:46426" => 1077, - "old:virtual_from_version:40942" => 1077, - "old:virtual_from_version:47731" => 1565, - "old:virtual_from_version:46634" => 1070, - "old:virtual_from_version:49603" => 1172, - "old:virtual_from_version:50535" => 1084, - "old:virtual_from_version:46804" => 1125, - "old:virtual_from_version:42759" => 1070, - "old:virtual_from_version:45057" => 1048, - "old:virtual_from_version:3905 " => 1052, - "old:virtual_from_version:44082" => 1070, - "old:virtual_from_version:38434" => 1114, - "old:virtual_from_version:46551" => 1172, - "old:virtual_from_version:40688" => 1076, - "old:virtual_from_version:45789" => 1070, - "old:virtual_from_version:46773" => 1077, - "old:virtual_from_version:43023" => 2048, - "old:virtual_from_version:44375" => 1019, - "old:virtual_from_version:46176" => 1537, - "old:virtual_from_version:45391" => 1051, - "old:virtual_from_version:42481" => 1037, - "old:virtual_from_version:47405" => 1070, - "old:virtual_from_version:50289" => 3222, - "old:virtual_from_version:45854" => 1517, - "old:virtual_from_version:45640" => 1136, - "old:virtual_from_version:49470" => 1136, - "old:virtual_from_version:44224" => 1037, - "old:virtual_from_version:44973" => 1030, - "old:virtual_from_version:50755" => 1070, - "old:virtual_from_version:44242" => 1037, - "old:virtual_from_version:46196" => 1070, - "old:virtual_from_version:44941" => 1005, - "old:virtual_from_version:47075" => 3008, - "old:virtual_from_version:45218" => 1573, - "old:virtual_from_version:50116" => 3191, - "old:virtual_from_version:46170" => 1077, - "old:virtual_from_version:47692" => 1025, - "old:virtual_from_version:46450" => 1048, - "old:virtual_from_version:50444" => 3245, - "old:virtual_from_version:40722" => 1009, - "old:virtual_from_version:50518" => 1311, - "old:virtual_from_version:49472" => 1009, - "old:virtual_from_version:49142" => 1077, - "old:virtual_from_version:46337" => 1070, - "old:virtual_from_version:44426" => 1065, - "old:virtual_from_version:49139" => 1077, - "old:virtual_from_version:45784" => 1029, - "old:virtual_from_version:50662" => 1407, - "old:virtual_from_version:45873" => 1009, - "old:virtual_from_version:49572" => 1158, - "old:virtual_from_version:47869" => 1141, - "old:virtual_from_version:50357" => 1125, - "old:virtual_from_version:49172" => 1172, - "old:virtual_from_version:47644" => 1584, - "old:virtual_from_version:50108" => 1158, - "old:virtual_from_version:42436" => 1025, - "old:virtual_from_version:46267" => 1077, - "old:virtual_from_version:31197" => 1037, - "old:virtual_from_version:46587" => 1006, - "old:virtual_from_version:49712" => 1107, - "old:virtual_from_version:42387" => 1172, - "old:virtual_from_version:42596" => 1067, - "old:virtual_from_version:45828" => 1125, - "old:virtual_from_version:44111" => 1037, - "old:virtual_from_version:40492" => 1037, - "old:virtual_from_version:42534" => 1109, - "old:virtual_from_version:42875" => 1146, - "old:virtual_from_version:47319" => 1659, - "old:virtual_from_version:42166" => 1009, - "old:virtual_from_version:43091" => 2070, - "old:virtual_from_version:50031" => 1007, - "old:virtual_from_version:44134" => 1107, - "old:virtual_from_version:46824" => 1070, - "old:virtual_from_version:40761" => 1077, - "old:virtual_from_version:46269" => 1574, - "old:virtual_from_version:46919" => 1009, - "old:virtual_from_version:46844" => 1172, - "old:virtual_from_version:49180" => 1584, - "old:virtual_from_version:49288" => 3151, - "old:virtual_from_version:47396" => 1037, - "old:virtual_from_version:46997" => 1626, - "old:virtual_from_version:42641" => 1025, - "old:virtual_from_version:45217" => 1572, - "old:virtual_from_version:47722" => 1077, - "old:virtual_from_version:50368" => 1689, - "old:virtual_from_version:50486" => 3234, - "old:virtual_from_version:40575" => 1109, - "old:virtual_from_version:46847" => 1125, - "old:virtual_from_version:47586" => 1125, - "old:virtual_from_version:42182" => 1125, - "old:virtual_from_version:46981" => 1077, - "old:virtual_from_version:42355" => 1051, - "old:virtual_from_version:49893" => 3131, - "old:virtual_from_version:49341" => 1070, - "old:virtual_from_version:42903" => 1077, - "old:virtual_from_version:42991" => 1037, - "old:virtual_from_version:45573" => 1172, - "old:virtual_from_version:50591" => 1070, - "old:virtual_from_version:42977" => 1109, - "old:virtual_from_version:42817" => 1037, - "old:virtual_from_version:42158" => 1070, - "old:virtual_from_version:45450" => 1009, - "old:virtual_from_version:44643" => 1070, - "old:virtual_from_version:50429" => 1076, - "old:virtual_from_version:38535" => 1070, - "old:virtual_from_version:47888" => 1070, - "old:virtual_from_version:38885" => 1136, - "old:virtual_from_version:50195" => 1070, - "old:virtual_from_version:46185" => 1070, - "old:virtual_from_version:45872" => 1067, - "old:virtual_from_version:46026" => 1077, - "old:virtual_from_version:50635" => 3269, - "old:virtual_from_version:49824" => 3120, - "old:virtual_from_version:42329" => 1051, - "old:virtual_from_version:47081" => 1585, - "old:virtual_from_version:45705" => 1077, - "old:virtual_from_version:47456" => 1321, - "old:virtual_from_version:38841" => 1094, - "old:virtual_from_version:49917" => 3131, - "old:virtual_from_version:46427" => 1537, - "old:virtual_from_version:50603" => 1587, - "old:virtual_from_version:47438" => 1381, - "old:virtual_from_version:50511" => 3247, - "old:virtual_from_version:40286" => 1172, - "old:virtual_from_version:42670" => 1037, - "old:virtual_from_version:42074" => 1110, - "old:virtual_from_version:38442" => 1404, - "old:virtual_from_version:44452" => 1527, - "old:virtual_from_version:40566" => 1070, - "old:virtual_from_version:49773" => 3197, - "old:virtual_from_version:50546" => 3201, - "old:virtual_from_version:45043" => 1027, - "old:virtual_from_version:42709" => 1009, - "old:virtual_from_version:39312" => 1070, - "old:virtual_from_version:46924" => 1077, - "old:virtual_from_version:42766" => 1107, - "old:virtual_from_version:50731" => 1070, - "old:virtual_from_version:46669" => 1077, - "old:virtual_from_version:45231" => 1576, - "old:virtual_from_version:35686" => 1101, - "old:virtual_from_version:44592" => 1107, - "old:virtual_from_version:47811" => 3094, - "old:virtual_from_version:46112" => 1077, - "old:virtual_from_version:49312" => 1150, - "old:virtual_from_version:49645" => 3183, - "old:virtual_from_version:44887" => 1009, - "old:virtual_from_version:49501" => 1125, - "old:virtual_from_version:49466" => 1009, - "old:virtual_from_version:42671" => 1488, - "old:virtual_from_version:50717" => 1105, - "old:virtual_from_version:40883" => 1067, - "old:virtual_from_version:13410" => 1065, - "old:virtual_from_version:50401" => 3227, - "old:virtual_from_version:49753" => 3194, - "old:virtual_from_version:46564" => 1077, - "old:virtual_from_version:39371" => 1144, - "old:virtual_from_version:49173" => 1077, - "old:virtual_from_version:46433" => 1025, - "old:virtual_from_version:44250" => 1025, - "old:virtual_from_version:50131" => 1172, - "old:virtual_from_version:46236" => 1574, - "old:virtual_from_version:44433" => 1070, - "old:virtual_from_version:44368" => 1010, - "old:virtual_from_version:47562" => 1077, - "old:virtual_from_version:46114" => 1461, - "old:virtual_from_version:44092" => 1067, - "old:virtual_from_version:42895" => 1109, - "old:virtual_from_version:46221" => 1070, - "old:virtual_from_version:49179" => 1583, - "old:virtual_from_version:44563" => 1077, - "old:virtual_from_version:49404" => 1105, - "old:virtual_from_version:42837" => 1497, - "old:virtual_from_version:46831" => 1110, - "old:virtual_from_version:40703" => 1070, - "old:virtual_from_version:50701" => 3272, - "old:virtual_from_version:50575" => 1125, - "old:virtual_from_version:44638" => 1009, - "old:virtual_from_version:50665" => 1555, - "old:virtual_from_version:42976" => 1037, - "old:virtual_from_version:49436" => 1580, - "old:virtual_from_version:42034" => 1112, - "old:virtual_from_version:44046" => 1009, - "old:virtual_from_version:47611" => 1070, - "old:virtual_from_version:49622" => 1532, - "old:virtual_from_version:50365" => 3240, - "old:virtual_from_version:44419" => 1077, - "old:virtual_from_version:47150" => 3028, - "old:virtual_from_version:50670" => 3208, - "old:virtual_from_version:49323" => 3136, - "old:virtual_from_version:45612" => 1172, - "old:virtual_from_version:46843" => 1067, - "old:virtual_from_version:47661" => 1109, - "old:virtual_from_version:44091" => 1109, - "old:virtual_from_version:44947" => 1094, - "old:virtual_from_version:50541" => 1580, - "old:virtual_from_version:46914" => 3007, - "old:virtual_from_version:50530" => 1125, - "old:virtual_from_version:40886" => 1070, - "old:virtual_from_version:50322" => 1311, - "old:virtual_from_version:42457" => 1035, - "old:virtual_from_version:42220" => 1077, - "old:virtual_from_version:44096" => 1077, - "old:virtual_from_version:46524" => 1107, - "old:virtual_from_version:50006" => 3131, - "old:virtual_from_version:45883" => 1009, - "old:virtual_from_version:42362" => 1070, - "old:virtual_from_version:42892" => 1025, - "old:virtual_from_version:42472" => 1048, - "old:virtual_from_version:45393" => 1404, - "old:virtual_from_version:43054" => 2056, - "old:virtual_from_version:49850" => 1172, - "old:virtual_from_version:44191" => 1037, - "old:virtual_from_version:42764" => 1494, - "old:virtual_from_version:47029" => 3008, - "old:virtual_from_version:46367" => 1444, - "old:virtual_from_version:42295" => 1427, - "old:virtual_from_version:46562" => 1125, - "old:virtual_from_version:46530" => 1091, - "old:virtual_from_version:50507" => 3261, - "old:virtual_from_version:45441" => 1062, - "old:virtual_from_version:44318" => 1520, - "old:virtual_from_version:46195" => 1630, - "old:virtual_from_version:50604" => 1689, - "old:virtual_from_version:44358" => 1125, - "old:virtual_from_version:47306" => 3042, - "old:virtual_from_version:44494" => 1070, - "old:virtual_from_version:45544" => 1076, - "old:virtual_from_version:45718" => 1007, - "old:virtual_from_version:47455" => 3043, - "old:virtual_from_version:49635" => 3139, - "old:virtual_from_version:40711" => 1025, - "old:virtual_from_version:45463" => 1404, - "old:virtual_from_version:45903" => 1632, - "old:virtual_from_version:50118" => 1070, - "old:virtual_from_version:45700" => 1019, - "old:virtual_from_version:43062" => 2063, - "old:virtual_from_version:46279" => 1077, - "old:virtual_from_version:49274" => 1077, - "old:virtual_from_version:40791" => 1370, - "old:virtual_from_version:49787" => 3194, - "old:virtual_from_version:40861" => 1070, - "old:virtual_from_version:42439" => 1037, - "old:virtual_from_version:50129" => 3224, - "old:virtual_from_version:47592" => 1077, - "old:virtual_from_version:42974" => 1025, - "old:virtual_from_version:46160" => 1659, - "old:virtual_from_version:50073" => 3221, - "old:virtual_from_version:49050" => 1689, - "old:virtual_from_version:42651" => 1487, - "old:virtual_from_version:46525" => 1048, - "old:virtual_from_version:44502" => 1009, - "old:virtual_from_version:42798" => 1110, - "old:virtual_from_version:47126" => 1444, - "old:virtual_from_version:45006" => 1077, - "old:virtual_from_version:40287" => 1107, - "old:virtual_from_version:39235" => 1061, - "old:virtual_from_version:44894" => 1125, - "old:virtual_from_version:42297" => 1429, - "old:virtual_from_version:10003" => 2002, - "old:virtual_from_version:49201" => 1070, - "old:virtual_from_version:47092" => 1125, - "old:virtual_from_version:49574" => 1158, - "old:virtual_from_version:46109" => 1077, - "old:virtual_from_version:47127" => 1585, - "old:virtual_from_version:42384" => 1077, - "old:virtual_from_version:43050" => 2020, - "old:virtual_from_version:45881" => 1630, - "old:virtual_from_version:40642" => 1393, - "old:virtual_from_version:47241" => 1109, - "old:virtual_from_version:46072" => 1077, - "old:virtual_from_version:45037" => 1115, - "old:virtual_from_version:39709" => 1110, - "old:virtual_from_version:44463" => 1048, - "old:virtual_from_version:42455" => 1114, - "old:virtual_from_version:45134" => 1009, - "old:virtual_from_version:38631" => 1126, - "old:virtual_from_version:47464" => 3008, - "old:virtual_from_version:47909" => 3006, - "old:virtual_from_version:50146" => 3058, - "old:virtual_from_version:47104" => 1077, - "old:virtual_from_version:50655" => 1555, - "old:virtual_from_version:49717" => 1006, - "old:virtual_from_version:49206" => 1136, - "old:virtual_from_version:50724" => 1666, - "old:virtual_from_version:45551" => 1077, - "old:virtual_from_version:49735" => 3194, - "old:virtual_from_version:47177" => 1638, - "old:virtual_from_version:46910" => 1077, - "old:virtual_from_version:44314" => 1062, - "old:virtual_from_version:46025" => 1067, - "old:virtual_from_version:46745" => 1070, - "old:virtual_from_version:50215" => 3131, - "old:virtual_from_version:46103" => 1077, - "old:virtual_from_version:42463" => 1009, - "old:virtual_from_version:42053" => 1110, - "old:virtual_from_version:46770" => 1070, - "old:virtual_from_version:39952" => 1107, - "old:virtual_from_version:49726" => 1404, - "old:virtual_from_version:42204" => 1070, - "old:virtual_from_version:49883" => 1444, - "old:virtual_from_version:50305" => 1067, - "old:virtual_from_version:47892" => 1699, - "old:virtual_from_version:45631" => 1136, - "old:virtual_from_version:50547" => 3227, - "old:virtual_from_version:42496" => 1067, - "old:virtual_from_version:49299" => 3008, - "old:virtual_from_version:42279" => 1037, - "old:virtual_from_version:47842" => 3094, - "old:virtual_from_version:40568" => 1077, - "old:virtual_from_version:49289" => 3146, - "old:virtual_from_version:47896" => 1125, - "old:virtual_from_version:50550" => 3259, - "old:virtual_from_version:50460" => 1580, - "old:virtual_from_version:44487" => 1007, - "old:virtual_from_version:45087" => 1565, - "old:virtual_from_version:42394" => 1067, - "old:virtual_from_version:50019" => 3131, - "old:virtual_from_version:44702" => 1037, - "old:virtual_from_version:49536" => 1105, - "old:virtual_from_version:45514" => 1077, - "old:virtual_from_version:44437" => 1109, - "old:virtual_from_version:38857" => 1404, - "old:virtual_from_version:42923" => 1077, - "old:virtual_from_version:40989" => 1037, - "old:virtual_from_version:42161" => 1057, - "old:virtual_from_version:47539" => 1077, - "old:virtual_from_version:49654" => 1489, - "old:virtual_from_version:47596" => 1125, - "old:virtual_from_version:46931" => 1105, - "old:virtual_from_version:39706" => 1077, - "old:virtual_from_version:39537" => 1172, - "old:virtual_from_version:46425" => 1112, - "old:virtual_from_version:49981" => 1314, - "old:virtual_from_version:46697" => 1077, - "old:virtual_from_version:45834" => 1621, - "old:virtual_from_version:39274" => 1107, - "old:virtual_from_version:49642" => 1069, - "old:virtual_from_version:44689" => 1025, - "old:virtual_from_version:47382" => 1125, - "old:virtual_from_version:46095" => 1136, - "old:virtual_from_version:46216" => 1077, - "old:virtual_from_version:47039" => 1070, - "old:virtual_from_version:46677" => 1070, - "old:virtual_from_version:42834" => 1418, - "old:virtual_from_version:49618" => 3184, - "old:virtual_from_version:49806" => 3131, - "old:virtual_from_version:40514" => 1048, - "old:virtual_from_version:47059" => 1065, - "old:virtual_from_version:45086" => 1077, - "old:virtual_from_version:45885" => 1070, - "old:virtual_from_version:46848" => 1067, - "old:virtual_from_version:49122" => 1105, - "old:virtual_from_version:46819" => 1077, - "old:virtual_from_version:29531" => 1083, - "old:virtual_from_version:45380" => 1009, - "old:virtual_from_version:40737" => 1081, - "old:virtual_from_version:47276" => 1689, - "old:virtual_from_version:45931" => 1070, - "old:virtual_from_version:44559" => 1037, - "old:virtual_from_version:45796" => 1027, - "old:virtual_from_version:43018" => 2043, - "old:virtual_from_version:42868" => 1067, - "old:virtual_from_version:42283" => 1425, - "old:virtual_from_version:46256" => 1077, - "old:virtual_from_version:44073" => 1107, - "old:virtual_from_version:44860" => 1553, - "old:virtual_from_version:47489" => 1077, - "old:virtual_from_version:44042" => 1037, - "old:virtual_from_version:47957" => 1689, - "old:virtual_from_version:46803" => 1070, - "old:virtual_from_version:38996" => 1078, - "old:virtual_from_version:47054" => 1015, - "old:virtual_from_version:50055" => 1006, - "old:virtual_from_version:42210" => 1077, - "old:virtual_from_version:42784" => 1037, - "old:virtual_from_version:42898" => 1077, - "old:virtual_from_version:47537" => 1109, - "old:virtual_from_version:45577" => 1404, - "old:virtual_from_version:44098" => 1067, - "old:virtual_from_version:47616" => 1537, - "old:virtual_from_version:42866" => 1037, - "old:virtual_from_version:42245" => 1077, - "old:virtual_from_version:42772" => 1077, - "old:virtual_from_version:44716" => 1076, - "old:virtual_from_version:44745" => 1006, - "old:virtual_from_version:44540" => 1009, - "old:virtual_from_version:46932" => 1077, - "old:virtual_from_version:43047" => 2003, - "old:virtual_from_version:47806" => 1105, - "old:virtual_from_version:47014" => 1070, - "old:virtual_from_version:50007" => 3215, - "old:virtual_from_version:46501" => 1537, - "old:virtual_from_version:47225" => 1689, - "old:virtual_from_version:49895" => 1069, - "old:virtual_from_version:42377" => 1037, - "old:virtual_from_version:47236" => 1109, - "old:virtual_from_version:45090" => 1517, - "old:virtual_from_version:46627" => 1077, - "old:virtual_from_version:49615" => 1404, - "old:virtual_from_version:46148" => 1070, - "old:virtual_from_version:44567" => 1009, - "old:virtual_from_version:44203" => 1067, - "old:virtual_from_version:44273" => 1077, - "old:virtual_from_version:42978" => 1067, - "old:virtual_from_version:47510" => 1077, - "old:virtual_from_version:45029" => 1010, - "old:virtual_from_version:44627" => 1077, - "old:virtual_from_version:44083" => 1009, - "old:virtual_from_version:45547" => 1070, - "old:virtual_from_version:45103" => 1077, - "old:virtual_from_version:44548" => 1037, - "old:virtual_from_version:47214" => 1172, - "old:virtual_from_version:42155" => 1077, - "old:virtual_from_version:40488" => 1037, - "old:virtual_from_version:46464" => 1362, - "old:virtual_from_version:38949" => 1070, - "old:virtual_from_version:49816" => 1057, - "old:virtual_from_version:46717" => 1697, - "old:virtual_from_version:46238" => 1659, - "old:virtual_from_version:47545" => 1070, - "old:virtual_from_version:47114" => 3020, - "old:virtual_from_version:45591" => 1136, - "old:virtual_from_version:40525" => 1077, - "old:virtual_from_version:42025" => 1109, - "old:virtual_from_version:50010" => 1012, - "old:virtual_from_version:42771" => 1025, - "old:virtual_from_version:42807" => 1025, - "old:virtual_from_version:40794" => 1069, - "old:virtual_from_version:46423" => 1070, - "old:virtual_from_version:38417" => 1077, - "old:virtual_from_version:42183" => 1077, - "old:virtual_from_version:39575" => 1110, - "old:virtual_from_version:45923" => 1048, - "old:virtual_from_version:50459" => 1532, - "old:virtual_from_version:50056" => 3131, - "old:virtual_from_version:49906" => 3078, - "old:virtual_from_version:50001" => 1689, - "old:virtual_from_version:39148" => 1077, - "old:virtual_from_version:49459" => 1062, - "old:virtual_from_version:44809" => 1070, - "old:virtual_from_version:42792" => 1070, - "old:virtual_from_version:45656" => 1076, - "old:virtual_from_version:49926" => 3209, - "old:virtual_from_version:46310" => 1025, - "old:virtual_from_version:42879" => 1009, - "old:virtual_from_version:42840" => 1009, - "old:virtual_from_version:44722" => 1067, - "old:virtual_from_version:50420" => 1037, - "old:virtual_from_version:47403" => 1697, - "old:virtual_from_version:46789" => 1125, - "old:virtual_from_version:50042" => 1009, - "old:virtual_from_version:40945" => 1009, - "old:virtual_from_version:42462" => 1007, - "old:virtual_from_version:50372" => 3008, - "old:virtual_from_version:46198" => 1404, - "old:virtual_from_version:46384" => 1402, - "old:virtual_from_version:42995" => 1070, - "old:virtual_from_version:47067" => 1070, - "old:virtual_from_version:47132" => 1125, - "old:virtual_from_version:40483" => 1369, - "old:virtual_from_version:40844" => 1410, - "old:virtual_from_version:40823" => 1067, - "old:virtual_from_version:42593" => 1077, - "old:virtual_from_version:47703" => 1077, - "old:virtual_from_version:49161" => 1077, - "old:virtual_from_version:39903" => 1077, - "old:virtual_from_version:46715" => 1077, - "old:virtual_from_version:46639" => 1070, - "old:virtual_from_version:45495" => 1136, - "old:virtual_from_version:40196" => 1007, - "old:virtual_from_version:47333" => 1077, - "old:virtual_from_version:42905" => 1109, - "old:virtual_from_version:44440" => 1070, - "old:virtual_from_version:44441" => 1009, - "old:virtual_from_version:47933" => 1077, - "old:virtual_from_version:42779" => 1077, - "old:virtual_from_version:49938" => 1125, - "old:virtual_from_version:46840" => 1025, - "old:virtual_from_version:44741" => 1070, - "old:virtual_from_version:44784" => 1025, - "old:virtual_from_version:14391" => 1068, - "old:virtual_from_version:42067" => 1025, - "old:virtual_from_version:47363" => 1025, - "old:virtual_from_version:45636" => 1172, - "old:virtual_from_version:49166" => 1125, - "old:virtual_from_version:45323" => 1110, - "old:virtual_from_version:47829" => 1037, - "old:virtual_from_version:46754" => 1070, - "old:virtual_from_version:47776" => 1070, - "old:virtual_from_version:45782" => 1587, - "old:virtual_from_version:50178" => 1172, - "old:virtual_from_version:44309" => 1009, - "old:virtual_from_version:39885" => 1136, - "old:virtual_from_version:50272" => 3131, - "old:virtual_from_version:42356" => 1070, - "old:virtual_from_version:45617" => 1172, - "old:virtual_from_version:44568" => 1517, - "old:virtual_from_version:46212" => 1070, - "old:virtual_from_version:46289" => 1107, - "old:virtual_from_version:40862" => 1077, - "old:virtual_from_version:47506" => 1070, - "old:virtual_from_version:46462" => 1125, - "old:virtual_from_version:45084" => 1070, - "old:virtual_from_version:39476" => 1081, - "old:virtual_from_version:46352" => 1190, - "old:virtual_from_version:50268" => 1488, - "old:virtual_from_version:47242" => 1077, - "old:virtual_from_version:45442" => 1150, - "old:virtual_from_version:44724" => 1539, - "old:virtual_from_version:47281" => 1172, - "old:virtual_from_version:40594" => 1070, - "old:virtual_from_version:46941" => 1125, - "old:virtual_from_version:46411" => 1070, - "old:virtual_from_version:46086" => 1017, - "old:virtual_from_version:44647" => 1077, - "old:virtual_from_version:50307" => 3131, - "old:virtual_from_version:44787" => 1057, - "old:virtual_from_version:42208" => 1070, - "old:virtual_from_version:13404" => 1047, - "old:virtual_from_version:50026" => 1125, - "old:virtual_from_version:44856" => 1070, - "old:virtual_from_version:44171" => 1070, - "old:virtual_from_version:49974" => 3120, - "old:virtual_from_version:44124" => 1107, - "old:virtual_from_version:50738" => 1689, - "old:virtual_from_version:42870" => 1025, - "old:virtual_from_version:46446" => 1537, - "old:virtual_from_version:40478" => 1070, - "old:virtual_from_version:42413" => 1037, - "old:virtual_from_version:50680" => 1583, - "old:virtual_from_version:49439" => 1070, - "old:virtual_from_version:50467" => 3009, - "old:virtual_from_version:44337" => 1081, - "old:virtual_from_version:42853" => 1504, - "old:virtual_from_version:49291" => 1649, - "old:virtual_from_version:45812" => 1574, - "old:virtual_from_version:45565" => 1404, - "old:virtual_from_version:46515" => 1070, - "old:virtual_from_version:49499" => 3078, - "old:virtual_from_version:46085" => 1070, - "old:virtual_from_version:42196" => 1070, - "old:virtual_from_version:45534" => 1489, - "old:virtual_from_version:44029" => 1070, - "old:virtual_from_version:44087" => 1009, - "old:virtual_from_version:45034" => 1064, - "old:virtual_from_version:50048" => 1444, - "old:virtual_from_version:46992" => 1025, - "old:virtual_from_version:45042" => 1025, - "old:virtual_from_version:47243" => 1070, - "old:virtual_from_version:49453" => 1444, - "old:virtual_from_version:40536" => 1070, - "old:virtual_from_version:45045" => 1077, - "old:virtual_from_version:45395" => 1112, - "old:virtual_from_version:42367" => 1413, - "old:virtual_from_version:46424" => 1125, - "old:virtual_from_version:40966" => 1048, - "old:virtual_from_version:42777" => 1070, - "old:virtual_from_version:49380" => 1077, - "old:virtual_from_version:46476" => 1009, - "old:virtual_from_version:46636" => 1067, - "old:virtual_from_version:38617" => 1123, - "old:virtual_from_version:44744" => 1070, - "old:virtual_from_version:40749" => 1077, - "old:virtual_from_version:47630" => 1109, - "old:virtual_from_version:40738" => 1048, - "old:virtual_from_version:47169" => 3031, - "old:virtual_from_version:46549" => 1125, - "old:virtual_from_version:45594" => 1009, - "old:virtual_from_version:40969" => 1009, - "old:virtual_from_version:49099" => 3136, - "old:virtual_from_version:38342" => 1006, - "old:virtual_from_version:44857" => 1077, - "old:virtual_from_version:49693" => 1078, - "old:virtual_from_version:44581" => 1009, - "old:virtual_from_version:44905" => 1555, - "old:virtual_from_version:44574" => 1070, - "old:virtual_from_version:39605" => 1067, - "old:virtual_from_version:44590" => 1037, - "old:virtual_from_version:45317" => 1125, - "old:virtual_from_version:50686" => 3259, - "old:virtual_from_version:49236" => 1070, - "old:virtual_from_version:42732" => 1037, - "old:virtual_from_version:44370" => 1012, - "old:virtual_from_version:42831" => 1077, - "old:virtual_from_version:49220" => 1314, - "old:virtual_from_version:47988" => 1009, - "old:virtual_from_version:50061" => 1019, - "old:virtual_from_version:42712" => 1311, - "old:virtual_from_version:50279" => 3131, - "old:virtual_from_version:46838" => 1172, - "old:virtual_from_version:49626" => 1158, - "old:virtual_from_version:44535" => 1077, - "old:virtual_from_version:47951" => 3124, - "old:virtual_from_version:40394" => 1136, - "old:virtual_from_version:40294" => 1321, - "old:virtual_from_version:45505" => 1580, - "old:virtual_from_version:45953" => 1108, - "old:virtual_from_version:50253" => 1489, - "old:virtual_from_version:40691" => 1009, - "old:virtual_from_version:50587" => 1417, - "old:virtual_from_version:45007" => 1031, - "old:virtual_from_version:50269" => 1078, - "old:virtual_from_version:47293" => 1105, - "old:virtual_from_version:40292" => 1048, - "old:virtual_from_version:45460" => 1067, - "old:virtual_from_version:42020" => 1037, - "old:virtual_from_version:49903" => 1404, - "old:virtual_from_version:46390" => 1172, - "old:virtual_from_version:46277" => 1070, - "old:virtual_from_version:46181" => 1537, - "old:virtual_from_version:49117" => 1037, - "old:virtual_from_version:42698" => 1037, - "old:virtual_from_version:42228" => 1419, - "old:virtual_from_version:44539" => 1070, - "old:virtual_from_version:50421" => 1314, - "old:virtual_from_version:42416" => 1070, - "old:virtual_from_version:46252" => 1665, - "old:virtual_from_version:40830" => 1077, - "old:virtual_from_version:46316" => 1613, - "old:virtual_from_version:46033" => 1410, - "old:virtual_from_version:49241" => 1532, - "old:virtual_from_version:45827" => 1362, - "old:virtual_from_version:47257" => 1517, - "old:virtual_from_version:46913" => 3007, - "old:virtual_from_version:47080" => 1584, - "old:virtual_from_version:47270" => 1037, - "old:virtual_from_version:50167" => 1413, - "old:virtual_from_version:44189" => 1025, - "old:virtual_from_version:44899" => 1123, - "old:virtual_from_version:42804" => 1070, - "old:virtual_from_version:44917" => 1070, - "old:virtual_from_version:46281" => 1077, - "old:virtual_from_version:49348" => 3139, - "old:virtual_from_version:44799" => 1321, - "old:virtual_from_version:45305" => 1125, - "old:virtual_from_version:44661" => 1077, - "old:virtual_from_version:50754" => 3186, - "old:virtual_from_version:44434" => 1009, - "old:virtual_from_version:50104" => 1222, - "old:virtual_from_version:49544" => 1404, - "old:virtual_from_version:47037" => 1689, - "old:virtual_from_version:50657" => 1009, - "old:virtual_from_version:45859" => 1077, - "old:virtual_from_version:49766" => 1077, - "old:virtual_from_version:49147" => 1532, - "old:virtual_from_version:40746" => 1070, - "old:virtual_from_version:47217" => 1689, - "old:virtual_from_version:50539" => 1404, - "old:virtual_from_version:49751" => 1006, - "old:virtual_from_version:42588" => 1062, - "old:virtual_from_version:49984" => 1070, - "old:virtual_from_version:47034" => 1555, - "old:virtual_from_version:40895" => 1110, - "old:virtual_from_version:46584" => 1689, - "old:virtual_from_version:48027" => 2025, - "old:virtual_from_version:33505" => 1081, - "old:virtual_from_version:40922" => 1037, - "old:virtual_from_version:47917" => 1109, - "old:virtual_from_version:41007" => 2018, - "old:virtual_from_version:40253" => 1110, - "old:virtual_from_version:38358" => 1040, - "old:virtual_from_version:45258" => 1081, - "old:virtual_from_version:47985" => 1125, - "old:virtual_from_version:44552" => 1107, - "old:virtual_from_version:45053" => 1110, - "old:virtual_from_version:40804" => 1025, - "old:virtual_from_version:44765" => 1015, - "old:virtual_from_version:49072" => 1083, - "old:virtual_from_version:44891" => 1070, - "old:virtual_from_version:48014" => 2114, - "old:virtual_from_version:13342" => 1064, - "old:virtual_from_version:47890" => 1109, - "old:virtual_from_version:46206" => 1633, - "old:virtual_from_version:46655" => 1007, - "old:virtual_from_version:49467" => 1689, - "old:virtual_from_version:38436" => 1006, - "old:virtual_from_version:45548" => 1109, - "old:virtual_from_version:42867" => 1109, - "old:virtual_from_version:40179" => 1015, - "old:virtual_from_version:47245" => 1037, - "old:virtual_from_version:50306" => 1404, - "old:virtual_from_version:47264" => 1689, - "old:virtual_from_version:46556" => 1125, - "old:virtual_from_version:40238" => 1144, - "old:virtual_from_version:47262" => 1009, - "old:virtual_from_version:47302" => 1580, - "old:virtual_from_version:47320" => 1070, - "old:virtual_from_version:46098" => 1649, - "old:virtual_from_version:47552" => 1105, - "old:virtual_from_version:47078" => 1077, - "old:virtual_from_version:46594" => 1172, - "old:virtual_from_version:38800" => 1110, - "old:virtual_from_version:39510" => 1070, - "old:virtual_from_version:47206" => 1109, - "old:virtual_from_version:44207" => 1107, - "old:virtual_from_version:44323" => 1070, - "old:virtual_from_version:42688" => 1077, - "old:virtual_from_version:49755" => 1070, - "old:virtual_from_version:46930" => 1051, - "old:virtual_from_version:42603" => 1105, - "old:virtual_from_version:45735" => 1077, - "old:virtual_from_version:46081" => 1415, - "old:virtual_from_version:46001" => 1649, - "old:virtual_from_version:47151" => 1007, - "old:virtual_from_version:45266" => 1027, - "old:virtual_from_version:47674" => 1109, - "old:virtual_from_version:40563" => 1077, - "old:virtual_from_version:46179" => 1077, - "old:virtual_from_version:45318" => 1009, - "old:virtual_from_version:44547" => 1077, - "old:virtual_from_version:46410" => 1676, - "old:virtual_from_version:44352" => 1037, - "old:virtual_from_version:40739" => 1084, - "old:virtual_from_version:40531" => 1077, - "old:virtual_from_version:46978" => 1037, - "old:virtual_from_version:46347" => 1555, - "old:virtual_from_version:50523" => 1016, - "old:virtual_from_version:42946" => 1037, - "old:virtual_from_version:45137" => 1057, - "old:virtual_from_version:47634" => 1585, - "old:virtual_from_version:49687" => 1009, - "old:virtual_from_version:50071" => 3131, - "old:virtual_from_version:40473" => 1037, - "old:virtual_from_version:47348" => 1109, - "old:virtual_from_version:49834" => 3120, - "old:virtual_from_version:44005" => 1500, - "old:virtual_from_version:42041" => 1172, - "old:virtual_from_version:46645" => 1537, - "old:virtual_from_version:49235" => 1689, - "old:virtual_from_version:49114" => 1070, - "old:virtual_from_version:42872" => 1037, - "old:virtual_from_version:49435" => 1555, - "old:virtual_from_version:46865" => 3004, - "old:virtual_from_version:42277" => 1069, - "old:virtual_from_version:46595" => 1077, - "old:virtual_from_version:45096" => 1517, - "old:virtual_from_version:49227" => 1077, - "old:virtual_from_version:42065" => 1048, - "old:virtual_from_version:49690" => 1489, - "old:virtual_from_version:39531" => 1069, - "old:virtual_from_version:49149" => 1007, - "old:virtual_from_version:49779" => 1404, - "old:virtual_from_version:46326" => 1062, - "old:virtual_from_version:44963" => 1065, - "old:virtual_from_version:49945" => 1025, - "old:virtual_from_version:50032" => 1070, - "old:virtual_from_version:46137" => 1077, - "old:virtual_from_version:50679" => 1417, - "old:virtual_from_version:46011" => 1109, - "old:virtual_from_version:47446" => 1621, - "old:virtual_from_version:44371" => 1015, - "old:virtual_from_version:49276" => 1616, - "old:virtual_from_version:46030" => 1062, - "old:virtual_from_version:47885" => 1077, - "old:virtual_from_version:47542" => 1109, - "old:virtual_from_version:45430" => 1009, - "old:virtual_from_version:45795" => 1109, - "old:virtual_from_version:49119" => 1109, - "old:virtual_from_version:40721" => 1070, - "old:virtual_from_version:46389" => 1112, - "old:virtual_from_version:47557" => 1070, - "old:virtual_from_version:43015" => 2040, - "old:virtual_from_version:45047" => 1036, - "old:virtual_from_version:40783" => 1048, - "old:virtual_from_version:47927" => 1659, - "old:virtual_from_version:49332" => 1077, - "old:virtual_from_version:46219" => 1077, - "old:virtual_from_version:40921" => 1077, - "old:virtual_from_version:47851" => 1583, - "old:virtual_from_version:45916" => 1109, - "old:virtual_from_version:40521" => 1105, - "old:virtual_from_version:45897" => 1077, - "old:virtual_from_version:43046" => 2000, - "old:virtual_from_version:47597" => 1109, - "old:virtual_from_version:45481" => 1070, - "old:virtual_from_version:46065" => 1070, - "old:virtual_from_version:42193" => 1070, - "old:virtual_from_version:42594" => 1037, - "old:virtual_from_version:40889" => 1025, - "old:virtual_from_version:42715" => 1009, - "old:virtual_from_version:46039" => 1410, - "old:virtual_from_version:50255" => 3131, - "old:virtual_from_version:49030" => 1649, - "old:virtual_from_version:50586" => 1032, - "old:virtual_from_version:40914" => 1077, - "old:virtual_from_version:44163" => 1110, - "old:virtual_from_version:46303" => 1425, - "old:virtual_from_version:44558" => 1077, - "old:virtual_from_version:45910" => 1404, - "old:virtual_from_version:42625" => 1037, - "old:virtual_from_version:47478" => 1077, - "old:virtual_from_version:50127" => 1689, - "old:virtual_from_version:50627" => 1407, - "old:virtual_from_version:44039" => 1009, - "old:virtual_from_version:46500" => 1136, - "old:virtual_from_version:46399" => 1077, - "old:virtual_from_version:47030" => 1070, - "old:virtual_from_version:44359" => 1000, - "old:virtual_from_version:47461" => 1444, - "old:virtual_from_version:50567" => 1125, - "old:virtual_from_version:46656" => 1070, - "old:virtual_from_version:50231" => 1005, - "old:virtual_from_version:45428" => 1109, - "old:virtual_from_version:49027" => 3131, - "old:virtual_from_version:47440" => 1070, - "old:virtual_from_version:50393" => 3131, - "old:virtual_from_version:38348" => 1014, - "old:virtual_from_version:45370" => 1407, - "old:virtual_from_version:46983" => 1584, - "old:virtual_from_version:40806" => 1136, - "old:virtual_from_version:50218" => 3008, - "old:virtual_from_version:40009" => 1192, - "old:virtual_from_version:47598" => 1077, - "old:virtual_from_version:47479" => 1381, - "old:virtual_from_version:50275" => 3231, - "old:virtual_from_version:43084" => 2081, - "old:virtual_from_version:49204" => 1077, - "old:virtual_from_version:46449" => 1532, - "old:virtual_from_version:44704" => 1540, - "old:virtual_from_version:49896" => 3131, - "old:virtual_from_version:47899" => 1077, - "old:virtual_from_version:40897" => 1070, - "old:virtual_from_version:46873" => 1410, - "old:virtual_from_version:44605" => 1025, - "old:virtual_from_version:46361" => 1070, - "old:virtual_from_version:43049" => 2019, - "old:virtual_from_version:45579" => 1172, - "old:virtual_from_version:42123" => 1172, - "old:virtual_from_version:47032" => 1172, - "old:virtual_from_version:45951" => 1533, - "old:virtual_from_version:44876" => 1067, - "old:virtual_from_version:45327" => 1125, - "old:virtual_from_version:40808" => 1007, - "old:virtual_from_version:46406" => 1025, - "old:virtual_from_version:47277" => 1125, - "old:virtual_from_version:46313" => 1537, - "old:virtual_from_version:49995" => 1404, - "old:virtual_from_version:46519" => 1025, - "old:virtual_from_version:42232" => 1070, - "old:virtual_from_version:42610" => 1037, - "old:virtual_from_version:50722" => 1084, - "old:virtual_from_version:49046" => 1583, - "old:virtual_from_version:46614" => 1070, - "old:virtual_from_version:42981" => 1077, - "old:virtual_from_version:40713" => 1048, - "old:virtual_from_version:47536" => 1125, - "old:virtual_from_version:40881" => 1110, - "old:virtual_from_version:45026" => 1007, - "old:virtual_from_version:44344" => 1081, - "old:virtual_from_version:50703" => 1172, - "old:virtual_from_version:42819" => 1501, - "old:virtual_from_version:49259" => 1404, - "old:virtual_from_version:45310" => 1580, - "old:virtual_from_version:45152" => 1107, - "old:virtual_from_version:44771" => 1070, - "old:virtual_from_version:45645" => 1077, - "old:virtual_from_version:47284" => 3009, - "old:virtual_from_version:46191" => 1070, - "old:virtual_from_version:50538" => 1402, - "old:virtual_from_version:36622" => 1008, - "old:virtual_from_version:42137" => 1007, - "old:virtual_from_version:47991" => 1070, - "old:virtual_from_version:44823" => 1349, - "old:virtual_from_version:42124" => 1070, - "old:virtual_from_version:42669" => 1077, - "old:virtual_from_version:47683" => 1136, - "old:virtual_from_version:49989" => 1100, - "old:virtual_from_version:44749" => 1224, - "old:virtual_from_version:49902" => 1070, - "old:virtual_from_version:49821" => 1444, - "old:virtual_from_version:49309" => 1077, - "old:virtual_from_version:39532" => 1015, - "old:virtual_from_version:46864" => 1076, - "old:virtual_from_version:50040" => 3159, - "old:virtual_from_version:49171" => 1125, - "old:virtual_from_version:50149" => 1125, - "old:virtual_from_version:38702" => 1062, - "old:virtual_from_version:46307" => 1067, - "old:virtual_from_version:45556" => 1070, - "old:virtual_from_version:42475" => 1000, - "old:virtual_from_version:42992" => 1110, - "old:virtual_from_version:46688" => 1077, - "old:virtual_from_version:45376" => 1314, - "old:virtual_from_version:42855" => 1070, - "old:virtual_from_version:47038" => 3008, - "old:virtual_from_version:44642" => 1125, - "old:virtual_from_version:42180" => 1070, - "old:virtual_from_version:46928" => 1070, - "old:virtual_from_version:44839" => 1488, - "old:virtual_from_version:45081" => 1555, - "old:virtual_from_version:45572" => 1077, - "old:virtual_from_version:40787" => 1067, - "old:virtual_from_version:42351" => 1125, - "old:virtual_from_version:50176" => 3131, - "old:virtual_from_version:40454" => 1404, - "old:virtual_from_version:47255" => 1001, - "old:virtual_from_version:46724" => 1517, - "old:virtual_from_version:50278" => 1444, - "old:virtual_from_version:45582" => 1077, - "old:virtual_from_version:45307" => 1565, - "old:virtual_from_version:47636" => 1488, - "old:virtual_from_version:40931" => 1070, - "old:virtual_from_version:44114" => 1125, - "old:virtual_from_version:47570" => 1105, - "old:virtual_from_version:46396" => 1070, - "old:virtual_from_version:42692" => 1048, - "old:virtual_from_version:49591" => 1444, - "old:virtual_from_version:45269" => 1090, - "old:virtual_from_version:42592" => 1009, - "old:virtual_from_version:47508" => 1109, - "old:virtual_from_version:40515" => 1067, - "old:virtual_from_version:40276" => 1115, - "old:virtual_from_version:42968" => 1037, - "old:virtual_from_version:46833" => 1015, - "old:virtual_from_version:40728" => 1025, - "old:virtual_from_version:42934" => 1009, - "old:virtual_from_version:40493" => 1404, - "old:virtual_from_version:45000" => 1008, - "old:virtual_from_version:45914" => 1077, - "old:virtual_from_version:46857" => 1070, - "old:virtual_from_version:46967" => 1134, - "old:virtual_from_version:47928" => 1070, - "old:virtual_from_version:50439" => 3243, - "old:virtual_from_version:44527" => 1025, - "old:virtual_from_version:45245" => 1049, - "old:virtual_from_version:46275" => 1077, - "old:virtual_from_version:49786" => 3131, - "old:virtual_from_version:47457" => 1070, - "old:virtual_from_version:39579" => 1086, - "old:virtual_from_version:44235" => 1110, - "old:virtual_from_version:40753" => 1070, - "old:virtual_from_version:39728" => 1048, - "old:virtual_from_version:46681" => 1125, - "old:virtual_from_version:42576" => 1070, - "old:virtual_from_version:49982" => 1689, - "old:virtual_from_version:44818" => 1070, - "old:virtual_from_version:45302" => 1414, - "old:virtual_from_version:42290" => 1115, - "old:virtual_from_version:42160" => 1037, - "old:virtual_from_version:49836" => 3194, - "old:virtual_from_version:49653" => 1314, - "old:virtual_from_version:50468" => 3246, - "old:virtual_from_version:40993" => 1070, - "old:virtual_from_version:50137" => 1540, - "old:virtual_from_version:40654" => 1083, - "old:virtual_from_version:47120" => 1070, - "old:virtual_from_version:42214" => 1025, - "old:virtual_from_version:43007" => 2032, - "old:virtual_from_version:42645" => 1109, - "old:virtual_from_version:49070" => 1404, - "old:virtual_from_version:50356" => 3131, - "old:virtual_from_version:50765" => 1070, - "old:virtual_from_version:49293" => 1051, - "old:virtual_from_version:50519" => 1311, - "old:virtual_from_version:50466" => 1172, - "old:virtual_from_version:45816" => 1125, - "old:virtual_from_version:40833" => 1070, - "old:virtual_from_version:49492" => 1125, - "old:virtual_from_version:45429" => 1067, - "old:virtual_from_version:50702" => 1070, - "old:virtual_from_version:40348" => 1095, - "old:virtual_from_version:46301" => 1613, - "old:virtual_from_version:50464" => 3204, - "old:virtual_from_version:44514" => 1070, - "old:virtual_from_version:46837" => 1070, - "old:virtual_from_version:42865" => 1077, - "old:virtual_from_version:42707" => 1037, - "old:virtual_from_version:45493" => 1580, - "old:virtual_from_version:50192" => 3028, - "old:virtual_from_version:50653" => 1419, - "old:virtual_from_version:46727" => 1584, - "old:virtual_from_version:44461" => 1077, - "old:virtual_from_version:50282" => 3131, - "old:virtual_from_version:44259" => 1172, - "old:virtual_from_version:45625" => 1136, - "old:virtual_from_version:47673" => 1070, - "old:virtual_from_version:45963" => 1461, - "old:virtual_from_version:49019" => 1035, - "old:virtual_from_version:45297" => 1125, - "old:virtual_from_version:44065" => 1077, - "old:virtual_from_version:42705" => 1070, - "old:virtual_from_version:45046" => 1031, - "old:virtual_from_version:46746" => 1077, - "old:virtual_from_version:47911" => 1314, - "old:virtual_from_version:45061" => 1051, - "old:virtual_from_version:40097" => 1083, - "old:virtual_from_version:46942" => 1107, - "old:virtual_from_version:49667" => 1070, - "old:virtual_from_version:40540" => 1067, - "old:virtual_from_version:44664" => 1077, - "old:virtual_from_version:44669" => 1077, - "old:virtual_from_version:50561" => 3259, - "old:virtual_from_version:10001" => 2000, - "old:virtual_from_version:46101" => 1077, - "old:virtual_from_version:40648" => 1128, - "old:virtual_from_version:46124" => 1555, - "old:virtual_from_version:4513 " => 1053, - "old:virtual_from_version:44297" => 1070, - "old:virtual_from_version:50183" => 1069, - "old:virtual_from_version:45335" => 1125, - "old:virtual_from_version:47857" => 1070, - "old:virtual_from_version:42042" => 1172, - "old:virtual_from_version:42541" => 1070, - "old:virtual_from_version:45984" => 1613, - "old:virtual_from_version:44285" => 1070, - "old:virtual_from_version:49538" => 1413, - "old:virtual_from_version:47141" => 1583, - "old:virtual_from_version:46222" => 1077, - "old:virtual_from_version:49954" => 3131, - "old:virtual_from_version:44365" => 1144, - "old:virtual_from_version:46842" => 1070, - "old:virtual_from_version:45835" => 1146, - "old:virtual_from_version:42597" => 1172, - "old:virtual_from_version:50248" => 1489, - "old:virtual_from_version:46254" => 1070, - "old:virtual_from_version:50123" => 3184, - "old:virtual_from_version:49585" => 1107, - "old:virtual_from_version:44964" => 1078, - "old:virtual_from_version:49473" => 1580, - "old:virtual_from_version:47881" => 1689, - "old:virtual_from_version:40705" => 1025, - "old:virtual_from_version:46513" => 1659, - "old:virtual_from_version:44084" => 1515, - "old:virtual_from_version:46617" => 1081, - "old:virtual_from_version:42744" => 1070, - "old:virtual_from_version:40133" => 1290, - "old:virtual_from_version:50018" => 1006, - "old:virtual_from_version:45108" => 1077, - "old:virtual_from_version:42859" => 1067, - "old:virtual_from_version:50222" => 1404, - "old:virtual_from_version:47646" => 1689, - "old:virtual_from_version:42921" => 1070, - "old:virtual_from_version:45355" => 1084, - "old:virtual_from_version:47332" => 1109, - "old:virtual_from_version:48025" => 2126, - "old:virtual_from_version:49768" => 3131, - "old:virtual_from_version:44013" => 1037, - "old:virtual_from_version:49146" => 1070, - "old:virtual_from_version:40834" => 1077, - "old:virtual_from_version:40726" => 1401, - "old:virtual_from_version:46362" => 1109, - "old:virtual_from_version:45981" => 1321, - "old:virtual_from_version:46539" => 1568, - "old:virtual_from_version:47878" => 1009, - "old:virtual_from_version:45343" => 1009, - "old:virtual_from_version:44489" => 1077, - "old:virtual_from_version:49148" => 3150, - "old:virtual_from_version:49940" => 1048, - "old:virtual_from_version:47213" => 1109, - "old:virtual_from_version:46947" => 1583, - "old:virtual_from_version:50180" => 1489, - "old:virtual_from_version:47854" => 1150, - "old:virtual_from_version:43064" => 2065, - "old:virtual_from_version:42404" => 1107, - "old:virtual_from_version:45102" => 1070, - "old:virtual_from_version:39295" => 1025, - "old:virtual_from_version:50085" => 1125, - "old:virtual_from_version:50210" => 1404, - "old:virtual_from_version:49303" => 1413, - "old:virtual_from_version:45668" => 1027, - "old:virtual_from_version:44933" => 1172, - "old:virtual_from_version:45153" => 1009, - "old:virtual_from_version:44278" => 1009, - "old:virtual_from_version:46870" => 1404, - "old:virtual_from_version:44289" => 1037, - "old:virtual_from_version:44473" => 1009, - "old:virtual_from_version:46897" => 1076, - "old:virtual_from_version:50139" => 1070, - "old:virtual_from_version:42255" => 1070, - "old:virtual_from_version:49613" => 1070, - "old:virtual_from_version:42999" => 1136, - "old:virtual_from_version:44479" => 1037, - "old:virtual_from_version:49396" => 1505, - "old:virtual_from_version:47732" => 1689, - "old:virtual_from_version:46373" => 1583, - "old:virtual_from_version:47411" => 1321, - "old:virtual_from_version:49932" => 3197, - "old:virtual_from_version:47554" => 3016, - "old:virtual_from_version:50742" => 1070, - "old:virtual_from_version:46886" => 1105, - "old:virtual_from_version:45681" => 1042, - "old:virtual_from_version:42700" => 1070, - "old:virtual_from_version:47978" => 1125, - "old:virtual_from_version:49640" => 1107, - "old:virtual_from_version:42241" => 1067, - "old:virtual_from_version:44112" => 1109, - "old:virtual_from_version:49918" => 3206, - "old:virtual_from_version:50410" => 1689, - "old:virtual_from_version:50015" => 3217, - "old:virtual_from_version:39544" => 1190, - "old:virtual_from_version:42294" => 1110, - "old:virtual_from_version:47816" => 3094, - "old:virtual_from_version:44238" => 1125, - "old:virtual_from_version:45499" => 1109, - "old:virtual_from_version:42839" => 1070, - "old:virtual_from_version:42848" => 1070, - "old:virtual_from_version:44682" => 1025, - "old:virtual_from_version:49287" => 1689, - "old:virtual_from_version:47426" => 1070, - "old:virtual_from_version:49770" => 1404, - "old:virtual_from_version:50656" => 3259, - "old:virtual_from_version:45936" => 1070, - "old:virtual_from_version:42699" => 1067, - "old:virtual_from_version:44588" => 1070, - "old:virtual_from_version:46825" => 1107, - "old:virtual_from_version:43017" => 2042, - "old:virtual_from_version:50532" => 1067, - "old:virtual_from_version:45329" => 1404, - "old:virtual_from_version:46496" => 1125, - "old:virtual_from_version:48000" => 2101, - "old:virtual_from_version:42762" => 1037, - "old:virtual_from_version:46802" => 1123, - "old:virtual_from_version:40990" => 1110, - "old:virtual_from_version:44651" => 1025, - "old:virtual_from_version:49542" => 1105, - "old:virtual_from_version:42127" => 1037, - "old:virtual_from_version:42259" => 1037, - "old:virtual_from_version:46577" => 1070, - "old:virtual_from_version:47307" => 1616, - "old:virtual_from_version:40759" => 1070, - "old:virtual_from_version:47802" => 1037, - "old:virtual_from_version:47024" => 1070, - "old:virtual_from_version:49056" => 1070, - "old:virtual_from_version:42309" => 1077, - "old:virtual_from_version:42706" => 1077, - "old:virtual_from_version:42058" => 1037, - "old:virtual_from_version:45922" => 1070, - "old:virtual_from_version:50223" => 1583, - "old:virtual_from_version:44662" => 1037, - "old:virtual_from_version:49127" => 1583, - "old:virtual_from_version:44756" => 1109, - "old:virtual_from_version:44701" => 1077, - "old:virtual_from_version:44562" => 1023, - "old:virtual_from_version:47831" => 1048, - "old:virtual_from_version:47787" => 1109, - "old:virtual_from_version:44610" => 1537, - "old:virtual_from_version:45360" => 1583, - "old:virtual_from_version:47723" => 1404, - "old:virtual_from_version:44766" => 1077, - "old:virtual_from_version:50521" => 1016, - "old:virtual_from_version:38483" => 1030, - "old:virtual_from_version:45911" => 1070, - "old:virtual_from_version:50294" => 1321, - "old:virtual_from_version:46988" => 1136, - "old:virtual_from_version:49345" => 1105, - "old:virtual_from_version:50080" => 1125, - "old:virtual_from_version:40644" => 1032, - "old:virtual_from_version:40853" => 1037, - "old:virtual_from_version:40826" => 1070, - "old:virtual_from_version:49167" => 1077, - "old:virtual_from_version:45072" => 1067, - "old:virtual_from_version:42131" => 1070, - "old:virtual_from_version:50323" => 3237, - "old:virtual_from_version:50555" => 1580, - "old:virtual_from_version:44459" => 1070, - "old:virtual_from_version:44412" => 1115, - "old:virtual_from_version:40094" => 1062, - "old:virtual_from_version:50449" => 1037, - "old:virtual_from_version:46630" => 1070, - "old:virtual_from_version:44094" => 1009, - "old:virtual_from_version:38379" => 1025, - "old:virtual_from_version:46205" => 1092, - "old:virtual_from_version:40866" => 1070, - "old:virtual_from_version:45039" => 1517, - "old:virtual_from_version:42629" => 1136, - "old:virtual_from_version:38018" => 1095, - "old:virtual_from_version:44422" => 1037, - "old:virtual_from_version:40820" => 1070, - "old:virtual_from_version:49010" => 1172, - "old:virtual_from_version:45805" => 1006, - "old:virtual_from_version:45050" => 1042, - "old:virtual_from_version:45868" => 1517, - "old:virtual_from_version:44308" => 1070, - "old:virtual_from_version:49482" => 3151, - "old:virtual_from_version:44079" => 1172, - "old:virtual_from_version:45588" => 1616, - "old:virtual_from_version:47845" => 1132, - "old:virtual_from_version:45800" => 1112, - "old:virtual_from_version:50382" => 1070, - "old:virtual_from_version:40572" => 1070, - "old:virtual_from_version:44395" => 1222, - "old:virtual_from_version:42189" => 1070, - "old:virtual_from_version:46728" => 1585, - "old:virtual_from_version:44120" => 1062, - "old:virtual_from_version:48026" => 2127, - "old:virtual_from_version:44076" => 1025, - "old:virtual_from_version:42620" => 1077, - "old:virtual_from_version:38961" => 1025, - "old:virtual_from_version:38790" => 1025, - "old:virtual_from_version:46344" => 1067, - "old:virtual_from_version:50155" => 1125, - "old:virtual_from_version:47077" => 1125, - "old:virtual_from_version:40730" => 1402, - "old:virtual_from_version:42730" => 1009, - "old:virtual_from_version:46006" => 1070, - "old:virtual_from_version:46203" => 1070, - "old:virtual_from_version:45627" => 1107, - "old:virtual_from_version:44041" => 1077, - "old:virtual_from_version:46182" => 1537, - "old:virtual_from_version:46585" => 1070, - "old:virtual_from_version:42206" => 1037, - "old:virtual_from_version:44782" => 1172, - "old:virtual_from_version:44445" => 1025, - "old:virtual_from_version:50287" => 1532, - "old:virtual_from_version:42813" => 1070, - "old:virtual_from_version:49177" => 1070, - "old:virtual_from_version:45253" => 1023, - "old:virtual_from_version:42631" => 1009, - "old:virtual_from_version:46405" => 1070, - "old:virtual_from_version:47558" => 1125, - "old:virtual_from_version:42490" => 1070, - "old:virtual_from_version:46233" => 1070, - "old:virtual_from_version:47859" => 1109, - "old:virtual_from_version:40693" => 1125, - "old:virtual_from_version:49418" => 3029, - "old:virtual_from_version:42888" => 1037, - "old:virtual_from_version:46879" => 1077, - "old:virtual_from_version:49176" => 1062, - "old:virtual_from_version:46829" => 1397, - "old:virtual_from_version:46756" => 1070, - "old:virtual_from_version:39508" => 1040, - "old:virtual_from_version:42094" => 1070, - "old:virtual_from_version:45052" => 1109, - "old:virtual_from_version:47729" => 1067, - "old:virtual_from_version:39547" => 1192, - "old:virtual_from_version:46224" => 1070, - "old:virtual_from_version:45552" => 1614, - "old:virtual_from_version:40695" => 1077, - "old:virtual_from_version:44536" => 1037, - "old:virtual_from_version:47919" => 1009, - "old:virtual_from_version:38765" => 1107, - "old:virtual_from_version:50619" => 1070, - "old:virtual_from_version:47834" => 1009, - "old:virtual_from_version:44407" => 1015, - "old:virtual_from_version:47093" => 1172, - "old:virtual_from_version:39509" => 1044, - "old:virtual_from_version:45793" => 1051, - "old:virtual_from_version:42656" => 1070, - "old:virtual_from_version:42112" => 1077, - "old:virtual_from_version:50134" => 1070, - "old:virtual_from_version:45306" => 1404, - "old:virtual_from_version:46202" => 1062, - "old:virtual_from_version:39311" => 1107, - "old:virtual_from_version:44008" => 1070, - "old:virtual_from_version:49068" => 1070, - "old:virtual_from_version:44386" => 1043, - "old:virtual_from_version:44453" => 1528, - "old:virtual_from_version:40933" => 1037, - "old:virtual_from_version:49830" => 1015, - "old:virtual_from_version:46043" => 1649, - "old:virtual_from_version:50481" => 3255, - "old:virtual_from_version:46710" => 1070, - "old:virtual_from_version:50343" => 3131, - "old:virtual_from_version:44435" => 1077, - "old:virtual_from_version:47998" => 1070, - "old:virtual_from_version:47402" => 3047, - "old:virtual_from_version:47064" => 3003, - "old:virtual_from_version:50182" => 1070, - "old:virtual_from_version:45815" => 1070, - "old:virtual_from_version:50563" => 1125, - "old:virtual_from_version:42464" => 1125, - "old:virtual_from_version:42359" => 1077, - "old:virtual_from_version:50494" => 3226, - "old:virtual_from_version:47418" => 3008, - "old:virtual_from_version:40558" => 1025, - "old:virtual_from_version:42773" => 1037, - "old:virtual_from_version:50483" => 3247, - "old:virtual_from_version:45142" => 1125, - "old:virtual_from_version:50675" => 3192, - "old:virtual_from_version:45118" => 1070, - "old:virtual_from_version:44066" => 1037, - "old:virtual_from_version:44972" => 1110, - "old:virtual_from_version:46155" => 1070, - "old:virtual_from_version:44606" => 1077, - "old:virtual_from_version:45878" => 1630, - "old:virtual_from_version:40955" => 1109, - "old:virtual_from_version:49530" => 1489, - "old:virtual_from_version:44299" => 1077, - "old:virtual_from_version:47090" => 1321, - "old:virtual_from_version:45263" => 1224, - "old:virtual_from_version:40825" => 1077, - "old:virtual_from_version:43019" => 2044, - "old:virtual_from_version:49814" => 3194, - "old:virtual_from_version:38415" => 1069, - "old:virtual_from_version:47207" => 1009, - "old:virtual_from_version:49757" => 1585, - "old:virtual_from_version:44791" => 1025, - "old:virtual_from_version:44943" => 1517, - "old:virtual_from_version:44132" => 1037, - "old:virtual_from_version:44228" => 1037, - "old:virtual_from_version:45961" => 1025, - "old:virtual_from_version:49130" => 1689, - "old:virtual_from_version:49752" => 1689, - "old:virtual_from_version:47031" => 1125, - "old:virtual_from_version:40468" => 1067, - "old:virtual_from_version:39965" => 1095, - "old:virtual_from_version:42555" => 1025, - "old:virtual_from_version:46343" => 1109, - "old:virtual_from_version:44255" => 1105, - "old:virtual_from_version:49376" => 1077, - "old:virtual_from_version:42904" => 1037, - "old:virtual_from_version:46019" => 1404, - "old:virtual_from_version:46658" => 1461, - "old:virtual_from_version:42794" => 1115, - "old:virtual_from_version:42327" => 1077, - "old:virtual_from_version:39284" => 1007, - "old:virtual_from_version:38978" => 1107, - "old:virtual_from_version:45337" => 1125, - "old:virtual_from_version:47976" => 1062, - "old:virtual_from_version:40434" => 1109, - "old:virtual_from_version:38570" => 1095, - "old:virtual_from_version:47680" => 1659, - "old:virtual_from_version:49543" => 1009, - "old:virtual_from_version:44958" => 1560, - "old:virtual_from_version:44139" => 1070, - "old:virtual_from_version:47442" => 1109, - "old:virtual_from_version:50644" => 1148, - "old:virtual_from_version:47836" => 1404, - "old:virtual_from_version:46054" => 1651, - "old:virtual_from_version:46348" => 1671, - "old:virtual_from_version:46079" => 1150, - "old:virtual_from_version:49281" => 1659, - "old:virtual_from_version:44325" => 1009, - "old:virtual_from_version:42858" => 1037, - "old:virtual_from_version:36542" => 1069, - "old:virtual_from_version:47361" => 1107, - "old:virtual_from_version:48017" => 2117, - "old:virtual_from_version:45069" => 1125, - "old:virtual_from_version:38545" => 1115, - "old:virtual_from_version:45449" => 1222, - "old:virtual_from_version:49053" => 3094, - "old:virtual_from_version:45240" => 1062, - "old:virtual_from_version:40709" => 1070, - "old:virtual_from_version:44792" => 1077, - "old:virtual_from_version:43004" => 2029, - "old:virtual_from_version:42606" => 1172, - "old:virtual_from_version:42835" => 1501, - "old:virtual_from_version:50142" => 3131, - "old:virtual_from_version:47235" => 1070, - "old:virtual_from_version:40533" => 1070, - "old:virtual_from_version:42871" => 1077, - "old:virtual_from_version:49340" => 3167, - "old:virtual_from_version:46853" => 3002, - "old:virtual_from_version:46624" => 1051, - "old:virtual_from_version:38990" => 1141, - "old:virtual_from_version:47672" => 3078, - "old:virtual_from_version:40164" => 1048, - "old:virtual_from_version:42055" => 1070, - "old:virtual_from_version:50554" => 1125, - "old:virtual_from_version:47709" => 1070, - "old:virtual_from_version:49411" => 1532, - "old:virtual_from_version:46437" => 1077, - "old:virtual_from_version:50544" => 3016, - "old:virtual_from_version:13356" => 1022, - "old:virtual_from_version:47073" => 3008, - "old:virtual_from_version:45855" => 1070, - "old:virtual_from_version:45136" => 1001, - "old:virtual_from_version:45882" => 1070, - "old:virtual_from_version:50235" => 1689, - "old:virtual_from_version:45230" => 1569, - "old:virtual_from_version:45518" => 1070, - "old:virtual_from_version:49965" => 3211, - "old:virtual_from_version:40838" => 1107, - "old:virtual_from_version:46739" => 1077, - "old:virtual_from_version:45414" => 1009, - "old:virtual_from_version:49373" => 3167, - "old:virtual_from_version:44406" => 1012, - "old:virtual_from_version:44674" => 1077, - "old:virtual_from_version:47310" => 1125, - "old:virtual_from_version:42187" => 1109, - "old:virtual_from_version:44239" => 1070, - "old:virtual_from_version:47534" => 1077, - "old:virtual_from_version:47589" => 1070, - "old:virtual_from_version:50277" => 1659, - "old:virtual_from_version:45144" => 1125, - "old:virtual_from_version:45653" => 1067, - "old:virtual_from_version:46729" => 1697, - "old:virtual_from_version:44733" => 1077, - "old:virtual_from_version:47500" => 1077, - "old:virtual_from_version:44829" => 1011, - "old:virtual_from_version:40947" => 1037, - "old:virtual_from_version:50186" => 1037, - "old:virtual_from_version:46456" => 1444, - "old:virtual_from_version:42703" => 1037, - "old:virtual_from_version:46966" => 1077, - "old:virtual_from_version:40916" => 1110, - "old:virtual_from_version:44668" => 1070, - "old:virtual_from_version:49873" => 1070, - "old:virtual_from_version:47253" => 1067, - "old:virtual_from_version:50531" => 1048, - "old:virtual_from_version:49607" => 1404, - "old:virtual_from_version:39009" => 1083, - "old:virtual_from_version:42118" => 1136, - "old:virtual_from_version:42291" => 1025, - "old:virtual_from_version:42389" => 1070, - "old:virtual_from_version:42406" => 1077, - "old:virtual_from_version:44971" => 1064, - "old:virtual_from_version:46309" => 1009, - "old:virtual_from_version:49254" => 1689, - "old:virtual_from_version:46664" => 1077, - "old:virtual_from_version:50512" => 1583, - "old:virtual_from_version:46100" => 1070, - "old:virtual_from_version:49073" => 1666, - "old:virtual_from_version:44586" => 1077, - "old:virtual_from_version:46466" => 1404, - "old:virtual_from_version:42028" => 1037, - "old:virtual_from_version:47221" => 1070, - "old:virtual_from_version:42317" => 1413, - "old:virtual_from_version:44587" => 1037, - "old:virtual_from_version:44759" => 1006, - "old:virtual_from_version:44714" => 1037, - "old:virtual_from_version:40754" => 1077, - "old:virtual_from_version:46568" => 1070, - "old:virtual_from_version:46329" => 1077, - "old:virtual_from_version:46899" => 1070, - "old:virtual_from_version:47417" => 1689, - "old:virtual_from_version:49867" => 3131, - "old:virtual_from_version:49091" => 3139, - "old:virtual_from_version:42197" => 1077, - "old:virtual_from_version:46475" => 1105, - "old:virtual_from_version:46902" => 1404, - "old:virtual_from_version:46965" => 1125, - "old:virtual_from_version:39716" => 1083, - "old:virtual_from_version:45223" => 1576, - "old:virtual_from_version:49797" => 1070, - "old:virtual_from_version:47850" => 1532, - "old:virtual_from_version:45575" => 1070, - "old:virtual_from_version:47822" => 3094, - "old:virtual_from_version:47226" => 1070, - "old:virtual_from_version:45250" => 1110, - "old:virtual_from_version:50337" => 3131, - "old:virtual_from_version:46618" => 1172, - "old:virtual_from_version:42958" => 1009, - "old:virtual_from_version:50629" => 1419, - "old:virtual_from_version:47711" => 1109, - "old:virtual_from_version:42090" => 1070, - "old:virtual_from_version:44413" => 1021, - "old:virtual_from_version:44393" => 1000, - "old:virtual_from_version:46314" => 1665, - "old:virtual_from_version:49800" => 1107, - "old:virtual_from_version:50524" => 1033, - "old:virtual_from_version:40799" => 1070, - "old:virtual_from_version:46207" => 1070, - "old:virtual_from_version:40929" => 1037, - "old:virtual_from_version:49528" => 1362, - "old:virtual_from_version:39596" => 1000, - "old:virtual_from_version:46921" => 1621, - "old:virtual_from_version:45013" => 1136, - "old:virtual_from_version:46906" => 1077, - "old:virtual_from_version:46116" => 1353, - "old:virtual_from_version:46245" => 1574, - "old:virtual_from_version:40652" => 1398, - "old:virtual_from_version:47123" => 1172, - "old:virtual_from_version:38847" => 1112, - "old:virtual_from_version:46168" => 1070, - "old:virtual_from_version:40859" => 1037, - "old:virtual_from_version:47759" => 1037, - "old:virtual_from_version:47420" => 1070, - "old:virtual_from_version:49841" => 1517, - "old:virtual_from_version:40399" => 1349, - "old:virtual_from_version:46877" => 1125, - "old:virtual_from_version:49430" => 3029, - "old:virtual_from_version:50395" => 3214, - "old:virtual_from_version:49033" => 3046, - "old:virtual_from_version:46571" => 1498, - "old:virtual_from_version:49402" => 1070, - "old:virtual_from_version:42318" => 1070, - "old:virtual_from_version:45432" => 1077, - "old:virtual_from_version:44869" => 1009, - "old:virtual_from_version:46542" => 1077, - "old:virtual_from_version:49186" => 1404, - "old:virtual_from_version:40846" => 1077, - "old:virtual_from_version:49929" => 3209, - "old:virtual_from_version:49999" => 1070, - "old:virtual_from_version:44873" => 1070, - "old:virtual_from_version:46736" => 1070, - "old:virtual_from_version:39933" => 1247, - "old:virtual_from_version:49226" => 1314, - "old:virtual_from_version:47204" => 1070, - "old:virtual_from_version:40925" => 1067, - "old:virtual_from_version:44993" => 1069, - "old:virtual_from_version:41008" => 2019, - "old:virtual_from_version:47719" => 1321, - "old:virtual_from_version:47766" => 3078, - "old:virtual_from_version:47553" => 1077, - "old:virtual_from_version:44693" => 1048, - "old:virtual_from_version:42504" => 1012, - "old:virtual_from_version:40750" => 1109, - "old:virtual_from_version:49116" => 1051, - "old:virtual_from_version:47198" => 1125, - "old:virtual_from_version:47168" => 1444, - "old:virtual_from_version:45079" => 1402, - "old:virtual_from_version:47282" => 1397, - "old:virtual_from_version:47358" => 3045, - "old:virtual_from_version:49546" => 1125, - "old:virtual_from_version:46606" => 1404, - "old:virtual_from_version:44035" => 1037, - "old:virtual_from_version:49108" => 3136, - "old:virtual_from_version:44404" => 1010, - "old:virtual_from_version:50400" => 3131, - "old:virtual_from_version:44381" => 1027, - "old:virtual_from_version:45387" => 1362, - "old:virtual_from_version:44424" => 1043, - "old:virtual_from_version:47447" => 1057, - "old:virtual_from_version:47157" => 1583, - "old:virtual_from_version:45851" => 1109, - "old:virtual_from_version:44507" => 1053, - "old:virtual_from_version:42096" => 1037, - "old:virtual_from_version:49298" => 3136, - "old:virtual_from_version:46053" => 1077, - "old:virtual_from_version:44524" => 1136, - "old:virtual_from_version:45576" => 1077, - "old:virtual_from_version:49032" => 1649, - "old:virtual_from_version:40655" => 1083, - "old:virtual_from_version:45080" => 1110, - "old:virtual_from_version:40786" => 1077, - "old:virtual_from_version:45819" => 1077, - "old:virtual_from_version:50355" => 1689, - "old:virtual_from_version:44659" => 1070, - "old:virtual_from_version:49629" => 3184, - "old:virtual_from_version:40952" => 1009, - "old:virtual_from_version:42323" => 1112, - "old:virtual_from_version:44798" => 1067, - "old:virtual_from_version:45009" => 1517, - "old:virtual_from_version:47042" => 1172, - "old:virtual_from_version:45530" => 1009, - "old:virtual_from_version:47191" => 1070, - "old:virtual_from_version:45366" => 1125, - "old:virtual_from_version:44513" => 1107, - "old:virtual_from_version:45536" => 1136, - "old:virtual_from_version:40657" => 1125, - "old:virtual_from_version:46264" => 1070, - "old:virtual_from_version:46909" => 1095, - "old:virtual_from_version:50047" => 1105, - "old:virtual_from_version:46175" => 1532, - "old:virtual_from_version:42483" => 1104, - "old:virtual_from_version:40511" => 1070, - "old:virtual_from_version:44482" => 1077, - "old:virtual_from_version:50432" => 1057, - "old:virtual_from_version:50455" => 1025, - "old:virtual_from_version:42591" => 1070, - "old:virtual_from_version:49511" => 3180, - "old:virtual_from_version:50260" => 3131, - "old:virtual_from_version:45739" => 1070, - "old:virtual_from_version:38375" => 1070, - "old:virtual_from_version:38835" => 1051, - "old:virtual_from_version:42547" => 1070, - "old:virtual_from_version:49588" => 1105, - "old:virtual_from_version:45644" => 1009, - "old:virtual_from_version:47770" => 1070, - "old:virtual_from_version:47399" => 1077, - "old:virtual_from_version:49976" => 3209, - "old:virtual_from_version:46638" => 1404, - "old:virtual_from_version:42967" => 1077, - "old:virtual_from_version:45351" => 1362, - "old:virtual_from_version:38538" => 1077, - "old:virtual_from_version:45288" => 1568, - "old:virtual_from_version:45308" => 1125, - "old:virtual_from_version:49447" => 1580, - "old:virtual_from_version:41002" => 2014, - "old:virtual_from_version:42357" => 1009, - "old:virtual_from_version:42023" => 1077, - "old:virtual_from_version:49885" => 3131, - "old:virtual_from_version:45856" => 1125, - "old:virtual_from_version:42296" => 1428, - "old:virtual_from_version:45268" => 1015, - "old:virtual_from_version:42337" => 1037, - "old:virtual_from_version:49121" => 1112, - "old:virtual_from_version:49928" => 3009, - "old:virtual_from_version:46113" => 1404, - "old:virtual_from_version:46878" => 1025, - "old:virtual_from_version:50251" => 3186, - "old:virtual_from_version:47124" => 1025, - "old:virtual_from_version:46038" => 1077, - "old:virtual_from_version:47651" => 1077, - "old:virtual_from_version:39578" => 1100, - "old:virtual_from_version:43026" => 2051, - "old:virtual_from_version:50624" => 1110, - "old:virtual_from_version:50590" => 3267, - "old:virtual_from_version:47441" => 1125, - "old:virtual_from_version:40882" => 1048, - "old:virtual_from_version:40872" => 1019, - "old:virtual_from_version:47807" => 1077, - "old:virtual_from_version:47111" => 3017, - "old:virtual_from_version:50472" => 3249, - "old:virtual_from_version:50674" => 3270, - "old:virtual_from_version:47025" => 1172, - "old:virtual_from_version:49446" => 1444, - "old:virtual_from_version:44121" => 1110, - "old:virtual_from_version:50503" => 3174, - "old:virtual_from_version:42477" => 1444, - "old:virtual_from_version:42509" => 1062, - "old:virtual_from_version:45641" => 1070, - "old:virtual_from_version:50398" => 1069, - "old:virtual_from_version:42274" => 1222, - "old:virtual_from_version:45533" => 1613, - "old:virtual_from_version:47973" => 1689, - "old:virtual_from_version:47528" => 1109, - "old:virtual_from_version:45311" => 1583, - "old:virtual_from_version:47359" => 1070, - "old:virtual_from_version:43066" => 2067, - "old:virtual_from_version:49400" => 1025, - "old:virtual_from_version:50387" => 1070, - "old:virtual_from_version:50473" => 3250, - "old:virtual_from_version:49112" => 3146, - "old:virtual_from_version:49648" => 1489, - "old:virtual_from_version:40477" => 1083, - "old:virtual_from_version:45993" => 1076, - "old:virtual_from_version:44341" => 1077, - "old:virtual_from_version:46916" => 1136, - "old:virtual_from_version:45239" => 1016, - "old:virtual_from_version:47492" => 1025, - "old:virtual_from_version:34143" => 1051, - "old:virtual_from_version:39771" => 1088, - "old:virtual_from_version:42222" => 1413, - "old:virtual_from_version:45731" => 1125, - "old:virtual_from_version:39704" => 1019, - "old:virtual_from_version:49961" => 1580, - "old:virtual_from_version:44130" => 1009, - "old:virtual_from_version:46591" => 1077, - "old:virtual_from_version:50377" => 1125, - "old:virtual_from_version:42737" => 1108, - "old:virtual_from_version:46132" => 1109, - "old:virtual_from_version:42331" => 1032, - "old:virtual_from_version:45861" => 1125, - "old:virtual_from_version:50557" => 3259, - "old:virtual_from_version:42983" => 1507, - "old:virtual_from_version:42502" => 1091, - "old:virtual_from_version:46888" => 1070, - "old:virtual_from_version:44788" => 1125, - "old:virtual_from_version:40998" => 1109, - "old:virtual_from_version:40689" => 1107, - "old:virtual_from_version:44601" => 1107, - "old:virtual_from_version:45628" => 1067, - "old:virtual_from_version:46730" => 1070, - "old:virtual_from_version:47524" => 1410, - "old:virtual_from_version:39935" => 1025, - "old:virtual_from_version:47749" => 1125, - "old:virtual_from_version:47487" => 1109, - "old:virtual_from_version:44133" => 1062, - "old:virtual_from_version:46335" => 1670, - "old:virtual_from_version:49668" => 1136, - "old:virtual_from_version:50643" => 3259, - "old:virtual_from_version:39941" => 1009, - "old:virtual_from_version:42602" => 1037, - "old:virtual_from_version:45019" => 1107, - "old:virtual_from_version:46834" => 1172, - "old:virtual_from_version:40948" => 1048, - "old:virtual_from_version:50347" => 1125, - "old:virtual_from_version:38339" => 1107, - "old:virtual_from_version:45559" => 1107, - "old:virtual_from_version:42345" => 1037, - "old:virtual_from_version:46250" => 1070, - "old:virtual_from_version:44361" => 1222, - "old:virtual_from_version:45147" => 1125, - "old:virtual_from_version:44630" => 1172, - "old:virtual_from_version:49710" => 1084, - "old:virtual_from_version:45304" => 1580, - "old:virtual_from_version:46535" => 1070, - "old:virtual_from_version:45978" => 1533, - "old:virtual_from_version:40911" => 1110, - "old:virtual_from_version:49156" => 1077, - "old:virtual_from_version:44074" => 1070, - "old:virtual_from_version:44396" => 1070, - "old:virtual_from_version:49403" => 1689, - "old:virtual_from_version:45532" => 1085, - "old:virtual_from_version:44162" => 1037, - "old:virtual_from_version:44850" => 1077, - "old:virtual_from_version:40857" => 1025, - "old:virtual_from_version:49784" => 1070, - "old:virtual_from_version:49689" => 1404, - "old:virtual_from_version:50297" => 3234, - "old:virtual_from_version:44728" => 1077, - "old:virtual_from_version:47414" => 1037, - "old:virtual_from_version:42115" => 1077, - "old:virtual_from_version:45619" => 1070, - "old:virtual_from_version:45722" => 1107, - "old:virtual_from_version:46631" => 1077, - "old:virtual_from_version:42568" => 1077, - "old:virtual_from_version:42249" => 1070, - "old:virtual_from_version:49047" => 1584, - "old:virtual_from_version:42361" => 1000, - "old:virtual_from_version:47765" => 3078, - "old:virtual_from_version:40725" => 1048, - "old:virtual_from_version:45097" => 1077, - "old:virtual_from_version:42611" => 1172, - "old:virtual_from_version:45396" => 1009, - "old:virtual_from_version:49410" => 1404, - "old:virtual_from_version:40870" => 1070, - "old:virtual_from_version:45808" => 1397, - "old:virtual_from_version:47525" => 1070, - "old:virtual_from_version:42073" => 1037, - "old:virtual_from_version:50193" => 3131, - "old:virtual_from_version:47398" => 1172, - "old:virtual_from_version:44942" => 1014, - "old:virtual_from_version:49992" => 1666, - "old:virtual_from_version:46548" => 1070, - "old:virtual_from_version:44645" => 1517, - "old:virtual_from_version:49761" => 1672, - "old:virtual_from_version:44147" => 1037, - "old:virtual_from_version:46131" => 1070, - "old:virtual_from_version:50296" => 3131, - "old:virtual_from_version:40273" => 1222, - "old:virtual_from_version:44414" => 1517, - "old:virtual_from_version:36625" => 1012, - "old:virtual_from_version:49971" => 3209, - "old:virtual_from_version:46023" => 1580, - "old:virtual_from_version:50270" => 1070, - "old:virtual_from_version:47625" => 1077, - "old:virtual_from_version:44698" => 1077, - "old:virtual_from_version:44697" => 1025, - "old:virtual_from_version:46554" => 1555, - "old:virtual_from_version:44382" => 1030, - "old:virtual_from_version:45261" => 1109, - "old:virtual_from_version:50157" => 1580, - "old:virtual_from_version:49759" => 1689, - "old:virtual_from_version:42646" => 1112, - "old:virtual_from_version:46882" => 1070, - "old:virtual_from_version:44085" => 1107, - "old:virtual_from_version:46308" => 1172, - "old:virtual_from_version:42059" => 1112, - "old:virtual_from_version:49107" => 3147, - "old:virtual_from_version:47584" => 1007, - "old:virtual_from_version:40813" => 1107, - "old:virtual_from_version:44652" => 1077, - "old:virtual_from_version:42374" => 1107, - "old:virtual_from_version:42412" => 1077, - "old:virtual_from_version:50394" => 3159, - "old:virtual_from_version:42370" => 1077, - "old:virtual_from_version:40606" => 1077, - "old:virtual_from_version:45324" => 1125, - "old:virtual_from_version:46872" => 1410, - "old:virtual_from_version:47470" => 1402, - "old:virtual_from_version:44976" => 1021, - "old:virtual_from_version:40520" => 1109, - "old:virtual_from_version:39234" => 1150, - "old:virtual_from_version:42780" => 1037, - "old:virtual_from_version:45092" => 1077, - "old:virtual_from_version:46117" => 1070, - "old:virtual_from_version:45767" => 1035, - "old:virtual_from_version:45456" => 1070, - "old:virtual_from_version:40912" => 1067, - "old:virtual_from_version:47925" => 3008, - "old:virtual_from_version:50505" => 1311, - "old:virtual_from_version:46772" => 1070, - "old:virtual_from_version:47380" => 3008, - "old:virtual_from_version:46333" => 1077, - "old:virtual_from_version:44017" => 1125, - "old:virtual_from_version:46226" => 1070, - "old:virtual_from_version:46232" => 1615, - "old:virtual_from_version:45737" => 1555, - "old:virtual_from_version:44775" => 1423, - "old:virtual_from_version:46029" => 1649, - "old:virtual_from_version:43000" => 2000, - "old:virtual_from_version:46712" => 1070, - "old:virtual_from_version:49997" => 3214, - "old:virtual_from_version:50257" => 1070, - "old:virtual_from_version:44240" => 1009, - "old:virtual_from_version:44009" => 1009, - "old:virtual_from_version:40368" => 1009, - "old:virtual_from_version:46273" => 1030, - "old:virtual_from_version:40595" => 1077, - "old:virtual_from_version:45756" => 1077, - "old:virtual_from_version:45651" => 1125, - "old:virtual_from_version:49022" => 1689, - "old:virtual_from_version:49305" => 1584, - "old:virtual_from_version:45496" => 1007, - "old:virtual_from_version:42154" => 1070, - "old:virtual_from_version:50212" => 3131, - "old:virtual_from_version:46869" => 1077, - "old:virtual_from_version:44614" => 1017, - "old:virtual_from_version:44526" => 1009, - "old:virtual_from_version:47665" => 1077, - "old:virtual_from_version:42379" => 1311, - "old:virtual_from_version:44584" => 1070, - "old:virtual_from_version:45695" => 1027, - "old:virtual_from_version:42478" => 1009, - "old:virtual_from_version:44636" => 1136, - "old:virtual_from_version:44180" => 1321, - "old:virtual_from_version:42246" => 1037, - "old:virtual_from_version:44910" => 1077, - "old:virtual_from_version:44468" => 1009, - "old:virtual_from_version:40901" => 1037, - "old:virtual_from_version:42516" => 1172, - "old:virtual_from_version:45567" => 1614, - "old:virtual_from_version:42445" => 1067, - "old:virtual_from_version:46684" => 1659, - "old:virtual_from_version:50237" => 1035, - "old:virtual_from_version:45753" => 1070, - "old:virtual_from_version:45523" => 1136, - "old:virtual_from_version:46714" => 1172, - "old:virtual_from_version:45595" => 1077, - "old:virtual_from_version:42691" => 1109, - "old:virtual_from_version:44663" => 1070, - "old:virtual_from_version:47566" => 1588, - "old:virtual_from_version:49632" => 1070, - "old:virtual_from_version:40600" => 1048, - "old:virtual_from_version:42815" => 1025, - "old:virtual_from_version:40509" => 1110, - "old:virtual_from_version:40444" => 1105, - "old:virtual_from_version:47323" => 1172, - "old:virtual_from_version:44321" => 1172, - "old:virtual_from_version:47220" => 1050, - "old:virtual_from_version:47005" => 1125, - "old:virtual_from_version:42796" => 1077, - "old:virtual_from_version:42951" => 1025, - "old:virtual_from_version:42102" => 1077, - "old:virtual_from_version:42864" => 1009, - "old:virtual_from_version:42330" => 1141, - "old:virtual_from_version:46875" => 1613, - "old:virtual_from_version:47139" => 1172, - "old:virtual_from_version:49891" => 1489, - "old:virtual_from_version:44555" => 1037, - "old:virtual_from_version:44327" => 1025, - "old:virtual_from_version:46709" => 1077, - "old:virtual_from_version:46012" => 1090, - "old:virtual_from_version:44123" => 1125, - "old:virtual_from_version:42129" => 1105, - "old:virtual_from_version:40981" => 1077, - "old:virtual_from_version:46107" => 1070, - "old:virtual_from_version:40920" => 1025, - "old:virtual_from_version:49349" => 1070, - "old:virtual_from_version:49568" => 1404, - "old:virtual_from_version:46094" => 1070, - "old:virtual_from_version:47280" => 1125, - "old:virtual_from_version:42944" => 1009, - "old:virtual_from_version:50022" => 1125, - "old:virtual_from_version:47641" => 1109, - "old:virtual_from_version:44948" => 1001, - "old:virtual_from_version:42690" => 1062, - "old:virtual_from_version:47097" => 1070, - "old:virtual_from_version:46055" => 1070, - "old:virtual_from_version:49310" => 1077, - "old:virtual_from_version:42545" => 1343, - "old:virtual_from_version:44726" => 1009, - "old:virtual_from_version:50746" => 3259, - "old:virtual_from_version:46936" => 1076, - "old:virtual_from_version:46342" => 1070, - "old:virtual_from_version:46532" => 1025, - "old:virtual_from_version:49480" => 1689, - "old:virtual_from_version:49416" => 1580, - "old:virtual_from_version:46336" => 1007, - "old:virtual_from_version:46589" => 1404, - "old:virtual_from_version:50501" => 3131, - "old:virtual_from_version:47279" => 3038, - "old:virtual_from_version:45143" => 1107, - "old:virtual_from_version:47344" => 1689, - "old:virtual_from_version:42010" => 1070, - "old:virtual_from_version:42397" => 1077, - "old:virtual_from_version:50642" => 1587, - "old:virtual_from_version:45018" => 1222, - "old:virtual_from_version:47133" => 1172, - "old:virtual_from_version:44511" => 1172, - "old:virtual_from_version:40260" => 1146, - "old:virtual_from_version:42282" => 1424, - "old:virtual_from_version:45592" => 1070, - "old:virtual_from_version:49321" => 3146, - "old:virtual_from_version:40066" => 1070, - "old:virtual_from_version:42099" => 1077, - "old:virtual_from_version:49440" => 1172, - "old:virtual_from_version:44102" => 1037, - "old:virtual_from_version:42489" => 1107, - "old:virtual_from_version:46776" => 1077, - "old:virtual_from_version:50716" => 1007, - "old:virtual_from_version:45568" => 1172, - "old:virtual_from_version:46380" => 1005, - "old:virtual_from_version:49774" => 3031, - "old:virtual_from_version:47061" => 1172, - "old:virtual_from_version:40247" => 1107, - "old:virtual_from_version:46122" => 1070, - "old:virtual_from_version:46163" => 1006, - "old:virtual_from_version:44877" => 1136, - "old:virtual_from_version:44687" => 1070, - "old:virtual_from_version:44801" => 1125, - "old:virtual_from_version:49388" => 1095, - "old:virtual_from_version:44354" => 1515, - "old:virtual_from_version:47026" => 1077, - "old:virtual_from_version:49215" => 1404, - "old:virtual_from_version:40732" => 1070, - "old:virtual_from_version:46748" => 1070, - "old:virtual_from_version:44345" => 1070, - "old:virtual_from_version:40817" => 1077, - "old:virtual_from_version:44301" => 1404, - "old:virtual_from_version:49155" => 1009, - "old:virtual_from_version:42021" => 1070, - "old:virtual_from_version:49192" => 3078, - "old:virtual_from_version:43039" => 2030, - "old:virtual_from_version:43060" => 2059, - "old:virtual_from_version:42116" => 1037, - "old:virtual_from_version:40994" => 1009, - "old:virtual_from_version:50135" => 1172, - "old:virtual_from_version:47263" => 1077, - "old:virtual_from_version:40743" => 1025, - "old:virtual_from_version:49160" => 1070, - "old:virtual_from_version:50199" => 3131, - "old:virtual_from_version:42286" => 1070, - "old:virtual_from_version:46498" => 1107, - "old:virtual_from_version:44585" => 1025, - "old:virtual_from_version:46766" => 1025, - "old:virtual_from_version:45480" => 1136, - "old:virtual_from_version:40489" => 1070, - "old:virtual_from_version:44530" => 1110, - "old:virtual_from_version:47720" => 1070, - "old:virtual_from_version:28096" => 1084, - "old:virtual_from_version:45001" => 1009, - "old:virtual_from_version:39956" => 1076, - "old:virtual_from_version:43093" => 2085, - "old:virtual_from_version:46826" => 1048, - "old:virtual_from_version:42725" => 1110, - "old:virtual_from_version:42558" => 1070, - "old:virtual_from_version:47298" => 1070, - "old:virtual_from_version:47338" => 1070, - "old:virtual_from_version:50708" => 1533, - "old:virtual_from_version:49680" => 3190, - "old:virtual_from_version:40218" => 1112, - "old:virtual_from_version:46816" => 1509, - "old:virtual_from_version:46173" => 1009, - "old:virtual_from_version:40425" => 1335, - "old:virtual_from_version:40187" => 1051, - "old:virtual_from_version:45447" => 1107, - "old:virtual_from_version:47444" => 1077, - "old:virtual_from_version:47856" => 1314, - "old:virtual_from_version:47469" => 1077, - "old:virtual_from_version:49077" => 1666, - "old:virtual_from_version:49614" => 1025, - "old:virtual_from_version:39577" => 1087, - "old:virtual_from_version:49333" => 1404, - "old:virtual_from_version:42392" => 1077, - "old:virtual_from_version:50525" => 1062, - "old:virtual_from_version:45748" => 1019, - "old:virtual_from_version:49889" => 1070, - "old:virtual_from_version:47849" => 1077, - "old:virtual_from_version:46393" => 1404, - "old:virtual_from_version:46516" => 1125, - "old:virtual_from_version:44499" => 1125, - "old:virtual_from_version:39431" => 1110, - "old:virtual_from_version:42026" => 1070, - "old:virtual_from_version:50068" => 3131, - "old:virtual_from_version:44444" => 1070, - "old:virtual_from_version:44216" => 1419, - "old:virtual_from_version:47994" => 1070, - "old:virtual_from_version:10002" => 2001, - "old:virtual_from_version:49736" => 1007, - "old:virtual_from_version:42682" => 1037, - "old:virtual_from_version:45129" => 1009, - "old:virtual_from_version:42100" => 1037, - "old:virtual_from_version:50319" => 1125, - "old:virtual_from_version:42664" => 1077, - "old:virtual_from_version:49904" => 3131, - "old:virtual_from_version:38705" => 1051, - "old:virtual_from_version:45502" => 1009, - "old:virtual_from_version:50445" => 3189, - "old:virtual_from_version:50647" => 1110, - "old:virtual_from_version:44184" => 1404, - "old:virtual_from_version:40339" => 1328, - "old:virtual_from_version:42302" => 1009, - "old:virtual_from_version:42587" => 1037, - "old:virtual_from_version:4525 " => 1055, - "old:virtual_from_version:49594" => 1105, - "old:virtual_from_version:45226" => 1414, - "old:virtual_from_version:42754" => 1077, - "old:virtual_from_version:47300" => 1109, - "old:virtual_from_version:49554" => 1005, - "old:virtual_from_version:49844" => 3194, - "old:virtual_from_version:38811" => 1009, - "old:virtual_from_version:43109" => 2070, - "old:virtual_from_version:49199" => 1070, - "old:virtual_from_version:49278" => 1070, - "old:virtual_from_version:46774" => 1666, - "old:virtual_from_version:46315" => 1666, - "old:virtual_from_version:44671" => 1224, - "old:virtual_from_version:45723" => 1070, - "old:virtual_from_version:44060" => 1070, - "old:virtual_from_version:49887" => 1311, - "old:virtual_from_version:50107" => 3221, - "old:virtual_from_version:47710" => 1107, - "old:virtual_from_version:43099" => 2091, - "old:virtual_from_version:46667" => 1141, - "old:virtual_from_version:42079" => 1051, - "old:virtual_from_version:50184" => 3131, - "old:virtual_from_version:47452" => 1077, - "old:virtual_from_version:46073" => 1070, - "old:virtual_from_version:50422" => 1413, - "old:virtual_from_version:46378" => 1076, - "old:virtual_from_version:49846" => 1172, - "old:virtual_from_version:47971" => 1077, - "old:virtual_from_version:46850" => 1070, - "old:virtual_from_version:46241" => 1107, - "old:virtual_from_version:44262" => 1009, - "old:virtual_from_version:38787" => 1130, - "old:virtual_from_version:40528" => 1077, - "old:virtual_from_version:44817" => 1107, - "old:virtual_from_version:44691" => 1037, - "old:virtual_from_version:44946" => 1419, - "old:virtual_from_version:49978" => 3137, - "old:virtual_from_version:40506" => 1077, - "old:virtual_from_version:44808" => 1172, - "old:virtual_from_version:45436" => 1077, - "old:virtual_from_version:45697" => 1067, - "old:virtual_from_version:50753" => 3266, - "old:virtual_from_version:49327" => 1689, - "old:virtual_from_version:45831" => 1009, - "old:virtual_from_version:49370" => 1005, - "old:virtual_from_version:38642" => 1123, - "old:virtual_from_version:49048" => 1585, - "old:virtual_from_version:49641" => 1067, - "old:virtual_from_version:46830" => 1070, - "old:virtual_from_version:47308" => 1062, - "old:virtual_from_version:50227" => 3228, - "old:virtual_from_version:46294" => 1555, - "old:virtual_from_version:47252" => 1109, - "old:virtual_from_version:39394" => 1051, - "old:virtual_from_version:39331" => 1030, - "old:virtual_from_version:40812" => 1067, - "old:virtual_from_version:46534" => 1533, - "old:virtual_from_version:46021" => 1461, - "old:virtual_from_version:39134" => 1094, - "old:virtual_from_version:45669" => 1077, - "old:virtual_from_version:13338" => 1016, - "old:virtual_from_version:46732" => 1172, - "old:virtual_from_version:42422" => 1107, - "old:virtual_from_version:40758" => 1081, - "old:virtual_from_version:50110" => 1070, - "old:virtual_from_version:46527" => 1077, - "old:virtual_from_version:45381" => 1404, - "old:virtual_from_version:42739" => 1077, - "old:virtual_from_version:44116" => 1070, - "old:virtual_from_version:42599" => 1007, - "old:virtual_from_version:47930" => 1125, - "old:virtual_from_version:47002" => 1037, - "old:virtual_from_version:40435" => 1067, - "old:virtual_from_version:40583" => 1136, - "old:virtual_from_version:13386" => 1039, - "old:virtual_from_version:47712" => 1077, - "old:virtual_from_version:44392" => 1095, - "old:virtual_from_version:50498" => 3251, - "old:virtual_from_version:50391" => 1172, - "old:virtual_from_version:45133" => 1488, - "old:virtual_from_version:49598" => 1095, - "old:virtual_from_version:47527" => 1048, - "old:virtual_from_version:44159" => 1070, - "old:virtual_from_version:42030" => 1070, - "old:virtual_from_version:40456" => 1035, - "old:virtual_from_version:45115" => 1070, - "old:virtual_from_version:42019" => 1077, - "old:virtual_from_version:13352" => 1021, - "old:virtual_from_version:42328" => 1037, - "old:virtual_from_version:49395" => 3120, - "old:virtual_from_version:43056" => 2058, - "old:virtual_from_version:44199" => 1077, - "old:virtual_from_version:44223" => 1077, - "old:virtual_from_version:48042" => 2139, - "old:virtual_from_version:45467" => 1070, - "old:virtual_from_version:38776" => 1067, - "old:virtual_from_version:50690" => 1417, - "old:virtual_from_version:50509" => 3183, - "old:virtual_from_version:49962" => 3131, - "old:virtual_from_version:46510" => 1585, - "old:virtual_from_version:46166" => 1630, - "old:virtual_from_version:50747" => 3267, - "old:virtual_from_version:44411" => 1019, - "old:virtual_from_version:47533" => 1109, - "old:virtual_from_version:50138" => 1659, - "old:virtual_from_version:46225" => 1077, - "old:virtual_from_version:47394" => 1070, - "old:virtual_from_version:49942" => 1172, - "old:virtual_from_version:45558" => 1125, - "old:virtual_from_version:44175" => 1067, - "old:virtual_from_version:42827" => 1070, - "old:virtual_from_version:42040" => 1037, - "old:virtual_from_version:47049" => 1689, - "old:virtual_from_version:42786" => 1497, - "old:virtual_from_version:50345" => 3233, - "old:virtual_from_version:43076" => 2040, - "old:virtual_from_version:46453" => 1009, - "old:virtual_from_version:42917" => 1077, - "old:virtual_from_version:49579" => 1498, - "old:virtual_from_version:44170" => 1125, - "old:virtual_from_version:44843" => 1057, - "old:virtual_from_version:42087" => 1070, - "old:virtual_from_version:45893" => 1009, - "old:virtual_from_version:45662" => 1005, - "old:virtual_from_version:42145" => 1009, - "old:virtual_from_version:40598" => 1077, - "old:virtual_from_version:50024" => 3218, - "old:virtual_from_version:39545" => 1148, - "old:virtual_from_version:49124" => 1077, - "old:virtual_from_version:40355" => 1091, - "old:virtual_from_version:39046" => 1095, - "old:virtual_from_version:46444" => 1172, - "old:virtual_from_version:40896" => 1048, - "old:virtual_from_version:47643" => 1583, - "old:virtual_from_version:40961" => 1070, - "old:virtual_from_version:45613" => 1136, - "old:virtual_from_version:46929" => 1125, - "old:virtual_from_version:45022" => 1078, - "old:virtual_from_version:45804" => 1025, - "old:virtual_from_version:44251" => 1077, - "old:virtual_from_version:44429" => 1049, - "old:virtual_from_version:50640" => 1001, - "old:virtual_from_version:49222" => 1393, - "old:virtual_from_version:50336" => 1105, - "old:virtual_from_version:46951" => 1172, - "old:virtual_from_version:46507" => 1580, - "old:virtual_from_version:46598" => 1172, - "old:virtual_from_version:42178" => 1172, - "old:virtual_from_version:40903" => 1070, - "old:virtual_from_version:50694" => 1070, - "old:virtual_from_version:47509" => 1009, - "old:virtual_from_version:49685" => 1105, - "old:virtual_from_version:45040" => 1022, - "old:virtual_from_version:45758" => 1070, - "old:virtual_from_version:42803" => 1107, - "old:virtual_from_version:48023" => 2124, - "old:virtual_from_version:49643" => 1583, - "old:virtual_from_version:42908" => 1009, - "old:virtual_from_version:46096" => 1362, - "old:virtual_from_version:40793" => 1070, - "old:virtual_from_version:45083" => 1125, - "old:virtual_from_version:42142" => 1351, - "old:virtual_from_version:42226" => 1077, - "old:virtual_from_version:42461" => 1070, - "old:virtual_from_version:45251" => 1030, - "old:virtual_from_version:45369" => 1461, - "old:virtual_from_version:44761" => 1077, - "old:virtual_from_version:47058" => 1580, - "old:virtual_from_version:44038" => 1007, - "old:virtual_from_version:45435" => 1070, - "old:virtual_from_version:44874" => 1009, - "old:virtual_from_version:46074" => 1172, - "old:virtual_from_version:49344" => 1067, - "old:virtual_from_version:46143" => 1070, - "old:virtual_from_version:50191" => 1070, - "old:virtual_from_version:42884" => 1109, - "old:virtual_from_version:44448" => 1249, - "old:virtual_from_version:46925" => 3008, - "old:virtual_from_version:44979" => 1107, - "old:virtual_from_version:40117" => 1100, - "old:virtual_from_version:50613" => 3259, - "old:virtual_from_version:47330" => 1070, - "old:virtual_from_version:42901" => 1070, - "old:virtual_from_version:46704" => 1697, - "old:virtual_from_version:45989" => 1640, - "old:virtual_from_version:45606" => 1009, - "old:virtual_from_version:47036" => 1583, - "old:virtual_from_version:47762" => 1666, - "old:virtual_from_version:50059" => 3131, - "old:virtual_from_version:44136" => 1077, - "old:virtual_from_version:47993" => 1077, - "old:virtual_from_version:46818" => 1172, - "old:virtual_from_version:50335" => 1224, - "old:virtual_from_version:42401" => 1077, - "old:virtual_from_version:47246" => 1109, - "old:virtual_from_version:49113" => 1649, - "old:virtual_from_version:49675" => 1009, - "old:virtual_from_version:42172" => 1009, - "old:virtual_from_version:44304" => 1509, - "old:virtual_from_version:39336" => 1158, - "old:virtual_from_version:47328" => 1109, - "old:virtual_from_version:42322" => 1404, - "old:virtual_from_version:48007" => 2107, - "old:virtual_from_version:47578" => 1109, - "old:virtual_from_version:39715" => 1136, - "old:virtual_from_version:45633" => 1077, - "old:virtual_from_version:42829" => 1009, - "old:virtual_from_version:44373" => 1064, - "old:virtual_from_version:42887" => 1077, - "old:virtual_from_version:45123" => 1009, - "old:virtual_from_version:44334" => 1025, - "old:virtual_from_version:42382" => 1009, - "old:virtual_from_version:44793" => 1172, - "old:virtual_from_version:50271" => 1025, - "old:virtual_from_version:49941" => 1112, - "old:virtual_from_version:45590" => 1172, - "old:virtual_from_version:42263" => 1037, - "old:virtual_from_version:50752" => 3259, - "old:virtual_from_version:42063" => 1077, - "old:virtual_from_version:50252" => 1150, - "old:virtual_from_version:42410" => 1070, - "old:virtual_from_version:42018" => 1125, - "old:virtual_from_version:39710" => 1070, - "old:virtual_from_version:44282" => 1109, - "old:virtual_from_version:45392" => 1009, - "old:virtual_from_version:46743" => 1077, - "old:virtual_from_version:50202" => 1222, - "old:virtual_from_version:38657" => 1128, - "old:virtual_from_version:40498" => 1070, - "old:virtual_from_version:47311" => 1037, - "old:virtual_from_version:44391" => 1049, - "old:virtual_from_version:42940" => 1077, - "old:virtual_from_version:44078" => 1037, - "old:virtual_from_version:47582" => 1666, - "old:virtual_from_version:45078" => 1077, - "old:virtual_from_version:44880" => 1009, - "old:virtual_from_version:42352" => 1077, - "old:virtual_from_version:46894" => 1125, - "old:virtual_from_version:40486" => 1077, - "old:virtual_from_version:49764" => 1070, - "old:virtual_from_version:45578" => 1411, - "old:virtual_from_version:47979" => 1109, - "old:virtual_from_version:46863" => 1077, - "old:virtual_from_version:46177" => 1070, - "old:virtual_from_version:46412" => 1109, - "old:virtual_from_version:44892" => 1077, - "old:virtual_from_version:42616" => 1037, - "old:virtual_from_version:49468" => 1696, - "old:virtual_from_version:47663" => 1565, - "old:virtual_from_version:50397" => 1070, - "old:virtual_from_version:50067" => 1009, - "old:virtual_from_version:44713" => 1077, - "old:virtual_from_version:46858" => 1172, - "old:virtual_from_version:45017" => 1090, - "old:virtual_from_version:46234" => 1172, - "old:virtual_from_version:47248" => 3020, - "old:virtual_from_version:49686" => 1008, - "old:virtual_from_version:45853" => 1077, - "old:virtual_from_version:45151" => 1125, - "old:virtual_from_version:49609" => 1587, - "old:virtual_from_version:49357" => 3167, - "old:virtual_from_version:50573" => 3259, - "old:virtual_from_version:40780" => 1009, - "old:virtual_from_version:46980" => 1172, - "old:virtual_from_version:42066" => 1070, - "old:virtual_from_version:49207" => 1077, - "old:virtual_from_version:45774" => 1125, - "old:virtual_from_version:40991" => 1404, - "old:virtual_from_version:44737" => 1083, - "old:virtual_from_version:42443" => 1077, - "old:virtual_from_version:45887" => 1009, - "old:virtual_from_version:40523" => 1070, - "old:virtual_from_version:42466" => 1077, - "old:virtual_from_version:45871" => 1125, - "old:virtual_from_version:47952" => 1070, - "old:virtual_from_version:49080" => 1110, - "old:virtual_from_version:38345" => 1069, - "old:virtual_from_version:47259" => 1070, - "old:virtual_from_version:43025" => 2050, - "old:virtual_from_version:43034" => 2033, - "old:virtual_from_version:45419" => 1009, - "old:virtual_from_version:49062" => 1070, - "old:virtual_from_version:50069" => 3214, - "old:virtual_from_version:40785" => 1070, - "old:virtual_from_version:44569" => 1077, - "old:virtual_from_version:46364" => 1533, - "old:virtual_from_version:42340" => 1136, - "old:virtual_from_version:40240" => 1077, - "old:virtual_from_version:46324" => 1077, - "old:virtual_from_version:46945" => 1070, - "old:virtual_from_version:42543" => 1037, - "old:virtual_from_version:46227" => 1172, - "old:virtual_from_version:40781" => 1025, - "old:virtual_from_version:40418" => 1067, - "old:virtual_from_version:50417" => 3131, - "old:virtual_from_version:47237" => 1077, - "old:virtual_from_version:46547" => 1077, - "old:virtual_from_version:39580" => 1085, - "old:virtual_from_version:40463" => 1311, - "old:virtual_from_version:40769" => 1125, - "old:virtual_from_version:49484" => 3162, - "old:virtual_from_version:45598" => 1070, - "old:virtual_from_version:44767" => 1070, - "old:virtual_from_version:45503" => 1077, - "old:virtual_from_version:45252" => 1144, - "old:virtual_from_version:43043" => 2022, - "old:virtual_from_version:40544" => 1067, - "old:virtual_from_version:49025" => 1077, - "old:virtual_from_version:46693" => 1077, - "old:virtual_from_version:46814" => 1070, - "old:virtual_from_version:44676" => 1110, - "old:virtual_from_version:42893" => 1077, - "old:virtual_from_version:49502" => 1037, - "old:virtual_from_version:50728" => 3262, - "old:virtual_from_version:49283" => 3136, - "old:virtual_from_version:44324" => 1006, - "old:virtual_from_version:42076" => 1077, - "old:virtual_from_version:49488" => 1125, - "old:virtual_from_version:42091" => 1077, - "old:virtual_from_version:45321" => 1009, - "old:virtual_from_version:44119" => 1037, - "old:virtual_from_version:40524" => 1091, - "old:virtual_from_version:47649" => 1125, - "old:virtual_from_version:42321" => 1109, - "old:virtual_from_version:40774" => 1048, - "old:virtual_from_version:39724" => 1108, - "old:virtual_from_version:45299" => 1582, - "old:virtual_from_version:42271" => 1025, - "old:virtual_from_version:50636" => 1148, - "old:virtual_from_version:42724" => 1037, - "old:virtual_from_version:44280" => 1077, - "old:virtual_from_version:45920" => 1633, - "old:virtual_from_version:44916" => 1172, - "old:virtual_from_version:45601" => 1141, - "old:virtual_from_version:50062" => 3131, - "old:virtual_from_version:46106" => 1397, - "old:virtual_from_version:42402" => 1037, - "old:virtual_from_version:47887" => 1038, - "old:virtual_from_version:45707" => 1404, - "old:virtual_from_version:49069" => 1077, - "old:virtual_from_version:47200" => 1077, - "old:virtual_from_version:45904" => 1062, - "old:virtual_from_version:42425" => 1077, - "old:virtual_from_version:42785" => 1083, - "old:virtual_from_version:40959" => 1413, - "old:virtual_from_version:44475" => 1037, - "old:virtual_from_version:47511" => 1621, - "old:virtual_from_version:40878" => 1009, - "old:virtual_from_version:49921" => 3207, - "old:virtual_from_version:50740" => 3266, - "old:virtual_from_version:44978" => 1037, - "old:virtual_from_version:50447" => 1007, - "old:virtual_from_version:49372" => 1057, - "old:virtual_from_version:47660" => 1051, - "old:virtual_from_version:46952" => 1077, - "old:virtual_from_version:46172" => 1070, - "old:virtual_from_version:46287" => 1070, - "old:virtual_from_version:10005" => 2004, - "old:virtual_from_version:44492" => 1125, - "old:virtual_from_version:50621" => 1417, - "old:virtual_from_version:45062" => 1105, - "old:virtual_from_version:49162" => 1404, - "old:virtual_from_version:39886" => 1107, - "old:virtual_from_version:46512" => 1489, - "old:virtual_from_version:44332" => 1009, - "old:virtual_from_version:46108" => 1107, - "old:virtual_from_version:46845" => 1077, - "old:virtual_from_version:47972" => 1532, - "old:virtual_from_version:40326" => 1404, - "old:virtual_from_version:42838" => 1032, - "old:virtual_from_version:44257" => 1523, - "old:virtual_from_version:50012" => 3131, - "old:virtual_from_version:45760" => 1019, - "old:virtual_from_version:45328" => 1009, - "old:virtual_from_version:45810" => 1413, - "old:virtual_from_version:46140" => 1172, - "old:virtual_from_version:42125" => 1009, - "old:virtual_from_version:46654" => 1537, - "old:virtual_from_version:46616" => 1125, - "old:virtual_from_version:49991" => 3131, - "old:virtual_from_version:44252" => 1037, - "old:virtual_from_version:46985" => 1689, - "old:virtual_from_version:42729" => 1070, - "old:virtual_from_version:50033" => 1125, - "old:virtual_from_version:46192" => 1009, - "old:virtual_from_version:49170" => 1070, - "old:virtual_from_version:42181" => 1009, - "old:virtual_from_version:49257" => 1070, - "old:virtual_from_version:49952" => 1025, - "old:virtual_from_version:44881" => 1077, - "old:virtual_from_version:49890" => 1048, - "old:virtual_from_version:40839" => 1070, - "old:virtual_from_version:40755" => 1107, - "old:virtual_from_version:49596" => 1005, - "old:virtual_from_version:42320" => 1037, - "old:virtual_from_version:45603" => 1136, - "old:virtual_from_version:50286" => 1404, - "old:virtual_from_version:44194" => 1125, - "old:virtual_from_version:45434" => 1136, - "old:virtual_from_version:47387" => 3008, - "old:virtual_from_version:47496" => 1077, - "old:virtual_from_version:46365" => 1070, - "old:virtual_from_version:42184" => 1031, - "old:virtual_from_version:49307" => 1070, - "old:virtual_from_version:44505" => 1110, - "old:virtual_from_version:50580" => 1150, - "old:virtual_from_version:49548" => 1009, - "old:virtual_from_version:45367" => 1107, - "old:virtual_from_version:45315" => 1009, - "old:virtual_from_version:42745" => 1009, - "old:virtual_from_version:42134" => 1037, - "old:virtual_from_version:49252" => 1077, - "old:virtual_from_version:44776" => 1351, - "old:virtual_from_version:45915" => 1070, - "old:virtual_from_version:50295" => 1314, - "old:virtual_from_version:40550" => 1070, - "old:virtual_from_version:46317" => 1032, - "old:virtual_from_version:47725" => 1070, - "old:virtual_from_version:40923" => 1110, - "old:virtual_from_version:45089" => 1070, - "old:virtual_from_version:45341" => 1125, - "old:virtual_from_version:49655" => 1583, - "old:virtual_from_version:47188" => 1125, - "old:virtual_from_version:45790" => 1005, - "old:virtual_from_version:42033" => 1037, - "old:virtual_from_version:50226" => 3227, - "old:virtual_from_version:40800" => 1009, - "old:virtual_from_version:4519 " => 1054, - "old:virtual_from_version:50117" => 1035, - "old:virtual_from_version:46044" => 1070, - "old:virtual_from_version:49960" => 1489, - "old:virtual_from_version:40821" => 1025, - "old:virtual_from_version:49302" => 1077, - "old:virtual_from_version:40879" => 1077, - "old:virtual_from_version:47687" => 1077, - "old:virtual_from_version:46259" => 1070, - "old:virtual_from_version:47434" => 1070, - "old:virtual_from_version:49691" => 1583, - "old:virtual_from_version:46283" => 1070, - "old:virtual_from_version:42005" => 1077, - "old:virtual_from_version:50111" => 1048, - "old:virtual_from_version:40742" => 1009, - "old:virtual_from_version:42484" => 1070, - "old:virtual_from_version:49555" => 1051, - "old:virtual_from_version:40720" => 1404, - "old:virtual_from_version:46270" => 1666, - "old:virtual_from_version:42001" => 1070, - "old:virtual_from_version:44245" => 1521, - "old:virtual_from_version:47448" => 1621, - "old:virtual_from_version:49851" => 3203, - "old:virtual_from_version:50593" => 1417, - "old:virtual_from_version:42346" => 1112, - "old:virtual_from_version:47513" => 1032, - "old:virtual_from_version:45257" => 1107, - "old:virtual_from_version:46089" => 1123, - "old:virtual_from_version:44342" => 1037, - "old:virtual_from_version:47247" => 1077, - "old:virtual_from_version:49159" => 1404, - "old:virtual_from_version:42194" => 1077, - "old:virtual_from_version:47852" => 1584, - "old:virtual_from_version:47274" => 1105, - "old:virtual_from_version:49086" => 3094, - "old:virtual_from_version:40660" => 1362, - "old:virtual_from_version:46004" => 1000, - "old:virtual_from_version:45244" => 1007, - "old:virtual_from_version:44113" => 1105, - "old:virtual_from_version:45580" => 1136, - "old:virtual_from_version:44234" => 1037, - "old:virtual_from_version:42014" => 1105, - "old:virtual_from_version:50723" => 1417, - "old:virtual_from_version:40530" => 1070, - "old:virtual_from_version:42579" => 1110, - "old:virtual_from_version:44721" => 1109, - "old:virtual_from_version:49082" => 3094, - "old:virtual_from_version:41012" => 2022, - "old:virtual_from_version:50552" => 3264, - "old:virtual_from_version:47011" => 3015, - "old:virtual_from_version:42590" => 1172, - "old:virtual_from_version:49996" => 3131, - "old:virtual_from_version:49280" => 1404, - "old:virtual_from_version:45274" => 1091, - "old:virtual_from_version:50515" => 1057, - "old:virtual_from_version:40845" => 1070, - "old:virtual_from_version:44646" => 1025, - "old:virtual_from_version:44982" => 1036, - "old:virtual_from_version:47789" => 1583, - "old:virtual_from_version:46416" => 1077, - "old:virtual_from_version:44480" => 1125, - "old:virtual_from_version:44640" => 1037, - "old:virtual_from_version:47033" => 1077, - "old:virtual_from_version:42440" => 1110, - "old:virtual_from_version:44230" => 1125, - "old:virtual_from_version:49749" => 1051, - "old:virtual_from_version:50197" => 1105, - "old:virtual_from_version:50660" => 1070, - "old:virtual_from_version:49977" => 3212, - "old:virtual_from_version:38678" => 1025, - "old:virtual_from_version:47727" => 1051, - "old:virtual_from_version:44896" => 1070, - "old:virtual_from_version:42720" => 1070, - "old:virtual_from_version:45557" => 1110, - "old:virtual_from_version:47583" => 1689, - "old:virtual_from_version:49925" => 1616, - "old:virtual_from_version:47595" => 1070, - "old:virtual_from_version:46358" => 1095, - "old:virtual_from_version:45402" => 1029, - "old:virtual_from_version:47750" => 1109, - "old:virtual_from_version:47278" => 1125, - "old:virtual_from_version:46340" => 1077, - "old:virtual_from_version:46737" => 1067, - "old:virtual_from_version:47343" => 1404, - "old:virtual_from_version:45492" => 1077, - "old:virtual_from_version:42465" => 1025, - "old:virtual_from_version:44785" => 1077, - "old:virtual_from_version:38383" => 1109, - "old:virtual_from_version:42056" => 1009, - "old:virtual_from_version:45348" => 1136, - "old:virtual_from_version:45822" => 1077, - "old:virtual_from_version:40602" => 1091, - "old:virtual_from_version:50659" => 1033, - "old:virtual_from_version:46260" => 1172, - "old:virtual_from_version:42524" => 1070, - "old:virtual_from_version:42963" => 1067, - "old:virtual_from_version:46489" => 1112, - "old:virtual_from_version:44751" => 1070, - "old:virtual_from_version:47355" => 1621, - "old:virtual_from_version:49510" => 1689, - "old:virtual_from_version:46499" => 1489, - "old:virtual_from_version:42740" => 1037, - "old:virtual_from_version:44889" => 1077, - "old:virtual_from_version:47697" => 1621, - "old:virtual_from_version:40751" => 1067, - "old:virtual_from_version:49061" => 3094, - "old:virtual_from_version:40417" => 1404, - "old:virtual_from_version:44018" => 1070, - "old:virtual_from_version:49240" => 1077, - "old:virtual_from_version:44504" => 1037, - "old:virtual_from_version:38360" => 1042, - "old:virtual_from_version:44137" => 1037, - "old:virtual_from_version:46982" => 1583, - "old:virtual_from_version:42844" => 1037, - "old:virtual_from_version:50568" => 1025, - "old:virtual_from_version:47577" => 1037, - "old:virtual_from_version:44357" => 1172, - "old:virtual_from_version:42994" => 1510, - "old:virtual_from_version:49857" => 3194, - "old:virtual_from_version:47538" => 1025, - "old:virtual_from_version:50669" => 3208, - "old:virtual_from_version:40207" => 1091, - "old:virtual_from_version:44400" => 1144, - "old:virtual_from_version:49563" => 1498, - "old:virtual_from_version:45271" => 1067, - "old:virtual_from_version:45497" => 1070, - "old:virtual_from_version:45608" => 1077, - "old:virtual_from_version:49794" => 1136, - "old:virtual_from_version:49602" => 1070, - "old:virtual_from_version:50143" => 3094, - "old:virtual_from_version:50004" => 1314, - "old:virtual_from_version:46300" => 1107, - "old:virtual_from_version:46628" => 1568, - "old:virtual_from_version:42619" => 1025, - "old:virtual_from_version:45759" => 1009, - "old:virtual_from_version:45205" => 1224, - "old:virtual_from_version:46479" => 1321, - "old:virtual_from_version:49804" => 1404, - "old:virtual_from_version:50758" => 1417, - "old:virtual_from_version:45599" => 1009, - "old:virtual_from_version:42639" => 1070, - "old:virtual_from_version:49811" => 1444, - "old:virtual_from_version:49608" => 1070, - "old:virtual_from_version:46883" => 1125, - "old:virtual_from_version:41015" => 2024, - "old:virtual_from_version:42086" => 1037, - "old:virtual_from_version:50663" => 1417, - "old:virtual_from_version:49909" => 3131, - "old:virtual_from_version:46613" => 1613, - "old:virtual_from_version:47155" => 1105, - "old:virtual_from_version:50250" => 3131, - "old:virtual_from_version:48011" => 2111, - "old:virtual_from_version:47541" => 1125, - "old:virtual_from_version:44472" => 1070, - "old:virtual_from_version:49355" => 1689, - "old:virtual_from_version:42077" => 1037, - "old:virtual_from_version:47682" => 1070, - "old:virtual_from_version:44174" => 1037, - "old:virtual_from_version:45836" => 1397, - "old:virtual_from_version:40962" => 1006, - "old:virtual_from_version:40315" => 1091, - "old:virtual_from_version:49855" => 1537, - "old:virtual_from_version:45114" => 1077, - "old:virtual_from_version:49863" => 1125, - "old:virtual_from_version:49379" => 1077, - "old:virtual_from_version:50000" => 1100, - "old:virtual_from_version:45685" => 1019, - "old:virtual_from_version:49813" => 3131, - "old:virtual_from_version:46327" => 1070, - "old:virtual_from_version:46120" => 1404, - "old:virtual_from_version:42354" => 1067, - "old:virtual_from_version:45713" => 1123, - "old:virtual_from_version:44865" => 1172, - "old:virtual_from_version:42333" => 1009, - "old:virtual_from_version:44816" => 1172, - "old:virtual_from_version:13397" => 1043, - "old:virtual_from_version:50094" => 1136, - "old:virtual_from_version:42148" => 1037, - "old:virtual_from_version:49747" => 1158, - "old:virtual_from_version:39478" => 1032, - "old:virtual_from_version:44343" => 1062, - "old:virtual_from_version:49527" => 1666, - "old:virtual_from_version:47743" => 1109, - "old:virtual_from_version:49604" => 1009, - "old:virtual_from_version:40358" => 1332, - "old:virtual_from_version:46374" => 1584, - "old:virtual_from_version:47739" => 1070, - "old:virtual_from_version:40239" => 1125, - "old:virtual_from_version:47529" => 1077, - "old:virtual_from_version:44303" => 1057, - "old:virtual_from_version:47931" => 1109, - "old:virtual_from_version:42736" => 1038, - "old:virtual_from_version:47013" => 1007, - "old:virtual_from_version:49672" => 1070, - "old:virtual_from_version:45888" => 1025, - "old:virtual_from_version:50602" => 1444, - "old:virtual_from_version:49067" => 3137, - "old:virtual_from_version:40545" => 1105, - "old:virtual_from_version:50529" => 1362, - "old:virtual_from_version:43052" => 2055, - "old:virtual_from_version:46593" => 1037, - "old:virtual_from_version:47375" => 1070, - "old:virtual_from_version:45926" => 1077, - "old:virtual_from_version:44921" => 1110, - "old:virtual_from_version:42036" => 1413, - "old:virtual_from_version:40522" => 1321, - "old:virtual_from_version:45945" => 1077, - "old:virtual_from_version:42499" => 1172, - "old:virtual_from_version:50029" => 1125, - "old:virtual_from_version:44088" => 1025, - "old:virtual_from_version:44991" => 1019, - "old:virtual_from_version:42312" => 1070, - "old:virtual_from_version:44672" => 1070, - "old:virtual_from_version:42035" => 1172, - "old:virtual_from_version:49242" => 1615, - "old:virtual_from_version:42972" => 1009, - "old:virtual_from_version:44420" => 1031, - "old:virtual_from_version:40353" => 1404, - "old:virtual_from_version:40854" => 1048, - "old:virtual_from_version:46723" => 1077, - "old:virtual_from_version:49854" => 1105, - "old:virtual_from_version:46827" => 1009, - "old:virtual_from_version:42553" => 1070, - "old:virtual_from_version:38953" => 1136, - "old:virtual_from_version:44421" => 1036, - "old:virtual_from_version:49975" => 3131, - "old:virtual_from_version:42770" => 1009, - "old:virtual_from_version:45820" => 1070, - "old:virtual_from_version:46678" => 1125, - "old:virtual_from_version:40727" => 1070, - "old:virtual_from_version:42435" => 1009, - "old:virtual_from_version:45752" => 1009, - "old:virtual_from_version:44834" => 1402, - "old:virtual_from_version:49765" => 1025, - "old:virtual_from_version:47368" => 1362, - "old:virtual_from_version:44515" => 1009, - "old:virtual_from_version:42149" => 1110, - "old:virtual_from_version:44855" => 1077, - "old:virtual_from_version:49315" => 1070, - "old:virtual_from_version:45734" => 1007, - "old:virtual_from_version:42009" => 1067, - "old:virtual_from_version:39125" => 1094, - "old:virtual_from_version:40250" => 1025, - "old:virtual_from_version:47261" => 1109, - "old:virtual_from_version:49987" => 3120, - "old:virtual_from_version:49190" => 1565, - "old:virtual_from_version:38349" => 1025, - "old:virtual_from_version:38557" => 1067, - "old:virtual_from_version:42456" => 1041, - "old:virtual_from_version:46651" => 1070, - "old:virtual_from_version:47303" => 1037, - "old:virtual_from_version:50065" => 1107, - "old:virtual_from_version:49911" => 3206, - "old:virtual_from_version:42501" => 1070, - "old:virtual_from_version:46757" => 1125, - "old:virtual_from_version:42734" => 1077, - "old:virtual_from_version:46777" => 1404, - "old:virtual_from_version:46994" => 1689, - "old:virtual_from_version:49715" => 1689, - "old:virtual_from_version:45733" => 1070, - "old:virtual_from_version:45842" => 1009, - "old:virtual_from_version:40744" => 1077, - "old:virtual_from_version:43083" => 2080, - "old:virtual_from_version:45946" => 1404, - "old:virtual_from_version:45843" => 1025, - "old:virtual_from_version:50281" => 1150, - "old:virtual_from_version:46237" => 1035, - "old:virtual_from_version:42721" => 1009, - "old:virtual_from_version:47839" => 1621, - "old:virtual_from_version:40350" => 1009, - "old:virtual_from_version:40388" => 1048, - "old:virtual_from_version:47422" => 1009, - "old:virtual_from_version:44556" => 1070, - "old:virtual_from_version:45373" => 1125, - "old:virtual_from_version:50136" => 3131, - "old:virtual_from_version:40621" => 1077, - "old:virtual_from_version:47864" => 1584, - "old:virtual_from_version:46123" => 1077, - "old:virtual_from_version:40752" => 1000, - "old:virtual_from_version:45715" => 1172, - "old:virtual_from_version:44952" => 1009, - "old:virtual_from_version:45326" => 1587, - "old:virtual_from_version:45515" => 1580, - "old:virtual_from_version:44188" => 1009, - "old:virtual_from_version:44886" => 1070, - "old:virtual_from_version:46265" => 1067, - "old:virtual_from_version:49497" => 3178, - "old:virtual_from_version:45688" => 1009, - "old:virtual_from_version:47780" => 1109, - "old:virtual_from_version:49507" => 1070, - "old:virtual_from_version:47089" => 1077, - "old:virtual_from_version:44068" => 1070, - "old:virtual_from_version:50105" => 1032, - "old:virtual_from_version:40940" => 1037, - "old:virtual_from_version:49006" => 1584, - "old:virtual_from_version:45051" => 1043, - "old:virtual_from_version:40747" => 1009, - "old:virtual_from_version:47410" => 3008, - "old:virtual_from_version:47060" => 1070, - "old:virtual_from_version:45110" => 1125, - "old:virtual_from_version:50711" => 1417, - "old:virtual_from_version:47172" => 1070, - "old:virtual_from_version:40988" => 1077, - "old:virtual_from_version:45604" => 1070, - "old:virtual_from_version:47773" => 1565, - "old:virtual_from_version:43035" => 2034, - "old:virtual_from_version:47331" => 1125, - "old:virtual_from_version:49946" => 1404, - "old:virtual_from_version:49968" => 1585, - "old:virtual_from_version:49559" => 1410, - "old:virtual_from_version:44270" => 1070, - "old:virtual_from_version:42299" => 1000, - "old:virtual_from_version:44903" => 1077, - "old:virtual_from_version:50291" => 3232, - "old:virtual_from_version:44532" => 1070, - "old:virtual_from_version:50327" => 1125, - "old:virtual_from_version:50759" => 3259, - "old:virtual_from_version:44431" => 1095, - "old:virtual_from_version:46646" => 1062, - "old:virtual_from_version:47227" => 1109, - "old:virtual_from_version:44546" => 1009, - "old:virtual_from_version:46465" => 1150, - "old:virtual_from_version:45394" => 1009, - "old:virtual_from_version:42071" => 1070, - "old:virtual_from_version:50576" => 1006, - "old:virtual_from_version:47935" => 3120, - "old:virtual_from_version:46623" => 1125, - "old:virtual_from_version:44679" => 1414, - "old:virtual_from_version:46363" => 1077, - "old:virtual_from_version:45776" => 1304, - "old:virtual_from_version:42863" => 1070, - "old:virtual_from_version:44181" => 1083, - "old:virtual_from_version:42935" => 1077, - "old:virtual_from_version:45405" => 1112, - "old:virtual_from_version:47076" => 1070, - "old:virtual_from_version:42085" => 1077, - "old:virtual_from_version:44146" => 1077, - "old:virtual_from_version:50750" => 1580, - "old:virtual_from_version:46726" => 1583, - "old:virtual_from_version:48016" => 2116, - "old:virtual_from_version:44097" => 1037, - "old:virtual_from_version:39051" => 1069, - "old:virtual_from_version:49931" => 3206, - "old:virtual_from_version:15751" => 1011, - "old:virtual_from_version:45549" => 1009, - "old:virtual_from_version:45070" => 1070, - "old:virtual_from_version:47401" => 3008, - "old:virtual_from_version:42306" => 1037, - "old:virtual_from_version:42808" => 1077, - "old:virtual_from_version:39513" => 1077, - "old:virtual_from_version:45300" => 1125, - "old:virtual_from_version:44709" => 1222, - "old:virtual_from_version:49914" => 1100, - "old:virtual_from_version:46572" => 1070, - "old:virtual_from_version:44043" => 1125, - "old:virtual_from_version:45621" => 1112, - "old:virtual_from_version:44861" => 1172, - "old:virtual_from_version:46971" => 1070, - "old:virtual_from_version:49547" => 1105, - "old:virtual_from_version:50630" => 1555, - "old:virtual_from_version:46111" => 1070, - "old:virtual_from_version:40907" => 1070, - "old:virtual_from_version:45498" => 1125, - "old:virtual_from_version:46626" => 1025, - "old:virtual_from_version:47841" => 3108, - "old:virtual_from_version:47920" => 1077, - "old:virtual_from_version:46961" => 1070, - "old:virtual_from_version:47942" => 1077, - "old:virtual_from_version:49636" => 3185, - "old:virtual_from_version:46007" => 1110, - "old:virtual_from_version:46397" => 1048, - "old:virtual_from_version:44449" => 1172, - "old:virtual_from_version:49213" => 1009, - "old:virtual_from_version:44044" => 1107, - "old:virtual_from_version:48001" => 2102, - "old:virtual_from_version:44802" => 1070, - "old:virtual_from_version:44053" => 1009, - "old:virtual_from_version:50300" => 1404, - "old:virtual_from_version:50384" => 1314, - "old:virtual_from_version:44644" => 1009, - "old:virtual_from_version:49506" => 3179, - "old:virtual_from_version:45107" => 1070, - "old:virtual_from_version:47428" => 1037, - "old:virtual_from_version:50456" => 1006, - "old:virtual_from_version:45865" => 1070, - "old:virtual_from_version:47066" => 3008, - "old:virtual_from_version:49727" => 1070, - "old:virtual_from_version:45778" => 1062, - "old:virtual_from_version:49237" => 1077, - "old:virtual_from_version:44377" => 1021, - "old:virtual_from_version:47053" => 1107, - "old:virtual_from_version:49537" => 1009, - "old:virtual_from_version:49163" => 3151, - "old:virtual_from_version:50208" => 3139, - "old:virtual_from_version:45589" => 1057, - "old:virtual_from_version:42288" => 1009, - "old:virtual_from_version:42212" => 1070, - "old:virtual_from_version:44467" => 1070, - "old:virtual_from_version:45349" => 1413, - "old:virtual_from_version:47631" => 1077, - "old:virtual_from_version:44757" => 1136, - "old:virtual_from_version:47801" => 1070, - "old:virtual_from_version:23466" => 1076, - "old:virtual_from_version:50058" => 1314, - "old:virtual_from_version:44100" => 1025, - "old:virtual_from_version:47751" => 1172, - "old:virtual_from_version:44804" => 1077, - "old:virtual_from_version:47891" => 1077, - "old:virtual_from_version:49791" => 1006, - "old:virtual_from_version:46696" => 1025, - "old:virtual_from_version:45479" => 1172, - "old:virtual_from_version:38748" => 1048, - "old:virtual_from_version:47051" => 1070, - "old:virtual_from_version:46649" => 1077, - "old:virtual_from_version:47934" => 1689, - "old:virtual_from_version:45821" => 1067, - "old:virtual_from_version:42051" => 1077, - "old:virtual_from_version:49092" => 3094, - "old:virtual_from_version:47804" => 1109, - "old:virtual_from_version:50097" => 3131, - "old:virtual_from_version:45418" => 1069, - "old:virtual_from_version:45295" => 1362, - "old:virtual_from_version:38581" => 1091, - "old:virtual_from_version:44803" => 1025, - "old:virtual_from_version:42574" => 1037, - "old:virtual_from_version:46937" => 2100, - "old:virtual_from_version:44712" => 1009, - "old:virtual_from_version:50687" => 3216, - "old:virtual_from_version:49744" => 1532, - "old:virtual_from_version:45629" => 1077, - "old:virtual_from_version:42649" => 1484, - "old:virtual_from_version:49271" => 1077, - "old:virtual_from_version:49955" => 1659, - "old:virtual_from_version:45986" => 1639, - "old:virtual_from_version:42195" => 1037, - "old:virtual_from_version:50198" => 1689, - "old:virtual_from_version:46278" => 1009, - "old:virtual_from_version:44428" => 1048, - "old:virtual_from_version:49934" => 1078, - "old:virtual_from_version:48009" => 2109, - "old:virtual_from_version:45597" => 1136, - "old:virtual_from_version:42881" => 1025, - "old:virtual_from_version:46663" => 1070, - "old:virtual_from_version:42658" => 1025, - "old:virtual_from_version:46583" => 1077, - "old:virtual_from_version:46751" => 1070, - "old:virtual_from_version:49621" => 1125, - "old:virtual_from_version:43012" => 2037, - "old:virtual_from_version:50650" => 1172, - "old:virtual_from_version:44575" => 1009, - "old:virtual_from_version:50239" => 1489, - "old:virtual_from_version:47491" => 1109, - "old:virtual_from_version:47020" => 1461, - "old:virtual_from_version:50246" => 3131, - "old:virtual_from_version:40708" => 1081, - "old:virtual_from_version:47180" => 1070, - "old:virtual_from_version:40597" => 1070, - "old:virtual_from_version:48041" => 2138, - "old:virtual_from_version:42653" => 1025, - "old:virtual_from_version:49105" => 3146, - "old:virtual_from_version:42451" => 1438, - "old:virtual_from_version:42411" => 1009, - "old:virtual_from_version:49250" => 3159, - "old:virtual_from_version:46907" => 3007, - "old:virtual_from_version:40770" => 1025, - "old:virtual_from_version:42417" => 1009, - "old:virtual_from_version:43028" => 2028, - "old:virtual_from_version:50536" => 1032, - "old:virtual_from_version:50378" => 1172, - "old:virtual_from_version:44072" => 1125, - "old:virtual_from_version:50414" => 3227, - "old:virtual_from_version:47950" => 1314, - "old:virtual_from_version:42890" => 1070, - "old:virtual_from_version:47666" => 1689, - "old:virtual_from_version:47459" => 1109, - "old:virtual_from_version:40686" => 1095, - "old:virtual_from_version:49788" => 1100, - "old:virtual_from_version:45077" => 1009, - "old:virtual_from_version:46045" => 1109, - "old:virtual_from_version:46087" => 1025, - "old:virtual_from_version:49202" => 1125, - "old:virtual_from_version:46891" => 1077, - "old:virtual_from_version:47135" => 1532, - "old:virtual_from_version:50578" => 3259, - "old:virtual_from_version:40116" => 1172, - "old:virtual_from_version:49777" => 1070, - "old:virtual_from_version:50565" => 1689, - "old:virtual_from_version:45757" => 1107, - "old:virtual_from_version:46165" => 1532, - "old:virtual_from_version:47668" => 1109, - "old:virtual_from_version:42506" => 1025, - "old:virtual_from_version:44773" => 1489, - "old:virtual_from_version:50570" => 1489, - "old:virtual_from_version:49581" => 1158, - "old:virtual_from_version:45950" => 1626, - "old:virtual_from_version:40482" => 1037, - "old:virtual_from_version:42648" => 1484, - "old:virtual_from_version:44794" => 1070, - "old:virtual_from_version:49354" => 1532, - "old:virtual_from_version:47376" => 1125, - "old:virtual_from_version:45741" => 1621, - "old:virtual_from_version:44851" => 1062, - "old:virtual_from_version:49251" => 1070, - "old:virtual_from_version:49214" => 1077, - "old:virtual_from_version:40438" => 1009, - "old:virtual_from_version:40757" => 1077, - "old:virtual_from_version:38495" => 1091, - "old:virtual_from_version:49524" => 1107, - "old:virtual_from_version:45049" => 1062, - "old:virtual_from_version:47501" => 1659, - "old:virtual_from_version:46057" => 1070, - "old:virtual_from_version:42684" => 1067, - "old:virtual_from_version:49164" => 3152, - "old:virtual_from_version:44544" => 1125, - "old:virtual_from_version:50074" => 1125, - "old:virtual_from_version:47397" => 1109, - "old:virtual_from_version:45909" => 1077, - "old:virtual_from_version:50584" => 3266, - "old:virtual_from_version:49514" => 1070, - "old:virtual_from_version:49638" => 1007, - "old:virtual_from_version:50751" => 1689, - "old:virtual_from_version:49367" => 3016, - "old:virtual_from_version:50526" => 1007, - "old:virtual_from_version:47745" => 1565, - "old:virtual_from_version:47648" => 1070, - "old:virtual_from_version:42280" => 1422, - "old:virtual_from_version:49606" => 1070, - "old:virtual_from_version:47184" => 1077, - "old:virtual_from_version:44675" => 1037, - "old:virtual_from_version:49262" => 1077, - "old:virtual_from_version:50331" => 3239, - "old:virtual_from_version:50077" => 3214, - "old:virtual_from_version:45410" => 1533, - "old:virtual_from_version:42526" => 1025, - "old:virtual_from_version:45525" => 1077, - "old:virtual_from_version:49392" => 1172, - "old:virtual_from_version:45065" => 1000, - "old:virtual_from_version:44998" => 1222, - "old:virtual_from_version:47288" => 1134, - "old:virtual_from_version:42315" => 1037, - "old:virtual_from_version:40707" => 1109, - "old:virtual_from_version:40571" => 1146, - "old:virtual_from_version:40067" => 1077, - "old:virtual_from_version:42168" => 1077, - "old:virtual_from_version:45345" => 1381, - "old:virtual_from_version:40958" => 1095, - "old:virtual_from_version:44028" => 1125, - "old:virtual_from_version:50622" => 3259, - "old:virtual_from_version:46454" => 1012, - "old:virtual_from_version:39546" => 1192, - "old:virtual_from_version:42581" => 1461, - "old:virtual_from_version:45280" => 1025, - "old:virtual_from_version:45154" => 1012, - "old:virtual_from_version:46787" => 1491, - "old:virtual_from_version:44315" => 1081, - "old:virtual_from_version:44481" => 1070, - "old:virtual_from_version:43107" => 2099, - "old:virtual_from_version:49847" => 1489, - "old:virtual_from_version:50346" => 1007, - "old:virtual_from_version:46016" => 1025, - "old:virtual_from_version:49103" => 1649, - "old:virtual_from_version:46991" => 1222, - "old:virtual_from_version:44561" => 1009, - "old:virtual_from_version:46778" => 1070, - "old:virtual_from_version:49043" => 1009, - "old:virtual_from_version:42201" => 1015, - "old:virtual_from_version:47223" => 1109, - "old:virtual_from_version:38369" => 1048, - "old:virtual_from_version:45030" => 1069, - "old:virtual_from_version:46197" => 1077, - "old:virtual_from_version:49211" => 1070, - "old:virtual_from_version:47190" => 1077, - "old:virtual_from_version:40626" => 1091, - "old:virtual_from_version:42982" => 1037, - "old:virtual_from_version:47183" => 1109, - "old:virtual_from_version:47412" => 1697, - "old:virtual_from_version:40957" => 1048, - "old:virtual_from_version:44022" => 1110, - "old:virtual_from_version:45650" => 1070, - "old:virtual_from_version:45158" => 1498, - "old:virtual_from_version:40539" => 1109, - "old:virtual_from_version:44226" => 1070, - "old:virtual_from_version:50261" => 1136, - "old:virtual_from_version:48013" => 2113, - "old:virtual_from_version:40554" => 1077, - "old:virtual_from_version:44577" => 1037, - "old:virtual_from_version:49115" => 1125, - "old:virtual_from_version:39228" => 1009, - "old:virtual_from_version:47726" => 1125, - "old:virtual_from_version:47882" => 1070, - "old:virtual_from_version:49021" => 1077, - "old:virtual_from_version:45624" => 1172, - "old:virtual_from_version:49705" => 1410, - "old:virtual_from_version:47679" => 1035, - "old:virtual_from_version:42236" => 1420, - "old:virtual_from_version:44602" => 1070, - "old:virtual_from_version:45960" => 1070, - "old:virtual_from_version:50396" => 3227, - "old:virtual_from_version:42662" => 1070, - "old:virtual_from_version:40631" => 1070, - "old:virtual_from_version:46867" => 1070, - "old:virtual_from_version:46895" => 1077, - "old:virtual_from_version:46502" => 1583, - "old:virtual_from_version:46509" => 1584, - "old:virtual_from_version:46409" => 1537, - "old:virtual_from_version:46056" => 1077, - "old:virtual_from_version:50292" => 3233, - "old:virtual_from_version:46922" => 1070, - "old:virtual_from_version:49949" => 3131, - "old:virtual_from_version:50672" => 3208, - "old:virtual_from_version:47655" => 1077, - "old:virtual_from_version:40930" => 1048, - "old:virtual_from_version:50408" => 1584, - "old:virtual_from_version:44049" => 1037, - "old:virtual_from_version:44389" => 1112, - "old:virtual_from_version:49631" => 1078, - "old:virtual_from_version:40937" => 1134, - "old:virtual_from_version:49490" => 1689, - "old:virtual_from_version:42419" => 1037, - "old:virtual_from_version:40380" => 1007, - "old:virtual_from_version:45675" => 1555, - "old:virtual_from_version:49665" => 3139, - "old:virtual_from_version:47244" => 1125, - "old:virtual_from_version:39180" => 1017, - "old:virtual_from_version:42852" => 1067, - "old:virtual_from_version:40580" => 1006, - "old:virtual_from_version:38344" => 1009, - "old:virtual_from_version:40217" => 1404, - "old:virtual_from_version:50348" => 1224, - "old:virtual_from_version:44624" => 1077, - "old:virtual_from_version:47721" => 1109, - "old:virtual_from_version:49378" => 1025, - "old:virtual_from_version:49662" => 1125, - "old:virtual_from_version:45215" => 1570, - "old:virtual_from_version:42147" => 1077, - "old:virtual_from_version:46900" => 1125, - "old:virtual_from_version:46088" => 1077, - "old:virtual_from_version:39858" => 1069, - "old:virtual_from_version:50438" => 3191, - "old:virtual_from_version:44498" => 1067, - "old:virtual_from_version:38802" => 1132, - "old:virtual_from_version:42078" => 1109, - "old:virtual_from_version:42293" => 1037, - "old:virtual_from_version:45512" => 1009, - "old:virtual_from_version:44430" => 1067, - "old:virtual_from_version:50263" => 1489, - "old:virtual_from_version:50560" => 1489, - "old:virtual_from_version:42674" => 1009, - "old:virtual_from_version:49512" => 1070, - "old:virtual_from_version:44047" => 1025, - "old:virtual_from_version:45638" => 1046, - "old:virtual_from_version:44125" => 1070, - "old:virtual_from_version:46529" => 1125, - "old:virtual_from_version:50089" => 3210, - "old:virtual_from_version:47613" => 1109, - "old:virtual_from_version:46788" => 1070, - "old:virtual_from_version:46659" => 1694, - "old:virtual_from_version:49742" => 1136, - "old:virtual_from_version:47192" => 1125, - "old:virtual_from_version:49452" => 1172, - "old:virtual_from_version:45980" => 1520, - "old:virtual_from_version:38461" => 1051, - "old:virtual_from_version:42609" => 1077, - "old:virtual_from_version:50385" => 1689, - "old:virtual_from_version:39836" => 1009, - "old:virtual_from_version:46820" => 1397, - "old:virtual_from_version:46526" => 1172, - "old:virtual_from_version:49249" => 1689, - "old:virtual_from_version:40314" => 1078, - "old:virtual_from_version:49592" => 1580, - "old:virtual_from_version:50284" => 3223, - "old:virtual_from_version:40763" => 1105, - "old:virtual_from_version:40455" => 1105, - "old:virtual_from_version:46048" => 1070, - "old:virtual_from_version:50349" => 1006, - "old:virtual_from_version:44866" => 1125, - "old:virtual_from_version:49406" => 3157, - "old:virtual_from_version:47477" => 1172, - "old:virtual_from_version:42767" => 1070, - "old:virtual_from_version:49862" => 1070, - "old:virtual_from_version:49853" => 1070, - "old:virtual_from_version:46915" => 1070, - "old:virtual_from_version:47987" => 1067, - "old:virtual_from_version:40714" => 1067, - "old:virtual_from_version:45038" => 1021, - "old:virtual_from_version:44755" => 1077, - "old:virtual_from_version:49042" => 1105, - "old:virtual_from_version:49034" => 1649, - "old:virtual_from_version:46635" => 1125, - "old:virtual_from_version:46597" => 1070, - "old:virtual_from_version:12547" => 1125, - "old:virtual_from_version:46662" => 1694, - "old:virtual_from_version:47847" => 1037, - "old:virtual_from_version:47163" => 1150, - "old:virtual_from_version:45279" => 1009, - "old:virtual_from_version:40827" => 1078, - "old:virtual_from_version:42757" => 1110, - "old:virtual_from_version:50106" => 3131, - "old:virtual_from_version:44040" => 1025, - "old:virtual_from_version:46438" => 1070, - "old:virtual_from_version:47291" => 1048, - "old:virtual_from_version:45489" => 1112, - "old:virtual_from_version:43045" => 2002, - "old:virtual_from_version:45452" => 1031, - "old:virtual_from_version:49745" => 1689, - "old:virtual_from_version:42985" => 1070, - "old:virtual_from_version:46632" => 1070, - "old:virtual_from_version:42894" => 1037, - "old:virtual_from_version:42667" => 1488, - "old:virtual_from_version:45379" => 1015, - "old:virtual_from_version:49011" => 1077, - "old:virtual_from_version:44901" => 1070, - "old:virtual_from_version:29684" => 1089, - "old:virtual_from_version:40822" => 1077, - "old:virtual_from_version:49871" => 3131, - "old:virtual_from_version:46349" => 1070, - "old:virtual_from_version:45303" => 1565, - "old:virtual_from_version:44908" => 1007, - "old:virtual_from_version:40450" => 1105, - "old:virtual_from_version:44849" => 1015, - "old:virtual_from_version:50165" => 1006, - "old:virtual_from_version:47580" => 1517, - "old:virtual_from_version:40070" => 1025, - "old:virtual_from_version:44460" => 1009, - "old:virtual_from_version:44506" => 1067, - "old:virtual_from_version:39343" => 1061, - "old:virtual_from_version:50099" => 3221, - "old:virtual_from_version:43101" => 2093, - "old:virtual_from_version:49369" => 1070, - "old:virtual_from_version:40768" => 1009, - "old:virtual_from_version:42580" => 1456, - "old:virtual_from_version:50431" => 3241, - "old:virtual_from_version:47106" => 1584, - "old:virtual_from_version:45698" => 1077, - "old:virtual_from_version:49231" => 1070, - "old:virtual_from_version:45775" => 1532, - "old:virtual_from_version:47560" => 1048, - "old:virtual_from_version:49762" => 3131, - "old:virtual_from_version:44670" => 1037, - "old:virtual_from_version:45111" => 1070, - "old:virtual_from_version:40915" => 1037, - "old:virtual_from_version:46383" => 1381, - "old:virtual_from_version:42039" => 1077, - "old:virtual_from_version:47193" => 1109, - "old:virtual_from_version:49825" => 3131, - "old:virtual_from_version:40381" => 1125, - "old:virtual_from_version:41001" => 2013, - "old:virtual_from_version:40656" => 1104, - "old:virtual_from_version:42339" => 1067, - "old:virtual_from_version:42883" => 1037, - "old:virtual_from_version:49363" => 1077, - "old:virtual_from_version:44187" => 1070, - "old:virtual_from_version:42083" => 1037, - "old:virtual_from_version:39893" => 1146, - "old:virtual_from_version:43001" => 2020, - "old:virtual_from_version:46599" => 1077, - "old:virtual_from_version:44182" => 1083, - "old:virtual_from_version:46150" => 1077, - "old:virtual_from_version:50158" => 1689, - "old:virtual_from_version:45075" => 1125, - "old:virtual_from_version:45461" => 1009, - "old:virtual_from_version:42702" => 1077, - "old:virtual_from_version:42388" => 1000, - "old:virtual_from_version:40202" => 1304, - "old:virtual_from_version:42235" => 1037, - "old:virtual_from_version:44211" => 1025, - "old:virtual_from_version:39786" => 1125, - "old:virtual_from_version:45260" => 1036, - "old:virtual_from_version:49523" => 1070, - "old:virtual_from_version:47416" => 1402, - "old:virtual_from_version:44401" => 1007, - "old:virtual_from_version:46382" => 1077, - "old:virtual_from_version:49260" => 1532, - "old:virtual_from_version:47626" => 3078, - "old:virtual_from_version:49443" => 1689, - "old:virtual_from_version:49200" => 1077, - "old:virtual_from_version:42988" => 1037, - "old:virtual_from_version:42048" => 1070, - "old:virtual_from_version:50406" => 1150, - "old:virtual_from_version:44069" => 1077, - "old:virtual_from_version:46650" => 1537, - "old:virtual_from_version:38330" => 1070, - "old:virtual_from_version:49417" => 1689, - "old:virtual_from_version:44862" => 1070, - "old:virtual_from_version:50148" => 1032, - "old:virtual_from_version:49858" => 1070, - "old:virtual_from_version:42108" => 1070, - "old:virtual_from_version:42497" => 1130, - "old:virtual_from_version:40408" => 1404, - "old:virtual_from_version:50760" => 3274, - "old:virtual_from_version:50301" => 3131, - "old:virtual_from_version:45602" => 1172, - "old:virtual_from_version:49539" => 1489, - "old:virtual_from_version:47019" => 1077, - "old:virtual_from_version:46976" => 1070, - "old:virtual_from_version:45550" => 1025, - "old:virtual_from_version:45806" => 1077, - "old:virtual_from_version:45336" => 1009, - "old:virtual_from_version:46152" => 1077, - "old:virtual_from_version:49266" => 1070, - "old:virtual_from_version:50169" => 3201, - "old:virtual_from_version:49711" => 1037, - "old:virtual_from_version:46944" => 1077, - "old:virtual_from_version:42924" => 1037, - "old:virtual_from_version:42823" => 1077, - "old:virtual_from_version:44432" => 1526, - "old:virtual_from_version:50175" => 1314, - "old:virtual_from_version:47082" => 1070, - "old:virtual_from_version:47989" => 1077, - "old:virtual_from_version:40710" => 1009, - "old:virtual_from_version:45716" => 1107, - "old:virtual_from_version:50766" => 1057, - "old:virtual_from_version:49658" => 3189, - "old:virtual_from_version:47156" => 1077, - "old:virtual_from_version:42054" => 1048, - "old:virtual_from_version:45762" => 1027, - "old:virtual_from_version:47693" => 1077, - "old:virtual_from_version:49963" => 3210, - "old:virtual_from_version:42873" => 1505, - "old:virtual_from_version:44625" => 1037, - "old:virtual_from_version:49516" => 1580, - "old:virtual_from_version:46780" => 1077, - "old:virtual_from_version:47373" => 3008, - "old:virtual_from_version:47879" => 1077, - "old:virtual_from_version:45438" => 1136, - "old:virtual_from_version:47825" => 1659, - "old:virtual_from_version:47299" => 1125, - "old:virtual_from_version:50596" => 3265, - "old:virtual_from_version:44490" => 1037, - "old:virtual_from_version:42519" => 1077, - "old:virtual_from_version:42640" => 1009, - "old:virtual_from_version:47790" => 3006, - "old:virtual_from_version:40671" => 1025, - "old:virtual_from_version:50036" => 3219, - "old:virtual_from_version:44142" => 1110, - "old:virtual_from_version:44538" => 1125, - "old:virtual_from_version:44594" => 1009, - "old:virtual_from_version:45350" => 1110, - "old:virtual_from_version:44296" => 1107, - "old:virtual_from_version:50078" => 3222, - "old:virtual_from_version:44989" => 1015, - "old:virtual_from_version:49556" => 1107, - "old:virtual_from_version:42405" => 1070, - "old:virtual_from_version:42559" => 1009, - "old:virtual_from_version:45098" => 1110, - "old:virtual_from_version:40894" => 1109, - "old:virtual_from_version:45970" => 1009, - "old:virtual_from_version:46009" => 1051, - "old:virtual_from_version:49877" => 1150, - "old:virtual_from_version:46799" => 1555, - "old:virtual_from_version:42198" => 1037, - "old:virtual_from_version:44833" => 1077, - "old:virtual_from_version:47860" => 1001, - "old:virtual_from_version:45732" => 1532, - "old:virtual_from_version:46262" => 1517, - "old:virtual_from_version:49817" => 3199, - "old:virtual_from_version:44054" => 1025, - "old:virtual_from_version:46005" => 1078, - "old:virtual_from_version:50633" => 3192, - "old:virtual_from_version:40847" => 1037, - "old:virtual_from_version:49842" => 3003, - "old:virtual_from_version:49464" => 1070, - "old:virtual_from_version:45340" => 1136, - "old:virtual_from_version:42174" => 1037, - "old:virtual_from_version:44600" => 1498, - "old:virtual_from_version:42308" => 1070, - "old:virtual_from_version:40818" => 1067, - "old:virtual_from_version:42696" => 1077, - "old:virtual_from_version:49823" => 1621, - "old:virtual_from_version:50749" => 1417, - "old:virtual_from_version:49852" => 3200, - "old:virtual_from_version:42257" => 1025, - "old:virtual_from_version:50163" => 1070, - "old:virtual_from_version:46590" => 1070, - "old:virtual_from_version:47423" => 1077, - "old:virtual_from_version:45309" => 1009, - "old:virtual_from_version:46239" => 1659, - "old:virtual_from_version:47272" => 1070, - "old:virtual_from_version:45725" => 1077, - "old:virtual_from_version:45399" => 1125, - "old:virtual_from_version:46251" => 1077, - "old:virtual_from_version:45642" => 1107, - "old:virtual_from_version:47742" => 1070, - "old:virtual_from_version:47057" => 1444, - "old:virtual_from_version:50258" => 1532, - "old:virtual_from_version:25148" => 1049, - "old:virtual_from_version:43100" => 2092, - "old:virtual_from_version:50767" => 1057, - "old:virtual_from_version:40565" => 1222, - "old:virtual_from_version:47351" => 1404, - "old:virtual_from_version:49422" => 1689, - "old:virtual_from_version:49181" => 1585, - "old:virtual_from_version:46719" => 1007, - "old:virtual_from_version:44790" => 1070, - "old:virtual_from_version:44677" => 1067, - "old:virtual_from_version:49486" => 1025, - "old:virtual_from_version:49674" => 1067, - "old:virtual_from_version:50120" => 1172, - "old:virtual_from_version:46974" => 1689, - "old:virtual_from_version:46797" => 1025, - "old:virtual_from_version:49020" => 1070, - "old:virtual_from_version:42752" => 1023, - "old:virtual_from_version:50008" => 1070, - "old:virtual_from_version:42395" => 1070, - "old:virtual_from_version:44364" => 1091, - "old:virtual_from_version:49861" => 3131, - "old:virtual_from_version:46903" => 1689, - "old:virtual_from_version:49246" => 1077, - "old:virtual_from_version:50572" => 3214, - "old:virtual_from_version:47753" => 1517, - "old:virtual_from_version:47292" => 1109, - "old:virtual_from_version:45390" => 1362, - "old:virtual_from_version:50641" => 1417, - "old:virtual_from_version:40858" => 1077, - "old:virtual_from_version:45766" => 1401, - "old:virtual_from_version:46701" => 1070, - "old:virtual_from_version:50363" => 3131, - "old:virtual_from_version:44397" => 1063, - "old:virtual_from_version:42276" => 1070, - "old:virtual_from_version:44615" => 1025, - "old:virtual_from_version:45935" => 1404, - "old:virtual_from_version:47777" => 1125, - "old:virtual_from_version:38984" => 1067, - "old:virtual_from_version:45484" => 1532, - "old:virtual_from_version:46604" => 1006, - "old:virtual_from_version:44347" => 1077, - "old:virtual_from_version:46407" => 1077, - "old:virtual_from_version:40553" => 1007, - "old:virtual_from_version:40777" => 1404, - "old:virtual_from_version:42314" => 1077, - "old:virtual_from_version:44551" => 1037, - "old:virtual_from_version:49567" => 1402, - "old:virtual_from_version:39002" => 1104, - "old:virtual_from_version:44685" => 1037, - "old:virtual_from_version:49729" => 1489, - "old:virtual_from_version:42814" => 1009, - "old:virtual_from_version:49230" => 3157, - "old:virtual_from_version:40801" => 1077, - "old:virtual_from_version:42965" => 1009, - "old:virtual_from_version:40798" => 1107, - "old:virtual_from_version:38377" => 1007, - "old:virtual_from_version:40682" => 1404, - "old:virtual_from_version:48022" => 2122, - "old:virtual_from_version:49558" => 1009, - "old:virtual_from_version:50052" => 1070, - "old:virtual_from_version:42191" => 1077, - "old:virtual_from_version:42143" => 1222, - "old:virtual_from_version:49009" => 1125, - "old:virtual_from_version:46758" => 1109, - "old:virtual_from_version:42637" => 1484, - "old:virtual_from_version:44090" => 1037, - "old:virtual_from_version:47349" => 1172, - "old:virtual_from_version:45354" => 1009, - "old:virtual_from_version:46366" => 1077, - "old:virtual_from_version:50696" => 1417, - "old:virtual_from_version:50628" => 1417, - "old:virtual_from_version:39798" => 1237, - "old:virtual_from_version:47170" => 3032, - "old:virtual_from_version:42811" => 1081, - "old:virtual_from_version:40659" => 1035, - "old:virtual_from_version:45891" => 1070, - "old:virtual_from_version:45282" => 1115, - "old:virtual_from_version:47572" => 1444, - "old:virtual_from_version:46559" => 1574, - "old:virtual_from_version:45146" => 1567, - "old:virtual_from_version:50241" => 3131, - "old:virtual_from_version:42088" => 1077, - "old:virtual_from_version:49633" => 1404, - "old:virtual_from_version:44541" => 1025, - "old:virtual_from_version:42554" => 1009, - "old:virtual_from_version:49805" => 1621, - "old:virtual_from_version:46274" => 1025, - "old:virtual_from_version:42533" => 1037, - "old:virtual_from_version:42349" => 1091, - "old:virtual_from_version:47239" => 1070, - "old:virtual_from_version:49973" => 1689, - "old:virtual_from_version:47685" => 1109, - "old:virtual_from_version:47045" => 1070, - "old:virtual_from_version:47407" => 1109, - "old:virtual_from_version:47571" => 1077, - "old:virtual_from_version:47099" => 1077, - "old:virtual_from_version:47654" => 1109, - "old:virtual_from_version:46214" => 1077, - "old:virtual_from_version:42833" => 1062, - "old:virtual_from_version:38703" => 1081, - "old:virtual_from_version:47341" => 1109, - "old:virtual_from_version:49039" => 1125, - "old:virtual_from_version:46703" => 1077, - "old:virtual_from_version:49023" => 1070, - "old:virtual_from_version:50632" => 3259, - "old:virtual_from_version:42341" => 1070, - "old:virtual_from_version:45637" => 1136, - "old:virtual_from_version:45811" => 1532, - "old:virtual_from_version:49368" => 3139, - "old:virtual_from_version:47623" => 1109, - "old:virtual_from_version:45587" => 1077, - "old:virtual_from_version:42218" => 1070, - "old:virtual_from_version:47086" => 1070, - "old:virtual_from_version:44002" => 1009, - "old:virtual_from_version:45939" => 1397, - "old:virtual_from_version:50367" => 1125, - "old:virtual_from_version:29976" => 1009, - "old:virtual_from_version:39976" => 1257, - "old:virtual_from_version:44838" => 1488, - "old:virtual_from_version:38370" => 1067, - "old:virtual_from_version:49500" => 1070, - "old:virtual_from_version:40508" => 1037, - "old:virtual_from_version:49967" => 1583, - "old:virtual_from_version:40527" => 1070, - "old:virtual_from_version:45483" => 1077, - "old:virtual_from_version:49859" => 1125, - "old:virtual_from_version:38364" => 1001, - "old:virtual_from_version:49153" => 1689, - "old:virtual_from_version:46795" => 1125, - "old:virtual_from_version:44557" => 1009, - "old:virtual_from_version:49532" => 1689, - "old:virtual_from_version:49513" => 1125, - "old:virtual_from_version:46332" => 1172, - "old:virtual_from_version:50403" => 3131, - "old:virtual_from_version:46672" => 1125, - "old:virtual_from_version:39038" => 1142, - "old:virtual_from_version:44349" => 1067, - "old:virtual_from_version:45541" => 1404, - "old:virtual_from_version:40616" => 1172, - "old:virtual_from_version:49366" => 1585, - "old:virtual_from_version:40999" => 1110, - "old:virtual_from_version:46540" => 1070, - "old:virtual_from_version:40504" => 1070, - "old:virtual_from_version:47178" => 1101, - "old:virtual_from_version:50609" => 1067, - "old:virtual_from_version:44723" => 1537, - "old:virtual_from_version:49245" => 1015, - "old:virtual_from_version:46963" => 1077, - "old:virtual_from_version:42583" => 1070, - "old:virtual_from_version:50588" => 3194, - "old:virtual_from_version:45225" => 1444, - "old:virtual_from_version:40982" => 1037, - "old:virtual_from_version:45987" => 1639, - "old:virtual_from_version:50230" => 1070, - "old:virtual_from_version:45826" => 1070, - "old:virtual_from_version:39291" => 1076, - "old:virtual_from_version:45426" => 1037, - "old:virtual_from_version:47083" => 1125, - "old:virtual_from_version:47069" => 1125, - "old:virtual_from_version:42841" => 1025, - "old:virtual_from_version:40987" => 1070, - "old:virtual_from_version:44020" => 1077, - "old:virtual_from_version:43092" => 2084, - "old:virtual_from_version:45830" => 1112, - "old:virtual_from_version:42111" => 1070, - "old:virtual_from_version:45849" => 1070, - "old:virtual_from_version:44968" => 1136, - "old:virtual_from_version:40809" => 1009, - "old:virtual_from_version:46665" => 1070, - "old:virtual_from_version:42505" => 1023, - "old:virtual_from_version:47009" => 1070, - "old:virtual_from_version:42316" => 1136, - "old:virtual_from_version:47055" => 1172, - "old:virtual_from_version:44000" => 1125, - "old:virtual_from_version:47354" => 1077, - "old:virtual_from_version:42414" => 1105, - "old:virtual_from_version:44686" => 1311, - "old:virtual_from_version:47612" => 1125, - "old:virtual_from_version:47289" => 1070, - "old:virtual_from_version:45286" => 1404, - "old:virtual_from_version:50187" => 1580, - "old:virtual_from_version:50066" => 1172, - "old:virtual_from_version:49123" => 1012, - "old:virtual_from_version:40841" => 1025, - "old:virtual_from_version:39350" => 1062, - "old:virtual_from_version:44835" => 1381, - "old:virtual_from_version:46862" => 1172, - "old:virtual_from_version:44330" => 1107, - "old:virtual_from_version:45917" => 1001, - "old:virtual_from_version:46491" => 1568, - "old:virtual_from_version:44772" => 1077, - "old:virtual_from_version:45943" => 1070, - "old:virtual_from_version:47803" => 1048, - "old:virtual_from_version:45469" => 1025, - "old:virtual_from_version:40387" => 1081, - "old:virtual_from_version:50599" => 1125, - "old:virtual_from_version:40462" => 1311, - "old:virtual_from_version:50520" => 1311, - "old:virtual_from_version:42185" => 1037, - "old:virtual_from_version:38608" => 1110, - "old:virtual_from_version:50060" => 1125, - "old:virtual_from_version:42990" => 1077, - "old:virtual_from_version:44363" => 1078, - "old:virtual_from_version:47913" => 1070, - "old:virtual_from_version:45290" => 1578, - "old:virtual_from_version:46027" => 1070, - "old:virtual_from_version:49295" => 1077, - "old:virtual_from_version:42418" => 1077, - "old:virtual_from_version:46815" => 1077, - "old:virtual_from_version:42538" => 1025, - "old:virtual_from_version:50433" => 1401, - "old:virtual_from_version:47568" => 1125, - "old:virtual_from_version:40275" => 1019, - "old:virtual_from_version:44227" => 1077, - "old:virtual_from_version:49509" => 1037, - "old:virtual_from_version:39155" => 1067, - "old:virtual_from_version:49886" => 1488, - "old:virtual_from_version:49267" => 1077, - "old:virtual_from_version:44474" => 1077, - "old:virtual_from_version:44576" => 1077, - "old:virtual_from_version:49375" => 1656, - "old:virtual_from_version:47522" => 1537, - "old:virtual_from_version:45546" => 1136, - "old:virtual_from_version:46040" => 1488, - "old:virtual_from_version:49081" => 1555, - "old:virtual_from_version:39366" => 1017, - "old:virtual_from_version:39536" => 1112, - "old:virtual_from_version:44281" => 1037, - "old:virtual_from_version:40992" => 1107, - "old:virtual_from_version:42266" => 1037, - "old:virtual_from_version:46813" => 1666, - "old:virtual_from_version:39595" => 1084, - "old:virtual_from_version:50054" => 1025, - "old:virtual_from_version:42307" => 1110, - "old:virtual_from_version:49104" => 3136, - "old:virtual_from_version:45982" => 1638, - "old:virtual_from_version:45064" => 1125, - "old:virtual_from_version:50339" => 3236, - "old:virtual_from_version:49168" => 1070, - "old:virtual_from_version:42365" => 1037, - "old:virtual_from_version:45690" => 1621, - "old:virtual_from_version:42110" => 1037, - "old:virtual_from_version:49769" => 1078, - "old:virtual_from_version:44597" => 1110, - "old:virtual_from_version:46851" => 1077, - "old:virtual_from_version:44553" => 1070, - "old:virtual_from_version:44248" => 1009, - "old:virtual_from_version:49820" => 1100, - "old:virtual_from_version:44997" => 1172, - "old:virtual_from_version:44178" => 1438, - "old:virtual_from_version:45657" => 1076, - "old:virtual_from_version:46546" => 1125, - "old:virtual_from_version:44700" => 1070, - "old:virtual_from_version:49004" => 1532, - "old:virtual_from_version:42661" => 1067, - "old:virtual_from_version:46142" => 1077, - "old:virtual_from_version:38786" => 1104, - "old:virtual_from_version:42672" => 1489, - "old:virtual_from_version:49803" => 1070, - "old:virtual_from_version:44619" => 1110, - "old:virtual_from_version:43085" => 2082, - "old:virtual_from_version:42801" => 1057, - "old:virtual_from_version:40561" => 1067, - "old:virtual_from_version:47551" => 1109, - "old:virtual_from_version:49203" => 1107, - "old:virtual_from_version:44486" => 1070, - "old:virtual_from_version:49573" => 1659, - "old:virtual_from_version:47585" => 1070, - "old:virtual_from_version:38355" => 1108, - "old:virtual_from_version:46436" => 1067, - "old:virtual_from_version:49133" => 3137, - "old:virtual_from_version:46560" => 1689, - "old:virtual_from_version:44520" => 1048, - "old:virtual_from_version:46960" => 1077, - "old:virtual_from_version:42544" => 1110, - "old:virtual_from_version:49269" => 1025, - "old:virtual_from_version:46467" => 1321, - "old:virtual_from_version:49849" => 1537, - "old:virtual_from_version:46394" => 1582, - "old:virtual_from_version:50100" => 3221, - "old:virtual_from_version:43075" => 2073, - "old:virtual_from_version:46180" => 1404, - "old:virtual_from_version:42415" => 1107, - "old:virtual_from_version:50342" => 1224, - "old:virtual_from_version:50714" => 1417, - "old:virtual_from_version:45918" => 1077, - "old:virtual_from_version:49322" => 1649, - "old:virtual_from_version:50023" => 3131, - "old:virtual_from_version:44754" => 1025, - "old:virtual_from_version:43027" => 2052, - "old:virtual_from_version:50224" => 3016, - "old:virtual_from_version:40852" => 1077, - "old:virtual_from_version:42007" => 1110, - "old:virtual_from_version:46015" => 1009, - "old:virtual_from_version:13578" => 1032, - "old:virtual_from_version:49750" => 1112, - "old:virtual_from_version:42492" => 1125, - "old:virtual_from_version:46323" => 1070, - "old:virtual_from_version:44025" => 1037, - "old:virtual_from_version:49550" => 1574, - "old:virtual_from_version:49600" => 1095, - "old:virtual_from_version:47458" => 1125, - "old:virtual_from_version:46561" => 1070, - "old:virtual_from_version:44871" => 1498, - "old:virtual_from_version:49760" => 3002, - "old:virtual_from_version:44595" => 1077, - "old:virtual_from_version:46588" => 1077, - "old:virtual_from_version:45375" => 1009, - "old:virtual_from_version:46188" => 1649, - "old:virtual_from_version:49783" => 1659, - "old:virtual_from_version:50009" => 1314, - "old:virtual_from_version:47543" => 1077, - "old:virtual_from_version:45488" => 1107, - "old:virtual_from_version:42756" => 1109, - "old:virtual_from_version:39727" => 1224, - "old:virtual_from_version:49832" => 1689, - "old:virtual_from_version:40701" => 1077, - "old:virtual_from_version:45890" => 1506, - "old:virtual_from_version:45932" => 1077, - "old:virtual_from_version:46209" => 1077, - "old:virtual_from_version:44821" => 1077, - "old:virtual_from_version:49079" => 1070, - "old:virtual_from_version:44996" => 1017, - "old:virtual_from_version:50266" => 1105, - "old:virtual_from_version:46957" => 1007, - "old:virtual_from_version:44518" => 1037, - "old:virtual_from_version:40249" => 1009, - "old:virtual_from_version:45736" => 1109, - "old:virtual_from_version:46325" => 1404, - "old:virtual_from_version:50734" => 1404, - "old:virtual_from_version:50666" => 3259, - "old:virtual_from_version:50064" => 1125, - "old:virtual_from_version:44777" => 1353, - "old:virtual_from_version:45902" => 1038, - "old:virtual_from_version:47968" => 1125, - "old:virtual_from_version:40516" => 1070, - "old:virtual_from_version:50458" => 1489, - "old:virtual_from_version:13323" => 1010, - "old:virtual_from_version:50034" => 3131, - "old:virtual_from_version:45947" => 1627, - "old:virtual_from_version:50013" => 3215, - "old:virtual_from_version:46432" => 1136, - "old:virtual_from_version:46284" => 1077, - "old:virtual_from_version:44920" => 1009, - "old:virtual_from_version:42748" => 1110, - "old:virtual_from_version:50159" => 3131, - "old:virtual_from_version:41011" => 2022, - "old:virtual_from_version:44336" => 1037, - "old:virtual_from_version:42104" => 1070, - "old:virtual_from_version:42371" => 1037, - "old:virtual_from_version:47395" => 1125, - "old:virtual_from_version:49661" => 1070, - "old:virtual_from_version:49463" => 1423, - "old:virtual_from_version:45825" => 1626, - "old:virtual_from_version:46881" => 1689, - "old:virtual_from_version:39019" => 1016, - "old:virtual_from_version:40863" => 1037, - "old:virtual_from_version:42861" => 1136, - "old:virtual_from_version:47189" => 1109, - "old:virtual_from_version:50249" => 3131, - "old:virtual_from_version:49874" => 1100, - "old:virtual_from_version:50715" => 3259, - "old:virtual_from_version:47240" => 1136, - "old:virtual_from_version:40906" => 1037, - "old:virtual_from_version:49700" => 1070, - "old:virtual_from_version:50309" => 1067, - "old:virtual_from_version:38546" => 1025, - "old:virtual_from_version:45264" => 1095, - "old:virtual_from_version:44688" => 1009, - "old:virtual_from_version:45988" => 1362, - "old:virtual_from_version:42420" => 1404, - "old:virtual_from_version:44383" => 1031, - "old:virtual_from_version:47929" => 1362, - "old:virtual_from_version:49334" => 1037, - "old:virtual_from_version:50625" => 1128, - "old:virtual_from_version:40592" => 1077, - "old:virtual_from_version:50114" => 1689, - "old:virtual_from_version:44161" => 1077, - "old:virtual_from_version:50225" => 3131, - "old:virtual_from_version:49743" => 1404, - "old:virtual_from_version:44629" => 1082, - "old:virtual_from_version:50569" => 1404, - "old:virtual_from_version:42151" => 1009, - "old:virtual_from_version:45024" => 1006, - "old:virtual_from_version:42043" => 1070, - "old:virtual_from_version:42768" => 1006, - "old:virtual_from_version:39612" => 1035, - "old:virtual_from_version:48005" => 2106, - "old:virtual_from_version:49819" => 1070, - "old:virtual_from_version:46272" => 1136, - "old:virtual_from_version:42575" => 1172, - "old:virtual_from_version:44037" => 1070, - "old:virtual_from_version:49493" => 1105, - "old:virtual_from_version:47986" => 1109, - "old:virtual_from_version:49880" => 1070, - "old:virtual_from_version:41010" => 2021, - "old:virtual_from_version:50360" => 3131, - "old:virtual_from_version:45616" => 1077, - "old:virtual_from_version:42227" => 1037, - "old:virtual_from_version:47875" => 1037, - "old:virtual_from_version:46771" => 1077, - "old:virtual_from_version:44011" => 1016, - "old:virtual_from_version:50332" => 1076, - "old:virtual_from_version:44992" => 1067, - "old:virtual_from_version:48006" => 2105, - "old:virtual_from_version:45609" => 1404, - "old:virtual_from_version:49646" => 1070, - "old:virtual_from_version:42272" => 1077, - "old:virtual_from_version:43037" => 2036, - "old:virtual_from_version:40741" => 1070, - "old:virtual_from_version:42485" => 1009, - "old:virtual_from_version:42735" => 1037, - "old:virtual_from_version:44974" => 1144, - "old:virtual_from_version:45521" => 1580, - "old:virtual_from_version:50386" => 3131, - "old:virtual_from_version:42038" => 1009, - "old:virtual_from_version:44981" => 1048, - "old:virtual_from_version:42551" => 1172, - "old:virtual_from_version:49239" => 1070, - "old:virtual_from_version:44954" => 1077, - "old:virtual_from_version:47871" => 1314, - "old:virtual_from_version:44844" => 1070, - "old:virtual_from_version:50381" => 1049, - "old:virtual_from_version:44847" => 1070, - "old:virtual_from_version:50317" => 3236, - "old:virtual_from_version:45874" => 1077, - "old:virtual_from_version:49409" => 1067, - "old:virtual_from_version:49197" => 1517, - "old:virtual_from_version:47467" => 1070, - "old:virtual_from_version:42851" => 1037, - "old:virtual_from_version:40541" => 1070, - "old:virtual_from_version:49582" => 3119, - "old:virtual_from_version:46647" => 1070, - "old:virtual_from_version:50623" => 1033, - "old:virtual_from_version:47273" => 1109, - "old:virtual_from_version:46024" => 1070, - "old:virtual_from_version:40735" => 1025, - "old:virtual_from_version:46157" => 1070, - "old:virtual_from_version:49748" => 1070, - "old:virtual_from_version:45664" => 1019, - "old:virtual_from_version:42586" => 1077, - "old:virtual_from_version:49519" => 1125, - "old:virtual_from_version:50172" => 1070, - "old:virtual_from_version:44454" => 1529, - "old:virtual_from_version:44626" => 1070, - "old:virtual_from_version:45571" => 1105, - "old:virtual_from_version:44493" => 1107, - "old:virtual_from_version:50204" => 3131, - "old:virtual_from_version:49495" => 1689, - "old:virtual_from_version:50216" => 3131, - "old:virtual_from_version:50684" => 1689, - "old:virtual_from_version:47260" => 1125, - "old:virtual_from_version:40764" => 1046, - "old:virtual_from_version:40874" => 1077, - "old:virtual_from_version:42480" => 1077, - "old:virtual_from_version:50152" => 3131, - "old:virtual_from_version:45021" => 1063, - "old:virtual_from_version:42717" => 1077, - "old:virtual_from_version:47062" => 1077, - "old:virtual_from_version:49398" => 1070, - "old:virtual_from_version:42303" => 1125, - "old:virtual_from_version:13209" => 1061, - "old:virtual_from_version:50527" => 1070, - "old:virtual_from_version:46602" => 1125, - "old:virtual_from_version:46744" => 1555, - "old:virtual_from_version:40943" => 1037, - "old:virtual_from_version:40939" => 1077, - "old:virtual_from_version:44990" => 1090, - "old:virtual_from_version:47932" => 1067, - "old:virtual_from_version:42373" => 1105, - "old:virtual_from_version:46522" => 1070, - "old:virtual_from_version:38929" => 1061, - "old:virtual_from_version:47325" => 1077, - "old:virtual_from_version:39909" => 1115, - "old:virtual_from_version:50470" => 3247, - "old:virtual_from_version:47471" => 1444, - "old:virtual_from_version:49041" => 1067, - "old:virtual_from_version:47639" => 1070, - "old:virtual_from_version:49387" => 3129, - "old:virtual_from_version:47574" => 1689, - "old:virtual_from_version:49833" => 3002, - "old:virtual_from_version:45832" => 1077, - "old:virtual_from_version:44503" => 1077, - "old:virtual_from_version:50428" => 1580, - "old:virtual_from_version:49093" => 3094, - "old:virtual_from_version:44402" => 1008, - "old:virtual_from_version:38351" => 1029, - "old:virtual_from_version:41018" => 2027, - "old:virtual_from_version:46841" => 1077, - "old:virtual_from_version:46690" => 1070, - "old:virtual_from_version:38753" => 1000, - "old:virtual_from_version:46637" => 1077, - "old:virtual_from_version:47339" => 1125, - "old:virtual_from_version:48008" => 2108, - "old:virtual_from_version:49868" => 3204, - "old:virtual_from_version:46429" => 1077, - "old:virtual_from_version:40704" => 1009, - "old:virtual_from_version:40762" => 1048, - "old:virtual_from_version:46282" => 1404, - "old:virtual_from_version:42398" => 1037, - "old:virtual_from_version:42446" => 1107, - "old:virtual_from_version:47576" => 1070, - "old:virtual_from_version:44655" => 1009, - "old:virtual_from_version:44384" => 1036, - "old:virtual_from_version:49109" => 3146, - "old:virtual_from_version:47910" => 3008, - "old:virtual_from_version:46034" => 1649, - "old:virtual_from_version:40586" => 1077, - "old:virtual_from_version:40243" => 1136, - "old:virtual_from_version:44036" => 1488, - "old:virtual_from_version:50474" => 3251, - "old:virtual_from_version:46010" => 1048, - "old:virtual_from_version:40860" => 1048, - "old:virtual_from_version:45900" => 1077, - "old:virtual_from_version:47391" => 3008, - "old:virtual_from_version:45219" => 1574, - "old:virtual_from_version:37575" => 1015, - "old:virtual_from_version:49187" => 1070, - "old:virtual_from_version:39951" => 1109, - "old:virtual_from_version:47923" => 1565, - "old:virtual_from_version:47563" => 1404, - "old:virtual_from_version:44366" => 1007, - "old:virtual_from_version:42615" => 1077, - "old:virtual_from_version:50190" => 1146, - "old:virtual_from_version:45145" => 1037, - "old:virtual_from_version:45948" => 1627, - "old:virtual_from_version:44827" => 1552, - "old:virtual_from_version:46046" => 1077, - "old:virtual_from_version:42548" => 1009, - "old:virtual_from_version:49796" => 1689, - "old:virtual_from_version:47187" => 1070, - "old:virtual_from_version:45769" => 1009, - "old:virtual_from_version:44740" => 1172, - "old:virtual_from_version:46288" => 1070, - "old:virtual_from_version:46668" => 1070, - "old:virtual_from_version:49371" => 1077, - "old:virtual_from_version:47873" => 1070, - "old:virtual_from_version:46531" => 1105, - "old:virtual_from_version:47431" => 1404, - "old:virtual_from_version:46375" => 1585, - "old:virtual_from_version:44828" => 1070, - "old:virtual_from_version:44033" => 1070, - "old:virtual_from_version:47897" => 1037, - "old:virtual_from_version:44654" => 1070, - "old:virtual_from_version:42820" => 1104, - "old:virtual_from_version:40868" => 1037, - "old:virtual_from_version:40627" => 1025, - "old:virtual_from_version:45398" => 1008, - "old:virtual_from_version:47016" => 1067, - "old:virtual_from_version:42089" => 1037, - "old:virtual_from_version:49183" => 1070, - "old:virtual_from_version:46119" => 1092, - "old:virtual_from_version:42630" => 1070, - "old:virtual_from_version:40146" => 1078, - "old:virtual_from_version:44534" => 1025, - "old:virtual_from_version:46752" => 1077, - "old:virtual_from_version:47136" => 1659, - "old:virtual_from_version:50156" => 1517, - "old:virtual_from_version:44927" => 1125, - "old:virtual_from_version:40970" => 1077, - "old:virtual_from_version:47275" => 1077, - "old:virtual_from_version:47995" => 1125, - "old:virtual_from_version:46927" => 1077, - "old:virtual_from_version:42570" => 1172, - "old:virtual_from_version:46686" => 1125, - "old:virtual_from_version:40773" => 1404, - "old:virtual_from_version:46621" => 1070, - "old:virtual_from_version:45117" => 1077, - "old:virtual_from_version:49185" => 1077, - "old:virtual_from_version:45475" => 1110, - "old:virtual_from_version:45683" => 1019, - "old:virtual_from_version:49277" => 1007, - "old:virtual_from_version:42268" => 1070, - "old:virtual_from_version:47334" => 3006, - "old:virtual_from_version:50151" => 1580, - "old:virtual_from_version:50682" => 1585, - "old:virtual_from_version:49294" => 1037, - "old:virtual_from_version:40985" => 1407, - "old:virtual_from_version:42092" => 1037, - "old:virtual_from_version:47713" => 1621, - "old:virtual_from_version:42987" => 1077, - "old:virtual_from_version:44570" => 1037, - "old:virtual_from_version:46118" => 1077, - "old:virtual_from_version:46722" => 1172, - "old:virtual_from_version:45740" => 1077, - "old:virtual_from_version:46049" => 1125, - "old:virtual_from_version:50264" => 3131, - "old:virtual_from_version:45738" => 1067, - "old:virtual_from_version:49939" => 1107, - "old:virtual_from_version:42979" => 1070, - "old:virtual_from_version:44966" => 1049, - "old:virtual_from_version:45473" => 1136, - "old:virtual_from_version:46769" => 1498, - "old:virtual_from_version:47954" => 1109, - "old:virtual_from_version:42589" => 1110, - "old:virtual_from_version:46999" => 3015, - "old:virtual_from_version:40400" => 1350, - "old:virtual_from_version:44608" => 1110, - "old:virtual_from_version:44446" => 1077, - "old:virtual_from_version:44528" => 1077, - "old:virtual_from_version:42093" => 1335, - "old:virtual_from_version:46749" => 1077, - "old:virtual_from_version:44415" => 1022, - "old:virtual_from_version:50559" => 1070, - "old:virtual_from_version:49286" => 1077, - "old:virtual_from_version:42447" => 1070, - "old:virtual_from_version:44131" => 1077, - "old:virtual_from_version:40960" => 1107, - "old:virtual_from_version:49647" => 1314, - "old:virtual_from_version:49620" => 1158, - "old:virtual_from_version:50583" => 3259, - "old:virtual_from_version:42961" => 1037, - "old:virtual_from_version:42424" => 1009, - "old:virtual_from_version:47653" => 1125, - "old:virtual_from_version:49401" => 3169, - "old:virtual_from_version:42229" => 1083, - "old:virtual_from_version:44118" => 1077, - "old:virtual_from_version:42452" => 1439, - "old:virtual_from_version:44509" => 1311, - "old:virtual_from_version:49336" => 1404, - "old:virtual_from_version:39966" => 1053, - "old:virtual_from_version:43040" => 2038, - "old:virtual_from_version:46442" => 1343, - "old:virtual_from_version:42932" => 1146, - "old:virtual_from_version:44416" => 1023, - "old:virtual_from_version:49767" => 3002, - "old:virtual_from_version:42173" => 1077, - "old:virtual_from_version:44277" => 1070, - "old:virtual_from_version:46037" => 1107, - "old:virtual_from_version:44727" => 1025, - "old:virtual_from_version:44201" => 1081, - "old:virtual_from_version:40983" => 1328, - "old:virtual_from_version:46969" => 1070, - "old:virtual_from_version:40789" => 1025, - "old:virtual_from_version:49505" => 1404, - "old:virtual_from_version:42560" => 1025, - "old:virtual_from_version:44350" => 1070, - "old:virtual_from_version:49001" => 3127, - "old:virtual_from_version:46786" => 1077, - "old:virtual_from_version:45614" => 1070, - "old:virtual_from_version:49720" => 1689, - "old:virtual_from_version:40840" => 1009, - "old:virtual_from_version:47650" => 1109, - "old:virtual_from_version:47999" => 1125, - "old:virtual_from_version:49456" => 1070, - "old:virtual_from_version:40646" => 1394, - "old:virtual_from_version:46990" => 1172, - "old:virtual_from_version:49838" => 1009, - "old:virtual_from_version:50440" => 3244, - "old:virtual_from_version:47371" => 3046, - "old:virtual_from_version:39662" => 1081, - "old:virtual_from_version:42139" => 1077, - "old:virtual_from_version:50388" => 1125, - "old:virtual_from_version:47945" => 1070, - "old:virtual_from_version:47590" => 1125, - "old:virtual_from_version:45276" => 1222, - "old:virtual_from_version:44045" => 1070, - "old:virtual_from_version:47966" => 1649, - "old:virtual_from_version:44399" => 1091, - "old:virtual_from_version:40829" => 1125, - "old:virtual_from_version:47194" => 1077, - "old:virtual_from_version:47569" => 1109, - "old:virtual_from_version:44409" => 1064, - "old:virtual_from_version:44911" => 1125, - "old:virtual_from_version:46311" => 1077, - "old:virtual_from_version:49892" => 1689, - "old:virtual_from_version:46641" => 1077, - "old:virtual_from_version:44639" => 1077, - "old:virtual_from_version:49089" => 3139, - "old:virtual_from_version:47893" => 1123, - "old:virtual_from_version:46806" => 1077, - "old:virtual_from_version:45066" => 1070, - "old:virtual_from_version:46625" => 1009, - "old:virtual_from_version:42061" => 1070, - "old:virtual_from_version:47779" => 1048, - "old:virtual_from_version:42996" => 1077, - "old:virtual_from_version:47048" => 1517, - "old:virtual_from_version:47251" => 1037, - "old:virtual_from_version:44425" => 1094, - "old:virtual_from_version:49424" => 1172, - "old:virtual_from_version:46296" => 1172, - "old:virtual_from_version:44192" => 1110, - "old:virtual_from_version:46612" => 1077, - "old:virtual_from_version:49827" => 1070, - "old:virtual_from_version:42941" => 1037, - "old:virtual_from_version:40986" => 1107, - "old:virtual_from_version:46050" => 1009, - "old:virtual_from_version:46319" => 1222, - "old:virtual_from_version:46354" => 1057, - "old:virtual_from_version:40805" => 1077, - "old:virtual_from_version:50211" => 1532, - "old:virtual_from_version:46807" => 1666, - "old:virtual_from_version:47342" => 1077, - "old:virtual_from_version:40451" => 1091, - "old:virtual_from_version:44845" => 1009, - "old:virtual_from_version:44478" => 1077, - "old:virtual_from_version:46871" => 1444, - "old:virtual_from_version:42624" => 1077, - "old:virtual_from_version:40534" => 1077, - "old:virtual_from_version:42213" => 1009, - "old:virtual_from_version:42508" => 1037, - "old:virtual_from_version:46104" => 1070, - "old:virtual_from_version:47230" => 1689, - "old:virtual_from_version:42960" => 1077, - "old:virtual_from_version:50283" => 3222, - "old:virtual_from_version:42907" => 1070, - "old:virtual_from_version:45099" => 1070, - "old:virtual_from_version:45632" => 1070, - "old:virtual_from_version:39624" => 1082, - "old:virtual_from_version:45517" => 1136, - "old:virtual_from_version:46258" => 1537, - "old:virtual_from_version:45041" => 1023, - "old:virtual_from_version:47404" => 1411, - "old:virtual_from_version:40390" => 1341, - "old:virtual_from_version:46504" => 1585, - "old:virtual_from_version:49221" => 1314, - "old:virtual_from_version:50476" => 1659, - "old:virtual_from_version:45474" => 1070, - "old:virtual_from_version:46979" => 1067, - "old:virtual_from_version:47437" => 1077, - "old:virtual_from_version:50326" => 1070, - "old:virtual_from_version:45510" => 1070, - "old:virtual_from_version:47615" => 1077, - "old:virtual_from_version:49990" => 1404, - "old:virtual_from_version:50562" => 1070, - "old:virtual_from_version:46679" => 1077, - "old:virtual_from_version:46161" => 1070, - "old:virtual_from_version:42459" => 1107, - "old:virtual_from_version:50374" => 3131, - "old:virtual_from_version:46694" => 1404, - "old:virtual_from_version:42687" => 1009, - "old:virtual_from_version:46447" => 1172, - "old:virtual_from_version:10004" => 2003, - "old:virtual_from_version:46138" => 1414, - "old:virtual_from_version:40887" => 1009, - "old:virtual_from_version:40079" => 1081, - "old:virtual_from_version:49074" => 3002, - "old:virtual_from_version:46448" => 1031, - "old:virtual_from_version:8056 " => 1060, - "old:virtual_from_version:49828" => 1125, - "old:virtual_from_version:47317" => 3009, - "old:virtual_from_version:46439" => 1077, - "old:virtual_from_version:47656" => 1404, - "old:virtual_from_version:40936" => 1037, - "old:virtual_from_version:44516" => 1025, - "old:virtual_from_version:44980" => 1081, - "old:virtual_from_version:42947" => 1110, - "old:virtual_from_version:49826" => 3201, - "old:virtual_from_version:42517" => 1070, - "old:virtual_from_version:44167" => 1522, - "old:virtual_from_version:50328" => 1224, - "old:virtual_from_version:50288" => 3131, - "old:virtual_from_version:46036" => 1070, - "old:virtual_from_version:44103" => 1516, - "old:virtual_from_version:42566" => 1009, - "old:virtual_from_version:42253" => 1037, - "old:virtual_from_version:49775" => 3131, - "old:virtual_from_version:46574" => 1689, - "old:virtual_from_version:49937" => 1136, - "old:virtual_from_version:49058" => 1404, - "old:virtual_from_version:49364" => 1583, - "old:virtual_from_version:50046" => 1070, - "old:virtual_from_version:44895" => 1107, - "old:virtual_from_version:47256" => 1077, - "old:virtual_from_version:47809" => 3108, - "old:virtual_from_version:50443" => 1035, - "old:virtual_from_version:42618" => 1070, - "old:virtual_from_version:45803" => 1009, - "old:virtual_from_version:49758" => 1666, - "old:virtual_from_version:44317" => 1067, - "old:virtual_from_version:45265" => 1042, - "old:virtual_from_version:42120" => 1077, - "old:virtual_from_version:49561" => 1070, - "old:virtual_from_version:40643" => 1005, - "old:virtual_from_version:47519" => 1109, - "old:virtual_from_version:44596" => 1037, - "old:virtual_from_version:42360" => 1037, - "old:virtual_from_version:49754" => 3195, - "old:virtual_from_version:45119" => 1009, - "old:virtual_from_version:50243" => 1070, - "old:virtual_from_version:47485" => 1070, - "old:virtual_from_version:50164" => 1172, - "old:virtual_from_version:22824" => 1035, - "old:virtual_from_version:40061" => 1067, - "old:virtual_from_version:47409" => 1621, - "old:virtual_from_version:45148" => 1568, - "old:virtual_from_version:42617" => 1172, - "old:virtual_from_version:49792" => 3131, - "old:virtual_from_version:47969" => 1037, - "old:virtual_from_version:46213" => 1009, - "old:virtual_from_version:40679" => 1109, - "old:virtual_from_version:47833" => 1172, - "old:virtual_from_version:42849" => 1009, - "old:virtual_from_version:39183" => 1036, - "old:virtual_from_version:46127" => 1070, - "old:virtual_from_version:49255" => 1410, - "old:virtual_from_version:44795" => 1025, - "old:virtual_from_version:42106" => 1037, - "old:virtual_from_version:46022" => 1574, - "old:virtual_from_version:45094" => 1070, - "old:virtual_from_version:42877" => 1063, - "old:virtual_from_version:44918" => 1009, - "old:virtual_from_version:46201" => 1633, - "old:virtual_from_version:49191" => 1689, - "old:virtual_from_version:49534" => 1585, - "old:virtual_from_version:49126" => 1580, - "old:virtual_from_version:45273" => 1112, - "old:virtual_from_version:46868" => 1067, - "old:virtual_from_version:47633" => 1584, - "old:virtual_from_version:46392" => 1077, - "old:virtual_from_version:45768" => 1070, - "old:virtual_from_version:49531" => 1532, - "old:virtual_from_version:46231" => 1615, - "old:virtual_from_version:45457" => 1125, - "old:virtual_from_version:49005" => 1583, - "old:virtual_from_version:42989" => 1070, - "old:virtual_from_version:46740" => 1404, - "old:virtual_from_version:45623" => 1077, - "old:virtual_from_version:50168" => 3131, - "old:virtual_from_version:45907" => 1107, - "old:virtual_from_version:40582" => 1105, - "old:virtual_from_version:46713" => 1048, - "old:virtual_from_version:46550" => 1048, - "old:virtual_from_version:49872" => 3194, - "old:virtual_from_version:40932" => 1077, - "old:virtual_from_version:47466" => 1621, - "old:virtual_from_version:45581" => 1070, - "old:virtual_from_version:46028" => 1077, - "old:virtual_from_version:50664" => 1419, - "old:virtual_from_version:42510" => 1109, - "old:virtual_from_version:39317" => 1123, - "old:virtual_from_version:42300" => 1107, - "old:virtual_from_version:44864" => 1077, - "old:virtual_from_version:47984" => 1070, - "old:virtual_from_version:45509" => 1136, - "old:virtual_from_version:49209" => 1565, - "old:virtual_from_version:49438" => 1150, - "old:virtual_from_version:49517" => 1070, - "old:virtual_from_version:47848" => 1109, - "old:virtual_from_version:47046" => 1125, - "old:virtual_from_version:45860" => 1070, - "old:virtual_from_version:50490" => 3252, - "old:virtual_from_version:45545" => 1172, - "old:virtual_from_version:49988" => 3131, - "old:virtual_from_version:46128" => 1077, - "old:virtual_from_version:46567" => 1077, - "old:virtual_from_version:50132" => 1404, - "old:virtual_from_version:44012" => 1077, - "old:virtual_from_version:47846" => 1070, - "old:virtual_from_version:44128" => 1037, - "old:virtual_from_version:49898" => 1006, - "old:virtual_from_version:44897" => 1077, - "old:virtual_from_version:44135" => 1070, - "old:virtual_from_version:44462" => 1037, - "old:virtual_from_version:42240" => 1037, - "old:virtual_from_version:45220" => 1575, - "old:virtual_from_version:50667" => 1070, - "old:virtual_from_version:44353" => 1172, - "old:virtual_from_version:49681" => 3190, - "old:virtual_from_version:46676" => 1077, - "old:virtual_from_version:45807" => 1381, - "old:virtual_from_version:42952" => 1077, - "old:virtual_from_version:44591" => 1110, - "old:virtual_from_version:50762" => 1070, - "old:virtual_from_version:50435" => 1057, - "old:virtual_from_version:45071" => 1077, - "old:virtual_from_version:42862" => 1321, - "old:virtual_from_version:50315" => 3186, - "old:virtual_from_version:50434" => 3239, - "old:virtual_from_version:45458" => 1107, - "old:virtual_from_version:50383" => 1125, - "old:virtual_from_version:44550" => 1077, - "old:virtual_from_version:50072" => 3215, - "old:virtual_from_version:49617" => 1158, - "old:virtual_from_version:50090" => 1070, - "old:virtual_from_version:50704" => 1012, - "old:virtual_from_version:45962" => 1077, - "old:virtual_from_version:40470" => 1091, - "old:virtual_from_version:47523" => 1580, - "old:virtual_from_version:50426" => 1070, - "old:virtual_from_version:47322" => 1109, - "old:virtual_from_version:43074" => 2072, - "old:virtual_from_version:50371" => 3131, - "old:virtual_from_version:46013" => 1172, - "old:virtual_from_version:46601" => 1005, - "old:virtual_from_version:46090" => 1655, - "old:virtual_from_version:50488" => 3221, - "old:virtual_from_version:47202" => 1035, - "old:virtual_from_version:45116" => 1009, - "old:virtual_from_version:44810" => 1077, - "old:virtual_from_version:42164" => 1070, - "old:virtual_from_version:42003" => 1009, - "old:virtual_from_version:40401" => 1351, - "old:virtual_from_version:49256" => 1649, - "old:virtual_from_version:46912" => 1621, - "old:virtual_from_version:49471" => 1314, - "old:virtual_from_version:42221" => 1037, - "old:virtual_from_version:40905" => 1077, - "old:virtual_from_version:49498" => 1035, - "old:virtual_from_version:38727" => 1083, - "old:virtual_from_version:50214" => 1172, - "old:virtual_from_version:47047" => 1077, - "old:virtual_from_version:47096" => 1311, - "old:virtual_from_version:42900" => 1110, - "old:virtual_from_version:45841" => 1172, - "old:virtual_from_version:49140" => 1689, - "old:virtual_from_version:49353" => 1077, - "old:virtual_from_version:50329" => 3131, - "old:virtual_from_version:47035" => 1580, - "old:virtual_from_version:44995" => 1091, - "old:virtual_from_version:49899" => 3131, - "old:virtual_from_version:47201" => 1587, - "old:virtual_from_version:46228" => 1077, - "old:virtual_from_version:50732" => 1048, - "old:virtual_from_version:44143" => 1125, - "old:virtual_from_version:47903" => 3119, - "old:virtual_from_version:45913" => 1009, - "old:virtual_from_version:50093" => 3131, - "old:virtual_from_version:44031" => 1037, - "old:virtual_from_version:46042" => 1650, - "old:virtual_from_version:44928" => 1107, - "old:virtual_from_version:49407" => 1070, - "old:virtual_from_version:49738" => 1489, - "old:virtual_from_version:49795" => 1489, - "old:virtual_from_version:47781" => 1077, - "old:virtual_from_version:50354" => 1314, - "old:virtual_from_version:42710" => 1077, - "old:virtual_from_version:44909" => 1009, - "old:virtual_from_version:46734" => 1517, - "old:virtual_from_version:46126" => 1077, - "old:virtual_from_version:49970" => 3209, - "old:virtual_from_version:44879" => 1070, - "old:virtual_from_version:42896" => 1070, - "old:virtual_from_version:50188" => 3131, - "old:virtual_from_version:39658" => 1007, - "old:virtual_from_version:45427" => 1048, - "old:virtual_from_version:50082" => 3131, - "old:virtual_from_version:40465" => 1009, - "old:virtual_from_version:45275" => 1017, - "old:virtual_from_version:42886" => 1009, - "old:virtual_from_version:45635" => 1076, - "old:virtual_from_version:43065" => 2066, - "old:virtual_from_version:44195" => 1070, - "old:virtual_from_version:40687" => 1051, - "old:virtual_from_version:40729" => 1077, - "old:virtual_from_version:42219" => 1009, - "old:virtual_from_version:38563" => 1116, - "old:virtual_from_version:49479" => 1583, - "old:virtual_from_version:50631" => 1689, - "old:virtual_from_version:47316" => 1689, - "old:virtual_from_version:50021" => 1070, - "old:virtual_from_version:42927" => 1077, - "old:virtual_from_version:39901" => 1070, - "old:virtual_from_version:49704" => 3191, - "old:virtual_from_version:42723" => 1077, - "old:virtual_from_version:49485" => 1070, - "old:virtual_from_version:45622" => 1009, - "old:virtual_from_version:46421" => 1077, - "old:virtual_from_version:44004" => 1037, - "old:virtual_from_version:46099" => 1649, - "old:virtual_from_version:43081" => 2078, - "old:virtual_from_version:47314" => 1077, - "old:virtual_from_version:44667" => 1172, - "old:virtual_from_version:46186" => 1077, - "old:virtual_from_version:49901" => 1616, - "old:virtual_from_version:49652" => 1070, - "old:virtual_from_version:49703" => 3129, - "old:virtual_from_version:42153" => 1037, - "old:virtual_from_version:47424" => 1689, - "old:virtual_from_version:47587" => 1109, - "old:virtual_from_version:49049" => 1666, - "old:virtual_from_version:47052" => 1125, - "old:virtual_from_version:44837" => 1009, - "old:virtual_from_version:47290" => 1125, - "old:virtual_from_version:45032" => 1015, - "old:virtual_from_version:45563" => 1012, - "old:virtual_from_version:44442" => 1077, - "old:virtual_from_version:42945" => 1077, - "old:virtual_from_version:50480" => 3174, - "old:virtual_from_version:44836" => 1033, - "old:virtual_from_version:49120" => 1067, - "old:virtual_from_version:46334" => 1659, - "old:virtual_from_version:46633" => 1077, - "old:virtual_from_version:47000" => 1070, - "old:virtual_from_version:49038" => 1070, - "old:virtual_from_version:40788" => 1070, - "old:virtual_from_version:42369" => 1009, - "old:virtual_from_version:43051" => 2018, - "old:virtual_from_version:44949" => 1404, - "old:virtual_from_version:49884" => 1689, - "old:virtual_from_version:46144" => 1105, - "old:virtual_from_version:50577" => 3031, - "old:virtual_from_version:40303" => 1109, - "old:virtual_from_version:42891" => 1009, - "old:virtual_from_version:38291" => 1082, - "old:virtual_from_version:49725" => 1006, - "old:virtual_from_version:50677" => 1070, - "old:virtual_from_version:46835" => 1077, - "old:virtual_from_version:50594" => 3227, - "old:virtual_from_version:49487" => 1070, - "old:virtual_from_version:44797" => 1109, - "old:virtual_from_version:47698" => 1672, - "old:virtual_from_version:49150" => 1107, - "old:virtual_from_version:47795" => 3078, - "old:virtual_from_version:45163" => 1009, - "old:virtual_from_version:47946" => 1109, - "old:virtual_from_version:39050" => 1007, - "old:virtual_from_version:44967" => 1070, - "old:virtual_from_version:49290" => 3136, - "old:virtual_from_version:42015" => 1107, - "old:virtual_from_version:46576" => 1007, - "old:virtual_from_version:40935" => 1077, - "old:virtual_from_version:46141" => 1012, - "old:virtual_from_version:49248" => 1532, - "old:virtual_from_version:49698" => 1659, - "old:virtual_from_version:45908" => 1009, - "old:virtual_from_version:47454" => 1402, - "old:virtual_from_version:44938" => 1110, - "old:virtual_from_version:40601" => 1070, - "old:virtual_from_version:43009" => 2034, - "old:virtual_from_version:44523" => 1172, - "old:virtual_from_version:45256" => 1037, - "old:virtual_from_version:49212" => 1172, - "old:virtual_from_version:39329" => 1069, - "old:virtual_from_version:49799" => 1125, - "old:virtual_from_version:46545" => 1070, - "old:virtual_from_version:45937" => 1015, - "old:virtual_from_version:47926" => 3008, - "old:virtual_from_version:50461" => 1689, - "old:virtual_from_version:44832" => 1029, - "old:virtual_from_version:46742" => 1070, - "old:virtual_from_version:46949" => 1659, - "old:virtual_from_version:45802" => 1105, - "old:virtual_from_version:39991" => 2006, - "old:virtual_from_version:42350" => 1009, - "old:virtual_from_version:46791" => 1689, - "old:virtual_from_version:46395" => 1423, - "old:virtual_from_version:49338" => 1689, - "old:virtual_from_version:50761" => 3009, - "old:virtual_from_version:44173" => 1077, - "old:virtual_from_version:50595" => 3259, - "old:virtual_from_version:50232" => 1689, - "old:virtual_from_version:44613" => 1009, - "old:virtual_from_version:49526" => 1580, - "old:virtual_from_version:44554" => 1077, - "old:virtual_from_version:47315" => 1517, - "old:virtual_from_version:45352" => 1125, - "old:virtual_from_version:38362" => 1110, - "old:virtual_from_version:45729" => 1112, - "old:virtual_from_version:46759" => 1077, - "old:virtual_from_version:45160" => 1107, - "old:virtual_from_version:45519" => 1025, - "old:virtual_from_version:49346" => 1077, - "old:virtual_from_version:42577" => 1077, - "old:virtual_from_version:42238" => 1009, - "old:virtual_from_version:49078" => 1666, - "old:virtual_from_version:49268" => 1070, - "old:virtual_from_version:40084" => 1107, - "old:virtual_from_version:50545" => 3120, - "old:virtual_from_version:44711" => 1070, - "old:virtual_from_version:44500" => 1107, - "old:virtual_from_version:42207" => 1172, - "old:virtual_from_version:46388" => 1107, - "old:virtual_from_version:42075" => 1070, - "old:virtual_from_version:42527" => 1077, - "old:virtual_from_version:47071" => 1077, - "old:virtual_from_version:39322" => 1025, - "old:virtual_from_version:46962" => 1125, - "old:virtual_from_version:46764" => 1070, - "old:virtual_from_version:47921" => 1404, - "old:virtual_from_version:44742" => 1077, - "old:virtual_from_version:38553" => 1007, - "old:virtual_from_version:50614" => 1070, - "old:virtual_from_version:40824" => 1070, - "old:virtual_from_version:47982" => 1689, - "old:virtual_from_version:42564" => 1110, - "old:virtual_from_version:46792" => 2072, - "old:virtual_from_version:40908" => 1125, - "old:virtual_from_version:44641" => 1136, - "old:virtual_from_version:47476" => 1109, - "old:virtual_from_version:44750" => 1076, - "old:virtual_from_version:49983" => 3131, - "old:virtual_from_version:42956" => 1125, - "old:virtual_from_version:41005" => 2017, - "old:virtual_from_version:42621" => 1037, - "old:virtual_from_version:45867" => 1077, - "old:virtual_from_version:42298" => 1430, - "old:virtual_from_version:50185" => 1062, - "old:virtual_from_version:45930" => 1077, - "old:virtual_from_version:40089" => 1136, - "old:virtual_from_version:42571" => 1000, - "old:virtual_from_version:44786" => 1110, - "old:virtual_from_version:50698" => 1580, - "old:virtual_from_version:42954" => 1067, - "old:virtual_from_version:46566" => 1125, - "old:virtual_from_version:42826" => 1136, - "old:virtual_from_version:44260" => 1107, - "old:virtual_from_version:45561" => 1009, - "old:virtual_from_version:40461" => 1328, - "old:virtual_from_version:46371" => 1077, - "old:virtual_from_version:44985" => 1095, - "old:virtual_from_version:40223" => 1099, - "old:virtual_from_version:40518" => 1077, - "old:virtual_from_version:44612" => 1070, - "old:virtual_from_version:47159" => 1633, - "old:virtual_from_version:49900" => 3194, - "old:virtual_from_version:42267" => 1057, - "old:virtual_from_version:50566" => 1070, - "old:virtual_from_version:49601" => 1070, - "old:virtual_from_version:40884" => 1105, - "old:virtual_from_version:46302" => 1553, - "old:virtual_from_version:46493" => 1413, - "old:virtual_from_version:45895" => 1070, - "old:virtual_from_version:46859" => 1077, - "old:virtual_from_version:47131" => 1070, - "old:virtual_from_version:46297" => 1077, - "old:virtual_from_version:42192" => 1037, - "old:virtual_from_version:50685" => 3002, - "old:virtual_from_version:45862" => 1077, - "old:virtual_from_version:45704" => 1070, - "old:virtual_from_version:45386" => 1051, - "old:virtual_from_version:47103" => 1172, - "old:virtual_from_version:44220" => 1051, - "old:virtual_from_version:42733" => 1070, - "old:virtual_from_version:46255" => 1063, - "old:virtual_from_version:40182" => 1031, - "old:virtual_from_version:47472" => 1689, - "old:virtual_from_version:49612" => 1125, - "old:virtual_from_version:44450" => 1104, - "old:virtual_from_version:49728" => 1404, - "old:virtual_from_version:44820" => 1025, - "old:virtual_from_version:42916" => 1025, - "old:virtual_from_version:40588" => 1070, - "old:virtual_from_version:47301" => 1077, - "old:virtual_from_version:50242" => 3230, - "old:virtual_from_version:40658" => 1136, - "old:virtual_from_version:40816" => 1025, - "old:virtual_from_version:45777" => 1397, - "old:virtual_from_version:49950" => 3194, - "old:virtual_from_version:49325" => 1037, - "old:virtual_from_version:42011" => 1009, - "old:virtual_from_version:46685" => 1070, - "old:virtual_from_version:50041" => 1070, - "old:virtual_from_version:32632" => 1030, - "old:virtual_from_version:50654" => 1489, - "old:virtual_from_version:46151" => 1070, - "old:virtual_from_version:46350" => 1001, - "old:virtual_from_version:45149" => 1125, - "old:virtual_from_version:39502" => 1015, - "old:virtual_from_version:42434" => 1070, - "old:virtual_from_version:50220" => 1037, - "old:virtual_from_version:42126" => 1077, - "old:virtual_from_version:49933" => 1000, - "old:virtual_from_version:50238" => 1070, - "old:virtual_from_version:44512" => 1125, - "old:virtual_from_version:37035" => 1104, - "old:virtual_from_version:44219" => 1067, - "old:virtual_from_version:46987" => 1070, - "old:virtual_from_version:38681" => 1110, - "old:virtual_from_version:49781" => 3131, - "old:virtual_from_version:42622" => 1084, - "old:virtual_from_version:44853" => 1107, - "old:virtual_from_version:44372" => 1016, - "old:virtual_from_version:45445" => 1070, - "old:virtual_from_version:47808" => 1404, - "old:virtual_from_version:40835" => 1062, - "old:virtual_from_version:47098" => 1172, - "old:virtual_from_version:44089" => 1077, - "old:virtual_from_version:47948" => 1689, - "old:virtual_from_version:47819" => 3078, - "old:virtual_from_version:46360" => 1555, - "old:virtual_from_version:49261" => 1070, - "old:virtual_from_version:44109" => 1025, - "old:virtual_from_version:42523" => 1107, - "old:virtual_from_version:40559" => 1077, - "old:virtual_from_version:46377" => 1076, - "old:virtual_from_version:38952" => 1077, - "old:virtual_from_version:46586" => 1025, - "old:virtual_from_version:44708" => 1537, - "old:virtual_from_version:40615" => 1095, - "old:virtual_from_version:46972" => 1077, - "old:virtual_from_version:47940" => 1109, - "old:virtual_from_version:49597" => 1107, - "old:virtual_from_version:46767" => 1077, - "old:virtual_from_version:44983" => 1109, - "old:virtual_from_version:44841" => 1110, - "old:virtual_from_version:47963" => 1077, - "old:virtual_from_version:48037" => 2079, - "old:virtual_from_version:46291" => 1172, - "old:virtual_from_version:46675" => 1125, - "old:virtual_from_version:45708" => 1532, - "old:virtual_from_version:40647" => 1362, - "old:virtual_from_version:45726" => 1402, - "old:virtual_from_version:40888" => 1125, - "old:virtual_from_version:47346" => 1070, - "old:virtual_from_version:50087" => 1025, - "old:virtual_from_version:40449" => 1404, - "old:virtual_from_version:40796" => 1081, - "old:virtual_from_version:42216" => 1037, - "old:virtual_from_version:45466" => 1136, - "old:virtual_from_version:47638" => 1032, - "old:virtual_from_version:46261" => 1077, - "old:virtual_from_version:49616" => 3183, - "old:virtual_from_version:46520" => 1077, - "old:virtual_from_version:46918" => 1095, - "old:virtual_from_version:50125" => 1125, - "old:virtual_from_version:42885" => 1070, - "old:virtual_from_version:40579" => 1404, - "old:virtual_from_version:50683" => 1666, - "old:virtual_from_version:42665" => 1037, - "old:virtual_from_version:50402" => 1314, - "old:virtual_from_version:47324" => 1012, - "old:virtual_from_version:47138" => 1070, - "old:virtual_from_version:44517" => 1077, - "old:virtual_from_version:49169" => 1077, - "old:virtual_from_version:44351" => 1077, - "old:virtual_from_version:40724" => 1404, - "old:virtual_from_version:42301" => 1070, - "old:virtual_from_version:47208" => 1077, - "old:virtual_from_version:44739" => 1077, - "old:virtual_from_version:50005" => 1689, - "old:virtual_from_version:40782" => 1077, - "old:virtual_from_version:40891" => 1037, - "old:virtual_from_version:47495" => 1109, - "old:virtual_from_version:42203" => 1037, - "old:virtual_from_version:44945" => 1077, - "old:virtual_from_version:45241" => 1000, - "old:virtual_from_version:45555" => 1136, - "old:virtual_from_version:42275" => 1107, - "old:virtual_from_version:50712" => 3259, - "old:virtual_from_version:45248" => 1043, - "old:virtual_from_version:49253" => 1404, - "old:virtual_from_version:45670" => 1621, - "old:virtual_from_version:50102" => 1015, - "old:virtual_from_version:43041" => 2053, - "old:virtual_from_version:42550" => 1037, - "old:virtual_from_version:46849" => 1077, - "old:virtual_from_version:49959" => 1070, - "old:virtual_from_version:42515" => 1150, - "old:virtual_from_version:50115" => 3131, - "old:virtual_from_version:42899" => 1037, - "old:virtual_from_version:44875" => 1077, - "old:virtual_from_version:40979" => 1070, - "old:virtual_from_version:49994" => 1100, - "old:virtual_from_version:46497" => 1537, - "old:virtual_from_version:42758" => 1461, - "old:virtual_from_version:39994" => 2009, - "old:virtual_from_version:49182" => 3153, - "old:virtual_from_version:44923" => 1125, - "old:virtual_from_version:38384" => 1067, - "old:virtual_from_version:50504" => 3261, - "old:virtual_from_version:47550" => 1070, - "old:virtual_from_version:44491" => 1110, - "old:virtual_from_version:42719" => 1037, - "old:virtual_from_version:38366" => 1065, - "old:virtual_from_version:50418" => 1070, - "old:virtual_from_version:40885" => 1057, - "old:virtual_from_version:47028" => 3008, - "old:virtual_from_version:49829" => 1037, - "old:virtual_from_version:49195" => 1070, - "old:virtual_from_version:46121" => 1461, - "old:virtual_from_version:47165" => 1125, - "old:virtual_from_version:47805" => 1172, - "old:virtual_from_version:50205" => 3137, - "old:virtual_from_version:50366" => 1007, - "old:virtual_from_version:50027" => 3131, - "old:virtual_from_version:49637" => 1158, - "old:virtual_from_version:46357" => 1070, - "old:virtual_from_version:47883" => 1109, - "old:virtual_from_version:42755" => 1037, - "old:virtual_from_version:42573" => 1077, - "old:virtual_from_version:42380" => 1172, - "old:virtual_from_version:38672" => 1104, - "old:virtual_from_version:49595" => 1070, - "old:virtual_from_version:47735" => 1109, - "old:virtual_from_version:42850" => 1077, - "old:virtual_from_version:50436" => 3242, - "old:virtual_from_version:47941" => 1025, - "old:virtual_from_version:46455" => 1537, - "old:virtual_from_version:47079" => 1583, - "old:virtual_from_version:50273" => 3131, - "old:virtual_from_version:46609" => 1125, - "old:virtual_from_version:47820" => 3094, - "old:virtual_from_version:47140" => 1077, - "old:virtual_from_version:44884" => 1136, - "old:virtual_from_version:42821" => 1070, - "old:virtual_from_version:49719" => 1489, - "old:virtual_from_version:50709" => 3273, - "old:virtual_from_version:44221" => 1070, - "old:virtual_from_version:40926" => 1107, - "old:virtual_from_version:46386" => 1552, - "old:virtual_from_version:40641" => 1025, - "old:virtual_from_version:50606" => 3131, - "old:virtual_from_version:42171" => 1070, - "old:virtual_from_version:46451" => 1172, - "old:virtual_from_version:50688" => 1005, - "old:virtual_from_version:42925" => 1506, - "old:virtual_from_version:44950" => 1067, - "old:virtual_from_version:45112" => 1009, - "old:virtual_from_version:44075" => 1009, - "old:virtual_from_version:42535" => 1067, - "old:virtual_from_version:42931" => 1051, - "old:virtual_from_version:49947" => 1580, - "old:virtual_from_version:42132" => 1009, - "old:virtual_from_version:44732" => 1070, - "old:virtual_from_version:50101" => 1070, - "old:virtual_from_version:47827" => 1070, - "old:virtual_from_version:45764" => 1404, - "old:virtual_from_version:44984" => 1022, - "old:virtual_from_version:44367" => 1008, - "old:virtual_from_version:49304" => 1583, - "old:virtual_from_version:50017" => 1314, - "old:virtual_from_version:46731" => 1125, - "old:virtual_from_version:45744" => 1009, - "old:virtual_from_version:39708" => 1109, - "old:virtual_from_version:39232" => 1062, - "old:virtual_from_version:44994" => 1112, - "old:virtual_from_version:46290" => 1067, - "old:virtual_from_version:47667" => 1070, - "old:virtual_from_version:47234" => 1640, - "old:virtual_from_version:47164" => 1070, - "old:virtual_from_version:50044" => 1689, - "old:virtual_from_version:50678" => 1150, - "old:virtual_from_version:40585" => 1025, - "old:virtual_from_version:42783" => 1077, - "old:virtual_from_version:47619" => 1311, - "old:virtual_from_version:44019" => 1009, - "old:virtual_from_version:44110" => 1077, - "old:virtual_from_version:47740" => 1109, - "old:virtual_from_version:46058" => 1077, - "old:virtual_from_version:38932" => 1007, - "old:virtual_from_version:50695" => 1006, - "old:virtual_from_version:46110" => 1404, - "old:virtual_from_version:47922" => 1413, - "old:virtual_from_version:42638" => 1172, - "old:virtual_from_version:45104" => 1070, - "old:virtual_from_version:44609" => 1051, - "old:virtual_from_version:43068" => 2069, - "old:virtual_from_version:44306" => 1172, - "old:virtual_from_version:45233" => 1083, - "old:virtual_from_version:47326" => 1070, - "old:virtual_from_version:37416" => 1001, - "old:virtual_from_version:42243" => 1070, - "old:virtual_from_version:46939" => 3009, - "old:virtual_from_version:46541" => 1125, - "old:virtual_from_version:42284" => 1426, - "old:virtual_from_version:44287" => 1025, - "old:virtual_from_version:44919" => 1077, - "old:virtual_from_version:38762" => 1108, - "old:virtual_from_version:46047" => 1488, - "old:virtual_from_version:46700" => 1417, - "old:virtual_from_version:45076" => 1070, - "old:virtual_from_version:48003" => 2104, - "old:virtual_from_version:50173" => 1125, - "old:virtual_from_version:44617" => 1037, - "old:virtual_from_version:50463" => 3159, - "old:virtual_from_version:34128" => 1091, - "old:virtual_from_version:44842" => 1081, - "old:virtual_from_version:50462" => 3131, - "old:virtual_from_version:47182" => 1051, - "old:virtual_from_version:43094" => 2086, - "old:virtual_from_version:40699" => 1016, - "old:virtual_from_version:46836" => 1351, - "old:virtual_from_version:49956" => 1070, - "old:virtual_from_version:42627" => 1311, - "old:virtual_from_version:45526" => 1404, - "old:virtual_from_version:49869" => 1584, - "old:virtual_from_version:50648" => 1038, - "old:virtual_from_version:49998" => 3215, - "old:virtual_from_version:50564" => 1150, - "old:virtual_from_version:45056" => 1112, - "old:virtual_from_version:45490" => 1105, - "old:virtual_from_version:42969" => 1110, - "old:virtual_from_version:46558" => 1077, - "old:virtual_from_version:42857" => 1077, - "old:virtual_from_version:47866" => 1689, - "old:virtual_from_version:45755" => 1012, - "old:virtual_from_version:46821" => 1509, - "old:virtual_from_version:47211" => 1070, - "old:virtual_from_version:50514" => 1585, - "old:virtual_from_version:45500" => 1112, - "old:virtual_from_version:45829" => 1107, - "old:virtual_from_version:47861" => 1077, - "old:virtual_from_version:47980" => 1077, - "old:virtual_from_version:50113" => 1580, - "old:virtual_from_version:46318" => 1070, - "old:virtual_from_version:50427" => 1064, - "old:virtual_from_version:40851" => 1009, - "old:virtual_from_version:47546" => 1125, - "old:virtual_from_version:49071" => 1689, - "old:virtual_from_version:42347" => 1107, - "old:virtual_from_version:49397" => 3008, - "old:virtual_from_version:49337" => 1666, - "old:virtual_from_version:49923" => 3206, - "old:virtual_from_version:47774" => 1666, - "old:virtual_from_version:44048" => 1077, - "old:virtual_from_version:39815" => 1149, - "old:virtual_from_version:50081" => 1051, - "old:virtual_from_version:46661" => 1077, - "old:virtual_from_version:46370" => 1005, - "old:virtual_from_version:47939" => 1070, - "old:virtual_from_version:47977" => 1070, - "old:virtual_from_version:44210" => 1183, - "old:virtual_from_version:47992" => 1109, - "old:virtual_from_version:48028" => 2079, - "old:virtual_from_version:49145" => 1077, - "old:virtual_from_version:47385" => 3008, - "old:virtual_from_version:46775" => 1070, - "old:virtual_from_version:45378" => 1125, - "old:virtual_from_version:40637" => 1057, - "old:virtual_from_version:46964" => 1070, - "old:virtual_from_version:44185" => 1125, - "old:virtual_from_version:42673" => 1070, - "old:virtual_from_version:49137" => 1649, - "old:virtual_from_version:46989" => 1125, - "old:virtual_from_version:40672" => 1077, - "old:virtual_from_version:42716" => 1023, - "old:virtual_from_version:42453" => 1440, - "old:virtual_from_version:45586" => 1070, - "old:virtual_from_version:46805" => 1048, - "old:virtual_from_version:44003" => 1077, - "old:virtual_from_version:46565" => 1070, - "old:virtual_from_version:46217" => 1404, - "old:virtual_from_version:49083" => 3136, - "old:virtual_from_version:47392" => 3008, - "old:virtual_from_version:44924" => 1070, - "old:virtual_from_version:49790" => 1037, - "old:virtual_from_version:49695" => 3008, - "old:virtual_from_version:49154" => 1070, - "old:virtual_from_version:49623" => 3185, - "old:virtual_from_version:46885" => 1172, - "old:virtual_from_version:42237" => 1070, - "old:virtual_from_version:42242" => 1172, - "old:virtual_from_version:44944" => 1026, - "old:virtual_from_version:42655" => 1037, - "old:virtual_from_version:44988" => 1010, - "old:virtual_from_version:47480" => 1444, - "old:virtual_from_version:42856" => 1009, - "old:virtual_from_version:44753" => 1009, - "old:virtual_from_version:47197" => 1070, - "old:virtual_from_version:45875" => 1532, - "old:virtual_from_version:40635" => 1077, - "old:virtual_from_version:39752" => 1404, - "old:virtual_from_version:47830" => 1107, - "old:virtual_from_version:45507" => 1585, - "old:virtual_from_version:38667" => 1069, - "old:virtual_from_version:49734" => 1067, - "old:virtual_from_version:46149" => 1037, - "old:virtual_from_version:44346" => 1025, - "old:virtual_from_version:45676" => 1048, - "old:virtual_from_version:49724" => 1070, - "old:virtual_from_version:42747" => 1037, - "old:virtual_from_version:49330" => 1659, - "old:virtual_from_version:45105" => 1077, - "old:virtual_from_version:44374" => 1017, - "old:virtual_from_version:50011" => 1565, - "old:virtual_from_version:49152" => 1105, - "old:virtual_from_version:49864" => 1404, - "old:virtual_from_version:44356" => 1081, - "old:virtual_from_version:46194" => 1649, - "old:virtual_from_version:49358" => 1070, - "old:virtual_from_version:50579" => 1125, - "old:virtual_from_version:47122" => 1067, - "old:virtual_from_version:45232" => 1083, - "old:virtual_from_version:42562" => 1037, - "old:virtual_from_version:49605" => 1070, - "old:virtual_from_version:50333" => 1070, - "old:virtual_from_version:42789" => 1353, - "old:virtual_from_version:50233" => 3131, - "old:virtual_from_version:49007" => 1585, - "old:virtual_from_version:44423" => 1042, - "old:virtual_from_version:44657" => 1077, - "old:virtual_from_version:45626" => 1070, - "old:virtual_from_version:44056" => 1037, - "old:virtual_from_version:47532" => 1070, - "old:virtual_from_version:46747" => 1632, - "old:virtual_from_version:50079" => 3223, - "old:virtual_from_version:40499" => 1077, - "old:virtual_from_version:47772" => 1077, - "old:virtual_from_version:44673" => 1009, - "old:virtual_from_version:40237" => 1070, - "old:virtual_from_version:49184" => 1105, - "old:virtual_from_version:49393" => 1381, - "old:virtual_from_version:43077" => 2074, - "old:virtual_from_version:38981" => 1009, - "old:virtual_from_version:42713" => 1311, - "old:virtual_from_version:40690" => 1070, - "old:virtual_from_version:40480" => 1077, - "old:virtual_from_version:46711" => 1077, - "old:virtual_from_version:45938" => 1077, - "old:virtual_from_version:47115" => 3021, - "old:virtual_from_version:44846" => 1077, - "old:virtual_from_version:44533" => 1009, - "old:virtual_from_version:49772" => 1651, - "old:virtual_from_version:49587" => 1172, - "old:virtual_from_version:41003" => 2015, - "old:virtual_from_version:45294" => 1581, - "old:virtual_from_version:47676" => 1404, - "old:virtual_from_version:40152" => 1105, - "old:virtual_from_version:47460" => 1077, - "old:virtual_from_version:40795" => 1077, - "old:virtual_from_version:49907" => 1007, - "old:virtual_from_version:44214" => 1037, - "old:virtual_from_version:43032" => 2031, - "old:virtual_from_version:49985" => 1100, - "old:virtual_from_version:45128" => 1125, - "old:virtual_from_version:49809" => 1100, - "old:virtual_from_version:42910" => 1077, - "old:virtual_from_version:40549" => 1107, - "old:virtual_from_version:42130" => 1136, - "old:virtual_from_version:50370" => 3131, - "old:virtual_from_version:44940" => 1070, - "old:virtual_from_version:49746" => 3194, - "old:virtual_from_version:42376" => 1077, - "old:virtual_from_version:45067" => 1077, - "old:virtual_from_version:46552" => 1077, - "old:virtual_from_version:50582" => 1689, - "old:virtual_from_version:39970" => 1048, - "old:virtual_from_version:42613" => 1009, - "old:virtual_from_version:44476" => 1067, - "old:virtual_from_version:44666" => 1497, - "old:virtual_from_version:49583" => 1070, - "old:virtual_from_version:50389" => 1314, - "old:virtual_from_version:44885" => 1125, - "old:virtual_from_version:41014" => 2007, - "old:virtual_from_version:47728" => 1109, - "old:virtual_from_version:45221" => 1101, - "old:virtual_from_version:42552" => 1172, - "old:virtual_from_version:42738" => 1070, - "old:virtual_from_version:42847" => 1067, - "old:virtual_from_version:42750" => 1070, - "old:virtual_from_version:46220" => 1633, - "old:virtual_from_version:47107" => 1585, - "old:virtual_from_version:49125" => 1404, - "old:virtual_from_version:42680" => 1009, - "old:virtual_from_version:40494" => 1070, - "old:virtual_from_version:47620" => 3077, - "old:virtual_from_version:46653" => 1077, - "old:virtual_from_version:46235" => 1077, - "old:virtual_from_version:50262" => 1032, - "old:virtual_from_version:47736" => 1084, - "old:virtual_from_version:47134" => 1077, - "old:virtual_from_version:46244" => 1077, - "old:virtual_from_version:43033" => 2032, - "old:virtual_from_version:40664" => 1007, - "old:virtual_from_version:42261" => 1070, - "old:virtual_from_version:38333" => 1007, - "old:virtual_from_version:47435" => 1109, - "old:virtual_from_version:49908" => 1444, - "old:virtual_from_version:45596" => 1172, - "old:virtual_from_version:46692" => 1009, - "old:virtual_from_version:44658" => 1037, - "old:virtual_from_version:46523" => 1125, - "old:virtual_from_version:50038" => 1012, - "old:virtual_from_version:46695" => 1070, - "old:virtual_from_version:47018" => 1172, - "old:virtual_from_version:50457" => 1444, - "old:virtual_from_version:46553" => 1404, - "old:virtual_from_version:42578" => 1037, - "old:virtual_from_version:42681" => 1077, - "old:virtual_from_version:49451" => 1070, - "old:virtual_from_version:42426" => 1037, - "old:virtual_from_version:42064" => 1037, - "old:virtual_from_version:48024" => 2125, - "old:virtual_from_version:47125" => 1077, - "old:virtual_from_version:45028" => 1009, - "old:virtual_from_version:40389" => 1067, - "old:virtual_from_version:50757" => 1048, - "old:virtual_from_version:44443" => 1037, - "old:virtual_from_version:40767" => 1070, - "old:virtual_from_version:50479" => 3253, - "old:virtual_from_version:44582" => 1077, - "old:virtual_from_version:42652" => 1070, - "old:virtual_from_version:45912" => 1172, - "old:virtual_from_version:44912" => 1070, - "old:virtual_from_version:46846" => 1070, - "old:virtual_from_version:44634" => 1077, - "old:virtual_from_version:49144" => 1070, - "old:virtual_from_version:42975" => 1077, - "old:virtual_from_version:40194" => 1222, - "old:virtual_from_version:40501" => 1105, - "old:virtual_from_version:49326" => 1077, - "old:virtual_from_version:45409" => 1582, - "old:virtual_from_version:46299" => 1362, - "old:virtual_from_version:42714" => 1070, - "old:virtual_from_version:50658" => 1321, - "old:virtual_from_version:44256" => 1350, - "old:virtual_from_version:47229" => 1077, - "old:virtual_from_version:45538" => 1009, - "old:virtual_from_version:50293" => 1035, - "old:virtual_from_version:45214" => 1125, - "old:virtual_from_version:47918" => 1067, - "old:virtual_from_version:45957" => 1092, - "old:virtual_from_version:49692" => 1224, - "old:virtual_from_version:50741" => 3186, - "old:virtual_from_version:49666" => 1062, - "old:virtual_from_version:47353" => 1109, - "old:virtual_from_version:47494" => 1070, - "old:virtual_from_version:50452" => 1105, - "old:virtual_from_version:44329" => 1037, - "old:virtual_from_version:44360" => 1090, - "old:virtual_from_version:46781" => 1517, - "old:virtual_from_version:50240" => 1689, - "old:virtual_from_version:45470" => 1077, - "old:virtual_from_version:44696" => 1009, - "old:virtual_from_version:45025" => 1144, - "old:virtual_from_version:45027" => 1008, - "old:virtual_from_version:43069" => 2059, - "old:virtual_from_version:45254" => 1021, - "old:virtual_from_version:43024" => 2049, - "old:virtual_from_version:39351" => 1109, - "old:virtual_from_version:45863" => 1335, - "old:virtual_from_version:44632" => 1070, - "old:virtual_from_version:47498" => 1125, - "old:virtual_from_version:47637" => 1350, - "old:virtual_from_version:46785" => 1125, - "old:virtual_from_version:45101" => 1077, - "old:virtual_from_version:49593" => 1689, - "old:virtual_from_version:44394" => 1090, - "old:virtual_from_version:42915" => 1015, - "old:virtual_from_version:44464" => 1067, - "old:virtual_from_version:49716" => 3192, - "old:virtual_from_version:47486" => 1037, - "old:virtual_from_version:38346" => 1011, - "old:virtual_from_version:40490" => 1077, - "old:virtual_from_version:45942" => 1007, - "old:virtual_from_version:50634" => 3268, - "old:virtual_from_version:40570" => 1146, - "old:virtual_from_version:40954" => 1037, - "old:virtual_from_version:47027" => 3008, - "old:virtual_from_version:47318" => 3042, - "old:virtual_from_version:45719" => 1009, - "old:virtual_from_version:42633" => 1077, - "old:virtual_from_version:42537" => 1070, - "old:virtual_from_version:45701" => 1027, - "old:virtual_from_version:44080" => 1125, - "old:virtual_from_version:47219" => 1533, - "old:virtual_from_version:45267" => 1010, - "old:virtual_from_version:40803" => 1070, - "old:virtual_from_version:44095" => 1025, - "old:virtual_from_version:49054" => 1659, - "old:virtual_from_version:44678" => 1076, - "old:virtual_from_version:47884" => 1025, - "old:virtual_from_version:47313" => 1172, - "old:virtual_from_version:44937" => 1077, - "old:virtual_from_version:44620" => 1067, - "old:virtual_from_version:49037" => 1007, - "old:virtual_from_version:49545" => 1413, - "old:virtual_from_version:42998" => 1505, - "old:virtual_from_version:39310" => 1000, - "old:virtual_from_version:50003" => 3215, - "old:virtual_from_version:47686" => 1112, - "old:virtual_from_version:47383" => 1109, - "old:virtual_from_version:42170" => 1172, - "old:virtual_from_version:40510" => 1084, - "old:virtual_from_version:44319" => 1104, - "old:virtual_from_version:45406" => 1009, - "old:virtual_from_version:47670" => 1009, - "old:virtual_from_version:50671" => 3208, - "old:virtual_from_version:42287" => 1007, - "old:virtual_from_version:42938" => 1070, - "old:virtual_from_version:42880" => 1015, - "old:virtual_from_version:49141" => 1070, - "old:virtual_from_version:46435" => 1070, - "old:virtual_from_version:46032" => 1077, - "old:virtual_from_version:40415" => 1077, - "old:virtual_from_version:46934" => 1584, - "old:virtual_from_version:47283" => 1461, - "old:virtual_from_version:45791" => 1125, - "old:virtual_from_version:39992" => 2007, - "old:virtual_from_version:47462" => 1689, - "old:virtual_from_version:46579" => 1689, - "old:virtual_from_version:47453" => 1381, - "old:virtual_from_version:44717" => 1070, - "old:virtual_from_version:49793" => 1100, - "old:virtual_from_version:44267" => 1067, - "old:virtual_from_version:50392" => 1689, - "old:virtual_from_version:40756" => 1070, - "old:virtual_from_version:40890" => 1077, - "old:virtual_from_version:42468" => 1037, - "old:virtual_from_version:42503" => 1009, - "old:virtual_from_version:46642" => 1537, - "old:virtual_from_version:44398" => 1078, - "old:virtual_from_version:44653" => 1037, - "old:virtual_from_version:44107" => 1009, - "old:virtual_from_version:46271" => 1070, - "old:virtual_from_version:45014" => 1413, - "old:virtual_from_version:38341" => 1005, - "old:virtual_from_version:50334" => 1125, - "old:virtual_from_version:49969" => 3131, - "old:virtual_from_version:45044" => 1030, - "old:virtual_from_version:42955" => 1150, - "old:virtual_from_version:50543" => 1689, - "old:virtual_from_version:46372" => 1402, - "old:virtual_from_version:42623" => 1070, - "old:virtual_from_version:42270" => 1015, - "old:virtual_from_version:44854" => 1070, - "old:virtual_from_version:47764" => 3094, - "old:virtual_from_version:39156" => 1136, - "old:virtual_from_version:47063" => 1689, - "old:virtual_from_version:46169" => 1067, - "old:virtual_from_version:49553" => 1070, - "old:virtual_from_version:47771" => 1109, - "old:virtual_from_version:46091" => 1656, - "old:virtual_from_version:42150" => 1070, - "old:virtual_from_version:44872" => 1141, - "old:virtual_from_version:46312" => 1404, - "old:virtual_from_version:47738" => 1404, - "old:virtual_from_version:46779" => 1172, - "old:virtual_from_version:45750" => 1407, - "old:virtual_from_version:42122" => 1353, - "old:virtual_from_version:47588" => 1077, - "old:virtual_from_version:42805" => 1007, - "old:virtual_from_version:47632" => 1583, - "old:virtual_from_version:42539" => 1077, - "old:virtual_from_version:42939" => 1009, - "old:virtual_from_version:42824" => 1037, - "old:virtual_from_version:49483" => 3152, - "old:virtual_from_version:45788" => 1007, - "old:virtual_from_version:42269" => 1009, - "old:virtual_from_version:46555" => 1070, - "old:virtual_from_version:47068" => 1136, - "old:virtual_from_version:46484" => 1172, - "old:virtual_from_version:45593" => 1110, - "old:virtual_from_version:49365" => 1584, - "old:virtual_from_version:50160" => 3214, - "old:virtual_from_version:49525" => 1404, - "old:virtual_from_version:47088" => 1048, - "old:virtual_from_version:46755" => 1077, - "old:virtual_from_version:39326" => 1067, - "old:virtual_from_version:45857" => 1109, - "old:virtual_from_version:49311" => 3162, - "old:virtual_from_version:50618" => 3259, - "old:virtual_from_version:46017" => 1006, - "old:virtual_from_version:40784" => 1067, - "old:virtual_from_version:44858" => 1070, - "old:virtual_from_version:45886" => 1125, - "old:virtual_from_version:40776" => 1077, - "old:virtual_from_version:46402" => 1672, - "old:virtual_from_version:45929" => 1009, - "old:virtual_from_version:42763" => 1110, - "old:virtual_from_version:42626" => 1051, - "old:virtual_from_version:45850" => 1125, - "old:virtual_from_version:50407" => 1583, - "old:virtual_from_version:50492" => 3258, - "old:virtual_from_version:39402" => 1168, - "old:virtual_from_version:50454" => 1314, - "old:virtual_from_version:40975" => 1009, - "old:virtual_from_version:45543" => 1613, - "old:virtual_from_version:43006" => 2031, - "old:virtual_from_version:47432" => 1580, - "old:virtual_from_version:42528" => 1037, - "old:virtual_from_version:44057" => 1081, - "old:virtual_from_version:49564" => 1070, - "old:virtual_from_version:46581" => 1070, - "old:virtual_from_version:49297" => 3152, - "old:virtual_from_version:47520" => 1009, - "old:virtual_from_version:44867" => 1107, - "old:virtual_from_version:42364" => 1077, - "old:virtual_from_version:44144" => 1070, - "old:virtual_from_version:44705" => 1070, - "old:virtual_from_version:49316" => 1077, - "old:virtual_from_version:47837" => 1583, - "old:virtual_from_version:44200" => 1037, - "old:virtual_from_version:46680" => 1125, - "old:virtual_from_version:50692" => 3259, - "old:virtual_from_version:49948" => 1689, - "old:virtual_from_version:45658" => 1172, - "old:virtual_from_version:38606" => 1108, - "old:virtual_from_version:45779" => 1574, - "old:virtual_from_version:40012" => 1069, - "old:virtual_from_version:50179" => 1025, - "old:virtual_from_version:44160" => 1009, - "old:virtual_from_version:44312" => 1077, - "old:virtual_from_version:47254" => 1172, - "old:virtual_from_version:47901" => 1689, - "old:virtual_from_version:49619" => 1696, - "old:virtual_from_version:38610" => 1104, - "old:virtual_from_version:42943" => 1070, - "old:virtual_from_version:50707" => 3259, - "old:virtual_from_version:44274" => 1037, - "old:virtual_from_version:46060" => 1077, - "old:virtual_from_version:42474" => 1172, - "old:virtual_from_version:47758" => 1125, - "old:virtual_from_version:44936" => 1009, - "old:virtual_from_version:40938" => 1070, - "old:virtual_from_version:44023" => 1070, - "old:virtual_from_version:47222" => 1107, - "old:virtual_from_version:47547" => 1109, - "old:virtual_from_version:50495" => 3259, - "old:virtual_from_version:50318" => 1070, - "old:virtual_from_version:47390" => 3008, - "old:virtual_from_version:49875" => 1107, - "old:virtual_from_version:45607" => 1025, - "old:virtual_from_version:44825" => 1009, - "old:virtual_from_version:45562" => 1025, - "old:virtual_from_version:39725" => 1062, - "old:virtual_from_version:42098" => 1070, - "old:virtual_from_version:39718" => 1222, - "old:virtual_from_version:49916" => 1444, - "old:virtual_from_version:42816" => 1077, - "old:virtual_from_version:47493" => 1077, - "old:virtual_from_version:46355" => 1057, - "old:virtual_from_version:44549" => 1070, - "old:virtual_from_version:45870" => 1070, - "old:virtual_from_version:46351" => 1077, - "old:virtual_from_version:45844" => 1077, - "old:virtual_from_version:47499" => 1109, - "old:virtual_from_version:50145" => 3210, - "old:virtual_from_version:40078" => 1110, - "old:virtual_from_version:47304" => 3042, - "old:virtual_from_version:45444" => 1136, - "old:virtual_from_version:45016" => 1000, - "old:virtual_from_version:42378" => 1404, - "old:virtual_from_version:40685" => 1067, - "old:virtual_from_version:46544" => 1689, - "old:virtual_from_version:44058" => 1125, - "old:virtual_from_version:45431" => 1025, - "old:virtual_from_version:50744" => 1417, - "old:virtual_from_version:49913" => 1070, - "old:virtual_from_version:45407" => 1404, - "old:virtual_from_version:42141" => 1110, - "old:virtual_from_version:50057" => 1125, - "old:virtual_from_version:50144" => 3058, - "old:virtual_from_version:46159" => 1404, - "old:virtual_from_version:40736" => 1077, - "old:virtual_from_version:47216" => 1077, - "old:virtual_from_version:50229" => 1007, - "old:virtual_from_version:42247" => 1404, - "old:virtual_from_version:49151" => 1172, - "old:virtual_from_version:43013" => 2038, - "old:virtual_from_version:40831" => 1407, - "old:virtual_from_version:39477" => 1404, - "old:virtual_from_version:45781" => 1136, - "old:virtual_from_version:42561" => 1077, - "old:virtual_from_version:40715" => 1070, - "old:virtual_from_version:47535" => 1070, - "old:virtual_from_version:49664" => 1583, - "old:virtual_from_version:46648" => 1125, - "old:virtual_from_version:50221" => 1314, - "old:virtual_from_version:42491" => 1009, - "old:virtual_from_version:46130" => 1077, - "old:virtual_from_version:45346" => 1413, - "old:virtual_from_version:49285" => 1009, - "old:virtual_from_version:45659" => 1136, - "old:virtual_from_version:45618" => 1136, - "old:virtual_from_version:45979" => 1613, - "old:virtual_from_version:47167" => 1077, - "old:virtual_from_version:46603" => 1172, - "old:virtual_from_version:49801" => 3131, - "old:virtual_from_version:49888" => 1035, - "old:virtual_from_version:40177" => 1006, - "old:virtual_from_version:47622" => 1070, - "old:virtual_from_version:50558" => 3265, - "old:virtual_from_version:46135" => 1404, - "old:virtual_from_version:46242" => 1172, - "old:virtual_from_version:49386" => 1659, - "old:virtual_from_version:47450" => 1109, - "old:virtual_from_version:45058" => 1049, - "old:virtual_from_version:47659" => 1125, - "old:virtual_from_version:49731" => 1070, - "old:virtual_from_version:44962" => 1000, - "old:virtual_from_version:47540" => 1070, - "old:virtual_from_version:42765" => 1484, - "old:virtual_from_version:44197" => 1009, - "old:virtual_from_version:45150" => 1009, - "old:virtual_from_version:42348" => 1070, - "old:virtual_from_version:47158" => 1584, - "old:virtual_from_version:47518" => 1037, - "old:virtual_from_version:49014" => 3129, - "old:virtual_from_version:45357" => 1031, - "old:virtual_from_version:42950" => 1009, - "old:virtual_from_version:42812" => 1107, - "old:virtual_from_version:49342" => 1125, - "old:virtual_from_version:45537" => 1070, - "old:virtual_from_version:39528" => 1107, - "old:virtual_from_version:50412" => 3201, - "old:virtual_from_version:45749" => 1077, - "old:virtual_from_version:44960" => 1016, - "old:virtual_from_version:45222" => 1576, - "old:virtual_from_version:49688" => 1381, - "old:virtual_from_version:49522" => 1488, - "old:virtual_from_version:47007" => 1077, - "old:virtual_from_version:44405" => 1069, - "old:virtual_from_version:40968" => 1070, - "old:virtual_from_version:42500" => 1107, - "old:virtual_from_version:47970" => 1109, - "old:virtual_from_version:46400" => 1402, - "old:virtual_from_version:46440" => 1070, - "old:virtual_from_version:45761" => 1362, - "old:virtual_from_version:44300" => 1037, - "old:virtual_from_version:50404" => 3214, - "old:virtual_from_version:42052" => 1037, - "old:virtual_from_version:49412" => 3008, - "old:virtual_from_version:42140" => 1037, - "old:virtual_from_version:50502" => 1035, - "old:virtual_from_version:46164" => 1077, - "old:virtual_from_version:47618" => 1583, - "old:virtual_from_version:42966" => 1016, - "old:virtual_from_version:47956" => 1077, - "old:virtual_from_version:50510" => 3261, - "old:virtual_from_version:47702" => 1109, - "old:virtual_from_version:44695" => 1070, - "old:virtual_from_version:49118" => 1048, - "old:virtual_from_version:47755" => 3092, - "old:virtual_from_version:40436" => 1057, - "old:virtual_from_version:47786" => 1125, - "old:virtual_from_version:50053" => 1314, - "old:virtual_from_version:47748" => 1070, - "old:virtual_from_version:45374" => 1107, - "old:virtual_from_version:45702" => 1077, - "old:virtual_from_version:44747" => 1009, - "old:virtual_from_version:47531" => 3058, - "old:virtual_from_version:47591" => 1109, - "old:virtual_from_version:39215" => 1058, - "old:virtual_from_version:47757" => 1070, - "old:virtual_from_version:42366" => 1311, - "old:virtual_from_version:44390" => 1048, - "old:virtual_from_version:47335" => 3043, - "old:virtual_from_version:46193" => 1077, - "old:virtual_from_version:50312" => 3131, - "old:virtual_from_version:40620" => 1025, - "old:virtual_from_version:46322" => 1402, - "old:virtual_from_version:42375" => 1070, - "old:virtual_from_version:47895" => 1070, - "old:virtual_from_version:45615" => 1009, - "old:virtual_from_version:50673" => 3208, - "old:virtual_from_version:42711" => 1037, - "old:virtual_from_version:49087" => 3030, - "old:virtual_from_version:38858" => 1070, - "old:virtual_from_version:44957" => 1057, - "old:virtual_from_version:45933" => 1070, - "old:virtual_from_version:47614" => 1069, - "old:virtual_from_version:42082" => 1077, - "old:virtual_from_version:45448" => 1109, - "old:virtual_from_version:39583" => 1031, - "old:virtual_from_version:46741" => 1689, - "old:virtual_from_version:50189" => 3025, - "old:virtual_from_version:47691" => 1109, - "old:virtual_from_version:49415" => 1532, - "old:virtual_from_version:46443" => 1051, - "old:virtual_from_version:42217" => 1000, - "old:virtual_from_version:42471" => 1112, - "old:virtual_from_version:47617" => 1565, - "old:virtual_from_version:40953" => 1077, - "old:virtual_from_version:45255" => 1051, - "old:virtual_from_version:50689" => 1404, - "old:virtual_from_version:40129" => 1125, - "old:virtual_from_version:49741" => 1070, - "old:virtual_from_version:42335" => 1077, - "old:virtual_from_version:39990" => 1260, - "old:virtual_from_version:49356" => 3167, - "old:virtual_from_version:40871" => 1009, - "old:virtual_from_version:42678" => 1048, - "old:virtual_from_version:49663" => 1150, - "old:virtual_from_version:44953" => 1025, - "old:virtual_from_version:46145" => 1009, - "old:virtual_from_version:45809" => 1404, - "old:virtual_from_version:50423" => 1689, - "old:virtual_from_version:47880" => 1585, - "old:virtual_from_version:47233" => 1077, - "old:virtual_from_version:47377" => 1109, - "old:virtual_from_version:44340" => 1025, - "old:virtual_from_version:46076" => 1404, - "old:virtual_from_version:48021" => 2121, - "old:virtual_from_version:39126" => 1070, - "old:virtual_from_version:44593" => 1070, - "old:virtual_from_version:50764" => 3259, - "old:virtual_from_version:43008" => 2033, - "old:virtual_from_version:50736" => 1489, - "old:virtual_from_version:44763" => 1070, - "old:virtual_from_version:44213" => 1077, - "old:virtual_from_version:42919" => 1062, - "old:virtual_from_version:45892" => 1109, - "old:virtual_from_version:46505" => 1084, - "old:virtual_from_version:49915" => 1107, - "old:virtual_from_version:42614" => 1025, - "old:virtual_from_version:47886" => 1108, - "old:virtual_from_version:49590" => 1404, - "old:virtual_from_version:45652" => 1107, - "old:virtual_from_version:44975" => 1023, - "old:virtual_from_version:44715" => 1067, - "old:virtual_from_version:50748" => 3206, - "old:virtual_from_version:42487" => 1037, - "old:virtual_from_version:50646" => 1108, - "old:virtual_from_version:42760" => 1009, - "old:virtual_from_version:44288" => 1077, - "old:virtual_from_version:44243" => 1110, - "old:virtual_from_version:47877" => 1314, - "old:virtual_from_version:49843" => 3131, - "old:virtual_from_version:38797" => 1125, - "old:virtual_from_version:49165" => 1070, - "old:virtual_from_version:42521" => 1037, - "old:virtual_from_version:42882" => 1077, - "old:virtual_from_version:45620" => 1067, - "old:virtual_from_version:46652" => 1025, - "old:virtual_from_version:42601" => 1077, - "old:virtual_from_version:42971" => 1063, - "old:virtual_from_version:46920" => 1077, - "old:virtual_from_version:47360" => 1037, - "old:virtual_from_version:47006" => 1172, - "old:virtual_from_version:47228" => 1172, - "old:virtual_from_version:44339" => 1009, - "old:virtual_from_version:42660" => 1037, - "old:virtual_from_version:46379" => 1070, - "old:virtual_from_version:47384" => 1077, - "old:virtual_from_version:49919" => 3206, - "old:virtual_from_version:42103" => 1037, - "old:virtual_from_version:50141" => 1580, - "old:virtual_from_version:50743" => 1105, - "old:virtual_from_version:45765" => 1048, - "old:virtual_from_version:49426" => 3002, - "old:virtual_from_version:44496" => 1037, - "old:virtual_from_version:49405" => 1689, - "old:virtual_from_version:49894" => 1070, - "old:virtual_from_version:45678" => 1009, - "old:virtual_from_version:42332" => 1070, - "old:virtual_from_version:50405" => 3227, - "old:virtual_from_version:46935" => 1585, - "old:virtual_from_version:42095" => 1077, - "old:virtual_from_version:39424" => 1172, - "old:virtual_from_version:39944" => 1037, - "old:virtual_from_version:47761" => 1077, - "old:virtual_from_version:42825" => 1172, - "old:virtual_from_version:45848" => 1627, - "old:virtual_from_version:38621" => 1081, - "old:virtual_from_version:45852" => 1009, - "old:virtual_from_version:44883" => 1172, - "old:virtual_from_version:42022" => 1009, - "old:virtual_from_version:40899" => 1025, - "old:virtual_from_version:47561" => 1109, - "old:virtual_from_version:42685" => 1491, - "old:virtual_from_version:46345" => 1172, - "old:virtual_from_version:46210" => 1555, - "old:virtual_from_version:45487" => 1070, - "old:virtual_from_version:49196" => 1077, - "old:virtual_from_version:46640" => 1125, - "old:virtual_from_version:50699" => 1689, - "old:virtual_from_version:44603" => 1007, - "old:virtual_from_version:43061" => 2062, - "old:virtual_from_version:46839" => 1105, - "old:virtual_from_version:44913" => 1009, - "old:virtual_from_version:50693" => 3271, - "old:virtual_from_version:39753" => 1067, - "old:virtual_from_version:50124" => 1070, - "old:virtual_from_version:46557" => 1009, - "old:virtual_from_version:42708" => 1070, - "old:virtual_from_version:45540" => 1077, - "old:virtual_from_version:50705" => 1417, - "old:virtual_from_version:42494" => 1077, - "old:virtual_from_version:46018" => 1077, - "old:virtual_from_version:46359" => 1077, - "old:virtual_from_version:44436" => 1037, - "old:virtual_from_version:44265" => 1037, - "old:virtual_from_version:49008" => 1070, - "old:virtual_from_version:50769" => 1070, - "old:virtual_from_version:46620" => 1404, - "old:virtual_from_version:38677" => 1009, - "old:virtual_from_version:47664" => 1109, - "old:virtual_from_version:43011" => 2036, - "old:virtual_from_version:47176" => 1638, - "old:virtual_from_version:45647" => 1076, - "old:virtual_from_version:47309" => 1070, - "old:virtual_from_version:44241" => 1077, - "old:virtual_from_version:49465" => 1067, - "old:virtual_from_version:44387" => 1094, - "old:virtual_from_version:44729" => 1541, - "old:virtual_from_version:46563" => 1172, - "old:virtual_from_version:50359" => 1689, - "old:virtual_from_version:47573" => 1580, - "old:virtual_from_version:44748" => 1077, - "old:virtual_from_version:50542" => 1583, - "old:virtual_from_version:44086" => 1070, - "old:virtual_from_version:38873" => 1135, - "old:virtual_from_version:46887" => 1077, - "old:virtual_from_version:50489" => 1491, - "old:virtual_from_version:50611" => 1417, - "old:virtual_from_version:32145" => 1099, - "old:virtual_from_version:46408" => 1402, - "old:virtual_from_version:44635" => 1037, - "old:virtual_from_version:47889" => 1125, - "old:virtual_from_version:42569" => 1037, - "old:virtual_from_version:46133" => 1067, - "old:virtual_from_version:42273" => 1037, - "old:virtual_from_version:50430" => 1659, - "old:virtual_from_version:50039" => 3131, - "old:virtual_from_version:45229" => 1461, - "old:virtual_from_version:43048" => 2021, - "old:virtual_from_version:50497" => 3251, - "old:virtual_from_version:42540" => 1037, - "old:virtual_from_version:49552" => 1007, - "old:virtual_from_version:45743" => 1532, - "old:virtual_from_version:44269" => 1125, - "old:virtual_from_version:39977" => 1104, - "old:virtual_from_version:46955" => 3012, - "old:virtual_from_version:47374" => 3008, - "old:virtual_from_version:42441" => 1070, - "old:virtual_from_version:47642" => 1077, - "old:virtual_from_version:45513" => 1025, - "old:virtual_from_version:44545" => 1070, - "old:virtual_from_version:40723" => 1077, - "old:virtual_from_version:47072" => 1689, - "old:virtual_from_version:47413" => 1125, - "old:virtual_from_version:47990" => 3016, - "old:virtual_from_version:49953" => 3131, - "old:virtual_from_version:42726" => 1083, - "old:virtual_from_version:50437" => 1257, - "old:virtual_from_version:50092" => 1172, - "old:virtual_from_version:40790" => 1077, - "old:virtual_from_version:42152" => 1077, - "old:virtual_from_version:46682" => 1070, - "old:virtual_from_version:49128" => 1584, - "old:virtual_from_version:45278" => 1008, - "old:virtual_from_version:49247" => 1404, - "old:virtual_from_version:45361" => 1584, - "old:virtual_from_version:44253" => 1081, - "old:virtual_from_version:44455" => 1136, - "old:virtual_from_version:42044" => 1009, - "old:virtual_from_version:47128" => 1621, - "old:virtual_from_version:48012" => 2112, - "old:virtual_from_version:49111" => 1136, - "old:virtual_from_version:45742" => 1125, - "old:virtual_from_version:47955" => 1112, - "old:virtual_from_version:42363" => 1025, - "old:virtual_from_version:50201" => 1069, - "old:virtual_from_version:47021" => 1532, - "old:virtual_from_version:46518" => 1067, - "old:virtual_from_version:40043" => 1094, - "old:virtual_from_version:49737" => 1128, - "old:virtual_from_version:44752" => 1006, - "old:virtual_from_version:39778" => 1000, - "old:virtual_from_version:43108" => 2100, - "old:virtual_from_version:46368" => 1555, - "old:virtual_from_version:42675" => 1077, - "old:virtual_from_version:50076" => 3131, - "old:virtual_from_version:44906" => 1321, - "old:virtual_from_version:47070" => 1172, - "old:virtual_from_version:50719" => 3259, - "old:virtual_from_version:49628" => 3184, - "old:virtual_from_version:46031" => 1070, - "old:virtual_from_version:49308" => 1025, - "old:virtual_from_version:46125" => 1070, - "old:virtual_from_version:42289" => 1015, - "old:virtual_from_version:40378" => 1107, - "old:virtual_from_version:45135" => 1009, - "old:virtual_from_version:50330" => 3238, - "old:virtual_from_version:47688" => 1621, - "old:virtual_from_version:42488" => 1136, - "old:virtual_from_version:45471" => 1031, - "old:virtual_from_version:44778" => 1076, - "old:virtual_from_version:45566" => 1532, - "old:virtual_from_version:50171" => 1314, - "old:virtual_from_version:46346" => 1077, - "old:virtual_from_version:42666" => 1488, - "old:virtual_from_version:42842" => 1077, - "old:virtual_from_version:44380" => 1023, - "old:virtual_from_version:45356" => 1012, - "old:virtual_from_version:40814" => 1070, - "old:virtual_from_version:40214" => 1109, - "old:virtual_from_version:42782" => 1070, - "old:virtual_from_version:44710" => 1107, - "old:virtual_from_version:42572" => 1070, - "old:virtual_from_version:45293" => 1580, - "old:virtual_from_version:47365" => 1444, - "old:virtual_from_version:50088" => 3131, - "old:virtual_from_version:14174" => 1059, - "old:virtual_from_version:49432" => 3008, - "old:virtual_from_version:47203" => 1123, - "old:virtual_from_version:46856" => 3003, - "old:virtual_from_version:47876" => 1109, - "old:virtual_from_version:40771" => 1077, - "old:virtual_from_version:47497" => 1070, - "old:virtual_from_version:49194" => 1649, - "old:virtual_from_version:42342" => 1009, - "old:virtual_from_version:45322" => 1586, - "old:virtual_from_version:39174" => 1404, - "old:virtual_from_version:47388" => 1037, - "old:virtual_from_version:46959" => 1105, - "old:virtual_from_version:50130" => 1070, - "old:virtual_from_version:48015" => 2115, - "old:virtual_from_version:38634" => 1000, - "old:virtual_from_version:40413" => 1070, - "old:virtual_from_version:45141" => 1321, - "old:virtual_from_version:50025" => 1070, - "old:virtual_from_version:42121" => 1037, - "old:virtual_from_version:42498" => 1057, - "old:virtual_from_version:44115" => 1107, - "old:virtual_from_version:47548" => 1077, - "old:virtual_from_version:42409" => 1172, - "old:virtual_from_version:47040" => 1077, - "old:virtual_from_version:46514" => 1007, - "old:virtual_from_version:45140" => 1110, - "old:virtual_from_version:50361" => 1125, - "old:virtual_from_version:40980" => 1125, - "old:virtual_from_version:47381" => 1070, - "old:virtual_from_version:45283" => 1006, - "old:virtual_from_version:38756" => 1007, - "old:virtual_from_version:42761" => 1077, - "old:virtual_from_version:42846" => 1081, - "old:virtual_from_version:50358" => 1150, - "old:virtual_from_version:50522" => 1033, - "old:virtual_from_version:49454" => 1689, - "old:virtual_from_version:45846" => 1498, - "old:virtual_from_version:46794" => 1070, - "old:virtual_from_version:46263" => 1537, - "old:virtual_from_version:49016" => 1009, - "old:virtual_from_version:46898" => 2100, - "old:virtual_from_version:47794" => 3104, - "old:virtual_from_version:44410" => 1017, - "old:virtual_from_version:46156" => 1077, - "old:virtual_from_version:40996" => 1077, - "old:virtual_from_version:47215" => 1009, - "old:virtual_from_version:49421" => 1070, - "old:virtual_from_version:44999" => 1105, - "old:virtual_from_version:50247" => 1070, - "old:virtual_from_version:47015" => 1125, - "old:virtual_from_version:45721" => 1362, - "old:virtual_from_version:49557" => 1067, - "old:virtual_from_version:49951" => 1070, - "old:virtual_from_version:45696" => 1019, - "old:virtual_from_version:49520" => 1574, - "old:virtual_from_version:50556" => 1689, - "old:virtual_from_version:42305" => 1077, - "old:virtual_from_version:46619" => 1077, - "old:virtual_from_version:44806" => 1070, - "old:virtual_from_version:50725" => 3259, - "old:virtual_from_version:47350" => 1077, - "old:virtual_from_version:42600" => 1009, - "old:virtual_from_version:38611" => 1122, - "old:virtual_from_version:44859" => 1077, - "old:virtual_from_version:40815" => 1009, - "old:virtual_from_version:50304" => 3131, - "old:virtual_from_version:39906" => 1404, - "old:virtual_from_version:42399" => 1067, - "old:virtual_from_version:39503" => 1183, - "old:virtual_from_version:50399" => 1689, - "old:virtual_from_version:40557" => 1070, - "old:virtual_from_version:50320" => 1067, - "old:virtual_from_version:46538" => 1077, - "old:virtual_from_version:43059" => 2059, - "old:virtual_from_version:42929" => 1037, - "old:virtual_from_version:48020" => 2120, - "old:virtual_from_version:39521" => 1104, - "old:virtual_from_version:50380" => 3131, - "old:virtual_from_version:50170" => 3226, - "old:virtual_from_version:45751" => 1532, - "old:virtual_from_version:50043" => 1012, - "old:virtual_from_version:45927" => 1633, - "old:virtual_from_version:49441" => 1404, - "old:virtual_from_version:46067" => 1077, - "old:virtual_from_version:50419" => 1136, - "old:virtual_from_version:42679" => 1070, - "old:virtual_from_version:40810" => 1125, - "old:virtual_from_version:49279" => 1077, - "old:virtual_from_version:42251" => 1025, - "old:virtual_from_version:50390" => 1125, - "old:virtual_from_version:46940" => 1070, - "old:virtual_from_version:44417" => 1027, - "old:virtual_from_version:44447" => 1037, - "old:virtual_from_version:39241" => 1109, - "old:virtual_from_version:39524" => 1025, - "old:virtual_from_version:49494" => 1404, - "old:virtual_from_version:47853" => 1585, - "old:virtual_from_version:47347" => 1125, - "old:virtual_from_version:49521" => 1580, - "old:virtual_from_version:50537" => 1381, - "old:virtual_from_version:47788" => 1077, - "old:virtual_from_version:42068" => 1077, - "old:virtual_from_version:40484" => 1370, - "old:virtual_from_version:46014" => 1105, - "old:virtual_from_version:49771" => 3131, - "old:virtual_from_version:42809" => 1037, - "old:virtual_from_version:42728" => 1237, - "old:virtual_from_version:44408" => 1016, - "old:virtual_from_version:40748" => 1025, - "old:virtual_from_version:43082" => 2079, - "old:virtual_from_version:40716" => 1077, - "old:virtual_from_version:42097" => 1110, - "old:virtual_from_version:45817" => 1019, - "old:virtual_from_version:45338" => 1125, - "old:virtual_from_version:46768" => 1517, - "old:virtual_from_version:44542" => 1077, - "old:virtual_from_version:47327" => 1125, - "old:virtual_from_version:44589" => 1077, - "old:virtual_from_version:40402" => 1352, - "old:virtual_from_version:42119" => 1070, - "old:virtual_from_version:49448" => 1689, - "old:virtual_from_version:49216" => 1190, - "old:virtual_from_version:46434" => 1077, - "old:virtual_from_version:45654" => 1009, - "old:virtual_from_version:50376" => 1070, - "old:virtual_from_version:47775" => 1689, - "old:virtual_from_version:49444" => 1070, - "old:virtual_from_version:44951" => 1070, - "old:virtual_from_version:50727" => 1070, - "old:virtual_from_version:40927" => 1070, - "old:virtual_from_version:40666" => 1012, - "old:virtual_from_version:50119" => 1112, - "old:virtual_from_version:42800" => 1498, - "old:virtual_from_version:44510" => 1532, - "old:virtual_from_version:44611" => 1125, - "old:virtual_from_version:44893" => 1048, - "old:virtual_from_version:46993" => 1077, - "old:virtual_from_version:46608" => 1070, - "old:virtual_from_version:45968" => 1070, - "old:virtual_from_version:47840" => 1689, - "old:virtual_from_version:46611" => 1012, - "old:virtual_from_version:42585" => 1009, - "old:virtual_from_version:44264" => 1077, - "old:virtual_from_version:46008" => 1125, - "old:virtual_from_version:46059" => 1070, - "old:virtual_from_version:42393" => 1037, - "old:virtual_from_version:40997" => 1037, - "old:virtual_from_version:44707" => 1037, - "old:virtual_from_version:45312" => 1584, - "old:virtual_from_version:47369" => 1109, - "old:virtual_from_version:46995" => 3008, - "old:virtual_from_version:50745" => 1689, - "old:virtual_from_version:50213" => 1070, - "old:virtual_from_version:49634" => 1532, - "old:virtual_from_version:42774" => 1110, - "old:virtual_from_version:47415" => 1105, - "old:virtual_from_version:42260" => 1000, - "old:virtual_from_version:46341" => 1671, - "old:virtual_from_version:47112" => 3019, - "old:virtual_from_version:42069" => 1037, - "old:virtual_from_version:47389" => 1037, - "old:virtual_from_version:40700" => 1025, - "old:virtual_from_version:49296" => 1580, - "old:virtual_from_version:49789" => 1070, - "old:virtual_from_version:42793" => 1009, - "old:virtual_from_version:50259" => 1689, - "old:virtual_from_version:49434" => 1070, - "old:virtual_from_version:45785" => 1048, - "old:virtual_from_version:44485" => 1107, - "old:virtual_from_version:49673" => 1136, - "old:virtual_from_version:47421" => 1109, - "old:virtual_from_version:40918" => 1070, - "old:virtual_from_version:45284" => 1077, - "old:virtual_from_version:42860" => 1498, - "old:virtual_from_version:49822" => 1565, - "old:virtual_from_version:46463" => 1172, - "old:virtual_from_version:50710" => 1070, - "old:virtual_from_version:49052" => 3094, - "old:virtual_from_version:49870" => 1689, - "old:virtual_from_version:42046" => 1037, - "old:virtual_from_version:44519" => 1112, - "old:virtual_from_version:50028" => 1032, - "old:virtual_from_version:43096" => 2088, - "old:virtual_from_version:18960" => 1041, - "old:virtual_from_version:44157" => 1125, - "old:virtual_from_version:47352" => 1070, - "old:virtual_from_version:42822" => 1025, - "old:virtual_from_version:44762" => 1062, - "old:virtual_from_version:45362" => 1585, - "old:virtual_from_version:42199" => 1070, - "old:virtual_from_version:42778" => 1009, - "old:virtual_from_version:47110" => 1640, - "old:virtual_from_version:46533" => 1077, - "old:virtual_from_version:42045" => 1077, - "old:virtual_from_version:49224" => 1070, - "old:virtual_from_version:40909" => 1077, - "old:virtual_from_version:40964" => 1037, - "old:virtual_from_version:40662" => 1070, - "old:virtual_from_version:40665" => 1009, - "old:virtual_from_version:49848" => 1537, - "old:virtual_from_version:47105" => 1583, - "old:virtual_from_version:42163" => 1172, - "old:virtual_from_version:49713" => 1404, - "old:virtual_from_version:45511" => 1105, - "old:virtual_from_version:50485" => 3189, - "old:virtual_from_version:45956" => 1077, - "old:virtual_from_version:49671" => 3155, - "old:virtual_from_version:46441" => 1077, - "old:virtual_from_version:39907" => 1222, - "old:virtual_from_version:47224" => 1077, - "old:virtual_from_version:46706" => 1697, - "old:virtual_from_version:44070" => 1037, - "old:virtual_from_version:45385" => 1125, - "old:virtual_from_version:35826" => 1000, - "old:virtual_from_version:44077" => 1077, - "old:virtual_from_version:47669" => 1112, - "old:virtual_from_version:39895" => 1007, - "old:virtual_from_version:45583" => 1615, - "old:virtual_from_version:44469" => 1077, - "old:virtual_from_version:50661" => 1110, - "old:virtual_from_version:50303" => 3131, - "old:virtual_from_version:49697" => 1640, - "old:virtual_from_version:40974" => 1007, - "old:virtual_from_version:42057" => 1077, - "old:virtual_from_version:45724" => 1009, - "old:virtual_from_version:46306" => 1125, - "old:virtual_from_version:46968" => 3013, - "old:virtual_from_version:50375" => 1007, - "old:virtual_from_version:50181" => 3131, - "old:virtual_from_version:50448" => 1070, - "old:virtual_from_version:42802" => 1172, - "old:virtual_from_version:47975" => 1649, - "old:virtual_from_version:46506" => 1112, - "old:virtual_from_version:47181" => 1125, - "old:virtual_from_version:46644" => 1077, - "old:virtual_from_version:49669" => 1404, - "old:virtual_from_version:39222" => 1110, - "old:virtual_from_version:44680" => 1070, - "old:virtual_from_version:47744" => 1077, - "old:virtual_from_version:46671" => 1070, - "old:virtual_from_version:40869" => 1222, - "old:virtual_from_version:44470" => 1037, - "old:virtual_from_version:46430" => 1587, - "old:virtual_from_version:49491" => 1659, - "old:virtual_from_version:42957" => 1070, - "old:virtual_from_version:46765" => 1136, - "old:virtual_from_version:44935" => 1078, - "old:virtual_from_version:40775" => 1070, - "old:virtual_from_version:47629" => 1070, - "old:virtual_from_version:38758" => 1125, - "old:virtual_from_version:45773" => 1067, - "old:virtual_from_version:45424" => 1007, - "old:virtual_from_version:42889" => 1067, - "old:virtual_from_version:44681" => 1009, - "old:virtual_from_version:44127" => 1077, - "old:virtual_from_version:44699" => 1037, - "old:virtual_from_version:46178" => 1125, - "old:virtual_from_version:42258" => 1077, - "old:virtual_from_version:44831" => 1024, - "old:virtual_from_version:46517" => 1109, - "old:virtual_from_version:44529" => 1037, - "old:virtual_from_version:47185" => 1404, - "old:virtual_from_version:42677" => 1109, - "old:virtual_from_version:45661" => 1070, - "old:virtual_from_version:44560" => 1070, - "old:virtual_from_version:40951" => 1070, - "old:virtual_from_version:45113" => 1517, - "old:virtual_from_version:45008" => 1413, - "old:virtual_from_version:49359" => 1125, - "old:virtual_from_version:44703" => 1539, - "old:virtual_from_version:42643" => 1037, - "old:virtual_from_version:47340" => 1037, - "old:virtual_from_version:42133" => 1077, - "old:virtual_from_version:47166" => 1001, - "old:virtual_from_version:45528" => 1136, - "old:virtual_from_version:45249" => 1064, - "old:virtual_from_version:50549" => 3259, - "old:virtual_from_version:43042" => 2054, - "old:virtual_from_version:44064" => 1070, - "old:virtual_from_version:45560" => 1109, - "old:virtual_from_version:42353" => 1037, - "old:virtual_from_version:38361" => 1109, - "old:virtual_from_version:46387" => 1070, - "old:virtual_from_version:42135" => 1110, - "old:virtual_from_version:42244" => 1009, - "old:virtual_from_version:49866" => 3002, - "old:virtual_from_version:42334" => 1025, - "old:virtual_from_version:42654" => 1077, - "old:virtual_from_version:44081" => 1107, - "old:virtual_from_version:40577" => 1077, - "old:virtual_from_version:46760" => 1689, - "old:virtual_from_version:42444" => 1037, - "old:virtual_from_version:40661" => 1107, - "old:virtual_from_version:46105" => 1077, - "old:virtual_from_version:46911" => 1397, - "old:virtual_from_version:45894" => 1077, - "old:virtual_from_version:42450" => 1037, - "old:virtual_from_version:49533" => 1532, - "old:virtual_from_version:45397" => 1404, - "old:virtual_from_version:40414" => 1009, - "old:virtual_from_version:50605" => 3259, - "old:virtual_from_version:46811" => 1077, - "old:virtual_from_version:50147" => 1032, - "old:virtual_from_version:50265" => 1070, - "old:virtual_from_version:49383" => 1077, - "old:virtual_from_version:45262" => 1022, - "old:virtual_from_version:47981" => 1574, - "old:virtual_from_version:49423" => 1070, - "old:virtual_from_version:50768" => 1353, - "old:virtual_from_version:46674" => 1070, - "old:virtual_from_version:44495" => 1077, - "old:virtual_from_version:47964" => 1689, - "old:virtual_from_version:49264" => 1689, - "old:virtual_from_version:50540" => 1489, - "old:virtual_from_version:42311" => 1000, - "old:virtual_from_version:49075" => 3094, - "old:virtual_from_version:49377" => 1070, - "old:virtual_from_version:47507" => 1005, - "old:virtual_from_version:47419" => 1007, - "old:virtual_from_version:42128" => 1110, - "old:virtual_from_version:45358" => 1404, - "old:virtual_from_version:50338" => 3214, - "old:virtual_from_version:43003" => 2028, - "old:virtual_from_version:42190" => 1009, - "old:virtual_from_version:42205" => 1077, - "old:virtual_from_version:45667" => 1025, - "old:virtual_from_version:38828" => 1134, - "old:virtual_from_version:50491" => 3221, - "old:virtual_from_version:42027" => 1077, - "old:virtual_from_version:50285" => 1125, - "old:virtual_from_version:49110" => 1649, - "old:virtual_from_version:44271" => 1009, - "old:virtual_from_version:50109" => 3221, - "old:virtual_from_version:45074" => 1349, - "old:virtual_from_version:42109" => 1077, - "old:virtual_from_version:40383" => 1025, - "old:virtual_from_version:44063" => 1037, - "old:virtual_from_version:50574" => 1070, - "old:virtual_from_version:44718" => 1009, - "old:virtual_from_version:38562" => 1109, - "old:virtual_from_version:42223" => 1107, - "old:virtual_from_version:40971" => 1414, - "old:virtual_from_version:49389" => 1172, - "old:virtual_from_version:44812" => 1005, - "old:virtual_from_version:46904" => 3006, - "old:virtual_from_version:49300" => 1070, - "old:virtual_from_version:45235" => 1578, - "old:virtual_from_version:42612" => 1070, - "old:virtual_from_version:30081" => 1094, - "old:virtual_from_version:42224" => 1070, - "old:virtual_from_version:49630" => 1158, - "old:virtual_from_version:46933" => 1583, - "old:virtual_from_version:45924" => 1009, - "old:virtual_from_version:40949" => 1172, - "old:virtual_from_version:49807" => 3198, - "old:virtual_from_version:47023" => 1689, - "old:virtual_from_version:42113" => 1037, - "old:virtual_from_version:45898" => 1070, - "old:virtual_from_version:46052" => 1006, - "old:virtual_from_version:44743" => 1224, - "old:virtual_from_version:42400" => 1070, - "old:virtual_from_version:49922" => 3208, - "old:virtual_from_version:50506" => 3259, - "old:virtual_from_version:40628" => 1077, - "old:virtual_from_version:41016" => 2025, - "old:virtual_from_version:44758" => 1070, - "old:virtual_from_version:42565" => 1070, - "old:virtual_from_version:42265" => 1077, - "old:virtual_from_version:42542" => 1077, - "old:virtual_from_version:50416" => 1314, - "old:virtual_from_version:47924" => 1689, - "old:virtual_from_version:47408" => 1077, - "old:virtual_from_version:50548" => 3236, - "old:virtual_from_version:40850" => 1070, - "old:virtual_from_version:40302" => 1062, - "old:virtual_from_version:45524" => 1070, - "old:virtual_from_version:49335" => 1077, - "old:virtual_from_version:44006" => 1490, - "old:virtual_from_version:50517" => 3263, - "old:virtual_from_version:50450" => 1112, - "old:virtual_from_version:46246" => 1070, - "old:virtual_from_version:49927" => 3209, - "old:virtual_from_version:45060" => 1095, - "old:virtual_from_version:45412" => 1136, - "old:virtual_from_version:42970" => 1070, - "old:virtual_from_version:42325" => 1070, - "old:virtual_from_version:42495" => 1037, - "old:virtual_from_version:42753" => 1025, - "old:virtual_from_version:42918" => 1037, - "old:virtual_from_version:45564" => 1077, - "old:virtual_from_version:45639" => 1172, - "old:virtual_from_version:40779" => 1070, - "old:virtual_from_version:47101" => 1352, - "old:virtual_from_version:49017" => 1077, - "old:virtual_from_version:49881" => 1125, - "old:virtual_from_version:46490" => 1006, - "old:virtual_from_version:44438" => 1110, - "old:virtual_from_version:42769" => 1007, - "old:virtual_from_version:45155" => 1136, - "old:virtual_from_version:47212" => 1125, - "old:virtual_from_version:42264" => 1070, - "old:virtual_from_version:49865" => 1689, - "old:virtual_from_version:46460" => 1659, - "old:virtual_from_version:46070" => 1007, - "old:virtual_from_version:50276" => 3218, - "old:virtual_from_version:44902" => 1009, - "old:virtual_from_version:45529" => 1070, - "old:virtual_from_version:42854" => 1172, - "old:virtual_from_version:47199" => 1109, - "old:virtual_from_version:40242" => 1081, - "old:virtual_from_version:45106" => 1125, - "old:virtual_from_version:46280" => 1070, - "old:virtual_from_version:42549" => 1077, - "old:virtual_from_version:49839" => 1006, - "old:virtual_from_version:49188" => 1077, - "old:virtual_from_version:38680" => 1077, - "old:virtual_from_version:45646" => 1404, - "old:virtual_from_version:49029" => 1649, - "old:virtual_from_version:40819" => 1000, - "old:virtual_from_version:49306" => 1585, - "old:virtual_from_version:38783" => 1069, - "old:virtual_from_version:42403" => 1404, - "old:virtual_from_version:47218" => 3016, - "old:virtual_from_version:44233" => 1077, - "old:virtual_from_version:49101" => 3146, - "old:virtual_from_version:42556" => 1077, - "old:virtual_from_version:46129" => 1070, - "old:virtual_from_version:50236" => 3131, - "old:virtual_from_version:45833" => 1404, - "old:virtual_from_version:50126" => 1172, - "old:virtual_from_version:44904" => 1110, - "old:virtual_from_version:46721" => 1125, - "old:virtual_from_version:42704" => 1067, - "old:virtual_from_version:46146" => 1077, - "old:virtual_from_version:49944" => 1314, - "old:virtual_from_version:45780" => 1062, - "old:virtual_from_version:49477" => 1314, - "old:virtual_from_version:49361" => 1404, - "old:virtual_from_version:49831" => 1404, - "old:virtual_from_version:49198" => 1689, - "old:virtual_from_version:40485" => 1070, - "old:virtual_from_version:45023" => 1091, - "old:virtual_from_version:38912" => 1083, - "old:virtual_from_version:42595" => 1109, - "old:virtual_from_version:49343" => 1107, - "old:virtual_from_version:47947" => 1077, - "old:virtual_from_version:45138" => 1550, - "old:virtual_from_version:49489" => 1107, - "old:virtual_from_version:47737" => 1077, - "old:virtual_from_version:45531" => 1077, - "old:virtual_from_version:47967" => 1070, - "old:virtual_from_version:42695" => 1009, - "old:virtual_from_version:47567" => 1070, - "old:virtual_from_version:49840" => 1489, - "old:virtual_from_version:45813" => 1621, - "old:virtual_from_version:45858" => 1067, - "old:virtual_from_version:44172" => 1009, - "old:virtual_from_version:46208" => 1025, - "old:virtual_from_version:44660" => 1009, - "old:virtual_from_version:40944" => 1070, - "old:virtual_from_version:46136" => 1070, - "old:virtual_from_version:49399" => 1070, - "old:virtual_from_version:40875" => 1037, - "old:virtual_from_version:44648" => 1037, - "old:virtual_from_version:47173" => 1105, - "old:virtual_from_version:40698" => 1009, - "old:virtual_from_version:47996" => 1109, - "old:virtual_from_version:47898" => 1109, - "old:virtual_from_version:49986" => 1025, - "old:virtual_from_version:47160" => 1689, - "old:virtual_from_version:44934" => 1070, - "old:virtual_from_version:41013" => 2023, - "old:virtual_from_version:42233" => 1009, - "old:virtual_from_version:42225" => 1009, - "old:virtual_from_version:49910" => 3194, - "old:virtual_from_version:42749" => 1067, - "old:virtual_from_version:47645" => 1621, - "old:virtual_from_version:42964" => 1070, - "old:virtual_from_version:46369" => 1070, - "old:virtual_from_version:43029" => 2029, - "old:virtual_from_version:49730" => 1666, - "old:virtual_from_version:44071" => 1110, - "old:virtual_from_version:49350" => 1077, - "old:virtual_from_version:47362" => 1109, - "old:virtual_from_version:38692" => 1062, - "old:virtual_from_version:46569" => 1077, - "old:virtual_from_version:45277" => 1105, - "old:virtual_from_version:40972" => 1037, - "old:virtual_from_version:44335" => 1077, - "old:virtual_from_version:40537" => 1077, - "old:virtual_from_version:40261" => 1314, - "old:virtual_from_version:45368" => 1009, - "old:virtual_from_version:44099" => 1070, - "old:virtual_from_version:44501" => 1070, - "old:virtual_from_version:49292" => 1070, - "old:virtual_from_version:42797" => 1037, - "old:virtual_from_version:49084" => 3094, - "old:virtual_from_version:47171" => 1343, - "old:virtual_from_version:44206" => 1125, - "old:virtual_from_version:50362" => 1689, - "old:virtual_from_version:44734" => 1070, - "old:virtual_from_version:46134" => 1077, - "old:virtual_from_version:45344" => 1031, - "old:virtual_from_version:50103" => 1172, - "old:virtual_from_version:47521" => 1077, - "old:virtual_from_version:40697" => 1070, - "old:virtual_from_version:40880" => 1037, - "old:virtual_from_version:50196" => 1172, - "old:virtual_from_version:47559" => 1037, - "old:virtual_from_version:44126" => 1009, - "old:virtual_from_version:42144" => 1070, - "old:virtual_from_version:44977" => 1051, - "old:virtual_from_version:43020" => 2045, - "old:virtual_from_version:49442" => 1580, - "old:virtual_from_version:47400" => 3008, - "old:virtual_from_version:49529" => 1410, - "old:virtual_from_version:42518" => 1009, - "old:virtual_from_version:47249" => 1070, - "old:virtual_from_version:49535" => 3008, - "old:virtual_from_version:49301" => 1136, - "old:virtual_from_version:50351" => 1659, - "old:virtual_from_version:46204" => 1077, - "old:virtual_from_version:40928" => 1077, - "old:virtual_from_version:44348" => 1037, - "old:virtual_from_version:46353" => 1190, - "old:virtual_from_version:49656" => 1070, - "old:virtual_from_version:49063" => 1077, - "old:virtual_from_version:50756" => 1125, - "old:virtual_from_version:47305" => 3042, - "old:virtual_from_version:42407" => 1037, - "old:virtual_from_version:45054" => 1081, - "old:virtual_from_version:44169" => 1136, - "old:virtual_from_version:47041" => 1070, - "old:virtual_from_version:45035" => 1017, - "old:virtual_from_version:45270" => 1019, - "old:virtual_from_version:47838" => 1587, - "old:virtual_from_version:50245" => 1689, - "old:virtual_from_version:44780" => 1070, - "old:virtual_from_version:40842" => 1077, - "old:virtual_from_version:46298" => 1070, - "old:virtual_from_version:42531" => 1070, - "old:virtual_from_version:50528" => 1136, - "old:virtual_from_version:45643" => 1067, - "old:virtual_from_version:42437" => 1077, - "old:virtual_from_version:45797" => 1015, - "old:virtual_from_version:42326" => 1009, - "old:virtual_from_version:44719" => 1025, - "old:virtual_from_version:44961" => 1062, - "old:virtual_from_version:46600" => 1070, - "old:virtual_from_version:45889" => 1077, - "old:virtual_from_version:47734" => 1125, - "old:virtual_from_version:47965" => 3016, - "old:virtual_from_version:42642" => 1077, - "old:virtual_from_version:44566" => 1070, - "old:virtual_from_version:49457" => 1070, - "old:virtual_from_version:50691" => 1689, - "old:virtual_from_version:45313" => 1585, - "old:virtual_from_version:46725" => 1537, - "old:virtual_from_version:47828" => 1125, - "old:virtual_from_version:46796" => 1172, - "old:virtual_from_version:42845" => 1109, - "old:virtual_from_version:44769" => 1489, - "old:virtual_from_version:49699" => 1158, - "old:virtual_from_version:42997" => 1037, - "old:virtual_from_version:47700" => 1070, - "old:virtual_from_version:45745" => 1070, - "old:virtual_from_version:47321" => 1125, - "old:virtual_from_version:46800" => 1666, - "old:virtual_from_version:46673" => 1077, - "old:virtual_from_version:50484" => 1410, - "old:virtual_from_version:47109" => 1070, - "old:virtual_from_version:44067" => 1107, - "old:virtual_from_version:46401" => 1537, - "old:virtual_from_version:47652" => 1070, - "old:virtual_from_version:46946" => 1077, - "old:virtual_from_version:47696" => 1077, - "old:virtual_from_version:50598" => 1136, - "old:virtual_from_version:49639" => 1070, - "old:virtual_from_version:44735" => 1077, - "old:virtual_from_version:47579" => 1077, - "old:virtual_from_version:15764" => 1029, - "old:virtual_from_version:45864" => 1627, - "old:virtual_from_version:50737" => 1585, - "old:virtual_from_version:49175" => 1659, - "old:virtual_from_version:47117" => 1656, - "old:virtual_from_version:40766" => 1107, - "old:virtual_from_version:47121" => 1125, - "old:virtual_from_version:40865" => 1411, - "old:virtual_from_version:45585" => 1136, - "old:virtual_from_version:44052" => 1070, - "old:virtual_from_version:47874" => 1136, - "old:virtual_from_version:42791" => 1222, - "old:virtual_from_version:50037" => 3220, - "old:virtual_from_version:49433" => 1007, - "old:virtual_from_version:44418" => 1030, - "old:virtual_from_version:46884" => 1048, - "old:virtual_from_version:47684" => 1051, - "old:virtual_from_version:45246" => 1070, - "old:virtual_from_version:38518" => 1108, - "old:virtual_from_version:44320" => 1498, - "old:virtual_from_version:44583" => 1037, - "old:virtual_from_version:46874" => 1613, - "old:virtual_from_version:39316" => 1077, - "old:virtual_from_version:40573" => 1077, - "old:virtual_from_version:40562" => 1070, - "old:virtual_from_version:21275" => 1057, - "old:virtual_from_version:40393" => 1344, - "old:virtual_from_version:42795" => 1025, - "old:virtual_from_version:45520" => 1077, - "old:virtual_from_version:44484" => 1125, - "old:virtual_from_version:44537" => 1110, - "old:virtual_from_version:45823" => 1190, - "old:virtual_from_version:49360" => 1077, - "old:virtual_from_version:50254" => 1689, - "old:virtual_from_version:50533" => 1150, - "old:virtual_from_version:46257" => 1517, - "old:virtual_from_version:48002" => 2103, - "old:virtual_from_version:50194" => 3030, - "old:virtual_from_version:45905" => 1070, - "old:virtual_from_version:49808" => 1062, - "old:virtual_from_version:45400" => 1032, - "old:virtual_from_version:42449" => 1077, - "old:virtual_from_version:44573" => 1067, - "old:virtual_from_version:45281" => 1012, - "old:virtual_from_version:49782" => 3194, - "old:virtual_from_version:42390" => 1009, - "old:virtual_from_version:44720" => 1077, - "old:virtual_from_version:44268" => 1084, - "old:virtual_from_version:38964" => 1109, - "old:virtual_from_version:40950" => 1107, - "old:virtual_from_version:49876" => 1172, - "old:virtual_from_version:45501" => 1105, - "old:virtual_from_version:40924" => 1048, - "old:virtual_from_version:49733" => 1015, - "old:virtual_from_version:44061" => 1009, - "old:virtual_from_version:43022" => 2047, - "old:virtual_from_version:45772" => 1077, - "old:virtual_from_version:45319" => 1110, - "old:virtual_from_version:42657" => 1009, - "old:virtual_from_version:44598" => 1057, - "old:virtual_from_version:47746" => 3090, - "old:virtual_from_version:46293" => 1414, - "old:virtual_from_version:42546" => 1172, - "old:virtual_from_version:49374" => 3167, - "old:virtual_from_version:40618" => 1078, - "old:virtual_from_version:42458" => 1136, - "old:virtual_from_version:49740" => 1584, - "old:virtual_from_version:45301" => 1107, - "old:virtual_from_version:40567" => 1115, - "old:virtual_from_version:45969" => 1172, - "old:virtual_from_version:49408" => 1048, - "old:virtual_from_version:43087" => 2081, - "old:virtual_from_version:40807" => 1070, - "old:virtual_from_version:49331" => 1070, - "old:virtual_from_version:43070" => 2070, - "old:virtual_from_version:44016" => 1054, - "old:virtual_from_version:44628" => 1037, - "old:virtual_from_version:42913" => 1070, - "old:virtual_from_version:42165" => 1006, - "old:virtual_from_version:45798" => 1019, - "old:virtual_from_version:46174" => 1077, - "old:virtual_from_version:45958" => 1461, - "old:virtual_from_version:49384" => 1489, - "old:virtual_from_version:50302" => 1025, - "old:virtual_from_version:47152" => 1070, - "old:virtual_from_version:42292" => 1077, - "old:virtual_from_version:47085" => 3008, - "old:virtual_from_version:49562" => 1158, - "old:virtual_from_version:47741" => 1077, - "old:virtual_from_version:48036" => 2079, - "old:virtual_from_version:43063" => 2064, - "old:virtual_from_version:44807" => 1077, - "old:virtual_from_version:49060" => 3094, - "old:virtual_from_version:46956" => 1062, - "old:virtual_from_version:49905" => 3205, - "old:virtual_from_version:44466" => 1107, - "old:virtual_from_version:44789" => 1107, - "old:virtual_from_version:46855" => 1509, - "old:virtual_from_version:49580" => 1035, - "old:virtual_from_version:42926" => 1070, - "old:virtual_from_version:46199" => 1407, - "old:virtual_from_version:45504" => 1532, - "old:virtual_from_version:47087" => 1125, - "old:virtual_from_version:42668" => 1070, - "old:virtual_from_version:42536" => 1000, - "old:virtual_from_version:49097" => 1012, - "old:virtual_from_version:49912" => 1348, - "old:virtual_from_version:45840" => 1107, - "old:virtual_from_version:45363" => 1587, - "old:virtual_from_version:47429" => 1109, - "old:virtual_from_version:42343" => 1077, - "old:virtual_from_version:49385" => 1489, - "old:virtual_from_version:45600" => 1077, - "old:virtual_from_version:47004" => 1070, - "old:virtual_from_version:47468" => 1109, - "old:virtual_from_version:44093" => 1070, - "old:virtual_from_version:45699" => 1070, - "old:virtual_from_version:45314" => 1009, - "old:virtual_from_version:42060" => 1067, - "old:virtual_from_version:42024" => 1037, - "old:virtual_from_version:40377" => 1032, - "old:virtual_from_version:49040" => 1037, - "old:virtual_from_version:42962" => 1110, - "old:virtual_from_version:46761" => 1575, - "old:virtual_from_version:47832" => 1109, - "old:virtual_from_version:44706" => 1077, - "old:virtual_from_version:40898" => 1009, - "old:virtual_from_version:45944" => 1136, - "old:virtual_from_version:50645" => 1070, - "old:virtual_from_version:50121" => 1031, - "old:virtual_from_version:47449" => 1070, - "old:virtual_from_version:44209" => 1009, - "old:virtual_from_version:42869" => 1070, - "old:virtual_from_version:39734" => 1059, - "old:virtual_from_version:49461" => 1404, - "old:virtual_from_version:46828" => 1077, - "old:virtual_from_version:46670" => 1404, - "old:virtual_from_version:44578" => 1048, - "old:virtual_from_version:40584" => 1070, - "old:virtual_from_version:49000" => 1077, - "old:virtual_from_version:42117" => 1328, - "old:virtual_from_version:50718" => 1417, - "old:virtual_from_version:47517" => 1125, - "old:virtual_from_version:50589" => 3259, - "old:virtual_from_version:46958" => 1070, - "old:virtual_from_version:49845" => 1515, - "old:virtual_from_version:44914" => 1517, - "old:virtual_from_version:45325" => 1009, - "old:virtual_from_version:38368" => 1112, - "old:virtual_from_version:49059" => 1666, - "old:virtual_from_version:42902" => 1009, - "old:virtual_from_version:46854" => 3002, - "old:virtual_from_version:46798" => 1077, - "old:virtual_from_version:49018" => 3129, - "old:virtual_from_version:47635" => 1689, - "old:virtual_from_version:44746" => 1007, - "old:virtual_from_version:42906" => 1067, - "old:virtual_from_version:45298" => 1237, - "old:virtual_from_version:40946" => 1077, - "old:virtual_from_version:47084" => 1077, - "old:virtual_from_version:50571" => 3031, - "old:virtual_from_version:45649" => 1136, - "old:virtual_from_version:42037" => 1070, - "old:virtual_from_version:47161" => 3029, - "old:virtual_from_version:42878" => 1007, - "old:virtual_from_version:49258" => 1077, - "old:virtual_from_version:46536" => 1077, - "old:virtual_from_version:44034" => 1077, - "old:virtual_from_version:47295" => 1037, - "old:virtual_from_version:44907" => 1070, - "old:virtual_from_version:50713" => 1070, - "old:virtual_from_version:40904" => 1025, - "old:virtual_from_version:44117" => 1009, - "old:virtual_from_version:45157" => 1051, - "old:virtual_from_version:46812" => 3002, - "old:virtual_from_version:40760" => 1009, - "old:virtual_from_version:49391" => 1095, - "old:virtual_from_version:47386" => 3008, - "old:virtual_from_version:39264" => 1144, - "old:virtual_from_version:47378" => 1077, - "old:virtual_from_version:44580" => 1078, - "old:virtual_from_version:44774" => 1350, - "old:virtual_from_version:45132" => 1009, - "old:virtual_from_version:50425" => 1035, - "old:virtual_from_version:47526" => 1037, - "old:virtual_from_version:44970" => 1043, - "old:virtual_from_version:50652" => 1417, - "old:virtual_from_version:47706" => 1321, - "old:virtual_from_version:44307" => 1125, - "old:virtual_from_version:42013" => 1037, - "old:virtual_from_version:45122" => 1125, - "old:virtual_from_version:45238" => 1136, - "old:virtual_from_version:44471" => 1110, - "old:virtual_from_version:42175" => 1418, - "old:virtual_from_version:49210" => 3155, - "old:virtual_from_version:50206" => 1659, - "old:virtual_from_version:40495" => 1077, - "old:virtual_from_version:46158" => 1077, - "old:virtual_from_version:24814" => 1040, - "old:virtual_from_version:49679" => 3190, - "old:virtual_from_version:45139" => 1009, - "old:virtual_from_version:44141" => 1037, - "old:virtual_from_version:45709" => 1533, - "old:virtual_from_version:42659" => 1077, - "old:virtual_from_version:42694" => 1070, - "old:virtual_from_version:49066" => 3136, - "old:virtual_from_version:42909" => 1025, - "old:virtual_from_version:45839" => 1125, - "old:virtual_from_version:42050" => 1025, - "old:virtual_from_version:45682" => 1027, - "old:virtual_from_version:42032" => 1077, - "old:virtual_from_version:50002" => 3131, - "old:virtual_from_version:49272" => 3078, - "old:virtual_from_version:42942" => 1172, - "old:virtual_from_version:43010" => 2035, - "old:virtual_from_version:45711" => 1009, - "old:virtual_from_version:47800" => 1007, - "old:virtual_from_version:47379" => 1404, - "old:virtual_from_version:45403" => 1125, - "old:virtual_from_version:46162" => 1105, - "old:virtual_from_version:50035" => 3176, - "old:virtual_from_version:49714" => 1489, - "old:virtual_from_version:44650" => 1009, - "old:virtual_from_version:40684" => 1048, - "old:virtual_from_version:44522" => 1107, - "old:virtual_from_version:46295" => 1070, - "old:virtual_from_version:40712" => 1077, - "old:virtual_from_version:44051" => 1107, - "old:virtual_from_version:39042" => 1125, - "old:virtual_from_version:49362" => 1070, - "old:virtual_from_version:44439" => 1067, - "old:virtual_from_version:45906" => 1125, - "old:virtual_from_version:40497" => 1328, - "old:virtual_from_version:46381" => 1109, - "old:virtual_from_version:40591" => 1070, - "old:virtual_from_version:49508" => 1125, - "old:virtual_from_version:42949" => 1070, - "old:virtual_from_version:46984" => 1585, - "old:virtual_from_version:46699" => 1696, - "old:virtual_from_version:46750" => 1699, - "old:virtual_from_version:46292" => 1077, - "old:virtual_from_version:45837" => 1070, - "old:virtual_from_version:50122" => 3131, - "old:virtual_from_version:49702" => 1583, - "old:virtual_from_version:42396" => 1009, - "old:virtual_from_version:49964" => 3211, - "old:virtual_from_version:50153" => 1059, - "old:virtual_from_version:49756" => 1172, - "old:virtual_from_version:46485" => 1105, - "old:virtual_from_version:47689" => 1689, - "old:virtual_from_version:45088" => 1116, - "old:virtual_from_version:40856" => 1009, - "old:virtual_from_version:45085" => 1009, - "old:virtual_from_version:49879" => 3131, - "old:virtual_from_version:49584" => 1136, - "old:virtual_from_version:47022" => 1580, - "old:virtual_from_version:49860" => 1025, - "old:virtual_from_version:39804" => 1088, - "old:virtual_from_version:44427" => 1112, - "old:virtual_from_version:40867" => 1077, - "old:virtual_from_version:49980" => 1070, - "old:virtual_from_version:40976" => 1077, - "old:virtual_from_version:49718" => 1037, - "old:virtual_from_version:46528" => 1070, - "old:virtual_from_version:50095" => 1172, - "old:virtual_from_version:49351" => 1077, - "old:virtual_from_version:47102" => 1070, - "old:virtual_from_version:45159" => 1125, - "old:virtual_from_version:49936" => 1100, - "old:virtual_from_version:46115" => 1517, - "old:virtual_from_version:46328" => 1125, - "old:virtual_from_version:42047" => 1110, - "old:virtual_from_version:46615" => 1063, - "old:virtual_from_version:43038" => 2037, - "old:virtual_from_version:45247" => 1063, - "old:virtual_from_version:42324" => 1172, - "old:virtual_from_version:49540" => 3181, - "old:virtual_from_version:45824" => 1084, - "old:virtual_from_version:46578" => 1077, - "old:virtual_from_version:37911" => 1090, - "old:virtual_from_version:42072" => 1077, - "old:virtual_from_version:42358" => 1025, - "old:virtual_from_version:46943" => 1109, - "old:virtual_from_version:46852" => 1666, - "old:virtual_from_version:45655" => 1077, - "old:virtual_from_version:45413" => 1112, - "old:virtual_from_version:45801" => 1172, - "old:virtual_from_version:40832" => 1123, - "old:virtual_from_version:50513" => 1584, - "old:virtual_from_version:40479" => 1025, - "old:virtual_from_version:40605" => 1025, - "old:virtual_from_version:46643" => 1070, - "old:virtual_from_version:40977" => 1037, - "old:virtual_from_version:50150" => 1172, - "old:virtual_from_version:44683" => 1077, - "old:virtual_from_version:46876" => 1070, - "old:virtual_from_version:47862" => 1404, - "old:virtual_from_version:46860" => 1007, - "old:virtual_from_version:44868" => 1070, - "old:virtual_from_version:45710" => 1070, - "old:virtual_from_version:46075" => 1077, - "old:virtual_from_version:47074" => 1659, - "old:virtual_from_version:45630" => 1172, - "old:virtual_from_version:44328" => 1077, - "old:virtual_from_version:46698" => 1020, - "old:virtual_from_version:45048" => 1037, - "old:virtual_from_version:44497" => 1110, - "old:virtual_from_version:15732" => 1005, - "old:virtual_from_version:44488" => 1023, - "old:virtual_from_version:49427" => 1070, - "old:virtual_from_version:44848" => 1009, - "old:virtual_from_version:46071" => 1070, - "old:virtual_from_version:40433" => 1108, - "old:virtual_from_version:50161" => 3058, - "old:virtual_from_version:47231" => 1070, - "old:virtual_from_version:42304" => 1025, - "old:virtual_from_version:49106" => 3094, - "old:virtual_from_version:49549" => 1410, - "old:virtual_from_version:45648" => 1172, - "old:virtual_from_version:40900" => 1077, - "old:virtual_from_version:44104" => 1125, - "old:virtual_from_version:44930" => 1077, - "old:virtual_from_version:50274" => 3131, - "old:virtual_from_version:43057" => 2057, - "old:virtual_from_version:44145" => 1009, - "old:virtual_from_version:38819" => 1108, - "old:virtual_from_version:46051" => 1025, - "old:virtual_from_version:44607" => 1037, - "old:virtual_from_version:50112" => 1172, - "old:virtual_from_version:44783" => 1070, - "old:virtual_from_version:40372" => 1009, - "old:virtual_from_version:40409" => 1048, - "old:virtual_from_version:45002" => 1025, - "old:virtual_from_version:46139" => 1070, - "old:virtual_from_version:46223" => 1007, - "old:virtual_from_version:42310" => 1037, - "old:virtual_from_version:44649" => 1070, - "old:virtual_from_version:42936" => 1037, - "old:virtual_from_version:47760" => 1109, - "old:virtual_from_version:44208" => 1070, - "old:virtual_from_version:47250" => 1125, - "old:virtual_from_version:42911" => 1037, - "old:virtual_from_version:46503" => 1584, - "old:virtual_from_version:50340" => 1070, - "old:virtual_from_version:50091" => 1125, - "old:virtual_from_version:46973" => 1583, - "old:virtual_from_version:45316" => 1012, - "old:virtual_from_version:50096" => 1009, - "old:virtual_from_version:46683" => 1077, - "old:virtual_from_version:44736" => 1083, - "old:virtual_from_version:44007" => 1311, - "old:virtual_from_version:49088" => 3139, - "old:virtual_from_version:46414" => 1077, - "old:virtual_from_version:44623" => 1025, - "old:virtual_from_version:42107" => 1105, - "old:virtual_from_version:44369" => 1069, - "old:virtual_from_version:45838" => 1362, - "old:virtual_from_version:42062" => 1025, - "old:virtual_from_version:46461" => 1062, - "old:virtual_from_version:47372" => 3008, - "old:virtual_from_version:46468" => 1404, - "old:virtual_from_version:49450" => 3176, - "old:virtual_from_version:47393" => 1697, - "old:virtual_from_version:47843" => 3114, - "old:virtual_from_version:44105" => 1107, - "old:virtual_from_version:45584" => 1172, - "old:virtual_from_version:45684" => 1615, - "old:virtual_from_version:47154" => 1017, - "old:virtual_from_version:49136" => 1012, - "old:virtual_from_version:42722" => 1025, - "old:virtual_from_version:50730" => 3273, - "old:virtual_from_version:42157" => 1416, - "old:virtual_from_version:46793" => 3000, - "old:virtual_from_version:45320" => 1125, - "old:virtual_from_version:45455" => 1136, - "old:virtual_from_version:49051" => 3114, - "old:virtual_from_version:44196" => 1007, - "old:virtual_from_version:39152" => 1125, - "old:virtual_from_version:45462" => 1077, - "old:virtual_from_version:44388" => 1065, - "old:virtual_from_version:45285" => 1031, - "old:virtual_from_version:49284" => 3146, - "old:virtual_from_version:49625" => 3183, - "old:virtual_from_version:50739" => 3259, - "old:virtual_from_version:46977" => 1125, - "old:virtual_from_version:49780" => 1489, - "old:virtual_from_version:39585" => 1404, - "old:virtual_from_version:50133" => 3131, - "old:virtual_from_version:38683" => 1067, - "old:virtual_from_version:47367" => 1070, - "old:virtual_from_version:42514" => 1048, - "old:virtual_from_version:45712" => 1077, - "old:virtual_from_version:45415" => 1444, - "old:virtual_from_version:50203" => 1689, - "old:virtual_from_version:47205" => 1125, - "old:virtual_from_version:45794" => 1107, - "old:virtual_from_version:45125" => 1009, - "old:virtual_from_version:42781" => 1048, - "old:virtual_from_version:50344" => 3192, - "old:virtual_from_version:49065" => 3094, - "old:virtual_from_version:49778" => 1112, - "old:virtual_from_version:49972" => 3209, - "old:virtual_from_version:45747" => 1027, - "old:virtual_from_version:47366" => 1037, - "old:virtual_from_version:40913" => 1070, - "old:virtual_from_version:35710" => 1017, - "old:virtual_from_version:47210" => 1321, - "old:virtual_from_version:45156" => 1404, - "old:virtual_from_version:46339" => 1105, - "old:virtual_from_version:42281" => 1423, - "old:virtual_from_version:45417" => 1136, - "old:virtual_from_version:44458" => 1112, - "old:virtual_from_version:42285" => 1222, - "old:virtual_from_version:40546" => 1116, - "old:virtual_from_version:40170" => 1076, - "old:virtual_from_version:42532" => 1077, - "old:virtual_from_version:45093" => 1105, - "old:virtual_from_version:36614" => 1006, - "old:virtual_from_version:44925" => 1077, - "old:virtual_from_version:47835" => 1077, - "old:virtual_from_version:49518" => 1025, - "old:virtual_from_version:47581" => 1568, - "old:virtual_from_version:50364" => 1035, - "old:virtual_from_version:47433" => 1689, - "old:virtual_from_version:43088" => 2082, - "old:virtual_from_version:45771" => 1025, - "old:virtual_from_version:47010" => 3015, - "old:virtual_from_version:42049" => 1009, - "old:virtual_from_version:47488" => 1172, - "old:virtual_from_version:44621" => 1070, - "old:virtual_from_version:50098" => 3221, - "old:virtual_from_version:45451" => 1077, - "old:virtual_from_version:50086" => 1172, - "old:virtual_from_version:47142" => 3025, - "old:virtual_from_version:38340" => 1070, - "old:virtual_from_version:46494" => 1321, - "old:virtual_from_version:39993" => 2008, - "old:virtual_from_version:40245" => 1152, - "old:virtual_from_version:49683" => 1070, - "old:virtual_from_version:47174" => 1077, - "old:virtual_from_version:50649" => 1067, - "old:virtual_from_version:46605" => 1077, - "old:virtual_from_version:40291" => 1110, - "old:virtual_from_version:41006" => 1168, - "old:virtual_from_version:40046" => 1007, - "old:virtual_from_version:46691" => 1125, - "old:virtual_from_version:50369" => 3131, - "old:virtual_from_version:44331" => 1070, - "old:virtual_from_version:42200" => 1009, - "old:virtual_from_version:45746" => 1125, - "old:virtual_from_version:44215" => 1109 -} \ No newline at end of file + 'old:virtual_from_version:40876' => 1048, + 'old:virtual_from_version:44059' => 1125, + 'old:virtual_from_version:46266' => 1172, + 'old:virtual_from_version:44870' => 1077, + 'old:virtual_from_version:40446' => 1009, + 'old:virtual_from_version:42230' => 1083, + 'old:virtual_from_version:44261' => 1070, + 'old:virtual_from_version:44863' => 1009, + 'old:virtual_from_version:44231' => 1107, + 'old:virtual_from_version:47370' => 1077, + 'old:virtual_from_version:49429' => 1580, + 'old:virtual_from_version:42156' => 1037, + 'old:virtual_from_version:44222' => 1009, + 'old:virtual_from_version:42381' => 1070, + 'old:virtual_from_version:50050' => 3131, + 'old:virtual_from_version:47704' => 1689, + 'old:virtual_from_version:40625' => 1070, + 'old:virtual_from_version:40934' => 1070, + 'old:virtual_from_version:43002' => 2018, + 'old:virtual_from_version:40941' => 1070, + 'old:virtual_from_version:39314' => 1125, + 'old:virtual_from_version:46950' => 1070, + 'old:virtual_from_version:46093' => 1649, + 'old:virtual_from_version:49425' => 1025, + 'old:virtual_from_version:42731' => 1077, + 'old:virtual_from_version:47095' => 1077, + 'old:virtual_from_version:49684' => 1125, + 'old:virtual_from_version:49229' => 1689, + 'old:virtual_from_version:47012' => 3016, + 'old:virtual_from_version:45228' => 1414, + 'old:virtual_from_version:45287' => 1517, + 'old:virtual_from_version:45569' => 1136, + 'old:virtual_from_version:42525' => 1017, + 'old:virtual_from_version:38363' => 1081, + 'old:virtual_from_version:40404' => 1354, + 'old:virtual_from_version:47677' => 1689, + 'old:virtual_from_version:47916' => 1081, + 'old:virtual_from_version:42239' => 1077, + 'old:virtual_from_version:46908' => 1070, + 'old:virtual_from_version:50341' => 3131, + 'old:virtual_from_version:44232' => 1070, + 'old:virtual_from_version:44622' => 1009, + 'old:virtual_from_version:40556' => 1067, + 'old:virtual_from_version:46102' => 1070, + 'old:virtual_from_version:49057' => 1077, + 'old:virtual_from_version:45091' => 1025, + 'old:virtual_from_version:44599' => 1141, + 'old:virtual_from_version:39208' => 1148, + 'old:virtual_from_version:44055' => 1077, + 'old:virtual_from_version:39055' => 1110, + 'old:virtual_from_version:44779' => 1545, + 'old:virtual_from_version:43073' => 2072, + 'old:virtual_from_version:45955' => 1105, + 'old:virtual_from_version:46215' => 1070, + 'old:virtual_from_version:46917' => 1109, + 'old:virtual_from_version:50608' => 1136, + 'old:virtual_from_version:29952' => 1078, + 'old:virtual_from_version:42084' => 1070, + 'old:virtual_from_version:45919' => 1035, + 'old:virtual_from_version:40589' => 1077, + 'old:virtual_from_version:44604' => 1009, + 'old:virtual_from_version:50267' => 3131, + 'old:virtual_from_version:50174' => 1172, + 'old:virtual_from_version:40681' => 1081, + 'old:virtual_from_version:44915' => 1077, + 'old:virtual_from_version:42810' => 1500, + 'old:virtual_from_version:46938' => 3009, + 'old:virtual_from_version:42177' => 1172, + 'old:virtual_from_version:40398' => 1348, + 'old:virtual_from_version:49002' => 1070, + 'old:virtual_from_version:45570' => 1070, + 'old:virtual_from_version:42980' => 1009, + 'old:virtual_from_version:42557' => 1037, + 'old:virtual_from_version:42070' => 1107, + 'old:virtual_from_version:40634' => 1070, + 'old:virtual_from_version:40441' => 1083, + 'old:virtual_from_version:39905' => 1081, + 'old:virtual_from_version:45020' => 1070, + 'old:virtual_from_version:47294' => 1077, + 'old:virtual_from_version:44738' => 1070, + 'old:virtual_from_version:49659' => 3155, + 'old:virtual_from_version:44158' => 1107, + 'old:virtual_from_version:44939' => 1125, + 'old:virtual_from_version:47658' => 1070, + 'old:virtual_from_version:38751' => 1112, + 'old:virtual_from_version:50316' => 1311, + 'old:virtual_from_version:45554' => 1172, + 'old:virtual_from_version:46320' => 1115, + 'old:virtual_from_version:46790' => 1077, + 'old:virtual_from_version:45799' => 1067, + 'old:virtual_from_version:49263' => 1532, + 'old:virtual_from_version:45033' => 1016, + 'old:virtual_from_version:45005' => 1006, + 'old:virtual_from_version:47430' => 1077, + 'old:virtual_from_version:42607' => 1070, + 'old:virtual_from_version:44878' => 1125, + 'old:virtual_from_version:46763' => 1062, + 'old:virtual_from_version:44050' => 1125, + 'old:virtual_from_version:50616' => 1025, + 'old:virtual_from_version:50308' => 1224, + 'old:virtual_from_version:45330' => 1588, + 'old:virtual_from_version:45783' => 1007, + 'old:virtual_from_version:42948' => 1148, + 'old:virtual_from_version:42159' => 1077, + 'old:virtual_from_version:39932' => 1110, + 'old:virtual_from_version:42828' => 1078, + 'old:virtual_from_version:39175' => 1146, + 'old:virtual_from_version:47474' => 1070, + 'old:virtual_from_version:44796' => 1077, + 'old:virtual_from_version:45353' => 1107, + 'old:virtual_from_version:42081' => 1009, + 'old:virtual_from_version:45491' => 1009, + 'old:virtual_from_version:44302' => 1013, + 'old:virtual_from_version:40848' => 1407, + 'old:virtual_from_version:45954' => 1070, + 'old:virtual_from_version:50612' => 1689, + 'old:virtual_from_version:38407' => 1104, + 'old:virtual_from_version:48010' => 2110, + 'old:virtual_from_version:39483' => 1007, + 'old:virtual_from_version:41000' => 2012, + 'old:virtual_from_version:46948' => 1659, + 'old:virtual_from_version:44362' => 1063, + 'old:virtual_from_version:45446' => 1125, + 'old:virtual_from_version:42256' => 1009, + 'old:virtual_from_version:47113' => 3020, + 'old:virtual_from_version:42442' => 1009, + 'old:virtual_from_version:46735' => 1689, + 'old:virtual_from_version:43021' => 2046, + 'old:virtual_from_version:49586' => 1067, + 'old:virtual_from_version:44579' => 1070, + 'old:virtual_from_version:40892' => 1108, + 'old:virtual_from_version:44692' => 1109, + 'old:virtual_from_version:50607' => 1070, + 'old:virtual_from_version:50177' => 1070, + 'old:virtual_from_version:38801' => 1131, + 'old:virtual_from_version:39897' => 1183, + 'old:virtual_from_version:45015' => 1125, + 'old:virtual_from_version:47406' => 1125, + 'old:virtual_from_version:46305' => 1070, + 'old:virtual_from_version:45506' => 1584, + 'old:virtual_from_version:39737' => 1025, + 'old:virtual_from_version:47427' => 1136, + 'old:virtual_from_version:43086' => 2083, + 'old:virtual_from_version:42914' => 1009, + 'old:virtual_from_version:45928' => 1070, + 'old:virtual_from_version:44656' => 1025, + 'old:virtual_from_version:44637' => 1070, + 'old:virtual_from_version:49610' => 1659, + 'old:virtual_from_version:50200' => 1311, + 'old:virtual_from_version:47516' => 1070, + 'old:virtual_from_version:49208' => 1404, + 'old:virtual_from_version:50668' => 3208, + 'old:virtual_from_version:42598' => 1070, + 'old:virtual_from_version:49324' => 1070, + 'old:virtual_from_version:47473' => 1616, + 'old:virtual_from_version:49225' => 1125, + 'old:virtual_from_version:50763' => 1417, + 'old:virtual_from_version:45121' => 1077, + 'old:virtual_from_version:49776' => 3194, + 'old:virtual_from_version:49217' => 1070, + 'old:virtual_from_version:46356' => 1670, + 'old:virtual_from_version:50726' => 3266, + 'old:virtual_from_version:46452' => 1105, + 'old:virtual_from_version:49589' => 1077, + 'old:virtual_from_version:45476' => 1105, + 'old:virtual_from_version:49352' => 1136, + 'old:virtual_from_version:40828' => 1006, + 'old:virtual_from_version:40651' => 1397, + 'old:virtual_from_version:38793' => 1062, + 'old:virtual_from_version:46893' => 1070, + 'old:virtual_from_version:50209' => 1070, + 'old:virtual_from_version:40645' => 1128, + 'old:virtual_from_version:42563' => 1109, + 'old:virtual_from_version:49413' => 1070, + 'old:virtual_from_version:42408' => 1311, + 'old:virtual_from_version:45296' => 1062, + 'old:virtual_from_version:46543' => 1125, + 'old:virtual_from_version:41017' => 2026, + 'old:virtual_from_version:47043' => 1077, + 'old:virtual_from_version:50353' => 1125, + 'old:virtual_from_version:50721' => 1150, + 'old:virtual_from_version:44922' => 1555, + 'old:virtual_from_version:44822' => 1550, + 'old:virtual_from_version:46901' => 1077, + 'old:virtual_from_version:49205' => 1070, + 'old:virtual_from_version:45289' => 1110, + 'old:virtual_from_version:49676' => 1404, + 'old:virtual_from_version:47640' => 1125, + 'old:virtual_from_version:49390' => 1070, + 'old:virtual_from_version:50534' => 1314, + 'old:virtual_from_version:45730' => 1048, + 'old:virtual_from_version:46420' => 1136, + 'old:virtual_from_version:40902' => 1048, + 'old:virtual_from_version:44030' => 1077, + 'old:virtual_from_version:49732' => 1489, + 'old:virtual_from_version:46240' => 1070, + 'old:virtual_from_version:50700' => 3259, + 'old:virtual_from_version:42470' => 1404, + 'old:virtual_from_version:47364' => 1077, + 'old:virtual_from_version:46495' => 1580, + 'old:virtual_from_version:47445' => 1381, + 'old:virtual_from_version:46823' => 3000, + 'old:virtual_from_version:40512' => 1077, + 'old:virtual_from_version:49158' => 1077, + 'old:virtual_from_version:49930' => 1632, + 'old:virtual_from_version:40552' => 1091, + 'old:virtual_from_version:43036' => 2035, + 'old:virtual_from_version:50499' => 3259, + 'old:virtual_from_version:40778' => 1107, + 'old:virtual_from_version:49503' => 1107, + 'old:virtual_from_version:45553' => 1348, + 'old:virtual_from_version:42806' => 1009, + 'old:virtual_from_version:45109' => 1489, + 'old:virtual_from_version:44247' => 1070, + 'old:virtual_from_version:45377' => 1362, + 'old:virtual_from_version:47983' => 3126, + 'old:virtual_from_version:49979' => 1062, + 'old:virtual_from_version:47162' => 3030, + 'old:virtual_from_version:44217' => 1224, + 'old:virtual_from_version:45925' => 1025, + 'old:virtual_from_version:46708' => 1070, + 'old:virtual_from_version:47490' => 1070, + 'old:virtual_from_version:42876' => 1070, + 'old:virtual_from_version:49178' => 1077, + 'old:virtual_from_version:39149' => 1123, + 'old:virtual_from_version:44564' => 1037, + 'old:virtual_from_version:42252' => 1077, + 'old:virtual_from_version:49696' => 1158, + 'old:virtual_from_version:40797' => 1051, + 'old:virtual_from_version:40811' => 1077, + 'old:virtual_from_version:47730' => 1077, + 'old:virtual_from_version:42231' => 1172, + 'old:virtual_from_version:49064' => 1689, + 'old:virtual_from_version:42493' => 1025, + 'old:virtual_from_version:47153' => 1125, + 'old:virtual_from_version:49233' => 1077, + 'old:virtual_from_version:44129' => 1070, + 'old:virtual_from_version:48039' => 2136, + 'old:virtual_from_version:44101' => 1077, + 'old:virtual_from_version:49504' => 1105, + 'old:virtual_from_version:44725' => 1070, + 'old:virtual_from_version:49102' => 1649, + 'old:virtual_from_version:49138' => 1070, + 'old:virtual_from_version:44140' => 1077, + 'old:virtual_from_version:40745' => 1081, + 'old:virtual_from_version:46622' => 1136, + 'old:virtual_from_version:46415' => 1070, + 'old:virtual_from_version:50290' => 3223, + 'old:virtual_from_version:45423' => 1136, + 'old:virtual_from_version:40576' => 1070, + 'old:virtual_from_version:49455' => 3008, + 'old:virtual_from_version:45272' => 1069, + 'old:virtual_from_version:45866' => 1125, + 'old:virtual_from_version:49024' => 1125, + 'old:virtual_from_version:44190' => 1077, + 'old:virtual_from_version:39281' => 1105, + 'old:virtual_from_version:47997' => 1077, + 'old:virtual_from_version:40244' => 1311, + 'old:virtual_from_version:44403' => 1009, + 'old:virtual_from_version:47733' => 1070, + 'old:virtual_from_version:47817' => 3094, + 'old:virtual_from_version:49682' => 1651, + 'old:virtual_from_version:49897' => 1070, + 'old:virtual_from_version:45686' => 1027, + 'old:virtual_from_version:50084' => 1070, + 'old:virtual_from_version:39995' => 2010, + 'old:virtual_from_version:48018' => 2118, + 'old:virtual_from_version:42385' => 1037, + 'old:virtual_from_version:50070' => 1172, + 'old:virtual_from_version:44770' => 1544, + 'old:virtual_from_version:50310' => 1009, + 'old:virtual_from_version:40733' => 1009, + 'old:virtual_from_version:42743' => 1321, + 'old:virtual_from_version:46092' => 1649, + 'old:virtual_from_version:43044' => 2001, + 'old:virtual_from_version:50478' => 3234, + 'old:virtual_from_version:44888' => 1025, + 'old:virtual_from_version:40995' => 1125, + 'old:virtual_from_version:39517' => 1125, + 'old:virtual_from_version:42313' => 1025, + 'old:virtual_from_version:45694' => 1070, + 'old:virtual_from_version:40843' => 1109, + 'old:virtual_from_version:49219' => 1128, + 'old:virtual_from_version:42701' => 1009, + 'old:virtual_from_version:42002' => 1007, + 'old:virtual_from_version:47863' => 1583, + 'old:virtual_from_version:50681' => 1584, + 'old:virtual_from_version:49818' => 3200, + 'old:virtual_from_version:42512' => 1081, + 'old:virtual_from_version:42486' => 1077, + 'old:virtual_from_version:50244' => 1067, + 'old:virtual_from_version:42832' => 1037, + 'old:virtual_from_version:42953' => 1037, + 'old:virtual_from_version:40717' => 1070, + 'old:virtual_from_version:50219' => 1065, + 'old:virtual_from_version:49957' => 1489, + 'old:virtual_from_version:45404' => 1011, + 'old:virtual_from_version:44969' => 1063, + 'old:virtual_from_version:42383' => 1025, + 'old:virtual_from_version:44108' => 1517, + 'old:virtual_from_version:44987' => 1027, + 'old:virtual_from_version:45574' => 1136, + 'old:virtual_from_version:40216' => 1094, + 'old:virtual_from_version:47914' => 1125, + 'old:virtual_from_version:46211' => 1661, + 'old:virtual_from_version:44768' => 1077, + 'old:virtual_from_version:40919' => 1009, + 'old:virtual_from_version:45131' => 1125, + 'old:virtual_from_version:50128' => 3131, + 'old:virtual_from_version:42448' => 1125, + 'old:virtual_from_version:42608' => 1009, + 'old:virtual_from_version:46720' => 1070, + 'old:virtual_from_version:42986' => 1009, + 'old:virtual_from_version:47312' => 1109, + 'old:virtual_from_version:49920' => 3186, + 'old:virtual_from_version:47475' => 1037, + 'old:virtual_from_version:38675' => 1006, + 'old:virtual_from_version:50482' => 1491, + 'old:virtual_from_version:42922' => 1025, + 'old:virtual_from_version:47962' => 1067, + 'old:virtual_from_version:49131' => 3002, + 'old:virtual_from_version:49541' => 1532, + 'old:virtual_from_version:47915' => 1037, + 'old:virtual_from_version:49551' => 1689, + 'old:virtual_from_version:42250' => 1009, + 'old:virtual_from_version:45542' => 1532, + 'old:virtual_from_version:50451' => 1172, + 'old:virtual_from_version:42368' => 1070, + 'old:virtual_from_version:46428' => 1070, + 'old:virtual_from_version:49445' => 1105, + 'old:virtual_from_version:44355' => 1172, + 'old:virtual_from_version:45896' => 1125, + 'old:virtual_from_version:44543' => 1037, + 'old:virtual_from_version:42372' => 1404, + 'old:virtual_from_version:44616' => 1077, + 'old:virtual_from_version:49270' => 1077, + 'old:virtual_from_version:47858' => 1037, + 'old:virtual_from_version:44531' => 1533, + 'old:virtual_from_version:42080' => 1070, + 'old:virtual_from_version:46889' => 1125, + 'old:virtual_from_version:49243' => 3158, + 'old:virtual_from_version:50638' => 1105, + 'old:virtual_from_version:45243' => 1078, + 'old:virtual_from_version:44525' => 1070, + 'old:virtual_from_version:49966' => 1070, + 'old:virtual_from_version:42319' => 1077, + 'old:virtual_from_version:40984' => 1415, + 'old:virtual_from_version:42482' => 1067, + 'old:virtual_from_version:44694' => 1538, + 'old:virtual_from_version:47671' => 1077, + 'old:virtual_from_version:47865' => 1585, + 'old:virtual_from_version:47675' => 1077, + 'old:virtual_from_version:46492' => 1686, + 'old:virtual_from_version:46218' => 1070, + 'old:virtual_from_version:44483' => 1037, + 'old:virtual_from_version:49045' => 1404, + 'old:virtual_from_version:49244' => 1070, + 'old:virtual_from_version:45036' => 1019, + 'old:virtual_from_version:42693' => 1032, + 'old:virtual_from_version:49958' => 3131, + 'old:virtual_from_version:46097' => 1077, + 'old:virtual_from_version:37419' => 1038, + 'old:virtual_from_version:49709' => 1086, + 'old:virtual_from_version:42386' => 1404, + 'old:virtual_from_version:47690' => 1070, + 'old:virtual_from_version:40740' => 1222, + 'old:virtual_from_version:46986' => 3008, + 'old:virtual_from_version:47001' => 1125, + 'old:virtual_from_version:38955' => 1006, + 'old:virtual_from_version:46660' => 1070, + 'old:virtual_from_version:42676' => 1037, + 'old:virtual_from_version:44618' => 1109, + 'old:virtual_from_version:39242' => 1035, + 'old:virtual_from_version:47297' => 1616, + 'old:virtual_from_version:46832' => 1048, + 'old:virtual_from_version:44764' => 1009, + 'old:virtual_from_version:40259' => 1067, + 'old:virtual_from_version:42169' => 1037, + 'old:virtual_from_version:42686' => 1070, + 'old:virtual_from_version:46268' => 1517, + 'old:virtual_from_version:45899' => 1125, + 'old:virtual_from_version:46592' => 1070, + 'old:virtual_from_version:50075' => 1172, + 'old:virtual_from_version:40973' => 1070, + 'old:virtual_from_version:38378' => 1009, + 'old:virtual_from_version:42012' => 1077, + 'old:virtual_from_version:50049' => 1689, + 'old:virtual_from_version:47752' => 1077, + 'old:virtual_from_version:50637' => 1128, + 'old:virtual_from_version:40617' => 1070, + 'old:virtual_from_version:49810' => 1006, + 'old:virtual_from_version:38662' => 1404, + 'old:virtual_from_version:49394' => 1070, + 'old:virtual_from_version:40719' => 1081, + 'old:virtual_from_version:42920' => 1048, + 'old:virtual_from_version:40542' => 1077, + 'old:virtual_from_version:49234' => 1532, + 'old:virtual_from_version:45216' => 1571, + 'old:virtual_from_version:45478' => 1077, + 'old:virtual_from_version:47044' => 3017, + 'old:virtual_from_version:49347' => 1404, + 'old:virtual_from_version:42006' => 1037, + 'old:virtual_from_version:47959' => 1649, + 'old:virtual_from_version:39103' => 1144, + 'old:virtual_from_version:42234' => 1077, + 'old:virtual_from_version:46537' => 1070, + 'old:virtual_from_version:50424' => 3131, + 'old:virtual_from_version:49670' => 1689, + 'old:virtual_from_version:44665' => 1037, + 'old:virtual_from_version:49189' => 1404, + 'old:virtual_from_version:42650' => 1484, + 'old:virtual_from_version:40718' => 1077, + 'old:virtual_from_version:47953' => 1107, + 'old:virtual_from_version:40430' => 1009, + 'old:virtual_from_version:49076' => 1083, + 'old:virtual_from_version:50373' => 1032, + 'old:virtual_from_version:50379' => 1689, + 'old:virtual_from_version:45401' => 1136, + 'old:virtual_from_version:42933' => 1070, + 'old:virtual_from_version:49129' => 1585, + 'old:virtual_from_version:44001' => 1070, + 'old:virtual_from_version:50446' => 3189, + 'old:virtual_from_version:45486' => 1136, + 'old:virtual_from_version:45763' => 1077, + 'old:virtual_from_version:40702' => 1081, + 'old:virtual_from_version:40613' => 1109, + 'old:virtual_from_version:50030' => 3131, + 'old:virtual_from_version:46243' => 1009, + 'old:virtual_from_version:38918' => 1077, + 'old:virtual_from_version:13305' => 1063, + 'old:virtual_from_version:49044' => 1077, + 'old:virtual_from_version:46970' => 1077, + 'old:virtual_from_version:39902' => 1125, + 'old:virtual_from_version:46923' => 1109, + 'old:virtual_from_version:49701' => 1037, + 'old:virtual_from_version:46338' => 1110, + 'old:virtual_from_version:42136' => 1070, + 'old:virtual_from_version:45242' => 1065, + 'old:virtual_from_version:39604' => 1109, + 'old:virtual_from_version:45677' => 1125, + 'old:virtual_from_version:47778' => 1037, + 'old:virtual_from_version:46733' => 1077, + 'old:virtual_from_version:47564' => 1537, + 'old:virtual_from_version:44379' => 1022, + 'old:virtual_from_version:49943' => 1150, + 'old:virtual_from_version:44021' => 1037, + 'old:virtual_from_version:49015' => 1070, + 'old:virtual_from_version:47694' => 1070, + 'old:virtual_from_version:47091' => 1070, + 'old:virtual_from_version:13426' => 1067, + 'old:virtual_from_version:47439' => 1621, + 'old:virtual_from_version:46784' => 1070, + 'old:virtual_from_version:44631' => 1136, + 'old:virtual_from_version:46801' => 1659, + 'old:virtual_from_version:44477' => 1070, + 'old:virtual_from_version:50551' => 1125, + 'old:virtual_from_version:45425' => 1070, + 'old:virtual_from_version:40305' => 1112, + 'old:virtual_from_version:45770' => 1012, + 'old:virtual_from_version:40734' => 1016, + 'old:virtual_from_version:47017' => 1112, + 'old:virtual_from_version:50352' => 1070, + 'old:virtual_from_version:44313' => 1037, + 'old:virtual_from_version:42338' => 1404, + 'old:virtual_from_version:42017' => 1009, + 'old:virtual_from_version:49878' => 1314, + 'old:virtual_from_version:50083' => 3222, + 'old:virtual_from_version:50508' => 1035, + 'old:virtual_from_version:49644' => 3186, + 'old:virtual_from_version:44451' => 1530, + 'old:virtual_from_version:40706' => 1077, + 'old:virtual_from_version:45010' => 1150, + 'old:virtual_from_version:44457' => 1107, + 'old:virtual_from_version:46905' => 1070, + 'old:virtual_from_version:47785' => 1070, + 'old:virtual_from_version:46321' => 1077, + 'old:virtual_from_version:44852' => 1048, + 'old:virtual_from_version:44508' => 1321, + 'old:virtual_from_version:45055' => 1065, + 'old:virtual_from_version:39997' => 1035, + 'old:virtual_from_version:42029' => 1222, + 'old:virtual_from_version:42663' => 1009, + 'old:virtual_from_version:46657' => 1077, + 'old:virtual_from_version:46896' => 1353, + 'old:virtual_from_version:42507' => 1077, + 'old:virtual_from_version:45259' => 1048, + 'old:virtual_from_version:42188' => 1172, + 'old:virtual_from_version:48019' => 2119, + 'old:virtual_from_version:42209' => 1025, + 'old:virtual_from_version:46880' => 1397, + 'old:virtual_from_version:50465' => 1070, + 'old:virtual_from_version:49739' => 1583, + 'old:virtual_from_version:45371' => 1314, + 'old:virtual_from_version:46171' => 1537, + 'old:virtual_from_version:46810' => 1067, + 'old:virtual_from_version:45059' => 1067, + 'old:virtual_from_version:50217' => 3227, + 'old:virtual_from_version:39354' => 1115, + 'old:virtual_from_version:49157' => 1070, + 'old:virtual_from_version:44322' => 1125, + 'old:virtual_from_version:42746' => 1077, + 'old:virtual_from_version:45687' => 1615, + 'old:virtual_from_version:50597' => 1070, + 'old:virtual_from_version:42479' => 1025, + 'old:virtual_from_version:49339' => 3136, + 'old:virtual_from_version:46926' => 1070, + 'old:virtual_from_version:42605' => 1484, + 'old:virtual_from_version:42105' => 1077, + 'old:virtual_from_version:49476' => 1070, + 'old:virtual_from_version:40692' => 1016, + 'old:virtual_from_version:49496' => 1507, + 'old:virtual_from_version:47003' => 1077, + 'old:virtual_from_version:45792' => 1023, + 'old:virtual_from_version:50453' => 1150, + 'old:virtual_from_version:44890' => 1000, + 'old:virtual_from_version:47232' => 1109, + 'old:virtual_from_version:46702' => 1009, + 'old:virtual_from_version:44378' => 1517, + 'old:virtual_from_version:42582' => 1172, + 'old:virtual_from_version:46247' => 1077, + 'old:virtual_from_version:45161' => 1009, + 'old:virtual_from_version:42262' => 1077, + 'old:virtual_from_version:44521' => 1067, + 'old:virtual_from_version:44338' => 1070, + 'old:virtual_from_version:49802' => 3191, + 'old:virtual_from_version:47624' => 1084, + 'old:virtual_from_version:42423' => 1070, + 'old:virtual_from_version:46511' => 1125, + 'old:virtual_from_version:46817' => 1070, + 'old:virtual_from_version:44284' => 1067, + 'old:virtual_from_version:30037' => 1036, + 'old:virtual_from_version:50325' => 3237, + 'old:virtual_from_version:47149' => 3022, + 'old:virtual_from_version:47900' => 1583, + 'old:virtual_from_version:46573' => 1077, + 'old:virtual_from_version:50411' => 3131, + 'old:virtual_from_version:46419' => 1070, + 'old:virtual_from_version:38247' => 1025, + 'old:virtual_from_version:44690' => 1077, + 'old:virtual_from_version:42644' => 1062, + 'old:virtual_from_version:38625' => 1125, + 'old:virtual_from_version:46666' => 1077, + 'old:virtual_from_version:40397' => 1347, + 'old:virtual_from_version:39628' => 1012, + 'old:virtual_from_version:46331' => 1107, + 'old:virtual_from_version:40963' => 1077, + 'old:virtual_from_version:46809' => 1070, + 'old:virtual_from_version:44106' => 1070, + 'old:virtual_from_version:42186' => 1062, + 'old:virtual_from_version:49856' => 3131, + 'old:virtual_from_version:47556' => 3062, + 'old:virtual_from_version:45382' => 1404, + 'old:virtual_from_version:46890' => 1067, + 'old:virtual_from_version:45818' => 1009, + 'old:virtual_from_version:50045' => 3131, + 'old:virtual_from_version:50016' => 1100, + 'old:virtual_from_version:45003' => 1012, + 'old:virtual_from_version:43053' => 2055, + 'old:virtual_from_version:45459' => 1109, + 'old:virtual_from_version:42689' => 1037, + 'old:virtual_from_version:49478' => 1580, + 'old:virtual_from_version:42476' => 1070, + 'old:virtual_from_version:45717' => 1070, + 'old:virtual_from_version:42211' => 1037, + 'old:virtual_from_version:44840' => 1009, + 'old:virtual_from_version:50601' => 1417, + 'old:virtual_from_version:45468' => 1009, + 'old:virtual_from_version:42473' => 1105, + 'old:virtual_from_version:46330' => 1070, + 'old:virtual_from_version:47960' => 1070, + 'old:virtual_from_version:38682' => 1404, + 'old:virtual_from_version:49560' => 1025, + 'old:virtual_from_version:46582' => 1125, + 'old:virtual_from_version:42101' => 1070, + 'old:virtual_from_version:46508' => 1583, + 'old:virtual_from_version:46610' => 1172, + 'old:virtual_from_version:50553' => 1070, + 'old:virtual_from_version:47056' => 1077, + 'old:virtual_from_version:46687' => 1172, + 'old:virtual_from_version:47258' => 1587, + 'old:virtual_from_version:50617' => 1417, + 'old:virtual_from_version:47701' => 1125, + 'old:virtual_from_version:40096' => 1067, + 'old:virtual_from_version:46861' => 1070, + 'old:virtual_from_version:42391' => 1025, + 'old:virtual_from_version:44186' => 1107, + 'old:virtual_from_version:49218' => 1077, + 'old:virtual_from_version:40624' => 1067, + 'old:virtual_from_version:42114' => 1070, + 'old:virtual_from_version:47530' => 1404, + 'old:virtual_from_version:49835' => 3131, + 'old:virtual_from_version:47094' => 1009, + 'old:virtual_from_version:40877' => 1070, + 'old:virtual_from_version:45934' => 1077, + 'old:virtual_from_version:44926' => 1067, + 'old:virtual_from_version:45884' => 1077, + 'old:virtual_from_version:38833' => 1109, + 'old:virtual_from_version:49462' => 1580, + 'old:virtual_from_version:42016' => 1070, + 'old:virtual_from_version:46153' => 1404, + 'old:virtual_from_version:40608' => 1381, + 'old:virtual_from_version:49882' => 1069, + 'old:virtual_from_version:44212' => 1026, + 'old:virtual_from_version:40110' => 1009, + 'old:virtual_from_version:40910' => 1037, + 'old:virtual_from_version:49798' => 1100, + 'old:virtual_from_version:42634' => 1037, + 'old:virtual_from_version:45477' => 1025, + 'old:virtual_from_version:49238' => 1615, + 'old:virtual_from_version:49924' => 3186, + 'old:virtual_from_version:44275' => 1110, + 'old:virtual_from_version:42167' => 1417, + 'old:virtual_from_version:49515' => 1105, + 'old:virtual_from_version:47662' => 1077, + 'old:virtual_from_version:50581' => 1031, + 'old:virtual_from_version:40855' => 1070, + 'old:virtual_from_version:44965' => 1007, + 'old:virtual_from_version:42138' => 1009, + 'old:virtual_from_version:43005' => 2030, + 'old:virtual_from_version:45342' => 1172, + 'old:virtual_from_version:49003' => 1077, + 'old:virtual_from_version:50733' => 1006, + 'old:virtual_from_version:42751' => 1009, + 'old:virtual_from_version:46607' => 1537, + 'old:virtual_from_version:44929' => 1070, + 'old:virtual_from_version:49228' => 1404, + 'old:virtual_from_version:44805' => 1172, + 'old:virtual_from_version:44781' => 1077, + 'old:virtual_from_version:50350' => 3131, + 'old:virtual_from_version:49785' => 1689, + 'old:virtual_from_version:42584' => 1008, + 'old:virtual_from_version:38347' => 1013, + 'old:virtual_from_version:46738' => 1025, + 'old:virtual_from_version:41009' => 2020, + 'old:virtual_from_version:45082' => 1528, + 'old:virtual_from_version:50154' => 1070, + 'old:virtual_from_version:50409' => 1585, + 'old:virtual_from_version:45754' => 1125, + 'old:virtual_from_version:45605' => 1110, + 'old:virtual_from_version:49414' => 1109, + 'old:virtual_from_version:47100' => 1689, + 'old:virtual_from_version:49460' => 1172, + 'old:virtual_from_version:44760' => 1009, + 'old:virtual_from_version:49576' => 1533, + 'old:virtual_from_version:50735' => 1417, + 'old:virtual_from_version:44062' => 1077, + 'old:virtual_from_version:40403' => 1353, + 'old:virtual_from_version:45031' => 1012, + 'old:virtual_from_version:47695' => 1109, + 'old:virtual_from_version:47329' => 1077, + 'old:virtual_from_version:47799' => 1321, + 'old:virtual_from_version:40978' => 1048, + 'old:virtual_from_version:40386' => 1110, + 'old:virtual_from_version:46445' => 1105, + 'old:virtual_from_version:49566' => 1381, + 'old:virtual_from_version:44024' => 1077, + 'old:virtual_from_version:49174' => 1404, + 'old:virtual_from_version:42202' => 1077, + 'old:virtual_from_version:42278' => 1077, + 'old:virtual_from_version:49935' => 1070, + 'old:virtual_from_version:46041' => 1488, + 'old:virtual_from_version:45482' => 1125, + 'old:virtual_from_version:46822' => 1509, + 'old:virtual_from_version:43016' => 2041, + 'old:virtual_from_version:42179' => 1107, + 'old:virtual_from_version:44800' => 1321, + 'old:virtual_from_version:42912' => 1035, + 'old:virtual_from_version:42567' => 1025, + 'old:virtual_from_version:45237' => 1172, + 'old:virtual_from_version:50415' => 1037, + 'old:virtual_from_version:50166' => 1404, + 'old:virtual_from_version:50280' => 1107, + 'old:virtual_from_version:45539' => 1025, + 'old:virtual_from_version:49232' => 1105, + 'old:virtual_from_version:47961' => 1109, + 'old:virtual_from_version:46426' => 1077, + 'old:virtual_from_version:40942' => 1077, + 'old:virtual_from_version:47731' => 1565, + 'old:virtual_from_version:46634' => 1070, + 'old:virtual_from_version:49603' => 1172, + 'old:virtual_from_version:50535' => 1084, + 'old:virtual_from_version:46804' => 1125, + 'old:virtual_from_version:42759' => 1070, + 'old:virtual_from_version:45057' => 1048, + 'old:virtual_from_version:3905 ' => 1052, + 'old:virtual_from_version:44082' => 1070, + 'old:virtual_from_version:38434' => 1114, + 'old:virtual_from_version:46551' => 1172, + 'old:virtual_from_version:40688' => 1076, + 'old:virtual_from_version:45789' => 1070, + 'old:virtual_from_version:46773' => 1077, + 'old:virtual_from_version:43023' => 2048, + 'old:virtual_from_version:44375' => 1019, + 'old:virtual_from_version:46176' => 1537, + 'old:virtual_from_version:45391' => 1051, + 'old:virtual_from_version:42481' => 1037, + 'old:virtual_from_version:47405' => 1070, + 'old:virtual_from_version:50289' => 3222, + 'old:virtual_from_version:45854' => 1517, + 'old:virtual_from_version:45640' => 1136, + 'old:virtual_from_version:49470' => 1136, + 'old:virtual_from_version:44224' => 1037, + 'old:virtual_from_version:44973' => 1030, + 'old:virtual_from_version:50755' => 1070, + 'old:virtual_from_version:44242' => 1037, + 'old:virtual_from_version:46196' => 1070, + 'old:virtual_from_version:44941' => 1005, + 'old:virtual_from_version:47075' => 3008, + 'old:virtual_from_version:45218' => 1573, + 'old:virtual_from_version:50116' => 3191, + 'old:virtual_from_version:46170' => 1077, + 'old:virtual_from_version:47692' => 1025, + 'old:virtual_from_version:46450' => 1048, + 'old:virtual_from_version:50444' => 3245, + 'old:virtual_from_version:40722' => 1009, + 'old:virtual_from_version:50518' => 1311, + 'old:virtual_from_version:49472' => 1009, + 'old:virtual_from_version:49142' => 1077, + 'old:virtual_from_version:46337' => 1070, + 'old:virtual_from_version:44426' => 1065, + 'old:virtual_from_version:49139' => 1077, + 'old:virtual_from_version:45784' => 1029, + 'old:virtual_from_version:50662' => 1407, + 'old:virtual_from_version:45873' => 1009, + 'old:virtual_from_version:49572' => 1158, + 'old:virtual_from_version:47869' => 1141, + 'old:virtual_from_version:50357' => 1125, + 'old:virtual_from_version:49172' => 1172, + 'old:virtual_from_version:47644' => 1584, + 'old:virtual_from_version:50108' => 1158, + 'old:virtual_from_version:42436' => 1025, + 'old:virtual_from_version:46267' => 1077, + 'old:virtual_from_version:31197' => 1037, + 'old:virtual_from_version:46587' => 1006, + 'old:virtual_from_version:49712' => 1107, + 'old:virtual_from_version:42387' => 1172, + 'old:virtual_from_version:42596' => 1067, + 'old:virtual_from_version:45828' => 1125, + 'old:virtual_from_version:44111' => 1037, + 'old:virtual_from_version:40492' => 1037, + 'old:virtual_from_version:42534' => 1109, + 'old:virtual_from_version:42875' => 1146, + 'old:virtual_from_version:47319' => 1659, + 'old:virtual_from_version:42166' => 1009, + 'old:virtual_from_version:43091' => 2070, + 'old:virtual_from_version:50031' => 1007, + 'old:virtual_from_version:44134' => 1107, + 'old:virtual_from_version:46824' => 1070, + 'old:virtual_from_version:40761' => 1077, + 'old:virtual_from_version:46269' => 1574, + 'old:virtual_from_version:46919' => 1009, + 'old:virtual_from_version:46844' => 1172, + 'old:virtual_from_version:49180' => 1584, + 'old:virtual_from_version:49288' => 3151, + 'old:virtual_from_version:47396' => 1037, + 'old:virtual_from_version:46997' => 1626, + 'old:virtual_from_version:42641' => 1025, + 'old:virtual_from_version:45217' => 1572, + 'old:virtual_from_version:47722' => 1077, + 'old:virtual_from_version:50368' => 1689, + 'old:virtual_from_version:50486' => 3234, + 'old:virtual_from_version:40575' => 1109, + 'old:virtual_from_version:46847' => 1125, + 'old:virtual_from_version:47586' => 1125, + 'old:virtual_from_version:42182' => 1125, + 'old:virtual_from_version:46981' => 1077, + 'old:virtual_from_version:42355' => 1051, + 'old:virtual_from_version:49893' => 3131, + 'old:virtual_from_version:49341' => 1070, + 'old:virtual_from_version:42903' => 1077, + 'old:virtual_from_version:42991' => 1037, + 'old:virtual_from_version:45573' => 1172, + 'old:virtual_from_version:50591' => 1070, + 'old:virtual_from_version:42977' => 1109, + 'old:virtual_from_version:42817' => 1037, + 'old:virtual_from_version:42158' => 1070, + 'old:virtual_from_version:45450' => 1009, + 'old:virtual_from_version:44643' => 1070, + 'old:virtual_from_version:50429' => 1076, + 'old:virtual_from_version:38535' => 1070, + 'old:virtual_from_version:47888' => 1070, + 'old:virtual_from_version:38885' => 1136, + 'old:virtual_from_version:50195' => 1070, + 'old:virtual_from_version:46185' => 1070, + 'old:virtual_from_version:45872' => 1067, + 'old:virtual_from_version:46026' => 1077, + 'old:virtual_from_version:50635' => 3269, + 'old:virtual_from_version:49824' => 3120, + 'old:virtual_from_version:42329' => 1051, + 'old:virtual_from_version:47081' => 1585, + 'old:virtual_from_version:45705' => 1077, + 'old:virtual_from_version:47456' => 1321, + 'old:virtual_from_version:38841' => 1094, + 'old:virtual_from_version:49917' => 3131, + 'old:virtual_from_version:46427' => 1537, + 'old:virtual_from_version:50603' => 1587, + 'old:virtual_from_version:47438' => 1381, + 'old:virtual_from_version:50511' => 3247, + 'old:virtual_from_version:40286' => 1172, + 'old:virtual_from_version:42670' => 1037, + 'old:virtual_from_version:42074' => 1110, + 'old:virtual_from_version:38442' => 1404, + 'old:virtual_from_version:44452' => 1527, + 'old:virtual_from_version:40566' => 1070, + 'old:virtual_from_version:49773' => 3197, + 'old:virtual_from_version:50546' => 3201, + 'old:virtual_from_version:45043' => 1027, + 'old:virtual_from_version:42709' => 1009, + 'old:virtual_from_version:39312' => 1070, + 'old:virtual_from_version:46924' => 1077, + 'old:virtual_from_version:42766' => 1107, + 'old:virtual_from_version:50731' => 1070, + 'old:virtual_from_version:46669' => 1077, + 'old:virtual_from_version:45231' => 1576, + 'old:virtual_from_version:35686' => 1101, + 'old:virtual_from_version:44592' => 1107, + 'old:virtual_from_version:47811' => 3094, + 'old:virtual_from_version:46112' => 1077, + 'old:virtual_from_version:49312' => 1150, + 'old:virtual_from_version:49645' => 3183, + 'old:virtual_from_version:44887' => 1009, + 'old:virtual_from_version:49501' => 1125, + 'old:virtual_from_version:49466' => 1009, + 'old:virtual_from_version:42671' => 1488, + 'old:virtual_from_version:50717' => 1105, + 'old:virtual_from_version:40883' => 1067, + 'old:virtual_from_version:13410' => 1065, + 'old:virtual_from_version:50401' => 3227, + 'old:virtual_from_version:49753' => 3194, + 'old:virtual_from_version:46564' => 1077, + 'old:virtual_from_version:39371' => 1144, + 'old:virtual_from_version:49173' => 1077, + 'old:virtual_from_version:46433' => 1025, + 'old:virtual_from_version:44250' => 1025, + 'old:virtual_from_version:50131' => 1172, + 'old:virtual_from_version:46236' => 1574, + 'old:virtual_from_version:44433' => 1070, + 'old:virtual_from_version:44368' => 1010, + 'old:virtual_from_version:47562' => 1077, + 'old:virtual_from_version:46114' => 1461, + 'old:virtual_from_version:44092' => 1067, + 'old:virtual_from_version:42895' => 1109, + 'old:virtual_from_version:46221' => 1070, + 'old:virtual_from_version:49179' => 1583, + 'old:virtual_from_version:44563' => 1077, + 'old:virtual_from_version:49404' => 1105, + 'old:virtual_from_version:42837' => 1497, + 'old:virtual_from_version:46831' => 1110, + 'old:virtual_from_version:40703' => 1070, + 'old:virtual_from_version:50701' => 3272, + 'old:virtual_from_version:50575' => 1125, + 'old:virtual_from_version:44638' => 1009, + 'old:virtual_from_version:50665' => 1555, + 'old:virtual_from_version:42976' => 1037, + 'old:virtual_from_version:49436' => 1580, + 'old:virtual_from_version:42034' => 1112, + 'old:virtual_from_version:44046' => 1009, + 'old:virtual_from_version:47611' => 1070, + 'old:virtual_from_version:49622' => 1532, + 'old:virtual_from_version:50365' => 3240, + 'old:virtual_from_version:44419' => 1077, + 'old:virtual_from_version:47150' => 3028, + 'old:virtual_from_version:50670' => 3208, + 'old:virtual_from_version:49323' => 3136, + 'old:virtual_from_version:45612' => 1172, + 'old:virtual_from_version:46843' => 1067, + 'old:virtual_from_version:47661' => 1109, + 'old:virtual_from_version:44091' => 1109, + 'old:virtual_from_version:44947' => 1094, + 'old:virtual_from_version:50541' => 1580, + 'old:virtual_from_version:46914' => 3007, + 'old:virtual_from_version:50530' => 1125, + 'old:virtual_from_version:40886' => 1070, + 'old:virtual_from_version:50322' => 1311, + 'old:virtual_from_version:42457' => 1035, + 'old:virtual_from_version:42220' => 1077, + 'old:virtual_from_version:44096' => 1077, + 'old:virtual_from_version:46524' => 1107, + 'old:virtual_from_version:50006' => 3131, + 'old:virtual_from_version:45883' => 1009, + 'old:virtual_from_version:42362' => 1070, + 'old:virtual_from_version:42892' => 1025, + 'old:virtual_from_version:42472' => 1048, + 'old:virtual_from_version:45393' => 1404, + 'old:virtual_from_version:43054' => 2056, + 'old:virtual_from_version:49850' => 1172, + 'old:virtual_from_version:44191' => 1037, + 'old:virtual_from_version:42764' => 1494, + 'old:virtual_from_version:47029' => 3008, + 'old:virtual_from_version:46367' => 1444, + 'old:virtual_from_version:42295' => 1427, + 'old:virtual_from_version:46562' => 1125, + 'old:virtual_from_version:46530' => 1091, + 'old:virtual_from_version:50507' => 3261, + 'old:virtual_from_version:45441' => 1062, + 'old:virtual_from_version:44318' => 1520, + 'old:virtual_from_version:46195' => 1630, + 'old:virtual_from_version:50604' => 1689, + 'old:virtual_from_version:44358' => 1125, + 'old:virtual_from_version:47306' => 3042, + 'old:virtual_from_version:44494' => 1070, + 'old:virtual_from_version:45544' => 1076, + 'old:virtual_from_version:45718' => 1007, + 'old:virtual_from_version:47455' => 3043, + 'old:virtual_from_version:49635' => 3139, + 'old:virtual_from_version:40711' => 1025, + 'old:virtual_from_version:45463' => 1404, + 'old:virtual_from_version:45903' => 1632, + 'old:virtual_from_version:50118' => 1070, + 'old:virtual_from_version:45700' => 1019, + 'old:virtual_from_version:43062' => 2063, + 'old:virtual_from_version:46279' => 1077, + 'old:virtual_from_version:49274' => 1077, + 'old:virtual_from_version:40791' => 1370, + 'old:virtual_from_version:49787' => 3194, + 'old:virtual_from_version:40861' => 1070, + 'old:virtual_from_version:42439' => 1037, + 'old:virtual_from_version:50129' => 3224, + 'old:virtual_from_version:47592' => 1077, + 'old:virtual_from_version:42974' => 1025, + 'old:virtual_from_version:46160' => 1659, + 'old:virtual_from_version:50073' => 3221, + 'old:virtual_from_version:49050' => 1689, + 'old:virtual_from_version:42651' => 1487, + 'old:virtual_from_version:46525' => 1048, + 'old:virtual_from_version:44502' => 1009, + 'old:virtual_from_version:42798' => 1110, + 'old:virtual_from_version:47126' => 1444, + 'old:virtual_from_version:45006' => 1077, + 'old:virtual_from_version:40287' => 1107, + 'old:virtual_from_version:39235' => 1061, + 'old:virtual_from_version:44894' => 1125, + 'old:virtual_from_version:42297' => 1429, + 'old:virtual_from_version:10003' => 2002, + 'old:virtual_from_version:49201' => 1070, + 'old:virtual_from_version:47092' => 1125, + 'old:virtual_from_version:49574' => 1158, + 'old:virtual_from_version:46109' => 1077, + 'old:virtual_from_version:47127' => 1585, + 'old:virtual_from_version:42384' => 1077, + 'old:virtual_from_version:43050' => 2020, + 'old:virtual_from_version:45881' => 1630, + 'old:virtual_from_version:40642' => 1393, + 'old:virtual_from_version:47241' => 1109, + 'old:virtual_from_version:46072' => 1077, + 'old:virtual_from_version:45037' => 1115, + 'old:virtual_from_version:39709' => 1110, + 'old:virtual_from_version:44463' => 1048, + 'old:virtual_from_version:42455' => 1114, + 'old:virtual_from_version:45134' => 1009, + 'old:virtual_from_version:38631' => 1126, + 'old:virtual_from_version:47464' => 3008, + 'old:virtual_from_version:47909' => 3006, + 'old:virtual_from_version:50146' => 3058, + 'old:virtual_from_version:47104' => 1077, + 'old:virtual_from_version:50655' => 1555, + 'old:virtual_from_version:49717' => 1006, + 'old:virtual_from_version:49206' => 1136, + 'old:virtual_from_version:50724' => 1666, + 'old:virtual_from_version:45551' => 1077, + 'old:virtual_from_version:49735' => 3194, + 'old:virtual_from_version:47177' => 1638, + 'old:virtual_from_version:46910' => 1077, + 'old:virtual_from_version:44314' => 1062, + 'old:virtual_from_version:46025' => 1067, + 'old:virtual_from_version:46745' => 1070, + 'old:virtual_from_version:50215' => 3131, + 'old:virtual_from_version:46103' => 1077, + 'old:virtual_from_version:42463' => 1009, + 'old:virtual_from_version:42053' => 1110, + 'old:virtual_from_version:46770' => 1070, + 'old:virtual_from_version:39952' => 1107, + 'old:virtual_from_version:49726' => 1404, + 'old:virtual_from_version:42204' => 1070, + 'old:virtual_from_version:49883' => 1444, + 'old:virtual_from_version:50305' => 1067, + 'old:virtual_from_version:47892' => 1699, + 'old:virtual_from_version:45631' => 1136, + 'old:virtual_from_version:50547' => 3227, + 'old:virtual_from_version:42496' => 1067, + 'old:virtual_from_version:49299' => 3008, + 'old:virtual_from_version:42279' => 1037, + 'old:virtual_from_version:47842' => 3094, + 'old:virtual_from_version:40568' => 1077, + 'old:virtual_from_version:49289' => 3146, + 'old:virtual_from_version:47896' => 1125, + 'old:virtual_from_version:50550' => 3259, + 'old:virtual_from_version:50460' => 1580, + 'old:virtual_from_version:44487' => 1007, + 'old:virtual_from_version:45087' => 1565, + 'old:virtual_from_version:42394' => 1067, + 'old:virtual_from_version:50019' => 3131, + 'old:virtual_from_version:44702' => 1037, + 'old:virtual_from_version:49536' => 1105, + 'old:virtual_from_version:45514' => 1077, + 'old:virtual_from_version:44437' => 1109, + 'old:virtual_from_version:38857' => 1404, + 'old:virtual_from_version:42923' => 1077, + 'old:virtual_from_version:40989' => 1037, + 'old:virtual_from_version:42161' => 1057, + 'old:virtual_from_version:47539' => 1077, + 'old:virtual_from_version:49654' => 1489, + 'old:virtual_from_version:47596' => 1125, + 'old:virtual_from_version:46931' => 1105, + 'old:virtual_from_version:39706' => 1077, + 'old:virtual_from_version:39537' => 1172, + 'old:virtual_from_version:46425' => 1112, + 'old:virtual_from_version:49981' => 1314, + 'old:virtual_from_version:46697' => 1077, + 'old:virtual_from_version:45834' => 1621, + 'old:virtual_from_version:39274' => 1107, + 'old:virtual_from_version:49642' => 1069, + 'old:virtual_from_version:44689' => 1025, + 'old:virtual_from_version:47382' => 1125, + 'old:virtual_from_version:46095' => 1136, + 'old:virtual_from_version:46216' => 1077, + 'old:virtual_from_version:47039' => 1070, + 'old:virtual_from_version:46677' => 1070, + 'old:virtual_from_version:42834' => 1418, + 'old:virtual_from_version:49618' => 3184, + 'old:virtual_from_version:49806' => 3131, + 'old:virtual_from_version:40514' => 1048, + 'old:virtual_from_version:47059' => 1065, + 'old:virtual_from_version:45086' => 1077, + 'old:virtual_from_version:45885' => 1070, + 'old:virtual_from_version:46848' => 1067, + 'old:virtual_from_version:49122' => 1105, + 'old:virtual_from_version:46819' => 1077, + 'old:virtual_from_version:29531' => 1083, + 'old:virtual_from_version:45380' => 1009, + 'old:virtual_from_version:40737' => 1081, + 'old:virtual_from_version:47276' => 1689, + 'old:virtual_from_version:45931' => 1070, + 'old:virtual_from_version:44559' => 1037, + 'old:virtual_from_version:45796' => 1027, + 'old:virtual_from_version:43018' => 2043, + 'old:virtual_from_version:42868' => 1067, + 'old:virtual_from_version:42283' => 1425, + 'old:virtual_from_version:46256' => 1077, + 'old:virtual_from_version:44073' => 1107, + 'old:virtual_from_version:44860' => 1553, + 'old:virtual_from_version:47489' => 1077, + 'old:virtual_from_version:44042' => 1037, + 'old:virtual_from_version:47957' => 1689, + 'old:virtual_from_version:46803' => 1070, + 'old:virtual_from_version:38996' => 1078, + 'old:virtual_from_version:47054' => 1015, + 'old:virtual_from_version:50055' => 1006, + 'old:virtual_from_version:42210' => 1077, + 'old:virtual_from_version:42784' => 1037, + 'old:virtual_from_version:42898' => 1077, + 'old:virtual_from_version:47537' => 1109, + 'old:virtual_from_version:45577' => 1404, + 'old:virtual_from_version:44098' => 1067, + 'old:virtual_from_version:47616' => 1537, + 'old:virtual_from_version:42866' => 1037, + 'old:virtual_from_version:42245' => 1077, + 'old:virtual_from_version:42772' => 1077, + 'old:virtual_from_version:44716' => 1076, + 'old:virtual_from_version:44745' => 1006, + 'old:virtual_from_version:44540' => 1009, + 'old:virtual_from_version:46932' => 1077, + 'old:virtual_from_version:43047' => 2003, + 'old:virtual_from_version:47806' => 1105, + 'old:virtual_from_version:47014' => 1070, + 'old:virtual_from_version:50007' => 3215, + 'old:virtual_from_version:46501' => 1537, + 'old:virtual_from_version:47225' => 1689, + 'old:virtual_from_version:49895' => 1069, + 'old:virtual_from_version:42377' => 1037, + 'old:virtual_from_version:47236' => 1109, + 'old:virtual_from_version:45090' => 1517, + 'old:virtual_from_version:46627' => 1077, + 'old:virtual_from_version:49615' => 1404, + 'old:virtual_from_version:46148' => 1070, + 'old:virtual_from_version:44567' => 1009, + 'old:virtual_from_version:44203' => 1067, + 'old:virtual_from_version:44273' => 1077, + 'old:virtual_from_version:42978' => 1067, + 'old:virtual_from_version:47510' => 1077, + 'old:virtual_from_version:45029' => 1010, + 'old:virtual_from_version:44627' => 1077, + 'old:virtual_from_version:44083' => 1009, + 'old:virtual_from_version:45547' => 1070, + 'old:virtual_from_version:45103' => 1077, + 'old:virtual_from_version:44548' => 1037, + 'old:virtual_from_version:47214' => 1172, + 'old:virtual_from_version:42155' => 1077, + 'old:virtual_from_version:40488' => 1037, + 'old:virtual_from_version:46464' => 1362, + 'old:virtual_from_version:38949' => 1070, + 'old:virtual_from_version:49816' => 1057, + 'old:virtual_from_version:46717' => 1697, + 'old:virtual_from_version:46238' => 1659, + 'old:virtual_from_version:47545' => 1070, + 'old:virtual_from_version:47114' => 3020, + 'old:virtual_from_version:45591' => 1136, + 'old:virtual_from_version:40525' => 1077, + 'old:virtual_from_version:42025' => 1109, + 'old:virtual_from_version:50010' => 1012, + 'old:virtual_from_version:42771' => 1025, + 'old:virtual_from_version:42807' => 1025, + 'old:virtual_from_version:40794' => 1069, + 'old:virtual_from_version:46423' => 1070, + 'old:virtual_from_version:38417' => 1077, + 'old:virtual_from_version:42183' => 1077, + 'old:virtual_from_version:39575' => 1110, + 'old:virtual_from_version:45923' => 1048, + 'old:virtual_from_version:50459' => 1532, + 'old:virtual_from_version:50056' => 3131, + 'old:virtual_from_version:49906' => 3078, + 'old:virtual_from_version:50001' => 1689, + 'old:virtual_from_version:39148' => 1077, + 'old:virtual_from_version:49459' => 1062, + 'old:virtual_from_version:44809' => 1070, + 'old:virtual_from_version:42792' => 1070, + 'old:virtual_from_version:45656' => 1076, + 'old:virtual_from_version:49926' => 3209, + 'old:virtual_from_version:46310' => 1025, + 'old:virtual_from_version:42879' => 1009, + 'old:virtual_from_version:42840' => 1009, + 'old:virtual_from_version:44722' => 1067, + 'old:virtual_from_version:50420' => 1037, + 'old:virtual_from_version:47403' => 1697, + 'old:virtual_from_version:46789' => 1125, + 'old:virtual_from_version:50042' => 1009, + 'old:virtual_from_version:40945' => 1009, + 'old:virtual_from_version:42462' => 1007, + 'old:virtual_from_version:50372' => 3008, + 'old:virtual_from_version:46198' => 1404, + 'old:virtual_from_version:46384' => 1402, + 'old:virtual_from_version:42995' => 1070, + 'old:virtual_from_version:47067' => 1070, + 'old:virtual_from_version:47132' => 1125, + 'old:virtual_from_version:40483' => 1369, + 'old:virtual_from_version:40844' => 1410, + 'old:virtual_from_version:40823' => 1067, + 'old:virtual_from_version:42593' => 1077, + 'old:virtual_from_version:47703' => 1077, + 'old:virtual_from_version:49161' => 1077, + 'old:virtual_from_version:39903' => 1077, + 'old:virtual_from_version:46715' => 1077, + 'old:virtual_from_version:46639' => 1070, + 'old:virtual_from_version:45495' => 1136, + 'old:virtual_from_version:40196' => 1007, + 'old:virtual_from_version:47333' => 1077, + 'old:virtual_from_version:42905' => 1109, + 'old:virtual_from_version:44440' => 1070, + 'old:virtual_from_version:44441' => 1009, + 'old:virtual_from_version:47933' => 1077, + 'old:virtual_from_version:42779' => 1077, + 'old:virtual_from_version:49938' => 1125, + 'old:virtual_from_version:46840' => 1025, + 'old:virtual_from_version:44741' => 1070, + 'old:virtual_from_version:44784' => 1025, + 'old:virtual_from_version:14391' => 1068, + 'old:virtual_from_version:42067' => 1025, + 'old:virtual_from_version:47363' => 1025, + 'old:virtual_from_version:45636' => 1172, + 'old:virtual_from_version:49166' => 1125, + 'old:virtual_from_version:45323' => 1110, + 'old:virtual_from_version:47829' => 1037, + 'old:virtual_from_version:46754' => 1070, + 'old:virtual_from_version:47776' => 1070, + 'old:virtual_from_version:45782' => 1587, + 'old:virtual_from_version:50178' => 1172, + 'old:virtual_from_version:44309' => 1009, + 'old:virtual_from_version:39885' => 1136, + 'old:virtual_from_version:50272' => 3131, + 'old:virtual_from_version:42356' => 1070, + 'old:virtual_from_version:45617' => 1172, + 'old:virtual_from_version:44568' => 1517, + 'old:virtual_from_version:46212' => 1070, + 'old:virtual_from_version:46289' => 1107, + 'old:virtual_from_version:40862' => 1077, + 'old:virtual_from_version:47506' => 1070, + 'old:virtual_from_version:46462' => 1125, + 'old:virtual_from_version:45084' => 1070, + 'old:virtual_from_version:39476' => 1081, + 'old:virtual_from_version:46352' => 1190, + 'old:virtual_from_version:50268' => 1488, + 'old:virtual_from_version:47242' => 1077, + 'old:virtual_from_version:45442' => 1150, + 'old:virtual_from_version:44724' => 1539, + 'old:virtual_from_version:47281' => 1172, + 'old:virtual_from_version:40594' => 1070, + 'old:virtual_from_version:46941' => 1125, + 'old:virtual_from_version:46411' => 1070, + 'old:virtual_from_version:46086' => 1017, + 'old:virtual_from_version:44647' => 1077, + 'old:virtual_from_version:50307' => 3131, + 'old:virtual_from_version:44787' => 1057, + 'old:virtual_from_version:42208' => 1070, + 'old:virtual_from_version:13404' => 1047, + 'old:virtual_from_version:50026' => 1125, + 'old:virtual_from_version:44856' => 1070, + 'old:virtual_from_version:44171' => 1070, + 'old:virtual_from_version:49974' => 3120, + 'old:virtual_from_version:44124' => 1107, + 'old:virtual_from_version:50738' => 1689, + 'old:virtual_from_version:42870' => 1025, + 'old:virtual_from_version:46446' => 1537, + 'old:virtual_from_version:40478' => 1070, + 'old:virtual_from_version:42413' => 1037, + 'old:virtual_from_version:50680' => 1583, + 'old:virtual_from_version:49439' => 1070, + 'old:virtual_from_version:50467' => 3009, + 'old:virtual_from_version:44337' => 1081, + 'old:virtual_from_version:42853' => 1504, + 'old:virtual_from_version:49291' => 1649, + 'old:virtual_from_version:45812' => 1574, + 'old:virtual_from_version:45565' => 1404, + 'old:virtual_from_version:46515' => 1070, + 'old:virtual_from_version:49499' => 3078, + 'old:virtual_from_version:46085' => 1070, + 'old:virtual_from_version:42196' => 1070, + 'old:virtual_from_version:45534' => 1489, + 'old:virtual_from_version:44029' => 1070, + 'old:virtual_from_version:44087' => 1009, + 'old:virtual_from_version:45034' => 1064, + 'old:virtual_from_version:50048' => 1444, + 'old:virtual_from_version:46992' => 1025, + 'old:virtual_from_version:45042' => 1025, + 'old:virtual_from_version:47243' => 1070, + 'old:virtual_from_version:49453' => 1444, + 'old:virtual_from_version:40536' => 1070, + 'old:virtual_from_version:45045' => 1077, + 'old:virtual_from_version:45395' => 1112, + 'old:virtual_from_version:42367' => 1413, + 'old:virtual_from_version:46424' => 1125, + 'old:virtual_from_version:40966' => 1048, + 'old:virtual_from_version:42777' => 1070, + 'old:virtual_from_version:49380' => 1077, + 'old:virtual_from_version:46476' => 1009, + 'old:virtual_from_version:46636' => 1067, + 'old:virtual_from_version:38617' => 1123, + 'old:virtual_from_version:44744' => 1070, + 'old:virtual_from_version:40749' => 1077, + 'old:virtual_from_version:47630' => 1109, + 'old:virtual_from_version:40738' => 1048, + 'old:virtual_from_version:47169' => 3031, + 'old:virtual_from_version:46549' => 1125, + 'old:virtual_from_version:45594' => 1009, + 'old:virtual_from_version:40969' => 1009, + 'old:virtual_from_version:49099' => 3136, + 'old:virtual_from_version:38342' => 1006, + 'old:virtual_from_version:44857' => 1077, + 'old:virtual_from_version:49693' => 1078, + 'old:virtual_from_version:44581' => 1009, + 'old:virtual_from_version:44905' => 1555, + 'old:virtual_from_version:44574' => 1070, + 'old:virtual_from_version:39605' => 1067, + 'old:virtual_from_version:44590' => 1037, + 'old:virtual_from_version:45317' => 1125, + 'old:virtual_from_version:50686' => 3259, + 'old:virtual_from_version:49236' => 1070, + 'old:virtual_from_version:42732' => 1037, + 'old:virtual_from_version:44370' => 1012, + 'old:virtual_from_version:42831' => 1077, + 'old:virtual_from_version:49220' => 1314, + 'old:virtual_from_version:47988' => 1009, + 'old:virtual_from_version:50061' => 1019, + 'old:virtual_from_version:42712' => 1311, + 'old:virtual_from_version:50279' => 3131, + 'old:virtual_from_version:46838' => 1172, + 'old:virtual_from_version:49626' => 1158, + 'old:virtual_from_version:44535' => 1077, + 'old:virtual_from_version:47951' => 3124, + 'old:virtual_from_version:40394' => 1136, + 'old:virtual_from_version:40294' => 1321, + 'old:virtual_from_version:45505' => 1580, + 'old:virtual_from_version:45953' => 1108, + 'old:virtual_from_version:50253' => 1489, + 'old:virtual_from_version:40691' => 1009, + 'old:virtual_from_version:50587' => 1417, + 'old:virtual_from_version:45007' => 1031, + 'old:virtual_from_version:50269' => 1078, + 'old:virtual_from_version:47293' => 1105, + 'old:virtual_from_version:40292' => 1048, + 'old:virtual_from_version:45460' => 1067, + 'old:virtual_from_version:42020' => 1037, + 'old:virtual_from_version:49903' => 1404, + 'old:virtual_from_version:46390' => 1172, + 'old:virtual_from_version:46277' => 1070, + 'old:virtual_from_version:46181' => 1537, + 'old:virtual_from_version:49117' => 1037, + 'old:virtual_from_version:42698' => 1037, + 'old:virtual_from_version:42228' => 1419, + 'old:virtual_from_version:44539' => 1070, + 'old:virtual_from_version:50421' => 1314, + 'old:virtual_from_version:42416' => 1070, + 'old:virtual_from_version:46252' => 1665, + 'old:virtual_from_version:40830' => 1077, + 'old:virtual_from_version:46316' => 1613, + 'old:virtual_from_version:46033' => 1410, + 'old:virtual_from_version:49241' => 1532, + 'old:virtual_from_version:45827' => 1362, + 'old:virtual_from_version:47257' => 1517, + 'old:virtual_from_version:46913' => 3007, + 'old:virtual_from_version:47080' => 1584, + 'old:virtual_from_version:47270' => 1037, + 'old:virtual_from_version:50167' => 1413, + 'old:virtual_from_version:44189' => 1025, + 'old:virtual_from_version:44899' => 1123, + 'old:virtual_from_version:42804' => 1070, + 'old:virtual_from_version:44917' => 1070, + 'old:virtual_from_version:46281' => 1077, + 'old:virtual_from_version:49348' => 3139, + 'old:virtual_from_version:44799' => 1321, + 'old:virtual_from_version:45305' => 1125, + 'old:virtual_from_version:44661' => 1077, + 'old:virtual_from_version:50754' => 3186, + 'old:virtual_from_version:44434' => 1009, + 'old:virtual_from_version:50104' => 1222, + 'old:virtual_from_version:49544' => 1404, + 'old:virtual_from_version:47037' => 1689, + 'old:virtual_from_version:50657' => 1009, + 'old:virtual_from_version:45859' => 1077, + 'old:virtual_from_version:49766' => 1077, + 'old:virtual_from_version:49147' => 1532, + 'old:virtual_from_version:40746' => 1070, + 'old:virtual_from_version:47217' => 1689, + 'old:virtual_from_version:50539' => 1404, + 'old:virtual_from_version:49751' => 1006, + 'old:virtual_from_version:42588' => 1062, + 'old:virtual_from_version:49984' => 1070, + 'old:virtual_from_version:47034' => 1555, + 'old:virtual_from_version:40895' => 1110, + 'old:virtual_from_version:46584' => 1689, + 'old:virtual_from_version:48027' => 2025, + 'old:virtual_from_version:33505' => 1081, + 'old:virtual_from_version:40922' => 1037, + 'old:virtual_from_version:47917' => 1109, + 'old:virtual_from_version:41007' => 2018, + 'old:virtual_from_version:40253' => 1110, + 'old:virtual_from_version:38358' => 1040, + 'old:virtual_from_version:45258' => 1081, + 'old:virtual_from_version:47985' => 1125, + 'old:virtual_from_version:44552' => 1107, + 'old:virtual_from_version:45053' => 1110, + 'old:virtual_from_version:40804' => 1025, + 'old:virtual_from_version:44765' => 1015, + 'old:virtual_from_version:49072' => 1083, + 'old:virtual_from_version:44891' => 1070, + 'old:virtual_from_version:48014' => 2114, + 'old:virtual_from_version:13342' => 1064, + 'old:virtual_from_version:47890' => 1109, + 'old:virtual_from_version:46206' => 1633, + 'old:virtual_from_version:46655' => 1007, + 'old:virtual_from_version:49467' => 1689, + 'old:virtual_from_version:38436' => 1006, + 'old:virtual_from_version:45548' => 1109, + 'old:virtual_from_version:42867' => 1109, + 'old:virtual_from_version:40179' => 1015, + 'old:virtual_from_version:47245' => 1037, + 'old:virtual_from_version:50306' => 1404, + 'old:virtual_from_version:47264' => 1689, + 'old:virtual_from_version:46556' => 1125, + 'old:virtual_from_version:40238' => 1144, + 'old:virtual_from_version:47262' => 1009, + 'old:virtual_from_version:47302' => 1580, + 'old:virtual_from_version:47320' => 1070, + 'old:virtual_from_version:46098' => 1649, + 'old:virtual_from_version:47552' => 1105, + 'old:virtual_from_version:47078' => 1077, + 'old:virtual_from_version:46594' => 1172, + 'old:virtual_from_version:38800' => 1110, + 'old:virtual_from_version:39510' => 1070, + 'old:virtual_from_version:47206' => 1109, + 'old:virtual_from_version:44207' => 1107, + 'old:virtual_from_version:44323' => 1070, + 'old:virtual_from_version:42688' => 1077, + 'old:virtual_from_version:49755' => 1070, + 'old:virtual_from_version:46930' => 1051, + 'old:virtual_from_version:42603' => 1105, + 'old:virtual_from_version:45735' => 1077, + 'old:virtual_from_version:46081' => 1415, + 'old:virtual_from_version:46001' => 1649, + 'old:virtual_from_version:47151' => 1007, + 'old:virtual_from_version:45266' => 1027, + 'old:virtual_from_version:47674' => 1109, + 'old:virtual_from_version:40563' => 1077, + 'old:virtual_from_version:46179' => 1077, + 'old:virtual_from_version:45318' => 1009, + 'old:virtual_from_version:44547' => 1077, + 'old:virtual_from_version:46410' => 1676, + 'old:virtual_from_version:44352' => 1037, + 'old:virtual_from_version:40739' => 1084, + 'old:virtual_from_version:40531' => 1077, + 'old:virtual_from_version:46978' => 1037, + 'old:virtual_from_version:46347' => 1555, + 'old:virtual_from_version:50523' => 1016, + 'old:virtual_from_version:42946' => 1037, + 'old:virtual_from_version:45137' => 1057, + 'old:virtual_from_version:47634' => 1585, + 'old:virtual_from_version:49687' => 1009, + 'old:virtual_from_version:50071' => 3131, + 'old:virtual_from_version:40473' => 1037, + 'old:virtual_from_version:47348' => 1109, + 'old:virtual_from_version:49834' => 3120, + 'old:virtual_from_version:44005' => 1500, + 'old:virtual_from_version:42041' => 1172, + 'old:virtual_from_version:46645' => 1537, + 'old:virtual_from_version:49235' => 1689, + 'old:virtual_from_version:49114' => 1070, + 'old:virtual_from_version:42872' => 1037, + 'old:virtual_from_version:49435' => 1555, + 'old:virtual_from_version:46865' => 3004, + 'old:virtual_from_version:42277' => 1069, + 'old:virtual_from_version:46595' => 1077, + 'old:virtual_from_version:45096' => 1517, + 'old:virtual_from_version:49227' => 1077, + 'old:virtual_from_version:42065' => 1048, + 'old:virtual_from_version:49690' => 1489, + 'old:virtual_from_version:39531' => 1069, + 'old:virtual_from_version:49149' => 1007, + 'old:virtual_from_version:49779' => 1404, + 'old:virtual_from_version:46326' => 1062, + 'old:virtual_from_version:44963' => 1065, + 'old:virtual_from_version:49945' => 1025, + 'old:virtual_from_version:50032' => 1070, + 'old:virtual_from_version:46137' => 1077, + 'old:virtual_from_version:50679' => 1417, + 'old:virtual_from_version:46011' => 1109, + 'old:virtual_from_version:47446' => 1621, + 'old:virtual_from_version:44371' => 1015, + 'old:virtual_from_version:49276' => 1616, + 'old:virtual_from_version:46030' => 1062, + 'old:virtual_from_version:47885' => 1077, + 'old:virtual_from_version:47542' => 1109, + 'old:virtual_from_version:45430' => 1009, + 'old:virtual_from_version:45795' => 1109, + 'old:virtual_from_version:49119' => 1109, + 'old:virtual_from_version:40721' => 1070, + 'old:virtual_from_version:46389' => 1112, + 'old:virtual_from_version:47557' => 1070, + 'old:virtual_from_version:43015' => 2040, + 'old:virtual_from_version:45047' => 1036, + 'old:virtual_from_version:40783' => 1048, + 'old:virtual_from_version:47927' => 1659, + 'old:virtual_from_version:49332' => 1077, + 'old:virtual_from_version:46219' => 1077, + 'old:virtual_from_version:40921' => 1077, + 'old:virtual_from_version:47851' => 1583, + 'old:virtual_from_version:45916' => 1109, + 'old:virtual_from_version:40521' => 1105, + 'old:virtual_from_version:45897' => 1077, + 'old:virtual_from_version:43046' => 2000, + 'old:virtual_from_version:47597' => 1109, + 'old:virtual_from_version:45481' => 1070, + 'old:virtual_from_version:46065' => 1070, + 'old:virtual_from_version:42193' => 1070, + 'old:virtual_from_version:42594' => 1037, + 'old:virtual_from_version:40889' => 1025, + 'old:virtual_from_version:42715' => 1009, + 'old:virtual_from_version:46039' => 1410, + 'old:virtual_from_version:50255' => 3131, + 'old:virtual_from_version:49030' => 1649, + 'old:virtual_from_version:50586' => 1032, + 'old:virtual_from_version:40914' => 1077, + 'old:virtual_from_version:44163' => 1110, + 'old:virtual_from_version:46303' => 1425, + 'old:virtual_from_version:44558' => 1077, + 'old:virtual_from_version:45910' => 1404, + 'old:virtual_from_version:42625' => 1037, + 'old:virtual_from_version:47478' => 1077, + 'old:virtual_from_version:50127' => 1689, + 'old:virtual_from_version:50627' => 1407, + 'old:virtual_from_version:44039' => 1009, + 'old:virtual_from_version:46500' => 1136, + 'old:virtual_from_version:46399' => 1077, + 'old:virtual_from_version:47030' => 1070, + 'old:virtual_from_version:44359' => 1000, + 'old:virtual_from_version:47461' => 1444, + 'old:virtual_from_version:50567' => 1125, + 'old:virtual_from_version:46656' => 1070, + 'old:virtual_from_version:50231' => 1005, + 'old:virtual_from_version:45428' => 1109, + 'old:virtual_from_version:49027' => 3131, + 'old:virtual_from_version:47440' => 1070, + 'old:virtual_from_version:50393' => 3131, + 'old:virtual_from_version:38348' => 1014, + 'old:virtual_from_version:45370' => 1407, + 'old:virtual_from_version:46983' => 1584, + 'old:virtual_from_version:40806' => 1136, + 'old:virtual_from_version:50218' => 3008, + 'old:virtual_from_version:40009' => 1192, + 'old:virtual_from_version:47598' => 1077, + 'old:virtual_from_version:47479' => 1381, + 'old:virtual_from_version:50275' => 3231, + 'old:virtual_from_version:43084' => 2081, + 'old:virtual_from_version:49204' => 1077, + 'old:virtual_from_version:46449' => 1532, + 'old:virtual_from_version:44704' => 1540, + 'old:virtual_from_version:49896' => 3131, + 'old:virtual_from_version:47899' => 1077, + 'old:virtual_from_version:40897' => 1070, + 'old:virtual_from_version:46873' => 1410, + 'old:virtual_from_version:44605' => 1025, + 'old:virtual_from_version:46361' => 1070, + 'old:virtual_from_version:43049' => 2019, + 'old:virtual_from_version:45579' => 1172, + 'old:virtual_from_version:42123' => 1172, + 'old:virtual_from_version:47032' => 1172, + 'old:virtual_from_version:45951' => 1533, + 'old:virtual_from_version:44876' => 1067, + 'old:virtual_from_version:45327' => 1125, + 'old:virtual_from_version:40808' => 1007, + 'old:virtual_from_version:46406' => 1025, + 'old:virtual_from_version:47277' => 1125, + 'old:virtual_from_version:46313' => 1537, + 'old:virtual_from_version:49995' => 1404, + 'old:virtual_from_version:46519' => 1025, + 'old:virtual_from_version:42232' => 1070, + 'old:virtual_from_version:42610' => 1037, + 'old:virtual_from_version:50722' => 1084, + 'old:virtual_from_version:49046' => 1583, + 'old:virtual_from_version:46614' => 1070, + 'old:virtual_from_version:42981' => 1077, + 'old:virtual_from_version:40713' => 1048, + 'old:virtual_from_version:47536' => 1125, + 'old:virtual_from_version:40881' => 1110, + 'old:virtual_from_version:45026' => 1007, + 'old:virtual_from_version:44344' => 1081, + 'old:virtual_from_version:50703' => 1172, + 'old:virtual_from_version:42819' => 1501, + 'old:virtual_from_version:49259' => 1404, + 'old:virtual_from_version:45310' => 1580, + 'old:virtual_from_version:45152' => 1107, + 'old:virtual_from_version:44771' => 1070, + 'old:virtual_from_version:45645' => 1077, + 'old:virtual_from_version:47284' => 3009, + 'old:virtual_from_version:46191' => 1070, + 'old:virtual_from_version:50538' => 1402, + 'old:virtual_from_version:36622' => 1008, + 'old:virtual_from_version:42137' => 1007, + 'old:virtual_from_version:47991' => 1070, + 'old:virtual_from_version:44823' => 1349, + 'old:virtual_from_version:42124' => 1070, + 'old:virtual_from_version:42669' => 1077, + 'old:virtual_from_version:47683' => 1136, + 'old:virtual_from_version:49989' => 1100, + 'old:virtual_from_version:44749' => 1224, + 'old:virtual_from_version:49902' => 1070, + 'old:virtual_from_version:49821' => 1444, + 'old:virtual_from_version:49309' => 1077, + 'old:virtual_from_version:39532' => 1015, + 'old:virtual_from_version:46864' => 1076, + 'old:virtual_from_version:50040' => 3159, + 'old:virtual_from_version:49171' => 1125, + 'old:virtual_from_version:50149' => 1125, + 'old:virtual_from_version:38702' => 1062, + 'old:virtual_from_version:46307' => 1067, + 'old:virtual_from_version:45556' => 1070, + 'old:virtual_from_version:42475' => 1000, + 'old:virtual_from_version:42992' => 1110, + 'old:virtual_from_version:46688' => 1077, + 'old:virtual_from_version:45376' => 1314, + 'old:virtual_from_version:42855' => 1070, + 'old:virtual_from_version:47038' => 3008, + 'old:virtual_from_version:44642' => 1125, + 'old:virtual_from_version:42180' => 1070, + 'old:virtual_from_version:46928' => 1070, + 'old:virtual_from_version:44839' => 1488, + 'old:virtual_from_version:45081' => 1555, + 'old:virtual_from_version:45572' => 1077, + 'old:virtual_from_version:40787' => 1067, + 'old:virtual_from_version:42351' => 1125, + 'old:virtual_from_version:50176' => 3131, + 'old:virtual_from_version:40454' => 1404, + 'old:virtual_from_version:47255' => 1001, + 'old:virtual_from_version:46724' => 1517, + 'old:virtual_from_version:50278' => 1444, + 'old:virtual_from_version:45582' => 1077, + 'old:virtual_from_version:45307' => 1565, + 'old:virtual_from_version:47636' => 1488, + 'old:virtual_from_version:40931' => 1070, + 'old:virtual_from_version:44114' => 1125, + 'old:virtual_from_version:47570' => 1105, + 'old:virtual_from_version:46396' => 1070, + 'old:virtual_from_version:42692' => 1048, + 'old:virtual_from_version:49591' => 1444, + 'old:virtual_from_version:45269' => 1090, + 'old:virtual_from_version:42592' => 1009, + 'old:virtual_from_version:47508' => 1109, + 'old:virtual_from_version:40515' => 1067, + 'old:virtual_from_version:40276' => 1115, + 'old:virtual_from_version:42968' => 1037, + 'old:virtual_from_version:46833' => 1015, + 'old:virtual_from_version:40728' => 1025, + 'old:virtual_from_version:42934' => 1009, + 'old:virtual_from_version:40493' => 1404, + 'old:virtual_from_version:45000' => 1008, + 'old:virtual_from_version:45914' => 1077, + 'old:virtual_from_version:46857' => 1070, + 'old:virtual_from_version:46967' => 1134, + 'old:virtual_from_version:47928' => 1070, + 'old:virtual_from_version:50439' => 3243, + 'old:virtual_from_version:44527' => 1025, + 'old:virtual_from_version:45245' => 1049, + 'old:virtual_from_version:46275' => 1077, + 'old:virtual_from_version:49786' => 3131, + 'old:virtual_from_version:47457' => 1070, + 'old:virtual_from_version:39579' => 1086, + 'old:virtual_from_version:44235' => 1110, + 'old:virtual_from_version:40753' => 1070, + 'old:virtual_from_version:39728' => 1048, + 'old:virtual_from_version:46681' => 1125, + 'old:virtual_from_version:42576' => 1070, + 'old:virtual_from_version:49982' => 1689, + 'old:virtual_from_version:44818' => 1070, + 'old:virtual_from_version:45302' => 1414, + 'old:virtual_from_version:42290' => 1115, + 'old:virtual_from_version:42160' => 1037, + 'old:virtual_from_version:49836' => 3194, + 'old:virtual_from_version:49653' => 1314, + 'old:virtual_from_version:50468' => 3246, + 'old:virtual_from_version:40993' => 1070, + 'old:virtual_from_version:50137' => 1540, + 'old:virtual_from_version:40654' => 1083, + 'old:virtual_from_version:47120' => 1070, + 'old:virtual_from_version:42214' => 1025, + 'old:virtual_from_version:43007' => 2032, + 'old:virtual_from_version:42645' => 1109, + 'old:virtual_from_version:49070' => 1404, + 'old:virtual_from_version:50356' => 3131, + 'old:virtual_from_version:50765' => 1070, + 'old:virtual_from_version:49293' => 1051, + 'old:virtual_from_version:50519' => 1311, + 'old:virtual_from_version:50466' => 1172, + 'old:virtual_from_version:45816' => 1125, + 'old:virtual_from_version:40833' => 1070, + 'old:virtual_from_version:49492' => 1125, + 'old:virtual_from_version:45429' => 1067, + 'old:virtual_from_version:50702' => 1070, + 'old:virtual_from_version:40348' => 1095, + 'old:virtual_from_version:46301' => 1613, + 'old:virtual_from_version:50464' => 3204, + 'old:virtual_from_version:44514' => 1070, + 'old:virtual_from_version:46837' => 1070, + 'old:virtual_from_version:42865' => 1077, + 'old:virtual_from_version:42707' => 1037, + 'old:virtual_from_version:45493' => 1580, + 'old:virtual_from_version:50192' => 3028, + 'old:virtual_from_version:50653' => 1419, + 'old:virtual_from_version:46727' => 1584, + 'old:virtual_from_version:44461' => 1077, + 'old:virtual_from_version:50282' => 3131, + 'old:virtual_from_version:44259' => 1172, + 'old:virtual_from_version:45625' => 1136, + 'old:virtual_from_version:47673' => 1070, + 'old:virtual_from_version:45963' => 1461, + 'old:virtual_from_version:49019' => 1035, + 'old:virtual_from_version:45297' => 1125, + 'old:virtual_from_version:44065' => 1077, + 'old:virtual_from_version:42705' => 1070, + 'old:virtual_from_version:45046' => 1031, + 'old:virtual_from_version:46746' => 1077, + 'old:virtual_from_version:47911' => 1314, + 'old:virtual_from_version:45061' => 1051, + 'old:virtual_from_version:40097' => 1083, + 'old:virtual_from_version:46942' => 1107, + 'old:virtual_from_version:49667' => 1070, + 'old:virtual_from_version:40540' => 1067, + 'old:virtual_from_version:44664' => 1077, + 'old:virtual_from_version:44669' => 1077, + 'old:virtual_from_version:50561' => 3259, + 'old:virtual_from_version:10001' => 2000, + 'old:virtual_from_version:46101' => 1077, + 'old:virtual_from_version:40648' => 1128, + 'old:virtual_from_version:46124' => 1555, + 'old:virtual_from_version:4513 ' => 1053, + 'old:virtual_from_version:44297' => 1070, + 'old:virtual_from_version:50183' => 1069, + 'old:virtual_from_version:45335' => 1125, + 'old:virtual_from_version:47857' => 1070, + 'old:virtual_from_version:42042' => 1172, + 'old:virtual_from_version:42541' => 1070, + 'old:virtual_from_version:45984' => 1613, + 'old:virtual_from_version:44285' => 1070, + 'old:virtual_from_version:49538' => 1413, + 'old:virtual_from_version:47141' => 1583, + 'old:virtual_from_version:46222' => 1077, + 'old:virtual_from_version:49954' => 3131, + 'old:virtual_from_version:44365' => 1144, + 'old:virtual_from_version:46842' => 1070, + 'old:virtual_from_version:45835' => 1146, + 'old:virtual_from_version:42597' => 1172, + 'old:virtual_from_version:50248' => 1489, + 'old:virtual_from_version:46254' => 1070, + 'old:virtual_from_version:50123' => 3184, + 'old:virtual_from_version:49585' => 1107, + 'old:virtual_from_version:44964' => 1078, + 'old:virtual_from_version:49473' => 1580, + 'old:virtual_from_version:47881' => 1689, + 'old:virtual_from_version:40705' => 1025, + 'old:virtual_from_version:46513' => 1659, + 'old:virtual_from_version:44084' => 1515, + 'old:virtual_from_version:46617' => 1081, + 'old:virtual_from_version:42744' => 1070, + 'old:virtual_from_version:40133' => 1290, + 'old:virtual_from_version:50018' => 1006, + 'old:virtual_from_version:45108' => 1077, + 'old:virtual_from_version:42859' => 1067, + 'old:virtual_from_version:50222' => 1404, + 'old:virtual_from_version:47646' => 1689, + 'old:virtual_from_version:42921' => 1070, + 'old:virtual_from_version:45355' => 1084, + 'old:virtual_from_version:47332' => 1109, + 'old:virtual_from_version:48025' => 2126, + 'old:virtual_from_version:49768' => 3131, + 'old:virtual_from_version:44013' => 1037, + 'old:virtual_from_version:49146' => 1070, + 'old:virtual_from_version:40834' => 1077, + 'old:virtual_from_version:40726' => 1401, + 'old:virtual_from_version:46362' => 1109, + 'old:virtual_from_version:45981' => 1321, + 'old:virtual_from_version:46539' => 1568, + 'old:virtual_from_version:47878' => 1009, + 'old:virtual_from_version:45343' => 1009, + 'old:virtual_from_version:44489' => 1077, + 'old:virtual_from_version:49148' => 3150, + 'old:virtual_from_version:49940' => 1048, + 'old:virtual_from_version:47213' => 1109, + 'old:virtual_from_version:46947' => 1583, + 'old:virtual_from_version:50180' => 1489, + 'old:virtual_from_version:47854' => 1150, + 'old:virtual_from_version:43064' => 2065, + 'old:virtual_from_version:42404' => 1107, + 'old:virtual_from_version:45102' => 1070, + 'old:virtual_from_version:39295' => 1025, + 'old:virtual_from_version:50085' => 1125, + 'old:virtual_from_version:50210' => 1404, + 'old:virtual_from_version:49303' => 1413, + 'old:virtual_from_version:45668' => 1027, + 'old:virtual_from_version:44933' => 1172, + 'old:virtual_from_version:45153' => 1009, + 'old:virtual_from_version:44278' => 1009, + 'old:virtual_from_version:46870' => 1404, + 'old:virtual_from_version:44289' => 1037, + 'old:virtual_from_version:44473' => 1009, + 'old:virtual_from_version:46897' => 1076, + 'old:virtual_from_version:50139' => 1070, + 'old:virtual_from_version:42255' => 1070, + 'old:virtual_from_version:49613' => 1070, + 'old:virtual_from_version:42999' => 1136, + 'old:virtual_from_version:44479' => 1037, + 'old:virtual_from_version:49396' => 1505, + 'old:virtual_from_version:47732' => 1689, + 'old:virtual_from_version:46373' => 1583, + 'old:virtual_from_version:47411' => 1321, + 'old:virtual_from_version:49932' => 3197, + 'old:virtual_from_version:47554' => 3016, + 'old:virtual_from_version:50742' => 1070, + 'old:virtual_from_version:46886' => 1105, + 'old:virtual_from_version:45681' => 1042, + 'old:virtual_from_version:42700' => 1070, + 'old:virtual_from_version:47978' => 1125, + 'old:virtual_from_version:49640' => 1107, + 'old:virtual_from_version:42241' => 1067, + 'old:virtual_from_version:44112' => 1109, + 'old:virtual_from_version:49918' => 3206, + 'old:virtual_from_version:50410' => 1689, + 'old:virtual_from_version:50015' => 3217, + 'old:virtual_from_version:39544' => 1190, + 'old:virtual_from_version:42294' => 1110, + 'old:virtual_from_version:47816' => 3094, + 'old:virtual_from_version:44238' => 1125, + 'old:virtual_from_version:45499' => 1109, + 'old:virtual_from_version:42839' => 1070, + 'old:virtual_from_version:42848' => 1070, + 'old:virtual_from_version:44682' => 1025, + 'old:virtual_from_version:49287' => 1689, + 'old:virtual_from_version:47426' => 1070, + 'old:virtual_from_version:49770' => 1404, + 'old:virtual_from_version:50656' => 3259, + 'old:virtual_from_version:45936' => 1070, + 'old:virtual_from_version:42699' => 1067, + 'old:virtual_from_version:44588' => 1070, + 'old:virtual_from_version:46825' => 1107, + 'old:virtual_from_version:43017' => 2042, + 'old:virtual_from_version:50532' => 1067, + 'old:virtual_from_version:45329' => 1404, + 'old:virtual_from_version:46496' => 1125, + 'old:virtual_from_version:48000' => 2101, + 'old:virtual_from_version:42762' => 1037, + 'old:virtual_from_version:46802' => 1123, + 'old:virtual_from_version:40990' => 1110, + 'old:virtual_from_version:44651' => 1025, + 'old:virtual_from_version:49542' => 1105, + 'old:virtual_from_version:42127' => 1037, + 'old:virtual_from_version:42259' => 1037, + 'old:virtual_from_version:46577' => 1070, + 'old:virtual_from_version:47307' => 1616, + 'old:virtual_from_version:40759' => 1070, + 'old:virtual_from_version:47802' => 1037, + 'old:virtual_from_version:47024' => 1070, + 'old:virtual_from_version:49056' => 1070, + 'old:virtual_from_version:42309' => 1077, + 'old:virtual_from_version:42706' => 1077, + 'old:virtual_from_version:42058' => 1037, + 'old:virtual_from_version:45922' => 1070, + 'old:virtual_from_version:50223' => 1583, + 'old:virtual_from_version:44662' => 1037, + 'old:virtual_from_version:49127' => 1583, + 'old:virtual_from_version:44756' => 1109, + 'old:virtual_from_version:44701' => 1077, + 'old:virtual_from_version:44562' => 1023, + 'old:virtual_from_version:47831' => 1048, + 'old:virtual_from_version:47787' => 1109, + 'old:virtual_from_version:44610' => 1537, + 'old:virtual_from_version:45360' => 1583, + 'old:virtual_from_version:47723' => 1404, + 'old:virtual_from_version:44766' => 1077, + 'old:virtual_from_version:50521' => 1016, + 'old:virtual_from_version:38483' => 1030, + 'old:virtual_from_version:45911' => 1070, + 'old:virtual_from_version:50294' => 1321, + 'old:virtual_from_version:46988' => 1136, + 'old:virtual_from_version:49345' => 1105, + 'old:virtual_from_version:50080' => 1125, + 'old:virtual_from_version:40644' => 1032, + 'old:virtual_from_version:40853' => 1037, + 'old:virtual_from_version:40826' => 1070, + 'old:virtual_from_version:49167' => 1077, + 'old:virtual_from_version:45072' => 1067, + 'old:virtual_from_version:42131' => 1070, + 'old:virtual_from_version:50323' => 3237, + 'old:virtual_from_version:50555' => 1580, + 'old:virtual_from_version:44459' => 1070, + 'old:virtual_from_version:44412' => 1115, + 'old:virtual_from_version:40094' => 1062, + 'old:virtual_from_version:50449' => 1037, + 'old:virtual_from_version:46630' => 1070, + 'old:virtual_from_version:44094' => 1009, + 'old:virtual_from_version:38379' => 1025, + 'old:virtual_from_version:46205' => 1092, + 'old:virtual_from_version:40866' => 1070, + 'old:virtual_from_version:45039' => 1517, + 'old:virtual_from_version:42629' => 1136, + 'old:virtual_from_version:38018' => 1095, + 'old:virtual_from_version:44422' => 1037, + 'old:virtual_from_version:40820' => 1070, + 'old:virtual_from_version:49010' => 1172, + 'old:virtual_from_version:45805' => 1006, + 'old:virtual_from_version:45050' => 1042, + 'old:virtual_from_version:45868' => 1517, + 'old:virtual_from_version:44308' => 1070, + 'old:virtual_from_version:49482' => 3151, + 'old:virtual_from_version:44079' => 1172, + 'old:virtual_from_version:45588' => 1616, + 'old:virtual_from_version:47845' => 1132, + 'old:virtual_from_version:45800' => 1112, + 'old:virtual_from_version:50382' => 1070, + 'old:virtual_from_version:40572' => 1070, + 'old:virtual_from_version:44395' => 1222, + 'old:virtual_from_version:42189' => 1070, + 'old:virtual_from_version:46728' => 1585, + 'old:virtual_from_version:44120' => 1062, + 'old:virtual_from_version:48026' => 2127, + 'old:virtual_from_version:44076' => 1025, + 'old:virtual_from_version:42620' => 1077, + 'old:virtual_from_version:38961' => 1025, + 'old:virtual_from_version:38790' => 1025, + 'old:virtual_from_version:46344' => 1067, + 'old:virtual_from_version:50155' => 1125, + 'old:virtual_from_version:47077' => 1125, + 'old:virtual_from_version:40730' => 1402, + 'old:virtual_from_version:42730' => 1009, + 'old:virtual_from_version:46006' => 1070, + 'old:virtual_from_version:46203' => 1070, + 'old:virtual_from_version:45627' => 1107, + 'old:virtual_from_version:44041' => 1077, + 'old:virtual_from_version:46182' => 1537, + 'old:virtual_from_version:46585' => 1070, + 'old:virtual_from_version:42206' => 1037, + 'old:virtual_from_version:44782' => 1172, + 'old:virtual_from_version:44445' => 1025, + 'old:virtual_from_version:50287' => 1532, + 'old:virtual_from_version:42813' => 1070, + 'old:virtual_from_version:49177' => 1070, + 'old:virtual_from_version:45253' => 1023, + 'old:virtual_from_version:42631' => 1009, + 'old:virtual_from_version:46405' => 1070, + 'old:virtual_from_version:47558' => 1125, + 'old:virtual_from_version:42490' => 1070, + 'old:virtual_from_version:46233' => 1070, + 'old:virtual_from_version:47859' => 1109, + 'old:virtual_from_version:40693' => 1125, + 'old:virtual_from_version:49418' => 3029, + 'old:virtual_from_version:42888' => 1037, + 'old:virtual_from_version:46879' => 1077, + 'old:virtual_from_version:49176' => 1062, + 'old:virtual_from_version:46829' => 1397, + 'old:virtual_from_version:46756' => 1070, + 'old:virtual_from_version:39508' => 1040, + 'old:virtual_from_version:42094' => 1070, + 'old:virtual_from_version:45052' => 1109, + 'old:virtual_from_version:47729' => 1067, + 'old:virtual_from_version:39547' => 1192, + 'old:virtual_from_version:46224' => 1070, + 'old:virtual_from_version:45552' => 1614, + 'old:virtual_from_version:40695' => 1077, + 'old:virtual_from_version:44536' => 1037, + 'old:virtual_from_version:47919' => 1009, + 'old:virtual_from_version:38765' => 1107, + 'old:virtual_from_version:50619' => 1070, + 'old:virtual_from_version:47834' => 1009, + 'old:virtual_from_version:44407' => 1015, + 'old:virtual_from_version:47093' => 1172, + 'old:virtual_from_version:39509' => 1044, + 'old:virtual_from_version:45793' => 1051, + 'old:virtual_from_version:42656' => 1070, + 'old:virtual_from_version:42112' => 1077, + 'old:virtual_from_version:50134' => 1070, + 'old:virtual_from_version:45306' => 1404, + 'old:virtual_from_version:46202' => 1062, + 'old:virtual_from_version:39311' => 1107, + 'old:virtual_from_version:44008' => 1070, + 'old:virtual_from_version:49068' => 1070, + 'old:virtual_from_version:44386' => 1043, + 'old:virtual_from_version:44453' => 1528, + 'old:virtual_from_version:40933' => 1037, + 'old:virtual_from_version:49830' => 1015, + 'old:virtual_from_version:46043' => 1649, + 'old:virtual_from_version:50481' => 3255, + 'old:virtual_from_version:46710' => 1070, + 'old:virtual_from_version:50343' => 3131, + 'old:virtual_from_version:44435' => 1077, + 'old:virtual_from_version:47998' => 1070, + 'old:virtual_from_version:47402' => 3047, + 'old:virtual_from_version:47064' => 3003, + 'old:virtual_from_version:50182' => 1070, + 'old:virtual_from_version:45815' => 1070, + 'old:virtual_from_version:50563' => 1125, + 'old:virtual_from_version:42464' => 1125, + 'old:virtual_from_version:42359' => 1077, + 'old:virtual_from_version:50494' => 3226, + 'old:virtual_from_version:47418' => 3008, + 'old:virtual_from_version:40558' => 1025, + 'old:virtual_from_version:42773' => 1037, + 'old:virtual_from_version:50483' => 3247, + 'old:virtual_from_version:45142' => 1125, + 'old:virtual_from_version:50675' => 3192, + 'old:virtual_from_version:45118' => 1070, + 'old:virtual_from_version:44066' => 1037, + 'old:virtual_from_version:44972' => 1110, + 'old:virtual_from_version:46155' => 1070, + 'old:virtual_from_version:44606' => 1077, + 'old:virtual_from_version:45878' => 1630, + 'old:virtual_from_version:40955' => 1109, + 'old:virtual_from_version:49530' => 1489, + 'old:virtual_from_version:44299' => 1077, + 'old:virtual_from_version:47090' => 1321, + 'old:virtual_from_version:45263' => 1224, + 'old:virtual_from_version:40825' => 1077, + 'old:virtual_from_version:43019' => 2044, + 'old:virtual_from_version:49814' => 3194, + 'old:virtual_from_version:38415' => 1069, + 'old:virtual_from_version:47207' => 1009, + 'old:virtual_from_version:49757' => 1585, + 'old:virtual_from_version:44791' => 1025, + 'old:virtual_from_version:44943' => 1517, + 'old:virtual_from_version:44132' => 1037, + 'old:virtual_from_version:44228' => 1037, + 'old:virtual_from_version:45961' => 1025, + 'old:virtual_from_version:49130' => 1689, + 'old:virtual_from_version:49752' => 1689, + 'old:virtual_from_version:47031' => 1125, + 'old:virtual_from_version:40468' => 1067, + 'old:virtual_from_version:39965' => 1095, + 'old:virtual_from_version:42555' => 1025, + 'old:virtual_from_version:46343' => 1109, + 'old:virtual_from_version:44255' => 1105, + 'old:virtual_from_version:49376' => 1077, + 'old:virtual_from_version:42904' => 1037, + 'old:virtual_from_version:46019' => 1404, + 'old:virtual_from_version:46658' => 1461, + 'old:virtual_from_version:42794' => 1115, + 'old:virtual_from_version:42327' => 1077, + 'old:virtual_from_version:39284' => 1007, + 'old:virtual_from_version:38978' => 1107, + 'old:virtual_from_version:45337' => 1125, + 'old:virtual_from_version:47976' => 1062, + 'old:virtual_from_version:40434' => 1109, + 'old:virtual_from_version:38570' => 1095, + 'old:virtual_from_version:47680' => 1659, + 'old:virtual_from_version:49543' => 1009, + 'old:virtual_from_version:44958' => 1560, + 'old:virtual_from_version:44139' => 1070, + 'old:virtual_from_version:47442' => 1109, + 'old:virtual_from_version:50644' => 1148, + 'old:virtual_from_version:47836' => 1404, + 'old:virtual_from_version:46054' => 1651, + 'old:virtual_from_version:46348' => 1671, + 'old:virtual_from_version:46079' => 1150, + 'old:virtual_from_version:49281' => 1659, + 'old:virtual_from_version:44325' => 1009, + 'old:virtual_from_version:42858' => 1037, + 'old:virtual_from_version:36542' => 1069, + 'old:virtual_from_version:47361' => 1107, + 'old:virtual_from_version:48017' => 2117, + 'old:virtual_from_version:45069' => 1125, + 'old:virtual_from_version:38545' => 1115, + 'old:virtual_from_version:45449' => 1222, + 'old:virtual_from_version:49053' => 3094, + 'old:virtual_from_version:45240' => 1062, + 'old:virtual_from_version:40709' => 1070, + 'old:virtual_from_version:44792' => 1077, + 'old:virtual_from_version:43004' => 2029, + 'old:virtual_from_version:42606' => 1172, + 'old:virtual_from_version:42835' => 1501, + 'old:virtual_from_version:50142' => 3131, + 'old:virtual_from_version:47235' => 1070, + 'old:virtual_from_version:40533' => 1070, + 'old:virtual_from_version:42871' => 1077, + 'old:virtual_from_version:49340' => 3167, + 'old:virtual_from_version:46853' => 3002, + 'old:virtual_from_version:46624' => 1051, + 'old:virtual_from_version:38990' => 1141, + 'old:virtual_from_version:47672' => 3078, + 'old:virtual_from_version:40164' => 1048, + 'old:virtual_from_version:42055' => 1070, + 'old:virtual_from_version:50554' => 1125, + 'old:virtual_from_version:47709' => 1070, + 'old:virtual_from_version:49411' => 1532, + 'old:virtual_from_version:46437' => 1077, + 'old:virtual_from_version:50544' => 3016, + 'old:virtual_from_version:13356' => 1022, + 'old:virtual_from_version:47073' => 3008, + 'old:virtual_from_version:45855' => 1070, + 'old:virtual_from_version:45136' => 1001, + 'old:virtual_from_version:45882' => 1070, + 'old:virtual_from_version:50235' => 1689, + 'old:virtual_from_version:45230' => 1569, + 'old:virtual_from_version:45518' => 1070, + 'old:virtual_from_version:49965' => 3211, + 'old:virtual_from_version:40838' => 1107, + 'old:virtual_from_version:46739' => 1077, + 'old:virtual_from_version:45414' => 1009, + 'old:virtual_from_version:49373' => 3167, + 'old:virtual_from_version:44406' => 1012, + 'old:virtual_from_version:44674' => 1077, + 'old:virtual_from_version:47310' => 1125, + 'old:virtual_from_version:42187' => 1109, + 'old:virtual_from_version:44239' => 1070, + 'old:virtual_from_version:47534' => 1077, + 'old:virtual_from_version:47589' => 1070, + 'old:virtual_from_version:50277' => 1659, + 'old:virtual_from_version:45144' => 1125, + 'old:virtual_from_version:45653' => 1067, + 'old:virtual_from_version:46729' => 1697, + 'old:virtual_from_version:44733' => 1077, + 'old:virtual_from_version:47500' => 1077, + 'old:virtual_from_version:44829' => 1011, + 'old:virtual_from_version:40947' => 1037, + 'old:virtual_from_version:50186' => 1037, + 'old:virtual_from_version:46456' => 1444, + 'old:virtual_from_version:42703' => 1037, + 'old:virtual_from_version:46966' => 1077, + 'old:virtual_from_version:40916' => 1110, + 'old:virtual_from_version:44668' => 1070, + 'old:virtual_from_version:49873' => 1070, + 'old:virtual_from_version:47253' => 1067, + 'old:virtual_from_version:50531' => 1048, + 'old:virtual_from_version:49607' => 1404, + 'old:virtual_from_version:39009' => 1083, + 'old:virtual_from_version:42118' => 1136, + 'old:virtual_from_version:42291' => 1025, + 'old:virtual_from_version:42389' => 1070, + 'old:virtual_from_version:42406' => 1077, + 'old:virtual_from_version:44971' => 1064, + 'old:virtual_from_version:46309' => 1009, + 'old:virtual_from_version:49254' => 1689, + 'old:virtual_from_version:46664' => 1077, + 'old:virtual_from_version:50512' => 1583, + 'old:virtual_from_version:46100' => 1070, + 'old:virtual_from_version:49073' => 1666, + 'old:virtual_from_version:44586' => 1077, + 'old:virtual_from_version:46466' => 1404, + 'old:virtual_from_version:42028' => 1037, + 'old:virtual_from_version:47221' => 1070, + 'old:virtual_from_version:42317' => 1413, + 'old:virtual_from_version:44587' => 1037, + 'old:virtual_from_version:44759' => 1006, + 'old:virtual_from_version:44714' => 1037, + 'old:virtual_from_version:40754' => 1077, + 'old:virtual_from_version:46568' => 1070, + 'old:virtual_from_version:46329' => 1077, + 'old:virtual_from_version:46899' => 1070, + 'old:virtual_from_version:47417' => 1689, + 'old:virtual_from_version:49867' => 3131, + 'old:virtual_from_version:49091' => 3139, + 'old:virtual_from_version:42197' => 1077, + 'old:virtual_from_version:46475' => 1105, + 'old:virtual_from_version:46902' => 1404, + 'old:virtual_from_version:46965' => 1125, + 'old:virtual_from_version:39716' => 1083, + 'old:virtual_from_version:45223' => 1576, + 'old:virtual_from_version:49797' => 1070, + 'old:virtual_from_version:47850' => 1532, + 'old:virtual_from_version:45575' => 1070, + 'old:virtual_from_version:47822' => 3094, + 'old:virtual_from_version:47226' => 1070, + 'old:virtual_from_version:45250' => 1110, + 'old:virtual_from_version:50337' => 3131, + 'old:virtual_from_version:46618' => 1172, + 'old:virtual_from_version:42958' => 1009, + 'old:virtual_from_version:50629' => 1419, + 'old:virtual_from_version:47711' => 1109, + 'old:virtual_from_version:42090' => 1070, + 'old:virtual_from_version:44413' => 1021, + 'old:virtual_from_version:44393' => 1000, + 'old:virtual_from_version:46314' => 1665, + 'old:virtual_from_version:49800' => 1107, + 'old:virtual_from_version:50524' => 1033, + 'old:virtual_from_version:40799' => 1070, + 'old:virtual_from_version:46207' => 1070, + 'old:virtual_from_version:40929' => 1037, + 'old:virtual_from_version:49528' => 1362, + 'old:virtual_from_version:39596' => 1000, + 'old:virtual_from_version:46921' => 1621, + 'old:virtual_from_version:45013' => 1136, + 'old:virtual_from_version:46906' => 1077, + 'old:virtual_from_version:46116' => 1353, + 'old:virtual_from_version:46245' => 1574, + 'old:virtual_from_version:40652' => 1398, + 'old:virtual_from_version:47123' => 1172, + 'old:virtual_from_version:38847' => 1112, + 'old:virtual_from_version:46168' => 1070, + 'old:virtual_from_version:40859' => 1037, + 'old:virtual_from_version:47759' => 1037, + 'old:virtual_from_version:47420' => 1070, + 'old:virtual_from_version:49841' => 1517, + 'old:virtual_from_version:40399' => 1349, + 'old:virtual_from_version:46877' => 1125, + 'old:virtual_from_version:49430' => 3029, + 'old:virtual_from_version:50395' => 3214, + 'old:virtual_from_version:49033' => 3046, + 'old:virtual_from_version:46571' => 1498, + 'old:virtual_from_version:49402' => 1070, + 'old:virtual_from_version:42318' => 1070, + 'old:virtual_from_version:45432' => 1077, + 'old:virtual_from_version:44869' => 1009, + 'old:virtual_from_version:46542' => 1077, + 'old:virtual_from_version:49186' => 1404, + 'old:virtual_from_version:40846' => 1077, + 'old:virtual_from_version:49929' => 3209, + 'old:virtual_from_version:49999' => 1070, + 'old:virtual_from_version:44873' => 1070, + 'old:virtual_from_version:46736' => 1070, + 'old:virtual_from_version:39933' => 1247, + 'old:virtual_from_version:49226' => 1314, + 'old:virtual_from_version:47204' => 1070, + 'old:virtual_from_version:40925' => 1067, + 'old:virtual_from_version:44993' => 1069, + 'old:virtual_from_version:41008' => 2019, + 'old:virtual_from_version:47719' => 1321, + 'old:virtual_from_version:47766' => 3078, + 'old:virtual_from_version:47553' => 1077, + 'old:virtual_from_version:44693' => 1048, + 'old:virtual_from_version:42504' => 1012, + 'old:virtual_from_version:40750' => 1109, + 'old:virtual_from_version:49116' => 1051, + 'old:virtual_from_version:47198' => 1125, + 'old:virtual_from_version:47168' => 1444, + 'old:virtual_from_version:45079' => 1402, + 'old:virtual_from_version:47282' => 1397, + 'old:virtual_from_version:47358' => 3045, + 'old:virtual_from_version:49546' => 1125, + 'old:virtual_from_version:46606' => 1404, + 'old:virtual_from_version:44035' => 1037, + 'old:virtual_from_version:49108' => 3136, + 'old:virtual_from_version:44404' => 1010, + 'old:virtual_from_version:50400' => 3131, + 'old:virtual_from_version:44381' => 1027, + 'old:virtual_from_version:45387' => 1362, + 'old:virtual_from_version:44424' => 1043, + 'old:virtual_from_version:47447' => 1057, + 'old:virtual_from_version:47157' => 1583, + 'old:virtual_from_version:45851' => 1109, + 'old:virtual_from_version:44507' => 1053, + 'old:virtual_from_version:42096' => 1037, + 'old:virtual_from_version:49298' => 3136, + 'old:virtual_from_version:46053' => 1077, + 'old:virtual_from_version:44524' => 1136, + 'old:virtual_from_version:45576' => 1077, + 'old:virtual_from_version:49032' => 1649, + 'old:virtual_from_version:40655' => 1083, + 'old:virtual_from_version:45080' => 1110, + 'old:virtual_from_version:40786' => 1077, + 'old:virtual_from_version:45819' => 1077, + 'old:virtual_from_version:50355' => 1689, + 'old:virtual_from_version:44659' => 1070, + 'old:virtual_from_version:49629' => 3184, + 'old:virtual_from_version:40952' => 1009, + 'old:virtual_from_version:42323' => 1112, + 'old:virtual_from_version:44798' => 1067, + 'old:virtual_from_version:45009' => 1517, + 'old:virtual_from_version:47042' => 1172, + 'old:virtual_from_version:45530' => 1009, + 'old:virtual_from_version:47191' => 1070, + 'old:virtual_from_version:45366' => 1125, + 'old:virtual_from_version:44513' => 1107, + 'old:virtual_from_version:45536' => 1136, + 'old:virtual_from_version:40657' => 1125, + 'old:virtual_from_version:46264' => 1070, + 'old:virtual_from_version:46909' => 1095, + 'old:virtual_from_version:50047' => 1105, + 'old:virtual_from_version:46175' => 1532, + 'old:virtual_from_version:42483' => 1104, + 'old:virtual_from_version:40511' => 1070, + 'old:virtual_from_version:44482' => 1077, + 'old:virtual_from_version:50432' => 1057, + 'old:virtual_from_version:50455' => 1025, + 'old:virtual_from_version:42591' => 1070, + 'old:virtual_from_version:49511' => 3180, + 'old:virtual_from_version:50260' => 3131, + 'old:virtual_from_version:45739' => 1070, + 'old:virtual_from_version:38375' => 1070, + 'old:virtual_from_version:38835' => 1051, + 'old:virtual_from_version:42547' => 1070, + 'old:virtual_from_version:49588' => 1105, + 'old:virtual_from_version:45644' => 1009, + 'old:virtual_from_version:47770' => 1070, + 'old:virtual_from_version:47399' => 1077, + 'old:virtual_from_version:49976' => 3209, + 'old:virtual_from_version:46638' => 1404, + 'old:virtual_from_version:42967' => 1077, + 'old:virtual_from_version:45351' => 1362, + 'old:virtual_from_version:38538' => 1077, + 'old:virtual_from_version:45288' => 1568, + 'old:virtual_from_version:45308' => 1125, + 'old:virtual_from_version:49447' => 1580, + 'old:virtual_from_version:41002' => 2014, + 'old:virtual_from_version:42357' => 1009, + 'old:virtual_from_version:42023' => 1077, + 'old:virtual_from_version:49885' => 3131, + 'old:virtual_from_version:45856' => 1125, + 'old:virtual_from_version:42296' => 1428, + 'old:virtual_from_version:45268' => 1015, + 'old:virtual_from_version:42337' => 1037, + 'old:virtual_from_version:49121' => 1112, + 'old:virtual_from_version:49928' => 3009, + 'old:virtual_from_version:46113' => 1404, + 'old:virtual_from_version:46878' => 1025, + 'old:virtual_from_version:50251' => 3186, + 'old:virtual_from_version:47124' => 1025, + 'old:virtual_from_version:46038' => 1077, + 'old:virtual_from_version:47651' => 1077, + 'old:virtual_from_version:39578' => 1100, + 'old:virtual_from_version:43026' => 2051, + 'old:virtual_from_version:50624' => 1110, + 'old:virtual_from_version:50590' => 3267, + 'old:virtual_from_version:47441' => 1125, + 'old:virtual_from_version:40882' => 1048, + 'old:virtual_from_version:40872' => 1019, + 'old:virtual_from_version:47807' => 1077, + 'old:virtual_from_version:47111' => 3017, + 'old:virtual_from_version:50472' => 3249, + 'old:virtual_from_version:50674' => 3270, + 'old:virtual_from_version:47025' => 1172, + 'old:virtual_from_version:49446' => 1444, + 'old:virtual_from_version:44121' => 1110, + 'old:virtual_from_version:50503' => 3174, + 'old:virtual_from_version:42477' => 1444, + 'old:virtual_from_version:42509' => 1062, + 'old:virtual_from_version:45641' => 1070, + 'old:virtual_from_version:50398' => 1069, + 'old:virtual_from_version:42274' => 1222, + 'old:virtual_from_version:45533' => 1613, + 'old:virtual_from_version:47973' => 1689, + 'old:virtual_from_version:47528' => 1109, + 'old:virtual_from_version:45311' => 1583, + 'old:virtual_from_version:47359' => 1070, + 'old:virtual_from_version:43066' => 2067, + 'old:virtual_from_version:49400' => 1025, + 'old:virtual_from_version:50387' => 1070, + 'old:virtual_from_version:50473' => 3250, + 'old:virtual_from_version:49112' => 3146, + 'old:virtual_from_version:49648' => 1489, + 'old:virtual_from_version:40477' => 1083, + 'old:virtual_from_version:45993' => 1076, + 'old:virtual_from_version:44341' => 1077, + 'old:virtual_from_version:46916' => 1136, + 'old:virtual_from_version:45239' => 1016, + 'old:virtual_from_version:47492' => 1025, + 'old:virtual_from_version:34143' => 1051, + 'old:virtual_from_version:39771' => 1088, + 'old:virtual_from_version:42222' => 1413, + 'old:virtual_from_version:45731' => 1125, + 'old:virtual_from_version:39704' => 1019, + 'old:virtual_from_version:49961' => 1580, + 'old:virtual_from_version:44130' => 1009, + 'old:virtual_from_version:46591' => 1077, + 'old:virtual_from_version:50377' => 1125, + 'old:virtual_from_version:42737' => 1108, + 'old:virtual_from_version:46132' => 1109, + 'old:virtual_from_version:42331' => 1032, + 'old:virtual_from_version:45861' => 1125, + 'old:virtual_from_version:50557' => 3259, + 'old:virtual_from_version:42983' => 1507, + 'old:virtual_from_version:42502' => 1091, + 'old:virtual_from_version:46888' => 1070, + 'old:virtual_from_version:44788' => 1125, + 'old:virtual_from_version:40998' => 1109, + 'old:virtual_from_version:40689' => 1107, + 'old:virtual_from_version:44601' => 1107, + 'old:virtual_from_version:45628' => 1067, + 'old:virtual_from_version:46730' => 1070, + 'old:virtual_from_version:47524' => 1410, + 'old:virtual_from_version:39935' => 1025, + 'old:virtual_from_version:47749' => 1125, + 'old:virtual_from_version:47487' => 1109, + 'old:virtual_from_version:44133' => 1062, + 'old:virtual_from_version:46335' => 1670, + 'old:virtual_from_version:49668' => 1136, + 'old:virtual_from_version:50643' => 3259, + 'old:virtual_from_version:39941' => 1009, + 'old:virtual_from_version:42602' => 1037, + 'old:virtual_from_version:45019' => 1107, + 'old:virtual_from_version:46834' => 1172, + 'old:virtual_from_version:40948' => 1048, + 'old:virtual_from_version:50347' => 1125, + 'old:virtual_from_version:38339' => 1107, + 'old:virtual_from_version:45559' => 1107, + 'old:virtual_from_version:42345' => 1037, + 'old:virtual_from_version:46250' => 1070, + 'old:virtual_from_version:44361' => 1222, + 'old:virtual_from_version:45147' => 1125, + 'old:virtual_from_version:44630' => 1172, + 'old:virtual_from_version:49710' => 1084, + 'old:virtual_from_version:45304' => 1580, + 'old:virtual_from_version:46535' => 1070, + 'old:virtual_from_version:45978' => 1533, + 'old:virtual_from_version:40911' => 1110, + 'old:virtual_from_version:49156' => 1077, + 'old:virtual_from_version:44074' => 1070, + 'old:virtual_from_version:44396' => 1070, + 'old:virtual_from_version:49403' => 1689, + 'old:virtual_from_version:45532' => 1085, + 'old:virtual_from_version:44162' => 1037, + 'old:virtual_from_version:44850' => 1077, + 'old:virtual_from_version:40857' => 1025, + 'old:virtual_from_version:49784' => 1070, + 'old:virtual_from_version:49689' => 1404, + 'old:virtual_from_version:50297' => 3234, + 'old:virtual_from_version:44728' => 1077, + 'old:virtual_from_version:47414' => 1037, + 'old:virtual_from_version:42115' => 1077, + 'old:virtual_from_version:45619' => 1070, + 'old:virtual_from_version:45722' => 1107, + 'old:virtual_from_version:46631' => 1077, + 'old:virtual_from_version:42568' => 1077, + 'old:virtual_from_version:42249' => 1070, + 'old:virtual_from_version:49047' => 1584, + 'old:virtual_from_version:42361' => 1000, + 'old:virtual_from_version:47765' => 3078, + 'old:virtual_from_version:40725' => 1048, + 'old:virtual_from_version:45097' => 1077, + 'old:virtual_from_version:42611' => 1172, + 'old:virtual_from_version:45396' => 1009, + 'old:virtual_from_version:49410' => 1404, + 'old:virtual_from_version:40870' => 1070, + 'old:virtual_from_version:45808' => 1397, + 'old:virtual_from_version:47525' => 1070, + 'old:virtual_from_version:42073' => 1037, + 'old:virtual_from_version:50193' => 3131, + 'old:virtual_from_version:47398' => 1172, + 'old:virtual_from_version:44942' => 1014, + 'old:virtual_from_version:49992' => 1666, + 'old:virtual_from_version:46548' => 1070, + 'old:virtual_from_version:44645' => 1517, + 'old:virtual_from_version:49761' => 1672, + 'old:virtual_from_version:44147' => 1037, + 'old:virtual_from_version:46131' => 1070, + 'old:virtual_from_version:50296' => 3131, + 'old:virtual_from_version:40273' => 1222, + 'old:virtual_from_version:44414' => 1517, + 'old:virtual_from_version:36625' => 1012, + 'old:virtual_from_version:49971' => 3209, + 'old:virtual_from_version:46023' => 1580, + 'old:virtual_from_version:50270' => 1070, + 'old:virtual_from_version:47625' => 1077, + 'old:virtual_from_version:44698' => 1077, + 'old:virtual_from_version:44697' => 1025, + 'old:virtual_from_version:46554' => 1555, + 'old:virtual_from_version:44382' => 1030, + 'old:virtual_from_version:45261' => 1109, + 'old:virtual_from_version:50157' => 1580, + 'old:virtual_from_version:49759' => 1689, + 'old:virtual_from_version:42646' => 1112, + 'old:virtual_from_version:46882' => 1070, + 'old:virtual_from_version:44085' => 1107, + 'old:virtual_from_version:46308' => 1172, + 'old:virtual_from_version:42059' => 1112, + 'old:virtual_from_version:49107' => 3147, + 'old:virtual_from_version:47584' => 1007, + 'old:virtual_from_version:40813' => 1107, + 'old:virtual_from_version:44652' => 1077, + 'old:virtual_from_version:42374' => 1107, + 'old:virtual_from_version:42412' => 1077, + 'old:virtual_from_version:50394' => 3159, + 'old:virtual_from_version:42370' => 1077, + 'old:virtual_from_version:40606' => 1077, + 'old:virtual_from_version:45324' => 1125, + 'old:virtual_from_version:46872' => 1410, + 'old:virtual_from_version:47470' => 1402, + 'old:virtual_from_version:44976' => 1021, + 'old:virtual_from_version:40520' => 1109, + 'old:virtual_from_version:39234' => 1150, + 'old:virtual_from_version:42780' => 1037, + 'old:virtual_from_version:45092' => 1077, + 'old:virtual_from_version:46117' => 1070, + 'old:virtual_from_version:45767' => 1035, + 'old:virtual_from_version:45456' => 1070, + 'old:virtual_from_version:40912' => 1067, + 'old:virtual_from_version:47925' => 3008, + 'old:virtual_from_version:50505' => 1311, + 'old:virtual_from_version:46772' => 1070, + 'old:virtual_from_version:47380' => 3008, + 'old:virtual_from_version:46333' => 1077, + 'old:virtual_from_version:44017' => 1125, + 'old:virtual_from_version:46226' => 1070, + 'old:virtual_from_version:46232' => 1615, + 'old:virtual_from_version:45737' => 1555, + 'old:virtual_from_version:44775' => 1423, + 'old:virtual_from_version:46029' => 1649, + 'old:virtual_from_version:43000' => 2000, + 'old:virtual_from_version:46712' => 1070, + 'old:virtual_from_version:49997' => 3214, + 'old:virtual_from_version:50257' => 1070, + 'old:virtual_from_version:44240' => 1009, + 'old:virtual_from_version:44009' => 1009, + 'old:virtual_from_version:40368' => 1009, + 'old:virtual_from_version:46273' => 1030, + 'old:virtual_from_version:40595' => 1077, + 'old:virtual_from_version:45756' => 1077, + 'old:virtual_from_version:45651' => 1125, + 'old:virtual_from_version:49022' => 1689, + 'old:virtual_from_version:49305' => 1584, + 'old:virtual_from_version:45496' => 1007, + 'old:virtual_from_version:42154' => 1070, + 'old:virtual_from_version:50212' => 3131, + 'old:virtual_from_version:46869' => 1077, + 'old:virtual_from_version:44614' => 1017, + 'old:virtual_from_version:44526' => 1009, + 'old:virtual_from_version:47665' => 1077, + 'old:virtual_from_version:42379' => 1311, + 'old:virtual_from_version:44584' => 1070, + 'old:virtual_from_version:45695' => 1027, + 'old:virtual_from_version:42478' => 1009, + 'old:virtual_from_version:44636' => 1136, + 'old:virtual_from_version:44180' => 1321, + 'old:virtual_from_version:42246' => 1037, + 'old:virtual_from_version:44910' => 1077, + 'old:virtual_from_version:44468' => 1009, + 'old:virtual_from_version:40901' => 1037, + 'old:virtual_from_version:42516' => 1172, + 'old:virtual_from_version:45567' => 1614, + 'old:virtual_from_version:42445' => 1067, + 'old:virtual_from_version:46684' => 1659, + 'old:virtual_from_version:50237' => 1035, + 'old:virtual_from_version:45753' => 1070, + 'old:virtual_from_version:45523' => 1136, + 'old:virtual_from_version:46714' => 1172, + 'old:virtual_from_version:45595' => 1077, + 'old:virtual_from_version:42691' => 1109, + 'old:virtual_from_version:44663' => 1070, + 'old:virtual_from_version:47566' => 1588, + 'old:virtual_from_version:49632' => 1070, + 'old:virtual_from_version:40600' => 1048, + 'old:virtual_from_version:42815' => 1025, + 'old:virtual_from_version:40509' => 1110, + 'old:virtual_from_version:40444' => 1105, + 'old:virtual_from_version:47323' => 1172, + 'old:virtual_from_version:44321' => 1172, + 'old:virtual_from_version:47220' => 1050, + 'old:virtual_from_version:47005' => 1125, + 'old:virtual_from_version:42796' => 1077, + 'old:virtual_from_version:42951' => 1025, + 'old:virtual_from_version:42102' => 1077, + 'old:virtual_from_version:42864' => 1009, + 'old:virtual_from_version:42330' => 1141, + 'old:virtual_from_version:46875' => 1613, + 'old:virtual_from_version:47139' => 1172, + 'old:virtual_from_version:49891' => 1489, + 'old:virtual_from_version:44555' => 1037, + 'old:virtual_from_version:44327' => 1025, + 'old:virtual_from_version:46709' => 1077, + 'old:virtual_from_version:46012' => 1090, + 'old:virtual_from_version:44123' => 1125, + 'old:virtual_from_version:42129' => 1105, + 'old:virtual_from_version:40981' => 1077, + 'old:virtual_from_version:46107' => 1070, + 'old:virtual_from_version:40920' => 1025, + 'old:virtual_from_version:49349' => 1070, + 'old:virtual_from_version:49568' => 1404, + 'old:virtual_from_version:46094' => 1070, + 'old:virtual_from_version:47280' => 1125, + 'old:virtual_from_version:42944' => 1009, + 'old:virtual_from_version:50022' => 1125, + 'old:virtual_from_version:47641' => 1109, + 'old:virtual_from_version:44948' => 1001, + 'old:virtual_from_version:42690' => 1062, + 'old:virtual_from_version:47097' => 1070, + 'old:virtual_from_version:46055' => 1070, + 'old:virtual_from_version:49310' => 1077, + 'old:virtual_from_version:42545' => 1343, + 'old:virtual_from_version:44726' => 1009, + 'old:virtual_from_version:50746' => 3259, + 'old:virtual_from_version:46936' => 1076, + 'old:virtual_from_version:46342' => 1070, + 'old:virtual_from_version:46532' => 1025, + 'old:virtual_from_version:49480' => 1689, + 'old:virtual_from_version:49416' => 1580, + 'old:virtual_from_version:46336' => 1007, + 'old:virtual_from_version:46589' => 1404, + 'old:virtual_from_version:50501' => 3131, + 'old:virtual_from_version:47279' => 3038, + 'old:virtual_from_version:45143' => 1107, + 'old:virtual_from_version:47344' => 1689, + 'old:virtual_from_version:42010' => 1070, + 'old:virtual_from_version:42397' => 1077, + 'old:virtual_from_version:50642' => 1587, + 'old:virtual_from_version:45018' => 1222, + 'old:virtual_from_version:47133' => 1172, + 'old:virtual_from_version:44511' => 1172, + 'old:virtual_from_version:40260' => 1146, + 'old:virtual_from_version:42282' => 1424, + 'old:virtual_from_version:45592' => 1070, + 'old:virtual_from_version:49321' => 3146, + 'old:virtual_from_version:40066' => 1070, + 'old:virtual_from_version:42099' => 1077, + 'old:virtual_from_version:49440' => 1172, + 'old:virtual_from_version:44102' => 1037, + 'old:virtual_from_version:42489' => 1107, + 'old:virtual_from_version:46776' => 1077, + 'old:virtual_from_version:50716' => 1007, + 'old:virtual_from_version:45568' => 1172, + 'old:virtual_from_version:46380' => 1005, + 'old:virtual_from_version:49774' => 3031, + 'old:virtual_from_version:47061' => 1172, + 'old:virtual_from_version:40247' => 1107, + 'old:virtual_from_version:46122' => 1070, + 'old:virtual_from_version:46163' => 1006, + 'old:virtual_from_version:44877' => 1136, + 'old:virtual_from_version:44687' => 1070, + 'old:virtual_from_version:44801' => 1125, + 'old:virtual_from_version:49388' => 1095, + 'old:virtual_from_version:44354' => 1515, + 'old:virtual_from_version:47026' => 1077, + 'old:virtual_from_version:49215' => 1404, + 'old:virtual_from_version:40732' => 1070, + 'old:virtual_from_version:46748' => 1070, + 'old:virtual_from_version:44345' => 1070, + 'old:virtual_from_version:40817' => 1077, + 'old:virtual_from_version:44301' => 1404, + 'old:virtual_from_version:49155' => 1009, + 'old:virtual_from_version:42021' => 1070, + 'old:virtual_from_version:49192' => 3078, + 'old:virtual_from_version:43039' => 2030, + 'old:virtual_from_version:43060' => 2059, + 'old:virtual_from_version:42116' => 1037, + 'old:virtual_from_version:40994' => 1009, + 'old:virtual_from_version:50135' => 1172, + 'old:virtual_from_version:47263' => 1077, + 'old:virtual_from_version:40743' => 1025, + 'old:virtual_from_version:49160' => 1070, + 'old:virtual_from_version:50199' => 3131, + 'old:virtual_from_version:42286' => 1070, + 'old:virtual_from_version:46498' => 1107, + 'old:virtual_from_version:44585' => 1025, + 'old:virtual_from_version:46766' => 1025, + 'old:virtual_from_version:45480' => 1136, + 'old:virtual_from_version:40489' => 1070, + 'old:virtual_from_version:44530' => 1110, + 'old:virtual_from_version:47720' => 1070, + 'old:virtual_from_version:28096' => 1084, + 'old:virtual_from_version:45001' => 1009, + 'old:virtual_from_version:39956' => 1076, + 'old:virtual_from_version:43093' => 2085, + 'old:virtual_from_version:46826' => 1048, + 'old:virtual_from_version:42725' => 1110, + 'old:virtual_from_version:42558' => 1070, + 'old:virtual_from_version:47298' => 1070, + 'old:virtual_from_version:47338' => 1070, + 'old:virtual_from_version:50708' => 1533, + 'old:virtual_from_version:49680' => 3190, + 'old:virtual_from_version:40218' => 1112, + 'old:virtual_from_version:46816' => 1509, + 'old:virtual_from_version:46173' => 1009, + 'old:virtual_from_version:40425' => 1335, + 'old:virtual_from_version:40187' => 1051, + 'old:virtual_from_version:45447' => 1107, + 'old:virtual_from_version:47444' => 1077, + 'old:virtual_from_version:47856' => 1314, + 'old:virtual_from_version:47469' => 1077, + 'old:virtual_from_version:49077' => 1666, + 'old:virtual_from_version:49614' => 1025, + 'old:virtual_from_version:39577' => 1087, + 'old:virtual_from_version:49333' => 1404, + 'old:virtual_from_version:42392' => 1077, + 'old:virtual_from_version:50525' => 1062, + 'old:virtual_from_version:45748' => 1019, + 'old:virtual_from_version:49889' => 1070, + 'old:virtual_from_version:47849' => 1077, + 'old:virtual_from_version:46393' => 1404, + 'old:virtual_from_version:46516' => 1125, + 'old:virtual_from_version:44499' => 1125, + 'old:virtual_from_version:39431' => 1110, + 'old:virtual_from_version:42026' => 1070, + 'old:virtual_from_version:50068' => 3131, + 'old:virtual_from_version:44444' => 1070, + 'old:virtual_from_version:44216' => 1419, + 'old:virtual_from_version:47994' => 1070, + 'old:virtual_from_version:10002' => 2001, + 'old:virtual_from_version:49736' => 1007, + 'old:virtual_from_version:42682' => 1037, + 'old:virtual_from_version:45129' => 1009, + 'old:virtual_from_version:42100' => 1037, + 'old:virtual_from_version:50319' => 1125, + 'old:virtual_from_version:42664' => 1077, + 'old:virtual_from_version:49904' => 3131, + 'old:virtual_from_version:38705' => 1051, + 'old:virtual_from_version:45502' => 1009, + 'old:virtual_from_version:50445' => 3189, + 'old:virtual_from_version:50647' => 1110, + 'old:virtual_from_version:44184' => 1404, + 'old:virtual_from_version:40339' => 1328, + 'old:virtual_from_version:42302' => 1009, + 'old:virtual_from_version:42587' => 1037, + 'old:virtual_from_version:4525 ' => 1055, + 'old:virtual_from_version:49594' => 1105, + 'old:virtual_from_version:45226' => 1414, + 'old:virtual_from_version:42754' => 1077, + 'old:virtual_from_version:47300' => 1109, + 'old:virtual_from_version:49554' => 1005, + 'old:virtual_from_version:49844' => 3194, + 'old:virtual_from_version:38811' => 1009, + 'old:virtual_from_version:43109' => 2070, + 'old:virtual_from_version:49199' => 1070, + 'old:virtual_from_version:49278' => 1070, + 'old:virtual_from_version:46774' => 1666, + 'old:virtual_from_version:46315' => 1666, + 'old:virtual_from_version:44671' => 1224, + 'old:virtual_from_version:45723' => 1070, + 'old:virtual_from_version:44060' => 1070, + 'old:virtual_from_version:49887' => 1311, + 'old:virtual_from_version:50107' => 3221, + 'old:virtual_from_version:47710' => 1107, + 'old:virtual_from_version:43099' => 2091, + 'old:virtual_from_version:46667' => 1141, + 'old:virtual_from_version:42079' => 1051, + 'old:virtual_from_version:50184' => 3131, + 'old:virtual_from_version:47452' => 1077, + 'old:virtual_from_version:46073' => 1070, + 'old:virtual_from_version:50422' => 1413, + 'old:virtual_from_version:46378' => 1076, + 'old:virtual_from_version:49846' => 1172, + 'old:virtual_from_version:47971' => 1077, + 'old:virtual_from_version:46850' => 1070, + 'old:virtual_from_version:46241' => 1107, + 'old:virtual_from_version:44262' => 1009, + 'old:virtual_from_version:38787' => 1130, + 'old:virtual_from_version:40528' => 1077, + 'old:virtual_from_version:44817' => 1107, + 'old:virtual_from_version:44691' => 1037, + 'old:virtual_from_version:44946' => 1419, + 'old:virtual_from_version:49978' => 3137, + 'old:virtual_from_version:40506' => 1077, + 'old:virtual_from_version:44808' => 1172, + 'old:virtual_from_version:45436' => 1077, + 'old:virtual_from_version:45697' => 1067, + 'old:virtual_from_version:50753' => 3266, + 'old:virtual_from_version:49327' => 1689, + 'old:virtual_from_version:45831' => 1009, + 'old:virtual_from_version:49370' => 1005, + 'old:virtual_from_version:38642' => 1123, + 'old:virtual_from_version:49048' => 1585, + 'old:virtual_from_version:49641' => 1067, + 'old:virtual_from_version:46830' => 1070, + 'old:virtual_from_version:47308' => 1062, + 'old:virtual_from_version:50227' => 3228, + 'old:virtual_from_version:46294' => 1555, + 'old:virtual_from_version:47252' => 1109, + 'old:virtual_from_version:39394' => 1051, + 'old:virtual_from_version:39331' => 1030, + 'old:virtual_from_version:40812' => 1067, + 'old:virtual_from_version:46534' => 1533, + 'old:virtual_from_version:46021' => 1461, + 'old:virtual_from_version:39134' => 1094, + 'old:virtual_from_version:45669' => 1077, + 'old:virtual_from_version:13338' => 1016, + 'old:virtual_from_version:46732' => 1172, + 'old:virtual_from_version:42422' => 1107, + 'old:virtual_from_version:40758' => 1081, + 'old:virtual_from_version:50110' => 1070, + 'old:virtual_from_version:46527' => 1077, + 'old:virtual_from_version:45381' => 1404, + 'old:virtual_from_version:42739' => 1077, + 'old:virtual_from_version:44116' => 1070, + 'old:virtual_from_version:42599' => 1007, + 'old:virtual_from_version:47930' => 1125, + 'old:virtual_from_version:47002' => 1037, + 'old:virtual_from_version:40435' => 1067, + 'old:virtual_from_version:40583' => 1136, + 'old:virtual_from_version:13386' => 1039, + 'old:virtual_from_version:47712' => 1077, + 'old:virtual_from_version:44392' => 1095, + 'old:virtual_from_version:50498' => 3251, + 'old:virtual_from_version:50391' => 1172, + 'old:virtual_from_version:45133' => 1488, + 'old:virtual_from_version:49598' => 1095, + 'old:virtual_from_version:47527' => 1048, + 'old:virtual_from_version:44159' => 1070, + 'old:virtual_from_version:42030' => 1070, + 'old:virtual_from_version:40456' => 1035, + 'old:virtual_from_version:45115' => 1070, + 'old:virtual_from_version:42019' => 1077, + 'old:virtual_from_version:13352' => 1021, + 'old:virtual_from_version:42328' => 1037, + 'old:virtual_from_version:49395' => 3120, + 'old:virtual_from_version:43056' => 2058, + 'old:virtual_from_version:44199' => 1077, + 'old:virtual_from_version:44223' => 1077, + 'old:virtual_from_version:48042' => 2139, + 'old:virtual_from_version:45467' => 1070, + 'old:virtual_from_version:38776' => 1067, + 'old:virtual_from_version:50690' => 1417, + 'old:virtual_from_version:50509' => 3183, + 'old:virtual_from_version:49962' => 3131, + 'old:virtual_from_version:46510' => 1585, + 'old:virtual_from_version:46166' => 1630, + 'old:virtual_from_version:50747' => 3267, + 'old:virtual_from_version:44411' => 1019, + 'old:virtual_from_version:47533' => 1109, + 'old:virtual_from_version:50138' => 1659, + 'old:virtual_from_version:46225' => 1077, + 'old:virtual_from_version:47394' => 1070, + 'old:virtual_from_version:49942' => 1172, + 'old:virtual_from_version:45558' => 1125, + 'old:virtual_from_version:44175' => 1067, + 'old:virtual_from_version:42827' => 1070, + 'old:virtual_from_version:42040' => 1037, + 'old:virtual_from_version:47049' => 1689, + 'old:virtual_from_version:42786' => 1497, + 'old:virtual_from_version:50345' => 3233, + 'old:virtual_from_version:43076' => 2040, + 'old:virtual_from_version:46453' => 1009, + 'old:virtual_from_version:42917' => 1077, + 'old:virtual_from_version:49579' => 1498, + 'old:virtual_from_version:44170' => 1125, + 'old:virtual_from_version:44843' => 1057, + 'old:virtual_from_version:42087' => 1070, + 'old:virtual_from_version:45893' => 1009, + 'old:virtual_from_version:45662' => 1005, + 'old:virtual_from_version:42145' => 1009, + 'old:virtual_from_version:40598' => 1077, + 'old:virtual_from_version:50024' => 3218, + 'old:virtual_from_version:39545' => 1148, + 'old:virtual_from_version:49124' => 1077, + 'old:virtual_from_version:40355' => 1091, + 'old:virtual_from_version:39046' => 1095, + 'old:virtual_from_version:46444' => 1172, + 'old:virtual_from_version:40896' => 1048, + 'old:virtual_from_version:47643' => 1583, + 'old:virtual_from_version:40961' => 1070, + 'old:virtual_from_version:45613' => 1136, + 'old:virtual_from_version:46929' => 1125, + 'old:virtual_from_version:45022' => 1078, + 'old:virtual_from_version:45804' => 1025, + 'old:virtual_from_version:44251' => 1077, + 'old:virtual_from_version:44429' => 1049, + 'old:virtual_from_version:50640' => 1001, + 'old:virtual_from_version:49222' => 1393, + 'old:virtual_from_version:50336' => 1105, + 'old:virtual_from_version:46951' => 1172, + 'old:virtual_from_version:46507' => 1580, + 'old:virtual_from_version:46598' => 1172, + 'old:virtual_from_version:42178' => 1172, + 'old:virtual_from_version:40903' => 1070, + 'old:virtual_from_version:50694' => 1070, + 'old:virtual_from_version:47509' => 1009, + 'old:virtual_from_version:49685' => 1105, + 'old:virtual_from_version:45040' => 1022, + 'old:virtual_from_version:45758' => 1070, + 'old:virtual_from_version:42803' => 1107, + 'old:virtual_from_version:48023' => 2124, + 'old:virtual_from_version:49643' => 1583, + 'old:virtual_from_version:42908' => 1009, + 'old:virtual_from_version:46096' => 1362, + 'old:virtual_from_version:40793' => 1070, + 'old:virtual_from_version:45083' => 1125, + 'old:virtual_from_version:42142' => 1351, + 'old:virtual_from_version:42226' => 1077, + 'old:virtual_from_version:42461' => 1070, + 'old:virtual_from_version:45251' => 1030, + 'old:virtual_from_version:45369' => 1461, + 'old:virtual_from_version:44761' => 1077, + 'old:virtual_from_version:47058' => 1580, + 'old:virtual_from_version:44038' => 1007, + 'old:virtual_from_version:45435' => 1070, + 'old:virtual_from_version:44874' => 1009, + 'old:virtual_from_version:46074' => 1172, + 'old:virtual_from_version:49344' => 1067, + 'old:virtual_from_version:46143' => 1070, + 'old:virtual_from_version:50191' => 1070, + 'old:virtual_from_version:42884' => 1109, + 'old:virtual_from_version:44448' => 1249, + 'old:virtual_from_version:46925' => 3008, + 'old:virtual_from_version:44979' => 1107, + 'old:virtual_from_version:40117' => 1100, + 'old:virtual_from_version:50613' => 3259, + 'old:virtual_from_version:47330' => 1070, + 'old:virtual_from_version:42901' => 1070, + 'old:virtual_from_version:46704' => 1697, + 'old:virtual_from_version:45989' => 1640, + 'old:virtual_from_version:45606' => 1009, + 'old:virtual_from_version:47036' => 1583, + 'old:virtual_from_version:47762' => 1666, + 'old:virtual_from_version:50059' => 3131, + 'old:virtual_from_version:44136' => 1077, + 'old:virtual_from_version:47993' => 1077, + 'old:virtual_from_version:46818' => 1172, + 'old:virtual_from_version:50335' => 1224, + 'old:virtual_from_version:42401' => 1077, + 'old:virtual_from_version:47246' => 1109, + 'old:virtual_from_version:49113' => 1649, + 'old:virtual_from_version:49675' => 1009, + 'old:virtual_from_version:42172' => 1009, + 'old:virtual_from_version:44304' => 1509, + 'old:virtual_from_version:39336' => 1158, + 'old:virtual_from_version:47328' => 1109, + 'old:virtual_from_version:42322' => 1404, + 'old:virtual_from_version:48007' => 2107, + 'old:virtual_from_version:47578' => 1109, + 'old:virtual_from_version:39715' => 1136, + 'old:virtual_from_version:45633' => 1077, + 'old:virtual_from_version:42829' => 1009, + 'old:virtual_from_version:44373' => 1064, + 'old:virtual_from_version:42887' => 1077, + 'old:virtual_from_version:45123' => 1009, + 'old:virtual_from_version:44334' => 1025, + 'old:virtual_from_version:42382' => 1009, + 'old:virtual_from_version:44793' => 1172, + 'old:virtual_from_version:50271' => 1025, + 'old:virtual_from_version:49941' => 1112, + 'old:virtual_from_version:45590' => 1172, + 'old:virtual_from_version:42263' => 1037, + 'old:virtual_from_version:50752' => 3259, + 'old:virtual_from_version:42063' => 1077, + 'old:virtual_from_version:50252' => 1150, + 'old:virtual_from_version:42410' => 1070, + 'old:virtual_from_version:42018' => 1125, + 'old:virtual_from_version:39710' => 1070, + 'old:virtual_from_version:44282' => 1109, + 'old:virtual_from_version:45392' => 1009, + 'old:virtual_from_version:46743' => 1077, + 'old:virtual_from_version:50202' => 1222, + 'old:virtual_from_version:38657' => 1128, + 'old:virtual_from_version:40498' => 1070, + 'old:virtual_from_version:47311' => 1037, + 'old:virtual_from_version:44391' => 1049, + 'old:virtual_from_version:42940' => 1077, + 'old:virtual_from_version:44078' => 1037, + 'old:virtual_from_version:47582' => 1666, + 'old:virtual_from_version:45078' => 1077, + 'old:virtual_from_version:44880' => 1009, + 'old:virtual_from_version:42352' => 1077, + 'old:virtual_from_version:46894' => 1125, + 'old:virtual_from_version:40486' => 1077, + 'old:virtual_from_version:49764' => 1070, + 'old:virtual_from_version:45578' => 1411, + 'old:virtual_from_version:47979' => 1109, + 'old:virtual_from_version:46863' => 1077, + 'old:virtual_from_version:46177' => 1070, + 'old:virtual_from_version:46412' => 1109, + 'old:virtual_from_version:44892' => 1077, + 'old:virtual_from_version:42616' => 1037, + 'old:virtual_from_version:49468' => 1696, + 'old:virtual_from_version:47663' => 1565, + 'old:virtual_from_version:50397' => 1070, + 'old:virtual_from_version:50067' => 1009, + 'old:virtual_from_version:44713' => 1077, + 'old:virtual_from_version:46858' => 1172, + 'old:virtual_from_version:45017' => 1090, + 'old:virtual_from_version:46234' => 1172, + 'old:virtual_from_version:47248' => 3020, + 'old:virtual_from_version:49686' => 1008, + 'old:virtual_from_version:45853' => 1077, + 'old:virtual_from_version:45151' => 1125, + 'old:virtual_from_version:49609' => 1587, + 'old:virtual_from_version:49357' => 3167, + 'old:virtual_from_version:50573' => 3259, + 'old:virtual_from_version:40780' => 1009, + 'old:virtual_from_version:46980' => 1172, + 'old:virtual_from_version:42066' => 1070, + 'old:virtual_from_version:49207' => 1077, + 'old:virtual_from_version:45774' => 1125, + 'old:virtual_from_version:40991' => 1404, + 'old:virtual_from_version:44737' => 1083, + 'old:virtual_from_version:42443' => 1077, + 'old:virtual_from_version:45887' => 1009, + 'old:virtual_from_version:40523' => 1070, + 'old:virtual_from_version:42466' => 1077, + 'old:virtual_from_version:45871' => 1125, + 'old:virtual_from_version:47952' => 1070, + 'old:virtual_from_version:49080' => 1110, + 'old:virtual_from_version:38345' => 1069, + 'old:virtual_from_version:47259' => 1070, + 'old:virtual_from_version:43025' => 2050, + 'old:virtual_from_version:43034' => 2033, + 'old:virtual_from_version:45419' => 1009, + 'old:virtual_from_version:49062' => 1070, + 'old:virtual_from_version:50069' => 3214, + 'old:virtual_from_version:40785' => 1070, + 'old:virtual_from_version:44569' => 1077, + 'old:virtual_from_version:46364' => 1533, + 'old:virtual_from_version:42340' => 1136, + 'old:virtual_from_version:40240' => 1077, + 'old:virtual_from_version:46324' => 1077, + 'old:virtual_from_version:46945' => 1070, + 'old:virtual_from_version:42543' => 1037, + 'old:virtual_from_version:46227' => 1172, + 'old:virtual_from_version:40781' => 1025, + 'old:virtual_from_version:40418' => 1067, + 'old:virtual_from_version:50417' => 3131, + 'old:virtual_from_version:47237' => 1077, + 'old:virtual_from_version:46547' => 1077, + 'old:virtual_from_version:39580' => 1085, + 'old:virtual_from_version:40463' => 1311, + 'old:virtual_from_version:40769' => 1125, + 'old:virtual_from_version:49484' => 3162, + 'old:virtual_from_version:45598' => 1070, + 'old:virtual_from_version:44767' => 1070, + 'old:virtual_from_version:45503' => 1077, + 'old:virtual_from_version:45252' => 1144, + 'old:virtual_from_version:43043' => 2022, + 'old:virtual_from_version:40544' => 1067, + 'old:virtual_from_version:49025' => 1077, + 'old:virtual_from_version:46693' => 1077, + 'old:virtual_from_version:46814' => 1070, + 'old:virtual_from_version:44676' => 1110, + 'old:virtual_from_version:42893' => 1077, + 'old:virtual_from_version:49502' => 1037, + 'old:virtual_from_version:50728' => 3262, + 'old:virtual_from_version:49283' => 3136, + 'old:virtual_from_version:44324' => 1006, + 'old:virtual_from_version:42076' => 1077, + 'old:virtual_from_version:49488' => 1125, + 'old:virtual_from_version:42091' => 1077, + 'old:virtual_from_version:45321' => 1009, + 'old:virtual_from_version:44119' => 1037, + 'old:virtual_from_version:40524' => 1091, + 'old:virtual_from_version:47649' => 1125, + 'old:virtual_from_version:42321' => 1109, + 'old:virtual_from_version:40774' => 1048, + 'old:virtual_from_version:39724' => 1108, + 'old:virtual_from_version:45299' => 1582, + 'old:virtual_from_version:42271' => 1025, + 'old:virtual_from_version:50636' => 1148, + 'old:virtual_from_version:42724' => 1037, + 'old:virtual_from_version:44280' => 1077, + 'old:virtual_from_version:45920' => 1633, + 'old:virtual_from_version:44916' => 1172, + 'old:virtual_from_version:45601' => 1141, + 'old:virtual_from_version:50062' => 3131, + 'old:virtual_from_version:46106' => 1397, + 'old:virtual_from_version:42402' => 1037, + 'old:virtual_from_version:47887' => 1038, + 'old:virtual_from_version:45707' => 1404, + 'old:virtual_from_version:49069' => 1077, + 'old:virtual_from_version:47200' => 1077, + 'old:virtual_from_version:45904' => 1062, + 'old:virtual_from_version:42425' => 1077, + 'old:virtual_from_version:42785' => 1083, + 'old:virtual_from_version:40959' => 1413, + 'old:virtual_from_version:44475' => 1037, + 'old:virtual_from_version:47511' => 1621, + 'old:virtual_from_version:40878' => 1009, + 'old:virtual_from_version:49921' => 3207, + 'old:virtual_from_version:50740' => 3266, + 'old:virtual_from_version:44978' => 1037, + 'old:virtual_from_version:50447' => 1007, + 'old:virtual_from_version:49372' => 1057, + 'old:virtual_from_version:47660' => 1051, + 'old:virtual_from_version:46952' => 1077, + 'old:virtual_from_version:46172' => 1070, + 'old:virtual_from_version:46287' => 1070, + 'old:virtual_from_version:10005' => 2004, + 'old:virtual_from_version:44492' => 1125, + 'old:virtual_from_version:50621' => 1417, + 'old:virtual_from_version:45062' => 1105, + 'old:virtual_from_version:49162' => 1404, + 'old:virtual_from_version:39886' => 1107, + 'old:virtual_from_version:46512' => 1489, + 'old:virtual_from_version:44332' => 1009, + 'old:virtual_from_version:46108' => 1107, + 'old:virtual_from_version:46845' => 1077, + 'old:virtual_from_version:47972' => 1532, + 'old:virtual_from_version:40326' => 1404, + 'old:virtual_from_version:42838' => 1032, + 'old:virtual_from_version:44257' => 1523, + 'old:virtual_from_version:50012' => 3131, + 'old:virtual_from_version:45760' => 1019, + 'old:virtual_from_version:45328' => 1009, + 'old:virtual_from_version:45810' => 1413, + 'old:virtual_from_version:46140' => 1172, + 'old:virtual_from_version:42125' => 1009, + 'old:virtual_from_version:46654' => 1537, + 'old:virtual_from_version:46616' => 1125, + 'old:virtual_from_version:49991' => 3131, + 'old:virtual_from_version:44252' => 1037, + 'old:virtual_from_version:46985' => 1689, + 'old:virtual_from_version:42729' => 1070, + 'old:virtual_from_version:50033' => 1125, + 'old:virtual_from_version:46192' => 1009, + 'old:virtual_from_version:49170' => 1070, + 'old:virtual_from_version:42181' => 1009, + 'old:virtual_from_version:49257' => 1070, + 'old:virtual_from_version:49952' => 1025, + 'old:virtual_from_version:44881' => 1077, + 'old:virtual_from_version:49890' => 1048, + 'old:virtual_from_version:40839' => 1070, + 'old:virtual_from_version:40755' => 1107, + 'old:virtual_from_version:49596' => 1005, + 'old:virtual_from_version:42320' => 1037, + 'old:virtual_from_version:45603' => 1136, + 'old:virtual_from_version:50286' => 1404, + 'old:virtual_from_version:44194' => 1125, + 'old:virtual_from_version:45434' => 1136, + 'old:virtual_from_version:47387' => 3008, + 'old:virtual_from_version:47496' => 1077, + 'old:virtual_from_version:46365' => 1070, + 'old:virtual_from_version:42184' => 1031, + 'old:virtual_from_version:49307' => 1070, + 'old:virtual_from_version:44505' => 1110, + 'old:virtual_from_version:50580' => 1150, + 'old:virtual_from_version:49548' => 1009, + 'old:virtual_from_version:45367' => 1107, + 'old:virtual_from_version:45315' => 1009, + 'old:virtual_from_version:42745' => 1009, + 'old:virtual_from_version:42134' => 1037, + 'old:virtual_from_version:49252' => 1077, + 'old:virtual_from_version:44776' => 1351, + 'old:virtual_from_version:45915' => 1070, + 'old:virtual_from_version:50295' => 1314, + 'old:virtual_from_version:40550' => 1070, + 'old:virtual_from_version:46317' => 1032, + 'old:virtual_from_version:47725' => 1070, + 'old:virtual_from_version:40923' => 1110, + 'old:virtual_from_version:45089' => 1070, + 'old:virtual_from_version:45341' => 1125, + 'old:virtual_from_version:49655' => 1583, + 'old:virtual_from_version:47188' => 1125, + 'old:virtual_from_version:45790' => 1005, + 'old:virtual_from_version:42033' => 1037, + 'old:virtual_from_version:50226' => 3227, + 'old:virtual_from_version:40800' => 1009, + 'old:virtual_from_version:4519 ' => 1054, + 'old:virtual_from_version:50117' => 1035, + 'old:virtual_from_version:46044' => 1070, + 'old:virtual_from_version:49960' => 1489, + 'old:virtual_from_version:40821' => 1025, + 'old:virtual_from_version:49302' => 1077, + 'old:virtual_from_version:40879' => 1077, + 'old:virtual_from_version:47687' => 1077, + 'old:virtual_from_version:46259' => 1070, + 'old:virtual_from_version:47434' => 1070, + 'old:virtual_from_version:49691' => 1583, + 'old:virtual_from_version:46283' => 1070, + 'old:virtual_from_version:42005' => 1077, + 'old:virtual_from_version:50111' => 1048, + 'old:virtual_from_version:40742' => 1009, + 'old:virtual_from_version:42484' => 1070, + 'old:virtual_from_version:49555' => 1051, + 'old:virtual_from_version:40720' => 1404, + 'old:virtual_from_version:46270' => 1666, + 'old:virtual_from_version:42001' => 1070, + 'old:virtual_from_version:44245' => 1521, + 'old:virtual_from_version:47448' => 1621, + 'old:virtual_from_version:49851' => 3203, + 'old:virtual_from_version:50593' => 1417, + 'old:virtual_from_version:42346' => 1112, + 'old:virtual_from_version:47513' => 1032, + 'old:virtual_from_version:45257' => 1107, + 'old:virtual_from_version:46089' => 1123, + 'old:virtual_from_version:44342' => 1037, + 'old:virtual_from_version:47247' => 1077, + 'old:virtual_from_version:49159' => 1404, + 'old:virtual_from_version:42194' => 1077, + 'old:virtual_from_version:47852' => 1584, + 'old:virtual_from_version:47274' => 1105, + 'old:virtual_from_version:49086' => 3094, + 'old:virtual_from_version:40660' => 1362, + 'old:virtual_from_version:46004' => 1000, + 'old:virtual_from_version:45244' => 1007, + 'old:virtual_from_version:44113' => 1105, + 'old:virtual_from_version:45580' => 1136, + 'old:virtual_from_version:44234' => 1037, + 'old:virtual_from_version:42014' => 1105, + 'old:virtual_from_version:50723' => 1417, + 'old:virtual_from_version:40530' => 1070, + 'old:virtual_from_version:42579' => 1110, + 'old:virtual_from_version:44721' => 1109, + 'old:virtual_from_version:49082' => 3094, + 'old:virtual_from_version:41012' => 2022, + 'old:virtual_from_version:50552' => 3264, + 'old:virtual_from_version:47011' => 3015, + 'old:virtual_from_version:42590' => 1172, + 'old:virtual_from_version:49996' => 3131, + 'old:virtual_from_version:49280' => 1404, + 'old:virtual_from_version:45274' => 1091, + 'old:virtual_from_version:50515' => 1057, + 'old:virtual_from_version:40845' => 1070, + 'old:virtual_from_version:44646' => 1025, + 'old:virtual_from_version:44982' => 1036, + 'old:virtual_from_version:47789' => 1583, + 'old:virtual_from_version:46416' => 1077, + 'old:virtual_from_version:44480' => 1125, + 'old:virtual_from_version:44640' => 1037, + 'old:virtual_from_version:47033' => 1077, + 'old:virtual_from_version:42440' => 1110, + 'old:virtual_from_version:44230' => 1125, + 'old:virtual_from_version:49749' => 1051, + 'old:virtual_from_version:50197' => 1105, + 'old:virtual_from_version:50660' => 1070, + 'old:virtual_from_version:49977' => 3212, + 'old:virtual_from_version:38678' => 1025, + 'old:virtual_from_version:47727' => 1051, + 'old:virtual_from_version:44896' => 1070, + 'old:virtual_from_version:42720' => 1070, + 'old:virtual_from_version:45557' => 1110, + 'old:virtual_from_version:47583' => 1689, + 'old:virtual_from_version:49925' => 1616, + 'old:virtual_from_version:47595' => 1070, + 'old:virtual_from_version:46358' => 1095, + 'old:virtual_from_version:45402' => 1029, + 'old:virtual_from_version:47750' => 1109, + 'old:virtual_from_version:47278' => 1125, + 'old:virtual_from_version:46340' => 1077, + 'old:virtual_from_version:46737' => 1067, + 'old:virtual_from_version:47343' => 1404, + 'old:virtual_from_version:45492' => 1077, + 'old:virtual_from_version:42465' => 1025, + 'old:virtual_from_version:44785' => 1077, + 'old:virtual_from_version:38383' => 1109, + 'old:virtual_from_version:42056' => 1009, + 'old:virtual_from_version:45348' => 1136, + 'old:virtual_from_version:45822' => 1077, + 'old:virtual_from_version:40602' => 1091, + 'old:virtual_from_version:50659' => 1033, + 'old:virtual_from_version:46260' => 1172, + 'old:virtual_from_version:42524' => 1070, + 'old:virtual_from_version:42963' => 1067, + 'old:virtual_from_version:46489' => 1112, + 'old:virtual_from_version:44751' => 1070, + 'old:virtual_from_version:47355' => 1621, + 'old:virtual_from_version:49510' => 1689, + 'old:virtual_from_version:46499' => 1489, + 'old:virtual_from_version:42740' => 1037, + 'old:virtual_from_version:44889' => 1077, + 'old:virtual_from_version:47697' => 1621, + 'old:virtual_from_version:40751' => 1067, + 'old:virtual_from_version:49061' => 3094, + 'old:virtual_from_version:40417' => 1404, + 'old:virtual_from_version:44018' => 1070, + 'old:virtual_from_version:49240' => 1077, + 'old:virtual_from_version:44504' => 1037, + 'old:virtual_from_version:38360' => 1042, + 'old:virtual_from_version:44137' => 1037, + 'old:virtual_from_version:46982' => 1583, + 'old:virtual_from_version:42844' => 1037, + 'old:virtual_from_version:50568' => 1025, + 'old:virtual_from_version:47577' => 1037, + 'old:virtual_from_version:44357' => 1172, + 'old:virtual_from_version:42994' => 1510, + 'old:virtual_from_version:49857' => 3194, + 'old:virtual_from_version:47538' => 1025, + 'old:virtual_from_version:50669' => 3208, + 'old:virtual_from_version:40207' => 1091, + 'old:virtual_from_version:44400' => 1144, + 'old:virtual_from_version:49563' => 1498, + 'old:virtual_from_version:45271' => 1067, + 'old:virtual_from_version:45497' => 1070, + 'old:virtual_from_version:45608' => 1077, + 'old:virtual_from_version:49794' => 1136, + 'old:virtual_from_version:49602' => 1070, + 'old:virtual_from_version:50143' => 3094, + 'old:virtual_from_version:50004' => 1314, + 'old:virtual_from_version:46300' => 1107, + 'old:virtual_from_version:46628' => 1568, + 'old:virtual_from_version:42619' => 1025, + 'old:virtual_from_version:45759' => 1009, + 'old:virtual_from_version:45205' => 1224, + 'old:virtual_from_version:46479' => 1321, + 'old:virtual_from_version:49804' => 1404, + 'old:virtual_from_version:50758' => 1417, + 'old:virtual_from_version:45599' => 1009, + 'old:virtual_from_version:42639' => 1070, + 'old:virtual_from_version:49811' => 1444, + 'old:virtual_from_version:49608' => 1070, + 'old:virtual_from_version:46883' => 1125, + 'old:virtual_from_version:41015' => 2024, + 'old:virtual_from_version:42086' => 1037, + 'old:virtual_from_version:50663' => 1417, + 'old:virtual_from_version:49909' => 3131, + 'old:virtual_from_version:46613' => 1613, + 'old:virtual_from_version:47155' => 1105, + 'old:virtual_from_version:50250' => 3131, + 'old:virtual_from_version:48011' => 2111, + 'old:virtual_from_version:47541' => 1125, + 'old:virtual_from_version:44472' => 1070, + 'old:virtual_from_version:49355' => 1689, + 'old:virtual_from_version:42077' => 1037, + 'old:virtual_from_version:47682' => 1070, + 'old:virtual_from_version:44174' => 1037, + 'old:virtual_from_version:45836' => 1397, + 'old:virtual_from_version:40962' => 1006, + 'old:virtual_from_version:40315' => 1091, + 'old:virtual_from_version:49855' => 1537, + 'old:virtual_from_version:45114' => 1077, + 'old:virtual_from_version:49863' => 1125, + 'old:virtual_from_version:49379' => 1077, + 'old:virtual_from_version:50000' => 1100, + 'old:virtual_from_version:45685' => 1019, + 'old:virtual_from_version:49813' => 3131, + 'old:virtual_from_version:46327' => 1070, + 'old:virtual_from_version:46120' => 1404, + 'old:virtual_from_version:42354' => 1067, + 'old:virtual_from_version:45713' => 1123, + 'old:virtual_from_version:44865' => 1172, + 'old:virtual_from_version:42333' => 1009, + 'old:virtual_from_version:44816' => 1172, + 'old:virtual_from_version:13397' => 1043, + 'old:virtual_from_version:50094' => 1136, + 'old:virtual_from_version:42148' => 1037, + 'old:virtual_from_version:49747' => 1158, + 'old:virtual_from_version:39478' => 1032, + 'old:virtual_from_version:44343' => 1062, + 'old:virtual_from_version:49527' => 1666, + 'old:virtual_from_version:47743' => 1109, + 'old:virtual_from_version:49604' => 1009, + 'old:virtual_from_version:40358' => 1332, + 'old:virtual_from_version:46374' => 1584, + 'old:virtual_from_version:47739' => 1070, + 'old:virtual_from_version:40239' => 1125, + 'old:virtual_from_version:47529' => 1077, + 'old:virtual_from_version:44303' => 1057, + 'old:virtual_from_version:47931' => 1109, + 'old:virtual_from_version:42736' => 1038, + 'old:virtual_from_version:47013' => 1007, + 'old:virtual_from_version:49672' => 1070, + 'old:virtual_from_version:45888' => 1025, + 'old:virtual_from_version:50602' => 1444, + 'old:virtual_from_version:49067' => 3137, + 'old:virtual_from_version:40545' => 1105, + 'old:virtual_from_version:50529' => 1362, + 'old:virtual_from_version:43052' => 2055, + 'old:virtual_from_version:46593' => 1037, + 'old:virtual_from_version:47375' => 1070, + 'old:virtual_from_version:45926' => 1077, + 'old:virtual_from_version:44921' => 1110, + 'old:virtual_from_version:42036' => 1413, + 'old:virtual_from_version:40522' => 1321, + 'old:virtual_from_version:45945' => 1077, + 'old:virtual_from_version:42499' => 1172, + 'old:virtual_from_version:50029' => 1125, + 'old:virtual_from_version:44088' => 1025, + 'old:virtual_from_version:44991' => 1019, + 'old:virtual_from_version:42312' => 1070, + 'old:virtual_from_version:44672' => 1070, + 'old:virtual_from_version:42035' => 1172, + 'old:virtual_from_version:49242' => 1615, + 'old:virtual_from_version:42972' => 1009, + 'old:virtual_from_version:44420' => 1031, + 'old:virtual_from_version:40353' => 1404, + 'old:virtual_from_version:40854' => 1048, + 'old:virtual_from_version:46723' => 1077, + 'old:virtual_from_version:49854' => 1105, + 'old:virtual_from_version:46827' => 1009, + 'old:virtual_from_version:42553' => 1070, + 'old:virtual_from_version:38953' => 1136, + 'old:virtual_from_version:44421' => 1036, + 'old:virtual_from_version:49975' => 3131, + 'old:virtual_from_version:42770' => 1009, + 'old:virtual_from_version:45820' => 1070, + 'old:virtual_from_version:46678' => 1125, + 'old:virtual_from_version:40727' => 1070, + 'old:virtual_from_version:42435' => 1009, + 'old:virtual_from_version:45752' => 1009, + 'old:virtual_from_version:44834' => 1402, + 'old:virtual_from_version:49765' => 1025, + 'old:virtual_from_version:47368' => 1362, + 'old:virtual_from_version:44515' => 1009, + 'old:virtual_from_version:42149' => 1110, + 'old:virtual_from_version:44855' => 1077, + 'old:virtual_from_version:49315' => 1070, + 'old:virtual_from_version:45734' => 1007, + 'old:virtual_from_version:42009' => 1067, + 'old:virtual_from_version:39125' => 1094, + 'old:virtual_from_version:40250' => 1025, + 'old:virtual_from_version:47261' => 1109, + 'old:virtual_from_version:49987' => 3120, + 'old:virtual_from_version:49190' => 1565, + 'old:virtual_from_version:38349' => 1025, + 'old:virtual_from_version:38557' => 1067, + 'old:virtual_from_version:42456' => 1041, + 'old:virtual_from_version:46651' => 1070, + 'old:virtual_from_version:47303' => 1037, + 'old:virtual_from_version:50065' => 1107, + 'old:virtual_from_version:49911' => 3206, + 'old:virtual_from_version:42501' => 1070, + 'old:virtual_from_version:46757' => 1125, + 'old:virtual_from_version:42734' => 1077, + 'old:virtual_from_version:46777' => 1404, + 'old:virtual_from_version:46994' => 1689, + 'old:virtual_from_version:49715' => 1689, + 'old:virtual_from_version:45733' => 1070, + 'old:virtual_from_version:45842' => 1009, + 'old:virtual_from_version:40744' => 1077, + 'old:virtual_from_version:43083' => 2080, + 'old:virtual_from_version:45946' => 1404, + 'old:virtual_from_version:45843' => 1025, + 'old:virtual_from_version:50281' => 1150, + 'old:virtual_from_version:46237' => 1035, + 'old:virtual_from_version:42721' => 1009, + 'old:virtual_from_version:47839' => 1621, + 'old:virtual_from_version:40350' => 1009, + 'old:virtual_from_version:40388' => 1048, + 'old:virtual_from_version:47422' => 1009, + 'old:virtual_from_version:44556' => 1070, + 'old:virtual_from_version:45373' => 1125, + 'old:virtual_from_version:50136' => 3131, + 'old:virtual_from_version:40621' => 1077, + 'old:virtual_from_version:47864' => 1584, + 'old:virtual_from_version:46123' => 1077, + 'old:virtual_from_version:40752' => 1000, + 'old:virtual_from_version:45715' => 1172, + 'old:virtual_from_version:44952' => 1009, + 'old:virtual_from_version:45326' => 1587, + 'old:virtual_from_version:45515' => 1580, + 'old:virtual_from_version:44188' => 1009, + 'old:virtual_from_version:44886' => 1070, + 'old:virtual_from_version:46265' => 1067, + 'old:virtual_from_version:49497' => 3178, + 'old:virtual_from_version:45688' => 1009, + 'old:virtual_from_version:47780' => 1109, + 'old:virtual_from_version:49507' => 1070, + 'old:virtual_from_version:47089' => 1077, + 'old:virtual_from_version:44068' => 1070, + 'old:virtual_from_version:50105' => 1032, + 'old:virtual_from_version:40940' => 1037, + 'old:virtual_from_version:49006' => 1584, + 'old:virtual_from_version:45051' => 1043, + 'old:virtual_from_version:40747' => 1009, + 'old:virtual_from_version:47410' => 3008, + 'old:virtual_from_version:47060' => 1070, + 'old:virtual_from_version:45110' => 1125, + 'old:virtual_from_version:50711' => 1417, + 'old:virtual_from_version:47172' => 1070, + 'old:virtual_from_version:40988' => 1077, + 'old:virtual_from_version:45604' => 1070, + 'old:virtual_from_version:47773' => 1565, + 'old:virtual_from_version:43035' => 2034, + 'old:virtual_from_version:47331' => 1125, + 'old:virtual_from_version:49946' => 1404, + 'old:virtual_from_version:49968' => 1585, + 'old:virtual_from_version:49559' => 1410, + 'old:virtual_from_version:44270' => 1070, + 'old:virtual_from_version:42299' => 1000, + 'old:virtual_from_version:44903' => 1077, + 'old:virtual_from_version:50291' => 3232, + 'old:virtual_from_version:44532' => 1070, + 'old:virtual_from_version:50327' => 1125, + 'old:virtual_from_version:50759' => 3259, + 'old:virtual_from_version:44431' => 1095, + 'old:virtual_from_version:46646' => 1062, + 'old:virtual_from_version:47227' => 1109, + 'old:virtual_from_version:44546' => 1009, + 'old:virtual_from_version:46465' => 1150, + 'old:virtual_from_version:45394' => 1009, + 'old:virtual_from_version:42071' => 1070, + 'old:virtual_from_version:50576' => 1006, + 'old:virtual_from_version:47935' => 3120, + 'old:virtual_from_version:46623' => 1125, + 'old:virtual_from_version:44679' => 1414, + 'old:virtual_from_version:46363' => 1077, + 'old:virtual_from_version:45776' => 1304, + 'old:virtual_from_version:42863' => 1070, + 'old:virtual_from_version:44181' => 1083, + 'old:virtual_from_version:42935' => 1077, + 'old:virtual_from_version:45405' => 1112, + 'old:virtual_from_version:47076' => 1070, + 'old:virtual_from_version:42085' => 1077, + 'old:virtual_from_version:44146' => 1077, + 'old:virtual_from_version:50750' => 1580, + 'old:virtual_from_version:46726' => 1583, + 'old:virtual_from_version:48016' => 2116, + 'old:virtual_from_version:44097' => 1037, + 'old:virtual_from_version:39051' => 1069, + 'old:virtual_from_version:49931' => 3206, + 'old:virtual_from_version:15751' => 1011, + 'old:virtual_from_version:45549' => 1009, + 'old:virtual_from_version:45070' => 1070, + 'old:virtual_from_version:47401' => 3008, + 'old:virtual_from_version:42306' => 1037, + 'old:virtual_from_version:42808' => 1077, + 'old:virtual_from_version:39513' => 1077, + 'old:virtual_from_version:45300' => 1125, + 'old:virtual_from_version:44709' => 1222, + 'old:virtual_from_version:49914' => 1100, + 'old:virtual_from_version:46572' => 1070, + 'old:virtual_from_version:44043' => 1125, + 'old:virtual_from_version:45621' => 1112, + 'old:virtual_from_version:44861' => 1172, + 'old:virtual_from_version:46971' => 1070, + 'old:virtual_from_version:49547' => 1105, + 'old:virtual_from_version:50630' => 1555, + 'old:virtual_from_version:46111' => 1070, + 'old:virtual_from_version:40907' => 1070, + 'old:virtual_from_version:45498' => 1125, + 'old:virtual_from_version:46626' => 1025, + 'old:virtual_from_version:47841' => 3108, + 'old:virtual_from_version:47920' => 1077, + 'old:virtual_from_version:46961' => 1070, + 'old:virtual_from_version:47942' => 1077, + 'old:virtual_from_version:49636' => 3185, + 'old:virtual_from_version:46007' => 1110, + 'old:virtual_from_version:46397' => 1048, + 'old:virtual_from_version:44449' => 1172, + 'old:virtual_from_version:49213' => 1009, + 'old:virtual_from_version:44044' => 1107, + 'old:virtual_from_version:48001' => 2102, + 'old:virtual_from_version:44802' => 1070, + 'old:virtual_from_version:44053' => 1009, + 'old:virtual_from_version:50300' => 1404, + 'old:virtual_from_version:50384' => 1314, + 'old:virtual_from_version:44644' => 1009, + 'old:virtual_from_version:49506' => 3179, + 'old:virtual_from_version:45107' => 1070, + 'old:virtual_from_version:47428' => 1037, + 'old:virtual_from_version:50456' => 1006, + 'old:virtual_from_version:45865' => 1070, + 'old:virtual_from_version:47066' => 3008, + 'old:virtual_from_version:49727' => 1070, + 'old:virtual_from_version:45778' => 1062, + 'old:virtual_from_version:49237' => 1077, + 'old:virtual_from_version:44377' => 1021, + 'old:virtual_from_version:47053' => 1107, + 'old:virtual_from_version:49537' => 1009, + 'old:virtual_from_version:49163' => 3151, + 'old:virtual_from_version:50208' => 3139, + 'old:virtual_from_version:45589' => 1057, + 'old:virtual_from_version:42288' => 1009, + 'old:virtual_from_version:42212' => 1070, + 'old:virtual_from_version:44467' => 1070, + 'old:virtual_from_version:45349' => 1413, + 'old:virtual_from_version:47631' => 1077, + 'old:virtual_from_version:44757' => 1136, + 'old:virtual_from_version:47801' => 1070, + 'old:virtual_from_version:23466' => 1076, + 'old:virtual_from_version:50058' => 1314, + 'old:virtual_from_version:44100' => 1025, + 'old:virtual_from_version:47751' => 1172, + 'old:virtual_from_version:44804' => 1077, + 'old:virtual_from_version:47891' => 1077, + 'old:virtual_from_version:49791' => 1006, + 'old:virtual_from_version:46696' => 1025, + 'old:virtual_from_version:45479' => 1172, + 'old:virtual_from_version:38748' => 1048, + 'old:virtual_from_version:47051' => 1070, + 'old:virtual_from_version:46649' => 1077, + 'old:virtual_from_version:47934' => 1689, + 'old:virtual_from_version:45821' => 1067, + 'old:virtual_from_version:42051' => 1077, + 'old:virtual_from_version:49092' => 3094, + 'old:virtual_from_version:47804' => 1109, + 'old:virtual_from_version:50097' => 3131, + 'old:virtual_from_version:45418' => 1069, + 'old:virtual_from_version:45295' => 1362, + 'old:virtual_from_version:38581' => 1091, + 'old:virtual_from_version:44803' => 1025, + 'old:virtual_from_version:42574' => 1037, + 'old:virtual_from_version:46937' => 2100, + 'old:virtual_from_version:44712' => 1009, + 'old:virtual_from_version:50687' => 3216, + 'old:virtual_from_version:49744' => 1532, + 'old:virtual_from_version:45629' => 1077, + 'old:virtual_from_version:42649' => 1484, + 'old:virtual_from_version:49271' => 1077, + 'old:virtual_from_version:49955' => 1659, + 'old:virtual_from_version:45986' => 1639, + 'old:virtual_from_version:42195' => 1037, + 'old:virtual_from_version:50198' => 1689, + 'old:virtual_from_version:46278' => 1009, + 'old:virtual_from_version:44428' => 1048, + 'old:virtual_from_version:49934' => 1078, + 'old:virtual_from_version:48009' => 2109, + 'old:virtual_from_version:45597' => 1136, + 'old:virtual_from_version:42881' => 1025, + 'old:virtual_from_version:46663' => 1070, + 'old:virtual_from_version:42658' => 1025, + 'old:virtual_from_version:46583' => 1077, + 'old:virtual_from_version:46751' => 1070, + 'old:virtual_from_version:49621' => 1125, + 'old:virtual_from_version:43012' => 2037, + 'old:virtual_from_version:50650' => 1172, + 'old:virtual_from_version:44575' => 1009, + 'old:virtual_from_version:50239' => 1489, + 'old:virtual_from_version:47491' => 1109, + 'old:virtual_from_version:47020' => 1461, + 'old:virtual_from_version:50246' => 3131, + 'old:virtual_from_version:40708' => 1081, + 'old:virtual_from_version:47180' => 1070, + 'old:virtual_from_version:40597' => 1070, + 'old:virtual_from_version:48041' => 2138, + 'old:virtual_from_version:42653' => 1025, + 'old:virtual_from_version:49105' => 3146, + 'old:virtual_from_version:42451' => 1438, + 'old:virtual_from_version:42411' => 1009, + 'old:virtual_from_version:49250' => 3159, + 'old:virtual_from_version:46907' => 3007, + 'old:virtual_from_version:40770' => 1025, + 'old:virtual_from_version:42417' => 1009, + 'old:virtual_from_version:43028' => 2028, + 'old:virtual_from_version:50536' => 1032, + 'old:virtual_from_version:50378' => 1172, + 'old:virtual_from_version:44072' => 1125, + 'old:virtual_from_version:50414' => 3227, + 'old:virtual_from_version:47950' => 1314, + 'old:virtual_from_version:42890' => 1070, + 'old:virtual_from_version:47666' => 1689, + 'old:virtual_from_version:47459' => 1109, + 'old:virtual_from_version:40686' => 1095, + 'old:virtual_from_version:49788' => 1100, + 'old:virtual_from_version:45077' => 1009, + 'old:virtual_from_version:46045' => 1109, + 'old:virtual_from_version:46087' => 1025, + 'old:virtual_from_version:49202' => 1125, + 'old:virtual_from_version:46891' => 1077, + 'old:virtual_from_version:47135' => 1532, + 'old:virtual_from_version:50578' => 3259, + 'old:virtual_from_version:40116' => 1172, + 'old:virtual_from_version:49777' => 1070, + 'old:virtual_from_version:50565' => 1689, + 'old:virtual_from_version:45757' => 1107, + 'old:virtual_from_version:46165' => 1532, + 'old:virtual_from_version:47668' => 1109, + 'old:virtual_from_version:42506' => 1025, + 'old:virtual_from_version:44773' => 1489, + 'old:virtual_from_version:50570' => 1489, + 'old:virtual_from_version:49581' => 1158, + 'old:virtual_from_version:45950' => 1626, + 'old:virtual_from_version:40482' => 1037, + 'old:virtual_from_version:42648' => 1484, + 'old:virtual_from_version:44794' => 1070, + 'old:virtual_from_version:49354' => 1532, + 'old:virtual_from_version:47376' => 1125, + 'old:virtual_from_version:45741' => 1621, + 'old:virtual_from_version:44851' => 1062, + 'old:virtual_from_version:49251' => 1070, + 'old:virtual_from_version:49214' => 1077, + 'old:virtual_from_version:40438' => 1009, + 'old:virtual_from_version:40757' => 1077, + 'old:virtual_from_version:38495' => 1091, + 'old:virtual_from_version:49524' => 1107, + 'old:virtual_from_version:45049' => 1062, + 'old:virtual_from_version:47501' => 1659, + 'old:virtual_from_version:46057' => 1070, + 'old:virtual_from_version:42684' => 1067, + 'old:virtual_from_version:49164' => 3152, + 'old:virtual_from_version:44544' => 1125, + 'old:virtual_from_version:50074' => 1125, + 'old:virtual_from_version:47397' => 1109, + 'old:virtual_from_version:45909' => 1077, + 'old:virtual_from_version:50584' => 3266, + 'old:virtual_from_version:49514' => 1070, + 'old:virtual_from_version:49638' => 1007, + 'old:virtual_from_version:50751' => 1689, + 'old:virtual_from_version:49367' => 3016, + 'old:virtual_from_version:50526' => 1007, + 'old:virtual_from_version:47745' => 1565, + 'old:virtual_from_version:47648' => 1070, + 'old:virtual_from_version:42280' => 1422, + 'old:virtual_from_version:49606' => 1070, + 'old:virtual_from_version:47184' => 1077, + 'old:virtual_from_version:44675' => 1037, + 'old:virtual_from_version:49262' => 1077, + 'old:virtual_from_version:50331' => 3239, + 'old:virtual_from_version:50077' => 3214, + 'old:virtual_from_version:45410' => 1533, + 'old:virtual_from_version:42526' => 1025, + 'old:virtual_from_version:45525' => 1077, + 'old:virtual_from_version:49392' => 1172, + 'old:virtual_from_version:45065' => 1000, + 'old:virtual_from_version:44998' => 1222, + 'old:virtual_from_version:47288' => 1134, + 'old:virtual_from_version:42315' => 1037, + 'old:virtual_from_version:40707' => 1109, + 'old:virtual_from_version:40571' => 1146, + 'old:virtual_from_version:40067' => 1077, + 'old:virtual_from_version:42168' => 1077, + 'old:virtual_from_version:45345' => 1381, + 'old:virtual_from_version:40958' => 1095, + 'old:virtual_from_version:44028' => 1125, + 'old:virtual_from_version:50622' => 3259, + 'old:virtual_from_version:46454' => 1012, + 'old:virtual_from_version:39546' => 1192, + 'old:virtual_from_version:42581' => 1461, + 'old:virtual_from_version:45280' => 1025, + 'old:virtual_from_version:45154' => 1012, + 'old:virtual_from_version:46787' => 1491, + 'old:virtual_from_version:44315' => 1081, + 'old:virtual_from_version:44481' => 1070, + 'old:virtual_from_version:43107' => 2099, + 'old:virtual_from_version:49847' => 1489, + 'old:virtual_from_version:50346' => 1007, + 'old:virtual_from_version:46016' => 1025, + 'old:virtual_from_version:49103' => 1649, + 'old:virtual_from_version:46991' => 1222, + 'old:virtual_from_version:44561' => 1009, + 'old:virtual_from_version:46778' => 1070, + 'old:virtual_from_version:49043' => 1009, + 'old:virtual_from_version:42201' => 1015, + 'old:virtual_from_version:47223' => 1109, + 'old:virtual_from_version:38369' => 1048, + 'old:virtual_from_version:45030' => 1069, + 'old:virtual_from_version:46197' => 1077, + 'old:virtual_from_version:49211' => 1070, + 'old:virtual_from_version:47190' => 1077, + 'old:virtual_from_version:40626' => 1091, + 'old:virtual_from_version:42982' => 1037, + 'old:virtual_from_version:47183' => 1109, + 'old:virtual_from_version:47412' => 1697, + 'old:virtual_from_version:40957' => 1048, + 'old:virtual_from_version:44022' => 1110, + 'old:virtual_from_version:45650' => 1070, + 'old:virtual_from_version:45158' => 1498, + 'old:virtual_from_version:40539' => 1109, + 'old:virtual_from_version:44226' => 1070, + 'old:virtual_from_version:50261' => 1136, + 'old:virtual_from_version:48013' => 2113, + 'old:virtual_from_version:40554' => 1077, + 'old:virtual_from_version:44577' => 1037, + 'old:virtual_from_version:49115' => 1125, + 'old:virtual_from_version:39228' => 1009, + 'old:virtual_from_version:47726' => 1125, + 'old:virtual_from_version:47882' => 1070, + 'old:virtual_from_version:49021' => 1077, + 'old:virtual_from_version:45624' => 1172, + 'old:virtual_from_version:49705' => 1410, + 'old:virtual_from_version:47679' => 1035, + 'old:virtual_from_version:42236' => 1420, + 'old:virtual_from_version:44602' => 1070, + 'old:virtual_from_version:45960' => 1070, + 'old:virtual_from_version:50396' => 3227, + 'old:virtual_from_version:42662' => 1070, + 'old:virtual_from_version:40631' => 1070, + 'old:virtual_from_version:46867' => 1070, + 'old:virtual_from_version:46895' => 1077, + 'old:virtual_from_version:46502' => 1583, + 'old:virtual_from_version:46509' => 1584, + 'old:virtual_from_version:46409' => 1537, + 'old:virtual_from_version:46056' => 1077, + 'old:virtual_from_version:50292' => 3233, + 'old:virtual_from_version:46922' => 1070, + 'old:virtual_from_version:49949' => 3131, + 'old:virtual_from_version:50672' => 3208, + 'old:virtual_from_version:47655' => 1077, + 'old:virtual_from_version:40930' => 1048, + 'old:virtual_from_version:50408' => 1584, + 'old:virtual_from_version:44049' => 1037, + 'old:virtual_from_version:44389' => 1112, + 'old:virtual_from_version:49631' => 1078, + 'old:virtual_from_version:40937' => 1134, + 'old:virtual_from_version:49490' => 1689, + 'old:virtual_from_version:42419' => 1037, + 'old:virtual_from_version:40380' => 1007, + 'old:virtual_from_version:45675' => 1555, + 'old:virtual_from_version:49665' => 3139, + 'old:virtual_from_version:47244' => 1125, + 'old:virtual_from_version:39180' => 1017, + 'old:virtual_from_version:42852' => 1067, + 'old:virtual_from_version:40580' => 1006, + 'old:virtual_from_version:38344' => 1009, + 'old:virtual_from_version:40217' => 1404, + 'old:virtual_from_version:50348' => 1224, + 'old:virtual_from_version:44624' => 1077, + 'old:virtual_from_version:47721' => 1109, + 'old:virtual_from_version:49378' => 1025, + 'old:virtual_from_version:49662' => 1125, + 'old:virtual_from_version:45215' => 1570, + 'old:virtual_from_version:42147' => 1077, + 'old:virtual_from_version:46900' => 1125, + 'old:virtual_from_version:46088' => 1077, + 'old:virtual_from_version:39858' => 1069, + 'old:virtual_from_version:50438' => 3191, + 'old:virtual_from_version:44498' => 1067, + 'old:virtual_from_version:38802' => 1132, + 'old:virtual_from_version:42078' => 1109, + 'old:virtual_from_version:42293' => 1037, + 'old:virtual_from_version:45512' => 1009, + 'old:virtual_from_version:44430' => 1067, + 'old:virtual_from_version:50263' => 1489, + 'old:virtual_from_version:50560' => 1489, + 'old:virtual_from_version:42674' => 1009, + 'old:virtual_from_version:49512' => 1070, + 'old:virtual_from_version:44047' => 1025, + 'old:virtual_from_version:45638' => 1046, + 'old:virtual_from_version:44125' => 1070, + 'old:virtual_from_version:46529' => 1125, + 'old:virtual_from_version:50089' => 3210, + 'old:virtual_from_version:47613' => 1109, + 'old:virtual_from_version:46788' => 1070, + 'old:virtual_from_version:46659' => 1694, + 'old:virtual_from_version:49742' => 1136, + 'old:virtual_from_version:47192' => 1125, + 'old:virtual_from_version:49452' => 1172, + 'old:virtual_from_version:45980' => 1520, + 'old:virtual_from_version:38461' => 1051, + 'old:virtual_from_version:42609' => 1077, + 'old:virtual_from_version:50385' => 1689, + 'old:virtual_from_version:39836' => 1009, + 'old:virtual_from_version:46820' => 1397, + 'old:virtual_from_version:46526' => 1172, + 'old:virtual_from_version:49249' => 1689, + 'old:virtual_from_version:40314' => 1078, + 'old:virtual_from_version:49592' => 1580, + 'old:virtual_from_version:50284' => 3223, + 'old:virtual_from_version:40763' => 1105, + 'old:virtual_from_version:40455' => 1105, + 'old:virtual_from_version:46048' => 1070, + 'old:virtual_from_version:50349' => 1006, + 'old:virtual_from_version:44866' => 1125, + 'old:virtual_from_version:49406' => 3157, + 'old:virtual_from_version:47477' => 1172, + 'old:virtual_from_version:42767' => 1070, + 'old:virtual_from_version:49862' => 1070, + 'old:virtual_from_version:49853' => 1070, + 'old:virtual_from_version:46915' => 1070, + 'old:virtual_from_version:47987' => 1067, + 'old:virtual_from_version:40714' => 1067, + 'old:virtual_from_version:45038' => 1021, + 'old:virtual_from_version:44755' => 1077, + 'old:virtual_from_version:49042' => 1105, + 'old:virtual_from_version:49034' => 1649, + 'old:virtual_from_version:46635' => 1125, + 'old:virtual_from_version:46597' => 1070, + 'old:virtual_from_version:12547' => 1125, + 'old:virtual_from_version:46662' => 1694, + 'old:virtual_from_version:47847' => 1037, + 'old:virtual_from_version:47163' => 1150, + 'old:virtual_from_version:45279' => 1009, + 'old:virtual_from_version:40827' => 1078, + 'old:virtual_from_version:42757' => 1110, + 'old:virtual_from_version:50106' => 3131, + 'old:virtual_from_version:44040' => 1025, + 'old:virtual_from_version:46438' => 1070, + 'old:virtual_from_version:47291' => 1048, + 'old:virtual_from_version:45489' => 1112, + 'old:virtual_from_version:43045' => 2002, + 'old:virtual_from_version:45452' => 1031, + 'old:virtual_from_version:49745' => 1689, + 'old:virtual_from_version:42985' => 1070, + 'old:virtual_from_version:46632' => 1070, + 'old:virtual_from_version:42894' => 1037, + 'old:virtual_from_version:42667' => 1488, + 'old:virtual_from_version:45379' => 1015, + 'old:virtual_from_version:49011' => 1077, + 'old:virtual_from_version:44901' => 1070, + 'old:virtual_from_version:29684' => 1089, + 'old:virtual_from_version:40822' => 1077, + 'old:virtual_from_version:49871' => 3131, + 'old:virtual_from_version:46349' => 1070, + 'old:virtual_from_version:45303' => 1565, + 'old:virtual_from_version:44908' => 1007, + 'old:virtual_from_version:40450' => 1105, + 'old:virtual_from_version:44849' => 1015, + 'old:virtual_from_version:50165' => 1006, + 'old:virtual_from_version:47580' => 1517, + 'old:virtual_from_version:40070' => 1025, + 'old:virtual_from_version:44460' => 1009, + 'old:virtual_from_version:44506' => 1067, + 'old:virtual_from_version:39343' => 1061, + 'old:virtual_from_version:50099' => 3221, + 'old:virtual_from_version:43101' => 2093, + 'old:virtual_from_version:49369' => 1070, + 'old:virtual_from_version:40768' => 1009, + 'old:virtual_from_version:42580' => 1456, + 'old:virtual_from_version:50431' => 3241, + 'old:virtual_from_version:47106' => 1584, + 'old:virtual_from_version:45698' => 1077, + 'old:virtual_from_version:49231' => 1070, + 'old:virtual_from_version:45775' => 1532, + 'old:virtual_from_version:47560' => 1048, + 'old:virtual_from_version:49762' => 3131, + 'old:virtual_from_version:44670' => 1037, + 'old:virtual_from_version:45111' => 1070, + 'old:virtual_from_version:40915' => 1037, + 'old:virtual_from_version:46383' => 1381, + 'old:virtual_from_version:42039' => 1077, + 'old:virtual_from_version:47193' => 1109, + 'old:virtual_from_version:49825' => 3131, + 'old:virtual_from_version:40381' => 1125, + 'old:virtual_from_version:41001' => 2013, + 'old:virtual_from_version:40656' => 1104, + 'old:virtual_from_version:42339' => 1067, + 'old:virtual_from_version:42883' => 1037, + 'old:virtual_from_version:49363' => 1077, + 'old:virtual_from_version:44187' => 1070, + 'old:virtual_from_version:42083' => 1037, + 'old:virtual_from_version:39893' => 1146, + 'old:virtual_from_version:43001' => 2020, + 'old:virtual_from_version:46599' => 1077, + 'old:virtual_from_version:44182' => 1083, + 'old:virtual_from_version:46150' => 1077, + 'old:virtual_from_version:50158' => 1689, + 'old:virtual_from_version:45075' => 1125, + 'old:virtual_from_version:45461' => 1009, + 'old:virtual_from_version:42702' => 1077, + 'old:virtual_from_version:42388' => 1000, + 'old:virtual_from_version:40202' => 1304, + 'old:virtual_from_version:42235' => 1037, + 'old:virtual_from_version:44211' => 1025, + 'old:virtual_from_version:39786' => 1125, + 'old:virtual_from_version:45260' => 1036, + 'old:virtual_from_version:49523' => 1070, + 'old:virtual_from_version:47416' => 1402, + 'old:virtual_from_version:44401' => 1007, + 'old:virtual_from_version:46382' => 1077, + 'old:virtual_from_version:49260' => 1532, + 'old:virtual_from_version:47626' => 3078, + 'old:virtual_from_version:49443' => 1689, + 'old:virtual_from_version:49200' => 1077, + 'old:virtual_from_version:42988' => 1037, + 'old:virtual_from_version:42048' => 1070, + 'old:virtual_from_version:50406' => 1150, + 'old:virtual_from_version:44069' => 1077, + 'old:virtual_from_version:46650' => 1537, + 'old:virtual_from_version:38330' => 1070, + 'old:virtual_from_version:49417' => 1689, + 'old:virtual_from_version:44862' => 1070, + 'old:virtual_from_version:50148' => 1032, + 'old:virtual_from_version:49858' => 1070, + 'old:virtual_from_version:42108' => 1070, + 'old:virtual_from_version:42497' => 1130, + 'old:virtual_from_version:40408' => 1404, + 'old:virtual_from_version:50760' => 3274, + 'old:virtual_from_version:50301' => 3131, + 'old:virtual_from_version:45602' => 1172, + 'old:virtual_from_version:49539' => 1489, + 'old:virtual_from_version:47019' => 1077, + 'old:virtual_from_version:46976' => 1070, + 'old:virtual_from_version:45550' => 1025, + 'old:virtual_from_version:45806' => 1077, + 'old:virtual_from_version:45336' => 1009, + 'old:virtual_from_version:46152' => 1077, + 'old:virtual_from_version:49266' => 1070, + 'old:virtual_from_version:50169' => 3201, + 'old:virtual_from_version:49711' => 1037, + 'old:virtual_from_version:46944' => 1077, + 'old:virtual_from_version:42924' => 1037, + 'old:virtual_from_version:42823' => 1077, + 'old:virtual_from_version:44432' => 1526, + 'old:virtual_from_version:50175' => 1314, + 'old:virtual_from_version:47082' => 1070, + 'old:virtual_from_version:47989' => 1077, + 'old:virtual_from_version:40710' => 1009, + 'old:virtual_from_version:45716' => 1107, + 'old:virtual_from_version:50766' => 1057, + 'old:virtual_from_version:49658' => 3189, + 'old:virtual_from_version:47156' => 1077, + 'old:virtual_from_version:42054' => 1048, + 'old:virtual_from_version:45762' => 1027, + 'old:virtual_from_version:47693' => 1077, + 'old:virtual_from_version:49963' => 3210, + 'old:virtual_from_version:42873' => 1505, + 'old:virtual_from_version:44625' => 1037, + 'old:virtual_from_version:49516' => 1580, + 'old:virtual_from_version:46780' => 1077, + 'old:virtual_from_version:47373' => 3008, + 'old:virtual_from_version:47879' => 1077, + 'old:virtual_from_version:45438' => 1136, + 'old:virtual_from_version:47825' => 1659, + 'old:virtual_from_version:47299' => 1125, + 'old:virtual_from_version:50596' => 3265, + 'old:virtual_from_version:44490' => 1037, + 'old:virtual_from_version:42519' => 1077, + 'old:virtual_from_version:42640' => 1009, + 'old:virtual_from_version:47790' => 3006, + 'old:virtual_from_version:40671' => 1025, + 'old:virtual_from_version:50036' => 3219, + 'old:virtual_from_version:44142' => 1110, + 'old:virtual_from_version:44538' => 1125, + 'old:virtual_from_version:44594' => 1009, + 'old:virtual_from_version:45350' => 1110, + 'old:virtual_from_version:44296' => 1107, + 'old:virtual_from_version:50078' => 3222, + 'old:virtual_from_version:44989' => 1015, + 'old:virtual_from_version:49556' => 1107, + 'old:virtual_from_version:42405' => 1070, + 'old:virtual_from_version:42559' => 1009, + 'old:virtual_from_version:45098' => 1110, + 'old:virtual_from_version:40894' => 1109, + 'old:virtual_from_version:45970' => 1009, + 'old:virtual_from_version:46009' => 1051, + 'old:virtual_from_version:49877' => 1150, + 'old:virtual_from_version:46799' => 1555, + 'old:virtual_from_version:42198' => 1037, + 'old:virtual_from_version:44833' => 1077, + 'old:virtual_from_version:47860' => 1001, + 'old:virtual_from_version:45732' => 1532, + 'old:virtual_from_version:46262' => 1517, + 'old:virtual_from_version:49817' => 3199, + 'old:virtual_from_version:44054' => 1025, + 'old:virtual_from_version:46005' => 1078, + 'old:virtual_from_version:50633' => 3192, + 'old:virtual_from_version:40847' => 1037, + 'old:virtual_from_version:49842' => 3003, + 'old:virtual_from_version:49464' => 1070, + 'old:virtual_from_version:45340' => 1136, + 'old:virtual_from_version:42174' => 1037, + 'old:virtual_from_version:44600' => 1498, + 'old:virtual_from_version:42308' => 1070, + 'old:virtual_from_version:40818' => 1067, + 'old:virtual_from_version:42696' => 1077, + 'old:virtual_from_version:49823' => 1621, + 'old:virtual_from_version:50749' => 1417, + 'old:virtual_from_version:49852' => 3200, + 'old:virtual_from_version:42257' => 1025, + 'old:virtual_from_version:50163' => 1070, + 'old:virtual_from_version:46590' => 1070, + 'old:virtual_from_version:47423' => 1077, + 'old:virtual_from_version:45309' => 1009, + 'old:virtual_from_version:46239' => 1659, + 'old:virtual_from_version:47272' => 1070, + 'old:virtual_from_version:45725' => 1077, + 'old:virtual_from_version:45399' => 1125, + 'old:virtual_from_version:46251' => 1077, + 'old:virtual_from_version:45642' => 1107, + 'old:virtual_from_version:47742' => 1070, + 'old:virtual_from_version:47057' => 1444, + 'old:virtual_from_version:50258' => 1532, + 'old:virtual_from_version:25148' => 1049, + 'old:virtual_from_version:43100' => 2092, + 'old:virtual_from_version:50767' => 1057, + 'old:virtual_from_version:40565' => 1222, + 'old:virtual_from_version:47351' => 1404, + 'old:virtual_from_version:49422' => 1689, + 'old:virtual_from_version:49181' => 1585, + 'old:virtual_from_version:46719' => 1007, + 'old:virtual_from_version:44790' => 1070, + 'old:virtual_from_version:44677' => 1067, + 'old:virtual_from_version:49486' => 1025, + 'old:virtual_from_version:49674' => 1067, + 'old:virtual_from_version:50120' => 1172, + 'old:virtual_from_version:46974' => 1689, + 'old:virtual_from_version:46797' => 1025, + 'old:virtual_from_version:49020' => 1070, + 'old:virtual_from_version:42752' => 1023, + 'old:virtual_from_version:50008' => 1070, + 'old:virtual_from_version:42395' => 1070, + 'old:virtual_from_version:44364' => 1091, + 'old:virtual_from_version:49861' => 3131, + 'old:virtual_from_version:46903' => 1689, + 'old:virtual_from_version:49246' => 1077, + 'old:virtual_from_version:50572' => 3214, + 'old:virtual_from_version:47753' => 1517, + 'old:virtual_from_version:47292' => 1109, + 'old:virtual_from_version:45390' => 1362, + 'old:virtual_from_version:50641' => 1417, + 'old:virtual_from_version:40858' => 1077, + 'old:virtual_from_version:45766' => 1401, + 'old:virtual_from_version:46701' => 1070, + 'old:virtual_from_version:50363' => 3131, + 'old:virtual_from_version:44397' => 1063, + 'old:virtual_from_version:42276' => 1070, + 'old:virtual_from_version:44615' => 1025, + 'old:virtual_from_version:45935' => 1404, + 'old:virtual_from_version:47777' => 1125, + 'old:virtual_from_version:38984' => 1067, + 'old:virtual_from_version:45484' => 1532, + 'old:virtual_from_version:46604' => 1006, + 'old:virtual_from_version:44347' => 1077, + 'old:virtual_from_version:46407' => 1077, + 'old:virtual_from_version:40553' => 1007, + 'old:virtual_from_version:40777' => 1404, + 'old:virtual_from_version:42314' => 1077, + 'old:virtual_from_version:44551' => 1037, + 'old:virtual_from_version:49567' => 1402, + 'old:virtual_from_version:39002' => 1104, + 'old:virtual_from_version:44685' => 1037, + 'old:virtual_from_version:49729' => 1489, + 'old:virtual_from_version:42814' => 1009, + 'old:virtual_from_version:49230' => 3157, + 'old:virtual_from_version:40801' => 1077, + 'old:virtual_from_version:42965' => 1009, + 'old:virtual_from_version:40798' => 1107, + 'old:virtual_from_version:38377' => 1007, + 'old:virtual_from_version:40682' => 1404, + 'old:virtual_from_version:48022' => 2122, + 'old:virtual_from_version:49558' => 1009, + 'old:virtual_from_version:50052' => 1070, + 'old:virtual_from_version:42191' => 1077, + 'old:virtual_from_version:42143' => 1222, + 'old:virtual_from_version:49009' => 1125, + 'old:virtual_from_version:46758' => 1109, + 'old:virtual_from_version:42637' => 1484, + 'old:virtual_from_version:44090' => 1037, + 'old:virtual_from_version:47349' => 1172, + 'old:virtual_from_version:45354' => 1009, + 'old:virtual_from_version:46366' => 1077, + 'old:virtual_from_version:50696' => 1417, + 'old:virtual_from_version:50628' => 1417, + 'old:virtual_from_version:39798' => 1237, + 'old:virtual_from_version:47170' => 3032, + 'old:virtual_from_version:42811' => 1081, + 'old:virtual_from_version:40659' => 1035, + 'old:virtual_from_version:45891' => 1070, + 'old:virtual_from_version:45282' => 1115, + 'old:virtual_from_version:47572' => 1444, + 'old:virtual_from_version:46559' => 1574, + 'old:virtual_from_version:45146' => 1567, + 'old:virtual_from_version:50241' => 3131, + 'old:virtual_from_version:42088' => 1077, + 'old:virtual_from_version:49633' => 1404, + 'old:virtual_from_version:44541' => 1025, + 'old:virtual_from_version:42554' => 1009, + 'old:virtual_from_version:49805' => 1621, + 'old:virtual_from_version:46274' => 1025, + 'old:virtual_from_version:42533' => 1037, + 'old:virtual_from_version:42349' => 1091, + 'old:virtual_from_version:47239' => 1070, + 'old:virtual_from_version:49973' => 1689, + 'old:virtual_from_version:47685' => 1109, + 'old:virtual_from_version:47045' => 1070, + 'old:virtual_from_version:47407' => 1109, + 'old:virtual_from_version:47571' => 1077, + 'old:virtual_from_version:47099' => 1077, + 'old:virtual_from_version:47654' => 1109, + 'old:virtual_from_version:46214' => 1077, + 'old:virtual_from_version:42833' => 1062, + 'old:virtual_from_version:38703' => 1081, + 'old:virtual_from_version:47341' => 1109, + 'old:virtual_from_version:49039' => 1125, + 'old:virtual_from_version:46703' => 1077, + 'old:virtual_from_version:49023' => 1070, + 'old:virtual_from_version:50632' => 3259, + 'old:virtual_from_version:42341' => 1070, + 'old:virtual_from_version:45637' => 1136, + 'old:virtual_from_version:45811' => 1532, + 'old:virtual_from_version:49368' => 3139, + 'old:virtual_from_version:47623' => 1109, + 'old:virtual_from_version:45587' => 1077, + 'old:virtual_from_version:42218' => 1070, + 'old:virtual_from_version:47086' => 1070, + 'old:virtual_from_version:44002' => 1009, + 'old:virtual_from_version:45939' => 1397, + 'old:virtual_from_version:50367' => 1125, + 'old:virtual_from_version:29976' => 1009, + 'old:virtual_from_version:39976' => 1257, + 'old:virtual_from_version:44838' => 1488, + 'old:virtual_from_version:38370' => 1067, + 'old:virtual_from_version:49500' => 1070, + 'old:virtual_from_version:40508' => 1037, + 'old:virtual_from_version:49967' => 1583, + 'old:virtual_from_version:40527' => 1070, + 'old:virtual_from_version:45483' => 1077, + 'old:virtual_from_version:49859' => 1125, + 'old:virtual_from_version:38364' => 1001, + 'old:virtual_from_version:49153' => 1689, + 'old:virtual_from_version:46795' => 1125, + 'old:virtual_from_version:44557' => 1009, + 'old:virtual_from_version:49532' => 1689, + 'old:virtual_from_version:49513' => 1125, + 'old:virtual_from_version:46332' => 1172, + 'old:virtual_from_version:50403' => 3131, + 'old:virtual_from_version:46672' => 1125, + 'old:virtual_from_version:39038' => 1142, + 'old:virtual_from_version:44349' => 1067, + 'old:virtual_from_version:45541' => 1404, + 'old:virtual_from_version:40616' => 1172, + 'old:virtual_from_version:49366' => 1585, + 'old:virtual_from_version:40999' => 1110, + 'old:virtual_from_version:46540' => 1070, + 'old:virtual_from_version:40504' => 1070, + 'old:virtual_from_version:47178' => 1101, + 'old:virtual_from_version:50609' => 1067, + 'old:virtual_from_version:44723' => 1537, + 'old:virtual_from_version:49245' => 1015, + 'old:virtual_from_version:46963' => 1077, + 'old:virtual_from_version:42583' => 1070, + 'old:virtual_from_version:50588' => 3194, + 'old:virtual_from_version:45225' => 1444, + 'old:virtual_from_version:40982' => 1037, + 'old:virtual_from_version:45987' => 1639, + 'old:virtual_from_version:50230' => 1070, + 'old:virtual_from_version:45826' => 1070, + 'old:virtual_from_version:39291' => 1076, + 'old:virtual_from_version:45426' => 1037, + 'old:virtual_from_version:47083' => 1125, + 'old:virtual_from_version:47069' => 1125, + 'old:virtual_from_version:42841' => 1025, + 'old:virtual_from_version:40987' => 1070, + 'old:virtual_from_version:44020' => 1077, + 'old:virtual_from_version:43092' => 2084, + 'old:virtual_from_version:45830' => 1112, + 'old:virtual_from_version:42111' => 1070, + 'old:virtual_from_version:45849' => 1070, + 'old:virtual_from_version:44968' => 1136, + 'old:virtual_from_version:40809' => 1009, + 'old:virtual_from_version:46665' => 1070, + 'old:virtual_from_version:42505' => 1023, + 'old:virtual_from_version:47009' => 1070, + 'old:virtual_from_version:42316' => 1136, + 'old:virtual_from_version:47055' => 1172, + 'old:virtual_from_version:44000' => 1125, + 'old:virtual_from_version:47354' => 1077, + 'old:virtual_from_version:42414' => 1105, + 'old:virtual_from_version:44686' => 1311, + 'old:virtual_from_version:47612' => 1125, + 'old:virtual_from_version:47289' => 1070, + 'old:virtual_from_version:45286' => 1404, + 'old:virtual_from_version:50187' => 1580, + 'old:virtual_from_version:50066' => 1172, + 'old:virtual_from_version:49123' => 1012, + 'old:virtual_from_version:40841' => 1025, + 'old:virtual_from_version:39350' => 1062, + 'old:virtual_from_version:44835' => 1381, + 'old:virtual_from_version:46862' => 1172, + 'old:virtual_from_version:44330' => 1107, + 'old:virtual_from_version:45917' => 1001, + 'old:virtual_from_version:46491' => 1568, + 'old:virtual_from_version:44772' => 1077, + 'old:virtual_from_version:45943' => 1070, + 'old:virtual_from_version:47803' => 1048, + 'old:virtual_from_version:45469' => 1025, + 'old:virtual_from_version:40387' => 1081, + 'old:virtual_from_version:50599' => 1125, + 'old:virtual_from_version:40462' => 1311, + 'old:virtual_from_version:50520' => 1311, + 'old:virtual_from_version:42185' => 1037, + 'old:virtual_from_version:38608' => 1110, + 'old:virtual_from_version:50060' => 1125, + 'old:virtual_from_version:42990' => 1077, + 'old:virtual_from_version:44363' => 1078, + 'old:virtual_from_version:47913' => 1070, + 'old:virtual_from_version:45290' => 1578, + 'old:virtual_from_version:46027' => 1070, + 'old:virtual_from_version:49295' => 1077, + 'old:virtual_from_version:42418' => 1077, + 'old:virtual_from_version:46815' => 1077, + 'old:virtual_from_version:42538' => 1025, + 'old:virtual_from_version:50433' => 1401, + 'old:virtual_from_version:47568' => 1125, + 'old:virtual_from_version:40275' => 1019, + 'old:virtual_from_version:44227' => 1077, + 'old:virtual_from_version:49509' => 1037, + 'old:virtual_from_version:39155' => 1067, + 'old:virtual_from_version:49886' => 1488, + 'old:virtual_from_version:49267' => 1077, + 'old:virtual_from_version:44474' => 1077, + 'old:virtual_from_version:44576' => 1077, + 'old:virtual_from_version:49375' => 1656, + 'old:virtual_from_version:47522' => 1537, + 'old:virtual_from_version:45546' => 1136, + 'old:virtual_from_version:46040' => 1488, + 'old:virtual_from_version:49081' => 1555, + 'old:virtual_from_version:39366' => 1017, + 'old:virtual_from_version:39536' => 1112, + 'old:virtual_from_version:44281' => 1037, + 'old:virtual_from_version:40992' => 1107, + 'old:virtual_from_version:42266' => 1037, + 'old:virtual_from_version:46813' => 1666, + 'old:virtual_from_version:39595' => 1084, + 'old:virtual_from_version:50054' => 1025, + 'old:virtual_from_version:42307' => 1110, + 'old:virtual_from_version:49104' => 3136, + 'old:virtual_from_version:45982' => 1638, + 'old:virtual_from_version:45064' => 1125, + 'old:virtual_from_version:50339' => 3236, + 'old:virtual_from_version:49168' => 1070, + 'old:virtual_from_version:42365' => 1037, + 'old:virtual_from_version:45690' => 1621, + 'old:virtual_from_version:42110' => 1037, + 'old:virtual_from_version:49769' => 1078, + 'old:virtual_from_version:44597' => 1110, + 'old:virtual_from_version:46851' => 1077, + 'old:virtual_from_version:44553' => 1070, + 'old:virtual_from_version:44248' => 1009, + 'old:virtual_from_version:49820' => 1100, + 'old:virtual_from_version:44997' => 1172, + 'old:virtual_from_version:44178' => 1438, + 'old:virtual_from_version:45657' => 1076, + 'old:virtual_from_version:46546' => 1125, + 'old:virtual_from_version:44700' => 1070, + 'old:virtual_from_version:49004' => 1532, + 'old:virtual_from_version:42661' => 1067, + 'old:virtual_from_version:46142' => 1077, + 'old:virtual_from_version:38786' => 1104, + 'old:virtual_from_version:42672' => 1489, + 'old:virtual_from_version:49803' => 1070, + 'old:virtual_from_version:44619' => 1110, + 'old:virtual_from_version:43085' => 2082, + 'old:virtual_from_version:42801' => 1057, + 'old:virtual_from_version:40561' => 1067, + 'old:virtual_from_version:47551' => 1109, + 'old:virtual_from_version:49203' => 1107, + 'old:virtual_from_version:44486' => 1070, + 'old:virtual_from_version:49573' => 1659, + 'old:virtual_from_version:47585' => 1070, + 'old:virtual_from_version:38355' => 1108, + 'old:virtual_from_version:46436' => 1067, + 'old:virtual_from_version:49133' => 3137, + 'old:virtual_from_version:46560' => 1689, + 'old:virtual_from_version:44520' => 1048, + 'old:virtual_from_version:46960' => 1077, + 'old:virtual_from_version:42544' => 1110, + 'old:virtual_from_version:49269' => 1025, + 'old:virtual_from_version:46467' => 1321, + 'old:virtual_from_version:49849' => 1537, + 'old:virtual_from_version:46394' => 1582, + 'old:virtual_from_version:50100' => 3221, + 'old:virtual_from_version:43075' => 2073, + 'old:virtual_from_version:46180' => 1404, + 'old:virtual_from_version:42415' => 1107, + 'old:virtual_from_version:50342' => 1224, + 'old:virtual_from_version:50714' => 1417, + 'old:virtual_from_version:45918' => 1077, + 'old:virtual_from_version:49322' => 1649, + 'old:virtual_from_version:50023' => 3131, + 'old:virtual_from_version:44754' => 1025, + 'old:virtual_from_version:43027' => 2052, + 'old:virtual_from_version:50224' => 3016, + 'old:virtual_from_version:40852' => 1077, + 'old:virtual_from_version:42007' => 1110, + 'old:virtual_from_version:46015' => 1009, + 'old:virtual_from_version:13578' => 1032, + 'old:virtual_from_version:49750' => 1112, + 'old:virtual_from_version:42492' => 1125, + 'old:virtual_from_version:46323' => 1070, + 'old:virtual_from_version:44025' => 1037, + 'old:virtual_from_version:49550' => 1574, + 'old:virtual_from_version:49600' => 1095, + 'old:virtual_from_version:47458' => 1125, + 'old:virtual_from_version:46561' => 1070, + 'old:virtual_from_version:44871' => 1498, + 'old:virtual_from_version:49760' => 3002, + 'old:virtual_from_version:44595' => 1077, + 'old:virtual_from_version:46588' => 1077, + 'old:virtual_from_version:45375' => 1009, + 'old:virtual_from_version:46188' => 1649, + 'old:virtual_from_version:49783' => 1659, + 'old:virtual_from_version:50009' => 1314, + 'old:virtual_from_version:47543' => 1077, + 'old:virtual_from_version:45488' => 1107, + 'old:virtual_from_version:42756' => 1109, + 'old:virtual_from_version:39727' => 1224, + 'old:virtual_from_version:49832' => 1689, + 'old:virtual_from_version:40701' => 1077, + 'old:virtual_from_version:45890' => 1506, + 'old:virtual_from_version:45932' => 1077, + 'old:virtual_from_version:46209' => 1077, + 'old:virtual_from_version:44821' => 1077, + 'old:virtual_from_version:49079' => 1070, + 'old:virtual_from_version:44996' => 1017, + 'old:virtual_from_version:50266' => 1105, + 'old:virtual_from_version:46957' => 1007, + 'old:virtual_from_version:44518' => 1037, + 'old:virtual_from_version:40249' => 1009, + 'old:virtual_from_version:45736' => 1109, + 'old:virtual_from_version:46325' => 1404, + 'old:virtual_from_version:50734' => 1404, + 'old:virtual_from_version:50666' => 3259, + 'old:virtual_from_version:50064' => 1125, + 'old:virtual_from_version:44777' => 1353, + 'old:virtual_from_version:45902' => 1038, + 'old:virtual_from_version:47968' => 1125, + 'old:virtual_from_version:40516' => 1070, + 'old:virtual_from_version:50458' => 1489, + 'old:virtual_from_version:13323' => 1010, + 'old:virtual_from_version:50034' => 3131, + 'old:virtual_from_version:45947' => 1627, + 'old:virtual_from_version:50013' => 3215, + 'old:virtual_from_version:46432' => 1136, + 'old:virtual_from_version:46284' => 1077, + 'old:virtual_from_version:44920' => 1009, + 'old:virtual_from_version:42748' => 1110, + 'old:virtual_from_version:50159' => 3131, + 'old:virtual_from_version:41011' => 2022, + 'old:virtual_from_version:44336' => 1037, + 'old:virtual_from_version:42104' => 1070, + 'old:virtual_from_version:42371' => 1037, + 'old:virtual_from_version:47395' => 1125, + 'old:virtual_from_version:49661' => 1070, + 'old:virtual_from_version:49463' => 1423, + 'old:virtual_from_version:45825' => 1626, + 'old:virtual_from_version:46881' => 1689, + 'old:virtual_from_version:39019' => 1016, + 'old:virtual_from_version:40863' => 1037, + 'old:virtual_from_version:42861' => 1136, + 'old:virtual_from_version:47189' => 1109, + 'old:virtual_from_version:50249' => 3131, + 'old:virtual_from_version:49874' => 1100, + 'old:virtual_from_version:50715' => 3259, + 'old:virtual_from_version:47240' => 1136, + 'old:virtual_from_version:40906' => 1037, + 'old:virtual_from_version:49700' => 1070, + 'old:virtual_from_version:50309' => 1067, + 'old:virtual_from_version:38546' => 1025, + 'old:virtual_from_version:45264' => 1095, + 'old:virtual_from_version:44688' => 1009, + 'old:virtual_from_version:45988' => 1362, + 'old:virtual_from_version:42420' => 1404, + 'old:virtual_from_version:44383' => 1031, + 'old:virtual_from_version:47929' => 1362, + 'old:virtual_from_version:49334' => 1037, + 'old:virtual_from_version:50625' => 1128, + 'old:virtual_from_version:40592' => 1077, + 'old:virtual_from_version:50114' => 1689, + 'old:virtual_from_version:44161' => 1077, + 'old:virtual_from_version:50225' => 3131, + 'old:virtual_from_version:49743' => 1404, + 'old:virtual_from_version:44629' => 1082, + 'old:virtual_from_version:50569' => 1404, + 'old:virtual_from_version:42151' => 1009, + 'old:virtual_from_version:45024' => 1006, + 'old:virtual_from_version:42043' => 1070, + 'old:virtual_from_version:42768' => 1006, + 'old:virtual_from_version:39612' => 1035, + 'old:virtual_from_version:48005' => 2106, + 'old:virtual_from_version:49819' => 1070, + 'old:virtual_from_version:46272' => 1136, + 'old:virtual_from_version:42575' => 1172, + 'old:virtual_from_version:44037' => 1070, + 'old:virtual_from_version:49493' => 1105, + 'old:virtual_from_version:47986' => 1109, + 'old:virtual_from_version:49880' => 1070, + 'old:virtual_from_version:41010' => 2021, + 'old:virtual_from_version:50360' => 3131, + 'old:virtual_from_version:45616' => 1077, + 'old:virtual_from_version:42227' => 1037, + 'old:virtual_from_version:47875' => 1037, + 'old:virtual_from_version:46771' => 1077, + 'old:virtual_from_version:44011' => 1016, + 'old:virtual_from_version:50332' => 1076, + 'old:virtual_from_version:44992' => 1067, + 'old:virtual_from_version:48006' => 2105, + 'old:virtual_from_version:45609' => 1404, + 'old:virtual_from_version:49646' => 1070, + 'old:virtual_from_version:42272' => 1077, + 'old:virtual_from_version:43037' => 2036, + 'old:virtual_from_version:40741' => 1070, + 'old:virtual_from_version:42485' => 1009, + 'old:virtual_from_version:42735' => 1037, + 'old:virtual_from_version:44974' => 1144, + 'old:virtual_from_version:45521' => 1580, + 'old:virtual_from_version:50386' => 3131, + 'old:virtual_from_version:42038' => 1009, + 'old:virtual_from_version:44981' => 1048, + 'old:virtual_from_version:42551' => 1172, + 'old:virtual_from_version:49239' => 1070, + 'old:virtual_from_version:44954' => 1077, + 'old:virtual_from_version:47871' => 1314, + 'old:virtual_from_version:44844' => 1070, + 'old:virtual_from_version:50381' => 1049, + 'old:virtual_from_version:44847' => 1070, + 'old:virtual_from_version:50317' => 3236, + 'old:virtual_from_version:45874' => 1077, + 'old:virtual_from_version:49409' => 1067, + 'old:virtual_from_version:49197' => 1517, + 'old:virtual_from_version:47467' => 1070, + 'old:virtual_from_version:42851' => 1037, + 'old:virtual_from_version:40541' => 1070, + 'old:virtual_from_version:49582' => 3119, + 'old:virtual_from_version:46647' => 1070, + 'old:virtual_from_version:50623' => 1033, + 'old:virtual_from_version:47273' => 1109, + 'old:virtual_from_version:46024' => 1070, + 'old:virtual_from_version:40735' => 1025, + 'old:virtual_from_version:46157' => 1070, + 'old:virtual_from_version:49748' => 1070, + 'old:virtual_from_version:45664' => 1019, + 'old:virtual_from_version:42586' => 1077, + 'old:virtual_from_version:49519' => 1125, + 'old:virtual_from_version:50172' => 1070, + 'old:virtual_from_version:44454' => 1529, + 'old:virtual_from_version:44626' => 1070, + 'old:virtual_from_version:45571' => 1105, + 'old:virtual_from_version:44493' => 1107, + 'old:virtual_from_version:50204' => 3131, + 'old:virtual_from_version:49495' => 1689, + 'old:virtual_from_version:50216' => 3131, + 'old:virtual_from_version:50684' => 1689, + 'old:virtual_from_version:47260' => 1125, + 'old:virtual_from_version:40764' => 1046, + 'old:virtual_from_version:40874' => 1077, + 'old:virtual_from_version:42480' => 1077, + 'old:virtual_from_version:50152' => 3131, + 'old:virtual_from_version:45021' => 1063, + 'old:virtual_from_version:42717' => 1077, + 'old:virtual_from_version:47062' => 1077, + 'old:virtual_from_version:49398' => 1070, + 'old:virtual_from_version:42303' => 1125, + 'old:virtual_from_version:13209' => 1061, + 'old:virtual_from_version:50527' => 1070, + 'old:virtual_from_version:46602' => 1125, + 'old:virtual_from_version:46744' => 1555, + 'old:virtual_from_version:40943' => 1037, + 'old:virtual_from_version:40939' => 1077, + 'old:virtual_from_version:44990' => 1090, + 'old:virtual_from_version:47932' => 1067, + 'old:virtual_from_version:42373' => 1105, + 'old:virtual_from_version:46522' => 1070, + 'old:virtual_from_version:38929' => 1061, + 'old:virtual_from_version:47325' => 1077, + 'old:virtual_from_version:39909' => 1115, + 'old:virtual_from_version:50470' => 3247, + 'old:virtual_from_version:47471' => 1444, + 'old:virtual_from_version:49041' => 1067, + 'old:virtual_from_version:47639' => 1070, + 'old:virtual_from_version:49387' => 3129, + 'old:virtual_from_version:47574' => 1689, + 'old:virtual_from_version:49833' => 3002, + 'old:virtual_from_version:45832' => 1077, + 'old:virtual_from_version:44503' => 1077, + 'old:virtual_from_version:50428' => 1580, + 'old:virtual_from_version:49093' => 3094, + 'old:virtual_from_version:44402' => 1008, + 'old:virtual_from_version:38351' => 1029, + 'old:virtual_from_version:41018' => 2027, + 'old:virtual_from_version:46841' => 1077, + 'old:virtual_from_version:46690' => 1070, + 'old:virtual_from_version:38753' => 1000, + 'old:virtual_from_version:46637' => 1077, + 'old:virtual_from_version:47339' => 1125, + 'old:virtual_from_version:48008' => 2108, + 'old:virtual_from_version:49868' => 3204, + 'old:virtual_from_version:46429' => 1077, + 'old:virtual_from_version:40704' => 1009, + 'old:virtual_from_version:40762' => 1048, + 'old:virtual_from_version:46282' => 1404, + 'old:virtual_from_version:42398' => 1037, + 'old:virtual_from_version:42446' => 1107, + 'old:virtual_from_version:47576' => 1070, + 'old:virtual_from_version:44655' => 1009, + 'old:virtual_from_version:44384' => 1036, + 'old:virtual_from_version:49109' => 3146, + 'old:virtual_from_version:47910' => 3008, + 'old:virtual_from_version:46034' => 1649, + 'old:virtual_from_version:40586' => 1077, + 'old:virtual_from_version:40243' => 1136, + 'old:virtual_from_version:44036' => 1488, + 'old:virtual_from_version:50474' => 3251, + 'old:virtual_from_version:46010' => 1048, + 'old:virtual_from_version:40860' => 1048, + 'old:virtual_from_version:45900' => 1077, + 'old:virtual_from_version:47391' => 3008, + 'old:virtual_from_version:45219' => 1574, + 'old:virtual_from_version:37575' => 1015, + 'old:virtual_from_version:49187' => 1070, + 'old:virtual_from_version:39951' => 1109, + 'old:virtual_from_version:47923' => 1565, + 'old:virtual_from_version:47563' => 1404, + 'old:virtual_from_version:44366' => 1007, + 'old:virtual_from_version:42615' => 1077, + 'old:virtual_from_version:50190' => 1146, + 'old:virtual_from_version:45145' => 1037, + 'old:virtual_from_version:45948' => 1627, + 'old:virtual_from_version:44827' => 1552, + 'old:virtual_from_version:46046' => 1077, + 'old:virtual_from_version:42548' => 1009, + 'old:virtual_from_version:49796' => 1689, + 'old:virtual_from_version:47187' => 1070, + 'old:virtual_from_version:45769' => 1009, + 'old:virtual_from_version:44740' => 1172, + 'old:virtual_from_version:46288' => 1070, + 'old:virtual_from_version:46668' => 1070, + 'old:virtual_from_version:49371' => 1077, + 'old:virtual_from_version:47873' => 1070, + 'old:virtual_from_version:46531' => 1105, + 'old:virtual_from_version:47431' => 1404, + 'old:virtual_from_version:46375' => 1585, + 'old:virtual_from_version:44828' => 1070, + 'old:virtual_from_version:44033' => 1070, + 'old:virtual_from_version:47897' => 1037, + 'old:virtual_from_version:44654' => 1070, + 'old:virtual_from_version:42820' => 1104, + 'old:virtual_from_version:40868' => 1037, + 'old:virtual_from_version:40627' => 1025, + 'old:virtual_from_version:45398' => 1008, + 'old:virtual_from_version:47016' => 1067, + 'old:virtual_from_version:42089' => 1037, + 'old:virtual_from_version:49183' => 1070, + 'old:virtual_from_version:46119' => 1092, + 'old:virtual_from_version:42630' => 1070, + 'old:virtual_from_version:40146' => 1078, + 'old:virtual_from_version:44534' => 1025, + 'old:virtual_from_version:46752' => 1077, + 'old:virtual_from_version:47136' => 1659, + 'old:virtual_from_version:50156' => 1517, + 'old:virtual_from_version:44927' => 1125, + 'old:virtual_from_version:40970' => 1077, + 'old:virtual_from_version:47275' => 1077, + 'old:virtual_from_version:47995' => 1125, + 'old:virtual_from_version:46927' => 1077, + 'old:virtual_from_version:42570' => 1172, + 'old:virtual_from_version:46686' => 1125, + 'old:virtual_from_version:40773' => 1404, + 'old:virtual_from_version:46621' => 1070, + 'old:virtual_from_version:45117' => 1077, + 'old:virtual_from_version:49185' => 1077, + 'old:virtual_from_version:45475' => 1110, + 'old:virtual_from_version:45683' => 1019, + 'old:virtual_from_version:49277' => 1007, + 'old:virtual_from_version:42268' => 1070, + 'old:virtual_from_version:47334' => 3006, + 'old:virtual_from_version:50151' => 1580, + 'old:virtual_from_version:50682' => 1585, + 'old:virtual_from_version:49294' => 1037, + 'old:virtual_from_version:40985' => 1407, + 'old:virtual_from_version:42092' => 1037, + 'old:virtual_from_version:47713' => 1621, + 'old:virtual_from_version:42987' => 1077, + 'old:virtual_from_version:44570' => 1037, + 'old:virtual_from_version:46118' => 1077, + 'old:virtual_from_version:46722' => 1172, + 'old:virtual_from_version:45740' => 1077, + 'old:virtual_from_version:46049' => 1125, + 'old:virtual_from_version:50264' => 3131, + 'old:virtual_from_version:45738' => 1067, + 'old:virtual_from_version:49939' => 1107, + 'old:virtual_from_version:42979' => 1070, + 'old:virtual_from_version:44966' => 1049, + 'old:virtual_from_version:45473' => 1136, + 'old:virtual_from_version:46769' => 1498, + 'old:virtual_from_version:47954' => 1109, + 'old:virtual_from_version:42589' => 1110, + 'old:virtual_from_version:46999' => 3015, + 'old:virtual_from_version:40400' => 1350, + 'old:virtual_from_version:44608' => 1110, + 'old:virtual_from_version:44446' => 1077, + 'old:virtual_from_version:44528' => 1077, + 'old:virtual_from_version:42093' => 1335, + 'old:virtual_from_version:46749' => 1077, + 'old:virtual_from_version:44415' => 1022, + 'old:virtual_from_version:50559' => 1070, + 'old:virtual_from_version:49286' => 1077, + 'old:virtual_from_version:42447' => 1070, + 'old:virtual_from_version:44131' => 1077, + 'old:virtual_from_version:40960' => 1107, + 'old:virtual_from_version:49647' => 1314, + 'old:virtual_from_version:49620' => 1158, + 'old:virtual_from_version:50583' => 3259, + 'old:virtual_from_version:42961' => 1037, + 'old:virtual_from_version:42424' => 1009, + 'old:virtual_from_version:47653' => 1125, + 'old:virtual_from_version:49401' => 3169, + 'old:virtual_from_version:42229' => 1083, + 'old:virtual_from_version:44118' => 1077, + 'old:virtual_from_version:42452' => 1439, + 'old:virtual_from_version:44509' => 1311, + 'old:virtual_from_version:49336' => 1404, + 'old:virtual_from_version:39966' => 1053, + 'old:virtual_from_version:43040' => 2038, + 'old:virtual_from_version:46442' => 1343, + 'old:virtual_from_version:42932' => 1146, + 'old:virtual_from_version:44416' => 1023, + 'old:virtual_from_version:49767' => 3002, + 'old:virtual_from_version:42173' => 1077, + 'old:virtual_from_version:44277' => 1070, + 'old:virtual_from_version:46037' => 1107, + 'old:virtual_from_version:44727' => 1025, + 'old:virtual_from_version:44201' => 1081, + 'old:virtual_from_version:40983' => 1328, + 'old:virtual_from_version:46969' => 1070, + 'old:virtual_from_version:40789' => 1025, + 'old:virtual_from_version:49505' => 1404, + 'old:virtual_from_version:42560' => 1025, + 'old:virtual_from_version:44350' => 1070, + 'old:virtual_from_version:49001' => 3127, + 'old:virtual_from_version:46786' => 1077, + 'old:virtual_from_version:45614' => 1070, + 'old:virtual_from_version:49720' => 1689, + 'old:virtual_from_version:40840' => 1009, + 'old:virtual_from_version:47650' => 1109, + 'old:virtual_from_version:47999' => 1125, + 'old:virtual_from_version:49456' => 1070, + 'old:virtual_from_version:40646' => 1394, + 'old:virtual_from_version:46990' => 1172, + 'old:virtual_from_version:49838' => 1009, + 'old:virtual_from_version:50440' => 3244, + 'old:virtual_from_version:47371' => 3046, + 'old:virtual_from_version:39662' => 1081, + 'old:virtual_from_version:42139' => 1077, + 'old:virtual_from_version:50388' => 1125, + 'old:virtual_from_version:47945' => 1070, + 'old:virtual_from_version:47590' => 1125, + 'old:virtual_from_version:45276' => 1222, + 'old:virtual_from_version:44045' => 1070, + 'old:virtual_from_version:47966' => 1649, + 'old:virtual_from_version:44399' => 1091, + 'old:virtual_from_version:40829' => 1125, + 'old:virtual_from_version:47194' => 1077, + 'old:virtual_from_version:47569' => 1109, + 'old:virtual_from_version:44409' => 1064, + 'old:virtual_from_version:44911' => 1125, + 'old:virtual_from_version:46311' => 1077, + 'old:virtual_from_version:49892' => 1689, + 'old:virtual_from_version:46641' => 1077, + 'old:virtual_from_version:44639' => 1077, + 'old:virtual_from_version:49089' => 3139, + 'old:virtual_from_version:47893' => 1123, + 'old:virtual_from_version:46806' => 1077, + 'old:virtual_from_version:45066' => 1070, + 'old:virtual_from_version:46625' => 1009, + 'old:virtual_from_version:42061' => 1070, + 'old:virtual_from_version:47779' => 1048, + 'old:virtual_from_version:42996' => 1077, + 'old:virtual_from_version:47048' => 1517, + 'old:virtual_from_version:47251' => 1037, + 'old:virtual_from_version:44425' => 1094, + 'old:virtual_from_version:49424' => 1172, + 'old:virtual_from_version:46296' => 1172, + 'old:virtual_from_version:44192' => 1110, + 'old:virtual_from_version:46612' => 1077, + 'old:virtual_from_version:49827' => 1070, + 'old:virtual_from_version:42941' => 1037, + 'old:virtual_from_version:40986' => 1107, + 'old:virtual_from_version:46050' => 1009, + 'old:virtual_from_version:46319' => 1222, + 'old:virtual_from_version:46354' => 1057, + 'old:virtual_from_version:40805' => 1077, + 'old:virtual_from_version:50211' => 1532, + 'old:virtual_from_version:46807' => 1666, + 'old:virtual_from_version:47342' => 1077, + 'old:virtual_from_version:40451' => 1091, + 'old:virtual_from_version:44845' => 1009, + 'old:virtual_from_version:44478' => 1077, + 'old:virtual_from_version:46871' => 1444, + 'old:virtual_from_version:42624' => 1077, + 'old:virtual_from_version:40534' => 1077, + 'old:virtual_from_version:42213' => 1009, + 'old:virtual_from_version:42508' => 1037, + 'old:virtual_from_version:46104' => 1070, + 'old:virtual_from_version:47230' => 1689, + 'old:virtual_from_version:42960' => 1077, + 'old:virtual_from_version:50283' => 3222, + 'old:virtual_from_version:42907' => 1070, + 'old:virtual_from_version:45099' => 1070, + 'old:virtual_from_version:45632' => 1070, + 'old:virtual_from_version:39624' => 1082, + 'old:virtual_from_version:45517' => 1136, + 'old:virtual_from_version:46258' => 1537, + 'old:virtual_from_version:45041' => 1023, + 'old:virtual_from_version:47404' => 1411, + 'old:virtual_from_version:40390' => 1341, + 'old:virtual_from_version:46504' => 1585, + 'old:virtual_from_version:49221' => 1314, + 'old:virtual_from_version:50476' => 1659, + 'old:virtual_from_version:45474' => 1070, + 'old:virtual_from_version:46979' => 1067, + 'old:virtual_from_version:47437' => 1077, + 'old:virtual_from_version:50326' => 1070, + 'old:virtual_from_version:45510' => 1070, + 'old:virtual_from_version:47615' => 1077, + 'old:virtual_from_version:49990' => 1404, + 'old:virtual_from_version:50562' => 1070, + 'old:virtual_from_version:46679' => 1077, + 'old:virtual_from_version:46161' => 1070, + 'old:virtual_from_version:42459' => 1107, + 'old:virtual_from_version:50374' => 3131, + 'old:virtual_from_version:46694' => 1404, + 'old:virtual_from_version:42687' => 1009, + 'old:virtual_from_version:46447' => 1172, + 'old:virtual_from_version:10004' => 2003, + 'old:virtual_from_version:46138' => 1414, + 'old:virtual_from_version:40887' => 1009, + 'old:virtual_from_version:40079' => 1081, + 'old:virtual_from_version:49074' => 3002, + 'old:virtual_from_version:46448' => 1031, + 'old:virtual_from_version:8056 ' => 1060, + 'old:virtual_from_version:49828' => 1125, + 'old:virtual_from_version:47317' => 3009, + 'old:virtual_from_version:46439' => 1077, + 'old:virtual_from_version:47656' => 1404, + 'old:virtual_from_version:40936' => 1037, + 'old:virtual_from_version:44516' => 1025, + 'old:virtual_from_version:44980' => 1081, + 'old:virtual_from_version:42947' => 1110, + 'old:virtual_from_version:49826' => 3201, + 'old:virtual_from_version:42517' => 1070, + 'old:virtual_from_version:44167' => 1522, + 'old:virtual_from_version:50328' => 1224, + 'old:virtual_from_version:50288' => 3131, + 'old:virtual_from_version:46036' => 1070, + 'old:virtual_from_version:44103' => 1516, + 'old:virtual_from_version:42566' => 1009, + 'old:virtual_from_version:42253' => 1037, + 'old:virtual_from_version:49775' => 3131, + 'old:virtual_from_version:46574' => 1689, + 'old:virtual_from_version:49937' => 1136, + 'old:virtual_from_version:49058' => 1404, + 'old:virtual_from_version:49364' => 1583, + 'old:virtual_from_version:50046' => 1070, + 'old:virtual_from_version:44895' => 1107, + 'old:virtual_from_version:47256' => 1077, + 'old:virtual_from_version:47809' => 3108, + 'old:virtual_from_version:50443' => 1035, + 'old:virtual_from_version:42618' => 1070, + 'old:virtual_from_version:45803' => 1009, + 'old:virtual_from_version:49758' => 1666, + 'old:virtual_from_version:44317' => 1067, + 'old:virtual_from_version:45265' => 1042, + 'old:virtual_from_version:42120' => 1077, + 'old:virtual_from_version:49561' => 1070, + 'old:virtual_from_version:40643' => 1005, + 'old:virtual_from_version:47519' => 1109, + 'old:virtual_from_version:44596' => 1037, + 'old:virtual_from_version:42360' => 1037, + 'old:virtual_from_version:49754' => 3195, + 'old:virtual_from_version:45119' => 1009, + 'old:virtual_from_version:50243' => 1070, + 'old:virtual_from_version:47485' => 1070, + 'old:virtual_from_version:50164' => 1172, + 'old:virtual_from_version:22824' => 1035, + 'old:virtual_from_version:40061' => 1067, + 'old:virtual_from_version:47409' => 1621, + 'old:virtual_from_version:45148' => 1568, + 'old:virtual_from_version:42617' => 1172, + 'old:virtual_from_version:49792' => 3131, + 'old:virtual_from_version:47969' => 1037, + 'old:virtual_from_version:46213' => 1009, + 'old:virtual_from_version:40679' => 1109, + 'old:virtual_from_version:47833' => 1172, + 'old:virtual_from_version:42849' => 1009, + 'old:virtual_from_version:39183' => 1036, + 'old:virtual_from_version:46127' => 1070, + 'old:virtual_from_version:49255' => 1410, + 'old:virtual_from_version:44795' => 1025, + 'old:virtual_from_version:42106' => 1037, + 'old:virtual_from_version:46022' => 1574, + 'old:virtual_from_version:45094' => 1070, + 'old:virtual_from_version:42877' => 1063, + 'old:virtual_from_version:44918' => 1009, + 'old:virtual_from_version:46201' => 1633, + 'old:virtual_from_version:49191' => 1689, + 'old:virtual_from_version:49534' => 1585, + 'old:virtual_from_version:49126' => 1580, + 'old:virtual_from_version:45273' => 1112, + 'old:virtual_from_version:46868' => 1067, + 'old:virtual_from_version:47633' => 1584, + 'old:virtual_from_version:46392' => 1077, + 'old:virtual_from_version:45768' => 1070, + 'old:virtual_from_version:49531' => 1532, + 'old:virtual_from_version:46231' => 1615, + 'old:virtual_from_version:45457' => 1125, + 'old:virtual_from_version:49005' => 1583, + 'old:virtual_from_version:42989' => 1070, + 'old:virtual_from_version:46740' => 1404, + 'old:virtual_from_version:45623' => 1077, + 'old:virtual_from_version:50168' => 3131, + 'old:virtual_from_version:45907' => 1107, + 'old:virtual_from_version:40582' => 1105, + 'old:virtual_from_version:46713' => 1048, + 'old:virtual_from_version:46550' => 1048, + 'old:virtual_from_version:49872' => 3194, + 'old:virtual_from_version:40932' => 1077, + 'old:virtual_from_version:47466' => 1621, + 'old:virtual_from_version:45581' => 1070, + 'old:virtual_from_version:46028' => 1077, + 'old:virtual_from_version:50664' => 1419, + 'old:virtual_from_version:42510' => 1109, + 'old:virtual_from_version:39317' => 1123, + 'old:virtual_from_version:42300' => 1107, + 'old:virtual_from_version:44864' => 1077, + 'old:virtual_from_version:47984' => 1070, + 'old:virtual_from_version:45509' => 1136, + 'old:virtual_from_version:49209' => 1565, + 'old:virtual_from_version:49438' => 1150, + 'old:virtual_from_version:49517' => 1070, + 'old:virtual_from_version:47848' => 1109, + 'old:virtual_from_version:47046' => 1125, + 'old:virtual_from_version:45860' => 1070, + 'old:virtual_from_version:50490' => 3252, + 'old:virtual_from_version:45545' => 1172, + 'old:virtual_from_version:49988' => 3131, + 'old:virtual_from_version:46128' => 1077, + 'old:virtual_from_version:46567' => 1077, + 'old:virtual_from_version:50132' => 1404, + 'old:virtual_from_version:44012' => 1077, + 'old:virtual_from_version:47846' => 1070, + 'old:virtual_from_version:44128' => 1037, + 'old:virtual_from_version:49898' => 1006, + 'old:virtual_from_version:44897' => 1077, + 'old:virtual_from_version:44135' => 1070, + 'old:virtual_from_version:44462' => 1037, + 'old:virtual_from_version:42240' => 1037, + 'old:virtual_from_version:45220' => 1575, + 'old:virtual_from_version:50667' => 1070, + 'old:virtual_from_version:44353' => 1172, + 'old:virtual_from_version:49681' => 3190, + 'old:virtual_from_version:46676' => 1077, + 'old:virtual_from_version:45807' => 1381, + 'old:virtual_from_version:42952' => 1077, + 'old:virtual_from_version:44591' => 1110, + 'old:virtual_from_version:50762' => 1070, + 'old:virtual_from_version:50435' => 1057, + 'old:virtual_from_version:45071' => 1077, + 'old:virtual_from_version:42862' => 1321, + 'old:virtual_from_version:50315' => 3186, + 'old:virtual_from_version:50434' => 3239, + 'old:virtual_from_version:45458' => 1107, + 'old:virtual_from_version:50383' => 1125, + 'old:virtual_from_version:44550' => 1077, + 'old:virtual_from_version:50072' => 3215, + 'old:virtual_from_version:49617' => 1158, + 'old:virtual_from_version:50090' => 1070, + 'old:virtual_from_version:50704' => 1012, + 'old:virtual_from_version:45962' => 1077, + 'old:virtual_from_version:40470' => 1091, + 'old:virtual_from_version:47523' => 1580, + 'old:virtual_from_version:50426' => 1070, + 'old:virtual_from_version:47322' => 1109, + 'old:virtual_from_version:43074' => 2072, + 'old:virtual_from_version:50371' => 3131, + 'old:virtual_from_version:46013' => 1172, + 'old:virtual_from_version:46601' => 1005, + 'old:virtual_from_version:46090' => 1655, + 'old:virtual_from_version:50488' => 3221, + 'old:virtual_from_version:47202' => 1035, + 'old:virtual_from_version:45116' => 1009, + 'old:virtual_from_version:44810' => 1077, + 'old:virtual_from_version:42164' => 1070, + 'old:virtual_from_version:42003' => 1009, + 'old:virtual_from_version:40401' => 1351, + 'old:virtual_from_version:49256' => 1649, + 'old:virtual_from_version:46912' => 1621, + 'old:virtual_from_version:49471' => 1314, + 'old:virtual_from_version:42221' => 1037, + 'old:virtual_from_version:40905' => 1077, + 'old:virtual_from_version:49498' => 1035, + 'old:virtual_from_version:38727' => 1083, + 'old:virtual_from_version:50214' => 1172, + 'old:virtual_from_version:47047' => 1077, + 'old:virtual_from_version:47096' => 1311, + 'old:virtual_from_version:42900' => 1110, + 'old:virtual_from_version:45841' => 1172, + 'old:virtual_from_version:49140' => 1689, + 'old:virtual_from_version:49353' => 1077, + 'old:virtual_from_version:50329' => 3131, + 'old:virtual_from_version:47035' => 1580, + 'old:virtual_from_version:44995' => 1091, + 'old:virtual_from_version:49899' => 3131, + 'old:virtual_from_version:47201' => 1587, + 'old:virtual_from_version:46228' => 1077, + 'old:virtual_from_version:50732' => 1048, + 'old:virtual_from_version:44143' => 1125, + 'old:virtual_from_version:47903' => 3119, + 'old:virtual_from_version:45913' => 1009, + 'old:virtual_from_version:50093' => 3131, + 'old:virtual_from_version:44031' => 1037, + 'old:virtual_from_version:46042' => 1650, + 'old:virtual_from_version:44928' => 1107, + 'old:virtual_from_version:49407' => 1070, + 'old:virtual_from_version:49738' => 1489, + 'old:virtual_from_version:49795' => 1489, + 'old:virtual_from_version:47781' => 1077, + 'old:virtual_from_version:50354' => 1314, + 'old:virtual_from_version:42710' => 1077, + 'old:virtual_from_version:44909' => 1009, + 'old:virtual_from_version:46734' => 1517, + 'old:virtual_from_version:46126' => 1077, + 'old:virtual_from_version:49970' => 3209, + 'old:virtual_from_version:44879' => 1070, + 'old:virtual_from_version:42896' => 1070, + 'old:virtual_from_version:50188' => 3131, + 'old:virtual_from_version:39658' => 1007, + 'old:virtual_from_version:45427' => 1048, + 'old:virtual_from_version:50082' => 3131, + 'old:virtual_from_version:40465' => 1009, + 'old:virtual_from_version:45275' => 1017, + 'old:virtual_from_version:42886' => 1009, + 'old:virtual_from_version:45635' => 1076, + 'old:virtual_from_version:43065' => 2066, + 'old:virtual_from_version:44195' => 1070, + 'old:virtual_from_version:40687' => 1051, + 'old:virtual_from_version:40729' => 1077, + 'old:virtual_from_version:42219' => 1009, + 'old:virtual_from_version:38563' => 1116, + 'old:virtual_from_version:49479' => 1583, + 'old:virtual_from_version:50631' => 1689, + 'old:virtual_from_version:47316' => 1689, + 'old:virtual_from_version:50021' => 1070, + 'old:virtual_from_version:42927' => 1077, + 'old:virtual_from_version:39901' => 1070, + 'old:virtual_from_version:49704' => 3191, + 'old:virtual_from_version:42723' => 1077, + 'old:virtual_from_version:49485' => 1070, + 'old:virtual_from_version:45622' => 1009, + 'old:virtual_from_version:46421' => 1077, + 'old:virtual_from_version:44004' => 1037, + 'old:virtual_from_version:46099' => 1649, + 'old:virtual_from_version:43081' => 2078, + 'old:virtual_from_version:47314' => 1077, + 'old:virtual_from_version:44667' => 1172, + 'old:virtual_from_version:46186' => 1077, + 'old:virtual_from_version:49901' => 1616, + 'old:virtual_from_version:49652' => 1070, + 'old:virtual_from_version:49703' => 3129, + 'old:virtual_from_version:42153' => 1037, + 'old:virtual_from_version:47424' => 1689, + 'old:virtual_from_version:47587' => 1109, + 'old:virtual_from_version:49049' => 1666, + 'old:virtual_from_version:47052' => 1125, + 'old:virtual_from_version:44837' => 1009, + 'old:virtual_from_version:47290' => 1125, + 'old:virtual_from_version:45032' => 1015, + 'old:virtual_from_version:45563' => 1012, + 'old:virtual_from_version:44442' => 1077, + 'old:virtual_from_version:42945' => 1077, + 'old:virtual_from_version:50480' => 3174, + 'old:virtual_from_version:44836' => 1033, + 'old:virtual_from_version:49120' => 1067, + 'old:virtual_from_version:46334' => 1659, + 'old:virtual_from_version:46633' => 1077, + 'old:virtual_from_version:47000' => 1070, + 'old:virtual_from_version:49038' => 1070, + 'old:virtual_from_version:40788' => 1070, + 'old:virtual_from_version:42369' => 1009, + 'old:virtual_from_version:43051' => 2018, + 'old:virtual_from_version:44949' => 1404, + 'old:virtual_from_version:49884' => 1689, + 'old:virtual_from_version:46144' => 1105, + 'old:virtual_from_version:50577' => 3031, + 'old:virtual_from_version:40303' => 1109, + 'old:virtual_from_version:42891' => 1009, + 'old:virtual_from_version:38291' => 1082, + 'old:virtual_from_version:49725' => 1006, + 'old:virtual_from_version:50677' => 1070, + 'old:virtual_from_version:46835' => 1077, + 'old:virtual_from_version:50594' => 3227, + 'old:virtual_from_version:49487' => 1070, + 'old:virtual_from_version:44797' => 1109, + 'old:virtual_from_version:47698' => 1672, + 'old:virtual_from_version:49150' => 1107, + 'old:virtual_from_version:47795' => 3078, + 'old:virtual_from_version:45163' => 1009, + 'old:virtual_from_version:47946' => 1109, + 'old:virtual_from_version:39050' => 1007, + 'old:virtual_from_version:44967' => 1070, + 'old:virtual_from_version:49290' => 3136, + 'old:virtual_from_version:42015' => 1107, + 'old:virtual_from_version:46576' => 1007, + 'old:virtual_from_version:40935' => 1077, + 'old:virtual_from_version:46141' => 1012, + 'old:virtual_from_version:49248' => 1532, + 'old:virtual_from_version:49698' => 1659, + 'old:virtual_from_version:45908' => 1009, + 'old:virtual_from_version:47454' => 1402, + 'old:virtual_from_version:44938' => 1110, + 'old:virtual_from_version:40601' => 1070, + 'old:virtual_from_version:43009' => 2034, + 'old:virtual_from_version:44523' => 1172, + 'old:virtual_from_version:45256' => 1037, + 'old:virtual_from_version:49212' => 1172, + 'old:virtual_from_version:39329' => 1069, + 'old:virtual_from_version:49799' => 1125, + 'old:virtual_from_version:46545' => 1070, + 'old:virtual_from_version:45937' => 1015, + 'old:virtual_from_version:47926' => 3008, + 'old:virtual_from_version:50461' => 1689, + 'old:virtual_from_version:44832' => 1029, + 'old:virtual_from_version:46742' => 1070, + 'old:virtual_from_version:46949' => 1659, + 'old:virtual_from_version:45802' => 1105, + 'old:virtual_from_version:39991' => 2006, + 'old:virtual_from_version:42350' => 1009, + 'old:virtual_from_version:46791' => 1689, + 'old:virtual_from_version:46395' => 1423, + 'old:virtual_from_version:49338' => 1689, + 'old:virtual_from_version:50761' => 3009, + 'old:virtual_from_version:44173' => 1077, + 'old:virtual_from_version:50595' => 3259, + 'old:virtual_from_version:50232' => 1689, + 'old:virtual_from_version:44613' => 1009, + 'old:virtual_from_version:49526' => 1580, + 'old:virtual_from_version:44554' => 1077, + 'old:virtual_from_version:47315' => 1517, + 'old:virtual_from_version:45352' => 1125, + 'old:virtual_from_version:38362' => 1110, + 'old:virtual_from_version:45729' => 1112, + 'old:virtual_from_version:46759' => 1077, + 'old:virtual_from_version:45160' => 1107, + 'old:virtual_from_version:45519' => 1025, + 'old:virtual_from_version:49346' => 1077, + 'old:virtual_from_version:42577' => 1077, + 'old:virtual_from_version:42238' => 1009, + 'old:virtual_from_version:49078' => 1666, + 'old:virtual_from_version:49268' => 1070, + 'old:virtual_from_version:40084' => 1107, + 'old:virtual_from_version:50545' => 3120, + 'old:virtual_from_version:44711' => 1070, + 'old:virtual_from_version:44500' => 1107, + 'old:virtual_from_version:42207' => 1172, + 'old:virtual_from_version:46388' => 1107, + 'old:virtual_from_version:42075' => 1070, + 'old:virtual_from_version:42527' => 1077, + 'old:virtual_from_version:47071' => 1077, + 'old:virtual_from_version:39322' => 1025, + 'old:virtual_from_version:46962' => 1125, + 'old:virtual_from_version:46764' => 1070, + 'old:virtual_from_version:47921' => 1404, + 'old:virtual_from_version:44742' => 1077, + 'old:virtual_from_version:38553' => 1007, + 'old:virtual_from_version:50614' => 1070, + 'old:virtual_from_version:40824' => 1070, + 'old:virtual_from_version:47982' => 1689, + 'old:virtual_from_version:42564' => 1110, + 'old:virtual_from_version:46792' => 2072, + 'old:virtual_from_version:40908' => 1125, + 'old:virtual_from_version:44641' => 1136, + 'old:virtual_from_version:47476' => 1109, + 'old:virtual_from_version:44750' => 1076, + 'old:virtual_from_version:49983' => 3131, + 'old:virtual_from_version:42956' => 1125, + 'old:virtual_from_version:41005' => 2017, + 'old:virtual_from_version:42621' => 1037, + 'old:virtual_from_version:45867' => 1077, + 'old:virtual_from_version:42298' => 1430, + 'old:virtual_from_version:50185' => 1062, + 'old:virtual_from_version:45930' => 1077, + 'old:virtual_from_version:40089' => 1136, + 'old:virtual_from_version:42571' => 1000, + 'old:virtual_from_version:44786' => 1110, + 'old:virtual_from_version:50698' => 1580, + 'old:virtual_from_version:42954' => 1067, + 'old:virtual_from_version:46566' => 1125, + 'old:virtual_from_version:42826' => 1136, + 'old:virtual_from_version:44260' => 1107, + 'old:virtual_from_version:45561' => 1009, + 'old:virtual_from_version:40461' => 1328, + 'old:virtual_from_version:46371' => 1077, + 'old:virtual_from_version:44985' => 1095, + 'old:virtual_from_version:40223' => 1099, + 'old:virtual_from_version:40518' => 1077, + 'old:virtual_from_version:44612' => 1070, + 'old:virtual_from_version:47159' => 1633, + 'old:virtual_from_version:49900' => 3194, + 'old:virtual_from_version:42267' => 1057, + 'old:virtual_from_version:50566' => 1070, + 'old:virtual_from_version:49601' => 1070, + 'old:virtual_from_version:40884' => 1105, + 'old:virtual_from_version:46302' => 1553, + 'old:virtual_from_version:46493' => 1413, + 'old:virtual_from_version:45895' => 1070, + 'old:virtual_from_version:46859' => 1077, + 'old:virtual_from_version:47131' => 1070, + 'old:virtual_from_version:46297' => 1077, + 'old:virtual_from_version:42192' => 1037, + 'old:virtual_from_version:50685' => 3002, + 'old:virtual_from_version:45862' => 1077, + 'old:virtual_from_version:45704' => 1070, + 'old:virtual_from_version:45386' => 1051, + 'old:virtual_from_version:47103' => 1172, + 'old:virtual_from_version:44220' => 1051, + 'old:virtual_from_version:42733' => 1070, + 'old:virtual_from_version:46255' => 1063, + 'old:virtual_from_version:40182' => 1031, + 'old:virtual_from_version:47472' => 1689, + 'old:virtual_from_version:49612' => 1125, + 'old:virtual_from_version:44450' => 1104, + 'old:virtual_from_version:49728' => 1404, + 'old:virtual_from_version:44820' => 1025, + 'old:virtual_from_version:42916' => 1025, + 'old:virtual_from_version:40588' => 1070, + 'old:virtual_from_version:47301' => 1077, + 'old:virtual_from_version:50242' => 3230, + 'old:virtual_from_version:40658' => 1136, + 'old:virtual_from_version:40816' => 1025, + 'old:virtual_from_version:45777' => 1397, + 'old:virtual_from_version:49950' => 3194, + 'old:virtual_from_version:49325' => 1037, + 'old:virtual_from_version:42011' => 1009, + 'old:virtual_from_version:46685' => 1070, + 'old:virtual_from_version:50041' => 1070, + 'old:virtual_from_version:32632' => 1030, + 'old:virtual_from_version:50654' => 1489, + 'old:virtual_from_version:46151' => 1070, + 'old:virtual_from_version:46350' => 1001, + 'old:virtual_from_version:45149' => 1125, + 'old:virtual_from_version:39502' => 1015, + 'old:virtual_from_version:42434' => 1070, + 'old:virtual_from_version:50220' => 1037, + 'old:virtual_from_version:42126' => 1077, + 'old:virtual_from_version:49933' => 1000, + 'old:virtual_from_version:50238' => 1070, + 'old:virtual_from_version:44512' => 1125, + 'old:virtual_from_version:37035' => 1104, + 'old:virtual_from_version:44219' => 1067, + 'old:virtual_from_version:46987' => 1070, + 'old:virtual_from_version:38681' => 1110, + 'old:virtual_from_version:49781' => 3131, + 'old:virtual_from_version:42622' => 1084, + 'old:virtual_from_version:44853' => 1107, + 'old:virtual_from_version:44372' => 1016, + 'old:virtual_from_version:45445' => 1070, + 'old:virtual_from_version:47808' => 1404, + 'old:virtual_from_version:40835' => 1062, + 'old:virtual_from_version:47098' => 1172, + 'old:virtual_from_version:44089' => 1077, + 'old:virtual_from_version:47948' => 1689, + 'old:virtual_from_version:47819' => 3078, + 'old:virtual_from_version:46360' => 1555, + 'old:virtual_from_version:49261' => 1070, + 'old:virtual_from_version:44109' => 1025, + 'old:virtual_from_version:42523' => 1107, + 'old:virtual_from_version:40559' => 1077, + 'old:virtual_from_version:46377' => 1076, + 'old:virtual_from_version:38952' => 1077, + 'old:virtual_from_version:46586' => 1025, + 'old:virtual_from_version:44708' => 1537, + 'old:virtual_from_version:40615' => 1095, + 'old:virtual_from_version:46972' => 1077, + 'old:virtual_from_version:47940' => 1109, + 'old:virtual_from_version:49597' => 1107, + 'old:virtual_from_version:46767' => 1077, + 'old:virtual_from_version:44983' => 1109, + 'old:virtual_from_version:44841' => 1110, + 'old:virtual_from_version:47963' => 1077, + 'old:virtual_from_version:48037' => 2079, + 'old:virtual_from_version:46291' => 1172, + 'old:virtual_from_version:46675' => 1125, + 'old:virtual_from_version:45708' => 1532, + 'old:virtual_from_version:40647' => 1362, + 'old:virtual_from_version:45726' => 1402, + 'old:virtual_from_version:40888' => 1125, + 'old:virtual_from_version:47346' => 1070, + 'old:virtual_from_version:50087' => 1025, + 'old:virtual_from_version:40449' => 1404, + 'old:virtual_from_version:40796' => 1081, + 'old:virtual_from_version:42216' => 1037, + 'old:virtual_from_version:45466' => 1136, + 'old:virtual_from_version:47638' => 1032, + 'old:virtual_from_version:46261' => 1077, + 'old:virtual_from_version:49616' => 3183, + 'old:virtual_from_version:46520' => 1077, + 'old:virtual_from_version:46918' => 1095, + 'old:virtual_from_version:50125' => 1125, + 'old:virtual_from_version:42885' => 1070, + 'old:virtual_from_version:40579' => 1404, + 'old:virtual_from_version:50683' => 1666, + 'old:virtual_from_version:42665' => 1037, + 'old:virtual_from_version:50402' => 1314, + 'old:virtual_from_version:47324' => 1012, + 'old:virtual_from_version:47138' => 1070, + 'old:virtual_from_version:44517' => 1077, + 'old:virtual_from_version:49169' => 1077, + 'old:virtual_from_version:44351' => 1077, + 'old:virtual_from_version:40724' => 1404, + 'old:virtual_from_version:42301' => 1070, + 'old:virtual_from_version:47208' => 1077, + 'old:virtual_from_version:44739' => 1077, + 'old:virtual_from_version:50005' => 1689, + 'old:virtual_from_version:40782' => 1077, + 'old:virtual_from_version:40891' => 1037, + 'old:virtual_from_version:47495' => 1109, + 'old:virtual_from_version:42203' => 1037, + 'old:virtual_from_version:44945' => 1077, + 'old:virtual_from_version:45241' => 1000, + 'old:virtual_from_version:45555' => 1136, + 'old:virtual_from_version:42275' => 1107, + 'old:virtual_from_version:50712' => 3259, + 'old:virtual_from_version:45248' => 1043, + 'old:virtual_from_version:49253' => 1404, + 'old:virtual_from_version:45670' => 1621, + 'old:virtual_from_version:50102' => 1015, + 'old:virtual_from_version:43041' => 2053, + 'old:virtual_from_version:42550' => 1037, + 'old:virtual_from_version:46849' => 1077, + 'old:virtual_from_version:49959' => 1070, + 'old:virtual_from_version:42515' => 1150, + 'old:virtual_from_version:50115' => 3131, + 'old:virtual_from_version:42899' => 1037, + 'old:virtual_from_version:44875' => 1077, + 'old:virtual_from_version:40979' => 1070, + 'old:virtual_from_version:49994' => 1100, + 'old:virtual_from_version:46497' => 1537, + 'old:virtual_from_version:42758' => 1461, + 'old:virtual_from_version:39994' => 2009, + 'old:virtual_from_version:49182' => 3153, + 'old:virtual_from_version:44923' => 1125, + 'old:virtual_from_version:38384' => 1067, + 'old:virtual_from_version:50504' => 3261, + 'old:virtual_from_version:47550' => 1070, + 'old:virtual_from_version:44491' => 1110, + 'old:virtual_from_version:42719' => 1037, + 'old:virtual_from_version:38366' => 1065, + 'old:virtual_from_version:50418' => 1070, + 'old:virtual_from_version:40885' => 1057, + 'old:virtual_from_version:47028' => 3008, + 'old:virtual_from_version:49829' => 1037, + 'old:virtual_from_version:49195' => 1070, + 'old:virtual_from_version:46121' => 1461, + 'old:virtual_from_version:47165' => 1125, + 'old:virtual_from_version:47805' => 1172, + 'old:virtual_from_version:50205' => 3137, + 'old:virtual_from_version:50366' => 1007, + 'old:virtual_from_version:50027' => 3131, + 'old:virtual_from_version:49637' => 1158, + 'old:virtual_from_version:46357' => 1070, + 'old:virtual_from_version:47883' => 1109, + 'old:virtual_from_version:42755' => 1037, + 'old:virtual_from_version:42573' => 1077, + 'old:virtual_from_version:42380' => 1172, + 'old:virtual_from_version:38672' => 1104, + 'old:virtual_from_version:49595' => 1070, + 'old:virtual_from_version:47735' => 1109, + 'old:virtual_from_version:42850' => 1077, + 'old:virtual_from_version:50436' => 3242, + 'old:virtual_from_version:47941' => 1025, + 'old:virtual_from_version:46455' => 1537, + 'old:virtual_from_version:47079' => 1583, + 'old:virtual_from_version:50273' => 3131, + 'old:virtual_from_version:46609' => 1125, + 'old:virtual_from_version:47820' => 3094, + 'old:virtual_from_version:47140' => 1077, + 'old:virtual_from_version:44884' => 1136, + 'old:virtual_from_version:42821' => 1070, + 'old:virtual_from_version:49719' => 1489, + 'old:virtual_from_version:50709' => 3273, + 'old:virtual_from_version:44221' => 1070, + 'old:virtual_from_version:40926' => 1107, + 'old:virtual_from_version:46386' => 1552, + 'old:virtual_from_version:40641' => 1025, + 'old:virtual_from_version:50606' => 3131, + 'old:virtual_from_version:42171' => 1070, + 'old:virtual_from_version:46451' => 1172, + 'old:virtual_from_version:50688' => 1005, + 'old:virtual_from_version:42925' => 1506, + 'old:virtual_from_version:44950' => 1067, + 'old:virtual_from_version:45112' => 1009, + 'old:virtual_from_version:44075' => 1009, + 'old:virtual_from_version:42535' => 1067, + 'old:virtual_from_version:42931' => 1051, + 'old:virtual_from_version:49947' => 1580, + 'old:virtual_from_version:42132' => 1009, + 'old:virtual_from_version:44732' => 1070, + 'old:virtual_from_version:50101' => 1070, + 'old:virtual_from_version:47827' => 1070, + 'old:virtual_from_version:45764' => 1404, + 'old:virtual_from_version:44984' => 1022, + 'old:virtual_from_version:44367' => 1008, + 'old:virtual_from_version:49304' => 1583, + 'old:virtual_from_version:50017' => 1314, + 'old:virtual_from_version:46731' => 1125, + 'old:virtual_from_version:45744' => 1009, + 'old:virtual_from_version:39708' => 1109, + 'old:virtual_from_version:39232' => 1062, + 'old:virtual_from_version:44994' => 1112, + 'old:virtual_from_version:46290' => 1067, + 'old:virtual_from_version:47667' => 1070, + 'old:virtual_from_version:47234' => 1640, + 'old:virtual_from_version:47164' => 1070, + 'old:virtual_from_version:50044' => 1689, + 'old:virtual_from_version:50678' => 1150, + 'old:virtual_from_version:40585' => 1025, + 'old:virtual_from_version:42783' => 1077, + 'old:virtual_from_version:47619' => 1311, + 'old:virtual_from_version:44019' => 1009, + 'old:virtual_from_version:44110' => 1077, + 'old:virtual_from_version:47740' => 1109, + 'old:virtual_from_version:46058' => 1077, + 'old:virtual_from_version:38932' => 1007, + 'old:virtual_from_version:50695' => 1006, + 'old:virtual_from_version:46110' => 1404, + 'old:virtual_from_version:47922' => 1413, + 'old:virtual_from_version:42638' => 1172, + 'old:virtual_from_version:45104' => 1070, + 'old:virtual_from_version:44609' => 1051, + 'old:virtual_from_version:43068' => 2069, + 'old:virtual_from_version:44306' => 1172, + 'old:virtual_from_version:45233' => 1083, + 'old:virtual_from_version:47326' => 1070, + 'old:virtual_from_version:37416' => 1001, + 'old:virtual_from_version:42243' => 1070, + 'old:virtual_from_version:46939' => 3009, + 'old:virtual_from_version:46541' => 1125, + 'old:virtual_from_version:42284' => 1426, + 'old:virtual_from_version:44287' => 1025, + 'old:virtual_from_version:44919' => 1077, + 'old:virtual_from_version:38762' => 1108, + 'old:virtual_from_version:46047' => 1488, + 'old:virtual_from_version:46700' => 1417, + 'old:virtual_from_version:45076' => 1070, + 'old:virtual_from_version:48003' => 2104, + 'old:virtual_from_version:50173' => 1125, + 'old:virtual_from_version:44617' => 1037, + 'old:virtual_from_version:50463' => 3159, + 'old:virtual_from_version:34128' => 1091, + 'old:virtual_from_version:44842' => 1081, + 'old:virtual_from_version:50462' => 3131, + 'old:virtual_from_version:47182' => 1051, + 'old:virtual_from_version:43094' => 2086, + 'old:virtual_from_version:40699' => 1016, + 'old:virtual_from_version:46836' => 1351, + 'old:virtual_from_version:49956' => 1070, + 'old:virtual_from_version:42627' => 1311, + 'old:virtual_from_version:45526' => 1404, + 'old:virtual_from_version:49869' => 1584, + 'old:virtual_from_version:50648' => 1038, + 'old:virtual_from_version:49998' => 3215, + 'old:virtual_from_version:50564' => 1150, + 'old:virtual_from_version:45056' => 1112, + 'old:virtual_from_version:45490' => 1105, + 'old:virtual_from_version:42969' => 1110, + 'old:virtual_from_version:46558' => 1077, + 'old:virtual_from_version:42857' => 1077, + 'old:virtual_from_version:47866' => 1689, + 'old:virtual_from_version:45755' => 1012, + 'old:virtual_from_version:46821' => 1509, + 'old:virtual_from_version:47211' => 1070, + 'old:virtual_from_version:50514' => 1585, + 'old:virtual_from_version:45500' => 1112, + 'old:virtual_from_version:45829' => 1107, + 'old:virtual_from_version:47861' => 1077, + 'old:virtual_from_version:47980' => 1077, + 'old:virtual_from_version:50113' => 1580, + 'old:virtual_from_version:46318' => 1070, + 'old:virtual_from_version:50427' => 1064, + 'old:virtual_from_version:40851' => 1009, + 'old:virtual_from_version:47546' => 1125, + 'old:virtual_from_version:49071' => 1689, + 'old:virtual_from_version:42347' => 1107, + 'old:virtual_from_version:49397' => 3008, + 'old:virtual_from_version:49337' => 1666, + 'old:virtual_from_version:49923' => 3206, + 'old:virtual_from_version:47774' => 1666, + 'old:virtual_from_version:44048' => 1077, + 'old:virtual_from_version:39815' => 1149, + 'old:virtual_from_version:50081' => 1051, + 'old:virtual_from_version:46661' => 1077, + 'old:virtual_from_version:46370' => 1005, + 'old:virtual_from_version:47939' => 1070, + 'old:virtual_from_version:47977' => 1070, + 'old:virtual_from_version:44210' => 1183, + 'old:virtual_from_version:47992' => 1109, + 'old:virtual_from_version:48028' => 2079, + 'old:virtual_from_version:49145' => 1077, + 'old:virtual_from_version:47385' => 3008, + 'old:virtual_from_version:46775' => 1070, + 'old:virtual_from_version:45378' => 1125, + 'old:virtual_from_version:40637' => 1057, + 'old:virtual_from_version:46964' => 1070, + 'old:virtual_from_version:44185' => 1125, + 'old:virtual_from_version:42673' => 1070, + 'old:virtual_from_version:49137' => 1649, + 'old:virtual_from_version:46989' => 1125, + 'old:virtual_from_version:40672' => 1077, + 'old:virtual_from_version:42716' => 1023, + 'old:virtual_from_version:42453' => 1440, + 'old:virtual_from_version:45586' => 1070, + 'old:virtual_from_version:46805' => 1048, + 'old:virtual_from_version:44003' => 1077, + 'old:virtual_from_version:46565' => 1070, + 'old:virtual_from_version:46217' => 1404, + 'old:virtual_from_version:49083' => 3136, + 'old:virtual_from_version:47392' => 3008, + 'old:virtual_from_version:44924' => 1070, + 'old:virtual_from_version:49790' => 1037, + 'old:virtual_from_version:49695' => 3008, + 'old:virtual_from_version:49154' => 1070, + 'old:virtual_from_version:49623' => 3185, + 'old:virtual_from_version:46885' => 1172, + 'old:virtual_from_version:42237' => 1070, + 'old:virtual_from_version:42242' => 1172, + 'old:virtual_from_version:44944' => 1026, + 'old:virtual_from_version:42655' => 1037, + 'old:virtual_from_version:44988' => 1010, + 'old:virtual_from_version:47480' => 1444, + 'old:virtual_from_version:42856' => 1009, + 'old:virtual_from_version:44753' => 1009, + 'old:virtual_from_version:47197' => 1070, + 'old:virtual_from_version:45875' => 1532, + 'old:virtual_from_version:40635' => 1077, + 'old:virtual_from_version:39752' => 1404, + 'old:virtual_from_version:47830' => 1107, + 'old:virtual_from_version:45507' => 1585, + 'old:virtual_from_version:38667' => 1069, + 'old:virtual_from_version:49734' => 1067, + 'old:virtual_from_version:46149' => 1037, + 'old:virtual_from_version:44346' => 1025, + 'old:virtual_from_version:45676' => 1048, + 'old:virtual_from_version:49724' => 1070, + 'old:virtual_from_version:42747' => 1037, + 'old:virtual_from_version:49330' => 1659, + 'old:virtual_from_version:45105' => 1077, + 'old:virtual_from_version:44374' => 1017, + 'old:virtual_from_version:50011' => 1565, + 'old:virtual_from_version:49152' => 1105, + 'old:virtual_from_version:49864' => 1404, + 'old:virtual_from_version:44356' => 1081, + 'old:virtual_from_version:46194' => 1649, + 'old:virtual_from_version:49358' => 1070, + 'old:virtual_from_version:50579' => 1125, + 'old:virtual_from_version:47122' => 1067, + 'old:virtual_from_version:45232' => 1083, + 'old:virtual_from_version:42562' => 1037, + 'old:virtual_from_version:49605' => 1070, + 'old:virtual_from_version:50333' => 1070, + 'old:virtual_from_version:42789' => 1353, + 'old:virtual_from_version:50233' => 3131, + 'old:virtual_from_version:49007' => 1585, + 'old:virtual_from_version:44423' => 1042, + 'old:virtual_from_version:44657' => 1077, + 'old:virtual_from_version:45626' => 1070, + 'old:virtual_from_version:44056' => 1037, + 'old:virtual_from_version:47532' => 1070, + 'old:virtual_from_version:46747' => 1632, + 'old:virtual_from_version:50079' => 3223, + 'old:virtual_from_version:40499' => 1077, + 'old:virtual_from_version:47772' => 1077, + 'old:virtual_from_version:44673' => 1009, + 'old:virtual_from_version:40237' => 1070, + 'old:virtual_from_version:49184' => 1105, + 'old:virtual_from_version:49393' => 1381, + 'old:virtual_from_version:43077' => 2074, + 'old:virtual_from_version:38981' => 1009, + 'old:virtual_from_version:42713' => 1311, + 'old:virtual_from_version:40690' => 1070, + 'old:virtual_from_version:40480' => 1077, + 'old:virtual_from_version:46711' => 1077, + 'old:virtual_from_version:45938' => 1077, + 'old:virtual_from_version:47115' => 3021, + 'old:virtual_from_version:44846' => 1077, + 'old:virtual_from_version:44533' => 1009, + 'old:virtual_from_version:49772' => 1651, + 'old:virtual_from_version:49587' => 1172, + 'old:virtual_from_version:41003' => 2015, + 'old:virtual_from_version:45294' => 1581, + 'old:virtual_from_version:47676' => 1404, + 'old:virtual_from_version:40152' => 1105, + 'old:virtual_from_version:47460' => 1077, + 'old:virtual_from_version:40795' => 1077, + 'old:virtual_from_version:49907' => 1007, + 'old:virtual_from_version:44214' => 1037, + 'old:virtual_from_version:43032' => 2031, + 'old:virtual_from_version:49985' => 1100, + 'old:virtual_from_version:45128' => 1125, + 'old:virtual_from_version:49809' => 1100, + 'old:virtual_from_version:42910' => 1077, + 'old:virtual_from_version:40549' => 1107, + 'old:virtual_from_version:42130' => 1136, + 'old:virtual_from_version:50370' => 3131, + 'old:virtual_from_version:44940' => 1070, + 'old:virtual_from_version:49746' => 3194, + 'old:virtual_from_version:42376' => 1077, + 'old:virtual_from_version:45067' => 1077, + 'old:virtual_from_version:46552' => 1077, + 'old:virtual_from_version:50582' => 1689, + 'old:virtual_from_version:39970' => 1048, + 'old:virtual_from_version:42613' => 1009, + 'old:virtual_from_version:44476' => 1067, + 'old:virtual_from_version:44666' => 1497, + 'old:virtual_from_version:49583' => 1070, + 'old:virtual_from_version:50389' => 1314, + 'old:virtual_from_version:44885' => 1125, + 'old:virtual_from_version:41014' => 2007, + 'old:virtual_from_version:47728' => 1109, + 'old:virtual_from_version:45221' => 1101, + 'old:virtual_from_version:42552' => 1172, + 'old:virtual_from_version:42738' => 1070, + 'old:virtual_from_version:42847' => 1067, + 'old:virtual_from_version:42750' => 1070, + 'old:virtual_from_version:46220' => 1633, + 'old:virtual_from_version:47107' => 1585, + 'old:virtual_from_version:49125' => 1404, + 'old:virtual_from_version:42680' => 1009, + 'old:virtual_from_version:40494' => 1070, + 'old:virtual_from_version:47620' => 3077, + 'old:virtual_from_version:46653' => 1077, + 'old:virtual_from_version:46235' => 1077, + 'old:virtual_from_version:50262' => 1032, + 'old:virtual_from_version:47736' => 1084, + 'old:virtual_from_version:47134' => 1077, + 'old:virtual_from_version:46244' => 1077, + 'old:virtual_from_version:43033' => 2032, + 'old:virtual_from_version:40664' => 1007, + 'old:virtual_from_version:42261' => 1070, + 'old:virtual_from_version:38333' => 1007, + 'old:virtual_from_version:47435' => 1109, + 'old:virtual_from_version:49908' => 1444, + 'old:virtual_from_version:45596' => 1172, + 'old:virtual_from_version:46692' => 1009, + 'old:virtual_from_version:44658' => 1037, + 'old:virtual_from_version:46523' => 1125, + 'old:virtual_from_version:50038' => 1012, + 'old:virtual_from_version:46695' => 1070, + 'old:virtual_from_version:47018' => 1172, + 'old:virtual_from_version:50457' => 1444, + 'old:virtual_from_version:46553' => 1404, + 'old:virtual_from_version:42578' => 1037, + 'old:virtual_from_version:42681' => 1077, + 'old:virtual_from_version:49451' => 1070, + 'old:virtual_from_version:42426' => 1037, + 'old:virtual_from_version:42064' => 1037, + 'old:virtual_from_version:48024' => 2125, + 'old:virtual_from_version:47125' => 1077, + 'old:virtual_from_version:45028' => 1009, + 'old:virtual_from_version:40389' => 1067, + 'old:virtual_from_version:50757' => 1048, + 'old:virtual_from_version:44443' => 1037, + 'old:virtual_from_version:40767' => 1070, + 'old:virtual_from_version:50479' => 3253, + 'old:virtual_from_version:44582' => 1077, + 'old:virtual_from_version:42652' => 1070, + 'old:virtual_from_version:45912' => 1172, + 'old:virtual_from_version:44912' => 1070, + 'old:virtual_from_version:46846' => 1070, + 'old:virtual_from_version:44634' => 1077, + 'old:virtual_from_version:49144' => 1070, + 'old:virtual_from_version:42975' => 1077, + 'old:virtual_from_version:40194' => 1222, + 'old:virtual_from_version:40501' => 1105, + 'old:virtual_from_version:49326' => 1077, + 'old:virtual_from_version:45409' => 1582, + 'old:virtual_from_version:46299' => 1362, + 'old:virtual_from_version:42714' => 1070, + 'old:virtual_from_version:50658' => 1321, + 'old:virtual_from_version:44256' => 1350, + 'old:virtual_from_version:47229' => 1077, + 'old:virtual_from_version:45538' => 1009, + 'old:virtual_from_version:50293' => 1035, + 'old:virtual_from_version:45214' => 1125, + 'old:virtual_from_version:47918' => 1067, + 'old:virtual_from_version:45957' => 1092, + 'old:virtual_from_version:49692' => 1224, + 'old:virtual_from_version:50741' => 3186, + 'old:virtual_from_version:49666' => 1062, + 'old:virtual_from_version:47353' => 1109, + 'old:virtual_from_version:47494' => 1070, + 'old:virtual_from_version:50452' => 1105, + 'old:virtual_from_version:44329' => 1037, + 'old:virtual_from_version:44360' => 1090, + 'old:virtual_from_version:46781' => 1517, + 'old:virtual_from_version:50240' => 1689, + 'old:virtual_from_version:45470' => 1077, + 'old:virtual_from_version:44696' => 1009, + 'old:virtual_from_version:45025' => 1144, + 'old:virtual_from_version:45027' => 1008, + 'old:virtual_from_version:43069' => 2059, + 'old:virtual_from_version:45254' => 1021, + 'old:virtual_from_version:43024' => 2049, + 'old:virtual_from_version:39351' => 1109, + 'old:virtual_from_version:45863' => 1335, + 'old:virtual_from_version:44632' => 1070, + 'old:virtual_from_version:47498' => 1125, + 'old:virtual_from_version:47637' => 1350, + 'old:virtual_from_version:46785' => 1125, + 'old:virtual_from_version:45101' => 1077, + 'old:virtual_from_version:49593' => 1689, + 'old:virtual_from_version:44394' => 1090, + 'old:virtual_from_version:42915' => 1015, + 'old:virtual_from_version:44464' => 1067, + 'old:virtual_from_version:49716' => 3192, + 'old:virtual_from_version:47486' => 1037, + 'old:virtual_from_version:38346' => 1011, + 'old:virtual_from_version:40490' => 1077, + 'old:virtual_from_version:45942' => 1007, + 'old:virtual_from_version:50634' => 3268, + 'old:virtual_from_version:40570' => 1146, + 'old:virtual_from_version:40954' => 1037, + 'old:virtual_from_version:47027' => 3008, + 'old:virtual_from_version:47318' => 3042, + 'old:virtual_from_version:45719' => 1009, + 'old:virtual_from_version:42633' => 1077, + 'old:virtual_from_version:42537' => 1070, + 'old:virtual_from_version:45701' => 1027, + 'old:virtual_from_version:44080' => 1125, + 'old:virtual_from_version:47219' => 1533, + 'old:virtual_from_version:45267' => 1010, + 'old:virtual_from_version:40803' => 1070, + 'old:virtual_from_version:44095' => 1025, + 'old:virtual_from_version:49054' => 1659, + 'old:virtual_from_version:44678' => 1076, + 'old:virtual_from_version:47884' => 1025, + 'old:virtual_from_version:47313' => 1172, + 'old:virtual_from_version:44937' => 1077, + 'old:virtual_from_version:44620' => 1067, + 'old:virtual_from_version:49037' => 1007, + 'old:virtual_from_version:49545' => 1413, + 'old:virtual_from_version:42998' => 1505, + 'old:virtual_from_version:39310' => 1000, + 'old:virtual_from_version:50003' => 3215, + 'old:virtual_from_version:47686' => 1112, + 'old:virtual_from_version:47383' => 1109, + 'old:virtual_from_version:42170' => 1172, + 'old:virtual_from_version:40510' => 1084, + 'old:virtual_from_version:44319' => 1104, + 'old:virtual_from_version:45406' => 1009, + 'old:virtual_from_version:47670' => 1009, + 'old:virtual_from_version:50671' => 3208, + 'old:virtual_from_version:42287' => 1007, + 'old:virtual_from_version:42938' => 1070, + 'old:virtual_from_version:42880' => 1015, + 'old:virtual_from_version:49141' => 1070, + 'old:virtual_from_version:46435' => 1070, + 'old:virtual_from_version:46032' => 1077, + 'old:virtual_from_version:40415' => 1077, + 'old:virtual_from_version:46934' => 1584, + 'old:virtual_from_version:47283' => 1461, + 'old:virtual_from_version:45791' => 1125, + 'old:virtual_from_version:39992' => 2007, + 'old:virtual_from_version:47462' => 1689, + 'old:virtual_from_version:46579' => 1689, + 'old:virtual_from_version:47453' => 1381, + 'old:virtual_from_version:44717' => 1070, + 'old:virtual_from_version:49793' => 1100, + 'old:virtual_from_version:44267' => 1067, + 'old:virtual_from_version:50392' => 1689, + 'old:virtual_from_version:40756' => 1070, + 'old:virtual_from_version:40890' => 1077, + 'old:virtual_from_version:42468' => 1037, + 'old:virtual_from_version:42503' => 1009, + 'old:virtual_from_version:46642' => 1537, + 'old:virtual_from_version:44398' => 1078, + 'old:virtual_from_version:44653' => 1037, + 'old:virtual_from_version:44107' => 1009, + 'old:virtual_from_version:46271' => 1070, + 'old:virtual_from_version:45014' => 1413, + 'old:virtual_from_version:38341' => 1005, + 'old:virtual_from_version:50334' => 1125, + 'old:virtual_from_version:49969' => 3131, + 'old:virtual_from_version:45044' => 1030, + 'old:virtual_from_version:42955' => 1150, + 'old:virtual_from_version:50543' => 1689, + 'old:virtual_from_version:46372' => 1402, + 'old:virtual_from_version:42623' => 1070, + 'old:virtual_from_version:42270' => 1015, + 'old:virtual_from_version:44854' => 1070, + 'old:virtual_from_version:47764' => 3094, + 'old:virtual_from_version:39156' => 1136, + 'old:virtual_from_version:47063' => 1689, + 'old:virtual_from_version:46169' => 1067, + 'old:virtual_from_version:49553' => 1070, + 'old:virtual_from_version:47771' => 1109, + 'old:virtual_from_version:46091' => 1656, + 'old:virtual_from_version:42150' => 1070, + 'old:virtual_from_version:44872' => 1141, + 'old:virtual_from_version:46312' => 1404, + 'old:virtual_from_version:47738' => 1404, + 'old:virtual_from_version:46779' => 1172, + 'old:virtual_from_version:45750' => 1407, + 'old:virtual_from_version:42122' => 1353, + 'old:virtual_from_version:47588' => 1077, + 'old:virtual_from_version:42805' => 1007, + 'old:virtual_from_version:47632' => 1583, + 'old:virtual_from_version:42539' => 1077, + 'old:virtual_from_version:42939' => 1009, + 'old:virtual_from_version:42824' => 1037, + 'old:virtual_from_version:49483' => 3152, + 'old:virtual_from_version:45788' => 1007, + 'old:virtual_from_version:42269' => 1009, + 'old:virtual_from_version:46555' => 1070, + 'old:virtual_from_version:47068' => 1136, + 'old:virtual_from_version:46484' => 1172, + 'old:virtual_from_version:45593' => 1110, + 'old:virtual_from_version:49365' => 1584, + 'old:virtual_from_version:50160' => 3214, + 'old:virtual_from_version:49525' => 1404, + 'old:virtual_from_version:47088' => 1048, + 'old:virtual_from_version:46755' => 1077, + 'old:virtual_from_version:39326' => 1067, + 'old:virtual_from_version:45857' => 1109, + 'old:virtual_from_version:49311' => 3162, + 'old:virtual_from_version:50618' => 3259, + 'old:virtual_from_version:46017' => 1006, + 'old:virtual_from_version:40784' => 1067, + 'old:virtual_from_version:44858' => 1070, + 'old:virtual_from_version:45886' => 1125, + 'old:virtual_from_version:40776' => 1077, + 'old:virtual_from_version:46402' => 1672, + 'old:virtual_from_version:45929' => 1009, + 'old:virtual_from_version:42763' => 1110, + 'old:virtual_from_version:42626' => 1051, + 'old:virtual_from_version:45850' => 1125, + 'old:virtual_from_version:50407' => 1583, + 'old:virtual_from_version:50492' => 3258, + 'old:virtual_from_version:39402' => 1168, + 'old:virtual_from_version:50454' => 1314, + 'old:virtual_from_version:40975' => 1009, + 'old:virtual_from_version:45543' => 1613, + 'old:virtual_from_version:43006' => 2031, + 'old:virtual_from_version:47432' => 1580, + 'old:virtual_from_version:42528' => 1037, + 'old:virtual_from_version:44057' => 1081, + 'old:virtual_from_version:49564' => 1070, + 'old:virtual_from_version:46581' => 1070, + 'old:virtual_from_version:49297' => 3152, + 'old:virtual_from_version:47520' => 1009, + 'old:virtual_from_version:44867' => 1107, + 'old:virtual_from_version:42364' => 1077, + 'old:virtual_from_version:44144' => 1070, + 'old:virtual_from_version:44705' => 1070, + 'old:virtual_from_version:49316' => 1077, + 'old:virtual_from_version:47837' => 1583, + 'old:virtual_from_version:44200' => 1037, + 'old:virtual_from_version:46680' => 1125, + 'old:virtual_from_version:50692' => 3259, + 'old:virtual_from_version:49948' => 1689, + 'old:virtual_from_version:45658' => 1172, + 'old:virtual_from_version:38606' => 1108, + 'old:virtual_from_version:45779' => 1574, + 'old:virtual_from_version:40012' => 1069, + 'old:virtual_from_version:50179' => 1025, + 'old:virtual_from_version:44160' => 1009, + 'old:virtual_from_version:44312' => 1077, + 'old:virtual_from_version:47254' => 1172, + 'old:virtual_from_version:47901' => 1689, + 'old:virtual_from_version:49619' => 1696, + 'old:virtual_from_version:38610' => 1104, + 'old:virtual_from_version:42943' => 1070, + 'old:virtual_from_version:50707' => 3259, + 'old:virtual_from_version:44274' => 1037, + 'old:virtual_from_version:46060' => 1077, + 'old:virtual_from_version:42474' => 1172, + 'old:virtual_from_version:47758' => 1125, + 'old:virtual_from_version:44936' => 1009, + 'old:virtual_from_version:40938' => 1070, + 'old:virtual_from_version:44023' => 1070, + 'old:virtual_from_version:47222' => 1107, + 'old:virtual_from_version:47547' => 1109, + 'old:virtual_from_version:50495' => 3259, + 'old:virtual_from_version:50318' => 1070, + 'old:virtual_from_version:47390' => 3008, + 'old:virtual_from_version:49875' => 1107, + 'old:virtual_from_version:45607' => 1025, + 'old:virtual_from_version:44825' => 1009, + 'old:virtual_from_version:45562' => 1025, + 'old:virtual_from_version:39725' => 1062, + 'old:virtual_from_version:42098' => 1070, + 'old:virtual_from_version:39718' => 1222, + 'old:virtual_from_version:49916' => 1444, + 'old:virtual_from_version:42816' => 1077, + 'old:virtual_from_version:47493' => 1077, + 'old:virtual_from_version:46355' => 1057, + 'old:virtual_from_version:44549' => 1070, + 'old:virtual_from_version:45870' => 1070, + 'old:virtual_from_version:46351' => 1077, + 'old:virtual_from_version:45844' => 1077, + 'old:virtual_from_version:47499' => 1109, + 'old:virtual_from_version:50145' => 3210, + 'old:virtual_from_version:40078' => 1110, + 'old:virtual_from_version:47304' => 3042, + 'old:virtual_from_version:45444' => 1136, + 'old:virtual_from_version:45016' => 1000, + 'old:virtual_from_version:42378' => 1404, + 'old:virtual_from_version:40685' => 1067, + 'old:virtual_from_version:46544' => 1689, + 'old:virtual_from_version:44058' => 1125, + 'old:virtual_from_version:45431' => 1025, + 'old:virtual_from_version:50744' => 1417, + 'old:virtual_from_version:49913' => 1070, + 'old:virtual_from_version:45407' => 1404, + 'old:virtual_from_version:42141' => 1110, + 'old:virtual_from_version:50057' => 1125, + 'old:virtual_from_version:50144' => 3058, + 'old:virtual_from_version:46159' => 1404, + 'old:virtual_from_version:40736' => 1077, + 'old:virtual_from_version:47216' => 1077, + 'old:virtual_from_version:50229' => 1007, + 'old:virtual_from_version:42247' => 1404, + 'old:virtual_from_version:49151' => 1172, + 'old:virtual_from_version:43013' => 2038, + 'old:virtual_from_version:40831' => 1407, + 'old:virtual_from_version:39477' => 1404, + 'old:virtual_from_version:45781' => 1136, + 'old:virtual_from_version:42561' => 1077, + 'old:virtual_from_version:40715' => 1070, + 'old:virtual_from_version:47535' => 1070, + 'old:virtual_from_version:49664' => 1583, + 'old:virtual_from_version:46648' => 1125, + 'old:virtual_from_version:50221' => 1314, + 'old:virtual_from_version:42491' => 1009, + 'old:virtual_from_version:46130' => 1077, + 'old:virtual_from_version:45346' => 1413, + 'old:virtual_from_version:49285' => 1009, + 'old:virtual_from_version:45659' => 1136, + 'old:virtual_from_version:45618' => 1136, + 'old:virtual_from_version:45979' => 1613, + 'old:virtual_from_version:47167' => 1077, + 'old:virtual_from_version:46603' => 1172, + 'old:virtual_from_version:49801' => 3131, + 'old:virtual_from_version:49888' => 1035, + 'old:virtual_from_version:40177' => 1006, + 'old:virtual_from_version:47622' => 1070, + 'old:virtual_from_version:50558' => 3265, + 'old:virtual_from_version:46135' => 1404, + 'old:virtual_from_version:46242' => 1172, + 'old:virtual_from_version:49386' => 1659, + 'old:virtual_from_version:47450' => 1109, + 'old:virtual_from_version:45058' => 1049, + 'old:virtual_from_version:47659' => 1125, + 'old:virtual_from_version:49731' => 1070, + 'old:virtual_from_version:44962' => 1000, + 'old:virtual_from_version:47540' => 1070, + 'old:virtual_from_version:42765' => 1484, + 'old:virtual_from_version:44197' => 1009, + 'old:virtual_from_version:45150' => 1009, + 'old:virtual_from_version:42348' => 1070, + 'old:virtual_from_version:47158' => 1584, + 'old:virtual_from_version:47518' => 1037, + 'old:virtual_from_version:49014' => 3129, + 'old:virtual_from_version:45357' => 1031, + 'old:virtual_from_version:42950' => 1009, + 'old:virtual_from_version:42812' => 1107, + 'old:virtual_from_version:49342' => 1125, + 'old:virtual_from_version:45537' => 1070, + 'old:virtual_from_version:39528' => 1107, + 'old:virtual_from_version:50412' => 3201, + 'old:virtual_from_version:45749' => 1077, + 'old:virtual_from_version:44960' => 1016, + 'old:virtual_from_version:45222' => 1576, + 'old:virtual_from_version:49688' => 1381, + 'old:virtual_from_version:49522' => 1488, + 'old:virtual_from_version:47007' => 1077, + 'old:virtual_from_version:44405' => 1069, + 'old:virtual_from_version:40968' => 1070, + 'old:virtual_from_version:42500' => 1107, + 'old:virtual_from_version:47970' => 1109, + 'old:virtual_from_version:46400' => 1402, + 'old:virtual_from_version:46440' => 1070, + 'old:virtual_from_version:45761' => 1362, + 'old:virtual_from_version:44300' => 1037, + 'old:virtual_from_version:50404' => 3214, + 'old:virtual_from_version:42052' => 1037, + 'old:virtual_from_version:49412' => 3008, + 'old:virtual_from_version:42140' => 1037, + 'old:virtual_from_version:50502' => 1035, + 'old:virtual_from_version:46164' => 1077, + 'old:virtual_from_version:47618' => 1583, + 'old:virtual_from_version:42966' => 1016, + 'old:virtual_from_version:47956' => 1077, + 'old:virtual_from_version:50510' => 3261, + 'old:virtual_from_version:47702' => 1109, + 'old:virtual_from_version:44695' => 1070, + 'old:virtual_from_version:49118' => 1048, + 'old:virtual_from_version:47755' => 3092, + 'old:virtual_from_version:40436' => 1057, + 'old:virtual_from_version:47786' => 1125, + 'old:virtual_from_version:50053' => 1314, + 'old:virtual_from_version:47748' => 1070, + 'old:virtual_from_version:45374' => 1107, + 'old:virtual_from_version:45702' => 1077, + 'old:virtual_from_version:44747' => 1009, + 'old:virtual_from_version:47531' => 3058, + 'old:virtual_from_version:47591' => 1109, + 'old:virtual_from_version:39215' => 1058, + 'old:virtual_from_version:47757' => 1070, + 'old:virtual_from_version:42366' => 1311, + 'old:virtual_from_version:44390' => 1048, + 'old:virtual_from_version:47335' => 3043, + 'old:virtual_from_version:46193' => 1077, + 'old:virtual_from_version:50312' => 3131, + 'old:virtual_from_version:40620' => 1025, + 'old:virtual_from_version:46322' => 1402, + 'old:virtual_from_version:42375' => 1070, + 'old:virtual_from_version:47895' => 1070, + 'old:virtual_from_version:45615' => 1009, + 'old:virtual_from_version:50673' => 3208, + 'old:virtual_from_version:42711' => 1037, + 'old:virtual_from_version:49087' => 3030, + 'old:virtual_from_version:38858' => 1070, + 'old:virtual_from_version:44957' => 1057, + 'old:virtual_from_version:45933' => 1070, + 'old:virtual_from_version:47614' => 1069, + 'old:virtual_from_version:42082' => 1077, + 'old:virtual_from_version:45448' => 1109, + 'old:virtual_from_version:39583' => 1031, + 'old:virtual_from_version:46741' => 1689, + 'old:virtual_from_version:50189' => 3025, + 'old:virtual_from_version:47691' => 1109, + 'old:virtual_from_version:49415' => 1532, + 'old:virtual_from_version:46443' => 1051, + 'old:virtual_from_version:42217' => 1000, + 'old:virtual_from_version:42471' => 1112, + 'old:virtual_from_version:47617' => 1565, + 'old:virtual_from_version:40953' => 1077, + 'old:virtual_from_version:45255' => 1051, + 'old:virtual_from_version:50689' => 1404, + 'old:virtual_from_version:40129' => 1125, + 'old:virtual_from_version:49741' => 1070, + 'old:virtual_from_version:42335' => 1077, + 'old:virtual_from_version:39990' => 1260, + 'old:virtual_from_version:49356' => 3167, + 'old:virtual_from_version:40871' => 1009, + 'old:virtual_from_version:42678' => 1048, + 'old:virtual_from_version:49663' => 1150, + 'old:virtual_from_version:44953' => 1025, + 'old:virtual_from_version:46145' => 1009, + 'old:virtual_from_version:45809' => 1404, + 'old:virtual_from_version:50423' => 1689, + 'old:virtual_from_version:47880' => 1585, + 'old:virtual_from_version:47233' => 1077, + 'old:virtual_from_version:47377' => 1109, + 'old:virtual_from_version:44340' => 1025, + 'old:virtual_from_version:46076' => 1404, + 'old:virtual_from_version:48021' => 2121, + 'old:virtual_from_version:39126' => 1070, + 'old:virtual_from_version:44593' => 1070, + 'old:virtual_from_version:50764' => 3259, + 'old:virtual_from_version:43008' => 2033, + 'old:virtual_from_version:50736' => 1489, + 'old:virtual_from_version:44763' => 1070, + 'old:virtual_from_version:44213' => 1077, + 'old:virtual_from_version:42919' => 1062, + 'old:virtual_from_version:45892' => 1109, + 'old:virtual_from_version:46505' => 1084, + 'old:virtual_from_version:49915' => 1107, + 'old:virtual_from_version:42614' => 1025, + 'old:virtual_from_version:47886' => 1108, + 'old:virtual_from_version:49590' => 1404, + 'old:virtual_from_version:45652' => 1107, + 'old:virtual_from_version:44975' => 1023, + 'old:virtual_from_version:44715' => 1067, + 'old:virtual_from_version:50748' => 3206, + 'old:virtual_from_version:42487' => 1037, + 'old:virtual_from_version:50646' => 1108, + 'old:virtual_from_version:42760' => 1009, + 'old:virtual_from_version:44288' => 1077, + 'old:virtual_from_version:44243' => 1110, + 'old:virtual_from_version:47877' => 1314, + 'old:virtual_from_version:49843' => 3131, + 'old:virtual_from_version:38797' => 1125, + 'old:virtual_from_version:49165' => 1070, + 'old:virtual_from_version:42521' => 1037, + 'old:virtual_from_version:42882' => 1077, + 'old:virtual_from_version:45620' => 1067, + 'old:virtual_from_version:46652' => 1025, + 'old:virtual_from_version:42601' => 1077, + 'old:virtual_from_version:42971' => 1063, + 'old:virtual_from_version:46920' => 1077, + 'old:virtual_from_version:47360' => 1037, + 'old:virtual_from_version:47006' => 1172, + 'old:virtual_from_version:47228' => 1172, + 'old:virtual_from_version:44339' => 1009, + 'old:virtual_from_version:42660' => 1037, + 'old:virtual_from_version:46379' => 1070, + 'old:virtual_from_version:47384' => 1077, + 'old:virtual_from_version:49919' => 3206, + 'old:virtual_from_version:42103' => 1037, + 'old:virtual_from_version:50141' => 1580, + 'old:virtual_from_version:50743' => 1105, + 'old:virtual_from_version:45765' => 1048, + 'old:virtual_from_version:49426' => 3002, + 'old:virtual_from_version:44496' => 1037, + 'old:virtual_from_version:49405' => 1689, + 'old:virtual_from_version:49894' => 1070, + 'old:virtual_from_version:45678' => 1009, + 'old:virtual_from_version:42332' => 1070, + 'old:virtual_from_version:50405' => 3227, + 'old:virtual_from_version:46935' => 1585, + 'old:virtual_from_version:42095' => 1077, + 'old:virtual_from_version:39424' => 1172, + 'old:virtual_from_version:39944' => 1037, + 'old:virtual_from_version:47761' => 1077, + 'old:virtual_from_version:42825' => 1172, + 'old:virtual_from_version:45848' => 1627, + 'old:virtual_from_version:38621' => 1081, + 'old:virtual_from_version:45852' => 1009, + 'old:virtual_from_version:44883' => 1172, + 'old:virtual_from_version:42022' => 1009, + 'old:virtual_from_version:40899' => 1025, + 'old:virtual_from_version:47561' => 1109, + 'old:virtual_from_version:42685' => 1491, + 'old:virtual_from_version:46345' => 1172, + 'old:virtual_from_version:46210' => 1555, + 'old:virtual_from_version:45487' => 1070, + 'old:virtual_from_version:49196' => 1077, + 'old:virtual_from_version:46640' => 1125, + 'old:virtual_from_version:50699' => 1689, + 'old:virtual_from_version:44603' => 1007, + 'old:virtual_from_version:43061' => 2062, + 'old:virtual_from_version:46839' => 1105, + 'old:virtual_from_version:44913' => 1009, + 'old:virtual_from_version:50693' => 3271, + 'old:virtual_from_version:39753' => 1067, + 'old:virtual_from_version:50124' => 1070, + 'old:virtual_from_version:46557' => 1009, + 'old:virtual_from_version:42708' => 1070, + 'old:virtual_from_version:45540' => 1077, + 'old:virtual_from_version:50705' => 1417, + 'old:virtual_from_version:42494' => 1077, + 'old:virtual_from_version:46018' => 1077, + 'old:virtual_from_version:46359' => 1077, + 'old:virtual_from_version:44436' => 1037, + 'old:virtual_from_version:44265' => 1037, + 'old:virtual_from_version:49008' => 1070, + 'old:virtual_from_version:50769' => 1070, + 'old:virtual_from_version:46620' => 1404, + 'old:virtual_from_version:38677' => 1009, + 'old:virtual_from_version:47664' => 1109, + 'old:virtual_from_version:43011' => 2036, + 'old:virtual_from_version:47176' => 1638, + 'old:virtual_from_version:45647' => 1076, + 'old:virtual_from_version:47309' => 1070, + 'old:virtual_from_version:44241' => 1077, + 'old:virtual_from_version:49465' => 1067, + 'old:virtual_from_version:44387' => 1094, + 'old:virtual_from_version:44729' => 1541, + 'old:virtual_from_version:46563' => 1172, + 'old:virtual_from_version:50359' => 1689, + 'old:virtual_from_version:47573' => 1580, + 'old:virtual_from_version:44748' => 1077, + 'old:virtual_from_version:50542' => 1583, + 'old:virtual_from_version:44086' => 1070, + 'old:virtual_from_version:38873' => 1135, + 'old:virtual_from_version:46887' => 1077, + 'old:virtual_from_version:50489' => 1491, + 'old:virtual_from_version:50611' => 1417, + 'old:virtual_from_version:32145' => 1099, + 'old:virtual_from_version:46408' => 1402, + 'old:virtual_from_version:44635' => 1037, + 'old:virtual_from_version:47889' => 1125, + 'old:virtual_from_version:42569' => 1037, + 'old:virtual_from_version:46133' => 1067, + 'old:virtual_from_version:42273' => 1037, + 'old:virtual_from_version:50430' => 1659, + 'old:virtual_from_version:50039' => 3131, + 'old:virtual_from_version:45229' => 1461, + 'old:virtual_from_version:43048' => 2021, + 'old:virtual_from_version:50497' => 3251, + 'old:virtual_from_version:42540' => 1037, + 'old:virtual_from_version:49552' => 1007, + 'old:virtual_from_version:45743' => 1532, + 'old:virtual_from_version:44269' => 1125, + 'old:virtual_from_version:39977' => 1104, + 'old:virtual_from_version:46955' => 3012, + 'old:virtual_from_version:47374' => 3008, + 'old:virtual_from_version:42441' => 1070, + 'old:virtual_from_version:47642' => 1077, + 'old:virtual_from_version:45513' => 1025, + 'old:virtual_from_version:44545' => 1070, + 'old:virtual_from_version:40723' => 1077, + 'old:virtual_from_version:47072' => 1689, + 'old:virtual_from_version:47413' => 1125, + 'old:virtual_from_version:47990' => 3016, + 'old:virtual_from_version:49953' => 3131, + 'old:virtual_from_version:42726' => 1083, + 'old:virtual_from_version:50437' => 1257, + 'old:virtual_from_version:50092' => 1172, + 'old:virtual_from_version:40790' => 1077, + 'old:virtual_from_version:42152' => 1077, + 'old:virtual_from_version:46682' => 1070, + 'old:virtual_from_version:49128' => 1584, + 'old:virtual_from_version:45278' => 1008, + 'old:virtual_from_version:49247' => 1404, + 'old:virtual_from_version:45361' => 1584, + 'old:virtual_from_version:44253' => 1081, + 'old:virtual_from_version:44455' => 1136, + 'old:virtual_from_version:42044' => 1009, + 'old:virtual_from_version:47128' => 1621, + 'old:virtual_from_version:48012' => 2112, + 'old:virtual_from_version:49111' => 1136, + 'old:virtual_from_version:45742' => 1125, + 'old:virtual_from_version:47955' => 1112, + 'old:virtual_from_version:42363' => 1025, + 'old:virtual_from_version:50201' => 1069, + 'old:virtual_from_version:47021' => 1532, + 'old:virtual_from_version:46518' => 1067, + 'old:virtual_from_version:40043' => 1094, + 'old:virtual_from_version:49737' => 1128, + 'old:virtual_from_version:44752' => 1006, + 'old:virtual_from_version:39778' => 1000, + 'old:virtual_from_version:43108' => 2100, + 'old:virtual_from_version:46368' => 1555, + 'old:virtual_from_version:42675' => 1077, + 'old:virtual_from_version:50076' => 3131, + 'old:virtual_from_version:44906' => 1321, + 'old:virtual_from_version:47070' => 1172, + 'old:virtual_from_version:50719' => 3259, + 'old:virtual_from_version:49628' => 3184, + 'old:virtual_from_version:46031' => 1070, + 'old:virtual_from_version:49308' => 1025, + 'old:virtual_from_version:46125' => 1070, + 'old:virtual_from_version:42289' => 1015, + 'old:virtual_from_version:40378' => 1107, + 'old:virtual_from_version:45135' => 1009, + 'old:virtual_from_version:50330' => 3238, + 'old:virtual_from_version:47688' => 1621, + 'old:virtual_from_version:42488' => 1136, + 'old:virtual_from_version:45471' => 1031, + 'old:virtual_from_version:44778' => 1076, + 'old:virtual_from_version:45566' => 1532, + 'old:virtual_from_version:50171' => 1314, + 'old:virtual_from_version:46346' => 1077, + 'old:virtual_from_version:42666' => 1488, + 'old:virtual_from_version:42842' => 1077, + 'old:virtual_from_version:44380' => 1023, + 'old:virtual_from_version:45356' => 1012, + 'old:virtual_from_version:40814' => 1070, + 'old:virtual_from_version:40214' => 1109, + 'old:virtual_from_version:42782' => 1070, + 'old:virtual_from_version:44710' => 1107, + 'old:virtual_from_version:42572' => 1070, + 'old:virtual_from_version:45293' => 1580, + 'old:virtual_from_version:47365' => 1444, + 'old:virtual_from_version:50088' => 3131, + 'old:virtual_from_version:14174' => 1059, + 'old:virtual_from_version:49432' => 3008, + 'old:virtual_from_version:47203' => 1123, + 'old:virtual_from_version:46856' => 3003, + 'old:virtual_from_version:47876' => 1109, + 'old:virtual_from_version:40771' => 1077, + 'old:virtual_from_version:47497' => 1070, + 'old:virtual_from_version:49194' => 1649, + 'old:virtual_from_version:42342' => 1009, + 'old:virtual_from_version:45322' => 1586, + 'old:virtual_from_version:39174' => 1404, + 'old:virtual_from_version:47388' => 1037, + 'old:virtual_from_version:46959' => 1105, + 'old:virtual_from_version:50130' => 1070, + 'old:virtual_from_version:48015' => 2115, + 'old:virtual_from_version:38634' => 1000, + 'old:virtual_from_version:40413' => 1070, + 'old:virtual_from_version:45141' => 1321, + 'old:virtual_from_version:50025' => 1070, + 'old:virtual_from_version:42121' => 1037, + 'old:virtual_from_version:42498' => 1057, + 'old:virtual_from_version:44115' => 1107, + 'old:virtual_from_version:47548' => 1077, + 'old:virtual_from_version:42409' => 1172, + 'old:virtual_from_version:47040' => 1077, + 'old:virtual_from_version:46514' => 1007, + 'old:virtual_from_version:45140' => 1110, + 'old:virtual_from_version:50361' => 1125, + 'old:virtual_from_version:40980' => 1125, + 'old:virtual_from_version:47381' => 1070, + 'old:virtual_from_version:45283' => 1006, + 'old:virtual_from_version:38756' => 1007, + 'old:virtual_from_version:42761' => 1077, + 'old:virtual_from_version:42846' => 1081, + 'old:virtual_from_version:50358' => 1150, + 'old:virtual_from_version:50522' => 1033, + 'old:virtual_from_version:49454' => 1689, + 'old:virtual_from_version:45846' => 1498, + 'old:virtual_from_version:46794' => 1070, + 'old:virtual_from_version:46263' => 1537, + 'old:virtual_from_version:49016' => 1009, + 'old:virtual_from_version:46898' => 2100, + 'old:virtual_from_version:47794' => 3104, + 'old:virtual_from_version:44410' => 1017, + 'old:virtual_from_version:46156' => 1077, + 'old:virtual_from_version:40996' => 1077, + 'old:virtual_from_version:47215' => 1009, + 'old:virtual_from_version:49421' => 1070, + 'old:virtual_from_version:44999' => 1105, + 'old:virtual_from_version:50247' => 1070, + 'old:virtual_from_version:47015' => 1125, + 'old:virtual_from_version:45721' => 1362, + 'old:virtual_from_version:49557' => 1067, + 'old:virtual_from_version:49951' => 1070, + 'old:virtual_from_version:45696' => 1019, + 'old:virtual_from_version:49520' => 1574, + 'old:virtual_from_version:50556' => 1689, + 'old:virtual_from_version:42305' => 1077, + 'old:virtual_from_version:46619' => 1077, + 'old:virtual_from_version:44806' => 1070, + 'old:virtual_from_version:50725' => 3259, + 'old:virtual_from_version:47350' => 1077, + 'old:virtual_from_version:42600' => 1009, + 'old:virtual_from_version:38611' => 1122, + 'old:virtual_from_version:44859' => 1077, + 'old:virtual_from_version:40815' => 1009, + 'old:virtual_from_version:50304' => 3131, + 'old:virtual_from_version:39906' => 1404, + 'old:virtual_from_version:42399' => 1067, + 'old:virtual_from_version:39503' => 1183, + 'old:virtual_from_version:50399' => 1689, + 'old:virtual_from_version:40557' => 1070, + 'old:virtual_from_version:50320' => 1067, + 'old:virtual_from_version:46538' => 1077, + 'old:virtual_from_version:43059' => 2059, + 'old:virtual_from_version:42929' => 1037, + 'old:virtual_from_version:48020' => 2120, + 'old:virtual_from_version:39521' => 1104, + 'old:virtual_from_version:50380' => 3131, + 'old:virtual_from_version:50170' => 3226, + 'old:virtual_from_version:45751' => 1532, + 'old:virtual_from_version:50043' => 1012, + 'old:virtual_from_version:45927' => 1633, + 'old:virtual_from_version:49441' => 1404, + 'old:virtual_from_version:46067' => 1077, + 'old:virtual_from_version:50419' => 1136, + 'old:virtual_from_version:42679' => 1070, + 'old:virtual_from_version:40810' => 1125, + 'old:virtual_from_version:49279' => 1077, + 'old:virtual_from_version:42251' => 1025, + 'old:virtual_from_version:50390' => 1125, + 'old:virtual_from_version:46940' => 1070, + 'old:virtual_from_version:44417' => 1027, + 'old:virtual_from_version:44447' => 1037, + 'old:virtual_from_version:39241' => 1109, + 'old:virtual_from_version:39524' => 1025, + 'old:virtual_from_version:49494' => 1404, + 'old:virtual_from_version:47853' => 1585, + 'old:virtual_from_version:47347' => 1125, + 'old:virtual_from_version:49521' => 1580, + 'old:virtual_from_version:50537' => 1381, + 'old:virtual_from_version:47788' => 1077, + 'old:virtual_from_version:42068' => 1077, + 'old:virtual_from_version:40484' => 1370, + 'old:virtual_from_version:46014' => 1105, + 'old:virtual_from_version:49771' => 3131, + 'old:virtual_from_version:42809' => 1037, + 'old:virtual_from_version:42728' => 1237, + 'old:virtual_from_version:44408' => 1016, + 'old:virtual_from_version:40748' => 1025, + 'old:virtual_from_version:43082' => 2079, + 'old:virtual_from_version:40716' => 1077, + 'old:virtual_from_version:42097' => 1110, + 'old:virtual_from_version:45817' => 1019, + 'old:virtual_from_version:45338' => 1125, + 'old:virtual_from_version:46768' => 1517, + 'old:virtual_from_version:44542' => 1077, + 'old:virtual_from_version:47327' => 1125, + 'old:virtual_from_version:44589' => 1077, + 'old:virtual_from_version:40402' => 1352, + 'old:virtual_from_version:42119' => 1070, + 'old:virtual_from_version:49448' => 1689, + 'old:virtual_from_version:49216' => 1190, + 'old:virtual_from_version:46434' => 1077, + 'old:virtual_from_version:45654' => 1009, + 'old:virtual_from_version:50376' => 1070, + 'old:virtual_from_version:47775' => 1689, + 'old:virtual_from_version:49444' => 1070, + 'old:virtual_from_version:44951' => 1070, + 'old:virtual_from_version:50727' => 1070, + 'old:virtual_from_version:40927' => 1070, + 'old:virtual_from_version:40666' => 1012, + 'old:virtual_from_version:50119' => 1112, + 'old:virtual_from_version:42800' => 1498, + 'old:virtual_from_version:44510' => 1532, + 'old:virtual_from_version:44611' => 1125, + 'old:virtual_from_version:44893' => 1048, + 'old:virtual_from_version:46993' => 1077, + 'old:virtual_from_version:46608' => 1070, + 'old:virtual_from_version:45968' => 1070, + 'old:virtual_from_version:47840' => 1689, + 'old:virtual_from_version:46611' => 1012, + 'old:virtual_from_version:42585' => 1009, + 'old:virtual_from_version:44264' => 1077, + 'old:virtual_from_version:46008' => 1125, + 'old:virtual_from_version:46059' => 1070, + 'old:virtual_from_version:42393' => 1037, + 'old:virtual_from_version:40997' => 1037, + 'old:virtual_from_version:44707' => 1037, + 'old:virtual_from_version:45312' => 1584, + 'old:virtual_from_version:47369' => 1109, + 'old:virtual_from_version:46995' => 3008, + 'old:virtual_from_version:50745' => 1689, + 'old:virtual_from_version:50213' => 1070, + 'old:virtual_from_version:49634' => 1532, + 'old:virtual_from_version:42774' => 1110, + 'old:virtual_from_version:47415' => 1105, + 'old:virtual_from_version:42260' => 1000, + 'old:virtual_from_version:46341' => 1671, + 'old:virtual_from_version:47112' => 3019, + 'old:virtual_from_version:42069' => 1037, + 'old:virtual_from_version:47389' => 1037, + 'old:virtual_from_version:40700' => 1025, + 'old:virtual_from_version:49296' => 1580, + 'old:virtual_from_version:49789' => 1070, + 'old:virtual_from_version:42793' => 1009, + 'old:virtual_from_version:50259' => 1689, + 'old:virtual_from_version:49434' => 1070, + 'old:virtual_from_version:45785' => 1048, + 'old:virtual_from_version:44485' => 1107, + 'old:virtual_from_version:49673' => 1136, + 'old:virtual_from_version:47421' => 1109, + 'old:virtual_from_version:40918' => 1070, + 'old:virtual_from_version:45284' => 1077, + 'old:virtual_from_version:42860' => 1498, + 'old:virtual_from_version:49822' => 1565, + 'old:virtual_from_version:46463' => 1172, + 'old:virtual_from_version:50710' => 1070, + 'old:virtual_from_version:49052' => 3094, + 'old:virtual_from_version:49870' => 1689, + 'old:virtual_from_version:42046' => 1037, + 'old:virtual_from_version:44519' => 1112, + 'old:virtual_from_version:50028' => 1032, + 'old:virtual_from_version:43096' => 2088, + 'old:virtual_from_version:18960' => 1041, + 'old:virtual_from_version:44157' => 1125, + 'old:virtual_from_version:47352' => 1070, + 'old:virtual_from_version:42822' => 1025, + 'old:virtual_from_version:44762' => 1062, + 'old:virtual_from_version:45362' => 1585, + 'old:virtual_from_version:42199' => 1070, + 'old:virtual_from_version:42778' => 1009, + 'old:virtual_from_version:47110' => 1640, + 'old:virtual_from_version:46533' => 1077, + 'old:virtual_from_version:42045' => 1077, + 'old:virtual_from_version:49224' => 1070, + 'old:virtual_from_version:40909' => 1077, + 'old:virtual_from_version:40964' => 1037, + 'old:virtual_from_version:40662' => 1070, + 'old:virtual_from_version:40665' => 1009, + 'old:virtual_from_version:49848' => 1537, + 'old:virtual_from_version:47105' => 1583, + 'old:virtual_from_version:42163' => 1172, + 'old:virtual_from_version:49713' => 1404, + 'old:virtual_from_version:45511' => 1105, + 'old:virtual_from_version:50485' => 3189, + 'old:virtual_from_version:45956' => 1077, + 'old:virtual_from_version:49671' => 3155, + 'old:virtual_from_version:46441' => 1077, + 'old:virtual_from_version:39907' => 1222, + 'old:virtual_from_version:47224' => 1077, + 'old:virtual_from_version:46706' => 1697, + 'old:virtual_from_version:44070' => 1037, + 'old:virtual_from_version:45385' => 1125, + 'old:virtual_from_version:35826' => 1000, + 'old:virtual_from_version:44077' => 1077, + 'old:virtual_from_version:47669' => 1112, + 'old:virtual_from_version:39895' => 1007, + 'old:virtual_from_version:45583' => 1615, + 'old:virtual_from_version:44469' => 1077, + 'old:virtual_from_version:50661' => 1110, + 'old:virtual_from_version:50303' => 3131, + 'old:virtual_from_version:49697' => 1640, + 'old:virtual_from_version:40974' => 1007, + 'old:virtual_from_version:42057' => 1077, + 'old:virtual_from_version:45724' => 1009, + 'old:virtual_from_version:46306' => 1125, + 'old:virtual_from_version:46968' => 3013, + 'old:virtual_from_version:50375' => 1007, + 'old:virtual_from_version:50181' => 3131, + 'old:virtual_from_version:50448' => 1070, + 'old:virtual_from_version:42802' => 1172, + 'old:virtual_from_version:47975' => 1649, + 'old:virtual_from_version:46506' => 1112, + 'old:virtual_from_version:47181' => 1125, + 'old:virtual_from_version:46644' => 1077, + 'old:virtual_from_version:49669' => 1404, + 'old:virtual_from_version:39222' => 1110, + 'old:virtual_from_version:44680' => 1070, + 'old:virtual_from_version:47744' => 1077, + 'old:virtual_from_version:46671' => 1070, + 'old:virtual_from_version:40869' => 1222, + 'old:virtual_from_version:44470' => 1037, + 'old:virtual_from_version:46430' => 1587, + 'old:virtual_from_version:49491' => 1659, + 'old:virtual_from_version:42957' => 1070, + 'old:virtual_from_version:46765' => 1136, + 'old:virtual_from_version:44935' => 1078, + 'old:virtual_from_version:40775' => 1070, + 'old:virtual_from_version:47629' => 1070, + 'old:virtual_from_version:38758' => 1125, + 'old:virtual_from_version:45773' => 1067, + 'old:virtual_from_version:45424' => 1007, + 'old:virtual_from_version:42889' => 1067, + 'old:virtual_from_version:44681' => 1009, + 'old:virtual_from_version:44127' => 1077, + 'old:virtual_from_version:44699' => 1037, + 'old:virtual_from_version:46178' => 1125, + 'old:virtual_from_version:42258' => 1077, + 'old:virtual_from_version:44831' => 1024, + 'old:virtual_from_version:46517' => 1109, + 'old:virtual_from_version:44529' => 1037, + 'old:virtual_from_version:47185' => 1404, + 'old:virtual_from_version:42677' => 1109, + 'old:virtual_from_version:45661' => 1070, + 'old:virtual_from_version:44560' => 1070, + 'old:virtual_from_version:40951' => 1070, + 'old:virtual_from_version:45113' => 1517, + 'old:virtual_from_version:45008' => 1413, + 'old:virtual_from_version:49359' => 1125, + 'old:virtual_from_version:44703' => 1539, + 'old:virtual_from_version:42643' => 1037, + 'old:virtual_from_version:47340' => 1037, + 'old:virtual_from_version:42133' => 1077, + 'old:virtual_from_version:47166' => 1001, + 'old:virtual_from_version:45528' => 1136, + 'old:virtual_from_version:45249' => 1064, + 'old:virtual_from_version:50549' => 3259, + 'old:virtual_from_version:43042' => 2054, + 'old:virtual_from_version:44064' => 1070, + 'old:virtual_from_version:45560' => 1109, + 'old:virtual_from_version:42353' => 1037, + 'old:virtual_from_version:38361' => 1109, + 'old:virtual_from_version:46387' => 1070, + 'old:virtual_from_version:42135' => 1110, + 'old:virtual_from_version:42244' => 1009, + 'old:virtual_from_version:49866' => 3002, + 'old:virtual_from_version:42334' => 1025, + 'old:virtual_from_version:42654' => 1077, + 'old:virtual_from_version:44081' => 1107, + 'old:virtual_from_version:40577' => 1077, + 'old:virtual_from_version:46760' => 1689, + 'old:virtual_from_version:42444' => 1037, + 'old:virtual_from_version:40661' => 1107, + 'old:virtual_from_version:46105' => 1077, + 'old:virtual_from_version:46911' => 1397, + 'old:virtual_from_version:45894' => 1077, + 'old:virtual_from_version:42450' => 1037, + 'old:virtual_from_version:49533' => 1532, + 'old:virtual_from_version:45397' => 1404, + 'old:virtual_from_version:40414' => 1009, + 'old:virtual_from_version:50605' => 3259, + 'old:virtual_from_version:46811' => 1077, + 'old:virtual_from_version:50147' => 1032, + 'old:virtual_from_version:50265' => 1070, + 'old:virtual_from_version:49383' => 1077, + 'old:virtual_from_version:45262' => 1022, + 'old:virtual_from_version:47981' => 1574, + 'old:virtual_from_version:49423' => 1070, + 'old:virtual_from_version:50768' => 1353, + 'old:virtual_from_version:46674' => 1070, + 'old:virtual_from_version:44495' => 1077, + 'old:virtual_from_version:47964' => 1689, + 'old:virtual_from_version:49264' => 1689, + 'old:virtual_from_version:50540' => 1489, + 'old:virtual_from_version:42311' => 1000, + 'old:virtual_from_version:49075' => 3094, + 'old:virtual_from_version:49377' => 1070, + 'old:virtual_from_version:47507' => 1005, + 'old:virtual_from_version:47419' => 1007, + 'old:virtual_from_version:42128' => 1110, + 'old:virtual_from_version:45358' => 1404, + 'old:virtual_from_version:50338' => 3214, + 'old:virtual_from_version:43003' => 2028, + 'old:virtual_from_version:42190' => 1009, + 'old:virtual_from_version:42205' => 1077, + 'old:virtual_from_version:45667' => 1025, + 'old:virtual_from_version:38828' => 1134, + 'old:virtual_from_version:50491' => 3221, + 'old:virtual_from_version:42027' => 1077, + 'old:virtual_from_version:50285' => 1125, + 'old:virtual_from_version:49110' => 1649, + 'old:virtual_from_version:44271' => 1009, + 'old:virtual_from_version:50109' => 3221, + 'old:virtual_from_version:45074' => 1349, + 'old:virtual_from_version:42109' => 1077, + 'old:virtual_from_version:40383' => 1025, + 'old:virtual_from_version:44063' => 1037, + 'old:virtual_from_version:50574' => 1070, + 'old:virtual_from_version:44718' => 1009, + 'old:virtual_from_version:38562' => 1109, + 'old:virtual_from_version:42223' => 1107, + 'old:virtual_from_version:40971' => 1414, + 'old:virtual_from_version:49389' => 1172, + 'old:virtual_from_version:44812' => 1005, + 'old:virtual_from_version:46904' => 3006, + 'old:virtual_from_version:49300' => 1070, + 'old:virtual_from_version:45235' => 1578, + 'old:virtual_from_version:42612' => 1070, + 'old:virtual_from_version:30081' => 1094, + 'old:virtual_from_version:42224' => 1070, + 'old:virtual_from_version:49630' => 1158, + 'old:virtual_from_version:46933' => 1583, + 'old:virtual_from_version:45924' => 1009, + 'old:virtual_from_version:40949' => 1172, + 'old:virtual_from_version:49807' => 3198, + 'old:virtual_from_version:47023' => 1689, + 'old:virtual_from_version:42113' => 1037, + 'old:virtual_from_version:45898' => 1070, + 'old:virtual_from_version:46052' => 1006, + 'old:virtual_from_version:44743' => 1224, + 'old:virtual_from_version:42400' => 1070, + 'old:virtual_from_version:49922' => 3208, + 'old:virtual_from_version:50506' => 3259, + 'old:virtual_from_version:40628' => 1077, + 'old:virtual_from_version:41016' => 2025, + 'old:virtual_from_version:44758' => 1070, + 'old:virtual_from_version:42565' => 1070, + 'old:virtual_from_version:42265' => 1077, + 'old:virtual_from_version:42542' => 1077, + 'old:virtual_from_version:50416' => 1314, + 'old:virtual_from_version:47924' => 1689, + 'old:virtual_from_version:47408' => 1077, + 'old:virtual_from_version:50548' => 3236, + 'old:virtual_from_version:40850' => 1070, + 'old:virtual_from_version:40302' => 1062, + 'old:virtual_from_version:45524' => 1070, + 'old:virtual_from_version:49335' => 1077, + 'old:virtual_from_version:44006' => 1490, + 'old:virtual_from_version:50517' => 3263, + 'old:virtual_from_version:50450' => 1112, + 'old:virtual_from_version:46246' => 1070, + 'old:virtual_from_version:49927' => 3209, + 'old:virtual_from_version:45060' => 1095, + 'old:virtual_from_version:45412' => 1136, + 'old:virtual_from_version:42970' => 1070, + 'old:virtual_from_version:42325' => 1070, + 'old:virtual_from_version:42495' => 1037, + 'old:virtual_from_version:42753' => 1025, + 'old:virtual_from_version:42918' => 1037, + 'old:virtual_from_version:45564' => 1077, + 'old:virtual_from_version:45639' => 1172, + 'old:virtual_from_version:40779' => 1070, + 'old:virtual_from_version:47101' => 1352, + 'old:virtual_from_version:49017' => 1077, + 'old:virtual_from_version:49881' => 1125, + 'old:virtual_from_version:46490' => 1006, + 'old:virtual_from_version:44438' => 1110, + 'old:virtual_from_version:42769' => 1007, + 'old:virtual_from_version:45155' => 1136, + 'old:virtual_from_version:47212' => 1125, + 'old:virtual_from_version:42264' => 1070, + 'old:virtual_from_version:49865' => 1689, + 'old:virtual_from_version:46460' => 1659, + 'old:virtual_from_version:46070' => 1007, + 'old:virtual_from_version:50276' => 3218, + 'old:virtual_from_version:44902' => 1009, + 'old:virtual_from_version:45529' => 1070, + 'old:virtual_from_version:42854' => 1172, + 'old:virtual_from_version:47199' => 1109, + 'old:virtual_from_version:40242' => 1081, + 'old:virtual_from_version:45106' => 1125, + 'old:virtual_from_version:46280' => 1070, + 'old:virtual_from_version:42549' => 1077, + 'old:virtual_from_version:49839' => 1006, + 'old:virtual_from_version:49188' => 1077, + 'old:virtual_from_version:38680' => 1077, + 'old:virtual_from_version:45646' => 1404, + 'old:virtual_from_version:49029' => 1649, + 'old:virtual_from_version:40819' => 1000, + 'old:virtual_from_version:49306' => 1585, + 'old:virtual_from_version:38783' => 1069, + 'old:virtual_from_version:42403' => 1404, + 'old:virtual_from_version:47218' => 3016, + 'old:virtual_from_version:44233' => 1077, + 'old:virtual_from_version:49101' => 3146, + 'old:virtual_from_version:42556' => 1077, + 'old:virtual_from_version:46129' => 1070, + 'old:virtual_from_version:50236' => 3131, + 'old:virtual_from_version:45833' => 1404, + 'old:virtual_from_version:50126' => 1172, + 'old:virtual_from_version:44904' => 1110, + 'old:virtual_from_version:46721' => 1125, + 'old:virtual_from_version:42704' => 1067, + 'old:virtual_from_version:46146' => 1077, + 'old:virtual_from_version:49944' => 1314, + 'old:virtual_from_version:45780' => 1062, + 'old:virtual_from_version:49477' => 1314, + 'old:virtual_from_version:49361' => 1404, + 'old:virtual_from_version:49831' => 1404, + 'old:virtual_from_version:49198' => 1689, + 'old:virtual_from_version:40485' => 1070, + 'old:virtual_from_version:45023' => 1091, + 'old:virtual_from_version:38912' => 1083, + 'old:virtual_from_version:42595' => 1109, + 'old:virtual_from_version:49343' => 1107, + 'old:virtual_from_version:47947' => 1077, + 'old:virtual_from_version:45138' => 1550, + 'old:virtual_from_version:49489' => 1107, + 'old:virtual_from_version:47737' => 1077, + 'old:virtual_from_version:45531' => 1077, + 'old:virtual_from_version:47967' => 1070, + 'old:virtual_from_version:42695' => 1009, + 'old:virtual_from_version:47567' => 1070, + 'old:virtual_from_version:49840' => 1489, + 'old:virtual_from_version:45813' => 1621, + 'old:virtual_from_version:45858' => 1067, + 'old:virtual_from_version:44172' => 1009, + 'old:virtual_from_version:46208' => 1025, + 'old:virtual_from_version:44660' => 1009, + 'old:virtual_from_version:40944' => 1070, + 'old:virtual_from_version:46136' => 1070, + 'old:virtual_from_version:49399' => 1070, + 'old:virtual_from_version:40875' => 1037, + 'old:virtual_from_version:44648' => 1037, + 'old:virtual_from_version:47173' => 1105, + 'old:virtual_from_version:40698' => 1009, + 'old:virtual_from_version:47996' => 1109, + 'old:virtual_from_version:47898' => 1109, + 'old:virtual_from_version:49986' => 1025, + 'old:virtual_from_version:47160' => 1689, + 'old:virtual_from_version:44934' => 1070, + 'old:virtual_from_version:41013' => 2023, + 'old:virtual_from_version:42233' => 1009, + 'old:virtual_from_version:42225' => 1009, + 'old:virtual_from_version:49910' => 3194, + 'old:virtual_from_version:42749' => 1067, + 'old:virtual_from_version:47645' => 1621, + 'old:virtual_from_version:42964' => 1070, + 'old:virtual_from_version:46369' => 1070, + 'old:virtual_from_version:43029' => 2029, + 'old:virtual_from_version:49730' => 1666, + 'old:virtual_from_version:44071' => 1110, + 'old:virtual_from_version:49350' => 1077, + 'old:virtual_from_version:47362' => 1109, + 'old:virtual_from_version:38692' => 1062, + 'old:virtual_from_version:46569' => 1077, + 'old:virtual_from_version:45277' => 1105, + 'old:virtual_from_version:40972' => 1037, + 'old:virtual_from_version:44335' => 1077, + 'old:virtual_from_version:40537' => 1077, + 'old:virtual_from_version:40261' => 1314, + 'old:virtual_from_version:45368' => 1009, + 'old:virtual_from_version:44099' => 1070, + 'old:virtual_from_version:44501' => 1070, + 'old:virtual_from_version:49292' => 1070, + 'old:virtual_from_version:42797' => 1037, + 'old:virtual_from_version:49084' => 3094, + 'old:virtual_from_version:47171' => 1343, + 'old:virtual_from_version:44206' => 1125, + 'old:virtual_from_version:50362' => 1689, + 'old:virtual_from_version:44734' => 1070, + 'old:virtual_from_version:46134' => 1077, + 'old:virtual_from_version:45344' => 1031, + 'old:virtual_from_version:50103' => 1172, + 'old:virtual_from_version:47521' => 1077, + 'old:virtual_from_version:40697' => 1070, + 'old:virtual_from_version:40880' => 1037, + 'old:virtual_from_version:50196' => 1172, + 'old:virtual_from_version:47559' => 1037, + 'old:virtual_from_version:44126' => 1009, + 'old:virtual_from_version:42144' => 1070, + 'old:virtual_from_version:44977' => 1051, + 'old:virtual_from_version:43020' => 2045, + 'old:virtual_from_version:49442' => 1580, + 'old:virtual_from_version:47400' => 3008, + 'old:virtual_from_version:49529' => 1410, + 'old:virtual_from_version:42518' => 1009, + 'old:virtual_from_version:47249' => 1070, + 'old:virtual_from_version:49535' => 3008, + 'old:virtual_from_version:49301' => 1136, + 'old:virtual_from_version:50351' => 1659, + 'old:virtual_from_version:46204' => 1077, + 'old:virtual_from_version:40928' => 1077, + 'old:virtual_from_version:44348' => 1037, + 'old:virtual_from_version:46353' => 1190, + 'old:virtual_from_version:49656' => 1070, + 'old:virtual_from_version:49063' => 1077, + 'old:virtual_from_version:50756' => 1125, + 'old:virtual_from_version:47305' => 3042, + 'old:virtual_from_version:42407' => 1037, + 'old:virtual_from_version:45054' => 1081, + 'old:virtual_from_version:44169' => 1136, + 'old:virtual_from_version:47041' => 1070, + 'old:virtual_from_version:45035' => 1017, + 'old:virtual_from_version:45270' => 1019, + 'old:virtual_from_version:47838' => 1587, + 'old:virtual_from_version:50245' => 1689, + 'old:virtual_from_version:44780' => 1070, + 'old:virtual_from_version:40842' => 1077, + 'old:virtual_from_version:46298' => 1070, + 'old:virtual_from_version:42531' => 1070, + 'old:virtual_from_version:50528' => 1136, + 'old:virtual_from_version:45643' => 1067, + 'old:virtual_from_version:42437' => 1077, + 'old:virtual_from_version:45797' => 1015, + 'old:virtual_from_version:42326' => 1009, + 'old:virtual_from_version:44719' => 1025, + 'old:virtual_from_version:44961' => 1062, + 'old:virtual_from_version:46600' => 1070, + 'old:virtual_from_version:45889' => 1077, + 'old:virtual_from_version:47734' => 1125, + 'old:virtual_from_version:47965' => 3016, + 'old:virtual_from_version:42642' => 1077, + 'old:virtual_from_version:44566' => 1070, + 'old:virtual_from_version:49457' => 1070, + 'old:virtual_from_version:50691' => 1689, + 'old:virtual_from_version:45313' => 1585, + 'old:virtual_from_version:46725' => 1537, + 'old:virtual_from_version:47828' => 1125, + 'old:virtual_from_version:46796' => 1172, + 'old:virtual_from_version:42845' => 1109, + 'old:virtual_from_version:44769' => 1489, + 'old:virtual_from_version:49699' => 1158, + 'old:virtual_from_version:42997' => 1037, + 'old:virtual_from_version:47700' => 1070, + 'old:virtual_from_version:45745' => 1070, + 'old:virtual_from_version:47321' => 1125, + 'old:virtual_from_version:46800' => 1666, + 'old:virtual_from_version:46673' => 1077, + 'old:virtual_from_version:50484' => 1410, + 'old:virtual_from_version:47109' => 1070, + 'old:virtual_from_version:44067' => 1107, + 'old:virtual_from_version:46401' => 1537, + 'old:virtual_from_version:47652' => 1070, + 'old:virtual_from_version:46946' => 1077, + 'old:virtual_from_version:47696' => 1077, + 'old:virtual_from_version:50598' => 1136, + 'old:virtual_from_version:49639' => 1070, + 'old:virtual_from_version:44735' => 1077, + 'old:virtual_from_version:47579' => 1077, + 'old:virtual_from_version:15764' => 1029, + 'old:virtual_from_version:45864' => 1627, + 'old:virtual_from_version:50737' => 1585, + 'old:virtual_from_version:49175' => 1659, + 'old:virtual_from_version:47117' => 1656, + 'old:virtual_from_version:40766' => 1107, + 'old:virtual_from_version:47121' => 1125, + 'old:virtual_from_version:40865' => 1411, + 'old:virtual_from_version:45585' => 1136, + 'old:virtual_from_version:44052' => 1070, + 'old:virtual_from_version:47874' => 1136, + 'old:virtual_from_version:42791' => 1222, + 'old:virtual_from_version:50037' => 3220, + 'old:virtual_from_version:49433' => 1007, + 'old:virtual_from_version:44418' => 1030, + 'old:virtual_from_version:46884' => 1048, + 'old:virtual_from_version:47684' => 1051, + 'old:virtual_from_version:45246' => 1070, + 'old:virtual_from_version:38518' => 1108, + 'old:virtual_from_version:44320' => 1498, + 'old:virtual_from_version:44583' => 1037, + 'old:virtual_from_version:46874' => 1613, + 'old:virtual_from_version:39316' => 1077, + 'old:virtual_from_version:40573' => 1077, + 'old:virtual_from_version:40562' => 1070, + 'old:virtual_from_version:21275' => 1057, + 'old:virtual_from_version:40393' => 1344, + 'old:virtual_from_version:42795' => 1025, + 'old:virtual_from_version:45520' => 1077, + 'old:virtual_from_version:44484' => 1125, + 'old:virtual_from_version:44537' => 1110, + 'old:virtual_from_version:45823' => 1190, + 'old:virtual_from_version:49360' => 1077, + 'old:virtual_from_version:50254' => 1689, + 'old:virtual_from_version:50533' => 1150, + 'old:virtual_from_version:46257' => 1517, + 'old:virtual_from_version:48002' => 2103, + 'old:virtual_from_version:50194' => 3030, + 'old:virtual_from_version:45905' => 1070, + 'old:virtual_from_version:49808' => 1062, + 'old:virtual_from_version:45400' => 1032, + 'old:virtual_from_version:42449' => 1077, + 'old:virtual_from_version:44573' => 1067, + 'old:virtual_from_version:45281' => 1012, + 'old:virtual_from_version:49782' => 3194, + 'old:virtual_from_version:42390' => 1009, + 'old:virtual_from_version:44720' => 1077, + 'old:virtual_from_version:44268' => 1084, + 'old:virtual_from_version:38964' => 1109, + 'old:virtual_from_version:40950' => 1107, + 'old:virtual_from_version:49876' => 1172, + 'old:virtual_from_version:45501' => 1105, + 'old:virtual_from_version:40924' => 1048, + 'old:virtual_from_version:49733' => 1015, + 'old:virtual_from_version:44061' => 1009, + 'old:virtual_from_version:43022' => 2047, + 'old:virtual_from_version:45772' => 1077, + 'old:virtual_from_version:45319' => 1110, + 'old:virtual_from_version:42657' => 1009, + 'old:virtual_from_version:44598' => 1057, + 'old:virtual_from_version:47746' => 3090, + 'old:virtual_from_version:46293' => 1414, + 'old:virtual_from_version:42546' => 1172, + 'old:virtual_from_version:49374' => 3167, + 'old:virtual_from_version:40618' => 1078, + 'old:virtual_from_version:42458' => 1136, + 'old:virtual_from_version:49740' => 1584, + 'old:virtual_from_version:45301' => 1107, + 'old:virtual_from_version:40567' => 1115, + 'old:virtual_from_version:45969' => 1172, + 'old:virtual_from_version:49408' => 1048, + 'old:virtual_from_version:43087' => 2081, + 'old:virtual_from_version:40807' => 1070, + 'old:virtual_from_version:49331' => 1070, + 'old:virtual_from_version:43070' => 2070, + 'old:virtual_from_version:44016' => 1054, + 'old:virtual_from_version:44628' => 1037, + 'old:virtual_from_version:42913' => 1070, + 'old:virtual_from_version:42165' => 1006, + 'old:virtual_from_version:45798' => 1019, + 'old:virtual_from_version:46174' => 1077, + 'old:virtual_from_version:45958' => 1461, + 'old:virtual_from_version:49384' => 1489, + 'old:virtual_from_version:50302' => 1025, + 'old:virtual_from_version:47152' => 1070, + 'old:virtual_from_version:42292' => 1077, + 'old:virtual_from_version:47085' => 3008, + 'old:virtual_from_version:49562' => 1158, + 'old:virtual_from_version:47741' => 1077, + 'old:virtual_from_version:48036' => 2079, + 'old:virtual_from_version:43063' => 2064, + 'old:virtual_from_version:44807' => 1077, + 'old:virtual_from_version:49060' => 3094, + 'old:virtual_from_version:46956' => 1062, + 'old:virtual_from_version:49905' => 3205, + 'old:virtual_from_version:44466' => 1107, + 'old:virtual_from_version:44789' => 1107, + 'old:virtual_from_version:46855' => 1509, + 'old:virtual_from_version:49580' => 1035, + 'old:virtual_from_version:42926' => 1070, + 'old:virtual_from_version:46199' => 1407, + 'old:virtual_from_version:45504' => 1532, + 'old:virtual_from_version:47087' => 1125, + 'old:virtual_from_version:42668' => 1070, + 'old:virtual_from_version:42536' => 1000, + 'old:virtual_from_version:49097' => 1012, + 'old:virtual_from_version:49912' => 1348, + 'old:virtual_from_version:45840' => 1107, + 'old:virtual_from_version:45363' => 1587, + 'old:virtual_from_version:47429' => 1109, + 'old:virtual_from_version:42343' => 1077, + 'old:virtual_from_version:49385' => 1489, + 'old:virtual_from_version:45600' => 1077, + 'old:virtual_from_version:47004' => 1070, + 'old:virtual_from_version:47468' => 1109, + 'old:virtual_from_version:44093' => 1070, + 'old:virtual_from_version:45699' => 1070, + 'old:virtual_from_version:45314' => 1009, + 'old:virtual_from_version:42060' => 1067, + 'old:virtual_from_version:42024' => 1037, + 'old:virtual_from_version:40377' => 1032, + 'old:virtual_from_version:49040' => 1037, + 'old:virtual_from_version:42962' => 1110, + 'old:virtual_from_version:46761' => 1575, + 'old:virtual_from_version:47832' => 1109, + 'old:virtual_from_version:44706' => 1077, + 'old:virtual_from_version:40898' => 1009, + 'old:virtual_from_version:45944' => 1136, + 'old:virtual_from_version:50645' => 1070, + 'old:virtual_from_version:50121' => 1031, + 'old:virtual_from_version:47449' => 1070, + 'old:virtual_from_version:44209' => 1009, + 'old:virtual_from_version:42869' => 1070, + 'old:virtual_from_version:39734' => 1059, + 'old:virtual_from_version:49461' => 1404, + 'old:virtual_from_version:46828' => 1077, + 'old:virtual_from_version:46670' => 1404, + 'old:virtual_from_version:44578' => 1048, + 'old:virtual_from_version:40584' => 1070, + 'old:virtual_from_version:49000' => 1077, + 'old:virtual_from_version:42117' => 1328, + 'old:virtual_from_version:50718' => 1417, + 'old:virtual_from_version:47517' => 1125, + 'old:virtual_from_version:50589' => 3259, + 'old:virtual_from_version:46958' => 1070, + 'old:virtual_from_version:49845' => 1515, + 'old:virtual_from_version:44914' => 1517, + 'old:virtual_from_version:45325' => 1009, + 'old:virtual_from_version:38368' => 1112, + 'old:virtual_from_version:49059' => 1666, + 'old:virtual_from_version:42902' => 1009, + 'old:virtual_from_version:46854' => 3002, + 'old:virtual_from_version:46798' => 1077, + 'old:virtual_from_version:49018' => 3129, + 'old:virtual_from_version:47635' => 1689, + 'old:virtual_from_version:44746' => 1007, + 'old:virtual_from_version:42906' => 1067, + 'old:virtual_from_version:45298' => 1237, + 'old:virtual_from_version:40946' => 1077, + 'old:virtual_from_version:47084' => 1077, + 'old:virtual_from_version:50571' => 3031, + 'old:virtual_from_version:45649' => 1136, + 'old:virtual_from_version:42037' => 1070, + 'old:virtual_from_version:47161' => 3029, + 'old:virtual_from_version:42878' => 1007, + 'old:virtual_from_version:49258' => 1077, + 'old:virtual_from_version:46536' => 1077, + 'old:virtual_from_version:44034' => 1077, + 'old:virtual_from_version:47295' => 1037, + 'old:virtual_from_version:44907' => 1070, + 'old:virtual_from_version:50713' => 1070, + 'old:virtual_from_version:40904' => 1025, + 'old:virtual_from_version:44117' => 1009, + 'old:virtual_from_version:45157' => 1051, + 'old:virtual_from_version:46812' => 3002, + 'old:virtual_from_version:40760' => 1009, + 'old:virtual_from_version:49391' => 1095, + 'old:virtual_from_version:47386' => 3008, + 'old:virtual_from_version:39264' => 1144, + 'old:virtual_from_version:47378' => 1077, + 'old:virtual_from_version:44580' => 1078, + 'old:virtual_from_version:44774' => 1350, + 'old:virtual_from_version:45132' => 1009, + 'old:virtual_from_version:50425' => 1035, + 'old:virtual_from_version:47526' => 1037, + 'old:virtual_from_version:44970' => 1043, + 'old:virtual_from_version:50652' => 1417, + 'old:virtual_from_version:47706' => 1321, + 'old:virtual_from_version:44307' => 1125, + 'old:virtual_from_version:42013' => 1037, + 'old:virtual_from_version:45122' => 1125, + 'old:virtual_from_version:45238' => 1136, + 'old:virtual_from_version:44471' => 1110, + 'old:virtual_from_version:42175' => 1418, + 'old:virtual_from_version:49210' => 3155, + 'old:virtual_from_version:50206' => 1659, + 'old:virtual_from_version:40495' => 1077, + 'old:virtual_from_version:46158' => 1077, + 'old:virtual_from_version:24814' => 1040, + 'old:virtual_from_version:49679' => 3190, + 'old:virtual_from_version:45139' => 1009, + 'old:virtual_from_version:44141' => 1037, + 'old:virtual_from_version:45709' => 1533, + 'old:virtual_from_version:42659' => 1077, + 'old:virtual_from_version:42694' => 1070, + 'old:virtual_from_version:49066' => 3136, + 'old:virtual_from_version:42909' => 1025, + 'old:virtual_from_version:45839' => 1125, + 'old:virtual_from_version:42050' => 1025, + 'old:virtual_from_version:45682' => 1027, + 'old:virtual_from_version:42032' => 1077, + 'old:virtual_from_version:50002' => 3131, + 'old:virtual_from_version:49272' => 3078, + 'old:virtual_from_version:42942' => 1172, + 'old:virtual_from_version:43010' => 2035, + 'old:virtual_from_version:45711' => 1009, + 'old:virtual_from_version:47800' => 1007, + 'old:virtual_from_version:47379' => 1404, + 'old:virtual_from_version:45403' => 1125, + 'old:virtual_from_version:46162' => 1105, + 'old:virtual_from_version:50035' => 3176, + 'old:virtual_from_version:49714' => 1489, + 'old:virtual_from_version:44650' => 1009, + 'old:virtual_from_version:40684' => 1048, + 'old:virtual_from_version:44522' => 1107, + 'old:virtual_from_version:46295' => 1070, + 'old:virtual_from_version:40712' => 1077, + 'old:virtual_from_version:44051' => 1107, + 'old:virtual_from_version:39042' => 1125, + 'old:virtual_from_version:49362' => 1070, + 'old:virtual_from_version:44439' => 1067, + 'old:virtual_from_version:45906' => 1125, + 'old:virtual_from_version:40497' => 1328, + 'old:virtual_from_version:46381' => 1109, + 'old:virtual_from_version:40591' => 1070, + 'old:virtual_from_version:49508' => 1125, + 'old:virtual_from_version:42949' => 1070, + 'old:virtual_from_version:46984' => 1585, + 'old:virtual_from_version:46699' => 1696, + 'old:virtual_from_version:46750' => 1699, + 'old:virtual_from_version:46292' => 1077, + 'old:virtual_from_version:45837' => 1070, + 'old:virtual_from_version:50122' => 3131, + 'old:virtual_from_version:49702' => 1583, + 'old:virtual_from_version:42396' => 1009, + 'old:virtual_from_version:49964' => 3211, + 'old:virtual_from_version:50153' => 1059, + 'old:virtual_from_version:49756' => 1172, + 'old:virtual_from_version:46485' => 1105, + 'old:virtual_from_version:47689' => 1689, + 'old:virtual_from_version:45088' => 1116, + 'old:virtual_from_version:40856' => 1009, + 'old:virtual_from_version:45085' => 1009, + 'old:virtual_from_version:49879' => 3131, + 'old:virtual_from_version:49584' => 1136, + 'old:virtual_from_version:47022' => 1580, + 'old:virtual_from_version:49860' => 1025, + 'old:virtual_from_version:39804' => 1088, + 'old:virtual_from_version:44427' => 1112, + 'old:virtual_from_version:40867' => 1077, + 'old:virtual_from_version:49980' => 1070, + 'old:virtual_from_version:40976' => 1077, + 'old:virtual_from_version:49718' => 1037, + 'old:virtual_from_version:46528' => 1070, + 'old:virtual_from_version:50095' => 1172, + 'old:virtual_from_version:49351' => 1077, + 'old:virtual_from_version:47102' => 1070, + 'old:virtual_from_version:45159' => 1125, + 'old:virtual_from_version:49936' => 1100, + 'old:virtual_from_version:46115' => 1517, + 'old:virtual_from_version:46328' => 1125, + 'old:virtual_from_version:42047' => 1110, + 'old:virtual_from_version:46615' => 1063, + 'old:virtual_from_version:43038' => 2037, + 'old:virtual_from_version:45247' => 1063, + 'old:virtual_from_version:42324' => 1172, + 'old:virtual_from_version:49540' => 3181, + 'old:virtual_from_version:45824' => 1084, + 'old:virtual_from_version:46578' => 1077, + 'old:virtual_from_version:37911' => 1090, + 'old:virtual_from_version:42072' => 1077, + 'old:virtual_from_version:42358' => 1025, + 'old:virtual_from_version:46943' => 1109, + 'old:virtual_from_version:46852' => 1666, + 'old:virtual_from_version:45655' => 1077, + 'old:virtual_from_version:45413' => 1112, + 'old:virtual_from_version:45801' => 1172, + 'old:virtual_from_version:40832' => 1123, + 'old:virtual_from_version:50513' => 1584, + 'old:virtual_from_version:40479' => 1025, + 'old:virtual_from_version:40605' => 1025, + 'old:virtual_from_version:46643' => 1070, + 'old:virtual_from_version:40977' => 1037, + 'old:virtual_from_version:50150' => 1172, + 'old:virtual_from_version:44683' => 1077, + 'old:virtual_from_version:46876' => 1070, + 'old:virtual_from_version:47862' => 1404, + 'old:virtual_from_version:46860' => 1007, + 'old:virtual_from_version:44868' => 1070, + 'old:virtual_from_version:45710' => 1070, + 'old:virtual_from_version:46075' => 1077, + 'old:virtual_from_version:47074' => 1659, + 'old:virtual_from_version:45630' => 1172, + 'old:virtual_from_version:44328' => 1077, + 'old:virtual_from_version:46698' => 1020, + 'old:virtual_from_version:45048' => 1037, + 'old:virtual_from_version:44497' => 1110, + 'old:virtual_from_version:15732' => 1005, + 'old:virtual_from_version:44488' => 1023, + 'old:virtual_from_version:49427' => 1070, + 'old:virtual_from_version:44848' => 1009, + 'old:virtual_from_version:46071' => 1070, + 'old:virtual_from_version:40433' => 1108, + 'old:virtual_from_version:50161' => 3058, + 'old:virtual_from_version:47231' => 1070, + 'old:virtual_from_version:42304' => 1025, + 'old:virtual_from_version:49106' => 3094, + 'old:virtual_from_version:49549' => 1410, + 'old:virtual_from_version:45648' => 1172, + 'old:virtual_from_version:40900' => 1077, + 'old:virtual_from_version:44104' => 1125, + 'old:virtual_from_version:44930' => 1077, + 'old:virtual_from_version:50274' => 3131, + 'old:virtual_from_version:43057' => 2057, + 'old:virtual_from_version:44145' => 1009, + 'old:virtual_from_version:38819' => 1108, + 'old:virtual_from_version:46051' => 1025, + 'old:virtual_from_version:44607' => 1037, + 'old:virtual_from_version:50112' => 1172, + 'old:virtual_from_version:44783' => 1070, + 'old:virtual_from_version:40372' => 1009, + 'old:virtual_from_version:40409' => 1048, + 'old:virtual_from_version:45002' => 1025, + 'old:virtual_from_version:46139' => 1070, + 'old:virtual_from_version:46223' => 1007, + 'old:virtual_from_version:42310' => 1037, + 'old:virtual_from_version:44649' => 1070, + 'old:virtual_from_version:42936' => 1037, + 'old:virtual_from_version:47760' => 1109, + 'old:virtual_from_version:44208' => 1070, + 'old:virtual_from_version:47250' => 1125, + 'old:virtual_from_version:42911' => 1037, + 'old:virtual_from_version:46503' => 1584, + 'old:virtual_from_version:50340' => 1070, + 'old:virtual_from_version:50091' => 1125, + 'old:virtual_from_version:46973' => 1583, + 'old:virtual_from_version:45316' => 1012, + 'old:virtual_from_version:50096' => 1009, + 'old:virtual_from_version:46683' => 1077, + 'old:virtual_from_version:44736' => 1083, + 'old:virtual_from_version:44007' => 1311, + 'old:virtual_from_version:49088' => 3139, + 'old:virtual_from_version:46414' => 1077, + 'old:virtual_from_version:44623' => 1025, + 'old:virtual_from_version:42107' => 1105, + 'old:virtual_from_version:44369' => 1069, + 'old:virtual_from_version:45838' => 1362, + 'old:virtual_from_version:42062' => 1025, + 'old:virtual_from_version:46461' => 1062, + 'old:virtual_from_version:47372' => 3008, + 'old:virtual_from_version:46468' => 1404, + 'old:virtual_from_version:49450' => 3176, + 'old:virtual_from_version:47393' => 1697, + 'old:virtual_from_version:47843' => 3114, + 'old:virtual_from_version:44105' => 1107, + 'old:virtual_from_version:45584' => 1172, + 'old:virtual_from_version:45684' => 1615, + 'old:virtual_from_version:47154' => 1017, + 'old:virtual_from_version:49136' => 1012, + 'old:virtual_from_version:42722' => 1025, + 'old:virtual_from_version:50730' => 3273, + 'old:virtual_from_version:42157' => 1416, + 'old:virtual_from_version:46793' => 3000, + 'old:virtual_from_version:45320' => 1125, + 'old:virtual_from_version:45455' => 1136, + 'old:virtual_from_version:49051' => 3114, + 'old:virtual_from_version:44196' => 1007, + 'old:virtual_from_version:39152' => 1125, + 'old:virtual_from_version:45462' => 1077, + 'old:virtual_from_version:44388' => 1065, + 'old:virtual_from_version:45285' => 1031, + 'old:virtual_from_version:49284' => 3146, + 'old:virtual_from_version:49625' => 3183, + 'old:virtual_from_version:50739' => 3259, + 'old:virtual_from_version:46977' => 1125, + 'old:virtual_from_version:49780' => 1489, + 'old:virtual_from_version:39585' => 1404, + 'old:virtual_from_version:50133' => 3131, + 'old:virtual_from_version:38683' => 1067, + 'old:virtual_from_version:47367' => 1070, + 'old:virtual_from_version:42514' => 1048, + 'old:virtual_from_version:45712' => 1077, + 'old:virtual_from_version:45415' => 1444, + 'old:virtual_from_version:50203' => 1689, + 'old:virtual_from_version:47205' => 1125, + 'old:virtual_from_version:45794' => 1107, + 'old:virtual_from_version:45125' => 1009, + 'old:virtual_from_version:42781' => 1048, + 'old:virtual_from_version:50344' => 3192, + 'old:virtual_from_version:49065' => 3094, + 'old:virtual_from_version:49778' => 1112, + 'old:virtual_from_version:49972' => 3209, + 'old:virtual_from_version:45747' => 1027, + 'old:virtual_from_version:47366' => 1037, + 'old:virtual_from_version:40913' => 1070, + 'old:virtual_from_version:35710' => 1017, + 'old:virtual_from_version:47210' => 1321, + 'old:virtual_from_version:45156' => 1404, + 'old:virtual_from_version:46339' => 1105, + 'old:virtual_from_version:42281' => 1423, + 'old:virtual_from_version:45417' => 1136, + 'old:virtual_from_version:44458' => 1112, + 'old:virtual_from_version:42285' => 1222, + 'old:virtual_from_version:40546' => 1116, + 'old:virtual_from_version:40170' => 1076, + 'old:virtual_from_version:42532' => 1077, + 'old:virtual_from_version:45093' => 1105, + 'old:virtual_from_version:36614' => 1006, + 'old:virtual_from_version:44925' => 1077, + 'old:virtual_from_version:47835' => 1077, + 'old:virtual_from_version:49518' => 1025, + 'old:virtual_from_version:47581' => 1568, + 'old:virtual_from_version:50364' => 1035, + 'old:virtual_from_version:47433' => 1689, + 'old:virtual_from_version:43088' => 2082, + 'old:virtual_from_version:45771' => 1025, + 'old:virtual_from_version:47010' => 3015, + 'old:virtual_from_version:42049' => 1009, + 'old:virtual_from_version:47488' => 1172, + 'old:virtual_from_version:44621' => 1070, + 'old:virtual_from_version:50098' => 3221, + 'old:virtual_from_version:45451' => 1077, + 'old:virtual_from_version:50086' => 1172, + 'old:virtual_from_version:47142' => 3025, + 'old:virtual_from_version:38340' => 1070, + 'old:virtual_from_version:46494' => 1321, + 'old:virtual_from_version:39993' => 2008, + 'old:virtual_from_version:40245' => 1152, + 'old:virtual_from_version:49683' => 1070, + 'old:virtual_from_version:47174' => 1077, + 'old:virtual_from_version:50649' => 1067, + 'old:virtual_from_version:46605' => 1077, + 'old:virtual_from_version:40291' => 1110, + 'old:virtual_from_version:41006' => 1168, + 'old:virtual_from_version:40046' => 1007, + 'old:virtual_from_version:46691' => 1125, + 'old:virtual_from_version:50369' => 3131, + 'old:virtual_from_version:44331' => 1070, + 'old:virtual_from_version:42200' => 1009, + 'old:virtual_from_version:45746' => 1125, + 'old:virtual_from_version:44215' => 1109 +}.freeze diff --git a/lib/tasks/generate_component_previews.rake b/lib/tasks/generate_component_previews.rake index 2bc61c28b3..6e1e978a1a 100644 --- a/lib/tasks/generate_component_previews.rake +++ b/lib/tasks/generate_component_previews.rake @@ -1,31 +1,33 @@ +# frozen_string_literal: true + # lib/tasks/generate_component_previews.rake namespace :component_previews do - desc "Generate previews for all components" + desc 'Generate previews for all components' task generate: :environment do - components_path = Rails.root.join("app/components") + components_path = Rails.root.join('app/components') components = Dir.glob("#{components_path}/**/*_component.rb") components.each do |component_path| - component_name = File.basename(component_path, "_component.rb") + component_name = File.basename(component_path, '_component.rb') preview_path = Rails.root.join("test/components/previews/#{component_name}_preview.rb") # Skip if the preview already exists next if File.exist?(preview_path) - File.open(preview_path, "w") do |file| + File.open(preview_path, 'w') do |file| file.puts("class #{component_name.camelize}Preview < ViewComponent::Preview") - file.puts(" def default") - file.puts(" # Initialize the component with any necessary data") + file.puts(' def default') + file.puts(' # Initialize the component with any necessary data') file.puts(" component = #{component_name.camelize}Component.new") - file.puts(" # Add any necessary data or context to the component") - file.puts(" # component.some_data = some_value") + file.puts(' # Add any necessary data or context to the component') + file.puts(' # component.some_data = some_value') - file.puts(" # Render the component") - file.puts(" render(component)") - file.puts(" end") - file.puts("end") + file.puts(' # Render the component') + file.puts(' render(component)') + file.puts(' end') + file.puts('end') end puts "Generated preview for #{component_name}" diff --git a/package.json b/package.json index d5003c910e..c1c7190c8a 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,17 @@ "vis-util": "^5.0.3" }, "scripts": { - "build": "esbuild app/javascript/*.* --bundle --sourcemap --outdir=app/assets/builds" + "build": "esbuild app/javascript/*.* --bundle --sourcemap --outdir=app/assets/builds", + "lint": "standard 'app/**/*.js'", + "lint:fix": "standard --fix 'app/*/*.js'" + }, + "devDependencies": { + "eslint": "^8.52.0", + "eslint-config-standard": "^17.1.0", + "eslint-plugin-import": "^2.29.0", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-promise": "^6.1.1", + "eslint-plugin-standard": "^5.0.0", + "standard": "^17.1.0" } } diff --git a/public/dispatch.fcgi b/public/dispatch.fcgi index 65188f380b..d01539c2f4 100755 --- a/public/dispatch.fcgi +++ b/public/dispatch.fcgi @@ -1,4 +1,6 @@ #!/usr/local/bin/ruby +# frozen_string_literal: true + # # You may specify the path to the FastCGI crash log (a log of unhandled # exceptions which forced the FastCGI instance to exit, great for debugging) @@ -18,7 +20,7 @@ # # Custom log path, normal GC behavior. # RailsFCGIHandler.process! '/var/log/myapp_fcgi_crash.log' # -require File.dirname(__FILE__) + "/../config/environment" +require "#{File.dirname(__FILE__)}/../config/environment" require 'fcgi_handler' RailsFCGIHandler.process! diff --git a/public/dispatch.rb b/public/dispatch.rb index 4e7790d9ab..e1b6507eab 100755 --- a/public/dispatch.rb +++ b/public/dispatch.rb @@ -1,10 +1,15 @@ #!/usr/local/bin/ruby +# frozen_string_literal: true -require File.dirname(__FILE__) + "/../config/environment" unless defined?(Rails.root) +require "#{File.dirname(__FILE__)}/../config/environment" unless defined?(Rails.root) # If you're using RubyGems and mod_ruby, this require should be changed to an absolute path one, like: # "/usr/local/lib/ruby/gems/1.8/gems/rails-0.8.0/lib/dispatcher" -- otherwise performance is severely impaired -require "dispatcher" +require 'dispatcher' -ADDITIONAL_LOAD_PATHS.reverse.each { |dir| $:.unshift(dir) if File.directory?(dir) } if defined?(Apache::RubyRun) -Dispatcher.dispatch \ No newline at end of file +if defined?(Apache::RubyRun) + ADDITIONAL_LOAD_PATHS.reverse.each do |dir| + $LOAD_PATH.unshift(dir) if File.directory?(dir) + end +end +Dispatcher.dispatch diff --git a/script/about b/script/about index 7b07d46a30..ceed20557a 100755 --- a/script/about +++ b/script/about @@ -1,3 +1,5 @@ #!/usr/bin/env ruby -require File.dirname(__FILE__) + '/../config/boot' -require 'commands/about' \ No newline at end of file +# frozen_string_literal: true + +require "#{File.dirname(__FILE__)}/../config/boot" +require 'commands/about' diff --git a/script/breakpointer b/script/breakpointer index 64af76edd4..1f7bb7d518 100755 --- a/script/breakpointer +++ b/script/breakpointer @@ -1,3 +1,5 @@ #!/usr/bin/env ruby -require File.dirname(__FILE__) + '/../config/boot' -require 'commands/breakpointer' \ No newline at end of file +# frozen_string_literal: true + +require "#{File.dirname(__FILE__)}/../config/boot" +require 'commands/breakpointer' diff --git a/script/console b/script/console index f3a605b74c..c7bdaf4b01 100755 --- a/script/console +++ b/script/console @@ -1,3 +1,5 @@ #!/usr/bin/env ruby +# frozen_string_literal: true + require_relative '../config/boot' -require 'commands/console' \ No newline at end of file +require 'commands/console' diff --git a/script/dbconsole b/script/dbconsole index 83c8436a9d..e1e4c57a8a 100755 --- a/script/dbconsole +++ b/script/dbconsole @@ -1,3 +1,5 @@ #!/usr/bin/env ruby -require File.expand_path('../../config/boot', __FILE__) +# frozen_string_literal: true + +require File.expand_path('../config/boot', __dir__) require 'commands/dbconsole' diff --git a/script/destroy b/script/destroy index fa0e6fcd0b..e7d7fd69b2 100755 --- a/script/destroy +++ b/script/destroy @@ -1,3 +1,5 @@ #!/usr/bin/env ruby -require File.dirname(__FILE__) + '/../config/boot' -require 'commands/destroy' \ No newline at end of file +# frozen_string_literal: true + +require "#{File.dirname(__FILE__)}/../config/boot" +require 'commands/destroy' diff --git a/script/generate b/script/generate index ef976e09f3..0bf19c07d6 100755 --- a/script/generate +++ b/script/generate @@ -1,3 +1,5 @@ #!/usr/bin/env ruby -require File.dirname(__FILE__) + '/../config/boot' -require 'commands/generate' \ No newline at end of file +# frozen_string_literal: true + +require "#{File.dirname(__FILE__)}/../config/boot" +require 'commands/generate' diff --git a/script/performance/benchmarker b/script/performance/benchmarker index c842d35d33..7a5eb146fa 100755 --- a/script/performance/benchmarker +++ b/script/performance/benchmarker @@ -1,3 +1,5 @@ #!/usr/bin/env ruby -require File.dirname(__FILE__) + '/../../config/boot' +# frozen_string_literal: true + +require "#{File.dirname(__FILE__)}/../../config/boot" require 'commands/performance/benchmarker' diff --git a/script/performance/profiler b/script/performance/profiler index d855ac8b13..1a50743ef5 100755 --- a/script/performance/profiler +++ b/script/performance/profiler @@ -1,3 +1,5 @@ #!/usr/bin/env ruby -require File.dirname(__FILE__) + '/../../config/boot' +# frozen_string_literal: true + +require "#{File.dirname(__FILE__)}/../../config/boot" require 'commands/performance/profiler' diff --git a/script/plugin b/script/plugin index 4a9a20a5a2..6a83b0b70b 100755 --- a/script/plugin +++ b/script/plugin @@ -1,3 +1,5 @@ #!/usr/bin/env ruby -require File.expand_path('../../config/boot', __FILE__) -require 'commands/plugin' \ No newline at end of file +# frozen_string_literal: true + +require File.expand_path('../config/boot', __dir__) +require 'commands/plugin' diff --git a/script/process/inspector b/script/process/inspector index bf25ad86d1..0cbddd7d22 100755 --- a/script/process/inspector +++ b/script/process/inspector @@ -1,3 +1,5 @@ #!/usr/bin/env ruby -require File.dirname(__FILE__) + '/../../config/boot' +# frozen_string_literal: true + +require "#{File.dirname(__FILE__)}/../../config/boot" require 'commands/process/inspector' diff --git a/script/process/reaper b/script/process/reaper index c77f04535f..435474d885 100755 --- a/script/process/reaper +++ b/script/process/reaper @@ -1,3 +1,5 @@ #!/usr/bin/env ruby -require File.dirname(__FILE__) + '/../../config/boot' +# frozen_string_literal: true + +require "#{File.dirname(__FILE__)}/../../config/boot" require 'commands/process/reaper' diff --git a/script/process/spawner b/script/process/spawner index 7118f3983c..08c5f32cc6 100755 --- a/script/process/spawner +++ b/script/process/spawner @@ -1,3 +1,5 @@ #!/usr/bin/env ruby -require File.dirname(__FILE__) + '/../../config/boot' +# frozen_string_literal: true + +require "#{File.dirname(__FILE__)}/../../config/boot" require 'commands/process/spawner' diff --git a/script/rails b/script/rails index f8da2cffd4..e1068b282c 100755 --- a/script/rails +++ b/script/rails @@ -1,6 +1,8 @@ #!/usr/bin/env ruby +# frozen_string_literal: true + # This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application. -APP_PATH = File.expand_path('../../config/application', __FILE__) -require File.expand_path('../../config/boot', __FILE__) +APP_PATH = File.expand_path('../config/application', __dir__) +require File.expand_path('../config/boot', __dir__) require 'rails/commands' diff --git a/script/runner b/script/runner index ccc30f9d24..0d4a2fae90 100755 --- a/script/runner +++ b/script/runner @@ -1,3 +1,5 @@ #!/usr/bin/env ruby -require File.dirname(__FILE__) + '/../config/boot' -require 'commands/runner' \ No newline at end of file +# frozen_string_literal: true + +require "#{File.dirname(__FILE__)}/../config/boot" +require 'commands/runner' diff --git a/script/server b/script/server index ece2450965..6c1d5f63d6 100755 --- a/script/server +++ b/script/server @@ -1,3 +1,5 @@ #!/usr/bin/env ruby +# frozen_string_literal: true + require_relative '../config/boot' -require 'commands/server' \ No newline at end of file +require 'commands/server' diff --git a/script/ssl_server b/script/ssl_server index 91ab6b08f9..4d7b5ed235 100755 --- a/script/ssl_server +++ b/script/ssl_server @@ -1,4 +1,6 @@ #!/usr/bin/env ruby +# frozen_string_literal: true + require_relative '../config/boot' require 'active_support' @@ -19,35 +21,40 @@ rescue Exception end options = { - :Port => 443, - :Host => "0.0.0.0", - :environment => (Rails.env || "development").dup, - :config => Rails.root + "/config.ru", - :detach => false, - :debugger => false, - :path => nil, - :SSLEnable => true, - :SSLVerifyClient => OpenSSL::SSL::VERIFY_NONE, - :SSLCertName => [ [ "CN", WEBrick::Utils::getservername ] ] + Port: 443, + Host: '0.0.0.0', + environment: (Rails.env || 'development').dup, + config: "#{Rails.root}/config.ru", + detach: false, + debugger: false, + path: nil, + SSLEnable: true, + SSLVerifyClient: OpenSSL::SSL::VERIFY_NONE, + SSLCertName: [['CN', WEBrick::Utils.getservername]] } ARGV.clone.options do |opts| - opts.on("-p", "--port=port", Integer, - "Runs Rails on the specified port.", "Default: 3000") { |v| options[:Port] = v } - opts.on("-b", "--binding=ip", String, - "Binds Rails to the specified ip.", "Default: 0.0.0.0") { |v| options[:Host] = v } - opts.on("-c", "--config=file", String, - "Use custom rackup configuration file") { |v| options[:config] = v } - opts.on("-d", "--daemon", "Make server run as a Daemon.") { options[:detach] = true } - opts.on("-u", "--debugger", "Enable ruby-debugging for the server.") { options[:debugger] = true } - opts.on("-e", "--environment=name", String, - "Specifies the environment to run this server under (test/development/production).", - "Default: development") { |v| options[:environment] = v } - opts.on("-P", "--path=/path", String, "Runs Rails app mounted at a specific path.", "Default: /") { |v| options[:path] = v } - - opts.separator "" - - opts.on("-h", "--help", "Show this help message.") { puts opts; exit } + opts.on('-p', '--port=port', Integer, + 'Runs Rails on the specified port.', 'Default: 3000') { |v| options[:Port] = v } + opts.on('-b', '--binding=ip', String, + 'Binds Rails to the specified ip.', 'Default: 0.0.0.0') { |v| options[:Host] = v } + opts.on('-c', '--config=file', String, + 'Use custom rackup configuration file') { |v| options[:config] = v } + opts.on('-d', '--daemon', 'Make server run as a Daemon.') { options[:detach] = true } + opts.on('-u', '--debugger', 'Enable ruby-debugging for the server.') { options[:debugger] = true } + opts.on('-e', '--environment=name', String, + 'Specifies the environment to run this server under (test/development/production).', + 'Default: development') { |v| options[:environment] = v } + opts.on('-P', '--path=/path', String, 'Runs Rails app mounted at a specific path.', 'Default: /') do |v| + options[:path] = v + end + + opts.separator '' + + opts.on('-h', '--help', 'Show this help message.') do + puts opts + exit + end opts.parse! end @@ -57,14 +64,14 @@ server = Rack::Handler::WEBrick puts "=> Booting #{ActiveSupport::Inflector.demodulize(server)}" puts "=> Rails #{Rails.version} application starting on http://#{options[:Host]}:#{options[:Port]}#{options[:path]}" -%w(cache pids sessions sockets).each do |dir_to_make| +%w[cache pids sessions sockets].each do |dir_to_make| FileUtils.mkdir_p(Rails.root.join('tmp', dir_to_make)) end if options[:detach] Process.daemon pid = "#{Rails.root}/tmp/pids/server.pid" - File.open(pid, 'w'){ |f| f.write(Process.pid) } + File.open(pid, 'w') { |f| f.write(Process.pid) } at_exit { File.delete(pid) if File.exist?(pid) } end @@ -75,10 +82,8 @@ if File.exist?(options[:config]) config = options[:config] if config =~ /\.ru$/ cfgfile = File.read(config) - if cfgfile[/^#\\(.*)/] - opts.parse!($1.split(/\s+/)) - end - inner_app = eval("Rack::Builder.new {( " + cfgfile + "\n )}.to_app", nil, config) + opts.parse!(Regexp.last_match(1).split(/\s+/)) if cfgfile[/^#\\(.*)/] + inner_app = eval("Rack::Builder.new {( #{cfgfile}\n )}.to_app", nil, __FILE__, __LINE__) else require config inner_app = Object.const_get(File.basename(config, '.rb').capitalize) @@ -89,29 +94,29 @@ else end if options[:path].nil? - map_path = "/" + map_path = '/' else ActionController::Base.relative_url_root = options[:path] map_path = options[:path] end -app = Rack::Builder.new { +app = Rack::Builder.new do use Rails::Rack::LogTailer unless options[:detach] use Rails::Rack::Debugger if options[:debugger] map map_path do use Rails::Rack::Static run inner_app end -}.to_app +end.to_app -puts "=> Call with -d to detach" +puts '=> Call with -d to detach' trap(:INT) { exit } -puts "=> Ctrl-C to shutdown server" +puts '=> Ctrl-C to shutdown server' begin - server.run(app, options.merge(:AccessLog => [])) + server.run(app, options.merge(AccessLog: [])) ensure puts 'Exiting' -end \ No newline at end of file +end diff --git a/spec/components/alerts_container_component_spec.rb b/spec/components/alerts_container_component_spec.rb index 582e620dab..6f6716932f 100644 --- a/spec/components/alerts_container_component_spec.rb +++ b/spec/components/alerts_container_component_spec.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -require "rails_helper" +require 'rails_helper' RSpec.describe AlertsContainerComponent, type: :component do pending "add some examples to (or delete) #{__FILE__}" diff --git a/spec/components/turbo_frame_component_spec.rb b/spec/components/turbo_frame_component_spec.rb index 8576d9d0f4..0622812371 100644 --- a/spec/components/turbo_frame_component_spec.rb +++ b/spec/components/turbo_frame_component_spec.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -require "rails_helper" +require 'rails_helper' RSpec.describe TurboFrameComponent, type: :component do pending "add some examples to (or delete) #{__FILE__}" diff --git a/spec/components/turbo_modal_component_spec.rb b/spec/components/turbo_modal_component_spec.rb index ba4d1402af..239c018042 100644 --- a/spec/components/turbo_modal_component_spec.rb +++ b/spec/components/turbo_modal_component_spec.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -require "rails_helper" +require 'rails_helper' RSpec.describe TurboModalComponent, type: :component do pending "add some examples to (or delete) #{__FILE__}" diff --git a/spec/mailers/subscribe_spec.rb b/spec/mailers/subscribe_spec.rb index a2b7391c33..0fd890c223 100644 --- a/spec/mailers/subscribe_spec.rb +++ b/spec/mailers/subscribe_spec.rb @@ -1,35 +1,33 @@ -require "rails_helper" +# frozen_string_literal: true + +require 'rails_helper' RSpec.describe SubscribeMailer, type: :mailer do - - describe "register for announce list" do - let(:mail) { SubscribeMailer.register_for_announce_list("user@lirmm.fr","user_fn","user_ln") } + describe 'register for announce list' do + let(:mail) { SubscribeMailer.register_for_announce_list('user@lirmm.fr', 'user_fn', 'user_ln') } - it "renders the headers" do + it 'renders the headers' do expect(mail.subject).to eq("subscribe #{$ANNOUNCE_LIST} user_fn user_ln") expect(mail.to).to eq([$ANNOUNCE_SERVICE_HOST]) - expect(mail.from).to eq(["user@lirmm.fr"]) + expect(mail.from).to eq(['user@lirmm.fr']) end - it "renders the body" do - expect(mail.body.encoded).to match("") + it 'renders the body' do + expect(mail.body.encoded).to match('') end - end - describe "unregister for announce list" do - let(:mail) { SubscribeMailer.unregister_for_announce_list("user@lirmm.fr") } + describe 'unregister for announce list' do + let(:mail) { SubscribeMailer.unregister_for_announce_list('user@lirmm.fr') } - it "renders the headers" do + it 'renders the headers' do expect(mail.subject).to eq("unsubscribe #{$ANNOUNCE_LIST}") expect(mail.to).to eq([$ANNOUNCE_SERVICE_HOST]) - expect(mail.from).to eq(["user@lirmm.fr"]) + expect(mail.from).to eq(['user@lirmm.fr']) end - it "renders the body" do - expect(mail.body.encoded).to match("") + it 'renders the body' do + expect(mail.body.encoded).to match('') end - end - end diff --git a/spec/models/license_spec.rb b/spec/models/license_spec.rb index a5fc0d775d..948cf4040b 100644 --- a/spec/models/license_spec.rb +++ b/spec/models/license_spec.rb @@ -1,11 +1,12 @@ +# frozen_string_literal: true + require 'rails_helper' RSpec.describe License, type: :model do - include ActiveSupport::Testing::TimeHelpers # Decryption of below variable: "841b4f58-02e1-4a66-9e27-191f15e16279;Microsoft Corporation;2021-02-14". - let (:encrypted_license_key) { + let(:encrypted_license_key) do <<~HEREDOC ds938nK0sdu8AzhtGefz0r7JTH97ncQfuokmwYLGHYbQF4CA1lWVHWwWoM/W\ lzvZlDSE/WSLvXKefOXk6+yrelKgUMcnLy1Q5o6E+jJW6uia77Ivv6Hxl445\ @@ -16,18 +17,18 @@ |a6Bh755yqiviJBFm/XAMS/lA1hhYjR5SKrnQ5vb4/osMutu91j9Z/BSNIknD\ Ia5kNAhlV6Ie0UkjjMbRgAr471TdLFcy2fB05BwG14JU1GM= HEREDOC - } + end - # This license key was generated using the staging license server, and the + # This license key was generated using the staging license server, and the # encoded appliance ID matches that of the BioPortal staging environment. - # + # # Staging license server: https://license.stage.ontoportal.org # Staging BioPortal instance: https://stage.bioontology.org/ # License information for this encrypted key: https://license.stage.ontoportal.org/licenses/1077 # # Decryption of below variable: "dd212a7c-29fd-4142-8353-f59a19a79738;BMIR;2021-04-20" # - let (:encrypted_license_key_staging_env) { + let(:encrypted_license_key_staging_env) do <<~HEREDOC WtlzkakMaAKx7NwyuHRnCDVSMQszaEtv7jNiVgBcg9kQeNS69ToFp9Nhvb8F AANaHtSibb6InYemQABpq+sONg9cp4+pfCTAh5ETmyF8GPrWiwv8DZstMRUO @@ -38,67 +39,66 @@ |Sf6udPHZJB3CSRQBRw8CjB4nHEspfpg4fM7NwStIfXhfiDx0W0P0+9NiQkIh 0VlkhKD3ev0hnSDi/x/GazByvg== HEREDOC - } + end - it do "decrypts license data" + it do license = License.create(encrypted_key: encrypted_license_key_staging_env) - expect(license.appliance_id).to eq("dd212a7c-29fd-4142-8353-f59a19a79738") - expect(license.organization).to eq("BMIR") - expect(license.expiry_date).to eq(Date.parse("2021-04-20")) + expect(license.appliance_id).to eq('dd212a7c-29fd-4142-8353-f59a19a79738') + expect(license.organization).to eq('BMIR') + expect(license.expiry_date).to eq(Date.parse('2021-04-20')) end - it do "is a trial license" - license = License.new(encrypted_key: "trial", created_at: Time.current) + it do + license = License.new(encrypted_key: 'trial', created_at: Time.current) expect(license.is_trial?).to eq(true) end - it do "is not a trial license" + it do license = License.new(encrypted_key: encrypted_license_key) expect(license.is_trial?).to eq(false) end - it do "is in trial period" - license = License.create(encrypted_key: "trial", created_at: Time.current) - + it do + license = License.create(encrypted_key: 'trial', created_at: Time.current) + travel 15.days do expect(license.days_remaining).to be > 0 end end - it do "is out of trial after trial period" - license = License.create(encrypted_key: "trial", created_at: Time.current) + it do + license = License.create(encrypted_key: 'trial', created_at: Time.current) travel 31.days do expect(license.days_remaining).to eq(0) end end - it do "calculates days remaining" + it do license = License.create(encrypted_key: encrypted_license_key_staging_env) - travel_to(Date.parse("2021-03-21")) do + travel_to(Date.parse('2021-03-21')) do expect(license.days_remaining).to eq(30) end - travel_to(Date.parse("2021-04-19")) do + travel_to(Date.parse('2021-04-19')) do expect(license.days_remaining).to eq(1) end - travel_to(Date.parse("2021-04-20")) do + travel_to(Date.parse('2021-04-20')) do expect(license.days_remaining).to eq(0) end - travel_to(Date.parse("2021-05-01")) do + travel_to(Date.parse('2021-05-01')) do expect(license.days_remaining).to eq(0) end end - describe "validation" do - - let (:encrypted_license_key_with_missing_characters) { + describe 'validation' do + let(:encrypted_license_key_with_missing_characters) do <<~HEREDOC ds938nK0sdu8AzhtGefz0r7JTH97ncQfuokmwYLGHYbQF4CA1lWVHWwWoM/W\ lzvZlDSE/WSLvXKefOXk6+yrelKgUMcnLy1Q5o6E+jJW6uia77Ivv6Hxl445\ @@ -109,28 +109,28 @@ |a6Bh755yqiviJBFm/XAMS/lA1hhYjR5SKrnQ5vb4/osMutu91j9Z/BSNIknD\ Ia5kNAhlV6Ie0UkjjMbRgAr471TdLFcy2fB05BwG14JU HEREDOC - } + end - it "blocks malformed keys" do + it 'blocks malformed keys' do license = License.new(encrypted_key: encrypted_license_key_with_missing_characters) license.valid? expect(license).to be_invalid - expect(license.errors[:encrypted_key]).to include I18n.t("activerecord.errors.models.license.attributes.encrypted_key.invalid_license_key") + expect(license.errors[:encrypted_key]).to include I18n.t('activerecord.errors.models.license.attributes.encrypted_key.invalid_license_key') end - it "blocks invalid keys" do - license = License.create(encrypted_key: "lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua") + it 'blocks invalid keys' do + license = License.create(encrypted_key: 'lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua') license.valid? expect(license).to be_invalid - expect(license.errors[:encrypted_key]).to include I18n.t("activerecord.errors.models.license.attributes.encrypted_key.invalid_license_key") + expect(license.errors[:encrypted_key]).to include I18n.t('activerecord.errors.models.license.attributes.encrypted_key.invalid_license_key') end - it "allows trial licenses" do - license = License.new(encrypted_key: "trial") + it 'allows trial licenses' do + license = License.new(encrypted_key: 'trial') license.valid? @@ -138,7 +138,7 @@ expect(license.errors).to be_empty end - it "allows valid keys" do + it 'allows valid keys' do license = License.new(encrypted_key: encrypted_license_key_staging_env) license.valid? @@ -147,26 +147,22 @@ expect(license.errors).to be_empty end - it "blocks licenses with mismatches between encoded appliance IDs and actual" do + it 'blocks licenses with mismatches between encoded appliance IDs and actual' do license = License.new(encrypted_key: encrypted_license_key) license.save - expect(license.errors[:encrypted_key]).to include "is an appliance ID mismatch" + expect(license.errors[:encrypted_key]).to include 'is an appliance ID mismatch' end - end - describe ".current_license" do - - it "should return the latest license" do - new_license = License.create(encrypted_key: encrypted_license_key_staging_env, created_at: Time.now + 1.day) + describe '.current_license' do + it 'should return the latest license' do + License.create(encrypted_key: encrypted_license_key_staging_env, created_at: Time.now + 1.day) newer_license = License.create(encrypted_key: encrypted_license_key_staging_env, created_at: Time.now + 2.days) expect(License.current_license.count).to eql(1) expect(License.current_license.first).to eql(newer_license) end - end - end diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb index b06351ba45..3920bb88ee 100644 --- a/spec/rails_helper.rb +++ b/spec/rails_helper.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + # This file is copied to spec/ when you run 'rails generate rspec:install' require 'spec_helper' ENV['RAILS_ENV'] ||= 'test' @@ -5,7 +7,7 @@ require File.expand_path('../config/environment', __dir__) # Prevent database truncation if the environment is production -abort("The Rails environment is running in production mode!") if Rails.env.production? +abort('The Rails environment is running in production mode!') if Rails.env.production? require 'rspec/rails' # Add additional requires below this line. Rails is not loaded until this point! diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index ce33d66df6..01f7c97442 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + # This file was generated by the `rails generate rspec:install` 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 @@ -44,53 +46,51 @@ # triggering implicit auto-inclusion in groups with matching metadata. config.shared_context_metadata_behavior = :apply_to_host_groups -# The settings below are suggested to provide a good initial experience -# with RSpec, but feel free to customize to your heart's content. -=begin - # This allows you to limit a spec run to individual examples or groups - # you care about by tagging them with `:focus` metadata. When nothing - # is tagged with `:focus`, all examples get run. RSpec also provides - # aliases for `it`, `describe`, and `context` that include `:focus` - # metadata: `fit`, `fdescribe` and `fcontext`, respectively. - config.filter_run_when_matching :focus - - # Allows RSpec to persist some state between runs in order to support - # the `--only-failures` and `--next-failure` CLI options. We recommend - # you configure your source control system to ignore this file. - config.example_status_persistence_file_path = "spec/examples.txt" - - # Limits the available syntax to the non-monkey patched syntax that is - # recommended. For more details, see: - # - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/ - # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/ - # - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode - config.disable_monkey_patching! - - # Many RSpec users commonly either run the entire suite or an individual - # file, and it's useful to allow more verbose output when running an - # individual spec file. - if config.files_to_run.one? - # Use the documentation formatter for detailed output, - # unless a formatter has already been configured - # (e.g. via a command-line flag). - config.default_formatter = "doc" - end - - # Print the 10 slowest examples and example groups at the - # end of the spec run, to help surface which specs are running - # particularly slow. - config.profile_examples = 10 - - # Run specs in random order to surface order dependencies. If you find an - # order dependency and want to debug it, you can fix the order by providing - # the seed, which is printed after each run. - # --seed 1234 - config.order = :random - - # Seed global randomization in this process using the `--seed` CLI option. - # Setting this allows you to use `--seed` to deterministically reproduce - # test failures related to randomization by passing the same `--seed` value - # as the one that triggered the failure. - Kernel.srand config.seed -=end + # The settings below are suggested to provide a good initial experience + # with RSpec, but feel free to customize to your heart's content. + # # This allows you to limit a spec run to individual examples or groups + # # you care about by tagging them with `:focus` metadata. When nothing + # # is tagged with `:focus`, all examples get run. RSpec also provides + # # aliases for `it`, `describe`, and `context` that include `:focus` + # # metadata: `fit`, `fdescribe` and `fcontext`, respectively. + # config.filter_run_when_matching :focus + # + # # Allows RSpec to persist some state between runs in order to support + # # the `--only-failures` and `--next-failure` CLI options. We recommend + # # you configure your source control system to ignore this file. + # config.example_status_persistence_file_path = "spec/examples.txt" + # + # # Limits the available syntax to the non-monkey patched syntax that is + # # recommended. For more details, see: + # # - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/ + # # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/ + # # - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode + # config.disable_monkey_patching! + # + # # Many RSpec users commonly either run the entire suite or an individual + # # file, and it's useful to allow more verbose output when running an + # # individual spec file. + # if config.files_to_run.one? + # # Use the documentation formatter for detailed output, + # # unless a formatter has already been configured + # # (e.g. via a command-line flag). + # config.default_formatter = "doc" + # end + # + # # Print the 10 slowest examples and example groups at the + # # end of the spec run, to help surface which specs are running + # # particularly slow. + # config.profile_examples = 10 + # + # # Run specs in random order to surface order dependencies. If you find an + # # order dependency and want to debug it, you can fix the order by providing + # # the seed, which is printed after each run. + # # --seed 1234 + # config.order = :random + # + # # Seed global randomization in this process using the `--seed` CLI option. + # # Setting this allows you to use `--seed` to deterministically reproduce + # # test failures related to randomization by passing the same `--seed` value + # # as the one that triggered the failure. + # Kernel.srand config.seed end diff --git a/test/components/previews/buttons/chip_button_component_preview.rb b/test/components/previews/buttons/chip_button_component_preview.rb index 9ac36c8a30..0b24f1fa23 100644 --- a/test/components/previews/buttons/chip_button_component_preview.rb +++ b/test/components/previews/buttons/chip_button_component_preview.rb @@ -1,19 +1,19 @@ -class Buttons::ChipButtonComponentPreview < ViewComponent::Preview +# frozen_string_literal: true +module Buttons + class ChipButtonComponentPreview < ViewComponent::Preview # @param url text # @param text text - def standard(url: "nil", text: "text") - render(ChipButtonComponent.new(url: url, text: text, type: "static")) + def standard(url: 'nil', text: 'text') + render(ChipButtonComponent.new(url: url, text: text, type: 'static')) end # @param url text # @param text text - def clickable(url: "nil", text: "text") - render(ChipButtonComponent.new(url: url, text: text, type: "clickable")) + def clickable(url: 'nil', text: 'text') + render(ChipButtonComponent.new(url: url, text: text, type: 'clickable')) end - - - -end \ No newline at end of file + end +end diff --git a/test/components/previews/buttons/ontology_subscribe_button_component_preview.rb b/test/components/previews/buttons/ontology_subscribe_button_component_preview.rb index 4d9c2b56dd..1fba614b3d 100644 --- a/test/components/previews/buttons/ontology_subscribe_button_component_preview.rb +++ b/test/components/previews/buttons/ontology_subscribe_button_component_preview.rb @@ -1,7 +1,9 @@ # frozen_string_literal: true -class Buttons::OntologySubscribeButtonComponentPreview < ViewComponent::Preview - def default - render OntologySubscribeButtonComponent.new(ontology_id: '', subscribed: true, user_id: '') +module Buttons + class OntologySubscribeButtonComponentPreview < ViewComponent::Preview + def default + render OntologySubscribeButtonComponent.new(ontology_id: '', subscribed: true, user_id: '') + end end end diff --git a/test/components/previews/buttons/pill_button_component_preview.rb b/test/components/previews/buttons/pill_button_component_preview.rb index f4cc6a9ac0..5bad6b1fd5 100644 --- a/test/components/previews/buttons/pill_button_component_preview.rb +++ b/test/components/previews/buttons/pill_button_component_preview.rb @@ -1,8 +1,10 @@ # frozen_string_literal: true -class Buttons::PillButtonComponentPreview < ViewComponent::Preview - # @param text text - def default(text: 'hello') - render PillButtonComponent.new(text: text) +module Buttons + class PillButtonComponentPreview < ViewComponent::Preview + # @param text text + def default(text: 'hello') + render PillButtonComponent.new(text: text) + end end end diff --git a/test/components/previews/buttons/regular_button_component_preview.rb b/test/components/previews/buttons/regular_button_component_preview.rb index 85894c64af..3a8941ecd1 100644 --- a/test/components/previews/buttons/regular_button_component_preview.rb +++ b/test/components/previews/buttons/regular_button_component_preview.rb @@ -1,57 +1,60 @@ # frozen_string_literal: true -class Buttons::RegularButtonComponentPreview < ViewComponent::Preview - include InlineSvg::ActionView::Helpers - layout 'component_preview_not_centred' - def primary - render Buttons::RegularButtonComponent.new(id:'regular-button', value: "Login", variant: "primary") +module Buttons + class RegularButtonComponentPreview < ViewComponent::Preview + include InlineSvg::ActionView::Helpers + layout 'component_preview_not_centred' - end - - def link - render Buttons::RegularButtonComponent.new(id:'regular-button', value: "Link", variant: "primary", href: "#") - end + def primary + render Buttons::RegularButtonComponent.new(id: 'regular-button', value: 'Login', variant: 'primary') + end + def link + render Buttons::RegularButtonComponent.new(id: 'regular-button', value: 'Link', variant: 'primary', href: '#') + end - def secondary - render Buttons::RegularButtonComponent.new(id:'regular-button', value: "Login", variant: "secondary") - end + def secondary + render Buttons::RegularButtonComponent.new(id: 'regular-button', value: 'Login', variant: 'secondary') + end - def slim - render Buttons::RegularButtonComponent.new(id:'regular-button', value: "Login", variant: "primary", size: "slim") - end + def slim + render Buttons::RegularButtonComponent.new(id: 'regular-button', value: 'Login', variant: 'primary', size: 'slim') + end - def danger - render Buttons::RegularButtonComponent.new(id:'regular-button', value: "Login", variant: "primary", color: "danger") - end + def danger + render Buttons::RegularButtonComponent.new(id: 'regular-button', value: 'Login', variant: 'primary', + color: 'danger') + end - def warning - render Buttons::RegularButtonComponent.new(id:'regular-button', value: "Login", variant: "primary", color: "warning") - end + def warning + render Buttons::RegularButtonComponent.new(id: 'regular-button', value: 'Login', variant: 'primary', + color: 'warning') + end - def disabled - render Buttons::RegularButtonComponent.new(id:'regular-button', value: "Login", variant: "primary", state: "disabled") - end + def disabled + render Buttons::RegularButtonComponent.new(id: 'regular-button', value: 'Login', variant: 'primary', + state: 'disabled') + end - def no_animation - render Buttons::RegularButtonComponent.new(id:'regular-button', value: "Login", variant: "primary", state: "regular") - end + def no_animation + render Buttons::RegularButtonComponent.new(id: 'regular-button', value: 'Login', variant: 'primary', + state: 'regular') + end - def icon_left - render Buttons::RegularButtonComponent.new(id:'regular-button', value: "Login", variant: "primary") do |btn| - btn.icon_left do - inline_svg_tag "check.svg" + def icon_left + render Buttons::RegularButtonComponent.new(id: 'regular-button', value: 'Login', variant: 'primary') do |btn| + btn.icon_left do + inline_svg_tag 'check.svg' + end end end - end - def icon_right - - render Buttons::RegularButtonComponent.new(id:'regular-button', value: "Login", variant: "primary") do |btn| - btn.icon_right do - inline_svg_tag "check.svg" + def icon_right + render Buttons::RegularButtonComponent.new(id: 'regular-button', value: 'Login', variant: 'primary') do |btn| + btn.icon_right do + inline_svg_tag 'check.svg' + end end end end - -end \ No newline at end of file +end diff --git a/test/components/previews/buttons/rounded_button_component_preview.rb b/test/components/previews/buttons/rounded_button_component_preview.rb index 685badf8ad..0f58bff756 100644 --- a/test/components/previews/buttons/rounded_button_component_preview.rb +++ b/test/components/previews/buttons/rounded_button_component_preview.rb @@ -1,14 +1,13 @@ -class Buttons::RoundedButtonComponentPreview < ViewComponent::Preview +# frozen_string_literal: true +module Buttons + class RoundedButtonComponentPreview < ViewComponent::Preview # @param icon text # @param link text # @param size select [small, medium, big] - def default(icon: "json.svg", link: "text", size: "small") - render(RoundedButtonComponent.new(icon: icon, link: link, size: size)) + def default(icon: 'json.svg', link: 'text', size: 'small') + render(RoundedButtonComponent.new(icon: icon, link: link, size: size)) end - - - - -end \ No newline at end of file + end +end diff --git a/test/components/previews/concept_details_component_preview.rb b/test/components/previews/concept_details_component_preview.rb index 3d486535a6..9b3686355e 100644 --- a/test/components/previews/concept_details_component_preview.rb +++ b/test/components/previews/concept_details_component_preview.rb @@ -4,29 +4,28 @@ class ConceptDetailsComponentPreview < ViewComponent::Preview def default properties = { links: nil, context: nil, - "http://www.w3.org/2004/02/skos/core#narrower": ["http://opendata.inrae.fr/thesaurusINRAE/d_0101", - "http://opendata.inrae.fr/thesaurusINRAE/d_0103", - "http://opendata.inrae.fr/thesaurusINRAE/d_0102", - "http://opendata.inrae.fr/thesaurusINRAE/d_0104", - "http://opendata.inrae.fr/thesaurusINRAE/d_0105"], - "http://www.w3.org/1999/02/22-rdf-syntax-ns#type": ["http://www.w3.org/2004/02/skos/core#Concept", - "http://www.w3.org/2002/07/owl#NamedIndividual"], - "http://www.w3.org/2004/02/skos/core#topConceptOf": ["http://opendata.inrae.fr/thesaurusINRAE/thesaurusINRAE"], - "http://www.w3.org/2004/02/skos/core#prefLabel": ["01. ENVIRONMENT [domain]"], - "http://www.w3.org/2004/02/skos/core#inScheme": ["http://opendata.inrae.fr/thesaurusINRAE/thesaurusINRAE"], - "http://purl.org/dc/terms/modified": ["2021-02-24T15:25:56"] - } + "http://www.w3.org/2004/02/skos/core#narrower": ['http://opendata.inrae.fr/thesaurusINRAE/d_0101', + 'http://opendata.inrae.fr/thesaurusINRAE/d_0103', + 'http://opendata.inrae.fr/thesaurusINRAE/d_0102', + 'http://opendata.inrae.fr/thesaurusINRAE/d_0104', + 'http://opendata.inrae.fr/thesaurusINRAE/d_0105'], + "http://www.w3.org/1999/02/22-rdf-syntax-ns#type": ['http://www.w3.org/2004/02/skos/core#Concept', + 'http://www.w3.org/2002/07/owl#NamedIndividual'], + "http://www.w3.org/2004/02/skos/core#topConceptOf": ['http://opendata.inrae.fr/thesaurusINRAE/thesaurusINRAE'], + "http://www.w3.org/2004/02/skos/core#prefLabel": ['01. ENVIRONMENT [domain]'], + "http://www.w3.org/2004/02/skos/core#inScheme": ['http://opendata.inrae.fr/thesaurusINRAE/thesaurusINRAE'], + "http://purl.org/dc/terms/modified": ['2021-02-24T15:25:56'] } schemes_keys = %w[hasTopConcept topConceptOf] label_xl_set = %w[skos-xl#prefLabel skos-xl#altLabel skos-xl#hiddenLabel] - render ConceptDetailsComponent.new(id: 'concept-details', acronym: "Ontology", + render ConceptDetailsComponent.new(id: 'concept-details', acronym: 'Ontology', properties: OpenStruct.new(properties), top_keys: %w[description comment], bottom_keys: %w[disjoint subclass is_a has_part], exclude_keys: schemes_keys + label_xl_set + ['inScheme']) do |c| c.header(stripped: true) do |table| - table.add_row({ th: 'ID' }, { td: "http://opendata.inrae.fr/thesaurusINRAE/d_1" }) - table.add_row({ th: 'Preferred Name' }, { td: "01. ENVIRONMENT [domain]" }) - table.add_row({ th: 'Type' }, { td: "http://www.w3.org/2004/02/skos/core#Concept" }) + table.add_row({ th: 'ID' }, { td: 'http://opendata.inrae.fr/thesaurusINRAE/d_1' }) + table.add_row({ th: 'Preferred Name' }, { td: '01. ENVIRONMENT [domain]' }) + table.add_row({ th: 'Type' }, { td: 'http://www.w3.org/2004/02/skos/core#Concept' }) end end end diff --git a/test/components/previews/display/alert_component_preview.rb b/test/components/previews/display/alert_component_preview.rb index 9b9d355a69..969c5efb10 100644 --- a/test/components/previews/display/alert_component_preview.rb +++ b/test/components/previews/display/alert_component_preview.rb @@ -1,34 +1,45 @@ -class Display::AlertComponentPreview < ViewComponent::Preview +# frozen_string_literal: true - #@param message text - #@param closable select [true, false] - def default(message: "New ontology Bioinformatics Ontology v2.0 has been uploaded. Check it out in the latest uploads section", closable: true) - render Display::AlertComponent.new(message: message, closable: closable) - end - - #@param message text - #@param closable select [true, false] - def danger(message: "Unable to delete ontology Chemistry Concepts Ontology. This ontology is associated with existing mappings. Please remove mappings before deleting", closable: true) - render Display::AlertComponent.new(message: message, closable: closable, type: "danger") - end +module Display + class AlertComponentPreview < ViewComponent::Preview + # @param message text + # @param closable select [true, false] + def default( + message: 'New ontology Bioinformatics Ontology v2.0 has been uploaded. Check it out in the latest uploads section', closable: true + ) + render Display::AlertComponent.new(message: message, closable: closable) + end - #@param message text - #@param closable select [true, false] - def warning(message: "This ontology version is outdated and may contain inaccuracies. Consider using the latest version for accurate information", closable: true) - render Display::AlertComponent.new(message: message, closable: closable, type: "warning") - end + # @param message text + # @param closable select [true, false] + def danger( + message: 'Unable to delete ontology Chemistry Concepts Ontology. This ontology is associated with existing mappings. Please remove mappings before deleting', closable: true + ) + render Display::AlertComponent.new(message: message, closable: closable, type: 'danger') + end - #@param message text - #@param closable select [true, false] - def success(message: "Your ontology submission has been successfully uploaded and is now under review. You will receive an email confirmation shortly", closable: true) - render Display::AlertComponent.new(message: message, closable: closable, type: "success") - end + # @param message text + # @param closable select [true, false] + def warning( + message: 'This ontology version is outdated and may contain inaccuracies. Consider using the latest version for accurate information', closable: true + ) + render Display::AlertComponent.new(message: message, closable: closable, type: 'warning') + end + # @param message text + # @param closable select [true, false] + def success( + message: 'Your ontology submission has been successfully uploaded and is now under review. You will receive an email confirmation shortly', closable: true + ) + render Display::AlertComponent.new(message: message, closable: closable, type: 'success') + end - #@param message text - #@param delay number - def auto_close(message: "Your ontology submission has been successfully uploaded and is now under review. You will receive an email confirmation shortly", delay: 3000) - render Display::AlertComponent.new(message: message, closable: true, auto_close_delay: delay, type: "default") + # @param message text + # @param delay number + def auto_close( + message: 'Your ontology submission has been successfully uploaded and is now under review. You will receive an email confirmation shortly', delay: 3000 + ) + render Display::AlertComponent.new(message: message, closable: true, auto_close_delay: delay, type: 'default') + end end - -end \ No newline at end of file +end diff --git a/test/components/previews/display/circle_progress_bar_component_preview.rb b/test/components/previews/display/circle_progress_bar_component_preview.rb index f226774376..db4088464a 100644 --- a/test/components/previews/display/circle_progress_bar_component_preview.rb +++ b/test/components/previews/display/circle_progress_bar_component_preview.rb @@ -1,10 +1,11 @@ # frozen_string_literal: true -class Display::CircleProgressBarComponentPreview < ViewComponent::Preview - - # @param count number - # @param max number - def default(count: 63, max: 100) - render CircleProgressBarComponent.new(count: count, max: max) +module Display + class CircleProgressBarComponentPreview < ViewComponent::Preview + # @param count number + # @param max number + def default(count: 63, max: 100) + render CircleProgressBarComponent.new(count: count, max: max) + end end end diff --git a/test/components/previews/display/date_time_field_component_preview.rb b/test/components/previews/display/date_time_field_component_preview.rb index 04071bc8c8..ce78b043b3 100644 --- a/test/components/previews/display/date_time_field_component_preview.rb +++ b/test/components/previews/display/date_time_field_component_preview.rb @@ -1,9 +1,11 @@ -class Display::DateTimeFieldComponentPreview < ViewComponent::Preview +# frozen_string_literal: true - # @param text text - # @param format select [year_month_day_concise, month_day_year, monthfull_day_year] - def default(text: "2022-10-01", format: 'monthfull_day_year') - render DateTimeFieldComponent.new(value: text, format: format.to_sym) +module Display + class DateTimeFieldComponentPreview < ViewComponent::Preview + # @param text text + # @param format select [year_month_day_concise, month_day_year, monthfull_day_year] + def default(text: '2022-10-01', format: 'monthfull_day_year') + render DateTimeFieldComponent.new(value: text, format: format.to_sym) + end end - -end \ No newline at end of file +end diff --git a/test/components/previews/display/field_container_component_preview.rb b/test/components/previews/display/field_container_component_preview.rb index 0f04e8222c..6b2466f8c7 100644 --- a/test/components/previews/display/field_container_component_preview.rb +++ b/test/components/previews/display/field_container_component_preview.rb @@ -1,11 +1,12 @@ # frozen_string_literal: true -class Display::FieldContainerComponentPreview < ViewComponent::Preview - - # @param label text - # @param value text - # - def default(label: 'label' , value: 'value') - render FieldContainerComponent.new(label: label , value: value) +module Display + class FieldContainerComponentPreview < ViewComponent::Preview + # @param label text + # @param value text + # + def default(label: 'label', value: 'value') + render FieldContainerComponent.new(label: label, value: value) + end end end diff --git a/test/components/previews/display/header_component_preview.rb b/test/components/previews/display/header_component_preview.rb index 4911908968..d232adf896 100644 --- a/test/components/previews/display/header_component_preview.rb +++ b/test/components/previews/display/header_component_preview.rb @@ -1,10 +1,11 @@ # frozen_string_literal: true -class Display::HeaderComponentPreview < ViewComponent::Preview - - # @param text text - # @param tooltip text - def default(text: 'header text' , tooltip: 'text tooltip') - render Display::HeaderComponent.new(text: text, tooltip: tooltip) +module Display + class HeaderComponentPreview < ViewComponent::Preview + # @param text text + # @param tooltip text + def default(text: 'header text', tooltip: 'text tooltip') + render Display::HeaderComponent.new(text: text, tooltip: tooltip) + end end end diff --git a/test/components/previews/display/image_component_preview.rb b/test/components/previews/display/image_component_preview.rb index d6caa1f9a8..b430a2da27 100644 --- a/test/components/previews/display/image_component_preview.rb +++ b/test/components/previews/display/image_component_preview.rb @@ -1,7 +1,9 @@ # frozen_string_literal: true -class Display::ImageComponentPreview < ViewComponent::Preview - def default - render Display::ImageComponent.new(src: "empty-box.svg", title: 'Image popup') +module Display + class ImageComponentPreview < ViewComponent::Preview + def default + render Display::ImageComponent.new(src: 'empty-box.svg', title: 'Image popup') + end end end diff --git a/test/components/previews/display/info_tooltip_component_preview.rb b/test/components/previews/display/info_tooltip_component_preview.rb index 44f8449721..2454042738 100644 --- a/test/components/previews/display/info_tooltip_component_preview.rb +++ b/test/components/previews/display/info_tooltip_component_preview.rb @@ -1,9 +1,10 @@ # frozen_string_literal: true -class Display::InfoTooltipComponentPreview < ViewComponent::Preview - - # @param text text - def default(text: 'tooltip text') - render Display::InfoTooltipComponent.new(text: text) +module Display + class InfoTooltipComponentPreview < ViewComponent::Preview + # @param text text + def default(text: 'tooltip text') + render Display::InfoTooltipComponent.new(text: text) + end end end diff --git a/test/components/previews/display/language_field_component_preview.rb b/test/components/previews/display/language_field_component_preview.rb index 29cd56d3ac..3febb01db4 100644 --- a/test/components/previews/display/language_field_component_preview.rb +++ b/test/components/previews/display/language_field_component_preview.rb @@ -1,8 +1,10 @@ -class Display::LanguageFieldComponentPreview < ViewComponent::Preview +# frozen_string_literal: true - # @param value text - def default(value: 'fr') - render LanguageFieldComponent.new(value: value) +module Display + class LanguageFieldComponentPreview < ViewComponent::Preview + # @param value text + def default(value: 'fr') + render LanguageFieldComponent.new(value: value) + end end - -end \ No newline at end of file +end diff --git a/test/components/previews/display/license_field_component_preview.rb b/test/components/previews/display/license_field_component_preview.rb index 203318a0b5..3d6136c9a4 100644 --- a/test/components/previews/display/license_field_component_preview.rb +++ b/test/components/previews/display/license_field_component_preview.rb @@ -1,8 +1,10 @@ -class Display::LicenseFieldComponentPreview < ViewComponent::Preview +# frozen_string_literal: true - # @param value select [ CC-BY IGO 3.0, https://creativecommons.org/licenses/by/4.0/, http://www.gnu.org/licenses/gpl-3.0, https://opensource.org/licenses/MIT, http://www.apache.org/licenses/LICENSE-2.0 ] - def default(value: "https://creativecommons.org/licenses/by/4.0/") - render LicenseFieldComponent.new(value: value) +module Display + class LicenseFieldComponentPreview < ViewComponent::Preview + # @param value select [ CC-BY IGO 3.0, https://creativecommons.org/licenses/by/4.0/, http://www.gnu.org/licenses/gpl-3.0, https://opensource.org/licenses/MIT, http://www.apache.org/licenses/LICENSE-2.0 ] + def default(value: 'https://creativecommons.org/licenses/by/4.0/') + render LicenseFieldComponent.new(value: value) + end end - -end \ No newline at end of file +end diff --git a/test/components/previews/display/link_field_component_preview.rb b/test/components/previews/display/link_field_component_preview.rb index 3b6d3a85a5..cef3b2297d 100644 --- a/test/components/previews/display/link_field_component_preview.rb +++ b/test/components/previews/display/link_field_component_preview.rb @@ -1,8 +1,10 @@ -class Display::LinkFieldComponentPreview < ViewComponent::Preview +# frozen_string_literal: true - # @param text text - def default(text: "https://agroportal.lirmm.fr/") - render LinkFieldComponent.new(value: text) +module Display + class LinkFieldComponentPreview < ViewComponent::Preview + # @param text text + def default(text: 'https://agroportal.lirmm.fr/') + render LinkFieldComponent.new(value: text) + end end - -end \ No newline at end of file +end diff --git a/test/components/previews/display/link_text_component_preview.rb b/test/components/previews/display/link_text_component_preview.rb index d041c5c95f..7e8eac8bb1 100644 --- a/test/components/previews/display/link_text_component_preview.rb +++ b/test/components/previews/display/link_text_component_preview.rb @@ -1,25 +1,26 @@ # frozen_string_literal: true -class Display::LinkTextComponentPreview < ViewComponent::Preview +module Display + class LinkTextComponentPreview < ViewComponent::Preview + # @param text text + # @param icon text + def default(text: 'link text', icon: '') + render ChipButtonComponent.new(text: LinkTextComponent.new(text: text, icon: icon).call, type: 'clickable') + end - # @param text text - # @param icon text - def default(text: 'link text', icon: '') - render ChipButtonComponent.new(text: LinkTextComponent.new(text: text, icon: icon).call, type: 'clickable') - end - - # @param text text - def internal(text: 'redirect inside the site') - render ChipButtonComponent.new(text: InternalLinkTextComponent.new(text: text).call, type: 'clickable') - end + # @param text text + def internal(text: 'redirect inside the site') + render ChipButtonComponent.new(text: InternalLinkTextComponent.new(text: text).call, type: 'clickable') + end - # @param text text - def external(text: 'go out of the site') - render ChipButtonComponent.new(text: ExternalLinkTextComponent.new(text: text).call, type: 'clickable') - end + # @param text text + def external(text: 'go out of the site') + render ChipButtonComponent.new(text: ExternalLinkTextComponent.new(text: text).call, type: 'clickable') + end - # @param text text - def popup(text: 'open popup') - render ChipButtonComponent.new(text: PopupLinkTextComponent.new(text: text).call, type: 'clickable') + # @param text text + def popup(text: 'open popup') + render ChipButtonComponent.new(text: PopupLinkTextComponent.new(text: text).call, type: 'clickable') + end end end diff --git a/test/components/previews/display/text_area_field_component_preview.rb b/test/components/previews/display/text_area_field_component_preview.rb index efa508ab23..2ca22872cb 100644 --- a/test/components/previews/display/text_area_field_component_preview.rb +++ b/test/components/previews/display/text_area_field_component_preview.rb @@ -1,13 +1,16 @@ -class Display::TextAreaFieldComponentPreview < ViewComponent::Preview +# frozen_string_literal: true +module Display + class TextAreaFieldComponentPreview < ViewComponent::Preview + # @param value textarea + def default(value: '') + render TextAreaFieldComponent.new(value: value.empty? ? (long_text + long_text) : value) + end - # @param value textarea - def default(value: '') - render TextAreaFieldComponent.new(value: value.empty? ? (long_text + long_text) : value ) - end + private - private - def long_text - "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum." + def long_text + "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum." + end end -end \ No newline at end of file +end diff --git a/test/components/previews/input/chips_component_preview.rb b/test/components/previews/input/chips_component_preview.rb index 76e10ec283..1e5da8aed8 100644 --- a/test/components/previews/input/chips_component_preview.rb +++ b/test/components/previews/input/chips_component_preview.rb @@ -1,10 +1,12 @@ -class Input::ChipsComponentPreview < ViewComponent::Preview +# frozen_string_literal: true +module Input + class ChipsComponentPreview < ViewComponent::Preview # @param name text # @param value text - - def default(name: "name", value: "value") - render(ChipsComponent.new(name: name, value: value)) + + def default(name: 'name', value: 'value') + render(ChipsComponent.new(name: name, value: value)) end - -end \ No newline at end of file + end +end diff --git a/test/components/previews/input/input_field_component_preview.rb b/test/components/previews/input/input_field_component_preview.rb index dafe178b9d..39d3a331f6 100644 --- a/test/components/previews/input/input_field_component_preview.rb +++ b/test/components/previews/input/input_field_component_preview.rb @@ -1,94 +1,97 @@ # frozen_string_literal: true -class Input::InputFieldComponentPreview < ViewComponent::Preview - - # This is a date input field: - # - To use it without a label: don't give a value to the param label or leave it empty. - # - To put it in error state: define the param error_message with the error message you want to be displayed. - # - To give it a helper text (a text displayed under the input field): define the param helper_text with the helper text you want to be displayed. - # @param label text - # @param error_message text - # @param helper_text text - - def date(label: "Label", placeholder: "", error_message: "", helper_text: "") - render Input::DateComponent.new(label: label, name: "name", placeholder: placeholder, error_message: error_message, helper_text: helper_text) - end - - - # This is a url input field: - # - To use it without a label: don't give a value to the param label or leave it empty. - # - To put it in error state: define the param error_message with the error message you want to be displayed. - # - To give it a helper text (a text displayed under the input field): define the param helper_text with the helper text you want to be displayed. - # @param label text - # @param error_message text - # @param helper_text text - - def email(label: "Label", placeholder: "", error_message: "", helper_text: "") - render Input::EmailComponent.new(label: label, name: "name", placeholder: placeholder, error_message: error_message, helper_text: helper_text) - end - - - def file - render Input::FileInputComponent.new(name: "file") - end - - - # This is a url input field: - # - To use it without a label: don't give a value to the param label or leave it empty. - # - To put it in error state: define the param error_message with the error message you want to be displayed. - # - To give it a helper text (a text displayed under the input field): define the param helper_text with the helper text you want to be displayed. - # @param label text - # @param error_message text - # @param helper_text text - - def password(label: "Label", placeholder: "", error_message: "", helper_text: "") - render Input::PasswordComponent.new(label: label, name: "name", placeholder: placeholder, error_message: error_message, helper_text: helper_text) - end - - - # This is a url input field: - # - To use it without a label: don't give a value to the param label or leave it empty. - # - To put it in error state: define the param error_message with the error message you want to be displayed. - # - To give it a helper text (a text displayed under the input field): define the param helper_text with the helper text you want to be displayed. - # @param label text - # @param error_message text - # @param helper_text text - - def url(label: "Label", placeholder: "", error_message: "", helper_text: "") - render Input::UrlComponent.new(label: label, name: "name", placeholder: placeholder, error_message: error_message, helper_text: helper_text) - end - - # This is a text input field: - # - To use it without a label: don't give a value to the param label or leave it empty. - # - To give it a hint (placeholder): define the param hint with the hind you want to be displayed. - # - To put it in error state: define the param error_message with the error message you want to be displayed. - # - To give it a helper text (a text displayed under the input field): define the param helper_text with the helper text you want to be displayed. - # @param label text - # @param placeholder text - # @param error_message text - # @param helper_text text - - def text(label: "Label", placeholder: "", error_message: "", helper_text: "") - render Input::TextInputComponent.new(label: label, name: "name", placeholder: placeholder, error_message: error_message, helper_text: helper_text) - end - - # This is a textarea field: - # - To use it without a label: don't give a value to the param label or leave it empty. - # - To give it a hint (placeholder): define the param hint with the hind you want to be displayed. - # - To put it in error state: define the param error_message with the error message you want to be displayed. - # - To give it a helper text (a text displayed under the input field): define the param helper_text with the helper text you want to be displayed. - - # @param label text - # @param placeholder text - # @param error_message text - # @param helper_text text - # @param rows number - - def text_area(label: "Label", placeholder: "", error_message: "", helper_text: "", rows: 5) - render Input::TextAreaComponent.new(label: label, name: "name",value: '', placeholder: placeholder, error_message: error_message, helper_text: helper_text, rows: rows) - end - - def language_input - render Input::LanguageSelectorComponent.new(languages: {fr: 'French', en: 'English'}) +module Input + class InputFieldComponentPreview < ViewComponent::Preview + # This is a date input field: + # - To use it without a label: don't give a value to the param label or leave it empty. + # - To put it in error state: define the param error_message with the error message you want to be displayed. + # - To give it a helper text (a text displayed under the input field): define the param helper_text with the helper text you want to be displayed. + # @param label text + # @param error_message text + # @param helper_text text + + def date(label: 'Label', placeholder: '', error_message: '', helper_text: '') + render Input::DateComponent.new(label: label, name: 'name', placeholder: placeholder, error_message: error_message, + helper_text: helper_text) + end + + # This is a url input field: + # - To use it without a label: don't give a value to the param label or leave it empty. + # - To put it in error state: define the param error_message with the error message you want to be displayed. + # - To give it a helper text (a text displayed under the input field): define the param helper_text with the helper text you want to be displayed. + # @param label text + # @param error_message text + # @param helper_text text + + def email(label: 'Label', placeholder: '', error_message: '', helper_text: '') + render Input::EmailComponent.new(label: label, name: 'name', placeholder: placeholder, + error_message: error_message, helper_text: helper_text) + end + + def file + render Input::FileInputComponent.new(name: 'file') + end + + # This is a url input field: + # - To use it without a label: don't give a value to the param label or leave it empty. + # - To put it in error state: define the param error_message with the error message you want to be displayed. + # - To give it a helper text (a text displayed under the input field): define the param helper_text with the helper text you want to be displayed. + # @param label text + # @param error_message text + # @param helper_text text + + def password(label: 'Label', placeholder: '', error_message: '', helper_text: '') + render Input::PasswordComponent.new(label: label, name: 'name', placeholder: placeholder, + error_message: error_message, helper_text: helper_text) + end + + # This is a url input field: + # - To use it without a label: don't give a value to the param label or leave it empty. + # - To put it in error state: define the param error_message with the error message you want to be displayed. + # - To give it a helper text (a text displayed under the input field): define the param helper_text with the helper text you want to be displayed. + # @param label text + # @param error_message text + # @param helper_text text + + def url(label: 'Label', placeholder: '', error_message: '', helper_text: '') + render Input::UrlComponent.new(label: label, name: 'name', placeholder: placeholder, error_message: error_message, + helper_text: helper_text) + end + + # This is a text input field: + # - To use it without a label: don't give a value to the param label or leave it empty. + # - To give it a hint (placeholder): define the param hint with the hind you want to be displayed. + # - To put it in error state: define the param error_message with the error message you want to be displayed. + # - To give it a helper text (a text displayed under the input field): define the param helper_text with the helper text you want to be displayed. + # @param label text + # @param placeholder text + # @param error_message text + # @param helper_text text + + def text(label: 'Label', placeholder: '', error_message: '', helper_text: '') + render Input::TextInputComponent.new(label: label, name: 'name', placeholder: placeholder, + error_message: error_message, helper_text: helper_text) + end + + # This is a textarea field: + # - To use it without a label: don't give a value to the param label or leave it empty. + # - To give it a hint (placeholder): define the param hint with the hind you want to be displayed. + # - To put it in error state: define the param error_message with the error message you want to be displayed. + # - To give it a helper text (a text displayed under the input field): define the param helper_text with the helper text you want to be displayed. + + # @param label text + # @param placeholder text + # @param error_message text + # @param helper_text text + # @param rows number + + def text_area(label: 'Label', placeholder: '', error_message: '', helper_text: '', rows: 5) + render Input::TextAreaComponent.new(label: label, name: 'name', value: '', placeholder: placeholder, + error_message: error_message, helper_text: helper_text, rows: rows) + end + + def language_input + render Input::LanguageSelectorComponent.new(languages: { fr: 'French', en: 'English' }) + end end end diff --git a/test/components/previews/input/nested_form_input_component_preview.rb b/test/components/previews/input/nested_form_input_component_preview.rb index ec9329466c..6e367650af 100644 --- a/test/components/previews/input/nested_form_input_component_preview.rb +++ b/test/components/previews/input/nested_form_input_component_preview.rb @@ -1,18 +1,21 @@ -class Input::NestedFormInputComponentPreview < ViewComponent::Preview +# frozen_string_literal: true - include ActionView::Helpers::TagHelper - include ActionView::Helpers::FormTagHelper +module Input + class NestedFormInputComponentPreview < ViewComponent::Preview + include ActionView::Helpers::TagHelper + include ActionView::Helpers::FormTagHelper - # @param object_name text - def default(object_name: 'contact') - render NestedFormInputsComponent.new(object_name: object_name) do |c| - c.header do - content_tag(:div, 'Contact name', class: 'w-50 mx-1') + content_tag(:div, 'Contact email', class: 'w-50 mx-1') - end + # @param object_name text + def default(object_name: 'contact') + render NestedFormInputsComponent.new(object_name: object_name) do |c| + c.header do + content_tag(:div, 'Contact name', class: 'w-50 mx-1') + content_tag(:div, 'Contact email', class: 'w-50 mx-1') + end - c.template do - raw "
    ".html_safe + c.template do + raw "
    ".html_safe + end end end end -end \ No newline at end of file +end diff --git a/test/components/previews/input/select_component_preview.rb b/test/components/previews/input/select_component_preview.rb index 851712b2df..564c567091 100644 --- a/test/components/previews/input/select_component_preview.rb +++ b/test/components/previews/input/select_component_preview.rb @@ -1,27 +1,34 @@ # frozen_string_literal: true -class Input::SelectComponentPreview < ViewComponent::Preview - layout 'component_preview_not_centred' +module Input + class SelectComponentPreview < ViewComponent::Preview + layout 'component_preview_not_centred' - def default(id: "", name: "", values: ["choices 1", "choices 2", "choices 3"], selected: "choices 2", multiple: false, open_to_add_values: false) - render Input::SelectComponent.new(id: id, name: name, value: values, selected: selected, multiple: multiple, open_to_add_values: open_to_add_values) - end + def default(id: '', name: '', values: ['choices 1', 'choices 2', 'choices 3'], selected: 'choices 2', + multiple: false, open_to_add_values: false) + render Input::SelectComponent.new(id: id, name: name, value: values, selected: selected, multiple: multiple, + open_to_add_values: open_to_add_values) + end - def multiple(id: "", name: "", values: ["choices 1", "choices 2", "choices 3"], selected: "choices 2", multiple: true, open_to_add_values: false) - render Input::SelectComponent.new(id: id, name: name, value: values, selected: selected, multiple: multiple, open_to_add_values: open_to_add_values) - end + def multiple(id: '', name: '', values: ['choices 1', 'choices 2', 'choices 3'], selected: 'choices 2', + multiple: true, open_to_add_values: false) + render Input::SelectComponent.new(id: id, name: name, value: values, selected: selected, multiple: multiple, + open_to_add_values: open_to_add_values) + end - def open_to_add(id: "", name: "", values: ["choices 1", "choices 2", "choices 3"], selected: "choices 2", multiple: true, open_to_add_values: true) - render Input::SelectComponent.new(id: id, name: name, value: values, selected: selected, multiple: multiple, open_to_add_values: open_to_add_values) - end + def open_to_add(id: '', name: '', values: ['choices 1', 'choices 2', 'choices 3'], selected: 'choices 2', + multiple: true, open_to_add_values: true) + render Input::SelectComponent.new(id: id, name: name, value: values, selected: selected, multiple: multiple, + open_to_add_values: open_to_add_values) + end - def with_icon - values = [ - ['', ''], - ["FR", 'fr'], - ["EN", 'en'] - ] - render SelectInputComponent.new(id: 'id', name: 'name', values: values, placeholder: 'Choose a language') + def with_icon + values = [ + ['', ''], + ["FR", 'fr'], + ["EN", 'en'] + ] + render SelectInputComponent.new(id: 'id', name: 'name', values: values, placeholder: 'Choose a language') + end end - end diff --git a/test/components/previews/input/switch_input_component_preview.rb b/test/components/previews/input/switch_input_component_preview.rb index fd40bd6aeb..014949fbec 100644 --- a/test/components/previews/input/switch_input_component_preview.rb +++ b/test/components/previews/input/switch_input_component_preview.rb @@ -1,9 +1,10 @@ # frozen_string_literal: true -class Input::SwitchInputComponentPreview < ViewComponent::Preview - - # @param label text - def default(label: 'Label') - render SwitchInputComponent.new(id: 'id', name: 'selected_metadata[]', value: '', label: label) +module Input + class SwitchInputComponentPreview < ViewComponent::Preview + # @param label text + def default(label: 'Label') + render SwitchInputComponent.new(id: 'id', name: 'selected_metadata[]', value: '', label: label) + end end end diff --git a/test/components/previews/layout/card_component_preview.rb b/test/components/previews/layout/card_component_preview.rb index 23f07a2d87..be081d97f1 100644 --- a/test/components/previews/layout/card_component_preview.rb +++ b/test/components/previews/layout/card_component_preview.rb @@ -1,10 +1,12 @@ # frozen_string_literal: true -class Layout::CardComponentPreview < ViewComponent::Preview - # @param text textarea - def default(text: 'text here') - render Layout::CardComponent.new do - text.html_safe +module Layout + class CardComponentPreview < ViewComponent::Preview + # @param text textarea + def default(text: 'text here') + render Layout::CardComponent.new do + text.html_safe + end end end end diff --git a/test/components/previews/layout/card_message_component_preview.rb b/test/components/previews/layout/card_message_component_preview.rb index 4b28bf40ff..a27128cd97 100644 --- a/test/components/previews/layout/card_message_component_preview.rb +++ b/test/components/previews/layout/card_message_component_preview.rb @@ -1,30 +1,35 @@ -class Layout::CardMessageComponentPreview < ViewComponent::Preview +# frozen_string_literal: true +module Layout + class CardMessageComponentPreview < ViewComponent::Preview # @param message text # @param button_text text # @param button_link text - def default(message: "Here we can type a success or failure message to the user", button_text: "Do action", button_link: "/" ) - render(CardMessageComponent.new(message: message, button_text: button_text, type: "success", button_link: button_link)) + def default(message: 'Here we can type a success or failure message to the user', button_text: 'Do action', + button_link: '/') + render(CardMessageComponent.new(message: message, button_text: button_text, type: 'success', + button_link: button_link)) end - - + # @param message text # @param button_text text # @param button_link text - def warning(message: "Here we can type a success or failure message to the user", button_text: "Do action", button_link: "/" ) - render(CardMessageComponent.new(message: message, button_text: button_text, type: "warning", button_link: button_link)) + def warning(message: 'Here we can type a success or failure message to the user', button_text: 'Do action', + button_link: '/') + render(CardMessageComponent.new(message: message, button_text: button_text, type: 'warning', + button_link: button_link)) end - # @param message text # @param button_text text # @param button_link text - def failure(message: "Here we can type a success or failure message to the user", button_text: "Do action", button_link: "/" ) - render(CardMessageComponent.new(message: message, button_text: button_text, type: "failure", button_link: button_link)) + def failure(message: 'Here we can type a success or failure message to the user', button_text: 'Do action', + button_link: '/') + render(CardMessageComponent.new(message: message, button_text: button_text, type: 'failure', + button_link: button_link)) end - - -end \ No newline at end of file + end +end diff --git a/test/components/previews/layout/dropdown_container_component_preview.rb b/test/components/previews/layout/dropdown_container_component_preview.rb index 7d66eb5dfc..1763802e35 100644 --- a/test/components/previews/layout/dropdown_container_component_preview.rb +++ b/test/components/previews/layout/dropdown_container_component_preview.rb @@ -1,15 +1,16 @@ # frozen_string_literal: true -class Layout::DropdownContainerComponentPreview < ViewComponent::Preview - layout 'component_preview_not_centred' +module Layout + class DropdownContainerComponentPreview < ViewComponent::Preview + layout 'component_preview_not_centred' - # @param title text - # @param content textarea + # @param title text + # @param content textarea - def default(title: 'title', content: 'content') - render DropdownContainerComponent.new(id: 'id' , title: title) do - content.html_safe + def default(title: 'title', content: 'content') + render DropdownContainerComponent.new(id: 'id', title: title) do + content.html_safe + end end end - end diff --git a/test/components/previews/layout/list_component_preview.rb b/test/components/previews/layout/list_component_preview.rb index ea57e58368..aa602d8067 100644 --- a/test/components/previews/layout/list_component_preview.rb +++ b/test/components/previews/layout/list_component_preview.rb @@ -1,18 +1,20 @@ # frozen_string_literal: true -class Layout::ListComponentPreview < ViewComponent::Preview - def vertical - render Layout::ListComponent.new do |l| - 4.times.each do |i| - l.row {content_tag(:div , "element #{i}", class: 'p-1 border')} +module Layout + class ListComponentPreview < ViewComponent::Preview + def vertical + render Layout::ListComponent.new do |l| + 4.times.each do |i| + l.row { content_tag(:div, "element #{i}", class: 'p-1 border') } + end end end - end - def horizontal - render Layout::HorizontalListComponent.new do |l| - 4.times.each do |i| - l.element {content_tag(:div , "element #{i}", class: 'p-1 border')} + def horizontal + render Layout::HorizontalListComponent.new do |l| + 4.times.each do |i| + l.element { content_tag(:div, "element #{i}", class: 'p-1 border') } + end end end end diff --git a/test/components/previews/layout/progress_pages_component_preview.rb b/test/components/previews/layout/progress_pages_component_preview.rb index afb6596de1..ae1b9df281 100644 --- a/test/components/previews/layout/progress_pages_component_preview.rb +++ b/test/components/previews/layout/progress_pages_component_preview.rb @@ -1,11 +1,16 @@ # frozen_string_literal: true -class Layout::ProgressPagesComponentPreview < ViewComponent::Preview - - # @param pages_count number - def default(pages_count: 5) - render Layout::ProgressPagesComponent.new(pages_title: (pages_count || 0).times.map { |x| "page #{x}" }) do |c| - 5.times.each { |i| c.page { content_tag(:div, "page #{i}", class: "p-5 mx-5 text-center", style: 'width: 500px') } } +module Layout + class ProgressPagesComponentPreview < ViewComponent::Preview + # @param pages_count number + def default(pages_count: 5) + render Layout::ProgressPagesComponent.new(pages_title: (pages_count || 0).times.map { |x| "page #{x}" }) do |c| + 5.times.each do |i| + c.page do + content_tag(:div, "page #{i}", class: 'p-5 mx-5 text-center', style: 'width: 500px') + end + end + end end end end diff --git a/test/components/previews/layout/summary_section_component_preview.rb b/test/components/previews/layout/summary_section_component_preview.rb index 626770b14a..55bf257c61 100644 --- a/test/components/previews/layout/summary_section_component_preview.rb +++ b/test/components/previews/layout/summary_section_component_preview.rb @@ -1,14 +1,17 @@ -class Layout::SummarySectionComponentPreview < ViewComponent::Preview - layout 'component_preview_not_centred' - # @param title text - # @param content textarea - # @param link url - # @param link_title text - # @param show_card toggle - def default(title: 'title' , link: nil, link_title: nil, show_card: true, content: 'here is the content') - render SummarySectionComponent.new(title: title , link: link, link_title: link_title, show_card: show_card) do - content.html_safe +# frozen_string_literal: true + +module Layout + class SummarySectionComponentPreview < ViewComponent::Preview + layout 'component_preview_not_centred' + # @param title text + # @param content textarea + # @param link url + # @param link_title text + # @param show_card toggle + def default(title: 'title', link: nil, link_title: nil, show_card: true, content: 'here is the content') + render SummarySectionComponent.new(title: title, link: link, link_title: link_title, show_card: show_card) do + content.html_safe + end end end - -end \ No newline at end of file +end diff --git a/test/components/previews/layout/table_component_preview.rb b/test/components/previews/layout/table_component_preview.rb index b38a7cd0fc..4c86b33f1c 100644 --- a/test/components/previews/layout/table_component_preview.rb +++ b/test/components/previews/layout/table_component_preview.rb @@ -1,45 +1,45 @@ # frozen_string_literal: true -class Layout::TableComponentPreview < ViewComponent::Preview +module Layout + class TableComponentPreview < ViewComponent::Preview + include ActionView::Helpers::UrlHelper - include ActionView::Helpers::UrlHelper - - def default - render TableComponent.new do |t| - table_content(t) + def default + render TableComponent.new do |t| + table_content(t) + end end - end - def stripped - render TableComponent.new(stripped: true) do |t| - table_content(t) + def stripped + render TableComponent.new(stripped: true) do |t| + table_content(t) + end end - end - private + private - def table_content(t) - headers = 5.times.map { |i| "header #{i}" } - rows = 6.times.map { |row| 5.times.map { |i| "line #{row} :#{i} " } } + def table_content(t) + headers = 5.times.map { |i| "header #{i}" } + rows = 6.times.map { |row| 5.times.map { |i| "line #{row} :#{i} " } } - t.header do |h| - headers.each do |header| - h.th { header } + t.header do |h| + headers.each do |header| + h.th { header } + end + h.th { 'Action' } end - h.th { 'Action' } - end - rows.each do |row| - t.row do |r| - row.each do |col| - r.td { col } - end + rows.each do |row| + t.row do |r| + row.each do |col| + r.td { col } + end - r.td do - link_to('Edit', '', class: 'mr-3') + link_to('Delete', '') + r.td do + link_to('Edit', '', class: 'mr-3') + link_to('Delete', '') + end end end end - end end diff --git a/test/components/previews/layout/tabs_container_component_preview.rb b/test/components/previews/layout/tabs_container_component_preview.rb index b82e09f32a..2f1500d9ca 100644 --- a/test/components/previews/layout/tabs_container_component_preview.rb +++ b/test/components/previews/layout/tabs_container_component_preview.rb @@ -1,78 +1,76 @@ -class Layout::TabsContainerComponentPreview < ViewComponent::Preview - - - def default - render TabsContainerComponent.new do |c| - sections = ['section 1', 'section 2', 'section 3', 'section 4'] - - sections.each do |section_title| - c.item(title: section_title, - path: "#{section_title}path", - selected: section_title.eql?('section 2'), - page_name: "#{section_title}path") - - c.item_content do - section_title +# frozen_string_literal: true + +module Layout + class TabsContainerComponentPreview < ViewComponent::Preview + def default + render TabsContainerComponent.new do |c| + sections = ['section 1', 'section 2', 'section 3', 'section 4'] + + sections.each do |section_title| + c.item(title: section_title, + path: "#{section_title}path", + selected: section_title.eql?('section 2'), + page_name: "#{section_title}path") + + c.item_content do + section_title + end end end - end - end - def pill - render TabsContainerComponent.new(type: 'pill') do |c| - sections = ['section 1', 'section 2', 'section 3', 'section 4'] + def pill + render TabsContainerComponent.new(type: 'pill') do |c| + sections = ['section 1', 'section 2', 'section 3', 'section 4'] - sections.each do |section_title| - c.item(title: section_title, - path: "#{section_title}path", - selected: section_title.eql?('section 2'), - page_name: "#{section_title}path") + sections.each do |section_title| + c.item(title: section_title, + path: "#{section_title}path", + selected: section_title.eql?('section 2'), + page_name: "#{section_title}path") - c.item_content do - section_title + c.item_content do + section_title + end end end - end - end - def outline - render TabsContainerComponent.new(type: 'outline') do |c| - sections = ['section 1', 'section 2', 'section 3', 'section 4'] + def outline + render TabsContainerComponent.new(type: 'outline') do |c| + sections = ['section 1', 'section 2', 'section 3', 'section 4'] - sections.each do |section_title| - c.item(title: section_title, - path: "#{section_title}path", - selected: section_title.eql?('section 2'), - page_name: "#{section_title}path") + sections.each do |section_title| + c.item(title: section_title, + path: "#{section_title}path", + selected: section_title.eql?('section 2'), + page_name: "#{section_title}path") - c.item_content do - section_title + c.item_content do + section_title + end end end - end - end - def with_action_links - render TabsContainerComponent.new do |c| - sections = ['section 1', 'section 2', 'section 3', 'section 4'] + def with_action_links + render TabsContainerComponent.new do |c| + sections = ['section 1', 'section 2', 'section 3', 'section 4'] - sections.each do |section_title| - c.item(title: section_title, - path: "#{section_title}path", - selected: section_title.eql?('section 2'), - page_name: "#{section_title}path") + sections.each do |section_title| + c.item(title: section_title, + path: "#{section_title}path", + selected: section_title.eql?('section 2'), + page_name: "#{section_title}path") - c.item_content do - section_title + c.item_content do + section_title + end + end + c.pinned_right do + RoundedButtonComponent.new(icon: 'check.svg').render_in(c) + ''.html_safe + RoundedButtonComponent.new.render_in(c) end - end - c.pinned_right do - RoundedButtonComponent.new(icon: 'check.svg').render_in(c) + ''.html_safe + RoundedButtonComponent.new.render_in(c) end end end - -end \ No newline at end of file +end diff --git a/test/components/previews/layout/turbo_modal_component_preview.rb b/test/components/previews/layout/turbo_modal_component_preview.rb index bf976326d8..0924c082f9 100644 --- a/test/components/previews/layout/turbo_modal_component_preview.rb +++ b/test/components/previews/layout/turbo_modal_component_preview.rb @@ -1,16 +1,18 @@ # frozen_string_literal: true -class Layout::TurboModalComponentPreview < ViewComponent::Preview - layout 'component_preview_not_centred' +module Layout + class TurboModalComponentPreview < ViewComponent::Preview + layout 'component_preview_not_centred' - include ActionView::Helpers::TagHelper - include ActionView::Context + include ActionView::Helpers::TagHelper + include ActionView::Context - # @param title text - # @param message text - def default(message: 'hello you !', title: 'title') - render TurboModalComponent.new(title: title, show: true) do - content_tag(:div, message, class: 'p-5') + # @param title text + # @param message text + def default(message: 'hello you !', title: 'title') + render TurboModalComponent.new(title: title, show: true) do + content_tag(:div, message, class: 'p-5') + end end end end diff --git a/test/components/previews/loader_component_preview.rb b/test/components/previews/loader_component_preview.rb index 78e55ca336..b847cdf360 100644 --- a/test/components/previews/loader_component_preview.rb +++ b/test/components/previews/loader_component_preview.rb @@ -8,5 +8,4 @@ def default def small render LoaderComponent.new(small: true) end - end diff --git a/test/components/previews/notification_component_preview.rb b/test/components/previews/notification_component_preview.rb index 407c0d947c..07e91c2cc6 100644 --- a/test/components/previews/notification_component_preview.rb +++ b/test/components/previews/notification_component_preview.rb @@ -1,12 +1,13 @@ -class NotificationComponentPreview < ViewComponent::Preview +# frozen_string_literal: true +class NotificationComponentPreview < ViewComponent::Preview # @param title text # @param message text # @param type select [success, alert, error] # @param auto_remove toggle - def default(title: "Notification message", message: "Here we can type a success or failure message to the user", type: 'success', auto_remove: false) + def default(title: 'Notification message', message: 'Here we can type a success or failure message to the user', + type: 'success', auto_remove: false) render NotificationComponent.new(title: title, comment: message, type: type, auto_remove: auto_remove) end - -end \ No newline at end of file +end diff --git a/test/controllers/application_controller_test.rb b/test/controllers/application_controller_test.rb new file mode 100644 index 0000000000..a7fa870d91 --- /dev/null +++ b/test/controllers/application_controller_test.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +require 'test_helper' + +class ApplicationControllerTest < ActionDispatch::IntegrationTest + test 'should show home page' do + get '' + assert_response :success + end + + test 'should show projects page' do + get '/projects' + assert_response :success + end +end diff --git a/test/controllers/landscape_controller_test.rb b/test/controllers/landscape_controller_test.rb index 31a32b842a..619c82dc9f 100644 --- a/test/controllers/landscape_controller_test.rb +++ b/test/controllers/landscape_controller_test.rb @@ -1,9 +1,11 @@ +# frozen_string_literal: true + require 'test_helper' class LandscapeControllerTest < ActionController::TestCase - test "should get index" do + test 'should get index' do + skip('take too much time') get :index assert_response :success end - end diff --git a/test/controllers/ontologies_controller_test.rb b/test/controllers/ontologies_controller_test.rb new file mode 100644 index 0000000000..ed96305cae --- /dev/null +++ b/test/controllers/ontologies_controller_test.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +require 'test_helper' + +class OntologiesControllerTest < ActionDispatch::IntegrationTest + ONTOLOGIES = LinkedData::Client::Models::Ontology.all(include: 'acronym') + PAGES = %w[summary classes properties notes mappings schemes collections widgets].freeze + + test 'should return all the ontologies' do + get ontologies_path + assert_response :success + end + + ONTOLOGIES.sample(5).flat_map { |ont| PAGES.map { |page| [ont, page] } }.each do |ont, page| + test "should get page #{page} of #{ont.acronym} ontology" do + path = "#{ontologies_path}/#{ont.acronym}?p=#{page}" + get path + assert_response :success, "GET #{path} returned #{response.status}" + end + end +end diff --git a/test/models/virtual_appliance_user_test.rb b/test/models/virtual_appliance_user_test.rb index 0ee6a3cea6..62e4a71227 100644 --- a/test/models/virtual_appliance_user_test.rb +++ b/test/models/virtual_appliance_user_test.rb @@ -1,8 +1,10 @@ +# frozen_string_literal: true + require 'test_helper' class VirtualApplianceUserTest < ActiveSupport::TestCase # Replace this with your real tests. - test "the truth" do + test 'the truth' do assert true end end diff --git a/test/test_helper.rb b/test/test_helper.rb index a21ff22160..9e1c9120e2 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -1,13 +1,17 @@ +# frozen_string_literal: true + ENV['RAILS_ENV'] ||= 'test' require_relative '../config/environment' require 'rails/test_help' -class ActiveSupport::TestCase - # Run tests in parallel with specified workers - parallelize(workers: 1) +module ActiveSupport + class TestCase + # Run tests in parallel with specified workers + parallelize(workers: 1) - # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order. - fixtures :all + # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order. + fixtures :all - # Add more helper methods to be used by all tests here... -end \ No newline at end of file + # Add more helper methods to be used by all tests here... + end +end diff --git a/yarn.lock b/yarn.lock index 6ef2719673..7d7a9bb108 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,11 @@ # yarn lockfile v1 +"@aashutoshrathi/word-wrap@^1.2.3": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" + integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== + "@babel/runtime@^7.21.0": version "7.22.10" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.10.tgz#ae3e9631fd947cb7e3610d3e9d8fef5f76696682" @@ -14,6 +19,38 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz#de2a4be678bd4d0d1ffbb86e6de779cde5999028" integrity sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw== +"@eslint-community/eslint-utils@^4.2.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.6.1": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" + integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== + +"@eslint/eslintrc@^2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.2.tgz#c6936b4b328c64496692f76944e755738be62396" + integrity sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.6.0" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@8.52.0": + version "8.52.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.52.0.tgz#78fe5f117840f69dc4a353adf9b9cd926353378c" + integrity sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA== + "@hotwired/stimulus@^3.0.0", "@hotwired/stimulus@^3.0.1": version "3.2.1" resolved "https://registry.yarnpkg.com/@hotwired/stimulus/-/stimulus-3.2.1.tgz#e3de23623b0c52c247aba4cd5d530d257008676b" @@ -32,6 +69,46 @@ resolved "https://registry.yarnpkg.com/@hotwired/turbo/-/turbo-7.3.0.tgz#2226000fff1aabda9fd9587474565c9929dbf15d" integrity sha512-Dcu+NaSvHLT7EjrDrkEmH4qET2ZJZ5IcCWmNXxNQTBwlnE5tBZfN6WxZ842n5cHV52DH/AKNirbPBtcEXDLW4g== +"@humanwhocodes/config-array@^0.11.13": + version "0.11.13" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.13.tgz#075dc9684f40a531d9b26b0822153c1e832ee297" + integrity sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ== + dependencies: + "@humanwhocodes/object-schema" "^2.0.1" + debug "^4.1.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz#e5211452df060fa8522b55c7b3c0c4d1981cb044" + integrity sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw== + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + "@orchidjs/sifter@^1.0.3": version "1.0.3" resolved "https://registry.yarnpkg.com/@orchidjs/sifter/-/sifter-1.0.3.tgz#43f42519472282eb632d0a1589184f044d64129b" @@ -54,6 +131,207 @@ resolved "https://registry.yarnpkg.com/@rails/actioncable/-/actioncable-7.0.5.tgz#bbc11203e0d3d5084002abfcf01d621fdf5f3a9d" integrity sha512-SOBA2heB9lTw0VYIx8M/ed7inSf4I9sR8OIlJprhgkfQ3WJtrxPJ6DDATR1Z3RYaIR7HlT2Olj08v1lfGIGuHA== +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== + +"@ungap/structured-clone@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" + integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn@^8.9.0: + version "8.11.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.2.tgz#ca0d78b51895be5390a5903c5b3bdcdaf78ae40b" + integrity sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w== + +ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-buffer-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" + integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== + dependencies: + call-bind "^1.0.2" + is-array-buffer "^3.0.1" + +array-includes@^3.1.6, array-includes@^3.1.7: + version "3.1.7" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.7.tgz#8cd2e01b26f7a3086cbc87271593fe921c62abda" + integrity sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + is-string "^1.0.7" + +array.prototype.findlastindex@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz#b37598438f97b579166940814e2c0493a4f50207" + integrity sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + get-intrinsic "^1.2.1" + +array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" + integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.flatmap@^1.3.1, array.prototype.flatmap@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" + integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.tosorted@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz#620eff7442503d66c799d95503f82b475745cefd" + integrity sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + get-intrinsic "^1.2.1" + +arraybuffer.prototype.slice@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz#98bd561953e3e74bb34938e77647179dfe6e9f12" + integrity sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw== + dependencies: + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + is-array-buffer "^3.0.2" + is-shared-array-buffer "^1.0.2" + +asynciterator.prototype@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz#8c5df0514936cdd133604dfcc9d3fb93f09b2b62" + integrity sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg== + dependencies: + has-symbols "^1.0.3" + +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +builtins@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/builtins/-/builtins-5.0.1.tgz#87f6db9ab0458be728564fa81d876d8d74552fa9" + integrity sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ== + dependencies: + semver "^7.0.0" + +call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.4, call-bind@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.5.tgz#6fa2b7845ce0ea49bf4d8b9ef64727a2c2e2e513" + integrity sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ== + dependencies: + function-bind "^1.1.2" + get-intrinsic "^1.2.1" + set-function-length "^1.1.1" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +cross-spawn@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + date-fns@^2.29.3: version "2.30.0" resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.30.0.tgz#f367e644839ff57894ec6ac480de40cae4b0f4d0" @@ -66,6 +344,154 @@ debounce@^1.2.1: resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5" integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== +debug@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^4.1.1, debug@^4.3.2: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +define-data-property@^1.0.1, define-data-property@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3" + integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ== + dependencies: + get-intrinsic "^1.2.1" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + +define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0, define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.22.1: + version "1.22.3" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.3.tgz#48e79f5573198de6dee3589195727f4f74bc4f32" + integrity sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA== + dependencies: + array-buffer-byte-length "^1.0.0" + arraybuffer.prototype.slice "^1.0.2" + available-typed-arrays "^1.0.5" + call-bind "^1.0.5" + es-set-tostringtag "^2.0.1" + es-to-primitive "^1.2.1" + function.prototype.name "^1.1.6" + get-intrinsic "^1.2.2" + get-symbol-description "^1.0.0" + globalthis "^1.0.3" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + internal-slot "^1.0.5" + is-array-buffer "^3.0.2" + is-callable "^1.2.7" + is-negative-zero "^2.0.2" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + is-string "^1.0.7" + is-typed-array "^1.1.12" + is-weakref "^1.0.2" + object-inspect "^1.13.1" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.5.1" + safe-array-concat "^1.0.1" + safe-regex-test "^1.0.0" + string.prototype.trim "^1.2.8" + string.prototype.trimend "^1.0.7" + string.prototype.trimstart "^1.0.7" + typed-array-buffer "^1.0.0" + typed-array-byte-length "^1.0.0" + typed-array-byte-offset "^1.0.0" + typed-array-length "^1.0.4" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.13" + +es-iterator-helpers@^1.0.12: + version "1.0.15" + resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz#bd81d275ac766431d19305923707c3efd9f1ae40" + integrity sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g== + dependencies: + asynciterator.prototype "^1.0.0" + call-bind "^1.0.2" + define-properties "^1.2.1" + es-abstract "^1.22.1" + es-set-tostringtag "^2.0.1" + function-bind "^1.1.1" + get-intrinsic "^1.2.1" + globalthis "^1.0.3" + has-property-descriptors "^1.0.0" + has-proto "^1.0.1" + has-symbols "^1.0.3" + internal-slot "^1.0.5" + iterator.prototype "^1.1.2" + safe-array-concat "^1.0.1" + +es-set-tostringtag@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz#11f7cc9f63376930a5f20be4915834f4bc74f9c9" + integrity sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q== + dependencies: + get-intrinsic "^1.2.2" + has-tostringtag "^1.0.0" + hasown "^2.0.0" + +es-shim-unscopables@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" + integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== + dependencies: + hasown "^2.0.0" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + esbuild-android-64@0.14.54: version "0.14.54" resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz#505f41832884313bbaffb27704b8bcaa2d8616be" @@ -193,21 +619,1196 @@ esbuild@^0.14.41: esbuild-windows-64 "0.14.54" esbuild-windows-arm64 "0.14.54" +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-config-standard-jsx@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/eslint-config-standard-jsx/-/eslint-config-standard-jsx-11.0.0.tgz#70852d395731a96704a592be5b0bfaccfeded239" + integrity sha512-+1EV/R0JxEK1L0NGolAr8Iktm3Rgotx3BKwgaX+eAuSX8D952LULKtjgZD3F+e6SvibONnhLwoTi9DPxN5LvvQ== + +eslint-config-standard@17.1.0, eslint-config-standard@^17.1.0: + version "17.1.0" + resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz#40ffb8595d47a6b242e07cbfd49dc211ed128975" + integrity sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q== + +eslint-import-resolver-node@^0.3.9: + version "0.3.9" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" + integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== + dependencies: + debug "^3.2.7" + is-core-module "^2.13.0" + resolve "^1.22.4" + +eslint-module-utils@^2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz#e439fee65fc33f6bba630ff621efc38ec0375c49" + integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw== + dependencies: + debug "^3.2.7" + +eslint-plugin-es@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz#75a7cdfdccddc0589934aeeb384175f221c57893" + integrity sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ== + dependencies: + eslint-utils "^2.0.0" + regexpp "^3.0.0" + +eslint-plugin-es@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz#f0822f0c18a535a97c3e714e89f88586a7641ec9" + integrity sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ== + dependencies: + eslint-utils "^2.0.0" + regexpp "^3.0.0" + +eslint-plugin-import@^2.27.5, eslint-plugin-import@^2.29.0: + version "2.29.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz#8133232e4329ee344f2f612885ac3073b0b7e155" + integrity sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg== + dependencies: + array-includes "^3.1.7" + array.prototype.findlastindex "^1.2.3" + array.prototype.flat "^1.3.2" + array.prototype.flatmap "^1.3.2" + debug "^3.2.7" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.9" + eslint-module-utils "^2.8.0" + hasown "^2.0.0" + is-core-module "^2.13.1" + is-glob "^4.0.3" + minimatch "^3.1.2" + object.fromentries "^2.0.7" + object.groupby "^1.0.1" + object.values "^1.1.7" + semver "^6.3.1" + tsconfig-paths "^3.14.2" + +eslint-plugin-n@^15.7.0: + version "15.7.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-n/-/eslint-plugin-n-15.7.0.tgz#e29221d8f5174f84d18f2eb94765f2eeea033b90" + integrity sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q== + dependencies: + builtins "^5.0.1" + eslint-plugin-es "^4.1.0" + eslint-utils "^3.0.0" + ignore "^5.1.1" + is-core-module "^2.11.0" + minimatch "^3.1.2" + resolve "^1.22.1" + semver "^7.3.8" + +eslint-plugin-node@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz#c95544416ee4ada26740a30474eefc5402dc671d" + integrity sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g== + dependencies: + eslint-plugin-es "^3.0.0" + eslint-utils "^2.0.0" + ignore "^5.1.1" + minimatch "^3.0.4" + resolve "^1.10.1" + semver "^6.1.0" + +eslint-plugin-promise@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz#269a3e2772f62875661220631bd4dafcb4083816" + integrity sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig== + +eslint-plugin-react@^7.32.2: + version "7.33.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz#69ee09443ffc583927eafe86ffebb470ee737608" + integrity sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw== + dependencies: + array-includes "^3.1.6" + array.prototype.flatmap "^1.3.1" + array.prototype.tosorted "^1.1.1" + doctrine "^2.1.0" + es-iterator-helpers "^1.0.12" + estraverse "^5.3.0" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.1.2" + object.entries "^1.1.6" + object.fromentries "^2.0.6" + object.hasown "^1.1.2" + object.values "^1.1.6" + prop-types "^15.8.1" + resolve "^2.0.0-next.4" + semver "^6.3.1" + string.prototype.matchall "^4.0.8" + +eslint-plugin-standard@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-5.0.0.tgz#c43f6925d669f177db46f095ea30be95476b1ee4" + integrity sha512-eSIXPc9wBM4BrniMzJRBm2uoVuXz2EPa+NXPk2+itrVt+r5SbKFERx/IgrK/HmfjddyKVz2f+j+7gBRvu19xLg== + +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-utils@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" + integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" + integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== + dependencies: + eslint-visitor-keys "^2.0.0" + +eslint-visitor-keys@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + +eslint-visitor-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +eslint@^8.41.0, eslint@^8.52.0: + version "8.52.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.52.0.tgz#d0cd4a1fac06427a61ef9242b9353f36ea7062fc" + integrity sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.2" + "@eslint/js" "8.52.0" + "@humanwhocodes/config-array" "^0.11.13" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + "@ungap/structured-clone" "^1.2.0" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.2.2" + eslint-visitor-keys "^3.4.3" + espree "^9.6.1" + esquery "^1.4.2" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + graphemer "^1.4.0" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + +espree@^9.6.0, espree@^9.6.1: + version "9.6.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== + dependencies: + acorn "^8.9.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" + +esquery@^1.4.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fastq@^1.6.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== + dependencies: + reusify "^1.0.4" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.1.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.1.1.tgz#a02a15fdec25a8f844ff7cc658f03dd99eb4609b" + integrity sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q== + dependencies: + flatted "^3.2.9" + keyv "^4.5.3" + rimraf "^3.0.2" + flatpickr@^4.6.13: version "4.6.13" resolved "https://registry.yarnpkg.com/flatpickr/-/flatpickr-4.6.13.tgz#8a029548187fd6e0d670908471e43abe9ad18d94" integrity sha512-97PMG/aywoYpB4IvbvUJi0RQi8vearvU0oov1WW3k0WZPBMrTQVqekSX5CjSG/M4Q3i6A/0FKXC7RyAoAUUSPw== +flatted@^3.2.9: + version "3.2.9" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf" + integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +function-bind@^1.1.1, function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +function.prototype.name@^1.1.5, function.prototype.name@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" + integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + functions-have-names "^1.2.3" + +functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz#281b7622971123e1ef4b3c90fd7539306da93f3b" + integrity sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA== + dependencies: + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + +get-stdin@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-8.0.0.tgz#cbad6a73feb75f6eeb22ba9e01f89aa28aa97a53" + integrity sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg== + +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob@^7.1.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^13.19.0: + version "13.23.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.23.0.tgz#ef31673c926a0976e1f61dab4dca57e0c0a8af02" + integrity sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA== + dependencies: + type-fest "^0.20.2" + +globalthis@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +graceful-fs@^4.1.15: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz#52ba30b6c5ec87fd89fa574bc1c39125c6f65340" + integrity sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg== + dependencies: + get-intrinsic "^1.2.2" + +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + +has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +hasown@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" + integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA== + dependencies: + function-bind "^1.1.2" + +ignore@^5.1.1, ignore@^5.2.0: + version "5.2.4" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== + +import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +internal-slot@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.6.tgz#37e756098c4911c5e912b8edbf71ed3aa116f930" + integrity sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg== + dependencies: + get-intrinsic "^1.2.2" + hasown "^2.0.0" + side-channel "^1.0.4" + +is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" + integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + is-typed-array "^1.1.10" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-async-function@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" + integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== + dependencies: + has-tostringtag "^1.0.0" + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-core-module@^2.11.0, is-core-module@^2.13.0, is-core-module@^2.13.1: + version "2.13.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" + integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== + dependencies: + hasown "^2.0.0" + +is-date-object@^1.0.1, is-date-object@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-finalizationregistry@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz#c8749b65f17c133313e661b1289b95ad3dbd62e6" + integrity sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw== + dependencies: + call-bind "^1.0.2" + +is-generator-function@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + +is-glob@^4.0.0, is-glob@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-map@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" + integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== + +is-negative-zero@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-set@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" + integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== + +is-shared-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" + integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== + dependencies: + call-bind "^1.0.2" + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typed-array@^1.1.10, is-typed-array@^1.1.12, is-typed-array@^1.1.9: + version "1.1.12" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" + integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== + dependencies: + which-typed-array "^1.1.11" + +is-weakmap@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" + integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +is-weakset@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.2.tgz#4569d67a747a1ce5a994dfd4ef6dcea76e7c0a1d" + integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +iterator.prototype@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0" + integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w== + dependencies: + define-properties "^1.2.1" + get-intrinsic "^1.2.1" + has-symbols "^1.0.3" + reflect.getprototypeof "^1.0.4" + set-function-name "^2.0.1" + +"js-tokens@^3.0.0 || ^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-parse-better-errors@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json5@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== + dependencies: + minimist "^1.2.0" + +"jsx-ast-utils@^2.4.1 || ^3.0.0": + version "3.3.5" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" + integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== + dependencies: + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + object.assign "^4.1.4" + object.values "^1.1.6" + +keyv@^4.5.3: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +load-json-file@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-5.3.0.tgz#4d3c1e01fa1c03ea78a60ac7af932c9ce53403f3" + integrity sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw== + dependencies: + graceful-fs "^4.1.15" + parse-json "^4.0.0" + pify "^4.0.1" + strip-bom "^3.0.0" + type-fest "^0.3.0" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.0, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-inspect@^1.13.1, object-inspect@^1.9.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" + integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.4: + version "4.1.4" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" + integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +object.entries@^1.1.6: + version "1.1.7" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.7.tgz#2b47760e2a2e3a752f39dd874655c61a7f03c131" + integrity sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +object.fromentries@^2.0.6, object.fromentries@^2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.7.tgz#71e95f441e9a0ea6baf682ecaaf37fa2a8d7e616" + integrity sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +object.groupby@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.1.tgz#d41d9f3c8d6c778d9cbac86b4ee9f5af103152ee" + integrity sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + +object.hasown@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.3.tgz#6a5f2897bb4d3668b8e79364f98ccf971bda55ae" + integrity sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA== + dependencies: + define-properties "^1.2.0" + es-abstract "^1.22.1" + +object.values@^1.1.6, object.values@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.7.tgz#617ed13272e7e1071b43973aa1655d9291b8442a" + integrity sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +optionator@^0.9.3: + version "0.9.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" + integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== + dependencies: + "@aashutoshrathi/word-wrap" "^1.2.3" + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + +p-limit@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pkg-conf@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/pkg-conf/-/pkg-conf-3.1.0.tgz#d9f9c75ea1bae0e77938cde045b276dac7cc69ae" + integrity sha512-m0OTbR/5VPNPqO1ph6Fqbj7Hv6QU7gR/tQW40ZqrL1rjgCU85W6C1bJn0BItuJqnR98PWzw7Z8hHeChD1WrgdQ== + dependencies: + find-up "^3.0.0" + load-json-file "^5.2.0" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prop-types@^15.8.1: + version "15.8.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +punycode@^2.1.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +react-is@^16.13.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +reflect.getprototypeof@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz#aaccbf41aca3821b87bb71d9dcbc7ad0ba50a3f3" + integrity sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + globalthis "^1.0.3" + which-builtin-type "^1.1.3" + regenerator-runtime@^0.14.0: version "0.14.0" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== +regexp.prototype.flags@^1.5.0, regexp.prototype.flags@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz#90ce989138db209f81492edd734183ce99f9677e" + integrity sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + set-function-name "^2.0.0" + +regexpp@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve@^1.10.1, resolve@^1.22.1, resolve@^1.22.4: + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +resolve@^2.0.0-next.4: + version "2.0.0-next.5" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c" + integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +safe-array-concat@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.1.tgz#91686a63ce3adbea14d61b14c99572a8ff84754c" + integrity sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + has-symbols "^1.0.3" + isarray "^2.0.5" + +safe-regex-test@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" + integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + is-regex "^1.1.4" + +semver@^6.1.0, semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.0.0, semver@^7.3.8: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + +set-function-length@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.1.1.tgz#4bc39fafb0307224a33e106a7d35ca1218d659ed" + integrity sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ== + dependencies: + define-data-property "^1.1.1" + get-intrinsic "^1.2.1" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + +set-function-name@^2.0.0, set-function-name@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a" + integrity sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA== + dependencies: + define-data-property "^1.0.1" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + split.js@^1.6.5: version "1.6.5" resolved "https://registry.yarnpkg.com/split.js/-/split.js-1.6.5.tgz#f7f61da1044c9984cb42947df4de4fadb5a3f300" integrity sha512-mPTnGCiS/RiuTNsVhCm9De9cCAUsrNFFviRbADdKiiV+Kk8HKp/0fWu7Kr8pi3/yBmsqLFHuXGT9UUZ+CNLwFw== +standard-engine@^15.0.0: + version "15.1.0" + resolved "https://registry.yarnpkg.com/standard-engine/-/standard-engine-15.1.0.tgz#717409a002edd13cd57f6554fdd3464d9a22a774" + integrity sha512-VHysfoyxFu/ukT+9v49d4BRXIokFRZuH3z1VRxzFArZdjSCFpro6rEIU3ji7e4AoAtuSfKBkiOmsrDqKW5ZSRw== + dependencies: + get-stdin "^8.0.0" + minimist "^1.2.6" + pkg-conf "^3.1.0" + xdg-basedir "^4.0.0" + +standard@^17.1.0: + version "17.1.0" + resolved "https://registry.yarnpkg.com/standard/-/standard-17.1.0.tgz#829eeeb3139ad50714294d3531592d60ad1286af" + integrity sha512-jaDqlNSzLtWYW4lvQmU0EnxWMUGQiwHasZl5ZEIwx3S/ijZDjZOzs1y1QqKwKs5vqnFpGtizo4NOYX2s0Voq/g== + dependencies: + eslint "^8.41.0" + eslint-config-standard "17.1.0" + eslint-config-standard-jsx "^11.0.0" + eslint-plugin-import "^2.27.5" + eslint-plugin-n "^15.7.0" + eslint-plugin-promise "^6.1.1" + eslint-plugin-react "^7.32.2" + standard-engine "^15.0.0" + version-guard "^1.1.1" + stimulus-flatpickr@^3.0.0-0: version "3.0.0-0" resolved "https://registry.yarnpkg.com/stimulus-flatpickr/-/stimulus-flatpickr-3.0.0-0.tgz#af9bfa70bd1b74654312580101387c9d13ee32f2" @@ -237,6 +1838,82 @@ stimulus-timeago@^4.1.0: dependencies: date-fns "^2.29.3" +string.prototype.matchall@^4.0.8: + version "4.0.10" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz#a1553eb532221d4180c51581d6072cd65d1ee100" + integrity sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + has-symbols "^1.0.3" + internal-slot "^1.0.5" + regexp.prototype.flags "^1.5.0" + set-function-name "^2.0.0" + side-channel "^1.0.4" + +string.prototype.trim@^1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz#f9ac6f8af4bd55ddfa8895e6aea92a96395393bd" + integrity sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +string.prototype.trimend@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz#1bb3afc5008661d73e2dc015cd4853732d6c471e" + integrity sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +string.prototype.trimstart@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz#d4cdb44b83a4737ffbac2d406e405d43d0184298" + integrity sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + tippy.js@^6.3.7: version "6.3.7" resolved "https://registry.yarnpkg.com/tippy.js/-/tippy.js-6.3.7.tgz#8ccfb651d642010ed9a32ff29b0e9e19c5b8c61c" @@ -252,6 +1929,94 @@ tom-select@^2.2.2: "@orchidjs/sifter" "^1.0.3" "@orchidjs/unicode-variants" "^1.0.4" +tsconfig-paths@^3.14.2: + version "3.14.2" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz#6e32f1f79412decd261f92d633a9dc1cfa99f088" + integrity sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.2" + minimist "^1.2.6" + strip-bom "^3.0.0" + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.3.1.tgz#63d00d204e059474fe5e1b7c011112bbd1dc29e1" + integrity sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ== + +typed-array-buffer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60" + integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + is-typed-array "^1.1.10" + +typed-array-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz#d787a24a995711611fb2b87a4052799517b230d0" + integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + +typed-array-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b" + integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + +typed-array-length@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" + integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + is-typed-array "^1.1.9" + +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +version-guard@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/version-guard/-/version-guard-1.1.1.tgz#7a6e87a1babff1b43d6a7b0fd239731e278262fa" + integrity sha512-MGQLX89UxmYHgDvcXyjBI0cbmoW+t/dANDppNPrno64rYr8nH4SHSuElQuSYdXGEs0mUzdQe1BY+FhVPNsAmJQ== + vis-data@^7.1.6: version "7.1.6" resolved "https://registry.yarnpkg.com/vis-data/-/vis-data-7.1.6.tgz#81dcf4d024d23183cacb680ad605e644cdd6ee6c" @@ -266,3 +2031,80 @@ vis-util@^5.0.3: version "5.0.3" resolved "https://registry.yarnpkg.com/vis-util/-/vis-util-5.0.3.tgz#6a9d67c6ed92f2bfa67e50c20166bb5f59ac07bf" integrity sha512-Wf9STUcFrDzK4/Zr7B6epW2Kvm3ORNWF+WiwEz2dpf5RdWkLUXFSbLcuB88n1W6tCdFwVN+v3V4/Xmn9PeL39g== + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-builtin-type@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.3.tgz#b1b8443707cc58b6e9bf98d32110ff0c2cbd029b" + integrity sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw== + dependencies: + function.prototype.name "^1.1.5" + has-tostringtag "^1.0.0" + is-async-function "^2.0.0" + is-date-object "^1.0.5" + is-finalizationregistry "^1.0.2" + is-generator-function "^1.0.10" + is-regex "^1.1.4" + is-weakref "^1.0.2" + isarray "^2.0.5" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.9" + +which-collection@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" + integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== + dependencies: + is-map "^2.0.1" + is-set "^2.0.1" + is-weakmap "^2.0.1" + is-weakset "^2.0.1" + +which-typed-array@^1.1.11, which-typed-array@^1.1.13, which-typed-array@^1.1.9: + version "1.1.13" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.13.tgz#870cd5be06ddb616f504e7b039c4c24898184d36" + integrity sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.4" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +xdg-basedir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" + integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==