From 1c018519599cd1f48e46cfebacc87381756a7d33 Mon Sep 17 00:00:00 2001 From: Bilel Kihal <61744974+Bilelkihal@users.noreply.github.com> Date: Fri, 24 May 2024 09:59:17 +0200 Subject: [PATCH 01/57] fix: home annotator block redirection to annotator page with empty text (#629) --- app/controllers/home_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/home_controller.rb b/app/controllers/home_controller.rb index 87f9e6e2c..7c7492dbe 100644 --- a/app/controllers/home_controller.rb +++ b/app/controllers/home_controller.rb @@ -160,7 +160,7 @@ def feedback_complete; end def annotator_recommender_form if params[:submit_button] == "annotator" - redirect_to "/annotator?text=#{helpers.escape(params[:text])}" + redirect_to "/annotator?text=#{helpers.escape(params[:input])}" elsif params[:submit_button] == "recommender" redirect_to "/recommender?input=#{helpers.escape(params[:input])}" end From 1247c1a4fd84f45b5a54692d82378e5ef278cd24 Mon Sep 17 00:00:00 2001 From: Bilel Kihal <61744974+Bilelkihal@users.noreply.github.com> Date: Mon, 27 May 2024 15:17:21 +0200 Subject: [PATCH 02/57] Fix: Download button in summary export metadata (#628) * fix xml download button in summary page, export metadata * adjust the position of the export metadata download button and make the hover cursor pointer for it --- app/assets/stylesheets/ontologies.scss | 4 +++- .../rdf_highlighter_component_controller.js | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/assets/stylesheets/ontologies.scss b/app/assets/stylesheets/ontologies.scss index afa87ae7c..fb53355be 100644 --- a/app/assets/stylesheets/ontologies.scss +++ b/app/assets/stylesheets/ontologies.scss @@ -293,8 +293,10 @@ $widget-table-border-color: #EFEFEF; } .metadata-exporter .download-btn { position: absolute; - right: 20px; + right: 0; + top: -50px; z-index: 2; + cursor: pointer; .chip_button_container_clickable { opacity: 0.6; &:hover { diff --git a/app/components/display/rdf_highlighter_component/rdf_highlighter_component_controller.js b/app/components/display/rdf_highlighter_component/rdf_highlighter_component_controller.js index 073736970..eda8a8f4b 100644 --- a/app/components/display/rdf_highlighter_component/rdf_highlighter_component_controller.js +++ b/app/components/display/rdf_highlighter_component/rdf_highlighter_component_controller.js @@ -108,7 +108,7 @@ export default class extends Controller { } downloadXML () { - this.#generateDownloadFile(this.#toXML(this.formatedData, this.submissionValue['context']), 'rdf') + this.#generateDownloadFile(this.#toXML(this.formatedData, this.contextValue), 'rdf') } downloadCSV () { From 8ddd2e10422092cdb9f2e87a595723d5ddebfaa6 Mon Sep 17 00:00:00 2001 From: SirineMhedhbi <31127782+SirineMhedhbi@users.noreply.github.com> Date: Tue, 28 May 2024 15:41:48 +0200 Subject: [PATCH 03/57] Fix: the contexual json icon for to the concept adapt to the select tab (#539) * refactor concepts json code and put it in a stimulus controller * adjust the position of the concepts json link * remove non related code to concepts json PR * remove non related code to contextual json pull request * pass base class URL directly to concepts json stimulus controller * clean concepts json stimulus code * remove undesired code from concepts json button PR * fix typo in agent_search_input_component.html.haml * rename concepts json button stimulus controller * clean concepts json button controller code * clean concepts json button related code --------- Co-authored-by: Syphax bouazzouni Co-authored-by: Bilel KIHAL Co-authored-by: @SirineMhedhbi --- app/assets/stylesheets/concepts.scss | 5 + .../agent_search_input_component.html.haml | 2 +- app/components/tab_item_component.rb | 7 +- app/controllers/annotator_controller.rb | 1 + .../concepts_json_button_controller.js | 19 +++ app/javascript/controllers/index.js | 5 +- app/views/concepts/_show.html.haml | 112 +++++++++--------- config/bioportal_config_env.rb.sample | 1 + 8 files changed, 91 insertions(+), 61 deletions(-) create mode 100644 app/javascript/controllers/concepts_json_button_controller.js diff --git a/app/assets/stylesheets/concepts.scss b/app/assets/stylesheets/concepts.scss index e466177ed..ec392466a 100644 --- a/app/assets/stylesheets/concepts.scss +++ b/app/assets/stylesheets/concepts.scss @@ -160,4 +160,9 @@ div.synonym-change-request button { .concepts-mapping-count .d-flex{ display: inline !important; +} + +#concepts_json_link{ + margin-top: -4px; + margin-right: 5px; } \ No newline at end of file diff --git a/app/components/agent_search_input_component/agent_search_input_component.html.haml b/app/components/agent_search_input_component/agent_search_input_component.html.haml index 89f0fdd30..02b022ae1 100644 --- a/app/components/agent_search_input_component/agent_search_input_component.html.haml +++ b/app/components/agent_search_input_component/agent_search_input_component.html.haml @@ -8,4 +8,4 @@ %p.search-element.home-searched-ontology NAME (IDENTIFIERS) %p.home-result-type - TYPE \ No newline at end of file + TYPE diff --git a/app/components/tab_item_component.rb b/app/components/tab_item_component.rb index 7779939e6..88f11f890 100644 --- a/app/components/tab_item_component.rb +++ b/app/components/tab_item_component.rb @@ -4,13 +4,14 @@ class TabItemComponent < ViewComponent::Base include ActionView::Helpers::UrlHelper - def initialize(id: nil, title: nil, path: nil, page_name: '', selected: false) + def initialize(id: nil, title: nil, path: nil, page_name: '', selected: false, json_link: nil) super @id = id @title = title @path = path @page_name = page_name @selected = selected + @json_link = json_link end def selected_item? @@ -44,9 +45,9 @@ def page_name def call if title && !title.empty? - link_to(title, @path, id: "#{item_id}_tab", class: "#{active_class} tab-link") + link_to(title, @path, id: "#{item_id}_tab", class: "#{active_class} tab-link", 'data-json-link': @json_link) else - link_to(@path, id: "#{item_id}_tab", class: "#{active_class} tab-link") do + link_to(@path, id: "#{item_id}_tab", class: "#{active_class} tab-link", 'data-json-link': @json_link) do content end end diff --git a/app/controllers/annotator_controller.rb b/app/controllers/annotator_controller.rb index 6f1ec810b..d0cd47800 100644 --- a/app/controllers/annotator_controller.rb +++ b/app/controllers/annotator_controller.rb @@ -201,6 +201,7 @@ def empty_advanced_options params[:fast_context].nil? && params[:lemmatize].nil? end + def remove_special_chars(input) regex = /^[a-zA-Z0-9\s]*$/ diff --git a/app/javascript/controllers/concepts_json_button_controller.js b/app/javascript/controllers/concepts_json_button_controller.js new file mode 100644 index 000000000..01de7199b --- /dev/null +++ b/app/javascript/controllers/concepts_json_button_controller.js @@ -0,0 +1,19 @@ +import {Controller} from "@hotwired/stimulus" + +export default class extends Controller { + static targets = ['button'] + + update(){ + setTimeout(() => { + const tabsList = this.element.querySelectorAll('.nav-item'); + const jsonLink = Array.from(tabsList).find(tab => tab.classList.contains('active'))?.querySelector('a').getAttribute('data-json-link'); + const conceptsJsonLink = this.buttonTarget.querySelector('a'); + if (jsonLink) { + conceptsJsonLink.href = jsonLink; + conceptsJsonLink.style.display = 'flex' + } else { + conceptsJsonLink.style.display = 'none' + } + }, 1); + } +} \ No newline at end of file diff --git a/app/javascript/controllers/index.js b/app/javascript/controllers/index.js index e490eb3a1..804ee3b3a 100644 --- a/app/javascript/controllers/index.js +++ b/app/javascript/controllers/index.js @@ -102,4 +102,7 @@ application.register("ontologies-selector", OntologiesSelector) import MappingsController from "./mappings_visualization_controller" -application.register('mappings', MappingsController) \ No newline at end of file +application.register('mappings', MappingsController) + +import ConceptsJsonButtonController from "./concepts_json_button_controller.js" +application.register('concepts-json', ConceptsJsonButtonController) \ No newline at end of file diff --git a/app/views/concepts/_show.html.haml b/app/views/concepts/_show.html.haml index fecb7bea9..5efc05478 100644 --- a/app/views/concepts/_show.html.haml +++ b/app/views/concepts/_show.html.haml @@ -3,72 +3,72 @@ = render Display::AlertComponent.new do = t('concepts.use_jump_to') - else - = render TabsContainerComponent.new(type:'outline') do |c| + %div{'data-controller': 'concepts-json', 'data-action': 'click->concepts-json#update'} + = render TabsContainerComponent.new(type:'outline') do |c| + - c.pinned_right do + - if $PURL_ENABLED + %div.mx-1 + = link_to("#classPermalinkModal", class: "class-permalink nav-link", title: t('concepts.permanent_link_class'), aria: {label: t('concepts.permanent_link_class')}, data: {toggle: "modal", current_purl: "#{@current_purl}"}) do + %i{class: "fas fa-link", aria: {hidden: "true"}} + %div{'data-concepts-json-target': 'button'} + = render RoundedButtonComponent.new(link: "#{@ontology.id}/classes/#{escape(@concept.id)}?display=all&apikey=#{get_apikey}", target:'_blank') + - apikey = "apikey=#{get_apikey}" + - baseClassUrl = "#{@ontology.id}/classes/#{escape(@concept.id)}" + - c.item(title: t('concepts.details'), path: '#details', selected: true, json_link: "#{baseClassUrl}?#{apikey}&display=all") - - c.pinned_right do - - if $PURL_ENABLED - %div.mx-1 - = link_to("#classPermalinkModal", class: "class-permalink nav-link", title: t('concepts.permanent_link_class'), aria: {label: t('concepts.permanent_link_class')}, data: {toggle: "modal", current_purl: "#{@current_purl}"}) do - %i{class: "fas fa-link", aria: {hidden: "true"}} - %div - = render RoundedButtonComponent.new(link: "#{@ontology.id}/classes/#{escape(@concept.id)}?display=all&apikey=#{get_apikey}", target:'_blank') + - unless skos? + - c.item(id: 'instances', path: '#instances', json_link: "#{baseClassUrl}/instances?#{apikey}") do + = t('concepts.instances') + ( + %span#concept_instances_sorted_list_count + ) - - c.item(title: t('concepts.details'), path: '#details', selected: true) + - c.item(title: t('concepts.visualization'), path: '#visualization') - - unless skos? - - c.item(id: 'instances', path: '#instances') do - = t('concepts.instances') - ( - %span#concept_instances_sorted_list_count - ) + - c.item(id: 'notes', path: '#notes', json_link: "#{baseClassUrl}/notes?#{apikey}") do + = t('concepts.notes') + %span#note_count_wrapper + ( + %span#note_count= @notes.length + ) + - c.item(id: 'mappings', path: '#mappings', json_link: "#{baseClassUrl}/mappings?#{apikey}") do + .d-flex + #{t('concepts.mappings')} + ( + = concept_mappings_loader(ontology_acronym: @ontology.acronym, concept_id: @concept.id) + ) - - c.item(title: t('concepts.visualization'), path: '#visualization') + - if @enable_ontolobridge + - c.item(title: t('concepts.new_term_requests'), path: '#request_term') - - c.item(id: 'notes', path: '#notes') do - = t('concepts.notes') - %span#note_count_wrapper - ( - %span#note_count= @notes.length - ) - - c.item(id: 'mappings', path: '#mappings') do - .d-flex - #{t('concepts.mappings')} - ( - = concept_mappings_loader(ontology_acronym: @ontology.acronym, concept_id: @concept.id) - ) - - - if @enable_ontolobridge - - c.item(title: t('concepts.new_term_requests'), path: '#request_term') - - - c.item_content do - = render :partial =>'/concepts/details' - - - unless skos? - c.item_content do - = render :partial =>'instances/instances' , locals: {id: "class-instances-data-table"} - - c.item_content do - = render :partial =>'/concepts/biomixer' + = render :partial =>'/concepts/details' - - c.item_content do - = render :partial =>'/notes/list' + - unless skos? + - c.item_content do + = render :partial =>'instances/instances' , locals: {id: "class-instances-data-table"} + - c.item_content do + = render :partial =>'/concepts/biomixer' - - c.item_content do - = render TurboFrameComponent.new(id:'concept_mappings', - src:"/ajax/mappings/get_concept_table?ontologyid=#{@ontology.acronym}&conceptid=#{CGI.escape(@concept.id)}") + - c.item_content do + = render :partial =>'/notes/list' - - if @enable_ontolobridge - c.item_content do - = render :partial =>'/concepts/request_term' + = render TurboFrameComponent.new(id:'concept_mappings', + src:"/ajax/mappings/get_concept_table?ontologyid=#{@ontology.acronym}&conceptid=#{CGI.escape(@concept.id)}") - :javascript - jQuery(document).ready(function(){ + - if @enable_ontolobridge + - c.item_content do + = render :partial =>'/concepts/request_term' - jQuery("#classPermalinkModal").on("shown.bs.modal", function (e) { - var currentPurl = jQuery("a.class-permalink").data("current-purl"); - jQuery("#purl_input").val(currentPurl); - }) + :javascript + jQuery(document).ready(function(){ + jQuery("#classPermalinkModal").on("shown.bs.modal", function (e) { + var currentPurl = jQuery("a.class-permalink").data("current-purl"); + jQuery("#purl_input").val(currentPurl); + }) - jQuery("#purl_input").on("click", function () { - jQuery(this).select(); - }); - }); + jQuery("#purl_input").on("click", function () { + jQuery(this).select(); + }); + }); diff --git a/config/bioportal_config_env.rb.sample b/config/bioportal_config_env.rb.sample index bf07df798..236636005 100644 --- a/config/bioportal_config_env.rb.sample +++ b/config/bioportal_config_env.rb.sample @@ -307,3 +307,4 @@ if $HOSTNAME require_relative "bioportal_config_development_#{$HOSTNAME}" end end + From d13d0fe8102e5170428fa3ea74d8a963a5a82ec6 Mon Sep 17 00:00:00 2001 From: Bilel Kihal <61744974+Bilelkihal@users.noreply.github.com> Date: Thu, 30 May 2024 16:40:13 +0200 Subject: [PATCH 04/57] feature: make view of clickable in summary page header (#643) --- app/views/layouts/ontology_viewer/_header.html.haml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/views/layouts/ontology_viewer/_header.html.haml b/app/views/layouts/ontology_viewer/_header.html.haml index 877e8c408..291df004d 100644 --- a/app/views/layouts/ontology_viewer/_header.html.haml +++ b/app/views/layouts/ontology_viewer/_header.html.haml @@ -4,11 +4,13 @@ -# A header of sorts to display ontology name and subset of details. .ontology-details-header-container .ontology-details-path - %a{href: "/ontologies"} ontologies + %a{href: "/ontologies"} Ontologies - if @ontology.viewOf = inline_svg_tag 'arrow-right-outlined.svg' %div - = @ontology.viewOf.split('/').last + - viewOfAcronym = @ontology.viewOf.split('/').last + %a{href: "/ontologies/#{viewOfAcronym}"} + = viewOfAcronym = inline_svg_tag 'arrow-right-outlined.svg' %div = @ontology.acronym From e888c6fed90fb7e59317515000898bc0183cebf6 Mon Sep 17 00:00:00 2001 From: Bilel Kihal <61744974+Bilelkihal@users.noreply.github.com> Date: Thu, 30 May 2024 16:47:02 +0200 Subject: [PATCH 05/57] feature: use the ontologies selector by name and acronym in edit groups and categories (#641) --- app/controllers/admin/categories_controller.rb | 2 +- app/controllers/admin/groups_controller.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/admin/categories_controller.rb b/app/controllers/admin/categories_controller.rb index ffe23c076..9a4e357c9 100644 --- a/app/controllers/admin/categories_controller.rb +++ b/app/controllers/admin/categories_controller.rb @@ -24,7 +24,7 @@ def new def edit @category = _category @acronyms = @category.ontologies.map { |url| url.match(/\/([^\/]+)$/)[1] } - @ontologies_category = LinkedData::Client::Models::Ontology.all(include: 'acronym').map {|o|[o.acronym, o.id] } + @ontologies_category = LinkedData::Client::Models::Ontology.all(include: 'name,acronym').map {|x| ["#{x.name} (#{x.acronym})", x.id.to_s]} respond_to do |format| format.html { render "edit", :layout => false } end diff --git a/app/controllers/admin/groups_controller.rb b/app/controllers/admin/groups_controller.rb index 3fdbd5ef3..d4ae61352 100644 --- a/app/controllers/admin/groups_controller.rb +++ b/app/controllers/admin/groups_controller.rb @@ -24,7 +24,7 @@ def new 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] } + @ontologies_group = LinkedData::Client::Models::Ontology.all(include: 'name,acronym').map {|x| ["#{x.name} (#{x.acronym})", x.id.to_s]} respond_to do |format| format.html { render "edit", :layout => false } end From 066607eaf3643db2d96c933d8e14faa98c8d3ea0 Mon Sep 17 00:00:00 2001 From: Bilel Kihal <61744974+Bilelkihal@users.noreply.github.com> Date: Fri, 31 May 2024 10:14:06 +0200 Subject: [PATCH 06/57] Fix: Reject the current ontology from appearing in the ontologies selector in editing the submission's relations (#640) * reject current ontology from the ontologies selector in relations section - edit submission * pass reject ontology as a param in generate ontology seect input method --- app/helpers/submission_inputs_helper.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/helpers/submission_inputs_helper.rb b/app/helpers/submission_inputs_helper.rb index e79060bf4..d7b60d383 100644 --- a/app/helpers/submission_inputs_helper.rb +++ b/app/helpers/submission_inputs_helper.rb @@ -420,13 +420,15 @@ def generate_url_input(attr, helper_text: nil) end end - def generate_ontology_select_input(name, label, selected, multiple) + def generate_ontology_select_input(name, label, selected, multiple, reject_ontology: @ontology) unless @ontology_acronyms @ontology_acronyms = LinkedData::Client::Models::Ontology.all(include: 'acronym,name', display_links: false, display_context: false, include_views: true) .map { |x| ["#{x.name} (#{x.acronym})", x.id.to_s] } @ontology_acronyms << ['', ''] end + @ontology_acronyms = @ontology_acronyms.reject { |acronym, id| id == reject_ontology.id } + input = '' input = hidden_field_tag("#{name}[]") if multiple From 41031fa24f349ae889fcc3b7dd70fc93e6cf1c04 Mon Sep 17 00:00:00 2001 From: Bilel Kihal <61744974+Bilelkihal@users.noreply.github.com> Date: Fri, 31 May 2024 11:12:09 +0200 Subject: [PATCH 07/57] Feature: Make text area resisable in upload ontology and edit submission forms (#644) * make text areas resisable in upload ontology and edit submission forms * make forms list input text areas resisable --- app/components/input/text_area_component.rb | 6 +++++- .../input/text_area_component/text_area_component.html.haml | 2 +- app/helpers/inputs_helper.rb | 4 ++-- app/helpers/submission_inputs_helper.rb | 4 ++-- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/app/components/input/text_area_component.rb b/app/components/input/text_area_component.rb index 940a8b935..04f453337 100644 --- a/app/components/input/text_area_component.rb +++ b/app/components/input/text_area_component.rb @@ -1,8 +1,12 @@ # frozen_string_literal: true class Input::TextAreaComponent < Input::InputFieldComponent - def initialize(label: '', name:, value: nil, placeholder: '', error_message: '', helper_text: '', rows: "5") + def initialize(label: '', name:, value: nil, placeholder: '', error_message: '', helper_text: '', rows: "5", resize: nil) super(label: label, name: name, value: value, placeholder: placeholder, error_message: error_message, helper_text: helper_text) @rows = rows + @resize = resize + end + def resize + @resize ? "resize: vertical;" : "" end end diff --git a/app/components/input/text_area_component/text_area_component.html.haml b/app/components/input/text_area_component/text_area_component.html.haml index d2dd1b5d8..f00c4cffb 100644 --- a/app/components/input/text_area_component/text_area_component.html.haml +++ b/app/components/input/text_area_component/text_area_component.html.haml @@ -1,3 +1,3 @@ = render Input::InputFieldComponent.new(label: @label, name: @name, value: @value, placeholder: @placeholder, error_message: @error_message, helper_text: @helper_text) do - %textarea.input-field-component{name: @name, rows: @rows, placeholder: @placeholder, style: error_style} + %textarea.input-field-component{name: @name, rows: @rows, placeholder: @placeholder, style: "#{error_style} #{resize}"} = @value \ No newline at end of file diff --git a/app/helpers/inputs_helper.rb b/app/helpers/inputs_helper.rb index a844ce0d2..cd4782b6f 100644 --- a/app/helpers/inputs_helper.rb +++ b/app/helpers/inputs_helper.rb @@ -46,10 +46,10 @@ def url_input(name:, value:, label: nil, help: nil) helper_text: help) end - def text_area_input(name:, value:, label: nil, help: nil) + def text_area_input(name:, value:, label: nil, help: nil, resize: nil) render Input::TextAreaComponent.new(label: input_label(label, name), name: name, value: value, error_message: input_error_message(name), - helper_text: help) + helper_text: help, resize: resize) end def date_input(name:, value:, label: nil, help: nil, max_date: nil) diff --git a/app/helpers/submission_inputs_helper.rb b/app/helpers/submission_inputs_helper.rb index d7b60d383..89c80021d 100644 --- a/app/helpers/submission_inputs_helper.rb +++ b/app/helpers/submission_inputs_helper.rb @@ -97,7 +97,7 @@ def attribute_input(attr_key, long_text: false, label: nil, show_tooltip: true, url_input(name: name, label: label, value: @submission.URI) elsif long_text text_area_input(name: name, label: label, - value: attr.values) + value: attr.values, resize: true) else text_input(name: name, label: label, value: attr.values, help: help) @@ -446,7 +446,7 @@ def generate_list_text_input(attr, helper_text: nil, long_text: false) generate_list_field_input(attr, name, label, values, helper_text: helper_text) do |value, row_name, id| if long_text - text_area_tag(row_name, value, class: 'input-field-component', label: '') + text_area_tag(row_name, value, class: 'input-field-component', label: '', style: 'resize: vertical;') else text_input(label: '', name: row_name, value: value) end From f95de6958ca8be78bab346a244567f79a8348464 Mon Sep 17 00:00:00 2001 From: Bilel Kihal <61744974+Bilelkihal@users.noreply.github.com> Date: Fri, 31 May 2024 13:58:50 +0200 Subject: [PATCH 08/57] Fix: The issue when the agent has no acronym (#645) * fix the issue when the agent has no acronym * clean agent affiliations combination --- app/assets/stylesheets/agents.scss | 5 +++++ app/helpers/agent_helper.rb | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/app/assets/stylesheets/agents.scss b/app/assets/stylesheets/agents.scss index d90987894..df7b74d71 100644 --- a/app/assets/stylesheets/agents.scss +++ b/app/assets/stylesheets/agents.scss @@ -26,4 +26,9 @@ .agent-chip-name{ color: #8C8E8D; font-size: 15px; +} +.agent-edit-icon{ + display: flex !important; + flex-direction: column; + justify-content: center; } \ No newline at end of file diff --git a/app/helpers/agent_helper.rb b/app/helpers/agent_helper.rb index f1a5240e2..af3902fbd 100644 --- a/app/helpers/agent_helper.rb +++ b/app/helpers/agent_helper.rb @@ -47,7 +47,7 @@ def link_to_agent_edit_modal(agent, parent_id = nil) end def link_to_agent_edit(agent, parent_id, name_prefix, deletable: false, show_affiliations: true) - link_to(edit_agent_path(agent_id(agent), name_prefix: name_prefix, deletable: deletable, parent_id: parent_id, show_affiliations: show_affiliations), class: 'btn btn-sm btn-light') do + link_to(edit_agent_path(agent_id(agent), name_prefix: name_prefix, deletable: deletable, parent_id: parent_id, show_affiliations: show_affiliations), class: 'btn btn-sm btn-light agent-edit-icon') do content_tag(:i, '', class: 'far fa-edit') end end From 04ddce0096b43d84e601ab36458fd33d1ce43f22 Mon Sep 17 00:00:00 2001 From: Bilel Kihal <61744974+Bilelkihal@users.noreply.github.com> Date: Mon, 3 Jun 2024 17:27:51 +0200 Subject: [PATCH 09/57] fix: the concepts chips links redirecting to the wrong destination (#638) --- .../controllers/label_ajax_controller.js | 40 ++++++++++--------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/app/javascript/controllers/label_ajax_controller.js b/app/javascript/controllers/label_ajax_controller.js index cebf898b3..539a26aeb 100644 --- a/app/javascript/controllers/label_ajax_controller.js +++ b/app/javascript/controllers/label_ajax_controller.js @@ -11,27 +11,29 @@ export default class extends Controller { } connect() { - this.linkA = jQuery(this.element); - - if (this.linkA.hasClass('ajax-modified-cls')) { - return true - } - - this.cls_id = this.clsIdValue; - this.ont_acronym = this.ontologyAcronymValue; - - let ajax_uri = new URL(this.ajaxUrlValue, document.location.origin) - - ajax_uri.searchParams.set('ontology', this.ont_acronym) - ajax_uri.searchParams.set('id', this.cls_id) + setTimeout(() => { + this.linkA = jQuery(this.element); + if (this.linkA.hasClass('ajax-modified-cls')) { + return true + } - this.request = useAjax({ - url: ajax_uri.pathname + ajax_uri.search, - timeout: ajax_process_timeout * 1000, - success: this.#ajaxSuccess.bind(this), - error: this.#ajaxError.bind(this) - }); + this.cls_id = this.clsIdValue; + this.ont_acronym = this.ontologyAcronymValue; + + let ajax_uri = new URL(this.ajaxUrlValue, document.location.origin) + + ajax_uri.searchParams.set('ontology', this.ont_acronym) + ajax_uri.searchParams.set('id', this.cls_id) + + + this.request = useAjax({ + url: ajax_uri.pathname + ajax_uri.search, + timeout: ajax_process_timeout * 1000, + success: this.#ajaxSuccess.bind(this), + error: this.#ajaxError.bind(this) + }); + },0) } abort() { From a49157f613847214ff6b5feaffbb36d0a953d26d Mon Sep 17 00:00:00 2001 From: Bilel Kihal <61744974+Bilelkihal@users.noreply.github.com> Date: Mon, 3 Jun 2024 19:29:42 +0200 Subject: [PATCH 10/57] Feature: Scroll to the selected term in the tree view component (#646) * scroll to the selected term in the tree view * prevent the whole page scrolling when centring the scroll to the selected tree view element --- .../controllers/simple_tree_controller.js | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/app/javascript/controllers/simple_tree_controller.js b/app/javascript/controllers/simple_tree_controller.js index 2333fe906..858bfde2c 100644 --- a/app/javascript/controllers/simple_tree_controller.js +++ b/app/javascript/controllers/simple_tree_controller.js @@ -7,18 +7,17 @@ export default class extends Controller { } connect () { - let activeElem = this.element.querySelector('a.active') - if (activeElem) { - this.element.scrollTo({ - top: activeElem.offsetTop, - behavior: 'smooth' - }); - - if (this.autoClickValue) { - activeElem.click() + setTimeout(() => { + let activeElem = this.element.querySelector('.tree-link.active'); + if (activeElem) { + activeElem.scrollIntoView({ block: 'center' }); + window.scrollTo({top: 0,}); + if (this.autoClickValue) { + activeElem.click(); + } } - } - this.#onClickTooManyChildrenInit() + this.#onClickTooManyChildrenInit(); + }, 0); } select (event) { From 76f762e5587918b5ec07690137fcb0baf094e020 Mon Sep 17 00:00:00 2001 From: Imad Bourouche Date: Wed, 5 Jun 2024 17:07:41 +0200 Subject: [PATCH 11/57] fix: change local test "URL" to "URI" in check resolvability components (#651) --- config/locales/en.yml | 14 +++++++------- config/locales/fr.yml | 14 +++++++------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/config/locales/en.yml b/config/locales/en.yml index e406c3c3f..e4528f9b3 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1076,21 +1076,21 @@ en: close: Close submit: Submit check_resolvability: - check_resolvability_message_1: "The URL is resolvable and support the following formats: %{supported_format}" - check_resolvability_message_2: "The URL resolvable but is not content negotiable, support only: %{supported_format}" - check_resolvability_message_3: The URL is not resolvable and not content negotiable (returns %{status}). + check_resolvability_message_1: "The URI is resolvable and support the following formats: %{supported_format}" + check_resolvability_message_2: "The URI resolvable but is not content negotiable, support only: %{supported_format}" + check_resolvability_message_3: The URI is not resolvable and not content negotiable (returns %{status}). uri_placeholder: Type a URI to test its resolvability show_help: Show help format_not_specified: Format not specified how_it_works: title: How it works content_1: | - The check resolvability tool allows you to test if a given URL is resolvable. It is based on the HTTP HEAD method. - We check the resolvability of a URL by sending a HEAD request to the URL and checking if the response status code is 200 (OK) and + The check resolvability tool allows you to test if a given URI is resolvable. It is based on the HTTP HEAD method. + We check the resolvability of a URI by sending a HEAD request to the URI and checking if the response status code is 200 (OK) and the returned content type is equal to one of the following %{resolvability_formats}. content_2: | - We have a timeout set to %{resolvability_timeout} seconds, so if the URL is not resolvable within that time, the check will fail. - And a max redirections set to %{resolvability_max_redirections}, so if the URL is not resolvable within that number of redirections, the check will fail. + We have a timeout set to %{resolvability_timeout} seconds, so if the URI is not resolvable within that time, the check will fail. + And a max redirections set to %{resolvability_max_redirections}, so if the URI is not resolvable within that number of redirections, the check will fail. resolving_uri: title: Resolving a URI content: | diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 2385828fe..fac128a5e 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -1098,21 +1098,21 @@ fr: submit: Soumettre check_resolvability: - check_resolvability_message_1: "L'URL est résolvable et supporte les formats suivants : %{supported_format}" - check_resolvability_message_2: "L'URL est résolvable mais n'est pas négociable en contenu, supporte uniquement : %{supported_format}" - check_resolvability_message_3: L'URL n'est pas résolvable et n'est pas négociable en contenu (retourne %{status}). + check_resolvability_message_1: "L'URI est résolvable et supporte les formats suivants : %{supported_format}" + check_resolvability_message_2: "L'URI est résolvable mais n'est pas négociable en contenu, supporte uniquement : %{supported_format}" + check_resolvability_message_3: L'URI n'est pas résolvable et n'est pas négociable en contenu (retourne %{status}). uri_placeholder: Tapez une URI pour tester sa résolvabilité show_help: Afficher l'aide format_not_specified: Format non spécifié how_it_works: title: Comment ça fonctionne content_1: | - L'outil de vérification de la résolvabilité vous permet de tester si une URL donnée est résolvable. Il est basé sur la méthode HTTP HEAD. - Nous vérifions la résolvabilité d'une URL en envoyant une requête HEAD à l'URL et en vérifiant si le code de statut de la réponse est 200 (OK) et + L'outil de vérification de la résolvabilité vous permet de tester si une URI donnée est résolvable. Il est basé sur la méthode HTTP HEAD. + Nous vérifions la résolvabilité d'une URI en envoyant une requête HEAD à l'URI et en vérifiant si le code de statut de la réponse est 200 (OK) et si le type de contenu retourné est égal à l'un des %{resolvability_formats} suivants. content_2: | - Nous avons un délai d'attente fixé à %{resolvability_timeout} secondes, donc si l'URL n'est pas résolvable dans ce délai, la vérification échouera. - Et un nombre maximal de redirections fixé à %{resolvability_max_redirections}, donc si l'URL n'est pas résolvable dans ce nombre de redirections, la vérification échouera. + Nous avons un délai d'attente fixé à %{resolvability_timeout} secondes, donc si l'URI n'est pas résolvable dans ce délai, la vérification échouera. + Et un nombre maximal de redirections fixé à %{resolvability_max_redirections}, donc si l'URI n'est pas résolvable dans ce nombre de redirections, la vérification échouera. resolving_uri: title: Résolution d'une URI content: | From 4cb9c983f3be1a3dfe36fa74d6a979a8c19a68d3 Mon Sep 17 00:00:00 2001 From: Imad Bourouche Date: Thu, 6 Jun 2024 04:40:31 +0200 Subject: [PATCH 12/57] Feature: Add content negotiation redirection tests (#622) * Add uri redirection for /ontologies/:acronym/:id to the appropriate page * small fixes: remove binding.pry and return resource_id in find_type_by_search * Add copy agroportal link functionality - this functionality is using the ClipboardComponent because it works the same but differ only in the content and icon - the clipboard component has been changed to accept title and icon * redirect to content finder page when no type is valid * Updated route to use redirect action instead of show_redirection * Use default icon and title arguments in the Clipboard Component * rename and internationalize clipboard component titles * small fix: remove % from svg icon * Add the copy title to the components section in en.yml and fr.yml * Show the generated uri when user hover over the copy link icon * Make the dynamic route content negotiable - based on the accept header we will - if "text/html" we will redirect to the agroportal page - else we will call the api and get the content serialized in the format specified and return it * update serialize content to return accept_header * translate copy_original_uri and copy_portal_uri to french * reuse search content concern in uri redirection concern * remove duplicate link_last_part method * Add htaccess functionality * Add apache and nginx instruction for htaccess redirection * Clean te code in the view file * Add OntologiesRedirectionController - remove redirect and generate_htaccess from ontologies_controller - clean code the generate_htaccess method - add "ontology_portal_uri" in @identifiers * Regroupe routes * Make ontologies_redirection controller and refactor generate_htaccess code * Internationalization of redirection rewrite rules modal * Add note for url that has # * link contact support button to the feedback page * Change regex to redirect only url of type: /path/resource_id - for urls that has the # it will redirect to the ontology page * Add ontology redirection based on the accept header format * move the ontology redirection route to the bottom to have less priority * Change rewrite rules note using alert component * Add /ontologies/ACRONYM/download?format=FORMAT route * ontology redirection based on the accept header using /ontologies/acronym/download route * Add redirect assertion in ontologies controller test * Fix content serialization when calling /ontologies/:acronym/:id * create private function for accept header and remove ontology redirection * remove generate_rewrite_rules function * remove redirect assertion in ontologies controller test * change htaccess route to /ontologies/:acronym/htaccess * fix copy internal links in LinkFieldComponent * add raw to copy internal links in identifiers card * return all response and add text/n3 format in content serializer * escape id when redirecting to content_finder * choose the right result from the results of search content * add algorithm to choose the right accept header, not_acceptable if no format valid * add an additional security to the uri redirection to have an exact match * make the check resolvability icon clickable & redirect to the tool page * make the check resolvability extend to accept equivalent formats * move the redirection function from ontologies_controller to uri concern * fix check_resolvability_tool to redirect to the full url not only the path - the problem was because everytime it is redirecting to the uri.path and uri.path does not include the ?format parameter - add the octet-stream accept header in the accepted format for xml * add reference to the url of the original file when format not acceptable * put again the resolvability timeout to 5 secondes * setup content negotiation and redirection tests * remove redirection when request ontology with format - the redirection is removed when request ontology in any format, by making request to the api and forward the result * add ids to the resource format icons and modal * assert the content type for html and json - the xml and csv is returning 500 internal server error from the api, but it's working locally * refactor content_redirection tests - still not completed * add multiple response status for ontology xml and csv format * add test for the content format of the resource * add turtle format based on hasOntologySyntax field * assert success and not_acceptable in turtle format it depends on hasOntologySyntax * add NTriples format for ontologies based on hasOntologySyntax field * test content negotiation for ontology resources * fix redirection url for resource html format * fix ontologies controller test indentation * assert redirection location in resource html format * update the admin user creation in tests possible only by an admin now --------- Co-authored-by: Syphax bouazzouni --- app/assets/stylesheets/ontologies.scss | 2 +- app/components/concept_details_component.rb | 2 +- .../concept_details_component.html.haml | 2 +- app/controllers/concerns/uri_redirection.rb | 34 ++++- .../ontologies_redirection_controller.rb | 17 +-- app/helpers/components_helper.rb | 2 +- .../ontologies/content_serializer.html.haml | 3 +- app/views/ontologies/htaccess.html.haml | 122 +++++++++--------- .../controllers/ontologies_controller_test.rb | 65 ++++++++++ test/fixtures/ontologies.yml | 83 ++++++++++++ test/fixtures/users.yml | 4 + test/helpers/application_test_helpers.rb | 38 ++++-- test/system/agent_flows_test.rb | 3 +- test/system/content_redirection_test.rb | 68 ++++++++++ test/system/login_flows_test.rb | 2 +- 15 files changed, 352 insertions(+), 95 deletions(-) create mode 100644 test/system/content_redirection_test.rb diff --git a/app/assets/stylesheets/ontologies.scss b/app/assets/stylesheets/ontologies.scss index fb53355be..223aeda8f 100644 --- a/app/assets/stylesheets/ontologies.scss +++ b/app/assets/stylesheets/ontologies.scss @@ -305,7 +305,7 @@ $widget-table-border-color: #EFEFEF; } } -.htacess-code-container{ +.htacess-code-container, .nginx-code-container{ margin-top: 20px; margin-bottom: 30px; text-align: left; diff --git a/app/components/concept_details_component.rb b/app/components/concept_details_component.rb index 663e7e188..ff275effb 100644 --- a/app/components/concept_details_component.rb +++ b/app/components/concept_details_component.rb @@ -81,7 +81,7 @@ def filter_properties(top_keys, bottom_keys, exclude_keys, concept_properties) private def link_to_format_modal(format, icon) - link_to_modal(nil, "/ontologies/#{@acronym}/#{escape(@concept_id)}/serialize/#{format}", data: {show_modal_title_value: @concept_id, show_modal_size_value: 'modal-xl'}) do + link_to_modal(nil, "/ontologies/#{@acronym}/#{escape(@concept_id)}/serialize/#{format}",{ id: "resource_content_#{format}", data: {show_modal_title_value: @concept_id, show_modal_size_value: 'modal-xl'}}) do inline_svg("icons/#{icon}.svg", width: '50px', height: '50px') end end diff --git a/app/components/concept_details_component/concept_details_component.html.haml b/app/components/concept_details_component/concept_details_component.html.haml index e42cfa818..e8c341b8c 100644 --- a/app/components/concept_details_component/concept_details_component.html.haml +++ b/app/components/concept_details_component/concept_details_component.html.haml @@ -26,7 +26,7 @@ - if @concept_id - t.row do |r| - r.td(colspan: 2) do - %div.d-flex.justify-content-center.p-2 + %div.d-flex.justify-content-center.p-2#content_resource_formats - [["json","json-ld-file"], ["xml","rdf-xml-file"] , ["ntriples","ntriples-file"], ["turtle","turtle-file"]].each do |format, icon| %div.mx-4{data: {controller: "tooltip"}, title: "Export in #{format.upcase}"} = link_to_format_modal(format, icon) \ No newline at end of file diff --git a/app/controllers/concerns/uri_redirection.rb b/app/controllers/concerns/uri_redirection.rb index 9ef86fcd4..f250e5c72 100644 --- a/app/controllers/concerns/uri_redirection.rb +++ b/app/controllers/concerns/uri_redirection.rb @@ -21,11 +21,29 @@ def redirect_to_file? end def redirect_to_file - # when dont have the specified format in the accept header - return not_acceptable("Invalid requested format, valid format are: JSON, XML, HTML and CSV\nto download the original file you can get it from: #{rest_url}/ontologies/#{params[:id]}/download\n") if accept_header.nil? + # check for hasOntologySyntax field for turtle format + ontology = LinkedData::Client::Models::Ontology.find_by_acronym(params[:id]).first + ontology_syntax = ontology.explore.latest_submission(include: 'hasOntologySyntax').hasOntologySyntax + return not_acceptable("Invalid requested format, valid format are: HTML, JSON, XML, CSV.\nNTriples and Turtle format is available for some resources\nYou can download the original file you can get it from: #{rest_url}/ontologies/#{params[:id]}/download\n") if accept_header.nil? || (ontology_syntax != "http://www.w3.org/ns/formats/Turtle" && accept_header== "text/turtle") || (ontology_syntax != "http://www.w3.org/ns/formats/N-Triples" && accept_header== "application/ntriples") + # when the format is different than text/html - redirect_to_download_file if (accept_header != "text/html" && params[:p].nil?) + download_ontology(acronym: params[:id], format: accept_header) if (accept_header != "text/html" && params[:p].nil?) + end + + def download_ontology(params) + redirect_url = "#{rest_url}/ontologies/#{params[:acronym]}" + download_url = "#{redirect_url}/download?apikey=#{get_apikey}" + case params[:format] + when 'text/csv', 'csv' + fetch_and_forward_data("#{download_url}&download_format=csv") + when 'text/xml', 'text/rdf+xml', 'application/rdf+xml', 'application/xml', 'xml' + fetch_and_forward_data("#{download_url}&download_format=rdf") + when 'application/json', 'application/ld+json', 'application/*', 'json' + fetch_and_forward_data("#{redirect_url}?apikey=#{get_apikey}") + else + fetch_and_forward_data(download_url) + end end private @@ -56,8 +74,10 @@ def not_acceptable(message = nil) render plain: message, status: 406 end - def redirect_to_download_file - redirect_to("/ontologies/#{params[:id]}/download?format=#{helpers.escape(accept_header)}", allow_other_host: true) + def fetch_and_forward_data(url) + uri = URI.parse(url) + response = Net::HTTP.get_response(uri) + send_data response.body, type: response.content_type, status: response.code.to_i end @@ -86,8 +106,12 @@ def find_content_type_for_media_range(media_range) 'application/ld+json' when 'text/xml', 'text/rdf+xml', 'application/rdf+xml', 'application/xml' 'application/rdf+xml' + when 'application/ntriples', 'application/n-triples' + 'application/ntriples' when 'text/csv' 'text/csv' + when 'text/turtle' + 'text/turtle' else nil end diff --git a/app/controllers/ontologies_redirection_controller.rb b/app/controllers/ontologies_redirection_controller.rb index 43269e788..f690d0702 100644 --- a/app/controllers/ontologies_redirection_controller.rb +++ b/app/controllers/ontologies_redirection_controller.rb @@ -38,23 +38,10 @@ def generate_htaccess render 'ontologies/htaccess', layout: nil end - + # GET /ontologies/ACRONYM/download?format=FORMAT def redirect_ontology - redirect_url = "#{rest_url}/ontologies/#{params[:acronym]}" - download_url = "#{redirect_url}/download?apikey=#{get_apikey}" - case params[:format] - when 'text/csv', 'csv' - redirect_to("#{download_url}&download_format=csv", allow_other_host: true) - when 'text/xml', 'text/rdf+xml', 'application/rdf+xml', 'application/xml', 'xml' - redirect_to("#{download_url}&download_format=rdf", allow_other_host: true) - when 'application/json', 'application/ld+json', 'application/*', 'json' - # redirect to the api - redirect_to("#{redirect_url}?apikey=#{get_apikey}", allow_other_host: true) - else - # redirect to download the original file - redirect_to("#{download_url}", allow_other_host: true) - end + download_ontology(params) end diff --git a/app/helpers/components_helper.rb b/app/helpers/components_helper.rb index 03eef072c..53f19cfb1 100644 --- a/app/helpers/components_helper.rb +++ b/app/helpers/components_helper.rb @@ -87,7 +87,7 @@ def copy_link_to_clipboard(url, show_content: false) def generated_link_to_clipboard(url, acronym) url = "#{$UI_URL}/ontologies/#{acronym}/#{link_last_part(url)}" - content_tag(:span, style: 'display: inline-block;') do + content_tag(:span, id: "generate_portal_link", style: 'display: inline-block;') do render ClipboardComponent.new(icon: 'icons/copy_link.svg', title: "#{t("components.copy_portal_uri", portal_name: portal_name)} #{link_to(url)}", message: url, show_content: false) end end diff --git a/app/views/ontologies/content_serializer.html.haml b/app/views/ontologies/content_serializer.html.haml index beda31695..34045b7b9 100644 --- a/app/views/ontologies/content_serializer.html.haml +++ b/app/views/ontologies/content_serializer.html.haml @@ -1,2 +1,3 @@ = render_in_modal do - = rdf_highlighter_container(@format, @result) if @result + #resource_content_modal + = rdf_highlighter_container(@format, @result) if @result diff --git a/app/views/ontologies/htaccess.html.haml b/app/views/ontologies/htaccess.html.haml index bd59fcbe1..a48615550 100644 --- a/app/views/ontologies/htaccess.html.haml +++ b/app/views/ontologies/htaccess.html.haml @@ -1,68 +1,70 @@ = render_in_modal do - %p - = t("ontologies.htaccess_redirection_description") + #redirection_rules_modal + %p + = t("ontologies.htaccess_redirection_description") - %h5 - %strong - = t("ontologies.instructions_servers", server: "Apache") - %ol - %li + %h5 %strong - = t("ontologies.htaccess_redirection.instruction_1") - = t("ontologies.htaccess_redirection.instruction_1_content") - %li - %strong - = t("ontologies.htaccess_redirection.instruction_2") - = t("ontologies.htaccess_redirection.instruction_2_content") - %li - %strong - = t("ontologies.htaccess_redirection.instruction_3") - = t("ontologies.htaccess_redirection.instruction_3_content") - - .htacess-code-container - .clipboard-component-resource-content{style: 'position: absolute; right: 2%; top: 8%;'} - = render ClipboardComponent.new(message: @htaccess_content, show_content: false) - %pre.mb-0 - %code.d-block{style: 'text-wrap: pretty; word-break: break-all; color: white;'} - = @htaccess_content + = t("ontologies.instructions_servers", server: "Apache") + %ol + %li + %strong + = t("ontologies.htaccess_redirection.instruction_1") + = t("ontologies.htaccess_redirection.instruction_1_content") + %li + %strong + = t("ontologies.htaccess_redirection.instruction_2") + = t("ontologies.htaccess_redirection.instruction_2_content") + %li + %strong + = t("ontologies.htaccess_redirection.instruction_3") + = t("ontologies.htaccess_redirection.instruction_3_content") + + .htacess-code-container + .clipboard-component-resource-content{style: 'position: absolute; right: 2%; top: 8%;'} + = render ClipboardComponent.new(message: @htaccess_content, show_content: false) + %pre.mb-0 + %code.d-block{style: 'text-wrap: pretty; word-break: break-all; color: white;'} + = @htaccess_content - %hr + %hr - %h5 - %strong - = t("ontologies.instructions_servers", server: "Nginx") - %ol - %li - %strong - = t("ontologies.nginx_redirection.instruction_1") - = t("ontologies.nginx_redirection.instruction_1_content") - %li - %strong - = t("ontologies.nginx_redirection.instruction_2") - = t("ontologies.nginx_redirection.instruction_2_content") - %li - %strong - = t("ontologies.nginx_redirection.instruction_3") - = t("ontologies.nginx_redirection.instruction_3_content") - %li - %strong - = t("ontologies.nginx_redirection.instruction_4") - = t("ontologies.nginx_redirection.instruction_4_content") - %li + %h5 %strong - = t("ontologies.nginx_redirection.instruction_5") - = t("ontologies.nginx_redirection.instruction_5_content") + = t("ontologies.instructions_servers", server: "Nginx") + %ol + %li + %strong + = t("ontologies.nginx_redirection.instruction_1") + = t("ontologies.nginx_redirection.instruction_1_content") + %li + %strong + = t("ontologies.nginx_redirection.instruction_2") + = t("ontologies.nginx_redirection.instruction_2_content") + %li + %strong + = t("ontologies.nginx_redirection.instruction_3") + = t("ontologies.nginx_redirection.instruction_3_content") + %li + %strong + = t("ontologies.nginx_redirection.instruction_4") + = t("ontologies.nginx_redirection.instruction_4_content") + %li + %strong + = t("ontologies.nginx_redirection.instruction_5") + = t("ontologies.nginx_redirection.instruction_5_content") - .htacess-code-container - .clipboard-component-resource-content{style: 'position: absolute; right: 2%; top: 8%;'} - = render ClipboardComponent.new(message: @nginx_content, show_content: false) - %pre.mb-0 - %code.d-block{style: 'text-wrap: pretty; word-break: break-all; color: white;'} - = @nginx_content - - %h5 - %strong Note - = render Display::AlertComponent.new(message: t("ontologies.redirection_note"), closable: false, type: "warning") + .nginx-code-container + .clipboard-component-resource-content{style: 'position: absolute; right: 2%; top: 8%;'} + = render ClipboardComponent.new(message: @nginx_content, show_content: false) + %pre.mb-0 + %code.d-block{style: 'text-wrap: pretty; word-break: break-all; color: white;'} + = @nginx_content + + #redirection_note + %h5 + %strong Note + = render Display::AlertComponent.new(message: t("ontologies.redirection_note"), closable: false, type: "warning") - .contact-support{style: "width: 100%; display: flex; justify-content: end;"} - = render Buttons::RegularButtonComponent.new(id:'regular-button', value: t("ontologies.contact_support"), variant: "primary", href: "/feedback", target: "_blank", state: "regular") \ No newline at end of file + .contact-support{style: "width: 100%; display: flex; justify-content: end;"} + = render Buttons::RegularButtonComponent.new(id:'regular-button', value: t("ontologies.contact_support"), variant: "primary", href: "/feedback", target: "_blank", state: "regular") diff --git a/test/controllers/ontologies_controller_test.rb b/test/controllers/ontologies_controller_test.rb index 054b4eb90..b286994b0 100644 --- a/test/controllers/ontologies_controller_test.rb +++ b/test/controllers/ontologies_controller_test.rb @@ -39,4 +39,69 @@ class OntologiesControllerTest < ActionDispatch::IntegrationTest end end + + test 'test get STY in html format' do + get '/ontologies/STY', headers: { 'Accept' => 'text/html' } + assert_response :success + assert_equal 'text/html; charset=utf-8', response.content_type + end + + test 'test get STY in json format' do + get '/ontologies/STY', headers: { 'Accept' => 'application/json' } + assert_response :success + assert_equal 'application/json', response.content_type + + end + + test 'test get STY in xml format' do + get '/ontologies/STY', headers: { 'Accept' => 'application/xml' } + assert_equal 500, response.status # STY has only Turtle + end + + test 'test get STY in csv format' do + get '/ontologies/STY', headers: { 'Accept' => 'text/csv' } + assert_response :success + end + + test 'test get STY in turtle format' do + get '/ontologies/STY', headers: { 'Accept' => 'text/turtle' } + assert_response :success + end + + test 'test get STY in ntriples format' do + get '/ontologies/STY', headers: { 'Accept' => 'application/ntriples' } + assert_response :not_acceptable + end + + + test 'test get STY resource in html format' do + get '/ontologies/STY/T071', headers: { 'Accept' => 'text/html' } + assert_includes ["http://www.example.com/ontologies/STY?conceptid=http%3A%2F%2Fpurl.bioontology.org%2Fontology%2FSTY%2FT071&p=classes", "http://www.example.com/ontologies/STY?conceptid=http%3A%2F%2Fpurl.lirmm.fr%2Fontology%2FSTY%2FT071&p=classes"], response.location + assert_response :redirect + assert_equal "text/html; charset=utf-8" , response.content_type + end + + test 'test get STY resource in json format' do + get '/ontologies/STY/T071', headers: { 'Accept' => 'application/json' } + assert_response :success + assert_equal "application/ld+json; charset=utf-8" , response.content_type + end + + test 'test get STY resource in xml format' do + get '/ontologies/STY/T071', headers: { 'Accept' => 'application/xml' } + assert_response :success + assert_equal "application/rdf+xml; charset=utf-8" , response.content_type + end + + test 'test get STY resource in ntriples format' do + get '/ontologies/STY/T071', headers: { 'Accept' => 'application/n-triples' } + assert_response :success + assert_equal "application/n-triples; charset=utf-8" , response.content_type + end + + test 'test get STY resource in turtle format' do + get '/ontologies/STY/T071', headers: { 'Accept' => 'text/turtle' } + assert_response :success + assert_equal "text/turtle; charset=utf-8" , response.content_type + end end diff --git a/test/fixtures/ontologies.yml b/test/fixtures/ontologies.yml index 28d345e73..1d9fa0daf 100644 --- a/test/fixtures/ontologies.yml +++ b/test/fixtures/ontologies.yml @@ -61,3 +61,86 @@ ontology_view: hasDomain: acl: viewOf: "ONT1" + +resource_content_formats: + json: + "@context": + ns0: "http://purl.bioontology.org/ontology/STY/" + rdf: "http://www.w3.org/1999/02/22-rdf-syntax-ns#" + owl: "http://www.w3.org/2002/07/owl#" + rdfs: "http://www.w3.org/2000/01/rdf-schema#" + skos: "http://www.w3.org/2004/02/skos/core#" + metadata_def: "http://data.bioontology.org/metadata/def/" + "@graph": + - "@id": "ns0:T071" + "@type": "owl:Class" + "rdfs:subClassOf": + "@id": "owl:Thing" + "skos:prefLabel": + "@value": "Entity" + "@language": "en" + "skos:notation": "T071" + "metadata_def:mappingSameURI": + "@id": "ns0:T071" + "metadata_def:mappingLoom": "entity" + - "@id": "ns0:T077" + "rdfs:subClassOf": + "@id": "ns0:T071" + - "@id": "ns0:T072" + "rdfs:subClassOf": + "@id": "ns0:T071" + + xml: | + + + + + Entity + T071 + + entity + + + + + + + + + + + + + + ntriples: | + . + . + "Entity"@en . + "T071" . + . + "entity" . + . + . + . + + turtle: | + @prefix rdf: . + @prefix ns0: . + @prefix owl: . + @prefix rdfs: . + @prefix skos: . + @prefix metadata_def: . + + ns0:T071 + metadata_def:mappingLoom "entity" ; + metadata_def:mappingSameURI ns0:T071 ; + a owl:Class ; + rdfs:subClassOf owl:Thing ; + skos:notation "T071" ; + skos:prefLabel "Entity"@en . + + ns0:T072 + rdfs:subClassOf ns0:T071 . + + ns0:T077 + rdfs:subClassOf ns0:T071 . \ No newline at end of file diff --git a/test/fixtures/users.yml b/test/fixtures/users.yml index eaaf3596e..4c7e88043 100644 --- a/test/fixtures/users.yml +++ b/test/fixtures/users.yml @@ -1,3 +1,7 @@ +admin: + username: johndoe + email: admin@example.com + password: password john: firstName: John lastName: Doe diff --git a/test/helpers/application_test_helpers.rb b/test/helpers/application_test_helpers.rb index 054a9f7c4..975c220ea 100644 --- a/test/helpers/application_test_helpers.rb +++ b/test/helpers/application_test_helpers.rb @@ -19,25 +19,47 @@ def sign_in_as(username) if logged_in_user && !logged_in_user.errors logged_in_user = create_user(user) end - session[:user] = logged_in_user + logged_in_user end - def create_user(user , admin: false) - unless (existent_user = LinkedData::Client::Models::User.find_by_username(user.username).first) - values = user.to_h - values[:role] = ["ADMINISTRATOR"] if admin - existent_user = LinkedData::Client::Models::User.new(values: values).save + def create_user(user, admin: false) + admin_user = LinkedData::Client::Models::User.authenticate('admin', 'password') if admin + existent_user = LinkedData::Client::Models::User.find_by_username(user.username).first + + existent_user.delete if existent_user + + values = user.to_h + values[:role] = ["ADMINISTRATOR"] if admin + existent_user = LinkedData::Client::Models::User.new(values: values) + + if admin + # Overwrite the normal ".save" to accept creating admin user + conn = Faraday.new(url: LinkedData::Client.settings.rest_url) do |faraday| + faraday.request :url_encoded + faraday.response :logger + faraday.adapter Faraday.default_adapter + faraday.headers = { + "Accept" => "application/json", + "Authorization" => "apikey token=#{admin_user.apikey}", + "User-Agent" => "NCBO API Ruby Client v0.1.0" + } + + end + conn.post(existent_user.class.collection_path, existent_user.to_hash.to_json, 'Content-Type' => 'application/json') + else + existent_user.save end existent_user.password = user.password existent_user end - def delete_users(ontologies = LinkedData::Client::Models::Ontology.all) - Array(ontologies).each do |o| + def delete_users(users = LinkedData::Client::Models::User.all) + Array(users).each do |o| LinkedData::Client::Models::Ontology.find_by_acronym(o.acronym).first&.delete end end + def delete_user(user) LinkedData::Client::Models::User.find_by_username(user.username).first&.delete end diff --git a/test/system/agent_flows_test.rb b/test/system/agent_flows_test.rb index c4272b71f..91be5fc8b 100644 --- a/test/system/agent_flows_test.rb +++ b/test/system/agent_flows_test.rb @@ -14,7 +14,7 @@ class AgentFlowsTest < ApplicationSystemTestCase def teardown delete_agents - delete_users + delete_user(@logged_user) if @logged_user end test "go admin page and create an agent person and edit it" do @@ -87,6 +87,7 @@ def edit_agent_flow(agent, person_count: , organization_count: ) agent_fill(agent, parent_id: agent.id) # assert_text "New Agent added successfully" find('.close').click + sleep 1 within "table#admin_agents" do assert_selector '.human', count: person_count + organization_count # all created agents assert_text agent.name diff --git a/test/system/content_redirection_test.rb b/test/system/content_redirection_test.rb new file mode 100644 index 000000000..bf0a35ab6 --- /dev/null +++ b/test/system/content_redirection_test.rb @@ -0,0 +1,68 @@ +require "application_system_test_case" +require 'webmock/minitest' + +class ContentRedirectionTest < ApplicationSystemTestCase + def setup + WebMock.disable! + + @sty_url = root_url + 'ontologies/STY' + @ontology_portal_uri = 'div.field-container p.field-description_text' + @htaccess_button = 'a[data-show-modal-title-value="Rewrite rules for STY ontology"]' + @redirection_modal = 'div#redirection_rules_modal' + @htaccess_code = 'div.htacess-code-container' + @nginx_code = 'div.nginx-code-container' + @contact_support_button = 'div.contact-support' + + @generate_portal_link_button = 'span#generate_portal_link' + @accordion_concept_details = '.dropdown-title-bar[data-target="#accordion-concept-details"]' + + @resource_div_formats = 'div#content_resource_formats' + @json_response = fixtures(:ontologies)["resource_content_formats"].json + @xml_response = fixtures(:ontologies)["resource_content_formats"].xml.strip + @ntriples_response = fixtures(:ontologies)["resource_content_formats"].ntriples.strip + @turtle_response = fixtures(:ontologies)["resource_content_formats"].turtle.strip + end + + test "go to STY ontology page and test the htaccess button" do + visit @sty_url + assert_selector @ontology_portal_uri, text: $SITE + ' URI' + assert_selector @htaccess_button + find(@htaccess_button).click + assert_selector(@redirection_modal, visible: true, wait: 10) + assert_selector @htaccess_code + assert_selector @nginx_code + assert_selector @contact_support_button + find('button[data-action="turbo-modal#hide"]').click + end + + test "go to STY ontology classes page and test the different format of resource" do + visit @sty_url + click_link('Classes') + assert_selector(@generate_portal_link_button, visible: true, wait: 10) + generated_uri = find(@generate_portal_link_button + " .clipboard.d-flex.align-items-center").find('div[data-clipboard-target="content"]', visible: :all).native.attribute('innerHTML').strip + assert_equal "http://localhost:3000/ontologies/STY/T071", generated_uri + find(@generate_portal_link_button, visible: :all).click + assert_selector(@accordion_concept_details, visible: true, wait: 10) + find(@accordion_concept_details, visible: :all).click + assert_selector(@resource_div_formats, visible: true) + + # test formats content + ["json", "xml", "ntriples", "turtle"].each do |format| + find("a#resource_content_#{format}", visible: true).click + assert_selector("div#resource_content_modal", visible: true, wait: 10) + content = find("div#resource_content_modal pre code", visible: true).text.strip + case format + when "json" + assert_equal JSON.parse(content), @json_response + when "xml" + assert_equal content, @xml_response + when "ntriples" + assert_equal content, @ntriples_response + when "turtle" + assert_equal content, @turtle_response + end + find('button.close[data-action="turbo-modal#hide"]').click + end + end + +end \ No newline at end of file diff --git a/test/system/login_flows_test.rb b/test/system/login_flows_test.rb index 5ed014b2c..232f9b53d 100644 --- a/test/system/login_flows_test.rb +++ b/test/system/login_flows_test.rb @@ -5,7 +5,7 @@ class LoginFlowsTest < ApplicationSystemTestCase setup do WebMock.disable! @user_john = fixtures(:users)[:john] - @user_bob = create_user(fixtures(:users)[:bob]) + @user_bob = fixtures(:users)[:bob] end teardown do From 50bad5b0c3eefba8f2006f1f8af8f94c8adcbdf1 Mon Sep 17 00:00:00 2001 From: Bilel Kihal <61744974+Bilelkihal@users.noreply.github.com> Date: Thu, 6 Jun 2024 22:29:19 +0200 Subject: [PATCH 13/57] Feature: add Annotator UI tests (#627) * setup annotator page UI tests * check if all the inputs and filters are present in annotator page test * add annotator http requests to test fixtures * test annotator results and count them * test annotator empty illustration * add comments in annotator page tests * use dynamic api in recommender tests * test that we have the exact correct annotations in the annotator test * undo adding ids for elements to run annotator tests * add a default ANNOTATOR_URL value for test config --------- Co-authored-by: Syphax bouazzouni --- app/controllers/annotator_controller.rb | 2 +- app/views/annotator/index.html.haml | 1 + config/bioportal_config_test.rb | 7 +- docker-compose.yml | 7 +- test/fixtures/annotator.yml | 181 ++++++++++++++++++++++++ test/system/annotator_page_test.rb | 108 ++++++++++++++ test/test_helper.rb | 2 + 7 files changed, 299 insertions(+), 9 deletions(-) create mode 100644 test/fixtures/annotator.yml create mode 100644 test/system/annotator_page_test.rb diff --git a/app/controllers/annotator_controller.rb b/app/controllers/annotator_controller.rb index d0cd47800..1cab35729 100644 --- a/app/controllers/annotator_controller.rb +++ b/app/controllers/annotator_controller.rb @@ -72,7 +72,7 @@ def annotator_results(uri) else @results_table_header.push(t('annotator.score')) end - annotations = LinkedData::Client::HTTP.get(uri, api_params) + annotations = LinkedData::Client::HTTP.get(uri.dup.to_s, api_params) @ontologies = get_simplified_ontologies_hash @semantic_types = get_semantic_types @results = [] diff --git a/app/views/annotator/index.html.haml b/app/views/annotator/index.html.haml index 4d5636ed6..8b83bab08 100644 --- a/app/views/annotator/index.html.haml +++ b/app/views/annotator/index.html.haml @@ -37,6 +37,7 @@ = render Input::SelectComponent.new(label: t('annotator.include_ancestors'), id: 'ancestors_level', name: 'class_hierarchy_max_level', value: @ancestors_levels, selected: params[:class_hierarchy_max_level]) .filters_line - include_score_helper = 'Score annotations following previous NCBO 2009 measure (old) or Score annotations following C-Value measure (cvalue) or Score annotations following C-Value measure with hierarchy expansion (cvalueh).' + = render Input::SelectComponent.new(label: t('annotator.include_score'), id: 'include_score', name: 'score', value: @include_score, tooltip: include_score_helper, selected: params[:score]) = render Input::NumberComponent.new(label: t('annotator.score_threshold'), name: "score_threshold", value: params[:score_threshold] || 0, tooltip: 'Specify minimum score value for annotations.') = render Input::NumberComponent.new(label: t('annotator.confidence_threshold'), name: 'confidence_threshold', value: params[:confidence_threshold] || 0, tooltip: 'Specify the minimum position in the score distribution (between 1 and 100).') diff --git a/config/bioportal_config_test.rb b/config/bioportal_config_test.rb index 44169096b..6fb4312b1 100644 --- a/config/bioportal_config_test.rb +++ b/config/bioportal_config_test.rb @@ -8,7 +8,7 @@ $API_KEY = ENV['API_KEY'] $REST_URL = ENV['API_URL'] $BIOMIXER_URL = ENV['BIOMIXER_URL'] -$ANNOTATOR_URL = $PROXY_URL = ENV['ANNOTATOR_URL'] +$ANNOTATOR_URL = $PROXY_URL = ENV['ANNOTATOR_URL'].blank? ? "https://services.tesportal.lirmm.fr/annotator" : ENV['ANNOTATOR_URL'] $FAIRNESS_URL = ENV['FAIRNESS_URL'] # Resource term @@ -218,7 +218,4 @@ } ] -$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 \ No newline at end of file +$UI_THEME = :stageportal \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 644e1ca6e..575407eb2 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -103,9 +103,10 @@ services: chrome-server: image: selenium/standalone-chrome:112.0-chromedriver-112.0-grid-4.9.0-20230421 shm_size: 2g - ports: - - "4444:4444" - - "7900:7900" + network_mode: 'host' +# ports: +# - "4444:4444" +# - "7900:7900" volumes: mysql-data: diff --git a/test/fixtures/annotator.yml b/test/fixtures/annotator.yml new file mode 100644 index 000000000..d678eb033 --- /dev/null +++ b/test/fixtures/annotator.yml @@ -0,0 +1,181 @@ +yaml_structure: regular +sample_response: + - annotatedClass: + prefLabel: Melanom + synonym: + - cilt kanseri + "@id": http://aims.fao.org/aos/agrovoc/c_4713 + "@type": http://www.w3.org/2002/07/owl#Class + links: + self: https://data.stageportal.lirmm.fr/ontologies/AGROVOC/classes/http%3A%2F%2Faims.fao.org%2Faos%2Fagrovoc%2Fc_4713 + ontology: http://localhost:9393/ontologies/STY + children: https://data.stageportal.lirmm.fr/ontologies/AGROVOC/classes/http%3A%2F%2Faims.fao.org%2Faos%2Fagrovoc%2Fc_4713/children + parents: https://data.stageportal.lirmm.fr/ontologies/AGROVOC/classes/http%3A%2F%2Faims.fao.org%2Faos%2Fagrovoc%2Fc_4713/parents + descendants: https://data.stageportal.lirmm.fr/ontologies/AGROVOC/classes/http%3A%2F%2Faims.fao.org%2Faos%2Fagrovoc%2Fc_4713/descendants + ancestors: https://data.stageportal.lirmm.fr/ontologies/AGROVOC/classes/http%3A%2F%2Faims.fao.org%2Faos%2Fagrovoc%2Fc_4713/ancestors + instances: https://data.stageportal.lirmm.fr/ontologies/AGROVOC/classes/http%3A%2F%2Faims.fao.org%2Faos%2Fagrovoc%2Fc_4713/instances + tree: https://data.stageportal.lirmm.fr/ontologies/AGROVOC/classes/http%3A%2F%2Faims.fao.org%2Faos%2Fagrovoc%2Fc_4713/tree + notes: https://data.stageportal.lirmm.fr/ontologies/AGROVOC/classes/http%3A%2F%2Faims.fao.org%2Faos%2Fagrovoc%2Fc_4713/notes + mappings: https://data.stageportal.lirmm.fr/ontologies/AGROVOC/classes/http%3A%2F%2Faims.fao.org%2Faos%2Fagrovoc%2Fc_4713/mappings + ui: http://stageportal.lirmm.fr/ontologies/AGROVOC?p=classes&conceptid=http%3A%2F%2Faims.fao.org%2Faos%2Fagrovoc%2Fc_4713 + "@context": + self: http://www.w3.org/2002/07/owl#Class + ontology: http://localhost:9393/ontologies/STY + children: http://www.w3.org/2002/07/owl#Class + parents: http://www.w3.org/2002/07/owl#Class + descendants: http://www.w3.org/2002/07/owl#Class + ancestors: http://www.w3.org/2002/07/owl#Class + instances: http://data.bioontology.org/metadata/Instance + tree: http://www.w3.org/2002/07/owl#Class + notes: http://data.bioontology.org/metadata/Note + mappings: http://data.bioontology.org/metadata/Mapping + ui: http://www.w3.org/2002/07/owl#Class + "@context": + "@vocab": http://data.bioontology.org/metadata/ + prefLabel: http://www.w3.org/2004/02/skos/core#prefLabel + synonym: http://www.w3.org/2004/02/skos/core#altLabel + "@language": en + hierarchy: [] + annotations: + - from: 1 + to: 8 + matchType: PREF + text: MELANOMA + mappings: [] + - annotatedClass: + prefLabel: Melanom + synonym: + - malignant melanoma + - melanoma patient + - melanocytes + "@id": http://data.europa.eu/8mn/euroscivoc/276b8c99-a318-48df-aa31-1f9f3e0ba910 + "@type": http://www.w3.org/2002/07/owl#Class + links: + self: https://data.stageportal.lirmm.fr/ontologies/EUROSCIVOC/classes/http%3A%2F%2Fdata.europa.eu%2F8mn%2Feuroscivoc%2F276b8c99-a318-48df-aa31-1f9f3e0ba910 + ontology: http://localhost:9393/ontologies/STY + children: https://data.stageportal.lirmm.fr/ontologies/EUROSCIVOC/classes/http%3A%2F%2Fdata.europa.eu%2F8mn%2Feuroscivoc%2F276b8c99-a318-48df-aa31-1f9f3e0ba910/children + parents: https://data.stageportal.lirmm.fr/ontologies/EUROSCIVOC/classes/http%3A%2F%2Fdata.europa.eu%2F8mn%2Feuroscivoc%2F276b8c99-a318-48df-aa31-1f9f3e0ba910/parents + descendants: https://data.stageportal.lirmm.fr/ontologies/EUROSCIVOC/classes/http%3A%2F%2Fdata.europa.eu%2F8mn%2Feuroscivoc%2F276b8c99-a318-48df-aa31-1f9f3e0ba910/descendants + ancestors: https://data.stageportal.lirmm.fr/ontologies/EUROSCIVOC/classes/http%3A%2F%2Fdata.europa.eu%2F8mn%2Feuroscivoc%2F276b8c99-a318-48df-aa31-1f9f3e0ba910/ancestors + instances: https://data.stageportal.lirmm.fr/ontologies/EUROSCIVOC/classes/http%3A%2F%2Fdata.europa.eu%2F8mn%2Feuroscivoc%2F276b8c99-a318-48df-aa31-1f9f3e0ba910/instances + tree: https://data.stageportal.lirmm.fr/ontologies/EUROSCIVOC/classes/http%3A%2F%2Fdata.europa.eu%2F8mn%2Feuroscivoc%2F276b8c99-a318-48df-aa31-1f9f3e0ba910/tree + notes: https://data.stageportal.lirmm.fr/ontologies/EUROSCIVOC/classes/http%3A%2F%2Fdata.europa.eu%2F8mn%2Feuroscivoc%2F276b8c99-a318-48df-aa31-1f9f3e0ba910/notes + mappings: https://data.stageportal.lirmm.fr/ontologies/EUROSCIVOC/classes/http%3A%2F%2Fdata.europa.eu%2F8mn%2Feuroscivoc%2F276b8c99-a318-48df-aa31-1f9f3e0ba910/mappings + ui: http://stageportal.lirmm.fr/ontologies/EUROSCIVOC?p=classes&conceptid=http%3A%2F%2Fdata.europa.eu%2F8mn%2Feuroscivoc%2F276b8c99-a318-48df-aa31-1f9f3e0ba910 + "@context": + self: http://www.w3.org/2002/07/owl#Class + ontology: http://localhost:9393/ontologies/STY + children: http://www.w3.org/2002/07/owl#Class + parents: http://www.w3.org/2002/07/owl#Class + descendants: http://www.w3.org/2002/07/owl#Class + ancestors: http://www.w3.org/2002/07/owl#Class + instances: http://data.bioontology.org/metadata/Instance + tree: http://www.w3.org/2002/07/owl#Class + notes: http://data.bioontology.org/metadata/Note + mappings: http://data.bioontology.org/metadata/Mapping + ui: http://www.w3.org/2002/07/owl#Class + "@context": + "@vocab": http://data.bioontology.org/metadata/ + prefLabel: http://www.w3.org/2004/02/skos/core#prefLabel + synonym: http://www.w3.org/2004/02/skos/core#altLabel + "@language": en + hierarchy: [] + annotations: + - from: 1 + to: 8 + matchType: PREF + text: MELANOMA + - from: 34 + to: 44 + matchType: SYN + text: MELANOCYTES + mappings: [] + - annotatedClass: + definition: + - http://opendata.inrae.fr/thesaurusINRAE/note_f18c0fe1 + prefLabel: mélanome + synonym: + - malignant melanoma + - mélanome malin + "@id": http://opendata.inrae.fr/thesaurusINRAE/c_11970 + "@type": http://www.w3.org/2002/07/owl#Class + links: + self: https://data.stageportal.lirmm.fr/ontologies/INRAETHES/classes/http%3A%2F%2Fopendata.inrae.fr%2FthesaurusINRAE%2Fc_11970 + ontology: http://localhost:9393/ontologies/STY + children: https://data.stageportal.lirmm.fr/ontologies/INRAETHES/classes/http%3A%2F%2Fopendata.inrae.fr%2FthesaurusINRAE%2Fc_11970/children + parents: https://data.stageportal.lirmm.fr/ontologies/INRAETHES/classes/http%3A%2F%2Fopendata.inrae.fr%2FthesaurusINRAE%2Fc_11970/parents + descendants: https://data.stageportal.lirmm.fr/ontologies/INRAETHES/classes/http%3A%2F%2Fopendata.inrae.fr%2FthesaurusINRAE%2Fc_11970/descendants + ancestors: https://data.stageportal.lirmm.fr/ontologies/INRAETHES/classes/http%3A%2F%2Fopendata.inrae.fr%2FthesaurusINRAE%2Fc_11970/ancestors + instances: https://data.stageportal.lirmm.fr/ontologies/INRAETHES/classes/http%3A%2F%2Fopendata.inrae.fr%2FthesaurusINRAE%2Fc_11970/instances + tree: https://data.stageportal.lirmm.fr/ontologies/INRAETHES/classes/http%3A%2F%2Fopendata.inrae.fr%2FthesaurusINRAE%2Fc_11970/tree + notes: https://data.stageportal.lirmm.fr/ontologies/INRAETHES/classes/http%3A%2F%2Fopendata.inrae.fr%2FthesaurusINRAE%2Fc_11970/notes + mappings: https://data.stageportal.lirmm.fr/ontologies/INRAETHES/classes/http%3A%2F%2Fopendata.inrae.fr%2FthesaurusINRAE%2Fc_11970/mappings + ui: http://stageportal.lirmm.fr/ontologies/INRAETHES?p=classes&conceptid=http%3A%2F%2Fopendata.inrae.fr%2FthesaurusINRAE%2Fc_11970 + "@context": + self: http://www.w3.org/2002/07/owl#Class + ontology: http://localhost:9393/ontologies/STY + children: http://www.w3.org/2002/07/owl#Class + parents: http://www.w3.org/2002/07/owl#Class + descendants: http://www.w3.org/2002/07/owl#Class + ancestors: http://www.w3.org/2002/07/owl#Class + instances: http://data.bioontology.org/metadata/Instance + tree: http://www.w3.org/2002/07/owl#Class + notes: http://data.bioontology.org/metadata/Note + mappings: http://data.bioontology.org/metadata/Mapping + ui: http://www.w3.org/2002/07/owl#Class + "@context": + "@vocab": http://data.bioontology.org/metadata/ + prefLabel: http://www.w3.org/2004/02/skos/core#prefLabel + synonym: http://www.w3.org/2004/02/skos/core#altLabel + definition: http://www.w3.org/2004/02/skos/core#definition + "@language": en + hierarchy: [] + annotations: + - from: 1 + to: 8 + matchType: PREF + text: MELANOMA + mappings: [] + - annotatedClass: + prefLabel: tumeur + synonym: + - néoplasme + - néoplasie + "@id": http://opendata.inrae.fr/thesaurusINRAE/c_11887 + "@type": http://www.w3.org/2002/07/owl#Class + links: + self: https://data.stageportal.lirmm.fr/ontologies/INRAETHES/classes/http%3A%2F%2Fopendata.inrae.fr%2FthesaurusINRAE%2Fc_11887 + ontology: http://localhost:9393/ontologies/STY + children: https://data.stageportal.lirmm.fr/ontologies/INRAETHES/classes/http%3A%2F%2Fopendata.inrae.fr%2FthesaurusINRAE%2Fc_11887/children + parents: https://data.stageportal.lirmm.fr/ontologies/INRAETHES/classes/http%3A%2F%2Fopendata.inrae.fr%2FthesaurusINRAE%2Fc_11887/parents + descendants: https://data.stageportal.lirmm.fr/ontologies/INRAETHES/classes/http%3A%2F%2Fopendata.inrae.fr%2FthesaurusINRAE%2Fc_11887/descendants + ancestors: https://data.stageportal.lirmm.fr/ontologies/INRAETHES/classes/http%3A%2F%2Fopendata.inrae.fr%2FthesaurusINRAE%2Fc_11887/ancestors + instances: https://data.stageportal.lirmm.fr/ontologies/INRAETHES/classes/http%3A%2F%2Fopendata.inrae.fr%2FthesaurusINRAE%2Fc_11887/instances + tree: https://data.stageportal.lirmm.fr/ontologies/INRAETHES/classes/http%3A%2F%2Fopendata.inrae.fr%2FthesaurusINRAE%2Fc_11887/tree + notes: https://data.stageportal.lirmm.fr/ontologies/INRAETHES/classes/http%3A%2F%2Fopendata.inrae.fr%2FthesaurusINRAE%2Fc_11887/notes + mappings: https://data.stageportal.lirmm.fr/ontologies/INRAETHES/classes/http%3A%2F%2Fopendata.inrae.fr%2FthesaurusINRAE%2Fc_11887/mappings + ui: http://stageportal.lirmm.fr/ontologies/INRAETHES?p=classes&conceptid=http%3A%2F%2Fopendata.inrae.fr%2FthesaurusINRAE%2Fc_11887 + "@context": + self: http://www.w3.org/2002/07/owl#Class + ontology: http://localhost:9393/ontologies/STY + children: http://www.w3.org/2002/07/owl#Class + parents: http://www.w3.org/2002/07/owl#Class + descendants: http://www.w3.org/2002/07/owl#Class + ancestors: http://www.w3.org/2002/07/owl#Class + instances: http://data.bioontology.org/metadata/Instance + tree: http://www.w3.org/2002/07/owl#Class + notes: http://data.bioontology.org/metadata/Note + mappings: http://data.bioontology.org/metadata/Mapping + ui: http://www.w3.org/2002/07/owl#Class + "@context": + "@vocab": http://data.bioontology.org/metadata/ + prefLabel: http://www.w3.org/2004/02/skos/core#prefLabel + synonym: http://www.w3.org/2004/02/skos/core#altLabel + "@language": en + hierarchy: [] + annotations: + - from: 25 + to: 29 + matchType: PREF + text: TUMOR + mappings: [] diff --git a/test/system/annotator_page_test.rb b/test/system/annotator_page_test.rb new file mode 100644 index 000000000..5956a75f3 --- /dev/null +++ b/test/system/annotator_page_test.rb @@ -0,0 +1,108 @@ +require "application_system_test_case" +require 'webmock/minitest' + +class AnnotatorPageTest < ApplicationSystemTestCase + def setup + WebMock.disable! + @apikey = LinkedData::Client.settings.apikey + @annotator_api = $ANNOTATOR_URL + @host = "#{@annotator_api.split('/')[-2]}:443" + @annotator_text_area = ".annotator-page-text-area > textarea" + @sample_response = fixtures(:annotator)["sample_response"] + end + + def teardown + WebMock.disable! + end + + test "go to annotator page and check if all the inputs and filters are there" do + visit root_url + click_link(href: '/annotator') + assert_selector @annotator_text_area + assert_selector 'div.insert-sample-text-button' + # Check if there are the annotator's options + assert_selector 'label[for="chips-whole_word_only-check"]' + assert_selector 'label[for="chips-longest_only-check"]' + assert_selector 'label[for="chips-expand_mappings-check"]' + assert_selector 'label[for="chips-exclude_numbers-check"]' + assert_selector 'label[for="chips-exclude_synonyms-check"]' + assert_selector 'div.select-ontologies' + + # Open the advanced options + find('div.advanced-options-button').click + + # Check if there are the advanced options + assert_selector 'input#select_umls_semantic_types-ts-control', visible: :all + assert_selector 'input#select_umls_semantic_groups-ts-control', visible: :all + assert_selector 'input#select_ancestors_level-ts-control', visible: :all + assert_selector 'input#select_include_score-ts-control', visible: :all + assert_selector 'input[name="score_threshold"]' + assert_selector 'input[name="confidence_threshold"]' + assert_selector 'label[for="chips-fast_context-check"]' + assert_selector 'label[for="chips-lemmatize-check"]' + end + + test "go to annotator page insert sample text and get annotations" do + visit root_url + click_link(href: '/annotator') + + # Fill the annotator's text area input by a sample text + find(@annotator_text_area).fill_in(with: 'Melanoma is a malignant tumor of melanocytes found mainly') + + # Mock the api call for the annotator with the entered text + WebMock.enable! + stub_request(:get, "#{@annotator_api}?class_hierarchy_max_level=None&confidence_threshold=0&score_threshold=0&text=Melanoma%20is%20a%20malignant%20tumor%20of%20melanocytes%20found%20mainly&whole_word_only=true") + .with( + headers: { + 'Accept'=>'application/json', + 'Authorization'=>"apikey token=#{@apikey}", + 'Host'=> @host, + 'User-Agent'=>'NCBO API Ruby Client v0.1.0' + }) + .to_return(status: 200, body: @sample_response.to_json, headers: {}) + + + find(".annotator-page-button #annotator").click + + # Check if we get the table of annotations + assert_selector 'table#annotator-table' + + # Check if the number of annotations is 4 + assert_equal 5, page.all('tr').count + + # Check if we got the correct annotations + assert_selector 'a[href="ontologies/AGROVOC/classes/http%3A%2F%2Faims.fao.org%2Faos%2Fagrovoc%2Fc_4713"]', text: 'Melanom' + assert_selector 'a[href="ontologies/EUROSCIVOC/classes/http%3A%2F%2Fdata.europa.eu%2F8mn%2Feuroscivoc%2F276b8c99-a318-48df-aa31-1f9f3e0ba910"]', text: 'Melanom' + assert_selector 'a[href="ontologies/INRAETHES/classes/http%3A%2F%2Fopendata.inrae.fr%2FthesaurusINRAE%2Fc_11970"]', text: 'mélanome' + assert_selector 'a[href="ontologies/INRAETHES/classes/http%3A%2F%2Fopendata.inrae.fr%2FthesaurusINRAE%2Fc_11887"]', text: 'tumeur' + + # Check if the action buttons below the table are there (json, rdf, cite us and api doc buttons) + assert_selector '#annotator_json' + assert_selector '#annotator_rdf' + assert_selector '#annotator_cite_us' + assert_selector '#annotator_api_doc' + + # Clear the sample text in the annotator text area + find(@annotator_text_area).native.clear + + # Fill it with a text that will return an empty state + find(@annotator_text_area).fill_in(with: 'mainly') + + # Mock the api call of the annotator to get and return an empty result + stub_request(:get, "#{@annotator_api}?class_hierarchy_max_level=None&confidence_threshold=0&score_threshold=0&text=mainly&whole_word_only=true") + .with( + headers: { + 'Accept'=>'application/json', + 'Authorization'=>"apikey token=#{@apikey}", + 'Host'=> @host, + 'User-Agent'=>'NCBO API Ruby Client v0.1.0' + }) + .to_return(status: 200, body: ([]).to_json, headers: {}) + + find(".annotator-page-button #annotator").click + + # Check if we got the empty state correctly + assert_selector 'div.browse-empty-illustration' + end + +end \ No newline at end of file diff --git a/test/test_helper.rb b/test/test_helper.rb index e8f7cf84a..af7973062 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -2,6 +2,7 @@ require_relative '../config/environment' require 'rails/test_help' require 'simplecov' +require 'webmock/minitest' SimpleCov.start 'rails' do add_filter '/bin/' @@ -16,6 +17,7 @@ class ActiveSupport::TestCase # Add more helper methods to be used by all tests here... + WebMock.allow_net_connect! Capybara.server_host = "0.0.0.0" Capybara.app_host = "http://#{Socket.gethostname}:#{Capybara.server_port}" From f8d117662e4c42413a681a2490bdeccf12375bec Mon Sep 17 00:00:00 2001 From: Bilel Kihal <61744974+Bilelkihal@users.noreply.github.com> Date: Thu, 6 Jun 2024 22:30:07 +0200 Subject: [PATCH 14/57] Fix: multiple highlighted terms in concepts date view (#657) * Fix multiple highlighted terms in the date view * refactor concepts by date method code --- app/helpers/concepts_helper.rb | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/app/helpers/concepts_helper.rb b/app/helpers/concepts_helper.rb index 06949543e..fc1f1cf41 100644 --- a/app/helpers/concepts_helper.rb +++ b/app/helpers/concepts_helper.rb @@ -105,12 +105,12 @@ def same_period?(year, month, date) year.eql?(date.year) && month.eql?(date.strftime('%B')) end - def concepts_li_list(concepts, auto_click: false) + def concepts_li_list(concepts, auto_click: false, selected_id: nil) out = '' concepts.each do |concept| children_link, data, href = concept_tree_data(@ontology.acronym, concept, request_lang, []) out += render TreeLinkComponent.new(child: concept, href: href, - children_href: '#', selected: concept.id.eql?(concepts.first.id) && auto_click, + children_href: '#', selected: concept.id.eql?(selected_id) && auto_click, target_frame: 'concept_show', data: data) end out @@ -132,15 +132,14 @@ def render_concepts_by_dates(auto_click: false) tmp = {} tmp[first_year] = first_month_concepts @concepts_year_month = tmp.merge(@concepts_year_month) - + selected_id = @concepts.first.id if @page.page.eql?(1) @concepts_year_month.each do |year, month_concepts| month_concepts.each do |month, concepts| out += "
    #{month + ' ' + year.to_s}" - out += concepts_li_list(concepts, auto_click: auto_click) + out += concepts_li_list(concepts, auto_click: auto_click, selected_id: selected_id) out += "
" end end - raw out end From fac674797a6828f728cc31f9e998fc2ccaa07039 Mon Sep 17 00:00:00 2001 From: Bilel Kihal <61744974+Bilelkihal@users.noreply.github.com> Date: Thu, 6 Jun 2024 22:49:51 +0200 Subject: [PATCH 15/57] Fix: concept details table layout max-with when long strings (#649) * fix concepts table layout when we put very long strings * fix concepts json button position * use a css class intead of an id for the concepts_json_button * move concepts_json_button css class from concept details file to concepts file * remvoe #concepts_json_link unsued style --------- Co-authored-by: Syphax Bouazzouni --- app/assets/stylesheets/components/concept_details.scss | 4 ++++ app/assets/stylesheets/concepts.scss | 4 ++-- app/views/concepts/_show.html.haml | 3 ++- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/app/assets/stylesheets/components/concept_details.scss b/app/assets/stylesheets/components/concept_details.scss index 47b0eb326..c61a0170a 100644 --- a/app/assets/stylesheets/components/concept_details.scss +++ b/app/assets/stylesheets/components/concept_details.scss @@ -6,4 +6,8 @@ .concept_details_component table th { width: 220px; +} + +.concept_details_component td, .concept_details_component th{ + max-width: 200px; } \ No newline at end of file diff --git a/app/assets/stylesheets/concepts.scss b/app/assets/stylesheets/concepts.scss index ec392466a..789ee738c 100644 --- a/app/assets/stylesheets/concepts.scss +++ b/app/assets/stylesheets/concepts.scss @@ -162,7 +162,7 @@ div.synonym-change-request button { display: inline !important; } -#concepts_json_link{ - margin-top: -4px; +.concepts_json_button{ margin-right: 5px; + margin-top: -4px; } \ No newline at end of file diff --git a/app/views/concepts/_show.html.haml b/app/views/concepts/_show.html.haml index 5efc05478..a30f061fd 100644 --- a/app/views/concepts/_show.html.haml +++ b/app/views/concepts/_show.html.haml @@ -11,7 +11,8 @@ = link_to("#classPermalinkModal", class: "class-permalink nav-link", title: t('concepts.permanent_link_class'), aria: {label: t('concepts.permanent_link_class')}, data: {toggle: "modal", current_purl: "#{@current_purl}"}) do %i{class: "fas fa-link", aria: {hidden: "true"}} %div{'data-concepts-json-target': 'button'} - = render RoundedButtonComponent.new(link: "#{@ontology.id}/classes/#{escape(@concept.id)}?display=all&apikey=#{get_apikey}", target:'_blank') + .concepts_json_button + = render RoundedButtonComponent.new(link: "#{@ontology.id}/classes/#{escape(@concept.id)}?display=all&apikey=#{get_apikey}", target:'_blank') - apikey = "apikey=#{get_apikey}" - baseClassUrl = "#{@ontology.id}/classes/#{escape(@concept.id)}" - c.item(title: t('concepts.details'), path: '#details', selected: true, json_link: "#{baseClassUrl}?#{apikey}&display=all") From 500635c369ee86c6542ff542dd6aeb97a95877f2 Mon Sep 17 00:00:00 2001 From: Syphax bouazzouni Date: Fri, 7 Jun 2024 09:07:50 +0200 Subject: [PATCH 16/57] Feature: Clean no more used gems and code (#658) * remove cube ruby * remove not used gems and add documentation to the Gemfile * remove miniprofiler * remove bpdi resolver and redirect_to_new_api * remove ajax proxy and no more used helpers * remove no more used helpers --- Gemfile | 161 +- Gemfile.lock | 74 +- app/controllers/ajax_proxy_controller.rb | 86 - app/controllers/annotator_controller.rb | 8 +- app/controllers/application_controller.rb | 280 +- app/controllers/concepts_controller.rb | 44 +- app/controllers/notes_controller.rb | 5 - app/controllers/ontologies_controller.rb | 19 +- app/controllers/search_controller.rb | 3 - app/helpers/application_helper.rb | 130 +- app/helpers/components_helper.rb | 17 + app/helpers/home_helper.rb | 1 - app/models/bpid_resolver.rb | 46 - app/views/mappings/_form.html.haml | 2 +- config/bioportal_config_test.rb | 2 - config/initializers/cube_reporter.rb | 43 - config/initializers/miniprofiler.rb | 2 - config/routes.rb | 35 +- lib/resolver/acronym_from_virtual.rb | 535 -- lib/resolver/virtual_from_acronym.rb | 533 -- lib/resolver/virtual_from_version.rb | 7144 --------------------- 21 files changed, 142 insertions(+), 9028 deletions(-) delete mode 100644 app/controllers/ajax_proxy_controller.rb delete mode 100644 app/models/bpid_resolver.rb delete mode 100644 config/initializers/cube_reporter.rb delete mode 100644 config/initializers/miniprofiler.rb delete mode 100644 lib/resolver/acronym_from_virtual.rb delete mode 100644 lib/resolver/virtual_from_acronym.rb delete mode 100644 lib/resolver/virtual_from_version.rb diff --git a/Gemfile b/Gemfile index 34aad240b..f58f618a1 100644 --- a/Gemfile +++ b/Gemfile @@ -1,83 +1,107 @@ source 'https://rubygems.org' +# Main Rails gem # Bundle edge Rails instead: gem 'rails', github: 'rails/rails' gem 'rails', '7.0.3' -gem 'chart-js-rails' +# JavaScript bundling for Rails gem 'jsbundling-rails' -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 -# gem 'duktape' +# Chart.js integration for Rails +gem 'chart-js-rails' + +# SassC as a replacement for sass-rails +gem 'sassc-rails' # sass-rails replacement +# Terser JavaScript minifier as a replacement for Uglifier +gem 'terser' # uglifier replacement + +# Bootstrap front-end framework gem 'bootstrap', '~> 4.2.0' + +# jQuery integration for Rails gem 'jquery-rails' + +# jQuery UI integration for Rails gem 'jquery-ui-rails' -# The original asset pipeline for Rails [https://github.com/rails/sprockets-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] +# Use the Puma web server +# [https://github.com/puma/puma] gem 'puma', '~> 5.0' -# Use JavaScript with ESM import maps [https://github.com/rails/importmap-rails] +# Use JavaScript with ESM import maps +# [https://github.com/rails/importmap-rails] gem 'importmap-rails' -# Hotwire's SPA-like page accelerator [https://turbo.hotwired.dev] +# Hotwire's SPA-like page accelerator +# [https://turbo.hotwired.dev] gem 'turbo-rails' -# Hotwire's modest JavaScript framework [https://stimulus.hotwired.dev] +# Hotwire's modest JavaScript framework +# [https://stimulus.hotwired.dev] gem 'stimulus-rails' -# Build JSON APIs with ease [https://github.com/rails/jbuilder] -# gem "jbuilder" - -# Windows does not include zoneinfo files, so bundle the tzinfo-data gem +# Time zone info for Windows platforms gem 'tzinfo-data', platforms: %i[mingw mswin x64_mingw jruby] -# To use ActiveModel has_secure_password -# gem 'bcrypt-ruby', '~> 3.0.0' - # Reduces boot times through caching; required in config/boot.rb - gem 'bootsnap', require: false -gem 'cube-ruby', require: 'cube' +# Memcached client for Ruby gem 'dalli' -gem 'ffi', '~> 1.16.3' -gem 'flag-icons-rails', '~> 3.4' -gem 'flamegraph' + +# GraphQL client for Ruby gem 'graphql-client' + +# Haml template engine for Ruby on Rails gem 'haml', '~> 5.1' + +# Internationalization (i18n) gem 'i18n' -gem 'iconv' -gem 'inline_svg' -gem 'iso-639', '~> 0.3.6' -gem 'lookbook', '~> 1.5.5' -gem 'multi_json' +gem 'rails-i18n', '~> 7.0.0' + +# MySQL database adapter gem 'mysql2' + +# JSON parsing libraries +gem 'multi_json' 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 'rack-mini-profiler' -gem 'rails_autolink' -gem 'rails-i18n', '~> 7.0.0' -gem 'rdoc' + +# Google reCAPTCHA integration gem 'recaptcha', '~> 5.9.0' + +# Simple HTTP and REST client for Ruby gem 'rest-client' -gem 'stackprof', require: false -gem 'thin' -gem 'turnout' + +# View components framework for Rails +gem 'lookbook', '~> 1.5.5' gem 'view_component', '~> 2.72' + +# Pagination library for Rails gem 'will_paginate', '~> 3.0' +# Render SVG files in Rails views +gem 'inline_svg' + +# ISO language codes and flags +gem 'flag-icons-rails', '~> 3.4' +gem 'iso-639', '~> 0.3.6' + +# Custom API client +gem 'ontologies_api_client', git: 'https://github.com/ontoportal-lirmm/ontologies_api_ruby_client.git', branch: 'development' + +# Ruby 2.7.8 pinned gems (to remove when migrating to Ruby >= 3.0) +gem 'ffi', '~> 1.16.3' +gem 'net-ftp', '~> 0.2.0', require: false +gem 'net-http', '~> 0.3.2' + # Multi-Provider Authentication gem 'omniauth' +gem 'omniauth-rails_csrf_protection' gem 'omniauth-github' gem 'omniauth-google-oauth2' gem 'omniauth-keycloak' @@ -85,9 +109,13 @@ gem 'omniauth-orcid' gem 'omniauth-rails_csrf_protection' group :staging, :production, :appliance do - # application monitoring - gem 'newrelic_rpm', '< 9.10.0' - # logs in json format, useful for shipping logs to logstash + # Application performance monitoring + gem 'newrelic_rpm' + + # Error monitoring + gem 'bugsnag', '~> 6.26' + + # Logs in JSON format, useful for shipping logs to logstash # gem 'rackstash', git: 'https://github.com/planio-gmbh/rackstash.git' # gem 'logstash-logger' end @@ -102,40 +130,49 @@ group :development do gem 'capistrano-rails', '~> 1.4', require: false gem 'capistrano-yarn', require: false gem 'ed25519', '>= 1.2', '< 2.0', require: false # https://github.com/miloserdow/capistrano-deploy/issues/42 - gem 'html2haml' - gem 'listen' - # static code analysis + + # Static code analysis gem 'brakeman', require: false gem 'rubocop', require: false - # gem 'i18n-debug' + + # Haml support for Rails + gem 'haml-rails' + gem 'html2haml' + + # Debugging tools # See https://guides.rubyonrails.org/debugging_rails_applications.html#debugging-with-the-debug-gem + gem 'pry' gem 'debug', platforms: %i[mri mingw x64_mingw] - # Use console on exceptions pages [https://github.com/rails/web-console] - gem 'i18n-tasks' - gem 'i18n-tasks-csv', '~> 1.1' + # Use console on exceptions pages + # [https://github.com/rails/web-console] gem 'web-console' + # Internationalization tasks + # gem 'i18n-debug' + gem 'i18n-tasks' + gem 'i18n-tasks-csv', '~> 1.1' gem 'deepl-rb' - gem 'haml-rails' - gem 'letter_opener_web', '~> 2.0' -end -group :test, :development do - gem 'rspec-rails' + # Email preview in the browser + gem 'letter_opener_web', '~> 2.0' end group :test do - # Use system testing [https://guides.rubyonrails.org/testing.html#system-testing] + # System testing + # [https://guides.rubyonrails.org/testing.html#system-testing] gem 'capybara' + + # WebDriver for system testing gem 'selenium-webdriver' + + # Code coverage generation gem 'simplecov', require: false gem 'simplecov-cobertura' # for codecov.io - # gem 'webdrivers' - gem 'webmock' -end -gem 'net-ftp', '~> 0.2.0', require: false -gem 'net-http', '~> 0.3.2' + # Mock HTTP requests in tests + gem 'webmock' -gem 'bugsnag', '~> 6.26' + # Testing framework for Rails + gem 'rspec-rails' +end diff --git a/Gemfile.lock b/Gemfile.lock index 5c78134fd..59e6f7fa8 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -92,7 +92,6 @@ GEM execjs (~> 2) base64 (0.2.0) bcrypt_pbkdf (1.1.1) - bcrypt_pbkdf (1.1.1-arm64-darwin) bcrypt_pbkdf (1.1.1-x86_64-darwin) bigdecimal (3.1.8) bindata (2.5.0) @@ -143,8 +142,6 @@ GEM crass (1.0.6) css_parser (1.17.1) addressable - cube-ruby (0.0.3) - daemons (1.4.1) dalli (3.2.8) date (3.3.4) debug (1.9.2) @@ -157,7 +154,6 @@ GEM ed25519 (1.3.0) erubi (1.12.0) erubis (2.7.0) - eventmachine (1.2.7) excon (0.110.0) execjs (2.9.1) faraday (2.0.1) @@ -174,7 +170,6 @@ GEM 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.3.4) @@ -217,7 +212,6 @@ GEM terminal-table (>= 1.5.1) i18n-tasks-csv (1.1) i18n-tasks (~> 0.9) - iconv (1.0.8) importmap-rails (2.0.1) actionpack (>= 6.0.0) activesupport (>= 6.0.0) @@ -320,14 +314,6 @@ GEM netrc (0.11.0) newrelic_rpm (9.9.0) nio4r (2.7.3) - nokogiri (1.15.6-aarch64-linux) - racc (~> 1.4) - nokogiri (1.15.6-arm-linux) - racc (~> 1.4) - nokogiri (1.15.6-arm64-darwin) - racc (~> 1.4) - nokogiri (1.15.6-x86-linux) - racc (~> 1.4) nokogiri (1.15.6-x86_64-darwin) racc (~> 1.4) nokogiri (1.15.6-x86_64-linux) @@ -367,8 +353,7 @@ GEM omniauth-rails_csrf_protection (1.0.2) actionpack (>= 4.2) omniauth (~> 2.0) - open_uri_redirections (0.2.1) - parallel (1.25.1) + parallel (1.24.0) parser (3.3.2.0) ast (~> 2.4.1) racc @@ -376,16 +361,13 @@ GEM pry (0.14.2) coderay (~> 1.1) method_source (~> 1.0) - psych (3.3.4) + psych (5.1.2) + stringio public_suffix (5.0.5) puma (5.6.8) nio4r (~> 2.0) racc (1.8.0) rack (2.2.9) - rack-accept (0.4.5) - rack (>= 0.4) - rack-mini-profiler (3.3.1) - rack (>= 1.2.0) rack-protection (3.2.0) base64 (>= 0.1.0) rack (~> 2.2, >= 2.2.4) @@ -415,13 +397,9 @@ GEM rails-i18n (7.0.9) i18n (>= 0.7, < 2) railties (>= 6.0.0, < 8) - rails_autolink (1.1.8) - actionview (> 3.1) - activesupport (> 3.1) - railties (> 3.1) - railties (7.0.3) - actionpack (= 7.0.3) - activesupport (= 7.0.3) + railties (7.0.7) + actionpack (= 7.0.7) + activesupport (= 7.0.7) method_source rake (>= 12.2) thor (~> 1.0) @@ -431,7 +409,8 @@ GEM rb-fsevent (0.11.2) rb-inotify (0.11.1) ffi (~> 1.0) - rdoc (6.3.4.1) + rdoc (6.7.0) + psych (>= 4.0.0) recaptcha (5.9.0) json redcarpet (3.6.0) @@ -524,19 +503,15 @@ GEM net-scp (>= 1.1.2) net-sftp (>= 2.1.2) net-ssh (>= 2.8.0) - stackprof (0.2.26) stimulus-rails (1.3.3) railties (>= 6.0.0) + stringio (3.1.0) strscan (3.1.0) temple (0.10.3) terminal-table (3.0.2) unicode-display_width (>= 1.1.1, < 3) terser (1.2.2) 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.3.1) tilt (2.3.0) time (0.3.0) @@ -546,11 +521,6 @@ GEM actionpack (>= 6.0.0) activejob (>= 6.0.0) railties (>= 6.0.0) - turnout (2.5.0) - i18n (>= 0.7, < 2) - rack (>= 1.3, < 3) - rack-accept (~> 0.4) - tilt (>= 1.4, < 3) tzinfo (2.0.6) concurrent-ruby (~> 1.0) unicode-display_width (2.5.0) @@ -580,17 +550,7 @@ GEM zeitwerk (2.6.15) PLATFORMS - aarch64-linux - aarch64-linux-gnu - aarch64-linux-musl - arm-linux - arm-linux-gnu - arm-linux-musl - arm64-darwin - x86-linux - x86-linux-gnu - x86-linux-musl - x86_64-darwin + x86_64-darwin-23 x86_64-linux x86_64-linux-gnu x86_64-linux-musl @@ -609,14 +569,12 @@ DEPENDENCIES capistrano-yarn capybara chart-js-rails - cube-ruby dalli debug deepl-rb ed25519 (>= 1.2, < 2.0) ffi (~> 1.16.3) flag-icons-rails (~> 3.4) - flamegraph graphql-client haml (~> 5.1) haml-rails @@ -624,7 +582,6 @@ DEPENDENCIES i18n i18n-tasks i18n-tasks-csv (~> 1.1) - iconv importmap-rails inline_svg iso-639 (~> 0.3.6) @@ -632,7 +589,6 @@ DEPENDENCIES jquery-ui-rails jsbundling-rails letter_opener_web (~> 2.0) - listen lookbook (~> 1.5.5) multi_json mysql2 @@ -647,15 +603,10 @@ DEPENDENCIES omniauth-orcid omniauth-rails_csrf_protection ontologies_api_client! - open_uri_redirections pry - psych (< 4) puma (~> 5.0) - rack-mini-profiler - rails (= 7.0.3) + rails (= 7.0.7) rails-i18n (~> 7.0.0) - rails_autolink - rdoc recaptcha (~> 5.9.0) rest-client rspec-rails @@ -665,12 +616,9 @@ DEPENDENCIES simplecov simplecov-cobertura sprockets-rails - stackprof stimulus-rails terser - thin turbo-rails - turnout tzinfo-data view_component (~> 2.72) web-console diff --git a/app/controllers/ajax_proxy_controller.rb b/app/controllers/ajax_proxy_controller.rb deleted file mode 100644 index 37de21288..000000000 --- a/app/controllers/ajax_proxy_controller.rb +++ /dev/null @@ -1,86 +0,0 @@ -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 - - end - - def jsonp - if params[:apikey].nil? || params[:apikey].empty? - render_json '{ "error": "Must supply apikey" }' - return - end - - if params[:path].nil? || params[:path].empty? - render_json '{ "error": "Must supply path" }' - return - end - - 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]}" - http = Net::HTTP.new(url.host, url.port) - 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} - 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 - 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({}, params[:conceptid]) - concept_not_found(params[:conceptid]) if @concept.nil? - - 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? - simple_ontology = simplify_ontology_model(@ontology) # application_controller (cached) - render_json simple_ontology.to_json - 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)) - end - -end diff --git a/app/controllers/annotator_controller.rb b/app/controllers/annotator_controller.rb index 1cab35729..aabf5ecf2 100644 --- a/app/controllers/annotator_controller.rb +++ b/app/controllers/annotator_controller.rb @@ -73,7 +73,7 @@ def annotator_results(uri) @results_table_header.push(t('annotator.score')) end annotations = LinkedData::Client::HTTP.get(uri.dup.to_s, api_params) - @ontologies = get_simplified_ontologies_hash + @ontologies = LinkedData::Client::Models::Ontology.all({:include_views => true}).map{ |o| [o.id.to_s, o]}.to_h @semantic_types = get_semantic_types @results = [] annotations.each do |annotation| @@ -161,14 +161,14 @@ def get_semantic_types end def annotation_class_info(cls) - return { + { text: cls.prefLabel, link: url_to_endpoint(cls.links["self"]) } end def annotation_ontology_info(ontology_url) - return { - text: @ontologies[ontology_url][:name], + { + text: @ontologies[ontology_url].name, link: url_to_endpoint(ontology_url) } end diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 04215413c..4d5f32984 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -53,15 +53,6 @@ def detect_locale # Pull configuration parameters for REST connection. REST_URI = $REST_URL API_KEY = $API_KEY - PROXY_URI = $PROXY_URL - REST_URI_BATCH = REST_URI + '/batch' - - # Rails.cache expiration - EXPIRY_RI_STATS = 60 * 60 * 24 # 24:00 hours - EXPIRY_RI_ONTOLOGIES = 60 * 60 * 24 # 24:00 hours - EXPIRY_SEMANTIC_TYPES = 60 * 60 * 24 # 24:00 hours - EXPIRY_RECENT_MAPPINGS = 60 * 60 # 1:00 hours - EXPIRY_ONTOLOGY_SIMPLIFIED = 60 * 1 # 0:01 minute $DATA_CATALOG_VALUES = {"fairsharing.org/" => "FAIRsharing", @@ -90,13 +81,12 @@ def detect_locale # 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, :clean_empty_strings_from_params_arrays, :init_trial_license def invalidate_cache? params[:invalidate_cache] && params[:invalidate_cache].to_s.eql?('true') end - def show_image_modal url = params[:url] render turbo_stream: helpers.prepend('application_modal_content') { helpers.image_tag(url, style:'width: 100%') } @@ -139,8 +129,6 @@ def domain_ontology_set Thread.current[:slice] = @subdomain_filter end - - def ontology_not_found(ontology_acronym) not_found(t('application.ontology_not_found',acronym: ontology_acronym)) end @@ -158,14 +146,6 @@ def not_found(message = '') raise ActiveRecord::RecordNotFound.new(message || t('application.not_found_message')) end - NOTIFICATION_TYPES = { :notes => "CREATE_NOTE_NOTIFICATION", :all => "ALL_NOTIFICATION" } - - def to_param(name) # Paramaterizes URLs without encoding - unless name.nil? - name.to_s.gsub(' ',"_") - end - end - def bp_config_json # For config settings, see # config/bioportal_config.rb @@ -191,37 +171,9 @@ def bp_config_json config.to_json end - def rest_url helpers.rest_url end - - def check_http_file(url) - session = Net::HTTP.new(url.host, url.port) - session.use_ssl = true if url.port == 443 - session.start do |http| - response_valid = http.head(url.request_uri).code.to_i < 400 - return response_valid - end - end - - 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 - # Check using another method - path = uri.path.split("/") - filename = path.pop - path = path.join("/") - ftp.chdir(path) - files = ftp.dir - # Dumb check, just see if the filename is somewhere in the list - files.each { |file| return true if file.include?(filename) } - end - file_exists - end def parse_response_body(response) return nil if response.nil? @@ -285,55 +237,6 @@ def redirect_to_home # Redirect to Home Page redirect_to "/" end - - def redirect_new_api(class_view = false) - # Hack to make ontologyid and conceptid work in addition to id and ontology params - params[:ontology] = params[:ontology].nil? ? params[:ontologyid] : params[:ontology] - # Error checking - if params[:ontology].nil? || params[:id] && params[:ontology].nil? - @error = t('application.provide_ontology_or_concept') - 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 - else - 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 - end - - def params_string_for_redirect(params, options = {}) - prefix = options[:prefix] || "?" - stop_words = options[:stop_words] || ["ontology", "controller", "action", "id", "acronym"] - params_array = [] - 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('&')}" - end - - # rack-mini-profiler authorization - def authorize_miniprofiler - if params[:enable_profiler] && params[:enable_profiler].eql?("true") && session[:user] && session[:user].admin? - Rack::MiniProfiler.authorize_request - else - Rack::MiniProfiler.deauthorize_request - end - end - # Verifies if user is logged in def authorize_and_redirect unless session[:user] @@ -341,7 +244,6 @@ def authorize_and_redirect end end - def authorize_admin admin = session[:user] && session[:user].admin? redirect_to_home unless admin @@ -356,7 +258,6 @@ def ontology_restricted?(acronym) restrict_downloads.include? acronym 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 @@ -465,7 +366,6 @@ def get_class(params) @concept end - def get_ontology_submission_ready(ontology) # Get the latest 'ready' submission submission = ontology.explore.latest_submission({:include_status => 'ready'}) @@ -474,121 +374,6 @@ def get_ontology_submission_ready(ontology) return submission end - 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) } - rescue Exception => e - LOG.add :error, e.message - return nil - end - return simple_ontologies - end - - - - def simplify_classes(classes) - # Simplify the classes batch service data for the UI - # 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", - # :uri => "http://stagedata.bioontology.org/ontologies/NCIT/classes/http%3A%2F%2Fncicb.nci.nih.gov%2Fxml%2Fowl%2FEVS%2FThesaurus.owl%23C12439", - # :prefLabel => "Brain", - # :ontology => { - # :id => "http://stagedata.bioontology.org/ontologies/NCIT", - # :uri => "http://stagedata.bioontology.org/ontologies/NCIT", - # :acronym => "NCIT", - # :name => "National Cancer Institute Thesaurus", - # :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] ] - classes_hash[c[:id]] = c - end - return 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 } - 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'] - } - # Try to carry through a prefLabel and the obsolete attribute, if they exist. - cls[:prefLabel] = cls_model['prefLabel'] - cls[:obsolete] = cls_model['obsolete'] || false - else - # 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'], - } - # Try to carry through a prefLabel and the obsolete attribute, if they exist. - cls[:prefLabel] = cls_model.prefLabel if cls_model.respond_to?('prefLabel') - cls[:obsolete] = cls_model.respond_to?('obsolete') && cls_model.obsolete || false - end - rescue Exception => e - LOG.add :error, e.message - LOG.add :error, t('application.error_simplify_class', cls: cls) - end - return cls - end - - def simplify_ontology_model(ont_model) - id = nil - if ont_model.instance_of? Hash - id = ont_model['@id'] - elsif ont_model.instance_of? LinkedData::Client::Models::Ontology - id = ont_model.id - end - ont = Rails.cache.read(id) - return ont unless ont.nil? - # No cache or it has expired - LOG.add :debug, t('application.no_cache', id: id) - ont = {} - ont[:id] = id - ont[:uri] = id - if ont_model.instance_of? Hash - ont[:acronym] = ont_model['acronym'] - ont[:name] = ont_model['name'] - ont[:ui] = ont_model['links']['ui'] - else - # try to work with a struct object or a LinkedData::Client::Models::Ontology - # if not a struct, then: ont_model.instance_of? LinkedData::Client::Models::Ontology - ont[:acronym] = ont_model.acronym - ont[:name] = ont_model.name - ont[:ui] = ont_model.links['ui'] - end - # 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 t('application.incomplete_simple_ontology', id: id, ont: ont) - else - Rails.cache.write(ont[:id], ont, expires_in: EXPIRY_ONTOLOGY_SIMPLIFIED) - end - return ont - end - def get_apikey() apikey = API_KEY if session[:user] @@ -597,69 +382,6 @@ def get_apikey() return apikey end - def parse_json(uri) - uri = URI.parse(uri) - begin - response = open(uri, "Authorization" => "apikey token=#{get_apikey}").read - rescue Exception => error - @retries ||= 0 - if @retries < 1 # retry once only - @retries += 1 - retry - else - raise error - end - 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 - @retries ||= 0 - 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 - end - end - response - end - - # Get the latest manual mappings - # All mapping classes are bidirectional. - # Each class in the list maps to all other classes in the list. - def get_recent_mappings - recent_mappings = { - :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?) - # No cache or it has expired - class_details = {} - 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 - Rails.cache.write(cached_mappings_key, recent_mappings, expires_in: EXPIRY_RECENT_MAPPINGS) - end - rescue Exception => e - LOG.add :error, e.message - # leave recent mappings empty. - end - return recent_mappings - end - def total_mapping_count total_count = 0 diff --git a/app/controllers/concepts_controller.rb b/app/controllers/concepts_controller.rb index 96a5fd0b7..7c86bb48f 100644 --- a/app/controllers/concepts_controller.rb +++ b/app/controllers/concepts_controller.rb @@ -66,35 +66,17 @@ 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 - return - end - render LabelLinkComponent.inline(cls_id, helpers.main_language_label(concept_label(ont_id, cls_id))) 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 - return - end + @ontology = LinkedData::Client::Models::Ontology.find(params[:ontology]) cls = @ontology.explore.single_class(params[:concept]) 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 - return - end @ontology = LinkedData::Client::Models::Ontology.find_by_acronym(params[:ontology]).first if @ontology.nil? || @ontology.errors ontology_not_found(params[:ontology]) @@ -139,12 +121,6 @@ def show_date_sorted_list 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 - return - end @ontology = LinkedData::Client::Models::Ontology.find_by_acronym(params[:ontology]).first ontology_not_found(params[:ontology]) if @ontology.nil? @root = @ontology.property_tree @@ -153,15 +129,7 @@ def property_tree # Renders a details pane for a given ontology/concept def details - concept_not_found('') if params[:conceptid].nil? || params[:conceptid].empty? - - if params[:ontology].to_i > 0 - 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 - return - end + concept_not_found(params[:conceptid]) if params[:conceptid].blank? @ontology = LinkedData::Client::Models::Ontology.find_by_acronym(params[:ontology]).first ontology_not_found(params[:ontology]) if @ontology.nil? @@ -169,12 +137,8 @@ def details @concept = @ontology.explore.single_class({full: true}, CGI.unescape(params[:conceptid])) concept_not_found(CGI.unescape(params[:conceptid])) if @concept.nil? || @concept.errors @container_id = params[:modal] ? 'application_modal_content' : 'concept_details' - - if params[:styled].eql?("true") - render :partial => "details", :layout => "partial" - else - render :partial => "details" - end + + render :partial => "details" end diff --git a/app/controllers/notes_controller.rb b/app/controllers/notes_controller.rb index e08836392..04cca1e7a 100644 --- a/app/controllers/notes_controller.rb +++ b/app/controllers/notes_controller.rb @@ -160,11 +160,6 @@ def archive end end - def show_concept_list - params[:p] = "classes" - params[:t] = "notes" - redirect_new_api - end private diff --git a/app/controllers/ontologies_controller.rb b/app/controllers/ontologies_controller.rb index caec35f99..9c440d68b 100644 --- a/app/controllers/ontologies_controller.rb +++ b/app/controllers/ontologies_controller.rb @@ -232,17 +232,10 @@ 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&conceptid=#{params[:conceptid]}", status: :moved_permanently return end - if params[:ontology].to_i > 0 - acronym = BPIDResolver.id_to_acronym(params[:ontology]) - if acronym - redirect_new_api - return - end - end # Note: find_by_acronym includes ontology views @ontology = LinkedData::Client::Models::Ontology.find_by_acronym(params[:ontology]).first @@ -279,9 +272,6 @@ def show # This action is now a router using the 'p' parameter as the page to show case params[:p] - when 'terms' - params[:p] = 'classes' - redirect_to "/ontologies/#{params[:ontology]}#{params_string_for_redirect(params)}", status: :moved_permanently when 'classes' self.classes # rescue self.summary when 'mappings' @@ -386,13 +376,6 @@ def subscriptions } end - def virtual - redirect_new_api - end - - def visualize - redirect_new_api(true) - end def widgets if request.xhr? diff --git a/app/controllers/search_controller.rb b/app/controllers/search_controller.rb index eeb510ca3..fbf58b4f6 100644 --- a/app/controllers/search_controller.rb +++ b/app/controllers/search_controller.rb @@ -132,9 +132,6 @@ def check_params_ontologies(params) 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 end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index e768f3b95..4c3ad3408 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -75,43 +75,10 @@ def omniauth_token_provider(strategy) omniauth_provider_info(strategy.to_sym).keys.first 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 - end - end - - - def encode_param(string) CGI.escape(string) end - def clean(string) - string = string.gsub("\"",'\'') - return string.gsub("\n",'') - end - - def clean_id(string) - new_string = string.gsub(":","").gsub("-","_").gsub(".","_") - return new_string - end - - def to_param(string) - "#{encode_param(string.gsub(" ","_"))}" - end - - def get_username(user_id) - user = LinkedData::Client::Models::User.find(user_id) - username = user.nil? ? user_id : user.username - username - end def current_user session[:user] @@ -126,28 +93,8 @@ def child_id(child) child.id.to_s.split('/').last end - def loading_spinner(padding = false, include_text = true) - loading_text = include_text ? t('application.loading') : "" - if padding - 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) - end - end - - def help_icon(link, html_attribs = {}) - html_attribs["title"] ||= "Help" - attribs = [] - html_attribs.each {|k,v| attribs << "#{k.to_s}='#{v}'"} - return <<-BLOCK - - - - BLOCK - end - # 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 @@ -199,74 +146,11 @@ def link_last_part(url) end end - def get_categories_data(categories = nil) - @categories_for_select = [] - @categories_map = {} - categories ||= LinkedData::Client::Models::Category.all(include: "name,ontologies") - categories.each do |c| - @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_js = @categories_map.to_json - end - - def get_groups_data(groups = nil) - @groups_map = {} - @groups_for_select = [] - 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 ] - @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_js = @groups_map.to_json - end - - - - - def ontologies_to_acronyms(ontologyIDs) - acronyms = [] - ontologyIDs.each do |id| - 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 - end - def at_slice? !@subdomain_filter.nil? && !@subdomain_filter[:active].nil? && @subdomain_filter[:active] == true end - # TODO this helper is not used but can be usefully - 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]" - more_text = " #{link_more}#{text} #{link_less}" - more = text.length > length ? more_text : "" - output = "#{truncate(text, :length => length, :omission => trailing_text)}" + more + "" - end - - def chips_component(id: , name: , label: , value: , checked: false , tooltip: nil, &block) - content_tag(:div, data: { controller: 'tooltip' }, title: tooltip) do - check_input(id: id, name: name, value: value, label: label, checked: checked, &block) - end - end - - def group_chip_component(id: nil, name: , object: , checked: , value: nil, title: nil, &block) - title ||= object["name"] - value ||= (object["value"] || object["acronym"] || object["id"]) - - chips_component(id: id || value, name: name, label: object["acronym"], - checked: checked, - value: value, tooltip: title, &block) - end - alias :category_chip_component :group_chip_component - def add_comment_button(parent_id, parent_type) if session[:user].nil? link_to t('application.add_comment'), login_index_path(redirect: request.url), class: "secondary-button regular-button slim" @@ -284,7 +168,6 @@ def add_reply_button(parent_id) end end - def add_proposal_button(parent_id, parent_type) if session[:user].nil? link_to t('application.add_proposal'), login_index_path(redirect: request.url), class: "secondary-button regular-button slim" @@ -324,7 +207,6 @@ def admin_block(ontology: @ontology, user: session[:user], class_css: "admin-bor end 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"} @@ -375,8 +257,6 @@ 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. def bp_ont_link(ont_acronym) return "/ontologies/#{ont_acronym}" end @@ -428,7 +308,7 @@ def get_link_for_cls_ajax(cls_id, ont_acronym, target = nil) 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) else - content_tag(:div, auto_link(cls_id, :all, target: '_blank')) + content_tag(:div, cls_id) end end @@ -453,7 +333,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)}" @@ -469,10 +348,10 @@ def get_link_for_label_xl_ajax(label_xl, ont_acronym, cls_id, modal: true) end - ###END ruby equivalent of JS code in bp_ajax_controller. def ontology_viewer_page_name(ontology_name, concept_label, page) ontology_name + " | " + " #{page.capitalize}" end + def help_path(anchor: nil) "#{Rails.configuration.settings.links[:help]}##{anchor}" end @@ -539,7 +418,6 @@ def navitems ["/landscape", t("layout.header.landscape")]] end - def beta_badge(text = t('application.beta_badge_text'), tooltip: t('application.beta_badge_tooltip')) return unless text content_tag(:span, text, data: { controller: 'tooltip' }, title: tooltip, class: 'badge badge-pill bg-secondary text-white') @@ -581,7 +459,6 @@ def rest_url "#{protocol}://#{cleaned_path}" end - def prefix_property_url(key_string, key = nil) namespace_key, _ = RESOLVE_NAMESPACE.find { |_, value| key_string.include?(value) } @@ -629,7 +506,6 @@ def empty_state(text) end end - def ontologies_selector(id:, label: nil, name: nil, selected: nil, placeholder: nil, multiple: true) content_tag(:div) do render(Input::SelectComponent.new(id: id, label: label, name: name, value: onts_for_select, multiple: multiple, selected: selected, placeholder: placeholder)) + @@ -659,7 +535,5 @@ def cancel_button_component(class_name: nil, id: , value:, data: nil) end end end - - end diff --git a/app/helpers/components_helper.rb b/app/helpers/components_helper.rb index 53f19cfb1..6d870bc2d 100644 --- a/app/helpers/components_helper.rb +++ b/app/helpers/components_helper.rb @@ -1,5 +1,22 @@ module ComponentsHelper + def chips_component(id: , name: , label: , value: , checked: false , tooltip: nil, &block) + content_tag(:div, data: { controller: 'tooltip' }, title: tooltip) do + check_input(id: id, name: name, value: value, label: label, checked: checked, &block) + end + end + + def group_chip_component(id: nil, name: , object: , checked: , value: nil, title: nil, &block) + title ||= object["name"] + value ||= (object["value"] || object["acronym"] || object["id"]) + + chips_component(id: id || value, name: name, label: object["acronym"], + checked: checked, + value: value, tooltip: title, &block) + end + alias :category_chip_component :group_chip_component + + def rdf_highlighter_container(format, content) render Display::RdfHighlighterComponent.new(format: format, text: content) end diff --git a/app/helpers/home_helper.rb b/app/helpers/home_helper.rb index fe4f08449..1be775861 100644 --- a/app/helpers/home_helper.rb +++ b/app/helpers/home_helper.rb @@ -1,5 +1,4 @@ require 'open-uri' -require 'open_uri_redirections' require 'nokogiri' module HomeHelper diff --git a/app/models/bpid_resolver.rb b/app/models/bpid_resolver.rb deleted file mode 100644 index 3f345b39f..000000000 --- a/app/models/bpid_resolver.rb +++ /dev/null @@ -1,46 +0,0 @@ -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' - - def self.id_to_acronym(id) - acronym = self.acronym_from_virtual_id(id) - acronym = self.acronym_from_version_id(id) unless acronym - acronym - end - - def self.acronym_to_virtual_id(acronym) - self.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 - end - - def self.acronym_from_virtual_id(virtual_id) - ACRONYM_FROM_VIRTUAL["old:acronym_from_virtual:#{virtual_id}"] - end - - def self.acronym_from_version_id(version_id) - virtual = virtual_id_from_version_id(version_id) - acronym_from_virtual_id(virtual) - end - - def self.virtual_id_from_version_id(version_id) - VIRTUAL_FROM_VERSION["old:virtual_from_version:#{version_id}"] - end - - def self.virtual_id_from_acronym(acronym) - VIRTUAL_FROM_ACRONYM["old:virtual_from_acronym:#{acronym}"] - end - -end \ No newline at end of file diff --git a/app/views/mappings/_form.html.haml b/app/views/mappings/_form.html.haml index 264b680e7..edbedd742 100644 --- a/app/views/mappings/_form.html.haml +++ b/app/views/mappings/_form.html.haml @@ -3,7 +3,7 @@ %div %span#create_mapping_spinner.card.p-3.text-center - = loading_spinner + = loader_component = render_alerts_container diff --git a/config/bioportal_config_test.rb b/config/bioportal_config_test.rb index 6fb4312b1..91ed16b4d 100644 --- a/config/bioportal_config_test.rb +++ b/config/bioportal_config_test.rb @@ -58,8 +58,6 @@ $ENABLE_SLICES = false $ONTOLOGY_SLICES = {} -# Cube metrics reporting -$ENABLE_CUBE = false $NOT_DOWNLOADABLE = {} # Enable client request caching diff --git a/config/initializers/cube_reporter.rb b/config/initializers/cube_reporter.rb deleted file mode 100644 index 136f509dd..000000000 --- a/config/initializers/cube_reporter.rb +++ /dev/null @@ -1,43 +0,0 @@ -require 'cube' - -## -# This enables collection of request statistics for anaylsis via cube. -# 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" - port = options[:cube_port] || 1180 - @app = app - @cube = ::Cube::Client.new(host, port) - end - - def call(env) - start = Time.now - data = @app.call(env) - finish = Time.now - 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"], - status: data[0], - user: { - apikey: apikey, - username: username, - ip: env["REMOTE_ADDR"], - user_agent: env["HTTP_USER_AGENT"] - } - } - @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 diff --git a/config/initializers/miniprofiler.rb b/config/initializers/miniprofiler.rb deleted file mode 100644 index 05194cebb..000000000 --- a/config/initializers/miniprofiler.rb +++ /dev/null @@ -1,2 +0,0 @@ -Rack::MiniProfiler.config.authorization_mode = :allow_authorized -Rack::MiniProfiler.config.position = 'right' diff --git a/config/routes.rb b/config/routes.rb index de09142b5..2fd283029 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -154,7 +154,6 @@ get '/ontologies/:acronym/:id/serialize/:output_format' => 'ontologies#content_serializer', :id => /.+/ get '/ontologies/:acronym/htaccess' => 'ontologies_redirection#generate_htaccess' - 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] @@ -162,29 +161,23 @@ 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_selector', to: 'ontologies#ontologies_selector' get 'ontologies_selector/results', to: 'ontologies#ontologies_selector_results' + # Notes get 'ontologies/:ontology/notes/:noteid', to: 'notes#virtual_show', as: :note_virtual, noteid: /.+/ get 'ontologies/:ontology/notes', to: 'notes#virtual_show' get '/ontologies/:acronym/:id' => 'ontologies_redirection#redirect', :id => /.+/ - # Ajax - get '/ajax/' => 'ajax_proxy#get', :as => :ajax get '/ajax/class_details' => 'concepts#details' get '/ajax/mappings/get_concept_table' => 'mappings#get_concept_table' - get '/ajax/json_ontology' => 'ajax_proxy#json_ontology' - get '/ajax/json_class' => 'ajax_proxy#json_class' - get '/ajax/jsonp' => 'ajax_proxy#jsonp' get '/ajax/notes/delete' => 'notes#destroy' - get '/ajax/notes/concept_list' => 'notes#show_concept_list' get '/ajax/classes/label' => 'concepts#show_label' get '/ajax/classes/definition' => 'concepts#show_definition' get '/ajax/classes/treeview' => 'concepts#show_tree' @@ -203,6 +196,7 @@ 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 get '/lost_pass' => 'login#lost_password' @@ -219,33 +213,8 @@ get 'check_resolvability' => 'check_resolvability#index' get 'check_url_resolvability' => 'check_resolvability#check_resolvability' - ########################################################################################################### # Install the default route as the lowest priority. get '/:controller(/:action(/:id))' - ########################################################################################################### - - ##### - ## OLD ROUTES - ## All of these should redirect to new addresses in the controller method or using the redirect controller - ##### - - # Redirects from old URL locations - get '/annotate' => 'redirect#index', :url => '/annotator' - get '/visconcepts/:ontology/' => 'redirect#index', :url => '/visualize/' - get '/ajax/terms/label' => 'redirect#index', :url => '/ajax/classes/label' - get '/ajax/terms/definition' => 'redirect#index', :url => '/ajax/classes/definition' - get '/ajax/terms/treeview' => 'redirect#index', :url => '/ajax/classes/treeview' - get '/ajax/term_details/:ontology' => 'redirect#index', :url => '/ajax/class_details' - 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 '/exhibit/:ontology/:id' => 'concepts#exhibit' - mount Lookbook::Engine, at: "/lookbook" - end diff --git a/lib/resolver/acronym_from_virtual.rb b/lib/resolver/acronym_from_virtual.rb deleted file mode 100644 index 5e753e84e..000000000 --- a/lib/resolver/acronym_from_virtual.rb +++ /dev/null @@ -1,535 +0,0 @@ -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 diff --git a/lib/resolver/virtual_from_acronym.rb b/lib/resolver/virtual_from_acronym.rb deleted file mode 100644 index fed4f1607..000000000 --- a/lib/resolver/virtual_from_acronym.rb +++ /dev/null @@ -1,533 +0,0 @@ -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 diff --git a/lib/resolver/virtual_from_version.rb b/lib/resolver/virtual_from_version.rb deleted file mode 100644 index 9e40cad01..000000000 --- a/lib/resolver/virtual_from_version.rb +++ /dev/null @@ -1,7144 +0,0 @@ -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 From 08d5e0508b13373996bd69c4ee8cae25c16b3f52 Mon Sep 17 00:00:00 2001 From: Syphax bouazzouni Date: Fri, 7 Jun 2024 17:03:25 +0200 Subject: [PATCH 17/57] handle the case reset_agents in edit submissions error state are already Agents (#663) --- app/controllers/concerns/ontology_updater.rb | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/controllers/concerns/ontology_updater.rb b/app/controllers/concerns/ontology_updater.rb index 71672178c..64684a534 100644 --- a/app/controllers/concerns/ontology_updater.rb +++ b/app/controllers/concerns/ontology_updater.rb @@ -86,7 +86,10 @@ def update_submission_hash(acronym) def reset_agent_attributes helpers.agent_attributes.each do |attr| current_val = @submission[attr] - new_values = Array(current_val).map { |x| LinkedData::Client::Models::Agent.find(x.split('/').last) } + new_values = Array(current_val).map do |x| + next x if x.is_a?(LinkedData::Client::Models::Agent) + LinkedData::Client::Models::Agent.find(x.split('/').last) + end new_values = new_values.first unless current_val.is_a?(Array) From 42875411039fcd5d633e4fbb23983c01e1ee5820 Mon Sep 17 00:00:00 2001 From: Bilel Kihal <61744974+Bilelkihal@users.noreply.github.com> Date: Sun, 9 Jun 2024 05:54:48 +0200 Subject: [PATCH 18/57] Feature: Add issues and requests link to the footer and feedback form (#665) * add issues and requests link to the footer and feedback form * add $GITHUB_ISSUES to sample config file * Fix a typo in bioportal_config_env.rb.sample --- app/views/home/feedback/feedback.html.haml | 3 +++ config/bioportal_config_env.rb.sample | 4 +++- config/locales/en.yml | 4 +++- config/locales/fr.yml | 4 +++- 4 files changed, 12 insertions(+), 3 deletions(-) diff --git a/app/views/home/feedback/feedback.html.haml b/app/views/home/feedback/feedback.html.haml index 7d54a536b..e23b01fde 100644 --- a/app/views/home/feedback/feedback.html.haml +++ b/app/views/home/feedback/feedback.html.haml @@ -25,6 +25,9 @@ %p.feedback-email = t("home.feedback.feedback_info_text") %a{:href => "mailto: #{$SUPPORT_EMAIL}"}= $SUPPORT_EMAIL + = t("home.feedback.feedback_info_text_rest") + %a{:href => $GITHUB_ISSUES} + Github issues - if session[:user].nil? %p.feedback-input-title = t("home.feedback.email") diff --git a/config/bioportal_config_env.rb.sample b/config/bioportal_config_env.rb.sample index 236636005..90e7aeb64 100644 --- a/config/bioportal_config_env.rb.sample +++ b/config/bioportal_config_env.rb.sample @@ -259,6 +259,7 @@ $PORTALS_INSTANCES = [ } ] +$GITHUB_ISSUES = "https://github.com/agroportal/project-management/issues" $FOOTER_LINKS = { social: [ { logo: "social/people.svg", link: "https://github.com/orgs/agroportal/people" }, @@ -279,7 +280,8 @@ $FOOTER_LINKS = { support: { contact_us: "https://#{$SITE}.lirmm.fr/feedback", documentation: "https://ontoportal.github.io/documentation/", - agro_documentation: "https://doc.jonquetlab.lirmm.fr/share/e6158eda-c109-4385-852c-51a42de9a412/doc/public-documentation-QMpsC9aVBb" + agro_documentation: "https://doc.jonquetlab.lirmm.fr/share/e6158eda-c109-4385-852c-51a42de9a412/doc/public-documentation-QMpsC9aVBb", + issues_and_requests: $GITHUB_ISSUES }, agreements: { terms: $TERMS_AND_CONDITIONS_LINK, diff --git a/config/locales/en.yml b/config/locales/en.yml index e4528f9b3..6089ff20c 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -393,7 +393,8 @@ en: error_on_form: Errors On Form leave_your_feedback: Leave your feedback feedback_hi_text: Hi - feedback_info_text: you can use the form below or email us directly at + feedback_info_text: You can use the form below, email us directly at + feedback_info_text_rest: or leave us a github issue here email: Email name: Name proposition_url_page: Error/Proposition page URL @@ -508,6 +509,7 @@ en: wiki: Wiki documentation: Documentation agro_documentation: AgroPortal documentation + issues_and_requests: Issues and Requests agreements: Legal terms: Terms and Conditions privacy_policy: Privacy Policy diff --git a/config/locales/fr.yml b/config/locales/fr.yml index fac128a5e..5ed3522d1 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -397,7 +397,8 @@ fr: error_on_form: Erreurs sur le formulaire leave_your_feedback: Laissez votre retour feedback_hi_text: Salut - feedback_info_text: vous pouvez utiliser le formulaire ci-dessous ou nous envoyer un email directement à + feedback_info_text: Vous pouvez utiliser le formulaire ci-dessous, nous envoyer un email directement à + feedback_info_text_rest: ou nous laisser une github issue ici email: Email name: Nom proposition_url_page: URL de la page Erreur/Proposition @@ -514,6 +515,7 @@ fr: wiki: Wiki documentation: Documentation agro_documentation: Documentation d'AgroPortal + issues_and_requests: Problèmes et demandes agreements: Légal terms: Termes et conditions privacy_policy: Politique de confidentialité From 19d59f94bf80103b02ab4f1d6728ccb6d59f547a Mon Sep 17 00:00:00 2001 From: Bilel Kihal <61744974+Bilelkihal@users.noreply.github.com> Date: Tue, 11 Jun 2024 14:50:31 +0200 Subject: [PATCH 19/57] fix: upload ontology on errors non returned values and no default values (#625) --- app/controllers/concerns/ontology_updater.rb | 3 ++- app/controllers/ontologies_controller.rb | 2 ++ app/views/ontologies/new.html.haml | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/app/controllers/concerns/ontology_updater.rb b/app/controllers/concerns/ontology_updater.rb index 64684a534..e0e9585d5 100644 --- a/app/controllers/concerns/ontology_updater.rb +++ b/app/controllers/concerns/ontology_updater.rb @@ -47,7 +47,8 @@ def show_new_errors(object, redirection = 'ontologies/new') @selected_attributes = (Array(errors_attributes) + Array(params[:submission]&.keys)).uniq @ontology = ontology_from_params if @ontology.nil? - @submission = submission_from_params(params[:submission]) if params[:submission] && @submission.nil? + @submission = submission_from_params(params[:submission]) if params[:submission] && (@submission.nil? || @submission.errors) + reset_agent_attributes if redirection.is_a?(Hash) && redirection[:id] render_turbo_stream replace(redirection[:id], partial: redirection[:partial]) diff --git a/app/controllers/ontologies_controller.rb b/app/controllers/ontologies_controller.rb index 9c440d68b..606fb3c64 100644 --- a/app/controllers/ontologies_controller.rb +++ b/app/controllers/ontologies_controller.rb @@ -152,6 +152,8 @@ def new @ontology.viewOf = params.dig(:ontology, :viewOf) @submission = LinkedData::Client::Models::OntologySubmission.new @submission.hasOntologyLanguage = 'OWL' + @submission.released = Date.today.to_s + @submission.status = 'production' @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 diff --git a/app/views/ontologies/new.html.haml b/app/views/ontologies/new.html.haml index 92f88fc21..67a916386 100644 --- a/app/views/ontologies/new.html.haml +++ b/app/views/ontologies/new.html.haml @@ -1,7 +1,7 @@ - @title = t("ontologies.submit_new_ontology") %div{:style => "margin:10px;"} - = form_for :ontology, url: {action: "create"}, html: {id: "ontologyForm", multipart: true} do + = form_for :ontology, url: {action: "create"}, html: {id: "ontologyForm", multipart: true, novalidate: true} do .upload-ontology-container %div{style: 'width: 589px'} = error_message_alert From 3121de509615ee717bc5a58e4e17d74babaedbb7 Mon Sep 17 00:00:00 2001 From: Syphax Bouazzouni Date: Wed, 12 Jun 2024 19:48:15 +0200 Subject: [PATCH 20/57] move pry gem outside development block in gemfile (#671) --- Gemfile | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Gemfile b/Gemfile index f58f618a1..64a6783f9 100644 --- a/Gemfile +++ b/Gemfile @@ -45,6 +45,10 @@ gem 'turbo-rails' # [https://stimulus.hotwired.dev] gem 'stimulus-rails' +# Debugging tool +# See https://guides.rubyonrails.org/debugging_rails_applications.html#debugging-with-the-debug-gem gem 'pry' +gem 'pry' + # Time zone info for Windows platforms gem 'tzinfo-data', platforms: %i[mingw mswin x64_mingw jruby] @@ -140,8 +144,6 @@ group :development do gem 'html2haml' # Debugging tools - # See https://guides.rubyonrails.org/debugging_rails_applications.html#debugging-with-the-debug-gem - gem 'pry' gem 'debug', platforms: %i[mri mingw x64_mingw] # Use console on exceptions pages From ce193069bdd6af242332d1c53fd73f795db922a2 Mon Sep 17 00:00:00 2001 From: Bilel Kihal <61744974+Bilelkihal@users.noreply.github.com> Date: Wed, 12 Jun 2024 08:54:54 +0200 Subject: [PATCH 21/57] Feature: Add back slices (#598) * Add slices section to home page * Update the design of the slice top notice bar * fix home slice name styles * fix slices error on home page, when there are no slices available * make the annotator support slices * make browse page compatible with slices * update home slices section to include the number of ontologies per slice and the description * make mappings page supports slices * rearrange home page sections to be in this order: slices, ontoportal instances then collaborations * remove unnecessary code in submission filter file * Adjust the slice link to comply with the production URL * update home page slices section style * add a description to the home page slice section * update home page slices section style * update ontoportal instances and support home sections styles * change the button of add new slice to suggest a new group/slice in the home page * update slices descriptive texti in the home page * add a description for ontoportal instances in the home page * move home_ontoportal_tooltip to home helper * add ontoportal links in config file * remove http from slice link to make it work with https * add slice notice to lang local files * remove mappings statistics slices support in the UI cause it's already done in the back * update ontoportal website links to be upper case * fix slices https issue --------- Co-authored-by: Syphax bouazzouni --- Gemfile.lock | 36 ++++----- app/assets/images/icons/slices.svg | 4 + app/assets/stylesheets/home.scss | 74 +++++++++++++++++-- app/assets/stylesheets/notice.scss | 23 ++++++ .../stylesheets/theme-variables.scss.erb | 2 +- app/controllers/annotator_controller.rb | 17 ++++- app/controllers/application_controller.rb | 1 + app/controllers/home_controller.rb | 1 + app/controllers/mappings_controller.rb | 1 + app/helpers/home_helper.rb | 6 ++ app/views/home/index.html.haml | 55 ++++++++++---- app/views/layouts/_notices.html.haml | 27 +++---- config/bioportal_config_env.rb.sample | 4 +- config/locales/en.yml | 5 ++ config/locales/fr.yml | 5 ++ 15 files changed, 204 insertions(+), 57 deletions(-) create mode 100644 app/assets/images/icons/slices.svg diff --git a/Gemfile.lock b/Gemfile.lock index 59e6f7fa8..8a38af90b 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -135,7 +135,7 @@ GEM railties (> 3.1) childprocess (5.0.0) coderay (1.1.3) - concurrent-ruby (1.3.2) + concurrent-ruby (1.3.3) crack (1.0.0) bigdecimal rexml @@ -152,7 +152,7 @@ GEM docile (1.4.0) domain_name (0.6.20240107) ed25519 (1.3.0) - erubi (1.12.0) + erubi (1.13.0) erubis (2.7.0) excon (0.110.0) execjs (2.9.1) @@ -172,7 +172,7 @@ GEM sass-rails globalid (1.2.1) activesupport (>= 6.1) - graphql (2.3.4) + graphql (2.3.5) base64 graphql-client (0.22.0) activesupport (>= 3.0) @@ -312,7 +312,7 @@ GEM net-protocol net-ssh (7.2.3) netrc (0.11.0) - newrelic_rpm (9.9.0) + newrelic_rpm (9.10.2) nio4r (2.7.3) nokogiri (1.15.6-x86_64-darwin) racc (~> 1.4) @@ -353,8 +353,8 @@ GEM omniauth-rails_csrf_protection (1.0.2) actionpack (>= 4.2) omniauth (~> 2.0) - parallel (1.24.0) - parser (3.3.2.0) + parallel (1.25.1) + parser (3.3.3.0) ast (~> 2.4.1) racc popper_js (1.16.1) @@ -397,9 +397,9 @@ GEM rails-i18n (7.0.9) i18n (>= 0.7, < 2) railties (>= 6.0.0, < 8) - railties (7.0.7) - actionpack (= 7.0.7) - activesupport (= 7.0.7) + railties (7.0.3) + actionpack (= 7.0.3) + activesupport (= 7.0.3) method_source rake (>= 12.2) thor (~> 1.0) @@ -415,19 +415,19 @@ GEM json redcarpet (3.6.0) regexp_parser (2.9.2) - reline (0.5.8) + reline (0.5.9) io-console (~> 0.5) rest-client (2.1.0) http-accept (>= 1.7.0, < 2.0) http-cookie (>= 1.0.2, < 2.0) mime-types (>= 1.16, < 4.0) netrc (~> 0.8) - rexml (3.2.8) - strscan (>= 3.0.9) - rouge (4.2.1) + rexml (3.3.0) + strscan + rouge (4.3.0) rspec-core (3.13.0) rspec-support (~> 3.13.0) - rspec-expectations (3.13.0) + rspec-expectations (3.13.1) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.13.0) rspec-mocks (3.13.1) @@ -505,12 +505,12 @@ GEM net-ssh (>= 2.8.0) stimulus-rails (1.3.3) railties (>= 6.0.0) - stringio (3.1.0) + stringio (3.1.1) strscan (3.1.0) temple (0.10.3) terminal-table (3.0.2) unicode-display_width (>= 1.1.1, < 3) - terser (1.2.2) + terser (1.2.3) execjs (>= 0.3.0, < 3) thor (1.3.1) tilt (2.3.0) @@ -594,7 +594,7 @@ DEPENDENCIES mysql2 net-ftp (~> 0.2.0) net-http (~> 0.3.2) - newrelic_rpm (< 9.10.0) + newrelic_rpm oj omniauth omniauth-github @@ -605,7 +605,7 @@ DEPENDENCIES ontologies_api_client! pry puma (~> 5.0) - rails (= 7.0.7) + rails (= 7.0.3) rails-i18n (~> 7.0.0) recaptcha (~> 5.9.0) rest-client diff --git a/app/assets/images/icons/slices.svg b/app/assets/images/icons/slices.svg new file mode 100644 index 000000000..e92cb02f9 --- /dev/null +++ b/app/assets/images/icons/slices.svg @@ -0,0 +1,4 @@ + + + + diff --git a/app/assets/stylesheets/home.scss b/app/assets/stylesheets/home.scss index 327e0ed07..9965d2bfd 100644 --- a/app/assets/stylesheets/home.scss +++ b/app/assets/stylesheets/home.scss @@ -150,7 +150,59 @@ i.fa.fa-caret-square-o-down { margin-bottom: 5px; font-weight: 700; } - +.home-section-title{ + display: flex; + flex-direction: column; + align-items: start; +} +.home-section-title .text{ + font-size: 20px; + font-weight: 600; + margin-bottom: 0; +} +.home-slice > a{ + display: flex; + align-items: center; +} +.home-slice-icon{ + display: flex; + flex-direction: column; + align-items: center; +} +.home-slice-icon svg{ + width: 40px; + height: 40px; +} +.home-slices-container{ + display: flex; + flex-wrap: wrap; + margin-top: 20px; +} +.home-section-description{ + color: #888888; +} +.home-slice{ + border: 1px solid var(--primary-color); + border-radius: 8px; + padding: 4px 15px; + margin-right: 20px; + margin-bottom: 20px; +} +.home-ontoportal-instances{ + margin-top: 50px; + background: #FBFBFB; + width: 100%; + display: flex; + justify-content: center; +} +.ontoportal-instances-container{ + padding: 0 50px; + width: 1248px; + padding-bottom: 20px; +} +.home-section-title.ontoportal{ + margin-top: 20px; +} .home-section-line{ width: 60px; margin-top: 3px; @@ -169,17 +221,26 @@ i.fa.fa-caret-square-o-down { } .home-statistics-container > div { display: flex; - align-items: center; + align-items: start; + justify-content: center; flex-wrap: wrap; } .home-agroportal-figures{ margin-bottom: 20px; } - +.home-slice-name{ + font-size: 16px; + font-weight: 400; + margin-left: 10px; +} +.home-slice-ontologies{ + font-size: 18px; + font-weight: 500; + margin-bottom: -18px; +} .home-statistics-container > div > p { font-size: 20px; font-weight: 600; - margin-left: 18px; margin-bottom: 0; } .home-statistics-item{ @@ -414,7 +475,6 @@ i.fa.fa-caret-square-o-down { } .home-support-items{ display: flex; - justify-content: center; flex-wrap: wrap; img{ object-fit: scale-down; @@ -429,8 +489,8 @@ i.fa.fa-caret-square-o-down { border-radius: 50%; display: block; } -.home-support-items > *:not(:first-child){ - margin-left: 40px; +.home-support-items > div, .home-support-items > a { + margin-right: 40px; } .home-support-items a{ margin-bottom: 40px; diff --git a/app/assets/stylesheets/notice.scss b/app/assets/stylesheets/notice.scss index c69189653..93dd13e0e 100644 --- a/app/assets/stylesheets/notice.scss +++ b/app/assets/stylesheets/notice.scss @@ -14,3 +14,26 @@ div#notice_message { } } +.slice-notice-bar-container{ + background-color: var(--warning-color); + display: flex; + justify-content: center; +} +.slice-notice-bar{ + width: var(--container-max-width); + padding: 10px 40px; + display: flex; + justify-content: space-between; + align-items: center; + color: white; +} +.slice-notice-bar>div{ + display: flex; +} +.slice-notice-bar .slice-name{ + margin-left: 5px; + font-weight: 600; +} +.slice-notice-bar .warning-button.primary-button{ + background-color: #efb300 !important; +} diff --git a/app/assets/stylesheets/theme-variables.scss.erb b/app/assets/stylesheets/theme-variables.scss.erb index a76576e39..0f87e4443 100644 --- a/app/assets/stylesheets/theme-variables.scss.erb +++ b/app/assets/stylesheets/theme-variables.scss.erb @@ -39,7 +39,7 @@ // common variables :root{ --error-color: #EB4335; - --warning-color: #e48c11; + --warning-color: #F2BE22; --gray-color: #888888; --success-color: #2DC54E; --admin-color: #145FF4; diff --git a/app/controllers/annotator_controller.rb b/app/controllers/annotator_controller.rb index aabf5ecf2..a1a4011d3 100644 --- a/app/controllers/annotator_controller.rb +++ b/app/controllers/annotator_controller.rb @@ -72,8 +72,23 @@ def annotator_results(uri) else @results_table_header.push(t('annotator.score')) end - annotations = LinkedData::Client::HTTP.get(uri.dup.to_s, api_params) + + # if we are in a slice, pass the ontologies of this slice in the params + + if at_slice? + slice_ontologies_acronyms = @subdomain_filter[:ontologies].map{ |id| link_last_part(id)} + if api_params[:ontologies] + selected_ontolgies = api_params[:ontologies].split(',') + filtred_ontologies = selected_ontolgies.select{ |ontology| slice_ontologies_acronyms.include?(ontology) } + else + filtred_ontologies = slice_ontologies_acronyms + end + api_params[:ontologies] = filtred_ontologies.join(',') + end + + annotations = LinkedData::Client::HTTP.get(uri, api_params) @ontologies = LinkedData::Client::Models::Ontology.all({:include_views => true}).map{ |o| [o.id.to_s, o]}.to_h + @semantic_types = get_semantic_types @results = [] annotations.each do |annotation| diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 4d5f32984..6d2305ce6 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -123,6 +123,7 @@ def domain_ontology_set @subdomain_filter[:active] = true @subdomain_filter[:name] = slice.name @subdomain_filter[:acronym] = slice.acronym + @subdomain_filter[:ontologies] = slice.ontologies end end diff --git a/app/controllers/home_controller.rb b/app/controllers/home_controller.rb index 7c7492dbe..4519adb19 100644 --- a/app/controllers/home_controller.rb +++ b/app/controllers/home_controller.rb @@ -14,6 +14,7 @@ def index metrics = metrics.each_with_object(Hash.new(0)) do |h, sum| h.to_hash.slice(:classes, :properties, :individuals).each { |k, v| sum[k] += v } end + @slices = LinkedData::Client::Models::Slice.all @cls_count = metrics[:classes] @individuals_count = metrics[:individuals] diff --git a/app/controllers/mappings_controller.rb b/app/controllers/mappings_controller.rb index e6c9fabd4..b1bcfc8c3 100644 --- a/app/controllers/mappings_controller.rb +++ b/app/controllers/mappings_controller.rb @@ -40,6 +40,7 @@ def index end @options[select_text] = ontology_acronym end + @options = @options.sort @options.unshift([]) diff --git a/app/helpers/home_helper.rb b/app/helpers/home_helper.rb index 1be775861..0f984002b 100644 --- a/app/helpers/home_helper.rb +++ b/app/helpers/home_helper.rb @@ -30,4 +30,10 @@ def discover_ontologies_button end end + def home_ontoportal_tooltip + ontoportal_link = link_to("(#{$ONTOPORTAL_WEBSITE_LINK})", $ONTOPORTAL_WEBSITE_LINK, target: '_blank') + github_link = link_to("(#{$ONTOPORTAL_GITHUB_REPO})", $ONTOPORTAL_GITHUB_REPO, target: '_blank') + content_tag(:div, t('home.ontoportal_description', ontoportal_link: ontoportal_link, github_link: github_link).html_safe, style: "max-width: 600px;") + end + end \ No newline at end of file diff --git a/app/views/home/index.html.haml b/app/views/home/index.html.haml index 7a010b73d..223141b4b 100644 --- a/app/views/home/index.html.haml +++ b/app/views/home/index.html.haml @@ -176,20 +176,38 @@ .home-statistics-link.justify-content-end = link_to t("home.see_details"),'/statistics', target: "_blank" - .home-section - .home-statistics-container - .home-support-title - %p= t('home.support_and_collaborations') + - if @slices + .home-section + .home-section-title + .text + = "#{portal_name} slices" %hr.home-section-line/ - .home-support-items - - $HOME_PAGE_LOGOS&.each do |logo| - %a{href:logo[:url], target: "_blanc"} - %img{src: asset_path(logo[:img_src])} - - .home-section - .home-statistics-container - .home-support-title - %p= t('home.ontoportal_instances') + .home-section-description + .div + = t('home.slices_description') + .home-slices-container + - @slices.each do |slice, index| + - slice_link = "https://#{slice.acronym}.#{$UI_URL.sub("https://", "")}" + .home-slice{'data-controller': 'tooltip', title: content_tag(:div, slice.description, style: 'max-width: 200px')} + = link_to slice_link, target: '_blank' do + .home-slice-icon + .home-slice-ontologies + = slice.ontologies.length + = inline_svg 'icons/slices.svg', width: "70", height: "70" + + .home-slice-name + = "#{slice.name} (#{slice.acronym})" + = render Buttons::RegularButtonComponent.new(id:'regular-button', value: t('home.suggest_slice'), variant: "secondary", state: "regular", href: '/feedback') do |btn| + - btn.icon_right do + = inline_svg_tag "icons/plus.svg" + + .home-ontoportal-instances + .ontoportal-instances-container + .home-section-title.ontoportal + .d-flex.align-items-center + .text.mr-2 + = t('home.ontoportal_instances') + = render Display::InfoTooltipComponent.new(text: home_ontoportal_tooltip) %hr.home-section-line/ .home-support-items - $PORTALS_INSTANCES&.each do |portal| @@ -198,7 +216,16 @@ = inline_svg 'logo-white.svg', width: "35", height: "26" %p{style: "color: #{portal[:color]}"} = portal[:portal] - + + .home-section + .home-section-title + .text + = t('home.support_and_collaborations') + %hr.home-section-line/ + .home-support-items + - $HOME_PAGE_LOGOS&.each do |logo| + %a{href:logo[:url], target: "_blanc"} + %img{src: asset_path(logo[:img_src])} :javascript function submitAnnotator(){ diff --git a/app/views/layouts/_notices.html.haml b/app/views/layouts/_notices.html.haml index 7d99b276e..8969a67d0 100644 --- a/app/views/layouts/_notices.html.haml +++ b/app/views/layouts/_notices.html.haml @@ -6,21 +6,18 @@ - do_not_display_subdomain_info_here = Set.new(["homeall_resources"]) - if at_slice? && !do_not_display_subdomain_info_here.include?("#{controller.controller_name}#{controller.action_name}") - .subdomain_info{:style => "margin: 13px; padding: 5px; border: 1px solid gray; font-size:14px; background-color: #ffffcc;"} - %p{:style => "text-align: left; margin-bottom: 0;"} - - query_string = request.query_string.empty? ? "" : "?#{request.query_string}" - You are viewing the - %b= @subdomain_filter[:name] - %a.pop_window{:href => "help?pop=true#slice_definition", :target => "_blank"} - = $SITE - = t('layout.notices.slice') - = t('layout.notices.at') - = succeed "." do - %b= request.host - = $SITE - = succeed "." do - %a{:href => "#{$UI_URL}#{request.path}#{query_string}"} - = t('layout.notices.visit_the_site') + .slice-notice-bar-container + .slice-notice-bar + %div + .title + = t('home.viewing_slice') + .slice-name + = @subdomain_filter[:name] + .view-full-site-button + - query_string = request.query_string.empty? ? "" : "?#{request.query_string}" + = render Buttons::RegularButtonComponent.new(id:'slices-view-full-site', value: t('home.view_full_site'), variant: "primary", href: "#{$UI_URL}#{request.path}#{query_string}", color: 'warning', size: "slim") do |btn| + = btn.icon_right do + = inline_svg_tag "arrow-right.svg" #site-notice - message_name = "" - unless $SITE_NOTICE.nil? || $SITE_NOTICE.empty? diff --git a/config/bioportal_config_env.rb.sample b/config/bioportal_config_env.rb.sample index 90e7aeb64..277b97201 100644 --- a/config/bioportal_config_env.rb.sample +++ b/config/bioportal_config_env.rb.sample @@ -258,6 +258,8 @@ $PORTALS_INSTANCES = [ link: 'https://biodivportal.gfbio.org/' } ] +$ONTOPORTAL_WEBSITE_LINK = "https://ontoportal.org/" +$ONTOPORTAL_GITHUB_REPO = "https://github.com/ontoportal" $GITHUB_ISSUES = "https://github.com/agroportal/project-management/issues" $FOOTER_LINKS = { @@ -275,7 +277,7 @@ $FOOTER_LINKS = { api: "https://data.agroportal.lirmm.fr/", tools: "/tools", sparql: "https://sparql.agroportal.lirmm.fr/test/", - ontoportal: "https://ontoportal.org/" + ontoportal: $ONTOPORTAL_WEBSITE_LINK }, support: { contact_us: "https://#{$SITE}.lirmm.fr/feedback", diff --git a/config/locales/en.yml b/config/locales/en.yml index 6089ff20c..f00316dbc 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -409,6 +409,11 @@ en: feedback_complete: title: Feedback sent successfully message: Thank you for taking the time to share your feedback with us. Our support team will review your message and get back to you as soon as possible with a response. We value your opinion and appreciate your help in improving our services. Thank you for your support! + suggest_slice: Suggest a new group/slice + slices_description: Slices allow users to interact (both via API or UI) only with a subset of ontologies in AgroPortal. If browsing the slice, all the portal features will be restricted to the chosen subset, enabling users to focus on their specific use cases. On AgroPortal, slices and groups are synchronized, so every group has a corresponding slice displaying only the ontologies from that group. + ontoportal_description: "The OntoPortal Alliance %{ontoportal_link} is a consortium of research and infrastructure teams dedicated to promoting the development of ontology repositories and semantic artefact catalogues based on the open, collaboratively developed OntoPortal software %{github_link}. Hereafter are the current public and open repositories built with the technology maintained by the Alliance." + viewing_slice: "Viewing the slice:" + view_full_site: View full website landscape: #select_ontologies: Start typing to select ontologies or leave blank to use them all classes: Number of classes diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 5ed3522d1..2f4812d8d 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -413,6 +413,11 @@ fr: feedback_complete: title: Retour envoyé avec succès message: Merci d'avoir pris le temps de partager votre retour avec nous. Notre équipe de support examinera votre message et vous répondra dès que possible. Nous apprécions votre opinion et sommes reconnaissants de votre aide pour améliorer nos services. Merci de votre soutien ! + suggest_slice: Proposer un nouveau groupe/slice + slices_description: Les "slices" permettent aux utilisateurs d'interagir (à la fois via l'API ou l'interface utilisateur) uniquement avec un sous-ensemble d'ontologies dans AgroPortal. Si vous parcourez une slice, toutes les fonctionnalités du portail seront limitées au sous-ensemble choisi; cela permet aux utilisateurs de se concentrer sur leurs cas d'utilisation spécifiques. Sur AgroPortal, les slices et les groupes sont synchronisés, de sorte que chaque groupe a une slice correspondante affichant uniquement les ontologies de ce groupe. + ontoportal_description: "L'OntoPortal Alliance %{ontoportal_link} est un consortium d'équipes de recherche et d'infrastructure dédiées à promouvoir le développement de portails d'ontologies et de catalogues d'artefacts sémantiques basés sur le logiciel OntoPortal %{github_link} ouvert et collaboratif. Ci-dessous se trouvent les portails publics et ouverts actuels construits avec la technologie maintenue par l'Alliance." + viewing_slice: "Affichage de la slice:" + view_full_site: Voir le site complet landscape: #select_ontologies: Commencez à taper pour sélectionner des ontologies ou laissez vide pour les utiliser toutes From 5306a1a6e3159f49276102204a102cfd15265c21 Mon Sep 17 00:00:00 2001 From: Bilel KIHAL Date: Thu, 20 Jun 2024 14:39:10 +0200 Subject: [PATCH 22/57] fix docker compose to make local env dev work in port 3000 --- docker-compose.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 575407eb2..c5a32c9b6 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -25,8 +25,6 @@ x-app: &default-app BUNDLE_PATH: /srv/ontoportal/bundle DB_HOST: db CACHE_HOST: cache - ports: - - "3000:3000" tmpfs: - /tmp - /app/tmp/pids @@ -64,6 +62,8 @@ services: dev: <<: *default-app + ports: + - "3000:3000" production: <<: *default-app From c5bd46ac9981e8d244ca43261b6ae034f6af9cf3 Mon Sep 17 00:00:00 2001 From: Syphax bouazzouni Date: Fri, 21 Jun 2024 10:47:41 +0200 Subject: [PATCH 23/57] Fix: submissions properties selector labels and include ontologies properties (#669) * add ontologies properties to the submission properties selector * show submission attributes label instead of the keys in the selector --- app/helpers/submission_inputs_helper.rb | 2 ++ app/helpers/submissions_helper.rb | 17 +++++++++++++---- lib/tasks/schema.rake | 14 +++++++------- 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/app/helpers/submission_inputs_helper.rb b/app/helpers/submission_inputs_helper.rb index 89c80021d..b78159d35 100644 --- a/app/helpers/submission_inputs_helper.rb +++ b/app/helpers/submission_inputs_helper.rb @@ -35,6 +35,8 @@ def help_text end def label + return attr_key unless @attr_metadata + @label || @attr_metadata['label'] || @attr_metadata['attribute'].humanize end diff --git a/app/helpers/submissions_helper.rb b/app/helpers/submissions_helper.rb index 8610dda0e..917ce5bc2 100644 --- a/app/helpers/submissions_helper.rb +++ b/app/helpers/submissions_helper.rb @@ -194,16 +194,25 @@ def submission_properties out end + def ontology_properties + ['acronym', 'name', [t('submission_inputs.visibility'), :viewingRestriction], 'viewOf', 'groups', 'categories', + [t('submission_inputs.administrators'), 'administeredBy']] + end def submission_editable_properties - properties = submission_properties - properties.map do |x| + properties = submission_properties.map do |x| if x.is_a? Array - [x[0].to_s.underscore.humanize, x[0]] + [attr_label(x[0], show_tooltip: false), x[0]] else - [x.to_s.underscore.humanize, x] + [attr_label(x, show_tooltip: false), x] end end + + properties += ontology_properties.map do |x| + x.is_a?(Array) ? x : [x.to_s.underscore.humanize, x] + end + + properties end def attribute_infos(attr_label) diff --git a/lib/tasks/schema.rake b/lib/tasks/schema.rake index af1e0ca3c..81e30e7f7 100644 --- a/lib/tasks/schema.rake +++ b/lib/tasks/schema.rake @@ -1,10 +1,10 @@ # frozen_string_literal: true -require_relative '../../config/initializers/graphql_client' +# require_relative '../../config/initializers/graphql_client' -namespace :schema do - desc 'Update GitHub GraphQL schema' - task :update do - GraphQL::Client.dump_schema(GitHub::HTTPAdapter, 'data/schema.json') - end -end +# namespace :schema do +# desc 'Update GitHub GraphQL schema' +# task :update do +# GraphQL::Client.dump_schema(GitHub::HTTPAdapter, 'data/schema.json') +# end +# end From 78a7c2366cb19fea8375df9f9e3454846de4b3df Mon Sep 17 00:00:00 2001 From: Bilel KIHAL Date: Fri, 21 Jun 2024 11:44:55 +0200 Subject: [PATCH 24/57] make slices open in the same tab not in a new tab --- app/views/home/index.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/home/index.html.haml b/app/views/home/index.html.haml index 223141b4b..9517fc4d0 100644 --- a/app/views/home/index.html.haml +++ b/app/views/home/index.html.haml @@ -189,7 +189,7 @@ - @slices.each do |slice, index| - slice_link = "https://#{slice.acronym}.#{$UI_URL.sub("https://", "")}" .home-slice{'data-controller': 'tooltip', title: content_tag(:div, slice.description, style: 'max-width: 200px')} - = link_to slice_link, target: '_blank' do + = link_to slice_link do .home-slice-icon .home-slice-ontologies = slice.ontologies.length From 0d6dd48a43abb0f054e9524d77cd38eb2c175e58 Mon Sep 17 00:00:00 2001 From: Bilel KIHAL Date: Fri, 21 Jun 2024 11:54:38 +0200 Subject: [PATCH 25/57] put the ontoportal instances directly before the logos instead of a tooltip --- app/helpers/home_helper.rb | 10 +++++----- app/views/home/index.html.haml | 10 ++++++---- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/app/helpers/home_helper.rb b/app/helpers/home_helper.rb index 0f984002b..5df660967 100644 --- a/app/helpers/home_helper.rb +++ b/app/helpers/home_helper.rb @@ -7,7 +7,7 @@ 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 @@ -20,7 +20,7 @@ def format_number_abbreviated(number) else number.to_s end - end + end def discover_ontologies_button render Buttons::RegularButtonComponent.new(id: 'discover-ontologies-button', value: t('home.discover_ontologies_button'), variant: "secondary", state: "regular", href: "/ontologies") do |btn| @@ -30,10 +30,10 @@ def discover_ontologies_button end end - def home_ontoportal_tooltip + def home_ontoportal_description ontoportal_link = link_to("(#{$ONTOPORTAL_WEBSITE_LINK})", $ONTOPORTAL_WEBSITE_LINK, target: '_blank') github_link = link_to("(#{$ONTOPORTAL_GITHUB_REPO})", $ONTOPORTAL_GITHUB_REPO, target: '_blank') - content_tag(:div, t('home.ontoportal_description', ontoportal_link: ontoportal_link, github_link: github_link).html_safe, style: "max-width: 600px;") + content_tag(:div, t('home.ontoportal_description', ontoportal_link: ontoportal_link, github_link: github_link).html_safe, style: "margin-bottom: 20px") end -end \ No newline at end of file +end diff --git a/app/views/home/index.html.haml b/app/views/home/index.html.haml index 9517fc4d0..37aa03e5c 100644 --- a/app/views/home/index.html.haml +++ b/app/views/home/index.html.haml @@ -204,11 +204,13 @@ .home-ontoportal-instances .ontoportal-instances-container .home-section-title.ontoportal - .d-flex.align-items-center - .text.mr-2 - = t('home.ontoportal_instances') - = render Display::InfoTooltipComponent.new(text: home_ontoportal_tooltip) + .text.mr-2 + = t('home.ontoportal_instances') %hr.home-section-line/ + + .home-section-description + .div + = home_ontoportal_description .home-support-items - $PORTALS_INSTANCES&.each do |portal| %div.text-center From a332b32d272906b4ef3867cd75b8552a35252743 Mon Sep 17 00:00:00 2001 From: Bilel Kihal <61744974+Bilelkihal@users.noreply.github.com> Date: Fri, 21 Jun 2024 13:27:30 +0200 Subject: [PATCH 26/57] Fix: Redirect to the login page when accessing private ontology while being not authenticated (#673) --- app/assets/stylesheets/login.scss | 2 +- app/assets/stylesheets/ontologies.scss | 2 +- app/controllers/ontologies_controller.rb | 12 +- app/helpers/ontologies_helper.rb | 4 + .../controllers/content_finder_controller.js | 105 ------------------ .../controllers/label_ajax_controller.js | 2 +- .../mappings_visualization_controller.js | 2 +- app/views/instances/_details.html.haml | 2 +- app/views/login/index.html.haml | 9 +- config/environment.rb | 3 +- config/locales/en.yml | 2 +- config/locales/fr.yml | 2 +- 12 files changed, 26 insertions(+), 121 deletions(-) delete mode 100644 app/javascript/controllers/content_finder_controller.js diff --git a/app/assets/stylesheets/login.scss b/app/assets/stylesheets/login.scss index f832c6ed0..f77d8a6b7 100644 --- a/app/assets/stylesheets/login.scss +++ b/app/assets/stylesheets/login.scss @@ -1,5 +1,5 @@ .login-form{ - margin-top: 30px; + margin-top: 10px; padding: 37px 41px; box-shadow: rgba(0, 0, 0, 0.08) 0px 20px 50px; border-radius: 14px; diff --git a/app/assets/stylesheets/ontologies.scss b/app/assets/stylesheets/ontologies.scss index 223aeda8f..ccaf70d31 100644 --- a/app/assets/stylesheets/ontologies.scss +++ b/app/assets/stylesheets/ontologies.scss @@ -195,7 +195,7 @@ $widget-table-border-color: #EFEFEF; #bd_content .sidebar { overflow-x: auto; white-space: nowrap; - min-width: 35%; + min-width: 29%; } #search_box:focus { diff --git a/app/controllers/ontologies_controller.rb b/app/controllers/ontologies_controller.rb index 606fb3c64..621f1247f 100644 --- a/app/controllers/ontologies_controller.rb +++ b/app/controllers/ontologies_controller.rb @@ -238,10 +238,16 @@ def show return end - - # 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? || @ontology.errors + + if @ontology.nil? || @ontology.errors + if ontology_access_denied? + redirect_to "/login?redirect=/ontologies/#{params[:ontology]}", alert: t('login.private_ontology') + return + else + ontology_not_found(params[:ontology]) + end + end # Handle the case where an ontology is converted to summary only. # See: https://github.com/ncbo/bioportal_web_ui/issues/133. diff --git a/app/helpers/ontologies_helper.rb b/app/helpers/ontologies_helper.rb index 46c5d3a4f..b4ba500f0 100644 --- a/app/helpers/ontologies_helper.rb +++ b/app/helpers/ontologies_helper.rb @@ -5,6 +5,10 @@ module OntologiesHelper API_KEY = $API_KEY LANGUAGE_FILTERABLE_SECTIONS = %w[classes schemes collections instances properties].freeze + def ontology_access_denied? + @ontology&.errors&.include?('Access denied for this resource') + end + def concept_search_input(placeholder) content_tag(:div, class: 'search-inputs p-1') do text_input(placeholder: placeholder, label: '', name: "search", value: '', data: { action: "input->browse-filters#dispatchInputEvent" }) diff --git a/app/javascript/controllers/content_finder_controller.js b/app/javascript/controllers/content_finder_controller.js deleted file mode 100644 index 177b7d070..000000000 --- a/app/javascript/controllers/content_finder_controller.js +++ /dev/null @@ -1,105 +0,0 @@ -import { Controller } from '@hotwired/stimulus' -import * as jsonld from 'jsonld' -import hljs from 'highlight.js/lib/core' -import xml from 'highlight.js/lib/languages/xml' -import json from 'highlight.js/lib/languages/json' - -export default class extends Controller { - static targets = ["content"] - static values = { - format: String - } - connect() { - switch (this.formatValue) { - case 'json': - hljs.registerLanguage('json', json) - this.showJSON() - break - case 'xml': - hljs.registerLanguage('xml', xml) - this.showXML() - break - case 'ntriples': - hljs.registerLanguage('ntriples', function (hljs) { - var URL_PATTERN = /<[^>]+>/; // Regex pattern for matching URLs in angle brackets - return { - case_insensitive: true, - contains: [ - { - className: 'subject', - begin: /^<[^>]+>/, - }, - { - className: 'predicate', - begin: /<[^>]+>/, - }, - { - className: 'object', - begin: /\s([^\s]+)\s\./, - }, - hljs.COMMENT('^#', '$') - ] - }; - }); - this.showNTriples() - break - case 'turtle': - hljs.registerLanguage('turtle', function (hljs) { - var URL_PATTERN = /(?:<[^>]*>)|(?:https?:\/\/[^\s]+)/; - - return { - case_insensitive: true, - contains: [ - { - className: 'custom-prefixes', - begin: '@prefix', - relevance: 10 - }, - { - className: 'meta', - begin: /@base/, - end: /[\r\n]|$/, - relevance: 10 - }, - { - className: 'variable', - begin: /\?[\w\d]+/ - }, - { - className: 'custom-symbol', - begin: /@?[A-Za-z_][A-Za-z0-9_]*(?= *:)/, - relevance: 10 - }, - { - className: 'custom-concepts', - begin: /:\s*(\w+)/, - relevance: 10 - }, - { - className: 'string', - begin: URL_PATTERN - } - ] - }; - }); - this.showTURTLE() - break - } - } - - showJSON() { - this.contentTarget.innerHTML = hljs.highlight(JSON.stringify(JSON.parse(this.contentTarget.textContent), null, " "), { language: 'json' }).value - } - - showXML() { - this.contentTarget.innerHTML = hljs.highlight(this.contentTarget.textContent, { language: 'xml' }).value - } - - showNTriples() { - this.contentTarget.innerHTML = hljs.highlight(this.contentTarget.textContent, { language: 'ntriples' }).value - } - - showTURTLE() { - this.contentTarget.innerHTML = hljs.highlight(this.contentTarget.textContent, { language: 'turtle' }).value - } -} diff --git a/app/javascript/controllers/label_ajax_controller.js b/app/javascript/controllers/label_ajax_controller.js index 539a26aeb..d3cbcfff4 100644 --- a/app/javascript/controllers/label_ajax_controller.js +++ b/app/javascript/controllers/label_ajax_controller.js @@ -33,7 +33,7 @@ export default class extends Controller { success: this.#ajaxSuccess.bind(this), error: this.#ajaxError.bind(this) }); - },0) + },1) } abort() { diff --git a/app/javascript/controllers/mappings_visualization_controller.js b/app/javascript/controllers/mappings_visualization_controller.js index e75813d36..58d74cc60 100644 --- a/app/javascript/controllers/mappings_visualization_controller.js +++ b/app/javascript/controllers/mappings_visualization_controller.js @@ -26,7 +26,7 @@ export default class extends Controller { ontology_name: key.split('/').pop(), ontology_mappings: value, })) - + this.bubblesTarget.innerHTML = '' useMappingsDrawBubbles(data, width, height, margin, this.bubblesTarget, normalization_ratio, logScaleFactor) this.#centerScroll(this.frameTarget) diff --git a/app/views/instances/_details.html.haml b/app/views/instances/_details.html.haml index f1ddcb015..146dcd946 100644 --- a/app/views/instances/_details.html.haml +++ b/app/views/instances/_details.html.haml @@ -6,7 +6,7 @@ = render ConceptDetailsComponent.new(id:'instance-details', acronym: ontology_acronym, concept_id: @instance["@id"]) do |c| - c.header(stripped: true) do |t| - - t.add_row({th: t("instances.id")}, {td: link_to_with_actions(@instance["@id"]) }) + - t.add_row({th: t("instances.id")}, {td: link_to_with_actions(@instance["@id"], acronym: @ontology.acronym) }) - label = @instance['label'] || @instance['prefLabel'] - unless label.blank? diff --git a/app/views/login/index.html.haml b/app/views/login/index.html.haml index 2ab02ae26..0d39f910b 100644 --- a/app/views/login/index.html.haml +++ b/app/views/login/index.html.haml @@ -1,10 +1,9 @@ - @title = t('login.title') -- unless @errors.nil? - %div{:style => "color:red;"} - = t('login.invalid_login') - %ul +.d-flex.justify-content-center.mt-4 + - unless @errors.nil? + = render Display::AlertComponent.new(type: "danger", closable: false) do - for error in @errors - %li= error + %div=error .d-flex.justify-content-center .login-form = form_for(:user, :url => {:controller => 'login',:action=>'create'}) do |f| diff --git a/config/environment.rb b/config/environment.rb index 99be33ce5..0c158d03b 100755 --- a/config/environment.rb +++ b/config/environment.rb @@ -1,5 +1,6 @@ # Load the Rails application. -require_relative "application" +require_relative 'application' + # Remove this after migrating to Rails 7.1 (https://github.com/rails/rails/issues/32947#issuecomment-1356391185) class Rails::Application diff --git a/config/locales/en.yml b/config/locales/en.yml index f00316dbc..79b40f9b0 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -543,7 +543,7 @@ en: enter_email: Enter your username enter_password: Enter your password forgot_password: Forgot password? - invalid_login: Errors on the form + private_ontology: This ontology is private. Please login. no_account: Do not have an account? password: Password register: Register diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 2f4812d8d..8999255c4 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -550,7 +550,7 @@ fr: enter_email: Entrez votre nom d'utilisateur enter_password: Entrez votre mot de passe forgot_password: Mot de passe oublié ? - invalid_login: Erreurs sur le formulaire + private_ontology: Cette ontologie est privée. Veuillez vous connecter. no_account: Vous n'avez pas de compte ? password: Mot de passe register: S'inscrire From 2dba7fd9ce6d76beb85f4a3d01eff3653e503b3f Mon Sep 17 00:00:00 2001 From: Bilel Kihal <61744974+Bilelkihal@users.noreply.github.com> Date: Fri, 21 Jun 2024 13:29:01 +0200 Subject: [PATCH 27/57] Feature: Distinguish reused terms in tree view (#650) * distinguish reused properties in the tree view * use preferredNamespaceUri to distinguish reused terms in the tree view if uriRegexPattern is not present * use preferredNamespaceUri to distinguish reused properties in the tree view * distinguish reuses for instances tree * clean terms reuses code * extract is_reused to a separate function in components helper * add concepts reuses to the date view * pass submission directly instead of ontology_uri_pattern * pass direcly the submission instead of passing by a function in terms reuses * Clean terms reuses concern code * add reuses to schemes tree * add reuses to schemes tree when we perform a search * add reuses for collections tree * add reuses to properties tree when we perform a search * add reuses for concepts list view * Clean terms reuses code * extract submission variable form the concept date render helper * remove binding.pry comments left in the code --------- Co-authored-by: Syphax Bouazzouni --- app/assets/stylesheets/bioportal.scss | 202 ------------------ app/assets/stylesheets/components/index.scss | 3 +- .../stylesheets/components/tree_view.scss | 170 +++++++++++++++ app/assets/stylesheets/concepts.scss | 3 +- app/components/tree_link_component.rb | 4 +- .../tree_link_component.html.haml | 4 +- app/controllers/collections_controller.rb | 7 +- app/controllers/concepts_controller.rb | 11 +- app/controllers/concerns/terms_reuses.rb | 15 ++ app/controllers/instances_controller.rb | 6 +- app/controllers/properties_controller.rb | 11 +- app/controllers/schemes_controller.rb | 6 +- app/helpers/components_helper.rb | 19 +- app/helpers/concepts_helper.rb | 25 ++- app/helpers/properties_helper.rb | 7 +- app/helpers/schemes_helper.rb | 6 +- app/helpers/search_helper.rb | 8 +- app/views/collections/_list_view.html.haml | 2 +- app/views/concepts/_list.html.haml | 2 +- app/views/recommender/index.html.haml | 2 +- 20 files changed, 258 insertions(+), 255 deletions(-) create mode 100644 app/assets/stylesheets/components/tree_view.scss create mode 100644 app/controllers/concerns/terms_reuses.rb diff --git a/app/assets/stylesheets/bioportal.scss b/app/assets/stylesheets/bioportal.scss index 1252111f8..52e35df22 100644 --- a/app/assets/stylesheets/bioportal.scss +++ b/app/assets/stylesheets/bioportal.scss @@ -637,209 +637,7 @@ li.ac_over > .obsolete_class { font-style: italic; } -/******************** -## TREE VIEW -*********************/ -div.tree_error { - background: none repeat scroll 0 0 lightYellow; - font-weight: 600; - padding: 5px 10px; -} - -.expansion_error { - color: red; - font-size: x-small; - font-style: oblique; - padding: 0 3px; -} - -#bd ul.simpleTree li{ - margin-left: 0px; - padding: 5px 0 0 10px; -} - -#bd ul.simpleTree{ - margin-left:0px; - margin-bottom:0px; -} - -.simpleTree { - margin:0; - padding:0; - /* - overflow:auto; - width: 250px; - height:350px; - overflow:auto; - border: 1px solid #444444; - */ - a.tree-link { - display: inline-block; - padding: 5px; - word-break: break-all; - text-wrap: wrap; - color: var(--primary-color) !important; - } - a.tree-link.active { - cursor: default; - background-color: var(--light-color); - font-weight: bold; - border-radius: 3px; - padding: 7px 5px; - } - - .tree-border-left{ - border-left: 2px dotted #eee; - margin-left: 2px; - } -} -.simpleTree li { - list-style: none; - margin:0; - padding:0 0 0 22px; - line-height: 14px; -} -.simpleTree li span { - display:inline; - clear: left; - white-space: nowrap; -} -.simpleTree ul { - margin:0; - padding:0; -} -.simpleTree .root ul { - margin:0; -} -.simpleTree .root { - margin-left:-16px; - /*background: url(/images/tree/root.gif) no-repeat 16px 0 #ffffff;*/ -} -.simpleTree .line { - margin:0 0 0 -16px; - padding:0; - line-height: 3px; - height:3px; - font-size:3px; - background: image-url('jquery.simple.tree/line_bg.gif') 0 0 no-repeat transparent; -} -.simpleTree .line-last { - margin:0 0 0 -16px; - padding:0; - line-height: 3px; - height:3px; - font-size:3px; - background: image-url('jquery.simple.tree/spacer.gif') 0 0 no-repeat transparent; -} -.simpleTree .line-over { - margin:0 0 0 -16px; - padding:0; - line-height: 3px; - height:3px; - font-size:3px; - background: image-url('jquery.simple.tree/line_bg_over.gif') 0 0 no-repeat transparent; -} -.simpleTree .line-over-last { - margin:0 0 0 -16px; - padding:0; - line-height: 3px; - height:3px; - font-size:3px; - background: image-url('jquery.simple.tree/line_bg_over_last.gif') 0 0 no-repeat transparent; -} -.simpleTree .folder-open { - margin-left:-16px; - background: image-url('jquery.simple.tree/collapsable.gif') 0 -2px no-repeat #fff; -} -.simpleTree .folder-open-last { - margin-left:-16px; - background: image-url('jquery.simple.tree/collapsable-last.gif') 0 -2px no-repeat #fff; -} -.simpleTree .folder-close { - margin-left:-16px; - background: image-url('jquery.simple.tree/expandable.gif') 0 -2px no-repeat #fff; -} -.simpleTree .folder-close-last { - margin-left:-16px; - background: image-url('jquery.simple.tree/expandable-last.gif') 0 -2px no-repeat #fff; -} -.simpleTree .doc { - margin-left:-16px; - background: image-url('jquery.simple.tree/leaf.gif') 0 -1px no-repeat #fff; -} -.simpleTree .doc-last { - margin-left:-16px; - background: image-url('jquery.simple.tree/leaf-last.gif') 0 -1px no-repeat #fff; -} -.simpleTree .ajax { - background: image-url('jquery.simple.tree/spinner.gif') no-repeat 0 0 #ffffff; - height: 16px; - display:none; -} -.simpleTree .ajax li { - display:none; - margin:0; - padding:0; -} -.simpleTree .trigger { - display:inline; - margin-left:-32px; - width: 28px; - height: 11px; - cursor:pointer; -} -.simpleTree .text { - cursor: default; - padding: 0 2px; -} -.simpleTree .active { - cursor: default; - background-color: #B9D5E4; - font-weight: bold; - padding-top: 0px; - padding-right: 2px; - padding-bottom: 0px; - padding-left: 2px; -} -.simpleTree a, .simpleTree a:hover { - text-decoration: none; - color: black; -} -.simpleTree a:hover { - cursor: pointer; -} -#drag_container { - background:#ffffff; - color:#000; - font: normal 11px arial, tahoma, helvetica, sans-serif; - border: 1px dashed #767676; -} -#drag_container ul { - list-style: none; - padding:0; - margin:0; -} -#drag_container li { - list-style: none; - background-color:#ffffff; - line-height:18px; - white-space: nowrap; - padding:1px 1px 0px 16px; - margin:0; -} -#drag_container li span { - padding:0; -} -#drag_container li.doc, #drag_container li.doc-last { - background: image-url('jquery.simple.tree/leaf.gif') no-repeat -17px 0 #ffffff; -} -#drag_container .folder-close, #drag_container .folder-close-last { - background: image-url('jquery.simple.tree/expandable.gif') no-repeat -17px 0 #ffffff; -} -#drag_container .folder-open, #drag_container .folder-open-last { - background: image-url('jquery.simple.tree/collapsable.gif') no-repeat -17px 0 #ffffff; -} .contextMenu { display:none; } diff --git a/app/assets/stylesheets/components/index.scss b/app/assets/stylesheets/components/index.scss index c3d57ff51..62355eb78 100644 --- a/app/assets/stylesheets/components/index.scss +++ b/app/assets/stylesheets/components/index.scss @@ -33,4 +33,5 @@ @import "range_slider"; @import "ontologies_selector"; @import "loader"; -@import "vertical_tabs"; \ No newline at end of file +@import "vertical_tabs"; +@import "tree_view"; \ No newline at end of file diff --git a/app/assets/stylesheets/components/tree_view.scss b/app/assets/stylesheets/components/tree_view.scss new file mode 100644 index 000000000..1582b9c3a --- /dev/null +++ b/app/assets/stylesheets/components/tree_view.scss @@ -0,0 +1,170 @@ +.tree-view-reuse-icon{ + display: inline; +} +.tree-view-reuse-icon svg{ + width: 13px; +} + +div.tree_error { + background: none repeat scroll 0 0 lightYellow; + font-weight: 600; + padding: 5px 10px; +} + +.expansion_error { + color: red; + font-size: x-small; + font-style: oblique; + padding: 0 3px; +} + +#bd ul.simpleTree li{ + margin-left: 0px; + padding: 5px 0 0 10px; +} + +#bd ul.simpleTree{ +margin-left:0px; +margin-bottom:0px; +} + +.simpleTree { +margin:0; +padding:0; + +a.tree-link { + display: inline-block; + padding: 5px; + word-break: break-all; + text-wrap: wrap; + color: var(--primary-color) !important; +} + +a.tree-link.active { + cursor: default; + background-color: var(--light-color); + font-weight: bold; + border-radius: 3px; + padding: 7px 5px; +} + +.tree-border-left{ + border-left: 2px dotted #eee; + margin-left: 2px; +} +} +.simpleTree li { +list-style: none; +margin:0; +padding:0 0 0 22px; +line-height: 14px; +} +.simpleTree li span { +display:inline; +clear: left; +white-space: nowrap; +} +.simpleTree ul { +margin:0; +padding:0; +} +.simpleTree .root ul { +margin:0; +} +.simpleTree .root { +margin-left:-16px; +/*background: url(/images/tree/root.gif) no-repeat 16px 0 #ffffff;*/ +} +.simpleTree .line { +margin:0 0 0 -16px; +padding:0; +line-height: 3px; +height:3px; +font-size:3px; +background: image-url('jquery.simple.tree/line_bg.gif') 0 0 no-repeat transparent; +} +.simpleTree .line-last { +margin:0 0 0 -16px; +padding:0; +line-height: 3px; +height:3px; +font-size:3px; +background: image-url('jquery.simple.tree/spacer.gif') 0 0 no-repeat transparent; +} +.simpleTree .line-over { +margin:0 0 0 -16px; +padding:0; +line-height: 3px; +height:3px; +font-size:3px; +background: image-url('jquery.simple.tree/line_bg_over.gif') 0 0 no-repeat transparent; +} +.simpleTree .line-over-last { +margin:0 0 0 -16px; +padding:0; +line-height: 3px; +height:3px; +font-size:3px; +background: image-url('jquery.simple.tree/line_bg_over_last.gif') 0 0 no-repeat transparent; +} +.simpleTree .folder-open { +margin-left:-16px; +background: image-url('jquery.simple.tree/collapsable.gif') 0 -2px no-repeat #fff; +} +.simpleTree .folder-open-last { +margin-left:-16px; +background: image-url('jquery.simple.tree/collapsable-last.gif') 0 -2px no-repeat #fff; +} +.simpleTree .folder-close { +margin-left:-16px; +background: image-url('jquery.simple.tree/expandable.gif') 0 -2px no-repeat #fff; +} +.simpleTree .folder-close-last { +margin-left:-16px; +background: image-url('jquery.simple.tree/expandable-last.gif') 0 -2px no-repeat #fff; +} +.simpleTree .doc { +margin-left:-16px; +background: image-url('jquery.simple.tree/leaf.gif') 0 -1px no-repeat #fff; +} +.simpleTree .doc-last { +margin-left:-16px; +background: image-url('jquery.simple.tree/leaf-last.gif') 0 -1px no-repeat #fff; +} +.simpleTree .ajax { +background: image-url('jquery.simple.tree/spinner.gif') no-repeat 0 0 #ffffff; +height: 16px; +display:none; +} +.simpleTree .ajax li { +display:none; +margin:0; +padding:0; +} +.simpleTree .trigger { +display:inline; +margin-left:-32px; +width: 28px; +height: 11px; +cursor:pointer; +} +.simpleTree .text { +cursor: default; +padding: 0 2px; +} +.simpleTree .active { +cursor: default; +background-color: #B9D5E4; +font-weight: bold; +padding-top: 0px; +padding-right: 2px; +padding-bottom: 0px; +padding-left: 2px; +} +.simpleTree a, .simpleTree a:hover { +text-decoration: none; +color: black; +} +.simpleTree a:hover { +cursor: pointer; +} \ No newline at end of file diff --git a/app/assets/stylesheets/concepts.scss b/app/assets/stylesheets/concepts.scss index 789ee738c..330d00eb5 100644 --- a/app/assets/stylesheets/concepts.scss +++ b/app/assets/stylesheets/concepts.scss @@ -165,4 +165,5 @@ div.synonym-change-request button { .concepts_json_button{ margin-right: 5px; margin-top: -4px; -} \ No newline at end of file +} + diff --git a/app/components/tree_link_component.rb b/app/components/tree_link_component.rb index 91eb8b054..73da902f2 100644 --- a/app/components/tree_link_component.rb +++ b/app/components/tree_link_component.rb @@ -2,7 +2,7 @@ class TreeLinkComponent < ViewComponent::Base include MultiLanguagesHelper, ModalHelper, ApplicationHelper - def initialize(child:, href:, children_href: , selected: false , data: {}, muted: false, target_frame: nil, open_in_modal: false) + def initialize(child:, href:, children_href: , selected: false , data: {}, muted: false, target_frame: nil, open_in_modal: false, is_reused: nil) @child = child @active_style = selected ? 'active' : '' #@icons = child.relation_icon(node) @@ -28,6 +28,8 @@ def initialize(child:, href:, children_href: , selected: false , data: {}, muted end @open_in_modal = open_in_modal + + @is_reused = is_reused end diff --git a/app/components/tree_link_component/tree_link_component.html.haml b/app/components/tree_link_component/tree_link_component.html.haml index c66ef7131..7317e2834 100644 --- a/app/components/tree_link_component/tree_link_component.html.haml +++ b/app/components/tree_link_component/tree_link_component.html.haml @@ -6,7 +6,9 @@ %a{id: @child.id, data: @data, title: @tooltip, href: @href, class: "tree-link #{@muted_style} #{@active_style} #{border_left} #{open?}"} = @pref_label_html - + - if @is_reused + .tree-view-reuse-icon + = inline_svg_tag 'icons/reuses.svg' - if @child.hasChildren && !@child.expanded? = render TurboFrameComponent.new(id: "#{child_id}_childs") - elsif @child.expanded? diff --git a/app/controllers/collections_controller.rb b/app/controllers/collections_controller.rb index 14f697902..31b5db778 100644 --- a/app/controllers/collections_controller.rb +++ b/app/controllers/collections_controller.rb @@ -6,8 +6,7 @@ def index acronym = params[:ontology] @ontology = LinkedData::Client::Models::Ontology.find_by_acronym(acronym).first ontology_not_found(acronym) if @ontology.nil? - - + @submission = @ontology.explore.latest_submission(include:'uriRegexPattern,preferredNamespaceUri') collection_id = params[:collectionid] @collection = get_collection(@ontology, collection_id) if collection_id @@ -31,7 +30,8 @@ def index next_page_url: "/ontologies/#{@ontology.acronym}/collections", child_url: "/ontologies/#{@ontology.acronym}/collections/show", child_turbo_frame: 'collection', child_param: :collectionid, - results: results, next_page: next_page, total_count: total_count + results: results, next_page: next_page, + total_count: total_count ) end end @@ -53,6 +53,7 @@ def show_label def show_members @ontology = LinkedData::Client::Models::Ontology.find_by_acronym(params[:ontology_id] || params[:ontology]).first + @submission = @ontology.explore.latest_submission(include:'uriRegexPattern,preferredNamespaceUri') @collection = get_request_collection page = params[:page] || '1' @auto_click = page.to_s.eql?('1') diff --git a/app/controllers/concepts_controller.rb b/app/controllers/concepts_controller.rb index 7c86bb48f..196a61f97 100644 --- a/app/controllers/concepts_controller.rb +++ b/app/controllers/concepts_controller.rb @@ -4,6 +4,7 @@ class ConceptsController < ApplicationController include MappingsHelper include ConceptsHelper include TurboHelper + include TermsReuses layout 'ontology' @@ -44,9 +45,7 @@ def index @ontology = LinkedData::Client::Models::Ontology.find_by_acronym(params[:ontology]).first @ob_instructions = helpers.ontolobridge_instructions_template(@ontology) - # 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 = @ontology.explore.latest_submission(include: 'all') @concept = @ontology.explore.single_class({full: true}, params[:id]) concept_not_found(params[:id]) if @concept.nil? @@ -57,7 +56,7 @@ def index render turbo_stream: [ replace(helpers.child_id(@concept) + '_open_link') { TreeLinkComponent.tree_close_icon }, replace(helpers.child_id(@concept) + '_childs') do - helpers.concepts_tree_component(@concept, @concept, @ontology.acronym, Array(@schemes), request_lang, sub_tree: true) + helpers.concepts_tree_component(@concept, @concept, @ontology.acronym, Array(@schemes), request_lang, sub_tree: true, submission: @submission) end ] end @@ -78,11 +77,12 @@ def show_definition def show_tree @ontology = LinkedData::Client::Models::Ontology.find_by_acronym(params[:ontology]).first + @submission = @ontology.explore.latest_submission(include:'uriRegexPattern,preferredNamespaceUri') if @ontology.nil? || @ontology.errors ontology_not_found(params[:ontology]) else get_class(params) #application_controller - + not_found(t('concepts.missing_roots')) if @root.nil? render inline: helpers.concepts_tree_component(@root, @concept, @@ -96,6 +96,7 @@ def show_date_sorted_list if @ontology.nil? ontology_not_found(params[:ontology]) else + @submission = @ontology.explore.latest_submission(include: 'uriRegexPattern,preferredNamespaceUri') page = params[:page] @last_date = params[:last_date] auto_click = page.to_s.eql?('1') diff --git a/app/controllers/concerns/terms_reuses.rb b/app/controllers/concerns/terms_reuses.rb new file mode 100644 index 000000000..82eef51c9 --- /dev/null +++ b/app/controllers/concerns/terms_reuses.rb @@ -0,0 +1,15 @@ +module TermsReuses + extend ActiveSupport::Concern + + def concept_reused?(submission: nil, concept_id: nil) + uri_regex_pattern?(submission, concept_id) || preffered_namespace_uri?(submission, concept_id) + end + + private + def uri_regex_pattern?(submission, concept_id) + !(concept_id =~ Regexp.new(submission&.uriRegexPattern || '')) + end + def preffered_namespace_uri?(submission, concept_id) + !(concept_id.include?(submission&.preferredNamespaceUri || '')) + end +end diff --git a/app/controllers/instances_controller.rb b/app/controllers/instances_controller.rb index a980ccc61..1698e61d2 100644 --- a/app/controllers/instances_controller.rb +++ b/app/controllers/instances_controller.rb @@ -1,5 +1,5 @@ class InstancesController < ApplicationController - include InstancesHelper, SearchContent + include InstancesHelper, SearchContent, TermsReuses def index if params[:type].blank? @@ -10,7 +10,7 @@ def index end get_ontology(params) - + @submission = @ontology.explore.latest_submission(include:'uriRegexPattern,preferredNamespaceUri') query, page, page_size = helpers.search_content_params results, _, next_page, total_count = search_ontologies_content(query: query, @@ -50,4 +50,4 @@ def get_ontology(params) @ontology = LinkedData::Client::Models::Ontology.find_by_acronym(params[:ontology] || params[:acronym] || params[:ontology_id]).first ontology_not_found(params[:ontology]) if @ontology.nil? end -end \ No newline at end of file +end diff --git a/app/controllers/properties_controller.rb b/app/controllers/properties_controller.rb index 0ff2a3167..194f494f3 100644 --- a/app/controllers/properties_controller.rb +++ b/app/controllers/properties_controller.rb @@ -1,9 +1,11 @@ class PropertiesController < ApplicationController - include TurboHelper, SearchContent + include TurboHelper, SearchContent, TermsReuses def index acronym = params[:ontology] @ontology = LinkedData::Client::Models::Ontology.find_by_acronym(acronym).first + @submission = @ontology.explore.latest_submission(include:'uriRegexPattern,preferredNamespaceUri') + ontology_not_found(acronym) if @ontology.nil? if params[:search].blank? @@ -44,10 +46,14 @@ def show_children @property = get_property(id, acronym) @property.children = property_children(id, acronym) + @ontology = LinkedData::Client::Models::Ontology.find_by_acronym(acronym).first + @submission = @ontology.explore.latest_submission({include: 'uriRegexPattern,preferredNamespaceUri'}) + + render turbo_stream: [ replace(helpers.child_id(@property) + '_open_link') { TreeLinkComponent.tree_close_icon }, replace(helpers.child_id(@property) + '_childs') do - helpers.property_tree_component(@property, @property, acronym, request_lang, sub_tree: true) + helpers.property_tree_component(@property, @property, acronym, request_lang, sub_tree: true, submission: @submission) end ] end @@ -85,7 +91,6 @@ def index_tree(container_id) @property ||= @root.children.first end - render inline: helpers.property_tree_component(@root, @property, @ontology.acronym, request_lang, id: container_id, auto_click: true) diff --git a/app/controllers/schemes_controller.rb b/app/controllers/schemes_controller.rb index bea96a89d..7fbbcc973 100644 --- a/app/controllers/schemes_controller.rb +++ b/app/controllers/schemes_controller.rb @@ -6,9 +6,9 @@ def index acronym = params[:ontology] @ontology = LinkedData::Client::Models::Ontology.find_by_acronym(acronym).first ontology_not_found(acronym) if @ontology.nil? + @submission_latest = @submission = @ontology.explore.latest_submission(include: 'all') if params[:search].blank? - @submission_latest = @ontology.explore.latest_submission(include: 'all', invalidate_cache: invalidate_cache?) rescue @ontology.explore.latest_submission(include: '') @schemes = get_schemes(@ontology) render partial: 'schemes/tree_view' @@ -26,8 +26,8 @@ def index next_page_url: "/ontologies/#{@ontology.acronym}/schemes", child_url: "/ontologies/#{@ontology.acronym}/schemes/show", child_turbo_frame: 'scheme', child_param: :schemeid, - results: results, next_page: next_page, total_count: total_count - ) + results: results, next_page: next_page, total_count: total_count) + end end diff --git a/app/helpers/components_helper.rb b/app/helpers/components_helper.rb index 6d870bc2d..210e4ab57 100644 --- a/app/helpers/components_helper.rb +++ b/app/helpers/components_helper.rb @@ -1,4 +1,5 @@ module ComponentsHelper + include TermsReuses def chips_component(id: , name: , label: , value: , checked: false , tooltip: nil, &block) content_tag(:div, data: { controller: 'tooltip' }, title: tooltip) do @@ -46,7 +47,7 @@ def search_page_input_component(name:, value: nil, placeholder: , button_icon: ' end end - def paginated_list_component(id:, results:, next_page_url:, child_url:, child_turbo_frame:, child_param:, open_in_modal: false , selected: nil, auto_click: false) + def paginated_list_component(id:, results:, next_page_url:, child_url:, child_turbo_frame:, child_param:, open_in_modal: false , selected: nil, auto_click: false, submission: nil) render(TreeInfiniteScrollComponent.new( id: id, collection: results.collection, @@ -62,7 +63,7 @@ def paginated_list_component(id:, results:, next_page_url:, child_url:, child_tu end end) end - + concepts = c.collection if concepts && !concepts.empty? concepts.each do |concept| @@ -76,7 +77,8 @@ def paginated_list_component(id:, results:, next_page_url:, child_url:, child_tu selected: selected.blank? ? false : concept.id.eql?(selected) , target_frame: child_turbo_frame, data: data, - open_in_modal: open_in_modal + open_in_modal: open_in_modal, + is_reused: concept_reused?(submission: submission, concept_id: concept.id) ))) end end @@ -132,13 +134,13 @@ def link_to_with_actions(link_to_tag, acronym: nil, url: nil, copy: true, check_ tag.html_safe end - def tree_component(root, selected, target_frame:, sub_tree: false, id: nil, auto_click: false, &child_data_generator) + def tree_component(root, selected, target_frame:, sub_tree: false, id: nil, auto_click: false, submission: nil, &child_data_generator) root.children.sort! { |a, b| (a.prefLabel || a.id).downcase <=> (b.prefLabel || b.id).downcase } - + render TreeViewComponent.new(id: id, sub_tree: sub_tree, auto_click: auto_click) do |tree_child| root.children.each do |child| children_link, data, href = child_data_generator.call(child) - + if children_link.nil? || data.nil? || href.nil? raise ArgumentError, t('components.error_block') end @@ -147,9 +149,9 @@ def tree_component(root, selected, target_frame:, sub_tree: false, id: nil, auto children_href: children_link, selected: child.id.eql?(selected&.id), muted: child.isInActiveScheme&.empty?, target_frame: target_frame, - data: data) do + data: data, is_reused: concept_reused?(submission: submission, concept_id: child.id)) do tree_component(child, selected, target_frame: target_frame, sub_tree: true, - id: id, auto_click: auto_click, &child_data_generator) + id: id, auto_click: auto_click, submission: submission, &child_data_generator) end end end @@ -277,4 +279,5 @@ def form_cancel_button end end + end diff --git a/app/helpers/concepts_helper.rb b/app/helpers/concepts_helper.rb index fc1f1cf41..3cec8ade6 100644 --- a/app/helpers/concepts_helper.rb +++ b/app/helpers/concepts_helper.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true module ConceptsHelper - + include TermsReuses def concept_link(acronym, child, language) child.id.eql?('bp_fake_root') ? '#' : "/ontologies/#{acronym}/concepts/show?id=#{CGI.escape(child.id)}&language=#{language}" end @@ -20,8 +20,11 @@ def concept_tree_data(acronym, child, language, concept_schemes) } [children_link, data, href] end - def concepts_tree_component(root, selected_concept, acronym, concept_schemes, language, sub_tree: false, id: nil, auto_click: false) - tree_component(root, selected_concept, target_frame: 'concept_show', sub_tree: sub_tree, id: id, auto_click: auto_click) do |child| + + def concepts_tree_component(root, selected_concept, acronym, concept_schemes, language, sub_tree: false, id: nil, + auto_click: false, submission: @submission) + tree_component(root, selected_concept, target_frame: 'concept_show', sub_tree: sub_tree, id: id, + auto_click: auto_click, submission: submission) do |child| concept_tree_data(acronym, child, language, concept_schemes) end end @@ -105,25 +108,26 @@ def same_period?(year, month, date) year.eql?(date.year) && month.eql?(date.strftime('%B')) end - def concepts_li_list(concepts, auto_click: false, selected_id: nil) + def concepts_li_list(concepts, auto_click: false, selected_id: nil, submission: nil) out = '' concepts.each do |concept| children_link, data, href = concept_tree_data(@ontology.acronym, concept, request_lang, []) + out += render TreeLinkComponent.new(child: concept, href: href, children_href: '#', selected: concept.id.eql?(selected_id) && auto_click, - target_frame: 'concept_show', data: data) + target_frame: 'concept_show', data: data, is_reused: concept_reused?(submission: submission, concept_id: concept.id)) end out end - def render_concepts_by_dates(auto_click: false) + def render_concepts_by_dates(auto_click: false, submission: @submission) return if @concepts_year_month.empty? first_year, first_month_concepts = @concepts_year_month.shift first_month, first_concepts = first_month_concepts.shift out = '' if same_period?(first_year, first_month, @last_date) - out += "
    #{concepts_li_list(first_concepts, auto_click: auto_click)}
" + out += "
    #{concepts_li_list(first_concepts, auto_click: auto_click, submission: submission)}
" else tmp = {} tmp[first_month] = first_concepts @@ -136,8 +140,9 @@ def render_concepts_by_dates(auto_click: false) @concepts_year_month.each do |year, month_concepts| month_concepts.each do |month, concepts| out += "
    #{month + ' ' + year.to_s}" - out += concepts_li_list(concepts, auto_click: auto_click, selected_id: selected_id) - out += "
" + out += concepts_li_list(concepts, auto_click: auto_click, selected_id: selected_id, + submission: submission) + out += '' end end raw out @@ -198,4 +203,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/properties_helper.rb b/app/helpers/properties_helper.rb index a485e79e2..9d5459f01 100644 --- a/app/helpers/properties_helper.rb +++ b/app/helpers/properties_helper.rb @@ -17,8 +17,9 @@ def property_tree_data(acronym, child, language) } [children_link, data, href] end - def property_tree_component(root, selected_concept, acronym, language, sub_tree: false, id: nil, auto_click: false) - tree_component(root, selected_concept, target_frame: 'property_show', sub_tree: sub_tree, id: id, auto_click: auto_click) do |child| + + def property_tree_component(root, selected_concept, acronym, language, sub_tree: false, id: nil, auto_click: false, submission: @submission) + tree_component(root, selected_concept, target_frame: 'property_show', sub_tree: sub_tree, id: id, auto_click: auto_click, submission: submission) do |child| property_tree_data(acronym, child, language) end end @@ -32,4 +33,4 @@ def no_properties_alert t('properties.no_properties_alert', acronym: @ontology.acronym) end end -end \ No newline at end of file +end diff --git a/app/helpers/schemes_helper.rb b/app/helpers/schemes_helper.rb index 39bc77a73..9d3019cd3 100644 --- a/app/helpers/schemes_helper.rb +++ b/app/helpers/schemes_helper.rb @@ -77,7 +77,7 @@ def schemes_data [schemes_labels, main_scheme, selected_scheme] end - def schemes_tree(schemes_labels, main_scheme_label, selected_scheme_id) + def schemes_tree(schemes_labels, main_scheme_label, selected_scheme_id, submission: @submission_latest) selected_scheme = nil schemes = sorted_labels(schemes_labels).map do |s| next nil unless main_scheme_label.nil? || s['prefLabel'] != main_scheme_label['prefLabel'] @@ -104,9 +104,7 @@ def schemes_tree(schemes_labels, main_scheme_label, selected_scheme_id) root = OpenStruct.new root.children = children selected_scheme = selected_scheme || main_scheme || root.children.first - - - tree_component(root, selected_scheme, target_frame: 'scheme', auto_click: false) do |child| + tree_component(root, selected_scheme, target_frame: 'scheme', auto_click: false, submission: submission) do |child| href = scheme_path(child['@id'], request_lang) rescue '' data = { schemeid: (child['@id'] rescue '')} ["#", data, href] diff --git a/app/helpers/search_helper.rb b/app/helpers/search_helper.rb index 524cd521e..ef0a80f65 100644 --- a/app/helpers/search_helper.rb +++ b/app/helpers/search_helper.rb @@ -8,7 +8,7 @@ def search_content_params def render_search_paginated_list(container_id:, next_page_url:, child_url:, child_turbo_frame:, child_param:, show_count: nil, lang: request_lang, - auto_click: false, results: , next_page: ,total_count: ) + auto_click: false, results: , next_page: ,total_count:, submission: @submission ) query, page, _ = search_content_params @results = OpenStruct.new @@ -34,7 +34,7 @@ def render_search_paginated_list(container_id:, next_page_url:, child_url:, chil child_param: child_param, child_turbo_frame: child_turbo_frame, open_in_modal: show_count, - selected: selected)) + selected: selected, submission: submission)) ] else render inline: paginated_list_component(id: container_id, @@ -45,7 +45,7 @@ def render_search_paginated_list(container_id:, next_page_url:, child_url:, chil child_turbo_frame: child_turbo_frame, open_in_modal: show_count, selected: selected, - auto_click: auto_click) + auto_click: auto_click, submission: submission) end end -end \ No newline at end of file +end diff --git a/app/views/collections/_list_view.html.haml b/app/views/collections/_list_view.html.haml index f05ee7194..a50abe0ce 100644 --- a/app/views/collections/_list_view.html.haml +++ b/app/views/collections/_list_view.html.haml @@ -13,4 +13,4 @@ - scheme.id = scheme['@id'] - tree_child.child(child: scheme, href: collection_path(collection['@id'], request_lang), children_href: '#', selected: scheme.id.eql?(selected_collection_id), - target_frame: 'collection', data: {collectionid: collection['@id']}) + target_frame: 'collection', data: {collectionid: collection['@id']}, is_reused: concept_reused?(submission: @submission, concept_id: scheme.id)) diff --git a/app/views/concepts/_list.html.haml b/app/views/concepts/_list.html.haml index e00c5966e..9c9a28a84 100644 --- a/app/views/concepts/_list.html.haml +++ b/app/views/concepts/_list.html.haml @@ -9,7 +9,7 @@ - children_link, data, href = concept_tree_data(@ontology.acronym, concept, request_lang, []) = render TreeLinkComponent.new(child: concept, href: href, children_href: '#', selected: concept.id.eql?(concepts.first.id) && c.auto_click?, - target_frame: 'concept_show', data: data) + target_frame: 'concept_show', data: data, is_reused: concept_reused?(submission: @submission, concept_id: concept.id)) - c.error do = t('concepts.list_error') diff --git a/app/views/recommender/index.html.haml b/app/views/recommender/index.html.haml index 10a5c8333..5ac33ba53 100644 --- a/app/views/recommender/index.html.haml +++ b/app/views/recommender/index.html.haml @@ -51,7 +51,7 @@ .title = t('recommender.weights_configuration') .inputs-container - -#binding.pry + .ninput = render Input::RangeSliderComponent.new(label: t('recommender.coverage'), name: "wc", value: params[:wc] || 0.55, min: '0', max: '1', step: '0.01') .ninput From aca0c721e7b3f6c8e2d3c87a709ee802a0c96b3c Mon Sep 17 00:00:00 2001 From: Imad Bourouche Date: Mon, 24 Jun 2024 13:35:50 +0200 Subject: [PATCH 28/57] Fix: run production mode (#679) * remove duplicate from gemfile * add port 3000 for production to use it with ontoportal_docker * add commands to run production correctly --- Gemfile | 1 - bin/ontoportal | 2 +- docker-compose.yml | 2 ++ 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Gemfile b/Gemfile index 64a6783f9..95c8f370d 100644 --- a/Gemfile +++ b/Gemfile @@ -105,7 +105,6 @@ gem 'net-http', '~> 0.3.2' # Multi-Provider Authentication gem 'omniauth' -gem 'omniauth-rails_csrf_protection' gem 'omniauth-github' gem 'omniauth-google-oauth2' gem 'omniauth-keycloak' diff --git a/bin/ontoportal b/bin/ontoportal index a2c030b23..3fa5d2939 100755 --- a/bin/ontoportal +++ b/bin/ontoportal @@ -135,7 +135,7 @@ dev() { bash_cmd+=" (bundle config unset local.ontologies_api_client) &&" fi done - bash_cmd+=" (bundle check || bundle install) && bin/rails db:prepare && bundle exec rails s -b 0.0.0.0 -p 3000" + bash_cmd+=" (bundle check || bundle install) && bin/rails secret && EDITOR='nano' bin/rails credentials:edit && bin/rails db:prepare && bundle exec rails s -b 0.0.0.0 -p 3000" docker_run_cmd+=" --service-ports dev bash -c \"$bash_cmd\"" echo "$docker_run_cmd" echo "Run: bundle exec rails s -b 0.0.0.0 -p 3000" diff --git a/docker-compose.yml b/docker-compose.yml index c5a32c9b6..72b8827af 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -77,6 +77,8 @@ services: #RAILS_MASTER_KEY: TODO BIOPORTAL_WEB_UI_DATABASE_PASSWORD: root MEMCACHE_SERVERS: "cache:11211" + ports: + - "3000:3000" depends_on: db: condition: service_healthy From 6cc421c1d1fae32f2d1574cc23f2ef7d35c1f83f Mon Sep 17 00:00:00 2001 From: Bilel Kihal <61744974+Bilelkihal@users.noreply.github.com> Date: Wed, 26 Jun 2024 17:11:53 +0200 Subject: [PATCH 29/57] Fix: json file extention in export metadata summary page (#683) --- .../rdf_highlighter_component_controller.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/components/display/rdf_highlighter_component/rdf_highlighter_component_controller.js b/app/components/display/rdf_highlighter_component/rdf_highlighter_component_controller.js index eda8a8f4b..86b8ecd3c 100644 --- a/app/components/display/rdf_highlighter_component/rdf_highlighter_component_controller.js +++ b/app/components/display/rdf_highlighter_component/rdf_highlighter_component_controller.js @@ -103,7 +103,7 @@ export default class extends Controller { downloadJsonLd () { this.#toJSONLD().then((jsonld) => { - this.#generateDownloadFile(JSON.stringify(jsonld, null, ' '), 'nt') + this.#generateDownloadFile(JSON.stringify(jsonld, null, ' '), 'json') }) } @@ -211,7 +211,6 @@ export default class extends Controller { // TODO: change MIME type? element.setAttribute('href', 'data:application/rdf+json;charset=utf-8,' + encodeURIComponent(content)) element.setAttribute('download', jQuery(document).data().bp.ontology.acronym + '_metadata.' + fileExtension) - element.style.display = 'none' document.body.appendChild(element) element.click() From 012985d89b62d52dd53829d6b14ff7deba3b2ba8 Mon Sep 17 00:00:00 2001 From: Syphax bouazzouni Date: Sat, 29 Jun 2024 17:20:32 +0200 Subject: [PATCH 30/57] hide analytics features if not enabled (#691) --- app/controllers/home_controller.rb | 10 ++++++++-- app/helpers/application_helper.rb | 11 ++++++++--- app/views/admin/index.html.haml | 6 +++++- app/views/home/index.html.haml | 2 +- 4 files changed, 22 insertions(+), 7 deletions(-) diff --git a/app/controllers/home_controller.rb b/app/controllers/home_controller.rb index 4519adb19..d3487816a 100644 --- a/app/controllers/home_controller.rb +++ b/app/controllers/home_controller.rb @@ -7,9 +7,15 @@ class HomeController < ApplicationController include FairScoreHelper def index - @analytics = helpers.ontologies_analytics + @analytics = helpers.ontologies_analytics # Calculate BioPortal summary statistics - @ont_count = @analytics.keys.size + + @ont_count = if @analytics.empty? + LinkedData::Client::Models::Ontology.all.size + else + @analytics.keys.size + end + metrics = LinkedData::Client::Models::Metrics.all metrics = metrics.each_with_object(Hash.new(0)) do |h, sum| h.to_hash.slice(:classes, :properties, :individuals).each { |k, v| sum[k] += v } diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 4c3ad3408..28722f4cb 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -37,9 +37,14 @@ def search_json_link(link = @json_url, style: '') def resolve_namespaces RESOLVE_NAMESPACE end + def ontologies_analytics - data = LinkedData::Client::Analytics.last_month.onts - data.map{|x| [x[:ont].to_s, x[:views]]}.to_h + begin + data = LinkedData::Client::Analytics.last_month.onts + data.map{|x| [x[:ont].to_s, x[:views]]}.to_h + rescue StandardError + {} + end end def get_apikey @@ -176,7 +181,7 @@ def add_proposal_button(parent_id, parent_type) class: "secondary-button regular-button slim", data: { show_modal_title_value: t('application.add_new_proposal')} end end - + def link?(str) # Regular expression to match strings starting with "http://" or "https://" diff --git a/app/views/admin/index.html.haml b/app/views/admin/index.html.haml index 9891c88f0..da8f0cbde 100644 --- a/app/views/admin/index.html.haml +++ b/app/views/admin/index.html.haml @@ -15,7 +15,11 @@ - selected = params[:section] || sections.first.downcase = render Layout::VerticalTabsComponent.new(header: t('admin.index.administration_console'), titles: sections, selected: selected, url_parameter: 'section') do |t| - t.item_content do - = render 'analytics' + - if @ontology_visits[:visits].empty? + %div.d-flex.justify-content-center + Google analytics not enabled + - else + = render 'analytics' - t.item_content do = render 'main' - t.item_content do diff --git a/app/views/home/index.html.haml b/app/views/home/index.html.haml index 37aa03e5c..83fc78158 100644 --- a/app/views/home/index.html.haml +++ b/app/views/home/index.html.haml @@ -173,7 +173,7 @@ %h4 = format_number_abbreviated(@users_count) %p= t("home.users") - .home-statistics-link.justify-content-end + .home-statistics-link.justify-content-end{style: @analytics.empty? && "visibility: hidden"} = link_to t("home.see_details"),'/statistics', target: "_blank" - if @slices From 7a989d6de28c20fc9ce31ef1d340380dbfaf465a Mon Sep 17 00:00:00 2001 From: Syphax bouazzouni Date: Mon, 1 Jul 2024 17:01:01 +0200 Subject: [PATCH 31/57] add search placeholder to data table component (#688) --- app/components/table_component.rb | 6 +++++- app/components/table_component/table_component.html.haml | 5 ++++- .../table_component/table_component_controller.js | 9 +++++++-- app/views/mappings/_count.html.haml | 2 +- 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/app/components/table_component.rb b/app/components/table_component.rb index 671048038..16bf2c096 100644 --- a/app/components/table_component.rb +++ b/app/components/table_component.rb @@ -5,7 +5,10 @@ class TableComponent < ViewComponent::Base renders_one :header, TableRowComponent renders_many :rows, TableRowComponent - def initialize(id: '', stripped: true, borderless: false, custom_class: '', layout_fixed: false, small_text: false, outline: false, sort_column: nil, paging: false, searching: false, no_init_sort: false) + def initialize(id: '', stripped: true, borderless: false, custom_class: '', layout_fixed: false, + small_text: false, outline: false, sort_column: nil, + paging: false, searching: false, search_placeholder: nil, + no_init_sort: false) super @id = id @stripped = stripped @@ -18,6 +21,7 @@ def initialize(id: '', stripped: true, borderless: false, custom_class: '', layo @paging = paging @no_init_sort = no_init_sort @custom_class =custom_class + @search_placeholder = search_placeholder end def stripped_class diff --git a/app/components/table_component/table_component.html.haml b/app/components/table_component/table_component.html.haml index 274e4a1bd..3bdb112da 100644 --- a/app/components/table_component/table_component.html.haml +++ b/app/components/table_component/table_component.html.haml @@ -1,4 +1,7 @@ -%div{'data-controller': 'table-component', 'data-table-component-sortcolumn-value': @sort_column, 'data-table-component-paging-value': @paging, 'data-table-component-searching-value': @searching, 'data-table-component-noinitsort-value': @no_init_sort} +%div{'data-controller': 'table-component', + 'data-table-component-sortcolumn-value': @sort_column, 'data-table-component-paging-value': @paging, + 'data-table-component-searching-value': @searching, 'data-table-component-noinitsort-value': @no_init_sort, + 'data-table-component-search-placeholder-value': @search_placeholder} %table.table-content{id: @id ,class: @custom_class + ' ' + stripped_class + ' ' + borderless_class + ' ' + layout_fixed_class + ' ' + mini_class + ' ' + outline_class} %thead = header diff --git a/app/components/table_component/table_component_controller.js b/app/components/table_component/table_component_controller.js index 1e9f4e0d6..2032bf449 100644 --- a/app/components/table_component/table_component_controller.js +++ b/app/components/table_component/table_component_controller.js @@ -8,7 +8,8 @@ export default class extends Controller { sortcolumn: String, paging: Boolean, searching: Boolean, - noinitsort: Boolean + noinitsort: Boolean, + searchPlaceholder: {type: String, default: 'Filter records'}, } connect(){ const table_component = this.element.querySelector('table') @@ -20,7 +21,11 @@ export default class extends Controller { info: false, searching: this.searchingValue, autoWidth: true, - order: this.noinitsortValue ? [] : [[default_sort_column, 'desc']] + order: this.noinitsortValue ? [] : [[default_sort_column, 'desc']], + language: { + search: '_INPUT_', + searchPlaceholder: this.searchPlaceholderValue + } }); } } diff --git a/app/views/mappings/_count.html.haml b/app/views/mappings/_count.html.haml index e3cd5f933..987837b6a 100644 --- a/app/views/mappings/_count.html.haml +++ b/app/views/mappings/_count.html.haml @@ -1,7 +1,7 @@ = turbo_frame_tag "mappings_table" do .summary-mappings-tab .summary-mappings-tab-table - = render TableComponent.new(id: 'summary-mappings-table', borderless: true, outline: true, searching: true, sort_column: '0', no_init_sort: true) do |t| + = render TableComponent.new(id: 'summary-mappings-table', borderless: true, outline: true, searching: true, sort_column: '0', no_init_sort: true, search_placeholder: "Filter by semantic resources") do |t| - t.header do |h| - h.th {t("mappings.count.ontology")} - h.th {t("mappings.count.mappings")} From 0d176d9e4aa8e2d5e0486d193d6b2ef2f8800002 Mon Sep 17 00:00:00 2001 From: Syphax bouazzouni Date: Mon, 1 Jul 2024 17:02:11 +0200 Subject: [PATCH 32/57] fix browse page contact titleizing (#689) --- .../ontology_browse_card_component.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/components/ontology_browse_card_component/ontology_browse_card_component.html.haml b/app/components/ontology_browse_card_component/ontology_browse_card_component.html.haml index 61daf0e9c..92e80c05d 100644 --- a/app/components/ontology_browse_card_component/ontology_browse_card_component.html.haml +++ b/app/components/ontology_browse_card_component/ontology_browse_card_component.html.haml @@ -47,7 +47,7 @@ - if ontology[:contact] %span.mx-1= t('components.by') %span.browse-uploaded-date.text-truncate - = ontology[:contact].humanize + = ontology[:contact].titleize - if ontology[:released] - date = render DateTimeFieldComponent.new(value: ontology[:released]) From 3cc06c7e6446fa6061167c355a5171d6fe9c78d7 Mon Sep 17 00:00:00 2001 From: Syphax bouazzouni Date: Mon, 1 Jul 2024 17:20:09 +0200 Subject: [PATCH 33/57] fix mappings concept link not opening empty pages (#690) --- app/helpers/mappings_helper.rb | 2 +- app/views/mappings/_show_line.html.haml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/helpers/mappings_helper.rb b/app/helpers/mappings_helper.rb index 352b42a20..afc85907a 100644 --- a/app/helpers/mappings_helper.rb +++ b/app/helpers/mappings_helper.rb @@ -52,7 +52,7 @@ def ajax_to_inter_portal_cls(cls) def ajax_to_internal_cls(cls) link_to("#{cls.id}".html_safe, - ontology_path(cls.explore.ontology.acronym, p: 'classes', conceptid: cls.id)) + ontology_path(cls.explore.ontology.acronym, p: 'classes', conceptid: cls.id), target: "_blank") end # to get the apikey from the interportal instance of the interportal class. diff --git a/app/views/mappings/_show_line.html.haml b/app/views/mappings/_show_line.html.haml index c741b3b49..bbfab2b78 100644 --- a/app/views/mappings/_show_line.html.haml +++ b/app/views/mappings/_show_line.html.haml @@ -14,11 +14,11 @@ - begin - ont = target_concept.explore.ontology - ont_name = ont.acronym - - ont_link = link_to ont_name, ontology_path(ont_name) + - ont_link = link_to ont_name, ontology_path(ont_name), 'data-turbo-frame':'_top' - rescue - ont_name = target_concept.links['ontology'] || target_concept.id - ont_link = ont_name - - cls_link = raw(get_link_for_cls_ajax(target_concept.id, ont_name)) + - cls_link = raw(get_link_for_cls_ajax(target_concept.id, ont_name, '_top')) - type = 'Internal' - else - cls_label = get_label_for_external_cls(target_concept.links["self"]) From 9d418c6caa2c2ce23dfbf987d0aca18a921c3339 Mon Sep 17 00:00:00 2001 From: Bilel Kihal <61744974+Bilelkihal@users.noreply.github.com> Date: Tue, 2 Jul 2024 09:47:22 +0200 Subject: [PATCH 34/57] Fix docker compose to make tests work (#695) --- docker-compose.yml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 72b8827af..3c70bbe88 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -17,9 +17,6 @@ x-app: &default-app condition: service_started node: condition: service_started - links: - - db - - cache environment: &env BUNDLE_WITHOUT: "" BUNDLE_PATH: /srv/ontoportal/bundle @@ -64,6 +61,9 @@ services: <<: *default-app ports: - "3000:3000" + links: + - db + - cache production: <<: *default-app @@ -79,6 +79,9 @@ services: MEMCACHE_SERVERS: "cache:11211" ports: - "3000:3000" + links: + - db + - cache depends_on: db: condition: service_healthy From 8c9cebd5a7842e8b21424254057ec62a4afdfd2f Mon Sep 17 00:00:00 2001 From: Imad Bourouche Date: Tue, 2 Jul 2024 17:29:57 +0200 Subject: [PATCH 35/57] Fix: check resolvability tool redirection (#694) --- app/helpers/check_resolvability_helper.rb | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/app/helpers/check_resolvability_helper.rb b/app/helpers/check_resolvability_helper.rb index 577576620..fc637ab75 100644 --- a/app/helpers/check_resolvability_helper.rb +++ b/app/helpers/check_resolvability_helper.rb @@ -60,11 +60,7 @@ def follow_redirection(url, format, timeout_seconds, redirect_limit = resolvabil end if response.is_a?(Net::HTTPRedirection) && response['location'] - if !uri.to_s.start_with?(response['location']) && uri.to_s.include?(response['location'].chomp('/')) - uri = URI.parse(uri.scheme + '://' + uri.host + '/' + response['location']) - else - uri = URI.parse(response['location']) - end + uri = URI.join(uri, response['location']) redirections << uri redirect_count += 1 end @@ -85,7 +81,7 @@ def check_resolvability_helper(url, negotiation_formats = resolvability_formats, supported_format = negotiation_formats.find_all do |format| begin redirections[format] = follow_redirection(url, format, timeout_seconds) - redirections[:result].eql?(2) + redirections[format][:result].eql?(2) rescue StandardError => e redirections[format] = resolvability_status(e.message, [], [], result: 0) false From 3f0f7125526cb9030f2aa4f2fffecab7bd65be32 Mon Sep 17 00:00:00 2001 From: Imad Bourouche Date: Tue, 2 Jul 2024 17:33:47 +0200 Subject: [PATCH 36/57] Feature: add rewrite condition in URI redirection rules (#684) * add rewrite condition in the rewrite rules * refactor and clean code of htaccess and nginx redirection rules --- .../ontologies_redirection_controller.rb | 67 +++++++++++++------ 1 file changed, 46 insertions(+), 21 deletions(-) diff --git a/app/controllers/ontologies_redirection_controller.rb b/app/controllers/ontologies_redirection_controller.rb index f690d0702..582817a90 100644 --- a/app/controllers/ontologies_redirection_controller.rb +++ b/app/controllers/ontologies_redirection_controller.rb @@ -30,11 +30,13 @@ def redirect # GET /ontologies/:acronym/htaccess def generate_htaccess ontology = LinkedData::Client::Models::Ontology.find_by_acronym(params[:acronym]).first - ontology_uri = ontology.explore.latest_submission(include: 'URI').URI + subminssions_params = ontology.explore.latest_submission(include: 'URI,preferredNamespaceUri') + ontology_uri = subminssions_params.URI + preferred_name_space_uri = subminssions_params.preferredNamespaceUri ontology_portal_url = "#{$UI_URL}/ontologies/#{params[:acronym]}" - @htaccess_content = generate_htaccess_content(ontology_portal_url, ontology_uri) - @nginx_content = generate_nginx_content(ontology_portal_url, ontology_uri) + @htaccess_content = generate_htaccess_content(ontology_portal_url, ontology_uri, preferred_name_space_uri) + @nginx_content = generate_nginx_content(ontology_portal_url, ontology_uri, preferred_name_space_uri) render 'ontologies/htaccess', layout: nil end @@ -47,34 +49,57 @@ def redirect_ontology private - def generate_htaccess_content(ontology_portal_url, ontology_uri) - ontology_rule = nil - if ontology_uri - ontology_uri += '/' unless ontology_uri.end_with?('/') - ontology_rule = "RewriteRule ^#{URI.parse(ontology_uri).path[1..-1]}?$ #{ontology_portal_url} [R=301,L]" - end - + def generate_htaccess_content(ontology_portal_url, ontology_uri, preferred_name_space_uri) + preferred_name_space_path = get_path(preferred_name_space_uri) + ontology_uri_path = get_path(ontology_uri) + + rewrite_condition = if preferred_name_space_path + "RewriteCond %{REQUEST_URI} ^.*#{preferred_name_space_path}.*$" + elsif ontology_uri_path + "RewriteCond %{REQUEST_URI} ^.*#{ontology_uri_path}.*$" + end + + ontology_rule = if ontology_uri_path + ontology_uri_path += '/' unless ontology_uri_path.end_with?('/') + "RewriteRule ^#{ontology_uri_path}?$ #{ontology_portal_url} [R=301,L]" + end + <<-HTACCESS.strip_heredoc - RewriteEngine On - #{ontology_rule if ontology_rule} - RewriteRule ^.*/([^/#]+)$ #{ontology_portal_url}/$1 [R=301,L] + RewriteEngine On + #{ontology_rule if ontology_rule} + #{rewrite_condition if rewrite_condition} + RewriteRule ^.*/([^/#]+)/?$ #{ontology_portal_url}/$1 [R=301,L] HTACCESS end - def generate_nginx_content(ontology_portal_url, ontology_uri) - ontology_rule = nil - if ontology_uri - ontology_uri += '/' unless ontology_uri.end_with?('/') - ontology_rule = "rewrite ^#{URI.parse(ontology_uri).path[1..-1]}?$ #{ontology_portal_url} permanent" - end + def generate_nginx_content(ontology_portal_url, ontology_uri, preferred_name_space_uri) + preferred_name_space_path = get_path(preferred_name_space_uri) + ontology_uri_path = get_path(ontology_uri) + + rewrite_condition = preferred_name_space_path || ontology_uri_path + + ontology_rule = if ontology_uri_path + ontology_uri_path += '/' unless ontology_uri_path.end_with?('/') + ontology_rule = "rewrite ^/#{ontology_uri_path}?$ #{ontology_portal_url} permanent;" + end <<-NGINX.strip_heredoc location / { #{ontology_rule if ontology_rule} - if ($request_uri ~ ^.*/([^/]+)$){ - return 301 #{ontology_portal_url}/$1; + if ($request_uri ~* #{rewrite_condition} ){ + rewrite ^.*/([^/]+)/?$ #{ontology_portal_url}/$1 permanent; } } NGINX end + + def get_path(uri) + begin + parsed_uri = URI.parse(uri) + parsed_uri.path[1..-1] + rescue URI::InvalidURIError + nil + end + end + end \ No newline at end of file From 5a78c27d039fb5edc8ae71d2013013266c3be572 Mon Sep 17 00:00:00 2001 From: Bilel Kihal <61744974+Bilelkihal@users.noreply.github.com> Date: Wed, 3 Jul 2024 06:40:16 +0200 Subject: [PATCH 37/57] Fix: User ontologies custom set updating (#685) * Fix ontologies custom set feature * enhance custom set feature style * remove duplicated action in home controller account, which is the same as show in users controller * clean application helper ontologies selector code * remove unecessary server calls in account page * Remove JQuery code in accounts page * remove repeated server call in custom ontologies features * fix the login flow test after deleting the repeated action related to `/acount` --- app/assets/stylesheets/account.scss | 9 ++++++ app/controllers/home_controller.rb | 21 -------------- app/controllers/users_controller.rb | 27 +++++++++--------- app/helpers/application_helper.rb | 4 +-- app/views/users/show.html.haml | 42 ++++++++++------------------ config/routes.rb | 2 +- test/integration/login_flows_test.rb | 2 +- test/system/login_flows_test.rb | 4 +-- 8 files changed, 44 insertions(+), 67 deletions(-) diff --git a/app/assets/stylesheets/account.scss b/app/assets/stylesheets/account.scss index c96f1b072..ade850735 100644 --- a/app/assets/stylesheets/account.scss +++ b/app/assets/stylesheets/account.scss @@ -229,6 +229,15 @@ justify-content: center; } +.account-page-custom-ontologies{ + display: flex; + flex-wrap: wrap; +} + +.account-page-custom-ontologies > div{ + margin-right: 10px; +} + @media only screen and (max-width: 1200px) { .account-page-first-row { width: 47vw; diff --git a/app/controllers/home_controller.rb b/app/controllers/home_controller.rb index d3487816a..ae0f3cfad 100644 --- a/app/controllers/home_controller.rb +++ b/app/controllers/home_controller.rb @@ -142,27 +142,6 @@ def site_config render json: bp_config_json end - def account - @title = t('home.account_title') - if session[:user].nil? - redirect_to controller: 'login', action: 'index', redirect: '/account' - return - end - - @user = LinkedData::Client::Models::User.get(session[:user].id, include: 'all') - - @user_ontologies = @user.customOntology - @user_ontologies ||= [] - - 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 - @user_projects = projects.select { |p| p.creator.include? @user.id } - - render 'users/show' - end - def feedback_complete; end def annotator_recommender_form diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index da3a01753..c5c675d62 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -23,19 +23,23 @@ def index # GET /users/1 # GET /users/1.xml def show + @title = t('home.account_title') + if session[:user].nil? + redirect_to controller: 'login', action: 'index', redirect: '/account' + return + end @user = if session[:user].admin? && params.has_key?(:id) find_user(params[:id]) else find_user(session[:user].id) end - - @all_ontologies = LinkedData::Client::Models::Ontology.all(ignore_custom_ontologies: true) + @ontologies = LinkedData::Client::Models::Ontology.all(ignore_custom_ontologies: true); + @all_ontologies_for_select = @ontologies.map {|x| ["#{x.name} (#{x.acronym})", x.acronym]} @user_ontologies = @user.customOntology + @user_ontologies ||= [] - ## Copied from home controller , account action - onts = LinkedData::Client::Models::Ontology.all; - @admin_ontologies = onts.select {|o| o.administeredBy.include? @user.id } + @admin_ontologies = @ontologies.select {|o| o.administeredBy.include? @user.id } projects = LinkedData::Client::Models::Project.all; @user_projects = projects.select {|p| p.creator.include? @user.id } @@ -148,18 +152,15 @@ def destroy def custom_ontologies @user = find_user + custom_ontologies = params[:ontologies] || [] - custom_ontologies = params[:ontology] ? params[:ontology][:ontologyId] : [] - custom_ontologies.reject!(&:blank?) @user.update_from_params(customOntology: custom_ontologies) error_response = !@user.update - if error_response flash[:notice] = t('users.error_saving_custom_ontologies') else - updated_user = LinkedData::Client::Models::User.find(@user.id) - session[:user].update_from_params(customOntology: updated_user.customOntology) - flash[:notice] = if updated_user.customOntology.empty? + session[:user].update_from_params(customOntology: @user.customOntology) + flash[:notice] = if @user.customOntology.empty? t('users.custom_ontologies_cleared') else t('users.custom_ontologies_saved') @@ -168,7 +169,7 @@ def custom_ontologies redirect_to user_path(@user.username) end - + def subscribe @user = find_user deliver "subscribe", SubscribeMailer.register_for_announce_list(@user.email,@user.firstName,@user.lastName) @@ -180,7 +181,7 @@ def un_subscribe deliver "unsubscribe", SubscribeMailer.unregister_for_announce_list(@email) end - + private def find_user(id = params[:id]) diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 28722f4cb..277ae8281 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -511,9 +511,9 @@ def empty_state(text) end end - def ontologies_selector(id:, label: nil, name: nil, selected: nil, placeholder: nil, multiple: true) + def ontologies_selector(id:, label: nil, name: nil, selected: nil, placeholder: nil, multiple: true, ontologies: onts_for_select) content_tag(:div) do - render(Input::SelectComponent.new(id: id, label: label, name: name, value: onts_for_select, multiple: multiple, selected: selected, placeholder: placeholder)) + + render(Input::SelectComponent.new(id: id, label: label, name: name, value: ontologies, multiple: multiple, selected: selected, placeholder: placeholder)) + content_tag(:div, class: 'ontologies-selector-button', 'data-controller': 'ontologies-selector', 'data-ontologies-selector-id-value': id) do content_tag(:div, t('ontologies_selector.clear_selection'), class: 'clear-selection', 'data-action': 'click->ontologies-selector#clear') + link_to_modal(t('ontologies_selector.ontologies_advanced_selection'), "/ontologies_selector?id=#{id}", data: { show_modal_title_value: t('ontologies_selector.ontologies_advanced_selection')}) diff --git a/app/views/users/show.html.haml b/app/views/users/show.html.haml index 3c4f28597..cb69ab11a 100644 --- a/app/views/users/show.html.haml +++ b/app/views/users/show.html.haml @@ -57,10 +57,10 @@ %a{href: "#{$REST_URL}/documentation", target: "_blank"} = t('users.show.api_documentation') = render partial: "shared/svgs/external_link_icon" - .account-page-card + .account-page-card{'data-controller': 'reveal-component'} %h4.account-page-card-title = t('users.show.custom_semantic_resource') - #custom_ontologies.enable-lists + #custom_ontologies.enable-lists{'data-reveal-component-target': "item"} - if at_slice? %p{style: "padding-left: 7px; font-size: 10pt; margin: -3px 0 7px;"} = t('users.show.please') @@ -70,21 +70,20 @@ = t('users.show.customize_portal_display', portal: portal_name) %p %span{style: "font-weight: normal; font-size: 9pt; padding-left: 7px;"} - %a#edit_custom_ontologies{href: "javascript:void(0);"}= t('users.show.select_semantic_resources') - - if @user_ontologies && !@user_ontologies.empty? - %ul - - @user_ontologies.each do |ont| - - ont = LinkedData::Client::Models::Ontology.get(ont) - %li - #{ont.name} (#{ont.acronym}) - - else - %p{style: "padding-left: 7px;"}= t('users.show.no_semantic_resources') + %a#edit_custom_ontologies{'data-action': "click->reveal-component#toggle", 'data-reveal-component-target': "item", style: 'cursor: pointer;'}= t('users.show.select_semantic_resources') + + .account-page-custom-ontologies + - @user_ontologies.each do |ont| + - ont = @ontologies.select{ |o| o.id.eql?(ont) }.first + = render ChipButtonComponent.new(url: "/ontologies/#{ont.acronym}", text: ont.acronym , type: "clickable", tooltip: ont.name) + %p.account-page-card-desc= t('users.show.note_feature_logged_in') - #custom_ontologies_picker{style: "left: -9999px; position: absolute;"} + #custom_ontologies_picker.d-none{'data-reveal-component-target': "item"} = form_tag custom_ontologies_path(url_encode(@user.username)) do - - selected = @user.customOntology.map {|o| LinkedData::Client::Models::Ontology.get(o).acronym} - = ontologies_selector(id:'account_page_ontologies_selector' ,name: 'ontologies', selected: selected) - = submit_tag t('users.show.save_custom_semantic_resources'), class: "link_button" + - selected = @user.customOntology.map {|o| o.split('/').last } + = ontologies_selector(id:'account_page_ontologies_selector' ,name: 'ontologies', selected: selected, ontologies: @all_ontologies_for_select) + .mt-3 + = render Buttons::RegularButtonComponent.new(id: 'submit_custom_set', variant: "secondary", size: "slim", type: 'submit', value: t('users.show.save_custom_semantic_resources')) .account-page-second-row .account-page-card %h4.account-page-card-title= t('users.show.subscriptions') @@ -128,15 +127,4 @@ - else - @user_projects.each do |project| .account-page-submitted-ontology - %a{href: "/projects/#{project.acronym}"}= project.name - -:javascript - jQuery(document).ready(function(){ - jQuery("#edit_custom_ontologies").click(editCustomOntologies); - }); - - - function editCustomOntologies() { - jQuery("#custom_ontologies_picker").css("left", "").css("position", ""); - jQuery("#custom_ontologies").hide(); - } + %a{href: "/projects/#{project.acronym}"}= project.name \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index 2fd283029..d271a24e1 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -134,7 +134,7 @@ # Top-level pages match '/feedback', to: 'home#feedback', via: [:get, :post] - get '/account' => 'home#account' + get '/account' => 'users#show' get '/site_config' => 'home#site_config' post '/annotator_recommender_form' => 'home#annotator_recommender_form' match '/visits', to: 'visits#index', via: :get diff --git a/test/integration/login_flows_test.rb b/test/integration/login_flows_test.rb index d446a6d6a..0f1f70b44 100644 --- a/test/integration/login_flows_test.rb +++ b/test/integration/login_flows_test.rb @@ -50,7 +50,7 @@ class LoginFlowsTest < ActionDispatch::IntegrationTest assert_select '.notification', text: 'Account was successfully created' - get account_path + get "/accounts/#{new_user.username}" assert_response :success assert_select '.account-page-title', text: 'My account' diff --git a/test/system/login_flows_test.rb b/test/system/login_flows_test.rb index 232f9b53d..d6ff0deb4 100644 --- a/test/system/login_flows_test.rb +++ b/test/system/login_flows_test.rb @@ -40,7 +40,7 @@ class LoginFlowsTest < ApplicationSystemTestCase assert_selector '.notification', text: 'Account was successfully created' - visit root_url + '/account' + visit root_url + "/accounts/#{new_user.username}" assert_selector '.account-page-title', text: 'My account' @@ -77,7 +77,7 @@ class LoginFlowsTest < ApplicationSystemTestCase test "login and reset password" do login_in_as(@user_bob) - visit root_url + '/account' + visit root_url + "/accounts/#{@user_bob.username}" find("a[href=\"#{edit_user_path(@user_bob.username)}\"]").click From c878ab08fea3911018caab263fe522cd22d4a626 Mon Sep 17 00:00:00 2001 From: Bilel Kihal <61744974+Bilelkihal@users.noreply.github.com> Date: Thu, 4 Jul 2024 22:55:24 +0200 Subject: [PATCH 38/57] Feauture: add acronym column in the agents table in the admin page (#704) --- app/views/agents/_agent.html.haml | 2 ++ app/views/agents/index.html.haml | 1 + config/locales/en.yml | 1 + config/locales/fr.yml | 1 + 4 files changed, 5 insertions(+) diff --git a/app/views/agents/_agent.html.haml b/app/views/agents/_agent.html.haml index f6c04ce75..0f55ca716 100644 --- a/app/views/agents/_agent.html.haml +++ b/app/views/agents/_agent.html.haml @@ -3,6 +3,8 @@ %div{style: 'width: 250px'} %div.text-truncate{title: agent.name} = agent.name + %td + = agent.acronym %td = raw display_identifiers(agent.identifiers) %td diff --git a/app/views/agents/index.html.haml b/app/views/agents/index.html.haml index 8a038c93a..8864fe749 100644 --- a/app/views/agents/index.html.haml +++ b/app/views/agents/index.html.haml @@ -13,6 +13,7 @@ = render TableComponent.new(id: 'admin_agents', custom_class: 'border rounded p-1') do |t| - t.header do |h| - h.th {t("agents.index.first_name")} + - h.th {t("agents.index.acronym")} - h.th {t("agents.form.identifiers")} - h.th {t("agents.form.affiliations")} - h.th {t("agents.form.type")} diff --git a/config/locales/en.yml b/config/locales/en.yml index 79b40f9b0..39a5ec1a0 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -680,6 +680,7 @@ en: index: create_new_agent: Create New Agent first_name: First name + acronym: Acronym usages: Usages actions: Actions no_agents: There are currently no agents. diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 8999255c4..107782065 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -691,6 +691,7 @@ fr: index: create_new_agent: Créer un nouvel agent first_name: Prénom + acronym: Acronyme usages: Utilisations actions: Actions no_agents: Il n'y a actuellement aucun agent. From b42044b9affa5ef37b4a8e9359b83bcdc551887a Mon Sep 17 00:00:00 2001 From: Bilel Kihal <61744974+Bilelkihal@users.noreply.github.com> Date: Fri, 5 Jul 2024 09:57:54 +0200 Subject: [PATCH 39/57] Fix: subscribe button issues (#681) * fix clicking on subscribe button while being not logged in * remove non related code to fix subscribe button issues PR * fix subscribe button displays wrong values when using french * replace UnWatch by unwatch * clean subscriptions method code in ontologies controller * Fix the color of the loader component spinning loader * remove duplicated code in subscription button fix * disable cache for subscription button calls * remove invalidate cache for the user calls --- app/assets/stylesheets/components/pill_button.scss | 3 +++ app/assets/stylesheets/fair_assement.scss | 1 + app/components/ontology_subscribe_button_component.rb | 6 ++++++ .../ontology_subscribe_button_component.html.haml | 2 +- .../ontology_subscribe_button_component_controller.js | 8 +++++--- app/controllers/ontologies_controller.rb | 4 +--- app/controllers/users_controller.rb | 3 +-- app/helpers/application_helper.rb | 3 +-- config/locales/en.yml | 2 +- 9 files changed, 20 insertions(+), 12 deletions(-) diff --git a/app/assets/stylesheets/components/pill_button.scss b/app/assets/stylesheets/components/pill_button.scss index 13a88c1fb..c47e4ea27 100644 --- a/app/assets/stylesheets/components/pill_button.scss +++ b/app/assets/stylesheets/components/pill_button.scss @@ -23,6 +23,9 @@ a { color: white !important; } + div { + color: white !important; + } } .pill-button:hover svg path { diff --git a/app/assets/stylesheets/fair_assement.scss b/app/assets/stylesheets/fair_assement.scss index ad757bee9..4d049d521 100644 --- a/app/assets/stylesheets/fair_assement.scss +++ b/app/assets/stylesheets/fair_assement.scss @@ -35,6 +35,7 @@ $non_applicable_color : rgba(176, 190, 197, 0.4); animation-duration: .75s; animation-timing-function: linear; animation-iteration-count: infinite; + color: var(--primary-color); } .spinner-border-reverse { diff --git a/app/components/ontology_subscribe_button_component.rb b/app/components/ontology_subscribe_button_component.rb index 9faec90ab..24edeb409 100644 --- a/app/components/ontology_subscribe_button_component.rb +++ b/app/components/ontology_subscribe_button_component.rb @@ -15,6 +15,8 @@ def initialize(id: '', ontology_id:, subscribed:, user_id:, count: 0, link: 'jav 'subscribe-notes-ontology-id-value': ontology_id, 'subscribe-notes-is-subbed-value': subscribed.to_s, 'subscribe-notes-user-id-value': user_id, + 'subscribe-notes-watch-value': t('components.watch'), + 'subscribe-notes-unwatch-value': t('components.unwatch'), action: 'click->subscribe-notes#subscribeToNotes', }, title: title @@ -30,4 +32,8 @@ def title t('components.join_the_count', count: @count) end end + + def data_turbo + @link.include?('/login') ? 'false' : 'true' + end end diff --git a/app/components/ontology_subscribe_button_component/ontology_subscribe_button_component.html.haml b/app/components/ontology_subscribe_button_component/ontology_subscribe_button_component.html.haml index 9ec723388..bf0b2add6 100644 --- a/app/components/ontology_subscribe_button_component/ontology_subscribe_button_component.html.haml +++ b/app/components/ontology_subscribe_button_component/ontology_subscribe_button_component.html.haml @@ -1,6 +1,6 @@ %div{@controller_params, style: 'margin-left: 10px;', id: @id} = render PillButtonComponent.new do - %a.d-flex.align-items-center{href: @link} + %a.d-flex.align-items-center{href: @link, 'data-turbo': data_turbo} = inline_svg_tag "eye.svg" %div %span{'data-subscribe-notes-target': 'text'} diff --git a/app/components/ontology_subscribe_button_component/ontology_subscribe_button_component_controller.js b/app/components/ontology_subscribe_button_component/ontology_subscribe_button_component_controller.js index 49d67275b..b425c5155 100644 --- a/app/components/ontology_subscribe_button_component/ontology_subscribe_button_component_controller.js +++ b/app/components/ontology_subscribe_button_component/ontology_subscribe_button_component_controller.js @@ -6,7 +6,9 @@ export default class extends Controller { static values = { ontologyId: String, isSubbed: Boolean, - userId: String + userId: String, + watch: String, + unwatch: String } static targets = ["error", "loader", "text" ,"count"] @@ -39,10 +41,10 @@ export default class extends Controller { let txt = this.textTarget.innerHTML let count = parseInt(this.countTarget.innerHTML) - let newButtonText = txt.match("UnWatch") ? txt.replace("UnWatch", "Watch") : txt.replace("Watch", "UnWatch"); + let newButtonText = txt.match(this.unwatchValue) ? txt.replace(this.unwatchValue, this.watchValue) : txt.replace(this.watchValue, this.unwatchValue); this.element.setAttribute('title', newButtonText + ' this ontology') this.textTarget.innerHTML = newButtonText - this.countTarget.innerHTML = newButtonText.match("UnWatch") ? (count + 1) : (count - 1) + this.countTarget.innerHTML = newButtonText.match(this.unwatchValue) ? (count + 1) : (count - 1) }, error: () => { this.#hideSpinner() diff --git a/app/controllers/ontologies_controller.rb b/app/controllers/ontologies_controller.rb index 621f1247f..2c9101dfc 100644 --- a/app/controllers/ontologies_controller.rb +++ b/app/controllers/ontologies_controller.rb @@ -368,7 +368,7 @@ def subscriptions ontology_acronym = ontology_id.split('/').last if session[:user].nil? - link = "/login?redirect=#{request.url}" + link = "/login?redirect=/ontologies/#{ontology_acronym}" subscribed = false user_id = nil else @@ -377,14 +377,12 @@ def subscriptions link = "javascript:void(0);" user_id = user.id end - count = helpers.count_subscriptions(params[:ontology_id]) render inline: helpers.turbo_frame_tag('subscribe_button') { render_to_string(OntologySubscribeButtonComponent.new(id: '', ontology_id: ontology_id, subscribed: subscribed, user_id: user_id, count: count, link: link), layout: nil) } end - def widgets if request.xhr? render partial: 'ontologies/sections/widgets', layout: false diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index c5c675d62..a3749d463 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -186,8 +186,7 @@ def un_subscribe def find_user(id = params[:id]) id = helpers.unescape(id) - @user = LinkedData::Client::Models::User.find(helpers.escape(id), include: 'all') - @user ||= LinkedData::Client::Models::User.find_by_username(helpers.escape(id), include: 'all').first + @user = LinkedData::Client::Models::User.find(id.split('/').last, {include: 'all'}) not_found("User with id #{id} not found") if @user.nil? diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 277ae8281..1237adc6d 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -213,8 +213,7 @@ def admin_block(ontology: @ontology, user: session[:user], class_css: "admin-bor 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"} + user = LinkedData::Client::Models::User.find(user.username, {include: 'subscription'}) if user.subscription.nil? return false if user.subscription.nil? or user.subscription.empty? user.subscription.each do |sub| #sub = {ontology: ontology_acronym, notification_type: "NOTES"} diff --git a/config/locales/en.yml b/config/locales/en.yml index 39a5ec1a0..6fabd5d72 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1416,7 +1416,7 @@ en: view: View debug: Debug loading: Loading - unwatch: UnWatch + unwatch: Unwatch watch: Watch resource: "%{sub_text} this resource" notified_of_all_updates: Be the first to watch this resource and be notified of all its updates From c66a022ab1b175e257cfa104aa6ff3b2dc752732 Mon Sep 17 00:00:00 2001 From: Imad Bourouche Date: Sat, 6 Jul 2024 20:41:55 +0200 Subject: [PATCH 40/57] Feature: add response time calculation in check resolvability tool (#717) * add response time calculation in check resolvability tool * add other format equivalents to handle most cases of request accept header * move the AVG time to check_resolvability_message instead of appending it * remove the usage of inexistent variable in that block scope * remove comment as the variable name is already clear --------- Co-authored-by: Syphax Bouazzouni --- app/components/url_resolvability_component.rb | 2 +- app/helpers/check_resolvability_helper.rb | 66 +++++++++++-------- app/views/check_resolvability/index.html.haml | 17 ++--- 3 files changed, 43 insertions(+), 42 deletions(-) diff --git a/app/components/url_resolvability_component.rb b/app/components/url_resolvability_component.rb index 379fe49c3..adbd7bf5e 100644 --- a/app/components/url_resolvability_component.rb +++ b/app/components/url_resolvability_component.rb @@ -12,7 +12,7 @@ def initialize(url: '', resolvable: false, supported_formats: [], status: nil) end def call - text = check_resolvability_message(@resolvable, @supported_formats, @status, @url) + text = check_resolvability_message(@resolvable, @supported_formats, @status, url: @url) if @resolvable && @supported_formats.size > 1 icon = status_icons(ok: true) elsif @resolvable diff --git a/app/helpers/check_resolvability_helper.rb b/app/helpers/check_resolvability_helper.rb index fc637ab75..40d74ea2e 100644 --- a/app/helpers/check_resolvability_helper.rb +++ b/app/helpers/check_resolvability_helper.rb @@ -3,9 +3,9 @@ module CheckResolvabilityHelper def formats_equivalents(format = nil) all = { 'application/json' => ['application/ld+json'], - 'application/rdf+xml' => %w[application/xml application/rdf+xml text/xml application/octet-stream], - 'text/turtle' => ['application/turtle'], - 'text/n3' => ['application/n-triples'], + 'application/rdf+xml' => %w[application/xml text/xml text/rdf+xml application/octet-stream], + 'text/turtle' => %w[application/turtle application/octet-stream], + 'text/n3' => %w[text/rdf+n3 application/rdf+n3 application/n3 application/n-triples text/n-triples application/ntriples text/ntriples], 'text/html' => [] } @@ -26,7 +26,7 @@ def resolvability_max_redirections 10 end - def resolvability_status(status, allowed_format, redirections, result: nil) + def resolvability_status(status, allowed_format, redirections, result: nil, response_time:0) supported_format = Array(allowed_format) unless result @@ -39,7 +39,7 @@ def resolvability_status(status, allowed_format, redirections, result: nil) end end - { result: result, status: status, allowed_format: supported_format, redirections: redirections } + { result: result, status: status, allowed_format: supported_format, response_time: response_time, redirections: redirections } end def follow_redirection(url, format, timeout_seconds, redirect_limit = resolvability_max_redirections) @@ -49,31 +49,37 @@ def follow_redirection(url, format, timeout_seconds, redirect_limit = resolvabil redirect_count = 0 redirections = [uri] - until (!response.nil? && !response.is_a?(Net::HTTPRedirection)) || redirect_count >= redirect_limit - http = Net::HTTP.new(uri.host, uri.port) - http.use_ssl = (uri.scheme == 'https') - http.open_timeout = timeout_seconds - begin - response = Timeout.timeout(timeout_seconds) { http.request_head(uri, 'Accept' => format) } - rescue Timeout::Error, Net::OpenTimeout - return resolvability_status('Timeout', [], redirections, result: 0) - end - - if response.is_a?(Net::HTTPRedirection) && response['location'] - uri = URI.join(uri, response['location']) - redirections << uri - redirect_count += 1 + total_time = Benchmark.measure do + until (!response.nil? && !response.is_a?(Net::HTTPRedirection)) || redirect_count >= redirect_limit + http = Net::HTTP.new(uri.host, uri.port) + http.use_ssl = (uri.scheme == 'https') + http.open_timeout = timeout_seconds + begin + response = Timeout.timeout(timeout_seconds) { http.request_head(uri, 'Accept' => format) } + rescue Timeout::Error, Net::OpenTimeout + return resolvability_status('Timeout', [], redirections, result: 0, response_time: timeout_seconds) + end + + if response.is_a?(Net::HTTPRedirection) && response['location'] + uri = URI.join(uri, response['location']) + redirections << uri + redirect_count += 1 + end end end - if response&.code.to_s.eql?('200') && (response&.content_type.to_s.include?(format) || formats_equivalents(format)&.include?(response&.content_type.to_s)) - result = 2 - elsif response&.code.to_s.eql?('200') - result = 1 + if redirect_count >= redirect_limit + resolvability_status('Too Many Redirections', [], redirections, result: 0, response_time: total_time.real.round(3)) else - result = 0 + if response&.code.to_s.eql?('200') && (response&.content_type.to_s.include?(format) || formats_equivalents(format)&.include?(response&.content_type.to_s)) + result = 2 + elsif response&.code.to_s.eql?('200') + result = 1 + else + result = 0 + end + resolvability_status(response&.code, [response&.content_type], redirections, result: result, response_time: total_time.real.round(3)) end - resolvability_status(response&.code, [response&.content_type], redirections, result: result) end def check_resolvability_helper(url, negotiation_formats = resolvability_formats, timeout_seconds = resolvability_timeout) @@ -89,13 +95,14 @@ def check_resolvability_helper(url, negotiation_formats = resolvability_formats, end status = redirections.values.map { |v| v[:status] }.uniq.join(', ') + average_response_time = redirections.values.sum { |v| v[:response_time] }.fdiv(redirections.size).round(3) if supported_format.size > 1 - { result: 2, status: status, allowed_format: supported_format, redirections: redirections } + { result: 2, status: status, allowed_format: supported_format, average_response_time: average_response_time, redirections: redirections } elsif status.include?('200') returned_format = redirections.map { |k, v| !v[:result].eql?(0) ? v[:allowed_format] : nil }.flatten.compact.uniq - { result: 1, status: status, allowed_format: returned_format, redirections: redirections } + { result: 1, status: status, allowed_format: returned_format, average_response_time: average_response_time, redirections: redirections } else - { result: 0, status: status, allowed_format: [], redirections: redirections } + { result: 0, status: status, allowed_format: [], average_response_time: average_response_time, redirections: redirections } end end @@ -112,7 +119,7 @@ def check_resolvability_success(result) url_resolvable?(result) || url_content_negotiable?(result) end - def check_resolvability_message(resolvable, allowed_formats, status, url = nil) + def check_resolvability_message(resolvable, allowed_formats, status, url: nil, response_time: nil) supported_format = Array(allowed_formats).compact supported_format = allowed_formats.empty? ? 'Format not specified' : supported_format.join(', ') @@ -126,6 +133,7 @@ def check_resolvability_message(resolvable, allowed_formats, status, url = nil) text = text + link_to(', click to see details', check_resolvability_path(url: url), target: '_blank') if url + text += " (Average response time: #{response_time}s)" if response_time text end end diff --git a/app/views/check_resolvability/index.html.haml b/app/views/check_resolvability/index.html.haml index 2a190c022..fc5c9bfd9 100644 --- a/app/views/check_resolvability/index.html.haml +++ b/app/views/check_resolvability/index.html.haml @@ -35,7 +35,7 @@ - if @results %div.bg-white.mt-3.border.rounded %div.p-1 - - text = check_resolvability_message(url_resolvable?(@results), @results[:allowed_format], @results[:status]) + - text = check_resolvability_message(url_resolvable?(@results), @results[:allowed_format], @results[:status], response_time: @results[:average_response_time]) - if url_content_negotiable?(@results) = render Display::AlertComponent.new(type:'success') do = text @@ -45,6 +45,7 @@ - else = render Display::AlertComponent.new(type:'danger') do = text + %div.p-1 - count = 0 - @results[:redirections].each do |format, result| @@ -63,16 +64,8 @@ - else - status = result[:status] - color = status.eql?('200') ? '' : 'bg-danger-light text-danger' - - format_badge = render ChipButtonComponent.new(class: "mx-1", text: result[:allowed_format].first.blank? ? t("check_resolvability.format_not_specified"): result[:allowed_format].first) + - format_badge = render ChipButtonComponent.new(class: "mx-1", type: 'clickable', text: result[:allowed_format].first.blank? ? t("check_resolvability.format_not_specified"): result[:allowed_format].first) = render ChipButtonComponent.new(class: "mx-1 #{color}", type: 'clickable', text: status) = format_badge - - - - - - - - - - + - if index.eql?(result[:redirections].length - 1) + = render ChipButtonComponent.new(class: "mx-1", type: 'clickable', text: "Response time: #{result[:response_time]} s") \ No newline at end of file From 99631dd07918d54bc13dc68d6c0fde262e7315e2 Mon Sep 17 00:00:00 2001 From: Syphax bouazzouni Date: Wed, 17 Jul 2024 10:12:22 +0200 Subject: [PATCH 41/57] Feature: add ontology viewOf to the summary page relation network (#716) --- app/controllers/ontologies_controller.rb | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/app/controllers/ontologies_controller.rb b/app/controllers/ontologies_controller.rb index 2c9101dfc..b3ef3c5c4 100644 --- a/app/controllers/ontologies_controller.rb +++ b/app/controllers/ontologies_controller.rb @@ -326,13 +326,15 @@ def summary @views = get_views(@ontology) @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'] } } @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 + @relations_array_display.unshift(['View of (bpm:viewOf)', 'bpm:viewOf']) + + category_attributes = submission_metadata.group_by { |x| x['category'] }.transform_values { |x| x.map { |attr| attr['attribute'] } } + @config_properties = properties_hash_values(category_attributes["object description properties"]) @methodology_properties = properties_hash_values(category_attributes["methodology"]) @agents_properties = properties_hash_values(category_attributes["persons and organizations"]) @@ -492,7 +494,7 @@ def get_views(ontology) 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", + @relations_array = ["bpm:viewOf", "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? @@ -527,6 +529,11 @@ def ontology_relations_data(sub = @submission_latest) end end + if ont.viewOf + target_ont = LinkedData::Client::Models::Ontology.find(ont.viewOf) + ontology_relations_array.push({ source: ont.acronym, target: target_ont.acronym, relation: "bpm:viewOf", targetInPortal: true }) + end + ontology_relations_array end From a52ad4e7920a5a52da0ce11cd2f6f45fa7010ea9 Mon Sep 17 00:00:00 2001 From: Syphax bouazzouni Date: Wed, 17 Jul 2024 10:15:26 +0200 Subject: [PATCH 42/57] Feature: Remove subject values from the project and usage block in summary page (#719) --- app/controllers/ontologies_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/ontologies_controller.rb b/app/controllers/ontologies_controller.rb index b3ef3c5c4..b4c12917c 100644 --- a/app/controllers/ontologies_controller.rb +++ b/app/controllers/ontologies_controller.rb @@ -344,7 +344,7 @@ def summary @community_properties = properties_hash_values(category_attributes["community"] + [:notes]) @identifiers = properties_hash_values([:URI, :versionIRI, :identifier]) @identifiers["ontology_portal_uri"] = ["#{$UI_URL}/ontologies/#{@ontology.acronym}", "#{portal_name} URI"] - @projects_properties = properties_hash_values(category_attributes["usage"]) + @projects_properties = properties_hash_values(category_attributes["usage"] - ["hasDomain"]) @ontology_icon_links = [%w[summary/download dataDump], %w[summary/homepage homepage], %w[summary/documentation documentation], From 03a3e07f4c67cd1725d87677677997c738fd3c10 Mon Sep 17 00:00:00 2001 From: Syphax bouazzouni Date: Fri, 19 Jul 2024 11:58:06 +0200 Subject: [PATCH 43/57] Feature: Add cookie banner (#702) * add cookies action to show and save cookie state in a session * add link button component helper * add cookie modal view * enhance the style of the cookies banner --------- Co-authored-by: Bilel KIHAL --- app/assets/stylesheets/bioportal.scss | 40 +++++++++++++++++++++++++++ app/controllers/home_controller.rb | 5 ++++ app/helpers/application_helper.rb | 4 +++ app/views/home/cookies.html.haml | 18 ++++++++++++ app/views/layouts/_header.html.erb | 5 ++-- app/views/layouts/appliance.html.haml | 3 +- config/locales/en.yml | 12 ++++++-- config/locales/fr.yml | 15 ++++++++-- config/routes.rb | 1 + 9 files changed, 95 insertions(+), 8 deletions(-) create mode 100644 app/views/home/cookies.html.haml diff --git a/app/assets/stylesheets/bioportal.scss b/app/assets/stylesheets/bioportal.scss index 52e35df22..49c4eb349 100644 --- a/app/assets/stylesheets/bioportal.scss +++ b/app/assets/stylesheets/bioportal.scss @@ -1043,4 +1043,44 @@ turbo-frame[busy] ~ .show-if-loading { .hide{ display:none; +} + +.cookies-modal { + position: fixed; + height: auto; + top: initial; + left: initial; + bottom: 30px; + right: 30px; + transform: initial; + grid-template-rows: minmax(0, 1fr); + z-index: 99999; + background: white; + border-style: solid; + border-color: #f2f2f2; + border-radius: 8px; + border-width: 0; + padding: 15px 20px; + display: grid; + grid-gap: 10px; + box-shadow: rgba(0, 0, 0, 0.1) 0px 4px 8px, rgba(0, 0, 0, 0.1) 0px 2px 4px; + width: 526px; + grid-row-gap: 10px; + + h4{ + justify-self: center; + font-size: 16px; + color: var(--primary-color); + font-weight: 500; + } + p { + word-wrap: break-word; + font-size: 12px; + margin-bottom: 5px; + } + .cookie-privacy-link { + font-size: 12px; + text-align: center; + text-decoration: underline; + } } \ No newline at end of file diff --git a/app/controllers/home_controller.rb b/app/controllers/home_controller.rb index ae0f3cfad..759965b54 100644 --- a/app/controllers/home_controller.rb +++ b/app/controllers/home_controller.rb @@ -46,6 +46,11 @@ def index end + def set_cookies + session[:cookies_accepted] = params[:cookies] if params[:cookies] + render 'cookies', layout: nil + end + def tools @tools = { search: { diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 1237adc6d..deb125bde 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -520,6 +520,10 @@ def ontologies_selector(id:, label: nil, name: nil, selected: nil, placeholder: end end + def link_button_component(href: , value: , id:, size: nil, variant: 'primary') + render Buttons::RegularButtonComponent.new(id:id, value: value, variant: variant, type: 'link', href: href, size: size) + end + def save_button_component(class_name: nil, id: , value:, data: nil, size: nil, type: nil) content_tag(:div, data: data, class: class_name) do render Buttons::RegularButtonComponent.new(id:id, value: value, variant: "primary", state: 'regular', size: size, type: type) do |btn| diff --git a/app/views/home/cookies.html.haml b/app/views/home/cookies.html.haml new file mode 100644 index 000000000..e9fb3cf31 --- /dev/null +++ b/app/views/home/cookies.html.haml @@ -0,0 +1,18 @@ += turbo_frame_tag :cookies_modal do + - if session[:cookies_accepted].nil? # don't re-render if a true/false selected + %section.cookies-modal + %h4 + = t('cookies_modal.title') + %p + = t('cookies_modal.paragraph1') + %p + = t('cookies_modal.paragraph2') + %p + = t('cookies_modal.paragraph3') + %div.d-flex + %div.w-50 + = link_button_component(id:'accept-cookie-selector', value: t('cookies_modal.accept_button'), href: cookies_path(cookies: true), size: "slim", variant: 'primary') + %div.w-50.ml-2 + = link_button_component(id:'deny-cookie-selector', value: t('cookies_modal.deny_button'), href: cookies_path(cookies: false), size: "slim", variant: 'secondary') + %div.cookie-privacy-link + = link_to t('cookies_modal.privacy_link'), $FOOTER_LINKS.dig(:sections, :agreements, :privacy_policy) diff --git a/app/views/layouts/_header.html.erb b/app/views/layouts/_header.html.erb index fcf060a9e..244d0a15b 100644 --- a/app/views/layouts/_header.html.erb +++ b/app/views/layouts/_header.html.erb @@ -39,6 +39,7 @@ <%=render partial: 'layouts/topnav'%> - -
+ <%= turbo_frame_tag :cookies_modal, src: cookies_path if session[:cookies_accepted].nil? %> + +
<%=render partial: 'layouts/notices'%> \ No newline at end of file diff --git a/app/views/layouts/appliance.html.haml b/app/views/layouts/appliance.html.haml index 817bd3026..d40fbdce6 100644 --- a/app/views/layouts/appliance.html.haml +++ b/app/views/layouts/appliance.html.haml @@ -26,7 +26,8 @@ %body{:class => "#{controller_name} #{action_name}"} = render partial: "layouts/topnav" - + = turbo_frame_tag :cookies_modal, src: cookies_path if session[:cookies_accepted].nil? + %div.flex-grow-1 = render partial: "layouts/notices" = modal_frame_container diff --git a/config/locales/en.yml b/config/locales/en.yml index 6fabd5d72..fd083756c 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1384,7 +1384,7 @@ en: instruction_4_content: "Run the following command to test the redirection configuration `sudo nginx -t`" instruction_5: "Reload Nginx to apply the changes:" instruction_5_content: "Restart the nginx server to apply the redirection using this command `sudo systemctl reload nginx`" - + components: check_resolvability: checking resolvability... error_block: child_data_generator block did not provide all the child arguements @@ -1478,4 +1478,12 @@ en: email: "Email: %{email}" location: "Location: %{location}" tags: Tags - feedback: Feedback \ No newline at end of file + feedback: Feedback + cookies_modal: + title: "Manage Cookie Consent" + paragraph1: "We use cookies to help you navigate efficiently and perform certain functions. You will find detailed information about all cookies in the \"Privacy Statement\" link." + paragraph2: "We also use third-party cookies that help us analyse how you use this website, store your preferences, and provide the content that is relevant to you. These cookies will only be stored in your browser with your prior consent." + paragraph3: "Please note that disabling such cookies may affect your browsing experience." + accept_button: "Accept" + deny_button: "Deny" + privacy_link: "Privacy Statement" \ No newline at end of file diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 107782065..fd6bde39e 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -301,9 +301,9 @@ fr: total_results: Résultats totaux insert_sample_text: Insérer un texte d'exemple sample_text: Il y a eu de nombreuses études récentes sur l'utilisation d'antagonistes microbiens pour contrôler les maladies causées par des bactéries phytopathogènes telluriques - et aériennes, dans le but de remplacer les méthodes actuelles de contrôle chimique et d'éviter l'utilisation extensive de fongicides, qui conduisent souvent à une résistance chez les pathogènes des plantes. - En agriculture, les microorganismes promoteurs de croissance des plantes et de biocontrôle ont émergé comme des alternatives sûres aux pesticides chimiques. Les espèces de Streptomyces et leurs - métabolites peuvent avoir un grand potentiel en tant qu'agents excellents pour contrôler divers phytopathogènes fongiques et bactériens. + et aériennes, dans le but de remplacer les méthodes actuelles de contrôle chimique et d'éviter l'utilisation extensive de fongicides, qui conduisent souvent à une résistance chez les pathogènes des plantes. + En agriculture, les microorganismes promoteurs de croissance des plantes et de biocontrôle ont émergé comme des alternatives sûres aux pesticides chimiques. Les espèces de Streptomyces et leurs + métabolites peuvent avoir un grand potentiel en tant qu'agents excellents pour contrôler divers phytopathogènes fongiques et bactériens. concepts: error_valid_concept: "Erreur : Vous devez fournir un identifiant de concept valide" @@ -1517,3 +1517,12 @@ fr: location: "Emplacement: %{location}" tags: Tags feedback: Feedback + + cookies_modal: + title: "Gérer le consentement des cookies" + paragraph1: "Nous utilisons des cookies pour vous aider à naviguer efficacement et à effectuer certaines fonctions. Vous trouverez des informations détaillées sur tous les cookies dans le lien \"Déclaration de confidentialité\"." + paragraph2: "Nous utilisons également des cookies tiers qui nous aident à analyser comment vous utilisez ce site Web, à stocker vos préférences et à fournir le contenu qui vous est pertinent. Ces cookies ne seront stockés dans votre navigateur qu'avec votre consentement préalable." + paragraph3: "Veuillez noter que la désactivation de ces cookies peut affecter votre expérience de navigation." + accept_button: "Accepter" + deny_button: "Refuser" + privacy_link: "Déclaration de confidentialité" \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index d271a24e1..6d5b78ba8 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,4 +1,5 @@ Rails.application.routes.draw do + match 'cookies', to: 'home#set_cookies', via: [:post, :get] root to: 'home#index' mount LetterOpenerWeb::Engine, at: "/letter_opener" if Rails.env.development? From e51977f6be51786cf147df9a7dd3beec88dcd975 Mon Sep 17 00:00:00 2001 From: Syphax bouazzouni Date: Fri, 19 Jul 2024 11:59:14 +0200 Subject: [PATCH 44/57] Fix: update summary page categories display to show acronym with tooltip (#713) * update summary page categories display to show acronym with tooltip * fix submission flow system tests after changing their display * make show_category return the full domain if not a category * update the show category name to use clickable state if not a category and is a link --- app/helpers/ontologies_helper.rb | 17 ++++++++++++++--- .../_ontology_description_section.html.haml | 2 +- test/system/submission_flows_test.rb | 6 +++--- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/app/helpers/ontologies_helper.rb b/app/helpers/ontologies_helper.rb index b4ba500f0..536b8ec7d 100644 --- a/app/helpers/ontologies_helper.rb +++ b/app/helpers/ontologies_helper.rb @@ -324,11 +324,22 @@ def visibility_link(ontology) "#{link_name}" end - def show_category_name(domain) - return domain unless link?(domain) + def category_name_chip_component(domain) + text = domain.split('/').last.titleize + + + return render(ChipButtonComponent.new(text: text, tooltip: domain, type: "static")) unless link?(domain) + + acronym = domain.split('/').last.upcase.strip category = LinkedData::Client::Models::Category.find(acronym) - category.name ? category.name : acronym.titleize + + if category.name + render ChipButtonComponent.new(text: text, tooltip: category.name, type: "static") + else + render ChipButtonComponent.new(text: text, tooltip: domain, url: domain, type: "clickable", target: '_blank') + end + end diff --git a/app/views/ontologies/sections/metadata/_ontology_description_section.html.haml b/app/views/ontologies/sections/metadata/_ontology_description_section.html.haml index dc0c5221f..db7525d51 100644 --- a/app/views/ontologies/sections/metadata/_ontology_description_section.html.haml +++ b/app/views/ontologies/sections/metadata/_ontology_description_section.html.haml @@ -54,7 +54,7 @@ - l.row do = render FieldContainerComponent.new(label: t("ontologies.sections.metadata.categories_and_subjects")) do = horizontal_list_container(show_ontology_domains(domains).uniq) do |v| - = render ChipButtonComponent.new(text: show_category_name(v), type: "static") + = category_name_chip_component(v) - if @submission_latest&.pullLocation - l.row do diff --git a/test/system/submission_flows_test.rb b/test/system/submission_flows_test.rb index 4a11bd1b8..635045cda 100644 --- a/test/system/submission_flows_test.rb +++ b/test/system/submission_flows_test.rb @@ -43,7 +43,7 @@ class SubmissionFlowsTest < ApplicationSystemTestCase assert_selector '.alert-message', text: "The ontology is processing." @new_ontology.hasDomain.each do |cat| - assert_text cat.name + assert_text cat.acronym.titleize end @@ -143,7 +143,7 @@ class SubmissionFlowsTest < ApplicationSystemTestCase assert_text "#{ontology_2.name} (#{@new_ontology.acronym})" selected_categories.each do |cat| - assert_text cat.name + assert_text cat.acronym.titleize end assert_text submission_2.URI @@ -349,7 +349,7 @@ class SubmissionFlowsTest < ApplicationSystemTestCase assert_selector '.alert-message', text: "The ontology is processing." ontology_2.hasDomain.each do |cat| - assert_text cat.name + assert_text cat.acronym.titleize end refute_text 'Version IRI' From 8c1e205f0fa62fb56f23b662d627f1ef1f39f5a6 Mon Sep 17 00:00:00 2001 From: Bilel Kihal <61744974+Bilelkihal@users.noreply.github.com> Date: Fri, 19 Jul 2024 13:51:06 +0200 Subject: [PATCH 45/57] fix remove agent usages (#697) --- app/controllers/agents_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/agents_controller.rb b/app/controllers/agents_controller.rb index 651c02b10..08411245f 100644 --- a/app/controllers/agents_controller.rb +++ b/app/controllers/agents_controller.rb @@ -243,7 +243,7 @@ def update_agent_usages_action(agent, params) end values[attr.to_sym] = current_val.map { |x| x.id } else - values[attr.to_sym] = agent + values[attr.to_sym] = agent.id end end From 1e4204f815c10d50807b5f46ba09ae4e8905ed3e Mon Sep 17 00:00:00 2001 From: Bilel Kihal <61744974+Bilelkihal@users.noreply.github.com> Date: Thu, 25 Jul 2024 16:37:49 +0200 Subject: [PATCH 46/57] Feature: Enhance agents search input component (#703) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * make agents search field component results unlimited to only 4 * make agents cherchable by acronym, affiliations, email and home page * Update the agent search input to display the result in this format Orga name (ACRONYM) – ROR:003vg9w96 and for persons Person Name – ORCID:0000-1524-5487-5487 * chagne display mode value type from string to boolean in search input component * remove agents search logic from UI side and limit it to only name, acronym and identifiers * use the endpoint '/search/agents' for the agents search input component --- .../stylesheets/components/search_input.scss | 6 +++++ .../agent_search_input_component.html.haml | 4 ++-- app/components/search_input_component.rb | 7 +++++- .../search_input_component.html.haml | 5 ++-- .../search_input_component_controller.js | 23 +++++++++++-------- app/controllers/agents_controller.rb | 16 ++++++------- 6 files changed, 39 insertions(+), 22 deletions(-) diff --git a/app/assets/stylesheets/components/search_input.scss b/app/assets/stylesheets/components/search_input.scss index dd721562a..883899fbc 100644 --- a/app/assets/stylesheets/components/search_input.scss +++ b/app/assets/stylesheets/components/search_input.scss @@ -9,6 +9,12 @@ position: absolute; } +.search-container.search-container-scroll{ + max-height: 400px; + overflow-y: auto; +} + + .search-content{ display: flex; flex-wrap: wrap; diff --git a/app/components/agent_search_input_component/agent_search_input_component.html.haml b/app/components/agent_search_input_component/agent_search_input_component.html.haml index 02b022ae1..9da8101b5 100644 --- a/app/components/agent_search_input_component/agent_search_input_component.html.haml +++ b/app/components/agent_search_input_component/agent_search_input_component.html.haml @@ -1,11 +1,11 @@ = hidden_field_tag "#{@name_prefix}[#{@id}]" -= render SearchInputComponent.new(id: 'agent' + @id, name:'agent' + @id, ajax_url: "/ajax/agents?agent_type=#{@agent_type}&name=", += render SearchInputComponent.new(id: 'agent' + @id, name:'agent' + @id, ajax_url: "/ajax/agents?query=", display_all: true, item_base_url:"/agents/#{@id}?parent_id=#{@parent_id}&edit_on_modal=#{@edit_on_modal}&name_prefix=#{@name_prefix}&deletable=#{@deletable}&agent_id=", id_key: 'id', use_cache: false, actions_links: {create_new_agent: {link: "/agents/new?name=&id=#{@id}&parent_id=#{@parent_id}&type=#{@agent_type}&show_affiliations=#{@show_affiliations}&deletable=#{@deletable}&edit_on_modal=#{@edit_on_modal}&name_prefix=#{@name_prefix}[#{@id}]", target:'_self'}}) do |s| - s.template do %a{href: "LINK", class: "search-content", 'data-turbo-frame': '_self'} %p.search-element.home-searched-ontology - NAME (IDENTIFIERS) + NAME ACRONYM IDENTIFIERS %p.home-result-type TYPE diff --git a/app/components/search_input_component.rb b/app/components/search_input_component.rb index 941b03d2e..9390797d3 100644 --- a/app/components/search_input_component.rb +++ b/app/components/search_input_component.rb @@ -11,7 +11,8 @@ def initialize(id: '', item_base_url:, id_key:, links_target: '_top', - search_icon_type: nil) + search_icon_type: nil, + display_all: false) @id = id @name = name @placeholder = placeholder @@ -23,6 +24,7 @@ def initialize(id: '', @id_key = id_key @links_target = links_target @search_icon_type = search_icon_type + @display_all = display_all end def action_link_info(value) if value.is_a?(Hash) @@ -34,4 +36,7 @@ def action_link_info(value) def nav_icon_class @search_icon_type.eql?('nav') ? 'search-input-nav-icon' : '' end + def display_all_mode_class + @display_all ? 'search-container-scroll' : '' + end end diff --git a/app/components/search_input_component/search_input_component.html.haml b/app/components/search_input_component/search_input_component.html.haml index fb0d79f28..9d5e19384 100644 --- a/app/components/search_input_component/search_input_component.html.haml +++ b/app/components/search_input_component/search_input_component.html.haml @@ -4,7 +4,8 @@ 'data-search-input-id-key-value': @id_key, 'data-search-input-cache-value': @use_cache.to_s, 'data-search-input-scroll-down-value': @scroll_down.to_s, - 'data-search-input-selected-item-value': 0 + 'data-search-input-selected-item-value': 0, + 'data-search-input-display-all-value': @display_all } - if @search_icon_type @@ -21,7 +22,7 @@ = render Input::InputFieldComponent.new(name: @name, placeholder: @placeholder, data: {'action': 'input->search-input#search blur->search-input#blur keydown.down->search-input#arrow_down keydown.up->search-input#arrow_up keydown.enter->search-input#enter_key', 'search-input-target': 'input'}) - .search-container{'data-search-input-target': 'dropDown', 'data-action': 'mousedown->search-input#prevent'} + %div{class: "search-container #{display_all_mode_class}", 'data-search-input-target': 'dropDown', 'data-action': 'mousedown->search-input#prevent'} - @actions_links.each do |key, value| - link, target = action_link_info(value) %a.search-content#search-content{href: link, 'data-turbo-frame': target, 'data-search-input-target': 'actionLink'} diff --git a/app/components/search_input_component/search_input_component_controller.js b/app/components/search_input_component/search_input_component_controller.js index 5c8d07cad..957dc6f04 100644 --- a/app/components/search_input_component/search_input_component_controller.js +++ b/app/components/search_input_component/search_input_component_controller.js @@ -12,7 +12,8 @@ export default class extends Controller { idKey: String, cache: {type: Boolean, default: true}, selectedItem: Number, - searchEndpoint: {type: String, default: '/search'} + searchEndpoint: {type: String, default: '/search'}, + displayAll: Boolean } connect() { @@ -114,14 +115,14 @@ export default class extends Controller { this.dropDown.innerHTML = "" let breaker = 0 for (let i = 0; i < this.items.length; i++) { - if (breaker === 4) { + if (!this.displayAllValue && breaker === 4) { break; } // Get the current item from the ontologies array const item = this.items[i]; let text = Object.values(item).reduce((acc, value) => acc + value, "") - + // Check if the item contains the substring if (!this.cacheValue || text.toLowerCase().includes(inputValue.toLowerCase())) { results_list.push(item); @@ -149,18 +150,22 @@ export default class extends Controller { #renderLine(item) { let template = this.templateTarget.content - let newElement = template.firstElementChild - let string = newElement.outerHTML - + let newElement = template.firstElementChild.outerHTML Object.entries(item).forEach( ([key, value]) => { key = key.toString().toUpperCase() if (key === 'TYPE'){ value = value.toString().split('/').slice(-1) } + if (key === 'ACRONYM'){ + value = value ? `(${value.toString()})` : '' + } + if (key === 'IDENTIFIERS'){ + value = value ? `- ${value.toString()}` : '' + } const regex = new RegExp('\\b' + key + '\\b', 'gi'); - string = string.replace(regex, value ? value.toString() : "") + newElement = newElement.replace(regex, value ? value.toString() : "") }) - - return new DOMParser().parseFromString(string, "text/html").body.firstElementChild + + return new DOMParser().parseFromString(newElement, "text/html").body.firstElementChild } } diff --git a/app/controllers/agents_controller.rb b/app/controllers/agents_controller.rb index 08411245f..678892a7f 100644 --- a/app/controllers/agents_controller.rb +++ b/app/controllers/agents_controller.rb @@ -18,15 +18,15 @@ def show end def ajax_agents - filters = { name: params[:name] } - filters[:agentType] = params[:agent_type] if params[:agent_type] - @agents = LinkedData::Client::Models::Agent.all(filters) - agents_json = @agents.map do |x| + filters = { query: params[:query]} + @agents = LinkedData::Client::HTTP.get('/search/agents', filters) + agents_json = @agents.collection.map do |x| { - id: x.id, - name: x.name, - type: x.agentType, - identifiers: x.identifiers.map { |i| "#{i.schemaAgency}:#{i.notation}" }.join(', ') + id: x.resource_id, + name: x.name_text, + type: x.agentType_t, + identifiers: x.identifiers_texts&.join(', '), + acronym: x.acronym_text } end From 4dfcc83dc7b90a8e8fe4e8eb1652784071863243 Mon Sep 17 00:00:00 2001 From: Syphax bouazzouni Date: Thu, 1 Aug 2024 16:58:20 +0200 Subject: [PATCH 47/57] Fix: saving and cancel button locals text capitalization (#724) --- config/locales/en.yml | 6 +++--- config/locales/fr.yml | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/config/locales/en.yml b/config/locales/en.yml index fd083756c..63fd0b572 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -946,7 +946,7 @@ en: synonym: Synonym definition: Definition parent: Parent - save: save + save: Save note_line: alert_text: "Are you sure you want to delete the note ''%{subject}'' created by %{creator}?
This action CAN NOT be undone!!!" delete: Delete @@ -957,8 +957,8 @@ en: reply: about_note_decorator: about %{note_decorator} comment: Comment - save: save - cancel: cancel + save: Save + cancel: Cancel ontolobridge: problem_of_creating_new_term: "Problem creating a new term %{endpoint}: %{class} - %{message}" new_term_instructions_saved: New term request instructions for %{acronym} saved diff --git a/config/locales/fr.yml b/config/locales/fr.yml index fd6bde39e..e83bd927c 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -964,7 +964,7 @@ fr: synonym: Synonyme definition: Définition parent: Parent - save: sauvegarder + save: Sauvegarder note_line: alert_text: "Êtes-vous sûr de vouloir supprimer la note ''%{subject}'' créée par %{creator}?
Cette action NE PEUT PAS être annulée !!!" delete: Supprimer @@ -975,8 +975,8 @@ fr: reply: about_note_decorator: à propos de %{note_decorator} comment: Commentaire - save: sauvegarder - cancel: annuler + save: Sauvegarder + cancel: Annuler ontolobridge: problem_of_creating_new_term: "Problème de création d'un nouveau terme %{endpoint} : %{class} - %{message}" From 49a4c43a0e649dc87d45b066248fcd5217dc15fe Mon Sep 17 00:00:00 2001 From: Bilel Kihal <61744974+Bilelkihal@users.noreply.github.com> Date: Fri, 2 Aug 2024 12:10:46 +0200 Subject: [PATCH 48/57] Feature: add qf param in agents search (#727) --- app/controllers/agents_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/agents_controller.rb b/app/controllers/agents_controller.rb index 678892a7f..652e01a40 100644 --- a/app/controllers/agents_controller.rb +++ b/app/controllers/agents_controller.rb @@ -18,7 +18,7 @@ def show end def ajax_agents - filters = { query: params[:query]} + filters = { query: params[:query], qf: "identifiers_texts^20 acronym_text^15 name_text^10 email_text^10"} @agents = LinkedData::Client::HTTP.get('/search/agents', filters) agents_json = @agents.collection.map do |x| { From c6d7c8ec63a58e8f0695e182e039b54e642f77ac Mon Sep 17 00:00:00 2001 From: Bilel Kihal <61744974+Bilelkihal@users.noreply.github.com> Date: Sun, 4 Aug 2024 09:54:16 +0200 Subject: [PATCH 49/57] Fix: Hide affiliations when agent is organization in agent form (#696) * Hide affiliations when the agent is an organization in the agents form * Change the name of the function affliations? to is_organization? to make it more clear * fix submission flows test after the fix of the PR #713 * fix agent tests after changing the behavior of displaying affiliations --------- Co-authored-by: Syphax --- app/helpers/agent_helper.rb | 16 ++++----- app/views/agents/_form.html.haml | 10 +++--- bin/run_api | 4 +-- test/application_system_test_case.rb | 10 +++--- test/fixtures/agents.yml | 53 ---------------------------- test/fixtures/ontologies.yml | 7 ++-- test/system/agent_flows_test.rb | 10 +++--- test/system/submission_flows_test.rb | 9 +++-- 8 files changed, 35 insertions(+), 84 deletions(-) diff --git a/app/helpers/agent_helper.rb b/app/helpers/agent_helper.rb index af3902fbd..513854f0f 100644 --- a/app/helpers/agent_helper.rb +++ b/app/helpers/agent_helper.rb @@ -69,7 +69,7 @@ def agent_search_input(id, agent_type, parent_id: , name_prefix:, deletable: fal end - def affiliation?(agent) + def is_organization?(agent) agent.agentType.eql?('organization') end @@ -163,7 +163,7 @@ def display_agent(agent, link: true) def agent_tooltip(agent) name = agent.name email = agent.email - type = agent.agentType + type = agent.agentType identifiers = display_identifiers(agent.identifiers, link: false) identifiers = orcid_number(identifiers) if agent.affiliations && agent.affiliations != [] @@ -203,7 +203,7 @@ def generate_agent_tooltip(agent_icon, name, email = nil, identifiers = nil, aff end end end - + def agent_chip_component(agent) person_icon = inline_svg_tag 'icons/person.svg' , class: 'agent-type-icon' @@ -219,16 +219,16 @@ def agent_chip_component(agent) title = agent_tooltip(agent) end render_chip_component(title, agent_icon, name) - end + end def render_chip_component(title,agent_icon,name) - render ChipButtonComponent.new(type: "static",'data-controller':' tooltip', title: title , class: 'text-truncate', style: 'max-width: 280px; display:block; line-height: unset') do + render ChipButtonComponent.new(type: "static",'data-controller':' tooltip', title: title , class: 'text-truncate', style: 'max-width: 280px; display:block; line-height: unset') do content_tag(:div, class: 'agent-chip') do content_tag(:div, agent_icon, class: 'agent-chip-circle') + content_tag(:div, name, class: 'agent-chip-name text-truncate') - end - end + end + end end def orcid_number(orcid) @@ -236,5 +236,5 @@ def orcid_number(orcid) end - + end diff --git a/app/views/agents/_form.html.haml b/app/views/agents/_form.html.haml index 60b02f33e..20c35857d 100644 --- a/app/views/agents/_form.html.haml +++ b/app/views/agents/_form.html.haml @@ -9,7 +9,7 @@ = hidden_field_tag :deletable, deletable if deletable = hidden_field_tag agent_field_name(:id, name_prefix), agent.id if agent.id - - if affiliation?(agent) && params[:parent_id] + - if is_organization?(agent) && params[:parent_id] = hidden_field_tag agent_field_name(:agentType, name_prefix), agent.agentType - else %tr @@ -30,19 +30,19 @@ %span.asterik * %td.top = text_field_tag agent_field_name(:name, name_prefix), agent.name, class: "form-control" - %tr{'data-form-options-display-target':"option1", class: affiliation?(agent) && 'd-none'} + %tr{'data-form-options-display-target':"option1", class: is_organization?(agent) && 'd-none'} %th = t("agents.form.email") %span.asterik %td.top = email_field_tag agent_field_name(:email, name_prefix), agent.email, class: "form-control" - %tr{'data-form-options-display-target':"option2", class: !affiliation?(agent) && 'd-none'} + %tr{'data-form-options-display-target':"option2", class: !is_organization?(agent) && 'd-none'} %th = t("agents.form.acronym") %span.asterik %td.top = text_field_tag agent_field_name(:acronym, name_prefix), agent.acronym,class: "form-control" - %tr{'data-form-options-display-target':"option2", class: !affiliation?(agent) && 'd-none'} + %tr{'data-form-options-display-target':"option2", class: !is_organization?(agent) && 'd-none'} %th = t("agents.form.homepage") %td.top @@ -78,7 +78,7 @@ - values = %w[ORCID ROR ISNI GRID] = render SelectInputComponent.new(id: "#{name_prefix}_identifiers_schemaAgency_#{i.to_s.upcase}", name: agent_identifier_name(i.to_s.upcase, :schemaAgency, name_prefix), values: values, selected: identifier.schemaAgency) - if show_affiliations - %tr + %tr{'data-form-options-display-target':"option1", class: is_organization?(agent) && 'd-none'} %th = t("agents.form.affiliations") %td.top.agents-affiliations.agents-inputs diff --git a/bin/run_api b/bin/run_api index 8ed4d11dc..5d1634b2f 100755 --- a/bin/run_api +++ b/bin/run_api @@ -52,7 +52,7 @@ image_tag="${image_tag:-$API_IMAGE_TAG}" starter_ontology="${starter_ontology:-$STARTER_ONTOLOGY}" remote_api_url="${remote_api_url:-$OP_API_URL}" -if curl -sSf http://localhost:9393 > /dev/null 2>&1; then +if curl -sSf http://localhost:9393 > /dev/null 2>&1; then echo "API is already running in http://localhost:9393" exit 0 fi @@ -62,7 +62,7 @@ docker compose ls -a --filter "name=ontoportal_docker" | grep -q "ontoportal_doc ( cd tmp/ontoportal_docker || exit 1 command="./run -k $api_key -r $image_repository -t $image_tag -s $starter_ontology -u $remote_api_url" - [ "$no_provision" = true ] && command="$command --no-provision" + [ "$no_provision" = true ] && command="$command" echo "Run: $command" eval "$command" ) diff --git a/test/application_system_test_case.rb b/test/application_system_test_case.rb index b4457f965..a33ff79e4 100644 --- a/test/application_system_test_case.rb +++ b/test/application_system_test_case.rb @@ -151,11 +151,11 @@ def agent_search(name) end - def agent_fill(agent, parent_id: nil, enable_affiliations: true) + def agent_fill(agent, parent_id: nil, is_affiliation: false) id = agent.id ? "/#{agent.id}": '' form = all("form[action=\"/agents#{id}\"]").first within form do - choose "", option: agent.agentType, allow_label_click: true if enable_affiliations + choose "", option: agent.agentType, allow_label_click: true unless is_affiliation fill_in 'name', with: agent.name if agent.agentType.eql?('organization') @@ -171,8 +171,9 @@ def agent_fill(agent, parent_id: nil, enable_affiliations: true) list_inputs ".agents-identifiers", "[identifiers]", agent.identifiers - unless enable_affiliations + if is_affiliation || agent.agentType.eql?('organization') refute_selector ".agents-affiliations" + click_on "Save" if agent.agentType.eql?('organization') return end @@ -184,8 +185,7 @@ def agent_fill(agent, parent_id: nil, enable_affiliations: true) agent_id = agent_search(aff.name) id = parent_id && !parent_id.eql?('NEW_RECORD') ? "#{parent_id}_#{agent_id}" : agent_id within "turbo-frame[id=\"#{id}\"]" do - agent_fill(aff, enable_affiliations: false) - click_on "Save" + agent_fill(aff, is_affiliation: true) sleep 1 end end diff --git a/test/fixtures/agents.yml b/test/fixtures/agents.yml index ce32845e0..7c1a33704 100644 --- a/test/fixtures/agents.yml +++ b/test/fixtures/agents.yml @@ -97,25 +97,6 @@ organization1: agentType: "organization" identifiers: - notation: "1234-5678" - affiliations: - - name: "Research Consortium A" - agentType: "organization" - identifiers: - - notation: "9876-5432" - affiliations: [ ] - email: "contact@researchconsortiumA.com" - acronym: "RCA" - homepage: "https://www.researchconsortiumA.com/" - - - name: "Innovation Hub B" - agentType: "organization" - identifiers: - - notation: "3456-7890" - affiliations: [ ] - email: "info@innovationhubb.com" - acronym: "IHB" - homepage: "https://www.innovationhubb.com/" - email: "info@techsolutionsgroup.com" acronym: "TSG" homepage: "https://www.techsolutionsgroup.com/" @@ -125,23 +106,6 @@ organization2: agentType: "organization" identifiers: - notation: "5678-9012" - affiliations: - - name: "Space Exploration Consortium" - agentType: "organization" - identifiers: - - notation: "1234-1234" - affiliations: [] - email: "contact@spaceconsortium.com" - acronym: "SEC" - homepage: "https://www.spaceconsortium.com/" - - name: "Tech Innovators Guild" - agentType: "organization" - identifiers: - - notation: "7890-1234" - affiliations: [] - email: "info@techinnovatorsguild.com" - acronym: "TIG" - homepage: "https://www.techinnovatorsguild.com/" email: "info@quantumdynamics.com" acronym: "QDS" homepage: "https://www.quantumdynamics.com/" @@ -151,23 +115,6 @@ organization3: agentType: "organization" identifiers: - notation: "2345-6789" - affiliations: - - name: "Health Research Alliance" - agentType: "organization" - identifiers: - - notation: "5678-9012" - affiliations: [] - email: "contact@healthresearchalliance.com" - acronym: "HRA" - homepage: "https://www.healthresearchalliance.com/" - - name: "GreenTech Innovations" - agentType: "organization" - identifiers: - - notation: "8901-2345" - affiliations: [] - email: "info@greentechinnovations.com" - acronym: "GTI" - homepage: "https://www.greentechinnovations.com/" email: "info@biotechsolutions.com" acronym: "BSI" homepage: "https://www.biotechsolutions.com/" diff --git a/test/fixtures/ontologies.yml b/test/fixtures/ontologies.yml index 1d9fa0daf..100d00b3a 100644 --- a/test/fixtures/ontologies.yml +++ b/test/fixtures/ontologies.yml @@ -83,10 +83,10 @@ resource_content_formats: "metadata_def:mappingSameURI": "@id": "ns0:T071" "metadata_def:mappingLoom": "entity" - - "@id": "ns0:T077" + - "@id": "ns0:T072" "rdfs:subClassOf": "@id": "ns0:T071" - - "@id": "ns0:T072" + - "@id": "ns0:T077" "rdfs:subClassOf": "@id": "ns0:T071" @@ -119,9 +119,10 @@ resource_content_formats: "T071" . . "entity" . + . . . - . + turtle: | @prefix rdf: . diff --git a/test/system/agent_flows_test.rb b/test/system/agent_flows_test.rb index 91be5fc8b..953c4d2e4 100644 --- a/test/system/agent_flows_test.rb +++ b/test/system/agent_flows_test.rb @@ -41,7 +41,7 @@ def teardown click_on "Persons & organizations" # Creation test - create_agent_flow(@new_organization, person_count: 0, organization_count: 3) + create_agent_flow(@new_organization, person_count: 0, organization_count: 1) # Edition test @new_organization2 = fixtures(:agents)[:organization2] @@ -50,7 +50,7 @@ def teardown @new_organization2.id = edit_link['href'].split('/')[-2] edit_link.click - edit_agent_flow(@new_organization2, person_count: 0, organization_count: 5) + edit_agent_flow(@new_organization2, person_count: 0, organization_count: 1) end @@ -61,7 +61,7 @@ def create_agent_flow(new_agent, person_count: , organization_count:) # Creation test click_on "Create New Agent" wait_for_text "TYPE" - agent_fill(new_agent) + agent_fill(new_agent, is_affiliation: false) sleep 1 assert_text "New Agent added successfully" find('.close').click @@ -75,7 +75,7 @@ def create_agent_flow(new_agent, person_count: , organization_count:) assert_text 'person', count: person_count assert_text 'organization', count: organization_count - new_agent.affiliations.map do |aff| + Array(new_agent.affiliations).map do |aff| aff["identifiers"] = aff["identifiers"].each{|x| x["schemaAgency"] = 'ORCID'} assert_text aff['name'] end @@ -97,7 +97,7 @@ def edit_agent_flow(agent, person_count: , organization_count: ) assert_text 'person', count: person_count assert_text 'organization', count: organization_count - agent.affiliations.map do |aff| + Array(agent.affiliations).map do |aff| aff["identifiers"] = aff["identifiers"].each{|x| x["schemaAgency"] = 'ORCID'} assert_text aff['name'] end diff --git a/test/system/submission_flows_test.rb b/test/system/submission_flows_test.rb index 635045cda..54adbeab5 100644 --- a/test/system/submission_flows_test.rb +++ b/test/system/submission_flows_test.rb @@ -203,12 +203,15 @@ class SubmissionFlowsTest < ApplicationSystemTestCase open_dropdown "#projects_section" usage_properties = [ :coverage, :knownUsage, - :hasDomain, :example + :example ] usage_properties.each do |property| Array(submission_2[property]).each { |v| assert_text v } # check end + has_domain_values = ["Has Domain2.1", "Has Domain2.2", "Has Domain2.3"] + has_domain_values.each { |v| assert_text v } + submission_2.designedForOntologyTask.each do |task| assert_text task.delete(' ') # TODO fix in the UI the disaply of taskes end @@ -329,7 +332,7 @@ class SubmissionFlowsTest < ApplicationSystemTestCase assert_equal existent_submission.pullLocation, find_field('submission[pullLocation]').value click_button 'Next' - + assert_equal Date.parse(existent_submission.modificationDate).to_s, find('[name="submission[modificationDate]"]', visible: false).value assert_equal existent_submission.contact.map(&:values).flatten.sort, all('[name^="submission[contact]"]').map(&:value).sort @@ -651,4 +654,4 @@ def fill_ontology(new_ontology, new_submission, add_submission: false) click_button 'Finish' end end -end \ No newline at end of file +end From 5925571f01326e98880d30e6f70a058e66b1c95a Mon Sep 17 00:00:00 2001 From: Bilel Kihal <61744974+Bilelkihal@users.noreply.github.com> Date: Sun, 4 Aug 2024 11:46:47 +0200 Subject: [PATCH 50/57] Feature: Make agent indentifiers field set by default based on agent type (#721) * remove the restriction for certain submission fields to create only organization type or person type agents * make orcid or ror default input based on agent type in agent form * fix disappeared signup form icons * fix nested agents creation * fix agent form not filling saved identifier values * create an agent identifier input helper * disable cookie banner in development and test mode * fix agent tests after enforcing ROR for organizations --------- Co-authored-by: Syphax --- app/assets/stylesheets/agents.scss | 19 ++++++++ app/controllers/agents_controller.rb | 4 ++ app/helpers/agent_helper.rb | 18 +++++++ app/views/agents/_form.html.haml | 36 +++++++------- app/views/layouts/_header.html.erb | 72 +++++++++++++++++----------- app/views/users/_form.html.haml | 4 +- test/system/agent_flows_test.rb | 4 +- 7 files changed, 110 insertions(+), 47 deletions(-) diff --git a/app/assets/stylesheets/agents.scss b/app/assets/stylesheets/agents.scss index df7b74d71..bed9b6b14 100644 --- a/app/assets/stylesheets/agents.scss +++ b/app/assets/stylesheets/agents.scss @@ -31,4 +31,23 @@ display: flex !important; flex-direction: column; justify-content: center; +} +.agent-input-with-icon{ + padding: 8px; + margin-bottom: 0px; + border-radius: 5px; + width: 100%; + color: #5f6573; + outline: none; + font-size: 15px; + font-weight: 500; + border: 1px solid #d7d7d7; + padding-left: 45px; +} +.agent-input-icon{ + height: 20px; + width: 20px; + position: absolute; + padding: 11px 17px; + box-sizing: unset; } \ No newline at end of file diff --git a/app/controllers/agents_controller.rb b/app/controllers/agents_controller.rb index 652e01a40..7ee6f3808 100644 --- a/app/controllers/agents_controller.rb +++ b/app/controllers/agents_controller.rb @@ -273,6 +273,10 @@ def agent_params v end end + identifiers_schemaAgency = params[:agentType].eql?('person') ? 'ORCID' : 'ROR' + p[:identifiers]&.each_value do |identifier| + identifier[:schemaAgency] = identifiers_schemaAgency + end p[:identifiers] = (p[:identifiers] || {}).values p[:affiliations] = (p[:affiliations] || {}).values p[:affiliations].each do |affiliation| diff --git a/app/helpers/agent_helper.rb b/app/helpers/agent_helper.rb index 513854f0f..6c5366bf7 100644 --- a/app/helpers/agent_helper.rb +++ b/app/helpers/agent_helper.rb @@ -82,6 +82,24 @@ def identifier_link(link, link_to: true) end + + def agent_identifier_input(index, name_prefix, value = '', is_organization: true) + + content_tag :div, id: index, class: 'd-flex' do + content_tag(:div, class: 'w-100') do + + concat hidden_field_tag(agent_identifier_name(index , :creator, name_prefix), session[:user].id) + if is_organization + concat inline_svg_tag 'icons/ror.svg', class: 'agent-input-icon' + else + concat inline_svg_tag('orcid.svg', class: 'agent-input-icon') + end + concat text_field_tag(agent_identifier_name(index, :notation, name_prefix), value, class: 'agent-input-with-icon') + end + 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| diff --git a/app/views/agents/_form.html.haml b/app/views/agents/_form.html.haml index 20c35857d..2e8aa35d4 100644 --- a/app/views/agents/_form.html.haml +++ b/app/views/agents/_form.html.haml @@ -9,7 +9,7 @@ = hidden_field_tag :deletable, deletable if deletable = hidden_field_tag agent_field_name(:id, name_prefix), agent.id if agent.id - - if is_organization?(agent) && params[:parent_id] + - if is_organization?(agent) && params[:parent_id] = hidden_field_tag agent_field_name(:agentType, name_prefix), agent.agentType - else %tr @@ -56,27 +56,31 @@ %th = t("agents.form.identifiers") %td.top - %div.agents-identifiers + %div.agents-identifiers{'data-form-options-display-target':"option1", class: is_organization?(agent) && 'd-none'} = render NestedFormInputsComponent.new do |c| - c.template do - %div.d-flex{id: 'NEW_RECORD'} - %div.w-100 - = hidden_field_tag agent_identifier_name('NEW_RECORD' , :creator, name_prefix), session[:user].id - = text_field_tag agent_identifier_name('NEW_RECORD' , :notation, name_prefix), '', class: "form-control" - %div{style:'width: 15%'} - - values = %w[ORCID ROR ISNI GRID] - = render SelectInputComponent.new(id: "agent_identifiers_schemaAgency_NEW_RECORD", name: agent_identifier_name('NEW_RECORD', :schemaAgency, name_prefix), values: values, selected: 'ORCID') + = agent_identifier_input('NEW_RECORD', name_prefix) + - c.empty_state do = hidden_field_tag agent_field_name('', name_prefix+"[#{Array(agent.identifiers).size}]") + - Array(agent.identifiers).each_with_index do |identifier, i| - c.row do - %div.d-flex{id: identifier.id} - %div.w-100 - = hidden_field_tag agent_identifier_name(i.to_s.upcase, :creator, name_prefix), session[:user].id - = text_field_tag agent_identifier_name(i.to_s.upcase, :notation, name_prefix), identifier.notation, class: "form-control" - %div{style:'width: 15%'} - - values = %w[ORCID ROR ISNI GRID] - = render SelectInputComponent.new(id: "#{name_prefix}_identifiers_schemaAgency_#{i.to_s.upcase}", name: agent_identifier_name(i.to_s.upcase, :schemaAgency, name_prefix), values: values, selected: identifier.schemaAgency) + = agent_identifier_input(i.to_s.upcase, name_prefix, identifier.notation) + + %div.agents-identifiers{'data-form-options-display-target':"option2", class: !is_organization?(agent) && 'd-none'} + = render NestedFormInputsComponent.new do |c| + - c.template do + = agent_identifier_input('NEW_RECORD', name_prefix, is_organization: false) + + - c.empty_state do + = hidden_field_tag agent_field_name('', name_prefix+"[#{Array(agent.identifiers).size}]") + + - Array(agent.identifiers).each_with_index do |identifier, i| + - c.row do + = agent_identifier_input(i.to_s.upcase, name_prefix, identifier.notation, is_organization: false) + + - if show_affiliations %tr{'data-form-options-display-target':"option1", class: is_organization?(agent) && 'd-none'} %th diff --git a/app/views/layouts/_header.html.erb b/app/views/layouts/_header.html.erb index 244d0a15b..07d28d73d 100644 --- a/app/views/layouts/_header.html.erb +++ b/app/views/layouts/_header.html.erb @@ -1,25 +1,28 @@ - lang="<%=I18n.locale%>"> + lang="<%= I18n.locale %>"> - <%= render partial: 'ga_tracking' %> - + <%= render partial: 'ga_tracking' %> + - - + + - <% unless Rails.env.appliance? %> + <% unless Rails.env.appliance? %> - + <% end %> - - <%= csrf_meta_tag %> - - <%if @title.nil?%><%=$ORG_SITE%><%else%><%="#{@title} | #{$ORG_SITE}"%><%end%> - - - - - + + <%= csrf_meta_tag %> + + + <% if @title.nil? %><%= $ORG_SITE %> + <% else %><%= "#{@title} | #{$ORG_SITE}" %> + <% end %> + + + + + <%= stylesheet_link_tag "https://use.fontawesome.com/releases/v5.2.0/css/all.css", integrity: "sha384-hWVjflwFxL6sNzntih27bfxkr27PmbbK/iSvJ+a4+0owXq79v+lsFkW54bOGbiDQ", crossorigin: "anonymous" %> <%= stylesheet_link_tag "application" %> @@ -27,19 +30,34 @@ <%= javascript_include_tag "vendor" %> - + - <%=render partial: 'layouts/topnav'%> - <%= turbo_frame_tag :cookies_modal, src: cookies_path if session[:cookies_accepted].nil? %> +<%= render partial: 'layouts/topnav' %> +<%= turbo_frame_tag :cookies_modal, src: cookies_path if session[:cookies_accepted].nil? && !(Rails.env.development? || Rails.env.test?) %> -
- <%=render partial: 'layouts/notices'%> \ No newline at end of file +
+<%= render partial: 'layouts/notices' %> \ No newline at end of file diff --git a/app/views/users/_form.html.haml b/app/views/users/_form.html.haml index 3a2f38b52..02fde4988 100644 --- a/app/views/users/_form.html.haml +++ b/app/views/users/_form.html.haml @@ -27,13 +27,13 @@ ORCID ID %font.register-optional = t('register.optional') - %img.register-input-icon{:src => "#{asset_path("orcid.svg")}"}/ + = inline_svg_tag 'orcid.svg', class: 'register-input-icon' = text_field :user, :orcidId, value: @user.orcidId, class: "register-input-long register-input-with-icon" %p.register-input-title Github ID %font.register-optional = t('register.optional') - %img.register-input-icon{:src => "#{asset_path("github-icon.svg")}"}/ + = inline_svg_tag 'github-icon.svg', class: 'register-input-icon' = text_field :user, :githubId, value: @user.githubId, class: "register-input-long register-input-with-icon" %p.register-input-title = t('register.email') diff --git a/test/system/agent_flows_test.rb b/test/system/agent_flows_test.rb index 953c4d2e4..5eeb72055 100644 --- a/test/system/agent_flows_test.rb +++ b/test/system/agent_flows_test.rb @@ -68,7 +68,7 @@ def create_agent_flow(new_agent, person_count: , organization_count:) within "table#admin_agents" do assert_selector '.human', count: person_count + organization_count # all created agents assert_text new_agent.name - new_agent.identifiers.map{|x| "https://orcid.org/#{x["notation"]}"}.each do |orcid| + new_agent.identifiers.map{|x| "https://#{new_agent.agentType.eql?('organization') ? 'ror' : 'orcid'}.org/#{x["notation"]}"}.each do |orcid| assert_text orcid end @@ -91,7 +91,7 @@ def edit_agent_flow(agent, person_count: , organization_count: ) within "table#admin_agents" do assert_selector '.human', count: person_count + organization_count # all created agents assert_text agent.name - agent.identifiers.map{|x| "https://orcid.org/#{x["notation"]}"}.each do |orcid| + agent.identifiers.map{|x| "https://#{agent.agentType.eql?('organization') ? 'ror' : 'orcid'}.org/#{x["notation"]}"}.each do |orcid| assert_text orcid end assert_text 'person', count: person_count From 5c3c9ea5a00512054f17f5eb051287e78c5358d0 Mon Sep 17 00:00:00 2001 From: Bilel Kihal <61744974+Bilelkihal@users.noreply.github.com> Date: Sun, 4 Aug 2024 12:18:32 +0200 Subject: [PATCH 51/57] Fix: propertyid param auto added to summary page URL (#723) * Fix propertyId param auto added to summary page URL * remove added PropertyId param to the URL when opening summary page * Fix auto added propertyId to the summary page URL * Fix auto added instanceid to the summary page URL * Fix auto added propertyId to the summary page URL * add back the constraint of making frames loading lazy while env.development * make by default properties section displays the first property * make by default instances section displays the first instance * change the name of the function instances_tree_first_id by search_first_instance_id * add a clarification comment in search_first_instance_id method * move get_property function to properties controller --------- Co-authored-by: Syphax --- app/controllers/application_controller.rb | 16 ++++++++-------- app/controllers/instances_controller.rb | 2 +- app/controllers/ontologies_controller.rb | 19 +++++++++++++++++-- app/controllers/properties_controller.rb | 5 +---- app/helpers/ontologies_helper.rb | 2 +- app/helpers/properties_helper.rb | 6 +++++- .../controllers/history_controller.js | 1 - 7 files changed, 33 insertions(+), 18 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 6d2305ce6..f75a395b7 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -22,7 +22,7 @@ def self.t(*args) end # 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}'" @@ -30,7 +30,7 @@ def set_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 @@ -38,10 +38,10 @@ 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 + + return I18n.default_locale end - + helper :all # include all helpers, all the time helper_method :bp_config_json, :current_license, :using_captcha? @@ -385,7 +385,7 @@ def get_apikey() def total_mapping_count total_count = 0 - + begin stats = LinkedData::Client::HTTP.get("#{REST_URI}/mappings/statistics/ontologies") unless stats.blank? @@ -397,7 +397,7 @@ def total_mapping_count rescue LOG.add :error, e.message end - + return total_count end @@ -421,7 +421,7 @@ def init_trial_license $trial_license_initialized = true end end - + # Get the submission metadata from the REST API. def submission_metadata @metadata ||= helpers.submission_metadata diff --git a/app/controllers/instances_controller.rb b/app/controllers/instances_controller.rb index 1698e61d2..70db77344 100644 --- a/app/controllers/instances_controller.rb +++ b/app/controllers/instances_controller.rb @@ -25,7 +25,7 @@ def index child_turbo_frame: 'instance_show', child_param: :instanceid, show_count: is_concept_instance, - auto_click: params[:instanceid].blank? && page.eql?(1), + auto_click: false, results: results, next_page: next_page, total_count: total_count) if is_concept_instance && page.eql?(1) diff --git a/app/controllers/ontologies_controller.rb b/app/controllers/ontologies_controller.rb index b4c12917c..a8ea52049 100644 --- a/app/controllers/ontologies_controller.rb +++ b/app/controllers/ontologies_controller.rb @@ -14,6 +14,7 @@ class OntologiesController < ApplicationController include SubmissionFilter include OntologyContentSerializer include UriRedirection + include PropertiesHelper require 'multi_json' require 'cgi' @@ -98,10 +99,12 @@ def properties @acronym = @ontology.acronym @properties = LinkedData::Client::HTTP.get("/ontologies/#{@acronym}/properties/roots", { lang: request_lang }) + @property = get_property(@properties.first.id, @acronym, include: 'all') unless @property || @properties.empty? + if request.xhr? - return render 'ontologies/sections/properties', layout: false + render 'ontologies/sections/properties', layout: false else - return render 'ontologies/sections/properties', layout: 'ontology_viewer' + render 'ontologies/sections/properties', layout: 'ontology_viewer' end end @@ -176,6 +179,8 @@ def notes def instances + params[:instanceid] = params[:instanceid] || search_first_instance_id + if params[:instanceid] @instance = helpers.get_instance_details_json(@ontology.acronym, params[:instanceid], {include: 'all'}) end @@ -553,5 +558,15 @@ def determine_layout end end + def search_first_instance_id + query, page, page_size = helpers.search_content_params + results, _, _, _ = search_ontologies_content(query: query, + page: page, + page_size: page_size, + filter_by_ontologies: [@ontology.acronym], + filter_by_types: ["NamedIndividual"]) + results.shift # Remove the ontology entry + return !results.blank? ? results.first[:name] : nil + end end diff --git a/app/controllers/properties_controller.rb b/app/controllers/properties_controller.rb index 194f494f3..7679a7889 100644 --- a/app/controllers/properties_controller.rb +++ b/app/controllers/properties_controller.rb @@ -1,5 +1,5 @@ class PropertiesController < ApplicationController - include TurboHelper, SearchContent, TermsReuses + include TurboHelper, SearchContent, TermsReuses, PropertiesHelper def index acronym = params[:ontology] @@ -60,9 +60,6 @@ def show_children private - def get_property(id, acronym = params[:acronym], lang = request_lang, include: nil) - LinkedData::Client::HTTP.get("/ontologies/#{acronym}/properties/#{helpers.encode_param(id)}", { lang: lang , include: include}) - end def property_tree(id, acronym = params[:acronym], lang = request_lang) LinkedData::Client::HTTP.get("/ontologies/#{acronym}/properties/#{helpers.encode_param(id)}/tree", { lang: lang }) diff --git a/app/helpers/ontologies_helper.rb b/app/helpers/ontologies_helper.rb index 536b8ec7d..4e05ad775 100644 --- a/app/helpers/ontologies_helper.rb +++ b/app/helpers/ontologies_helper.rb @@ -431,7 +431,7 @@ def lazy_load_section(section_title, &block) block.call else render TurboFrameComponent.new(id: section_title, src: "/ontologies/#{@ontology.acronym}?p=#{section_title}", - loading: Rails.env.development? ? "lazy" : "eager", + loading: Rails.env.development? ? "lazy" : "eager", target: '_top', data: { "turbo-frame-target": "frame" }) end end diff --git a/app/helpers/properties_helper.rb b/app/helpers/properties_helper.rb index 9d5459f01..9d8b2fdce 100644 --- a/app/helpers/properties_helper.rb +++ b/app/helpers/properties_helper.rb @@ -19,7 +19,7 @@ def property_tree_data(acronym, child, language) end def property_tree_component(root, selected_concept, acronym, language, sub_tree: false, id: nil, auto_click: false, submission: @submission) - tree_component(root, selected_concept, target_frame: 'property_show', sub_tree: sub_tree, id: id, auto_click: auto_click, submission: submission) do |child| + tree_component(root, selected_concept, target_frame: 'property_show', sub_tree: sub_tree, id: id, auto_click: false, submission: submission) do |child| property_tree_data(acronym, child, language) end end @@ -33,4 +33,8 @@ def no_properties_alert t('properties.no_properties_alert', acronym: @ontology.acronym) end end + + def get_property(id, acronym = params[:acronym], lang = request_lang, include: nil) + LinkedData::Client::HTTP.get("/ontologies/#{acronym}/properties/#{helpers.encode_param(id)}", { lang: lang , include: include}) + end end diff --git a/app/javascript/controllers/history_controller.js b/app/javascript/controllers/history_controller.js index 62e3c7c69..48518c64a 100644 --- a/app/javascript/controllers/history_controller.js +++ b/app/javascript/controllers/history_controller.js @@ -4,7 +4,6 @@ import { HistoryService } from "../mixins/useHistory"; // Connects to data-controller="history" export default class extends Controller { connect() { - console.log('hello world') this.history = new HistoryService() } updateURL(event) { From 525caea274b705dd42a986818dbb6ac8e1cfb574 Mon Sep 17 00:00:00 2001 From: Bilel KIHAL Date: Thu, 30 May 2024 14:48:54 +0200 Subject: [PATCH 52/57] fix losing context when changing language in concepts page --- app/helpers/ontologies_helper.rb | 10 +-------- .../controllers/language_change_controller.js | 21 +++++++++---------- app/views/layouts/_ontology_viewer.html.haml | 2 +- 3 files changed, 12 insertions(+), 21 deletions(-) diff --git a/app/helpers/ontologies_helper.rb b/app/helpers/ontologies_helper.rb index 4e05ad775..5c809ca60 100644 --- a/app/helpers/ontologies_helper.rb +++ b/app/helpers/ontologies_helper.rb @@ -417,14 +417,6 @@ def ontology_data_section?(section_title = current_section) ontology_data_sections.include?(section_title) end - 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" } - else - {} - end - end def lazy_load_section(section_title, &block) if current_section.eql?(section_title) @@ -527,7 +519,7 @@ def language_selector_tag(name) 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#changeContentLanguage" } end diff --git a/app/javascript/controllers/language_change_controller.js b/app/javascript/controllers/language_change_controller.js index 3a78bfcb2..a1254897a 100644 --- a/app/javascript/controllers/language_change_controller.js +++ b/app/javascript/controllers/language_change_controller.js @@ -3,16 +3,15 @@ import { Controller } from "@hotwired/stimulus" // Connects to data-controller="language-change" export default class extends Controller { - dispatchLangChangeEvent() { - this.element.dispatchEvent(new CustomEvent('lang_changed', { - bubbles: true, - cancelable: true, - detail: { - data: { - language: [this.element.value] - } - } - })); - + changeContentLanguage() { + const lang = this.element.value + var urlSearchParams = new URLSearchParams(window.location.search); + if (urlSearchParams.has('language')) { + urlSearchParams.set('language', lang); + } else { + urlSearchParams.append('language', lang); + } + var newUrl = window.location.origin + window.location.pathname + '?' + urlSearchParams.toString(); + Turbo.visit(newUrl); } } diff --git a/app/views/layouts/_ontology_viewer.html.haml b/app/views/layouts/_ontology_viewer.html.haml index e7f3010e1..e63014c76 100644 --- a/app/views/layouts/_ontology_viewer.html.haml +++ b/app/views/layouts/_ontology_viewer.html.haml @@ -50,7 +50,7 @@ data: {'ontology-viewer-tabs-target': 'languageSelector' }} = language_selector_tag(:content_language) - t.item_content do - %div.p-1{data: section_data(section_title)} + %div.p-1 = language_selector_hidden_tag(section_title) if ontology_data_section?(section_title) = lazy_load_section(section_title) { yield } From 8ad7155e46c0ca460cb031369619ad7232220cad Mon Sep 17 00:00:00 2001 From: Bilel KIHAL Date: Mon, 3 Jun 2024 16:46:40 +0200 Subject: [PATCH 53/57] fix concept not added to browser URL param issue --- app/helpers/ontologies_helper.rb | 8 ++++++++ app/views/layouts/_ontology_viewer.html.haml | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/app/helpers/ontologies_helper.rb b/app/helpers/ontologies_helper.rb index 5c809ca60..c0fec74e4 100644 --- a/app/helpers/ontologies_helper.rb +++ b/app/helpers/ontologies_helper.rb @@ -417,6 +417,14 @@ def ontology_data_section?(section_title = current_section) ontology_data_sections.include?(section_title) end + 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} + else + {} + end + end def lazy_load_section(section_title, &block) if current_section.eql?(section_title) diff --git a/app/views/layouts/_ontology_viewer.html.haml b/app/views/layouts/_ontology_viewer.html.haml index e63014c76..e7f3010e1 100644 --- a/app/views/layouts/_ontology_viewer.html.haml +++ b/app/views/layouts/_ontology_viewer.html.haml @@ -50,7 +50,7 @@ data: {'ontology-viewer-tabs-target': 'languageSelector' }} = language_selector_tag(:content_language) - t.item_content do - %div.p-1 + %div.p-1{data: section_data(section_title)} = language_selector_hidden_tag(section_title) if ontology_data_section?(section_title) = lazy_load_section(section_title) { yield } From 5312cbea7ddc7266b7f9a37dfac5b97e2470b6e6 Mon Sep 17 00:00:00 2001 From: Bilel KIHAL Date: Mon, 3 Jun 2024 17:04:53 +0200 Subject: [PATCH 54/57] refrech the whole page when we change concepts language --- app/javascript/controllers/language_change_controller.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/controllers/language_change_controller.js b/app/javascript/controllers/language_change_controller.js index a1254897a..32e1c7ab0 100644 --- a/app/javascript/controllers/language_change_controller.js +++ b/app/javascript/controllers/language_change_controller.js @@ -12,6 +12,6 @@ export default class extends Controller { urlSearchParams.append('language', lang); } var newUrl = window.location.origin + window.location.pathname + '?' + urlSearchParams.toString(); - Turbo.visit(newUrl); + window.location.href = newUrl; } } From cb3b7ba702255b0eda51fba42c8b0628cebaa03b Mon Sep 17 00:00:00 2001 From: Syphax Date: Mon, 5 Aug 2024 14:19:48 +0200 Subject: [PATCH 55/57] fix not saving the current url context when changing the language --- app/javascript/controllers/turbo_frame_controller.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/javascript/controllers/turbo_frame_controller.js b/app/javascript/controllers/turbo_frame_controller.js index 41c67dd5d..86ab789d7 100644 --- a/app/javascript/controllers/turbo_frame_controller.js +++ b/app/javascript/controllers/turbo_frame_controller.js @@ -24,7 +24,9 @@ export default class extends Controller { this.frame.innerHTML = this.placeHolderValue } else { this.frame.innerHTML = "" - this.urlValue = new HistoryService().getUpdatedURL(this.urlValue, data) + + let currentUrl = document.location.pathname + document.location.search + this.urlValue = new HistoryService().getUpdatedURL(currentUrl, data) this.frame.src = this.urlValue } } From e366fd66ce03b82ebeb7ca963b03e8ebf99cbd87 Mon Sep 17 00:00:00 2001 From: Syphax Date: Mon, 5 Aug 2024 14:20:04 +0200 Subject: [PATCH 56/57] Revert "Merge remote-tracking branch 'origin/fix/change-language-lost-context' into fix/change-language-lost-context" This reverts commit c7b6d08572c6e674993fc1ebda583d27ee91b3d3, reversing changes made to cb3b7ba702255b0eda51fba42c8b0628cebaa03b. --- app/helpers/ontologies_helper.rb | 4 ++-- .../controllers/language_change_controller.js | 21 ++++++++++--------- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/app/helpers/ontologies_helper.rb b/app/helpers/ontologies_helper.rb index c0fec74e4..4e05ad775 100644 --- a/app/helpers/ontologies_helper.rb +++ b/app/helpers/ontologies_helper.rb @@ -420,7 +420,7 @@ 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} + { controller: "history turbo-frame", 'turbo-frame-url-value': url_value, action: "lang_changed->history#updateURL lang_changed->turbo-frame#updateFrame" } else {} end @@ -527,7 +527,7 @@ def language_selector_tag(name) 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#changeContentLanguage" } + data: { controller: "language-change", 'language-change-section-value': section, action: "change->language-change#dispatchLangChangeEvent" } end diff --git a/app/javascript/controllers/language_change_controller.js b/app/javascript/controllers/language_change_controller.js index 32e1c7ab0..3a78bfcb2 100644 --- a/app/javascript/controllers/language_change_controller.js +++ b/app/javascript/controllers/language_change_controller.js @@ -3,15 +3,16 @@ import { Controller } from "@hotwired/stimulus" // Connects to data-controller="language-change" export default class extends Controller { - changeContentLanguage() { - const lang = this.element.value - var urlSearchParams = new URLSearchParams(window.location.search); - if (urlSearchParams.has('language')) { - urlSearchParams.set('language', lang); - } else { - urlSearchParams.append('language', lang); - } - var newUrl = window.location.origin + window.location.pathname + '?' + urlSearchParams.toString(); - window.location.href = newUrl; + dispatchLangChangeEvent() { + this.element.dispatchEvent(new CustomEvent('lang_changed', { + bubbles: true, + cancelable: true, + detail: { + data: { + language: [this.element.value] + } + } + })); + } } From 6b90576fb1e400cd8ab19dcdd9808fafbcbaf048 Mon Sep 17 00:00:00 2001 From: Syphax Date: Tue, 6 Aug 2024 11:52:33 +0200 Subject: [PATCH 57/57] update turbo frame controller to handle ontology viewer special case --- .../controllers/turbo_frame_controller.js | 37 +++++++++++++++++-- app/javascript/mixins/useHistory.js | 6 +-- 2 files changed, 37 insertions(+), 6 deletions(-) diff --git a/app/javascript/controllers/turbo_frame_controller.js b/app/javascript/controllers/turbo_frame_controller.js index 86ab789d7..6520acb64 100644 --- a/app/javascript/controllers/turbo_frame_controller.js +++ b/app/javascript/controllers/turbo_frame_controller.js @@ -25,9 +25,40 @@ export default class extends Controller { } else { this.frame.innerHTML = "" - let currentUrl = document.location.pathname + document.location.search - this.urlValue = new HistoryService().getUpdatedURL(currentUrl, data) - this.frame.src = this.urlValue + if(this.#isCurrentPage()){ + this.urlValue = this.#currentPageUrl() + } + + this.urlValue = this.#updatedPageUrl(data) + + this.frame.src = this.urlValue + } } + + #isCurrentPage(){ + + let currentDisplayedUrl = new URL(this.#currentPageUrl(), document.location.origin) + + let initUrl = new URL(this.urlValue, document.location.origin) + + if (currentDisplayedUrl.toString().includes(this.urlValue)){ + return true + } else if (currentDisplayedUrl.searchParams.get('p') === initUrl.searchParams.get('p')){ + // this is a custom fix for only the ontology viewer page, + // that use the parameter ?p=section to tell which section is displayed + return true + } + + return false + } + + + #currentPageUrl(){ + return document.location.pathname + document.location.search + } + + #updatedPageUrl(newUrlParams){ + return new HistoryService().getUpdatedURL(this.urlValue, newUrlParams) + } } diff --git a/app/javascript/mixins/useHistory.js b/app/javascript/mixins/useHistory.js index ce895f1a6..e34b3c908 100644 --- a/app/javascript/mixins/useHistory.js +++ b/app/javascript/mixins/useHistory.js @@ -59,9 +59,9 @@ export class HistoryService { return newState } - #updateURLFromState(urlParams, state) { - Object.entries(state).forEach(([key, val]) => { - if (key !== 'p'){ + #updateURLFromState(urlParams, oldState) { + Object.entries(oldState).forEach(([key, val]) => { + if (key !== 'p' && !urlParams.has(key)) { urlParams.set(key, val) } })