{"version":3,"file":"../../../assets/js/app.1b72591c.js","mappings":"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","sources":["webpack://mapp/./src/App.vue","webpack://mapp/./src/components/RoomDriver.vue","webpack://mapp/./src/components/BasicInstructions.vue","webpack://mapp/./src/components/RightAlignButton.vue","webpack://mapp/src/components/RightAlignButton.vue","webpack://mapp/./src/components/RightAlignButton.vue?c5d5","webpack://mapp/./src/components/RightAlignButton.vue?8c75","webpack://mapp/src/components/BasicInstructions.vue","webpack://mapp/./src/components/BasicInstructions.vue?607e","webpack://mapp/./src/components/BasicInstructions.vue?aca7","webpack://mapp/./src/components/DelayedPhase.vue","webpack://mapp/./src/components/DelayedQuestion.vue","webpack://mapp/./src/components/ImagePlacement.vue","webpack://mapp/./src/timing.js","webpack://mapp/./src/components/BasicError.vue","webpack://mapp/src/components/BasicError.vue","webpack://mapp/./src/components/BasicError.vue?63a6","webpack://mapp/./src/components/BasicError.vue?5fee","webpack://mapp/src/components/ImagePlacement.vue","webpack://mapp/./src/components/ImagePlacement.vue?b0a0","webpack://mapp/./src/components/ImagePlacement.vue?1c34","webpack://mapp/./src/components/ImageSelectionList.vue","webpack://mapp/./src/components/ImageSelectionItem.vue","webpack://mapp/./src/components/BasicStimuliImage.vue","webpack://mapp/src/components/BasicStimuliImage.vue","webpack://mapp/./src/components/BasicStimuliImage.vue?76b8","webpack://mapp/./src/components/BasicStimuliImage.vue?a65e","webpack://mapp/src/components/ImageSelectionItem.vue","webpack://mapp/./src/components/ImageSelectionItem.vue?52a1","webpack://mapp/./src/components/ImageSelectionItem.vue?4569","webpack://mapp/./src/components/LoadingSpinner.vue","webpack://mapp/src/components/LoadingSpinner.vue","webpack://mapp/./src/components/LoadingSpinner.vue?a847","webpack://mapp/./src/components/LoadingSpinner.vue?1b2d","webpack://mapp/src/components/ImageSelectionList.vue","webpack://mapp/./src/components/ImageSelectionList.vue?edad","webpack://mapp/./src/components/ImageSelectionList.vue?f8f0","webpack://mapp/./src/components/RoomConfidence.vue","webpack://mapp/./src/components/BasicCardInput.vue","webpack://mapp/src/components/BasicCardInput.vue","webpack://mapp/./src/components/BasicCardInput.vue?6cac","webpack://mapp/./src/components/BasicCardInput.vue?f04c","webpack://mapp/src/components/RoomConfidence.vue","webpack://mapp/./src/components/RoomConfidence.vue?7fdb","webpack://mapp/./src/components/RoomConfidence.vue?13d2","webpack://mapp/./src/components/RoomMetaMemory.vue","webpack://mapp/src/components/RoomMetaMemory.vue","webpack://mapp/./src/components/RoomMetaMemory.vue?1826","webpack://mapp/./src/components/RoomMetaMemory.vue?ee83","webpack://mapp/./src/components/utils/QuestionTimer.vue","webpack://mapp/src/components/utils/QuestionTimer.vue","webpack://mapp/./src/components/utils/QuestionTimer.vue?e9e8","webpack://mapp/./src/components/utils/QuestionTimer.vue?ba6f","webpack://mapp/src/components/DelayedQuestion.vue","webpack://mapp/./src/components/DelayedQuestion.vue?a234","webpack://mapp/./src/components/DelayedQuestion.vue?8bad","webpack://mapp/src/components/DelayedPhase.vue","webpack://mapp/./src/components/DelayedPhase.vue?f118","webpack://mapp/./src/components/DelayedPhase.vue?5a73","webpack://mapp/./src/components/MemoryPhase.vue","webpack://mapp/./src/components/RoomQuestion.vue","webpack://mapp/src/components/RoomQuestion.vue","webpack://mapp/./src/components/RoomQuestion.vue?741b","webpack://mapp/./src/components/RoomQuestion.vue?19f7","webpack://mapp/src/components/MemoryPhase.vue","webpack://mapp/./src/components/MemoryPhase.vue?f670","webpack://mapp/./src/components/MemoryPhase.vue?df66","webpack://mapp/./src/components/RoomPractice.vue","webpack://mapp/./src/staticImage.js","webpack://mapp/./src/practiceData.js","webpack://mapp/./src/phaseChip.js","webpack://mapp/src/components/RoomPractice.vue","webpack://mapp/./src/components/RoomPractice.vue?93e7","webpack://mapp/./src/components/RoomPractice.vue?225c","webpack://mapp/src/components/RoomDriver.vue","webpack://mapp/./src/components/RoomDriver.vue?764d","webpack://mapp/./src/components/RoomDriver.vue?c976","webpack://mapp/./src/components/SeriesDriver.vue","webpack://mapp/./src/components/SeriesQuestion.vue","webpack://mapp/src/components/SeriesQuestion.vue","webpack://mapp/./src/components/SeriesQuestion.vue?d157","webpack://mapp/./src/components/SeriesQuestion.vue?fc79","webpack://mapp/src/components/SeriesDriver.vue","webpack://mapp/./src/components/SeriesDriver.vue?ba9f","webpack://mapp/./src/components/SeriesDriver.vue?d424","webpack://mapp/./src/components/UserInformation.vue","webpack://mapp/./src/components/CountrySelect.vue","webpack://mapp/src/components/CountrySelect.vue","webpack://mapp/./src/components/CountrySelect.vue?0f01","webpack://mapp/./src/components/CountrySelect.vue?675f","webpack://mapp/src/components/UserInformation.vue","webpack://mapp/./src/components/UserInformation.vue?b361","webpack://mapp/./src/components/UserInformation.vue?b230","webpack://mapp/./src/preload.js","webpack://mapp/./src/components/fname/FNameDriver.vue","webpack://mapp/./src/components/fname/FNameInstructions.vue","webpack://mapp/./src/components/fname/learning/FNameLearningPhase.vue","webpack://mapp/./src/components/customProgressBar.vue","webpack://mapp/src/components/customProgressBar.vue","webpack://mapp/./src/components/customProgressBar.vue?e0e3","webpack://mapp/./src/components/customProgressBar.vue?0fc1","webpack://mapp/src/components/fname/learning/FNameLearningPhase.vue","webpack://mapp/./src/components/fname/learning/FNameLearningPhase.vue?bda4","webpack://mapp/./src/components/fname/learning/FNameLearningPhase.vue?19f4","webpack://mapp/./src/components/fname/recognition/FNameRecognitionPhase.vue","webpack://mapp/src/components/fname/recognition/FNameRecognitionPhase.vue","webpack://mapp/./src/components/fname/recognition/FNameRecognitionPhase.vue?73ba","webpack://mapp/./src/components/fname/recognition/FNameRecognitionPhase.vue?fa4d","webpack://mapp/./src/components/fname/matching/FNameMatchingPhase.vue","webpack://mapp/src/components/fname/matching/FNameMatchingPhase.vue","webpack://mapp/./src/components/fname/matching/FNameMatchingPhase.vue?2341","webpack://mapp/./src/components/fname/matching/FNameMatchingPhase.vue?3fd0","webpack://mapp/./src/components/fname/initials/FNameInitialPhase.vue","webpack://mapp/src/components/fname/initials/FNameInitialPhase.vue","webpack://mapp/./src/components/fname/initials/FNameInitialPhase.vue?8d50","webpack://mapp/./src/components/fname/initials/FNameInitialPhase.vue?6f57","webpack://mapp/src/components/fname/FNameInstructions.vue","webpack://mapp/./src/components/fname/FNameInstructions.vue?3b95","webpack://mapp/./src/components/fname/FNameInstructions.vue?f9d2","webpack://mapp/./src/components/CountdownTimer.vue","webpack://mapp/src/components/CountdownTimer.vue","webpack://mapp/./src/components/CountdownTimer.vue?cc45","webpack://mapp/./src/components/CountdownTimer.vue?f680","webpack://mapp/src/components/fname/FNameDriver.vue","webpack://mapp/./src/components/fname/FNameDriver.vue?9b9e","webpack://mapp/./src/components/fname/FNameDriver.vue?838a","webpack://mapp/./src/components/FnameDelayBadge.vue","webpack://mapp/src/components/FnameDelayBadge.vue","webpack://mapp/./src/components/FnameDelayBadge.vue?1765","webpack://mapp/./src/components/FnameDelayBadge.vue?d3a0","webpack://mapp/src/App.vue","webpack://mapp/./src/App.vue?c036","webpack://mapp/./src/App.vue?0e40","webpack://mapp/./src/main.js","webpack://mapp/webpack/bootstrap","webpack://mapp/webpack/runtime/chunk loaded","webpack://mapp/webpack/runtime/compat get default export","webpack://mapp/webpack/runtime/concatenation wrap","webpack://mapp/webpack/runtime/define property getters","webpack://mapp/webpack/runtime/global","webpack://mapp/webpack/runtime/hasOwnProperty shorthand","webpack://mapp/webpack/runtime/make namespace object","webpack://mapp/webpack/runtime/jsonp chunk loading","webpack://mapp/webpack/startup"],"sourcesContent":["var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{attrs:{\"id\":\"app\"}},[(_vm.test_json && _vm.step === 1)?_c('div',{staticClass:\"d-flex justify-content-center align-items-center\"},[_c('h5',{staticClass:\"mb-0\"},[_vm._v(_vm._s(_vm.test_name_header))]),(_vm.phase_chip.label === 'practice')?_c('div',{staticClass:\"chip chip-orange d-flex ml-2\"},[_c('p',{staticClass:\"m-0\"},[_vm._v(_vm._s(_vm.gettext(\"Practice\")))])]):(_vm.phase_chip.label === 'test')?_c('div',{staticClass:\"chip chip-green d-flex ml-2\"},[_c('p',{staticClass:\"m-0\"},[_vm._v(_vm._s(_vm.gettext(\"Test\")))])]):_vm._e()]):_vm._e(),(_vm.is_clinical_trial && _vm.step === 1 && _vm.fname_delayed_pending && _vm.fname_delay_end_time && _vm.test_json.test_type !== 'fname')?_c('FnameDelayBadge',{attrs:{\"endTime\":_vm.fname_delay_end_time}}):_vm._e(),(_vm.is_clinical_trial && _vm.step === 1)?_c('div',{staticClass:\"admin-controls-container\"},[_c('div',{staticClass:\"dropdown\"},[_c('button',{staticClass:\"btn btn-link admin-controls-btn text-muted\",attrs:{\"type\":\"button\",\"id\":\"adminControlsDropdown\",\"data-toggle\":\"dropdown\",\"aria-haspopup\":\"true\",\"aria-expanded\":\"false\"}},[_c('font-awesome-icon',{attrs:{\"icon\":\"fa-solid fa-circle-info\"}})],1),_c('div',{staticClass:\"dropdown-menu dropdown-menu-right\",attrs:{\"aria-labelledby\":\"adminControlsDropdown\"}},[_c('h6',{staticClass:\"dropdown-header\"},[_vm._v(_vm._s(_vm.gettext(\"Admin Controls\")))]),_c('button',{staticClass:\"dropdown-item text-danger\",on:{\"click\":_vm.confirmSkipTest}},[_c('font-awesome-icon',{staticClass:\"mr-2\",attrs:{\"icon\":\"fa-solid fa-forward\"}}),_vm._v(\" \"+_vm._s(_vm.gettext(\"Skip this test\"))+\" \")],1)])])]):_vm._e(),_c('div',{staticClass:\"app-container px-0 pb-lg-3 pb-sm-0 mx-sm-0 mx-lg-auto my-lg-3 my-sm-0\"},[(_vm.test_loading)?[_c('h1',{staticClass:\"mb-3\"},[_vm._v(_vm._s(_vm.gettext(\"Loading...\")))]),_c('LoadingSpinner',{attrs:{\"size\":\"2x\"}})]:[(_vm.show_header)?_c('div',{class:_vm.end_text_class !== '' && _vm.step !== 0 ? `${_vm.end_text_class} app-header` : 'app-header'},[_c('h4',[_vm._v(_vm._s(_vm.gettext(\"Multicultural Alzheimer's Prevention Program\")))])]):_vm._e(),(_vm.endpoint === null)?[_c('div',{staticClass:\"p-3\"},[_c('h5',{staticClass:\"text-left\"},[_vm._v(_vm._s(_vm.gettext(\"The MAPP Remote tests were authored by Yakeel T. Quiroz PhD, Clara Vila - Castelar PhD, Ana Baena MA, Joshua Fox - Fuller PhD, Paula Aduen PhD, and Averi Giudicessi MA © Multicultural Alzheimer’s Prevention Program, Massachusetts General Hospital, 2020\")))]),_c('div',{staticClass:\"my-2\"},[(_vm.production_env)?_c('div',[_vm._m(0),_vm._m(1),_vm._m(2)]):_c('div',[_vm._m(3),_vm._m(4),_vm._m(5)])])])]:[(_vm.step === 0)?[_c('UserInformation',{attrs:{\"base_url\":_vm.base_url,\"endpoint_version\":_vm.endpoint_version,\"ask_country\":_vm.test_json.ask_country,\"ask_ethnicity\":_vm.test_json.ask_ethnicity,\"is_clinical_trial\":_vm.is_clinical_trial,\"available_tests\":_vm.test_json.available_tests,\"clinical_trial_slug\":_vm.test_name,\"skip_test_number\":_vm.skip_test_number},on:{\"submission\":_vm.userInfo}})]:(_vm.step === 1)?[(_vm.test_type === 'r')?[_c('RoomDriver',{attrs:{\"json_data\":_vm.test_json},on:{\"submission\":_vm.handleSubmission,\"complete\":_vm.driverComplete}})]:(_vm.test_type === 's')?[_c('SeriesDriver',{attrs:{\"json_data\":_vm.test_json},on:{\"submission\":_vm.handleSubmission,\"complete\":_vm.driverComplete}})]:(_vm.test_type === 'f')?[_c('FNameDriver',{attrs:{\"json_data\":_vm.test_json,\"is_mobile\":_vm.is_mobile,\"participant_id\":_vm.participant_id},on:{\"submission\":_vm.handleSubmission,\"complete\":_vm.driverComplete}})]:(_vm.test_type === 'clinical')?[(_vm.display_interim_screen)?[(_vm.interim_screen_step === 0)?[_c('BasicInstructions',{attrs:{\"instruction_text\":_vm.gettext('Please pass the tablet back to the administrator.')},on:{\"next\":_vm.incrementInterimScreenStep}})]:(_vm.interim_screen_step === 1)?[_c('div',{staticClass:\"p-2\"},[_c('h1',[_vm._v(_vm._s(_vm.gettext(\"Result Breakdown\")))]),_c('div',[(_vm.interim_screen_data)?_vm._l((_vm.interim_screen_data),function(data){return _c('div',{key:data.label},[_c('h2',[_vm._v(_vm._s(data.label))]),_c('p',[_vm._v(_vm._s(_vm.gettext(\"Correct\"))+\": \"+_vm._s(data.correct)+\"/\"+_vm._s(data.total))]),_c('p',[_vm._v(_vm._s(_vm.gettext(\"Skipped\"))+\": \"+_vm._s(data.skipped))])])}):_vm._e(),_c('div',{staticClass:\"form-group text-left mt-3\"},[_c('label',{attrs:{\"for\":\"comments\"}},[_vm._v(_vm._s(_vm.gettext(\"Comments\")))]),_c('textarea',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.comments),expression:\"comments\"}],staticClass:\"form-control w-100\",attrs:{\"id\":\"comments\",\"rows\":\"3\"},domProps:{\"value\":(_vm.comments)},on:{\"input\":function($event){if($event.target.composing)return;_vm.comments=$event.target.value}}})]),_c('RightAlignButton',{attrs:{\"button_text\":\"Continue\",\"click_callback\":_vm.incrementInterimScreenStep}})],2)])]:(_vm.interim_screen_step === 2)?[_c('BasicInstructions',{attrs:{\"instruction_text\":_vm.gettext('Press OK to start the next test.')},on:{\"next\":_vm.hideInterimScreen}})]:_vm._e()]:(_vm.test_json.test_type === 'room')?[_c('RoomDriver',{attrs:{\"json_data\":_vm.test_json},on:{\"submission\":_vm.handleSubmission,\"complete\":_vm.clinicalTestComplete}})]:(_vm.test_json.test_type === 'series')?[_c('SeriesDriver',{attrs:{\"json_data\":_vm.test_json},on:{\"submission\":_vm.handleSubmission,\"complete\":_vm.clinicalTestComplete}})]:(_vm.test_json.test_type === 'fname')?[_c('FNameDriver',{attrs:{\"json_data\":_vm.test_json,\"allow_defer\":!_vm.last_test,\"is_mobile\":_vm.is_mobile,\"participant_id\":_vm.participant_id},on:{\"submission\":_vm.handleSubmission,\"complete\":_vm.clinicalTestComplete,\"defer\":_vm.deferFnameDelayed}})]:_vm._e()]:[_c('h1',{staticClass:\"text-align-center\"},[_vm._v(_vm._s(_vm.gettext(\"Could not find this type of test, please contact a MAPP administrator\")))])]]:(_vm.step === 2)?[_c('div',{staticClass:\"my-4\"},[(!_vm.can_close)?[_c('LoadingSpinner')]:[_c('p',{class:_vm.end_text_class},[_vm._v(_vm._s(_vm.gettext(this.end_message)))]),_c('p',{class:_vm.end_text_class},[_vm._v(_vm._s(_vm.gettext(\"Your results have been recorded! You may now close this window.\")))]),_c('p',{class:_vm.end_text_class},[_vm._v(_vm._s(_vm.gettext(\"Please hand the tablet back over to the tester.\" )))]),_c('a',{staticClass:\"btn btn-primary\",attrs:{\"href\":_vm.home_redirect}},[_vm._v(_vm._s(_vm.gettext(\"Home\")))])]],2)]:_vm._e()]]],2)],1)\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('div',[_c('a',{staticClass:\"btn btn-primary my-1\",attrs:{\"href\":\"https://www.mappremote.com/clinical/mapp/\"}},[_vm._v(\"Start From Beginning\")])])\n},function (){var _vm=this,_c=_vm._self._c;return _c('div',[_c('a',{staticClass:\"btn btn-primary my-1\",attrs:{\"href\":\"https://www.mappremote.com/clinical/mapp/?skip=1\"}},[_vm._v(\"Start From Test 2\")])])\n},function (){var _vm=this,_c=_vm._self._c;return _c('div',[_c('a',{staticClass:\"btn btn-primary my-1\",attrs:{\"href\":\"https://www.mappremote.com/clinical/mapp/?skip=2\"}},[_vm._v(\"Start From Test 3\")])])\n},function (){var _vm=this,_c=_vm._self._c;return _c('div',[_c('a',{staticClass:\"btn btn-primary my-1\",attrs:{\"href\":\"https://dev.mappremote.com/clinical/mapp/\"}},[_vm._v(\"Start From Beginning\")])])\n},function (){var _vm=this,_c=_vm._self._c;return _c('div',[_c('a',{staticClass:\"btn btn-primary my-1\",attrs:{\"href\":\"https://dev.mappremote.com/clinical/mapp/?skip=1\"}},[_vm._v(\"Start From Test 2\")])])\n},function (){var _vm=this,_c=_vm._self._c;return _c('div',[_c('a',{staticClass:\"btn btn-primary my-1\",attrs:{\"href\":\"https://dev.mappremote.com/clinical/mapp/?skip=2\"}},[_vm._v(\"Start From Test 3\")])])\n}]\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"p-3\"},[(_vm.step === 0)?[_c('RoomPractice',{attrs:{\"displayDuration\":_vm.display_duration},on:{\"complete\":_vm.incrementStep}})]:(_vm.step === 1)?[_c('MemoryPhase',{attrs:{\"json_data\":_vm.memory_json_data,\"display_duration\":_vm.display_duration,\"start_from_question_num\":_vm.question_num},on:{\"submission\":_vm.memorySubmission,\"complete\":_vm.memoryComplete}})]:(_vm.step === 2)?[_c('BasicInstructions',{attrs:{\"instruction_text\":_vm.gettext('Press OK to start the next question.')},on:{\"next\":_vm.incrementStep}})]:(_vm.step === 3)?[_c('DelayedPhase',{attrs:{\"json_data\":_vm.delayed_json_data,\"start_from_question_num\":_vm.question_num},on:{\"submission\":_vm.delayedSub,\"complete\":_vm.incrementStep}})]:_vm._e()],2)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"container align-content-center\"},[(!_vm.display_bottom_button)?[_c('RightAlignButton',{attrs:{\"button_text\":'OK',\"click_callback\":_vm.button_click}})]:_vm._e(),(_vm.title_text)?_c('h2',[_vm._v(_vm._s(_vm.gettext(_vm.title_text)))]):_vm._e(),_c('div',{class:(!_vm.second_text && ! _vm.mobile_text && !_vm.mobile_text_special && !_vm.bold_text) ? 'my-lg-3 my-sm-1 d-flex pl-sm-2 pl-lg-0' : 'my-lg-3 my-sm-1 pl-sm-2 pl-lg-0'},[_c('p',{class:_vm.left_text ? 'text-left mx-auto px-lg-0 max-width-850': 'max-width-850 mx-auto'},[_vm._v(_vm._s(_vm.gettext(_vm.instruction_text)))]),(_vm.second_text)?_c('p',{class:_vm.left_text ? 'text-left mx-auto max-width-850': 'mx-auto max-width-850'},[_vm._v(_vm._s(_vm.gettext(_vm.second_text)))]):_vm._e(),(_vm.third_text)?_c('p',{class:_vm.left_text ? 'text-left mx-auto max-width-850': 'mx-auto max-width-850'},[_vm._v(_vm._s(_vm.gettext(_vm.third_text)))]):_vm._e(),(_vm.mobile_text)?_c('p',{class:_vm.left_text ? 'mx-auto d-sm-block d-lg-none text-left max-width-850': 'mx-auto d-sm-block d-lg-none max-width-850'},[_vm._v(_vm._s(_vm.gettext(_vm.mobile_text)))]):_vm._e(),(_vm.mobile_text_special)?_c('p',{class:_vm.left_text ? 'mx-auto d-sm-block d-lg-none text-left max-width-850' : 'mx-auto d-sm-block d-lg-none max-width-850'},[_c('strong',[_c('u',[_vm._v(_vm._s(_vm.gettext(_vm.mobile_text_special)))])])]):_vm._e(),(_vm.bold_text)?_c('p',{class:_vm.left_text ? `${_vm.bold_text_class} mx-auto text-left max-width-850` : `${_vm.bold_text_class} mx-auto max-width-850`},[_c('strong',[_vm._v(_vm._s(_vm.gettext(_vm.bold_text)))])]):_vm._e()]),(_vm.display_bottom_button)?[_c('RightAlignButton',{attrs:{\"button_text\":_vm.bottom_button_text,\"click_callback\":_vm.button_click}})]:_vm._e()],2)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"d-flex justify-content-end my-lg-2 my-sm-1\"},[_c('button',{staticClass:\"btn btn-lg btn-primary\",on:{\"click\":_vm.click_callback}},[_vm._v(_vm._s(_vm.gettext(_vm.button_text)))])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n    <div class=\"d-flex justify-content-end my-lg-2 my-sm-1\">\n        <button class=\"btn btn-lg btn-primary\" v-on:click=\"click_callback\">{{ gettext(button_text) }}</button>\n    </div>\n</template>\n\n<script>\n    export default {\n        name: \"RightAlignButton\",\n        props: [\"click_callback\", \"button_text\"],\n    }\n</script>\n\n<style scoped>\n\n</style>","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./RightAlignButton.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./RightAlignButton.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./RightAlignButton.vue?vue&type=template&id=db73b92a&scoped=true\"\nimport script from \"./RightAlignButton.vue?vue&type=script&lang=js\"\nexport * from \"./RightAlignButton.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"db73b92a\",\n  null\n  \n)\n\nexport default component.exports","<template>\n    <div class=\"container align-content-center\">\n      <template v-if=\"!display_bottom_button\">\n          <RightAlignButton :button_text=\"'OK'\" :click_callback=\"button_click\"></RightAlignButton>\n      </template>\n        <h2 v-if=\"title_text\">{{gettext(title_text)}}</h2>\n\n        <div :class=\"(!second_text && ! mobile_text && !mobile_text_special && !bold_text) ? 'my-lg-3 my-sm-1 d-flex pl-sm-2 pl-lg-0' : 'my-lg-3 my-sm-1 pl-sm-2 pl-lg-0'\">\n            <p :class=\"left_text ? 'text-left mx-auto px-lg-0 max-width-850': 'max-width-850 mx-auto'\">{{ gettext(instruction_text) }}</p>\n            <p v-if=\"second_text\" :class=\"left_text ? 'text-left mx-auto max-width-850': 'mx-auto max-width-850'\">{{ gettext(second_text) }}</p>\n            <p v-if=\"third_text\" :class=\"left_text ? 'text-left mx-auto max-width-850': 'mx-auto max-width-850'\">{{ gettext(third_text) }}</p>\n            <p v-if=\"mobile_text\" :class=\"left_text ? 'mx-auto d-sm-block d-lg-none text-left max-width-850': 'mx-auto d-sm-block d-lg-none max-width-850'\">{{ gettext(mobile_text) }}</p>\n            <p v-if=\"mobile_text_special\" :class=\"left_text ? 'mx-auto d-sm-block d-lg-none text-left max-width-850' : 'mx-auto d-sm-block d-lg-none max-width-850'\"><strong><u>{{ gettext(mobile_text_special) }}</u></strong></p>\n            <p v-if=\"bold_text\" :class=\"left_text ? `${bold_text_class} mx-auto text-left max-width-850` : `${bold_text_class} mx-auto max-width-850`\"><strong>{{ gettext(bold_text) }}</strong></p>\n        </div>\n        <template v-if=\"display_bottom_button\">\n          <RightAlignButton :button_text=\"bottom_button_text\" :click_callback=\"button_click\"></RightAlignButton>\n        </template>\n    </div>\n</template>\n\n<script>\n    import RightAlignButton from \"./RightAlignButton\";\n    export default {\n        components: {RightAlignButton},\n        props: {\n            instruction_text: String,\n            bold_text: String,\n            mobile_text: String,\n            mobile_text_special: String,\n            title_text: String,\n            display_bottom_button: Boolean,\n            left_text: Boolean,\n            second_text: String,\n            third_text: String,\n            // Value here will be set in gettext() from RightAlignButton\n            bottom_button_text: {\n              type: String,\n              default: \"OK\"\n            },\n            bold_text_class: {\n              type: String,\n              default: \"text-red\"\n            }\n        },\n        methods: {\n            button_click: function() {\n                this.$emit('next');\n            },\n        }\n    }\n</script>\n\n<style scoped>\n.max-width-750 {\n    max-width: 750px;\n}\n.max-width-850 {\n  max-width: 850px;\n}\n\n.text-red{\n    color: darkred;\n}\n</style>","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./BasicInstructions.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./BasicInstructions.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./BasicInstructions.vue?vue&type=template&id=59834cd4&scoped=true\"\nimport script from \"./BasicInstructions.vue?vue&type=script&lang=js\"\nexport * from \"./BasicInstructions.vue?vue&type=script&lang=js\"\nimport style0 from \"./BasicInstructions.vue?vue&type=style&index=0&id=59834cd4&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"59834cd4\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[(_vm.step === 0)?[_c('DelayedQuestion',{key:_vm.question_num,attrs:{\"question_obj\":_vm.json_data[_vm.question_num]},on:{\"submission\":_vm.questionSub}})]:_vm._e()],2)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[(_vm.step !== 4)?[_c('p',{staticClass:\"max-width-750 mx-auto d-non d-sm-block d-lg-none\"},[_c('strong',[_c('u',[_vm._v(_vm._s(_vm.gettext(\"Make sure you scroll down to see all question options!\")))])])])]:_vm._e(),(_vm.step === 0)?[_c('ImageSelectionList',{attrs:{\"question_list\":_vm.question_obj.stimuli[_vm.question_num],\"question_text\":_vm.gettext('In which room did you see this object?'),\"button_text\":'OK',\"question_img\":_vm.question_obj.target_image,\"question_background_color\":_vm.question_obj.target_image_background_color,\"item_classname\":'img-stimuli-delayed-phase img-stimuli-fill',\"has_background\":false},on:{\"submission\":_vm.selectionSub}})]:(_vm.step === 1 && !_vm.display_skip)?[_c('RoomMetaMemory',{attrs:{\"object_img_url\":_vm.question_obj.target_image,\"object_img_background_color\":_vm.question_obj.target_image_background_color},on:{\"submission\":_vm.metaMemorySub}})]:(_vm.step === 2 && !_vm.display_skip)?[_c('RoomConfidence',{attrs:{\"num_choices\":5},on:{\"submission\":_vm.confidenceSub}})]:(_vm.step === 3)?[_c('RightAlignButton',{attrs:{\"button_text\":_vm.gettext('OK'),\"click_callback\":_vm.incrementStep}}),_c('div',{staticClass:\"justify-content-center text-center\"},[_c('p',{staticClass:\"my-2\"},[_vm._v(_vm._s(_vm.gettext(\"Where was this object located?\")))]),_c('div',[_c('BasicStimuliImage',{staticClass:\"my-2\",attrs:{\"background_color\":_vm.question_obj.target_image_background_color,\"image_url\":_vm.question_obj.target_image}})],1),_c('p',{staticClass:\"my-2\"},[_vm._v(_vm._s(_vm.gettext(\"Tap OK, and then tap where the object was located in the room\")))])])]:(_vm.step === 4 && !_vm.display_skip)?[_c('ImagePlacement',{attrs:{\"after_image_url\":_vm.selected_room.url,\"place_image_url\":_vm.question_obj.target_image,\"place_image_width\":_vm.question_obj.target_image_width,\"target_coords\":_vm.target_coords},on:{\"getcoords\":_vm.getCoords,\"submission\":_vm.placementSub}})]:_vm._e(),(_vm.display_skip)?[_c('BasicInstructions',{attrs:{\"instruction_text\":_vm.gettext('The question was not answered within the allowed time, please press continue to move to the next question.'),\"display_bottom_button\":true,\"bottom_button_text\":\"Continue\",\"left_text\":true},on:{\"next\":_vm.handleQuestionSkip}})]:_vm._e(),(_vm.step !== 0 && _vm.step !== 3)?[_c('QuestionTimer',{key:`timer-${_vm.question_obj}-${_vm.step}`,ref:\"questionTimer\",attrs:{\"timeSeconds\":10},on:{\"timeout\":_vm.handleTimeout}})]:_vm._e()],2)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[_c('RightAlignButton',{attrs:{\"button_text\":'OK',\"click_callback\":_vm.submission}}),_c('BasicError',{attrs:{\"error\":_vm.error,\"error_msg\":_vm.error_msg}}),_c('div',{staticClass:\"canvas-container my-2\",attrs:{\"id\":\"canvas-container\"}},[_c('canvas',{attrs:{\"id\":\"canvas\"},on:{\"mousedown\":_vm.canvasMouseDown,\"mouseup\":_vm.canvasMouseUp,\"mousemove\":_vm.canvasMouseMove}})])],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","export default {\n    data: function () {\n        return {\n            time_start: 0,\n            time_end: 0,\n        }\n    },\n\n    mounted: function() {\n        this.recordStartTime();\n    },\n\n    methods: {\n        recordStartTime: function(event) {\n                // We can get more precision by using performance.now() but that costs performance (roughly 50% slower)\n                this.time_start = Date.now()\n            },\n\n            recordEndTime: function(event) {\n                this.time_end = Date.now()\n            },\n\n            getTimeDiff: function(event) {\n                let value = this.time_end - this.time_start;\n                // If time_end is < time_start, return 0 as the process was not completed or system clock was changed\n                return value > 0 ? value: 0;\n            },\n\n    }//End Methods\n}//End export\n\n","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"error-text\",style:(_vm.error ? 'display:block' : 'display:none')},[(_vm.error)?[_vm._v(\" \"+_vm._s(_vm.gettext(_vm.error_msg))+\" \")]:_vm._e()],2)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n    <div class=\"error-text\" :style=\"error ? 'display:block' : 'display:none' \">\n        <template v-if=\"error\">\n        {{ gettext(error_msg) }}\n        </template>\n    </div>\n</template>\n\n<script>\n    export default {\n        name: \"BasicError\",\n        props: [\"error\", \"error_msg\"],\n        data: function() {\n            return {\n\n            }\n        }\n    }\n</script>\n\n<style scoped>\n.error-text {\n    color: #dc3545;\n    width: 100%;\n    margin-top: .25rem;\n\n}\n</style>","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./BasicError.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./BasicError.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./BasicError.vue?vue&type=template&id=b9bb69c4&scoped=true\"\nimport script from \"./BasicError.vue?vue&type=script&lang=js\"\nexport * from \"./BasicError.vue?vue&type=script&lang=js\"\nimport style0 from \"./BasicError.vue?vue&type=style&index=0&id=b9bb69c4&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"b9bb69c4\",\n  null\n  \n)\n\nexport default component.exports","<template>\n    <div>\n        <RightAlignButton :button_text=\"'OK'\" :click_callback=\"submission\"></RightAlignButton>\n        <BasicError :error=\"error\" :error_msg=\"error_msg\"></BasicError>\n        <div class=\"canvas-container my-2\" id=\"canvas-container\">\n            <canvas id=\"canvas\" v-on:mousedown=\"canvasMouseDown\" v-on:mouseup=\"canvasMouseUp\" v-on:mousemove=\"canvasMouseMove\"></canvas>\n        </div>\n    </div>\n</template>\n\n<script>\n    import RightAlignButton from \"./RightAlignButton\";\n    import timing from \"../timing\";\n    import BasicError from \"./BasicError\";\n\n    export default {\n        name: \"ImagePlacement\",\n        mixins: [timing],\n        components: {BasicError, RightAlignButton},\n        props: {\n            after_image_url: {\n                type: String,\n                required: true,\n            },\n            place_image_url: {\n                type: String,\n                required: true,\n            },\n            place_image_width: {\n                type: Number,\n                required: true,\n            },\n            display_correct: {\n                type: Boolean,\n                required: false,\n                default: false,\n            },\n            target_coords: {\n                type: Object,\n                required: true\n            }\n        },\n        data: function() {\n            return {\n                time_start: 0,\n                time_end: 0,\n                place_x_coord: -1,\n                place_y_coord: -1,\n                placement_timing: 0,\n                submission_timing: 0,\n                error: false,\n                error_msg: \"\",\n                placed_correct: null,\n                placement_distance: -1,\n                max_ratio: 0,\n                image_ratio: 0,\n                scale_up: 1,\n                scale_down: 1,\n                mouse_hold: false,\n            }\n        },\n        mounted: function() {\n            this.$nextTick(function() {\n                this.drawCanvas();\n                this.recordStartTime();\n            })\n\n        },\n\n        methods: {\n            submission: function(event) {\n                // Verify the user placed the image at least once.\n                if(this.placement_timing > 0) {\n                    this.recordEndTime();\n                    this.submission_timing = this.getTimeDiff()-this.placement_timing;\n                    this.checkPlacement();\n                    this.$emit(\"submission\", this.submission_timing, this.placed_correct, this.placement_distance);\n                }\n                else {\n                    this.error = true;\n                    // Add gettext here so that it is recognized when running makemessages\n                    this.error_msg = this.gettext(\"Please click where you believe the object was located\");\n                }\n            },\n\n            drawCanvas: function(event, x=-1, y=-1) {\n                let canv = document.getElementById('canvas');\n                let ctx = canv.getContext('2d');\n                // Format an object of image sources for preloading (ensure draw order consistency)\n                let sources = {back_img: this.after_image_url, target_img: this.place_image_url};\n                this.loadImages(sources, (images) => {\n                    // Safari not reading clientWidth properly unless canvas exceeds size of container on smaller screens\n                    // Set the canvas-width/height to be large initially so we can overwrite it correctly later\n                    canv.height = 2000;\n                    canv.width= 2000;\n                    // Set the canvas height and width to be the background image height/width\n                    let docWidth = document.getElementById('canvas-container').clientWidth;\n                    let docHeight = document.getElementById('canvas-container').clientHeight;\n                    this.max_ratio = docWidth / docHeight;\n                    this.image_ratio = images.back_img.width / images.back_img.height;\n                    canv.height = docWidth < images.back_img.width ? (docWidth / this.image_ratio) : images.back_img.height;\n                    canv.width = docWidth < images.back_img.width ? docWidth : images.back_img.width;\n                    this.scale_up = images.back_img.width / canv.width;\n                    this.scale_down = canv.width / images.back_img.width;\n                    // draw the background image first\n                    ctx.drawImage(images.back_img, 0, 0, canv.width, canv.height);\n\n                    // If we have an x and y coordinate that are > 0, draw the target_img\n                    if(x >=0 && y >=0) {\n                        let place_ratio = images.target_img.width / images.target_img.height;\n                        let target_width = this.place_image_width * this.scale_down;\n                        let target_height = Math.floor(this.place_image_width / place_ratio) * this.scale_down;\n                        ctx.drawImage(images.target_img,x-(target_width/2), y-(target_height/2), target_width, target_height);\n                    }\n\n                    if(this.display_correct) {\n                        this.drawCircle(this.target_coords.target_x * this.scale_down, this.target_coords.target_y * this.scale_down, this.target_coords.correct_radius * this.scale_down);\n                    }\n\n                });\n            },\n\n            updateCanvas: function(event) {\n                this.recordEndTime();\n                let canv = document.getElementById('canvas');\n                let rect = canv.getBoundingClientRect();\n                this.error = false;\n                this.placement_timing = this.getTimeDiff();\n                this.place_x_coord = event.clientX - rect.left;\n                this.place_y_coord = event.clientY - rect.top;\n                this.drawCanvas(event, this.place_x_coord, this.place_y_coord);\n                this.$emit('getcoords', Math.floor(this.place_x_coord * this.scale_up), Math.floor(this.place_y_coord * this.scale_up), this.placement_timing)\n            },\n\n            canvasMouseDown: function(event) {\n                this.updateCanvas(event);\n                this.mouse_hold = true;\n            },\n\n            canvasMouseUp: function(event) {\n                if(this.mouse_hold === true) {\n                    this.updateCanvas(event)\n                    this.mouse_hold = false\n                }\n            },\n\n            canvasMouseMove: function(event) {\n                if(this.mouse_hold === true) {\n                    this.updateCanvas(event)\n                }\n            },\n\n            drawCircle: function(x, y, radius) {\n                let canv = document.getElementById('canvas');\n                let ctx = canv.getContext('2d');\n                ctx.beginPath();\n                ctx.arc(x,y,radius,0, 2 * Math.PI);\n                ctx.lineWidth = 1;\n                ctx.strokeStyle = 'rgb(7,252,3)';\n                ctx.stroke();\n            },\n\n            checkPlacement: function() {\n                let distanceX = Math.pow((Math.floor(this.place_x_coord * this.scale_up) - this.target_coords.target_x), 2);\n                let distanceY = Math.pow((Math.floor(this.place_y_coord * this.scale_up) - this.target_coords.target_y), 2);\n                let distanceSquared = distanceX + distanceY;\n                let radiusSquared = Math.pow(this.target_coords.correct_radius, 2);\n                // https://math.stackexchange.com/questions/198764/how-to-know-if-a-point-is-inside-a-circle#:~:text=If%20you%20have%20the%20equation,lies%20outside%20of%20the%20circle.\n                // If d^2 > r^2 then point is outside circle\n                // if d^2 < r^2 then point is inside circle\n                // if d^2 == r^2 then point is on circle\n                // For this case we will say that being on the circle is correct\n                this.placed_correct = (distanceSquared <= radiusSquared);\n                // Round distance to two decimal places.\n                this.placement_distance = Math.round((Math.sqrt(distanceSquared) + Number.EPSILON) * 100) / 100\n            },\n\n            loadImages: function(sources, callback) {\n                let loaded_images = {};\n                let loaded_image_cnt = 0;\n                // Get the amount of images to preload\n                let numImages = Object.keys(sources).length;\n                for(let src in sources) {\n                    // Add new images to the object\n                    loaded_images[src] = new Image();\n                    loaded_images[src].onload = function () {\n                        // When an image is finished loading, check if the count of preloaded images is >= to the number of images expected to preload\n                        if(++loaded_image_cnt >= numImages) {\n                            // Images are preloaded now, perform callback\n                            callback(loaded_images);\n                        }\n                    };\n                    // Set the source of the images after the onload as per MDN docs.\n                    loaded_images[src].src = sources[src];\n                }\n            }\n        }\n    }\n</script>\n\n<style scoped>\n\n</style>","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./ImagePlacement.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./ImagePlacement.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./ImagePlacement.vue?vue&type=template&id=a909777c&scoped=true\"\nimport script from \"./ImagePlacement.vue?vue&type=script&lang=js\"\nexport * from \"./ImagePlacement.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"a909777c\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[(!_vm.display_bottom_button)?[_c('RightAlignButton',{attrs:{\"button_text\":_vm.button_text,\"click_callback\":_vm.submission}})]:_vm._e(),_c('BasicError',{attrs:{\"error\":_vm.error,\"error_msg\":_vm.error_msg}}),_c('div',{staticClass:\"justify-content-center text-center my-2\"},[_c('p',[_vm._v(_vm._s(_vm.gettext(_vm.question_text)))]),(_vm.question_img)?_c('div',{staticClass:\"my-2\"},[_c('BasicStimuliImage',{attrs:{\"image_url\":_vm.question_img,\"background_color\":_vm.question_background_color}})],1):_vm._e()]),(_vm.loading_images)?_c('div',{attrs:{\"id\":\"loading-spinner\"}},[_c('LoadingSpinner')],1):_c('div',{staticClass:\"row justify-content-center my-2\",attrs:{\"id\":\"image-selection\"}},_vm._l((_vm.question_list),function(item,index){return _c('ImageSelectionItem',{key:index,attrs:{\"image_url\":item.url,\"image_index\":index,\"value\":_vm.selected_image,\"item_classname\":_vm.item_classname,\"has_background\":_vm.has_background,\"background_color\":_vm.has_background ? item.background_color : ''},on:{\"input\":_vm.selectionChange},model:{value:(_vm.selected_image),callback:function ($$v) {_vm.selected_image=$$v},expression:\"selected_image\"}})}),1),(_vm.display_bottom_button)?[_c('RightAlignButton',{attrs:{\"button_text\":_vm.button_text,\"click_callback\":_vm.submission}})]:_vm._e()],2)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{class:_vm.item_classname === 'img-stimuli-sm' ? 'col-sm-4' : 'col-lg-4' + ' col-md-12 justify-content-center '},[_c('label',{style:(_vm.has_background ? `background-color: ${_vm.background_color}` : ''),attrs:{\"for\":'image-selection-' + _vm.image_index}},[_c('input',{staticClass:\"d-none\",attrs:{\"type\":\"radio\",\"id\":'image-selection-' + _vm.image_index,\"name\":\"selected_image\"},domProps:{\"value\":_vm.image_index,\"checked\":_vm.value === _vm.image_index},on:{\"input\":function($event){return _vm.$emit('input', _vm.image_index)}}}),_c('BasicStimuliImage',{attrs:{\"image_url\":_vm.image_url,\"custom_classname\":_vm.item_classname}})],1)])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{class:_vm.custom_classname ? _vm.custom_classname: 'img-stimuli',style:(_vm.style_string)})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n    <div :class=\"custom_classname ? custom_classname: 'img-stimuli'\" :style=\"style_string\"></div>\n</template>\n\n<script>\n    export default {\n        name: \"BasicStimuliImage\",\n        props: [\"image_url\", \"custom_classname\", \"background_color\"],\n        data: function() {\n            return {\n              style_string:`background-image:url(${this.image_url}); `\n            }\n        },\n        mounted: function() {\n            if(this.background_color !== undefined) {\n              this.style_string += `background-color: ${this.background_color}`\n            }\n        }\n    }\n</script>\n\n<style scoped>\n    .img-stimuli {\n        margin: auto;\n        width: 300px;\n        height: 300px;\n        background-size: 300px 300px;\n        background-repeat: no-repeat;\n    }\n    .img-stimuli-4-3 {\n        margin: auto;\n        width: 300px;\n        height:225px;\n        background-size: 300px 225px;\n        background-repeat: no-repeat;\n    }\n\n    .img-stimuli-delayed-phase {\n        margin: auto;\n        width: 540px;\n        height: 360px;\n        background-size: 540px 360px;\n        background-repeat: no-repeat;\n    }\n\n    .img-stimuli-sm {\n      margin: auto;\n      width: 150px;\n      height: 150px;\n      background-size: 150px 150px;\n      background-repeat: no-repeat;\n    }\n\n    .img-stimuli-fill {\n      margin: auto;\n      width: 100%;\n      height: 300px;\n      max-width: 100%;\n      /* WebKit (iPad/Safari) collapses the % widths to 0 because the parent label shrink-wraps its content */\n      min-width: 300px;\n      aspect-ratio: 1 / 1;\n      background-size: cover;\n      background-repeat: no-repeat;\n      background-position: center;\n    }\n</style>","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./BasicStimuliImage.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./BasicStimuliImage.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./BasicStimuliImage.vue?vue&type=template&id=5baa793d&scoped=true\"\nimport script from \"./BasicStimuliImage.vue?vue&type=script&lang=js\"\nexport * from \"./BasicStimuliImage.vue?vue&type=script&lang=js\"\nimport style0 from \"./BasicStimuliImage.vue?vue&type=style&index=0&id=5baa793d&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"5baa793d\",\n  null\n  \n)\n\nexport default component.exports","<template>\n    <div :class=\"item_classname === 'img-stimuli-sm' ? 'col-sm-4' : 'col-lg-4' + ' col-md-12 justify-content-center '\">\n        <label v-bind:for=\"'image-selection-' + image_index\" :style=\"has_background ? `background-color: ${background_color}` : ''\">\n            <input class=\"d-none\" type=\"radio\" :id=\"'image-selection-' + image_index\" name=\"selected_image\" :value=\"image_index\" :checked=\"value === image_index\" v-on:input=\"$emit('input', image_index)\">\n            <BasicStimuliImage :image_url=\"image_url\" :custom_classname=\"item_classname\"></BasicStimuliImage>\n        </label>\n\n    </div>\n</template>\n\n<script>\n    import BasicStimuliImage from \"./BasicStimuliImage\";\n    export default {\n        name: \"ImageSelectionItem\",\n        components: {BasicStimuliImage},\n        // Our input returns the value of 'image_index' prop to the parent\n        // The radio is checked when the prop value ('value') matches its 'image_index'\n        // We bind the 'value' prop in the parent to be the last item that was selected\n        // https://vuejs.org/v2/guide/forms.html#Radio-1\n        props: {\n            image_index: Number,\n            image_url: String,\n            value: Number,\n            item_classname: String,\n            has_background: Boolean,\n            background_color: String,\n        },\n    }\n</script>\n\n<style scoped>\n    label {\n        cursor: pointer;\n    }\n    input[type=\"radio\"] {\n        visibility: hidden;\n    }\n    input[type=\"radio\"]:checked+div {\n        outline: 5px solid red;\n    }\n\n</style>","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./ImageSelectionItem.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./ImageSelectionItem.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./ImageSelectionItem.vue?vue&type=template&id=02d42156&scoped=true\"\nimport script from \"./ImageSelectionItem.vue?vue&type=script&lang=js\"\nexport * from \"./ImageSelectionItem.vue?vue&type=script&lang=js\"\nimport style0 from \"./ImageSelectionItem.vue?vue&type=style&index=0&id=02d42156&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"02d42156\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('font-awesome-icon',{attrs:{\"icon\":\"fa-solid fa-spinner\",\"spin\":\"\",\"size\":_vm.size}})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n    <font-awesome-icon icon=\"fa-solid fa-spinner\" spin :size=\"size\"/>\n</template>\n\n<script>\nexport default {\n  name: 'LoadingSpinner',\n  props: {\n    size: {\n      type: String,\n      default: \"4x\"\n    }\n  }\n}\n</script>\n\n<style>\n\n</style>\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./LoadingSpinner.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./LoadingSpinner.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./LoadingSpinner.vue?vue&type=template&id=05db4d7f\"\nimport script from \"./LoadingSpinner.vue?vue&type=script&lang=js\"\nexport * from \"./LoadingSpinner.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports","<template>\n    <div>\n        <template v-if=\"!display_bottom_button\">\n          <RightAlignButton :button_text=\"button_text\" :click_callback=\"submission\"></RightAlignButton>\n        </template>\n        <BasicError :error=\"error\" :error_msg=\"error_msg\"></BasicError>\n        <div class=\"justify-content-center text-center my-2\">\n            <p>{{ gettext(question_text) }}</p>\n            <div class=\"my-2\" v-if=\"question_img\">\n                <BasicStimuliImage :image_url=\"question_img\" :background_color=\"question_background_color\"></BasicStimuliImage>\n            </div>\n        </div>\n\n        <div v-if=\"loading_images\" id=\"loading-spinner\">\n          <LoadingSpinner/>\n        </div>\n        <div v-else class=\"row justify-content-center my-2\" id=\"image-selection\">\n            <ImageSelectionItem v-for=\"(item, index) in question_list\"\n                                  v-bind:image_url=\"item.url\"\n                                  v-bind:image_index=\"index\"\n                                  v-bind:value=\"selected_image\"\n                                  v-bind:item_classname=\"item_classname\"\n                                  v-model=\"selected_image\"\n                                  :has_background=\"has_background\"\n                                  :background_color=\"has_background ? item.background_color : ''\"\n                                  v-on:input=\"selectionChange\"\n                                  v-bind:key=\"index\">\n            </ImageSelectionItem>\n        </div>\n      <template v-if=\"display_bottom_button\">\n          <RightAlignButton :button_text=\"button_text\" :click_callback=\"submission\"></RightAlignButton>\n        </template>\n    </div>\n</template>\n\n<script>\n    import RightAlignButton from \"./RightAlignButton\";\n    import ImageSelectionItem from \"./ImageSelectionItem\";\n    import BasicError from \"./BasicError\";\n\n    import timing from \"../timing\";\n    import BasicStimuliImage from \"./BasicStimuliImage\";\n    import LoadingSpinner from \"@/components/LoadingSpinner.vue\";\n\n    export default {\n        name: \"ImageSelectionList\",\n        mixins: [timing],\n        components: {LoadingSpinner, BasicStimuliImage, BasicError, RightAlignButton, ImageSelectionItem},\n        props: ['question_list', \"question_text\", \"button_text\", \"question_img\", \"item_classname\", \"display_bottom_button\", \"has_background\", \"question_background_color\"],\n        created: function() {\n          this.preloadImages()\n        },\n        mounted: function() {\n            // Start time is recorded when the images are displayed\n            // Images are displayed once all images are preloaded, with the loading_images flag (watcher)\n        },\n        data: function() {\n            return {\n                time_start: 0,\n                time_end: 0,\n                selection_time: 0,\n                submission_time: 0,\n                selected_image: null,\n                selection_count: 0,\n                error: false,\n                error_msg: \"\",\n                loading_images: true,\n                images_loaded_count: 0,\n            }\n        },\n        methods: {\n            selectionChange: function(event) {\n                this.recordEndTime();\n                this.error = false;\n                this.selection_time = this.getTimeDiff();\n                this.selection_count++;\n            },\n\n            submission: function(event) {\n                if(this.selected_image !== null) {\n                    this.recordEndTime();\n                    this.submission_time = this.getTimeDiff() - this.selection_time;\n                    // User has made a selection and is submitting, emit an event with the values to the parent.\n                    this.$emit(\"submission\", this.selected_image, this.selection_count, this.selection_time, this.submission_time)\n                }\n                else {\n                    this.error = true;\n                    this.error_msg = \"Please select one of the options below\"\n                }\n            },\n            preloadImages: function() {\n                if(this.question_list.length === 0) {\n                    this.loading_images = false\n                    return\n                }\n                // Never leave the participant stuck behind the spinner if a request stalls\n                this.loading_timeout = setTimeout(() => { this.loading_images = false }, 10000)\n                for(const question of this.question_list) {\n                    let img = new Image()\n                    // A failed image still counts as settled, otherwise one dropped request hides every option\n                    img.onload = this.imageSettled\n                    img.onerror = this.imageSettled\n                    img.src = question.url\n                }\n            },\n            imageSettled: function() {\n                this.images_loaded_count += 1\n                if(this.images_loaded_count >= this.question_list.length) {\n                    this.loading_images = false\n                }\n            }\n        },\n        beforeDestroy: function() {\n            clearTimeout(this.loading_timeout)\n        },\n        watch: {\n          loading_images: function (newVal, oldVal) {\n            if(!newVal) {\n              this.recordStartTime()\n            }\n          }\n        }\n    }\n</script>\n\n<style scoped>\n\n</style>","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./ImageSelectionList.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./ImageSelectionList.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./ImageSelectionList.vue?vue&type=template&id=6251f12c&scoped=true\"\nimport script from \"./ImageSelectionList.vue?vue&type=script&lang=js\"\nexport * from \"./ImageSelectionList.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"6251f12c\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[_c('RightAlignButton',{attrs:{\"button_text\":'OK',\"click_callback\":_vm.submission}}),_c('BasicError',{attrs:{\"error\":_vm.error,\"error_msg\":_vm.error_msg}}),_c('div',{staticClass:\"justify-content-center text-center my-2\"},[_c('p',{domProps:{\"innerHTML\":_vm._s(_vm.display_msg_do)}})]),_c('div',{staticClass:\"d-flex align-items-stretch justify-content-center my-2\"},_vm._l((_vm.num_choices),function(index){return _c('BasicCardInput',{key:index,attrs:{\"display_text\":index,\"name\":'user_memory_num',\"actual_val\":index,\"model_val\":_vm.confidence_level,\"top_text\":index === 1 ? _vm.gettext('Not Confident'): index === _vm.num_choices ? _vm.gettext('Very Confident'): ''},on:{\"updateError\":_vm.updateError},model:{value:(_vm.confidence_level),callback:function ($$v) {_vm.confidence_level=_vm._n($$v)},expression:\"confidence_level\"}})}),1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{class:(!_vm.top_text ? 'mt-auto ': '') +'flex-column mx-sm-1 mx-md-2 media-body card-input'},[(_vm.top_text)?_c('p',{staticClass:\"text-center confidence-text\"},[_vm._v(_vm._s(_vm.gettext(_vm.top_text)))]):_vm._e(),_c('label',{staticClass:\"w-100\",attrs:{\"for\":_vm.name + _vm.display_text}},[_c('input',{attrs:{\"type\":\"radio\",\"id\":_vm.name + _vm.display_text,\"name\":_vm.name},domProps:{\"value\":_vm.actual_val,\"checked\":_vm.model_val === _vm.actual_val},on:{\"input\":_vm.input}}),_c('div',{staticClass:\"card\"},[_c('div',{staticClass:\"card-body\"},[_c('p',{staticClass:\"card-text\"},[_vm._v(_vm._s(_vm.gettext(_vm.display_text)))])])])])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n    <div :class=\"(!top_text ? 'mt-auto ': '') +'flex-column mx-sm-1 mx-md-2 media-body card-input'\">\n        <p v-if=\"top_text\" class=\"text-center confidence-text\">{{ gettext(top_text) }}</p>\n        <label v-bind:for=\"name + display_text\" class=\"w-100\">\n            <!-- Instead of emitting $event.target.value we emit the actual_val prop. This is to handle the case where we want the value to be the actual value \"type\" and not a string -->\n            <input type=\"radio\" :id=\"name + display_text\" :value=\"actual_val\" :name=\"name\" :checked=\"model_val === actual_val\" v-on:input=\"input\">\n            <div class=\"card\">\n                <div class=\"card-body\">\n                    <p class=\"card-text\">{{ gettext(display_text) }}</p>\n                </div>\n            </div>\n        </label>\n    </div>\n</template>\n\n<script>\n    export default {\n        name: \"BasicCardInput\",\n        props: [\"display_text\", \"name\", \"actual_val\", \"model_val\", 'top_text'],\n        methods: {\n            input: function(event) {\n                this.$emit('updateError');\n                this.$emit('input', this.actual_val);\n            }\n        }\n    }\n</script>\n\n<style scoped>\n    label {\n        cursor: pointer;\n    }\n    input[type=\"radio\"] {\n        visibility: hidden;\n    }\n    input[type=\"radio\"]:checked+div {\n        outline: 3px solid red;\n        position: relative;\n        z-index: 100;\n    }\n</style>","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./BasicCardInput.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./BasicCardInput.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./BasicCardInput.vue?vue&type=template&id=0995687a&scoped=true\"\nimport script from \"./BasicCardInput.vue?vue&type=script&lang=js\"\nexport * from \"./BasicCardInput.vue?vue&type=script&lang=js\"\nimport style0 from \"./BasicCardInput.vue?vue&type=style&index=0&id=0995687a&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"0995687a\",\n  null\n  \n)\n\nexport default component.exports","<template>\n    <div>\n        <RightAlignButton :button_text=\"'OK'\" :click_callback=\"submission\"></RightAlignButton>\n        <BasicError :error=\"error\" :error_msg=\"error_msg\"></BasicError>\n        <div class=\"justify-content-center text-center my-2\">\n            <p v-html=\"display_msg_do\"></p>\n        </div>\n        <div class=\"d-flex align-items-stretch justify-content-center my-2\">\n            <BasicCardInput v-for=\"index in num_choices\" :key=\"index\"\n                            :display_text=\"index\"\n                            :name=\"'user_memory_num'\"\n                            :actual_val=\"index\"\n                            :model_val=\"confidence_level\"\n                            :top_text=\"index === 1 ? gettext('Not Confident'): index === num_choices ? gettext('Very Confident'): ''\"\n                            v-model.number=\"confidence_level\"\n                            v-on:updateError=\"updateError\">\n            </BasicCardInput>\n        </div>\n    </div>\n</template>\n\n<script>\n    import RightAlignButton from \"./RightAlignButton\";\n    import BasicCardInput from \"./BasicCardInput\";\n\n    import BasicError from \"./BasicError\";\n\n    export default {\n        name: \"RoomConfidence\",\n        components: {BasicError, BasicCardInput, RightAlignButton},\n        props: [\"num_choices\"],\n        data: function() {\n            return {\n                confidence_level: null,\n                error: false,\n                error_msg: \"\",\n                display_msg_do: this.gettext(`How confident are you that you <u><b>do</b></u> remember its location?`),\n            }\n        },\n\n        methods: {\n            updateError: function(event) {\n                this.error = false;\n            },\n\n            submission: function(event) {\n                if(this.confidence_level !== null) {\n                    this.$emit('submission', this.confidence_level);\n                }\n                else {\n                    this.error = true;\n                    // Add gettext here so that it is recognized when running makemessages\n                    this.error_msg = this.gettext(\"Please select one of the options below\");\n                }\n            }\n        }\n\n\n    }\n</script>\n\n<style scoped>\n\n</style>","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./RoomConfidence.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./RoomConfidence.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./RoomConfidence.vue?vue&type=template&id=6f3826f5&scoped=true\"\nimport script from \"./RoomConfidence.vue?vue&type=script&lang=js\"\nexport * from \"./RoomConfidence.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"6f3826f5\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[_c('RightAlignButton',{attrs:{\"button_text\":'OK',\"click_callback\":_vm.submission}}),_c('BasicError',{attrs:{\"error\":_vm.error,\"error_msg\":_vm.error_msg}}),_c('div',{staticClass:\"justify-content-center text-center my-2\"},[_c('p',[_vm._v(_vm._s(_vm.gettext(`Do you remember where this object was located?`)))]),_c('div',[_c('BasicStimuliImage',{attrs:{\"image_url\":_vm.object_img_url,\"background_color\":_vm.object_img_background_color}})],1)]),_c('div',{staticClass:\"d-flex justify-content-center my-2\"},[_c('BasicCardInput',{attrs:{\"display_text\":_vm.gettext('Yes'),\"name\":'user_memory',\"actual_val\":'yes',\"model_val\":_vm.user_memory},on:{\"updateError\":_vm.updateError},model:{value:(_vm.user_memory),callback:function ($$v) {_vm.user_memory=$$v},expression:\"user_memory\"}}),_c('BasicCardInput',{attrs:{\"display_text\":_vm.gettext('No'),\"name\":'user_memory',\"actual_val\":'no',\"model_val\":_vm.user_memory},on:{\"updateError\":_vm.updateError},model:{value:(_vm.user_memory),callback:function ($$v) {_vm.user_memory=$$v},expression:\"user_memory\"}}),_c('BasicCardInput',{attrs:{\"display_text\":_vm.gettext('Not Sure'),\"name\":'user_memory',\"actual_val\":'not_sure',\"model_val\":_vm.user_memory},on:{\"updateError\":_vm.updateError},model:{value:(_vm.user_memory),callback:function ($$v) {_vm.user_memory=$$v},expression:\"user_memory\"}})],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n    <div>\n        <RightAlignButton :button_text=\"'OK'\" :click_callback=\"submission\"></RightAlignButton>\n        <BasicError :error=\"error\" :error_msg=\"error_msg\"></BasicError>\n        <div class=\"justify-content-center text-center my-2\">\n            <p>{{ gettext(`Do you remember where this object was located?`)}}</p>\n            <div>\n                <BasicStimuliImage :image_url=\"object_img_url\" :background_color=\"object_img_background_color\"></BasicStimuliImage>\n            </div>\n        </div>\n        <div class=\"d-flex justify-content-center my-2\">\n            <BasicCardInput :display_text=\"gettext('Yes')\"\n                            :name=\"'user_memory'\"\n                            :actual_val=\"'yes'\"\n                            :model_val=\"user_memory\"\n                            v-model=\"user_memory\"\n                            v-on:updateError=\"updateError\">\n            </BasicCardInput>\n            <BasicCardInput :display_text=\"gettext('No')\"\n                            :name=\"'user_memory'\"\n                            :actual_val=\"'no'\"\n                            :model_val=\"user_memory\"\n                            v-model=\"user_memory\"\n                            v-on:updateError=\"updateError\">\n            </BasicCardInput>\n\n            <BasicCardInput :display_text=\"gettext('Not Sure')\"\n                            :name=\"'user_memory'\"\n                            :actual_val=\"'not_sure'\"\n                            :model_val=\"user_memory\"\n                            v-model=\"user_memory\"\n                            v-on:updateError=\"updateError\">\n            </BasicCardInput>\n        </div>\n    </div>\n</template>\n\n<script>\n    import RightAlignButton from \"./RightAlignButton\";\n    import BasicCardInput from \"./BasicCardInput\";\n\n    import BasicStimuliImage from \"./BasicStimuliImage\";\n    import BasicError from \"./BasicError\";\n\n    export default {\n        name: \"RoomMetaMemory\",\n        components: {BasicError, BasicStimuliImage, BasicCardInput, RightAlignButton},\n        props: [\"object_img_url\", \"object_img_background_color\"],\n        data: function() {\n            return {\n                user_memory: null,\n                error: false,\n                error_msg: \"\"\n            }\n        },\n        methods: {\n            updateError: function(event) {\n                this.error = false;\n            },\n\n            submission: function(event) {\n                if(this.user_memory !== null) {\n                    this.$emit(\"submission\", this.user_memory);\n                }\n                else {\n                    this.error = true;\n                    // Add gettext here so that it is recognized when running makemessages\n                    this.error_msg = this.gettext(\"Please select one of the options below\");\n                }\n\n            }\n        }\n    }\n</script>\n\n<style scoped>\n\n</style>","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./RoomMetaMemory.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./RoomMetaMemory.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./RoomMetaMemory.vue?vue&type=template&id=4beeb608&scoped=true\"\nimport script from \"./RoomMetaMemory.vue?vue&type=script&lang=js\"\nexport * from \"./RoomMetaMemory.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"4beeb608\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return (_vm.display_timer)?_c('div',{staticClass:\"question-timer\"},[_c('div',{staticClass:\"timer-display\",class:{ 'timer-warning': _vm.timeRemaining <= 3 }},[_vm._v(\" \"+_vm._s(_vm.timeRemaining)+\"s \")]),_c('div',{staticClass:\"progress\"},[_c('div',{staticClass:\"progress-bar\",class:{ 'bg-danger': _vm.timeRemaining <= 3 },style:(`width: ${_vm.percentRemaining}%`),attrs:{\"role\":\"progressbar\"}})])]):_vm._e()\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<!-- QuestionTimer.vue -->\n<template>\n  <div v-if=\"display_timer\" class=\"question-timer\">\n    <div class=\"timer-display\" :class=\"{ 'timer-warning': timeRemaining <= 3 }\">\n      {{ timeRemaining }}s\n    </div>\n    <div class=\"progress\">\n      <div\n        class=\"progress-bar\"\n        :class=\"{ 'bg-danger': timeRemaining <= 3 }\"\n        role=\"progressbar\"\n        :style=\"`width: ${percentRemaining}%`\"\n      ></div>\n    </div>\n  </div>\n</template>\n\n<script>\nexport default {\n  name: \"QuestionTimer\",\n  props: {\n    timeSeconds: {\n      type: Number,\n      default: 10\n    },\n    autoStart: {\n      type: Boolean,\n      default: true\n    },\n    display_timer: {\n      type: Boolean,\n      default: false,\n    }\n  },\n  data() {\n    return {\n      timeRemaining: 0,\n      intervalId: null,\n      isRunning: false\n    }\n  },\n  computed: {\n    percentRemaining() {\n      return (this.timeRemaining / this.timeSeconds) * 100\n    }\n  },\n  mounted() {\n    if (this.autoStart) {\n      this.start()\n    }\n  },\n  beforeDestroy() {\n    this.stop()\n  },\n  methods: {\n    start() {\n      this.timeRemaining = this.timeSeconds\n      this.isRunning = true\n      this.intervalId = setInterval(() => {\n        this.timeRemaining -= 0.1\n        this.timeRemaining = Math.round(this.timeRemaining * 10) / 10\n\n        if (this.timeRemaining <= 0) {\n          this.timeRemaining = 0\n          this.stop()\n          this.$emit('timeout')\n        }\n      }, 100)\n    },\n    stop() {\n      if (this.intervalId) {\n        clearInterval(this.intervalId)\n        this.intervalId = null\n      }\n      this.isRunning = false\n    },\n    reset() {\n      this.stop()\n      this.start()\n    }\n  }\n}\n</script>\n\n<style scoped>\n.question-timer {\n  margin-bottom: 1rem;\n}\n.timer-display {\n  text-align: center;\n  font-size: 1.25rem;\n  font-weight: bold;\n  margin-bottom: 0.5rem;\n}\n.timer-warning {\n  color: #dc3545;\n}\n</style>","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./QuestionTimer.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./QuestionTimer.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./QuestionTimer.vue?vue&type=template&id=dc20880c&scoped=true\"\nimport script from \"./QuestionTimer.vue?vue&type=script&lang=js\"\nexport * from \"./QuestionTimer.vue?vue&type=script&lang=js\"\nimport style0 from \"./QuestionTimer.vue?vue&type=style&index=0&id=dc20880c&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"dc20880c\",\n  null\n  \n)\n\nexport default component.exports","<template>\n    <div>\n        <template v-if=\"step !== 4\">\n            <p class=\"max-width-750 mx-auto d-non d-sm-block d-lg-none\"><strong><u>{{ gettext(\"Make sure you scroll down to see all question options!\") }}</u></strong></p>\n        </template>\n        <template v-if=\"step === 0\">\n            <ImageSelectionList :question_list=\"question_obj.stimuli[question_num]\"\n                                :question_text=\"gettext('In which room did you see this object?')\"\n                                :button_text=\"'OK'\"\n                                :question_img=\"question_obj.target_image\"\n                                :question_background_color=\"question_obj.target_image_background_color\"\n                                :item_classname=\"'img-stimuli-delayed-phase img-stimuli-fill'\"\n                                :has_background=\"false\"\n                                v-on:submission=\"selectionSub\">\n            </ImageSelectionList>\n        </template>\n\n        <template v-else-if=\"step === 1 && !display_skip\">\n            <RoomMetaMemory :object_img_url=\"question_obj.target_image\" :object_img_background_color=\"question_obj.target_image_background_color\" v-on:submission=\"metaMemorySub\"></RoomMetaMemory>\n        </template>\n\n\n        <template v-else-if=\"step === 2 && !display_skip\">\n            <RoomConfidence :num_choices=\"5\" v-on:submission=\"confidenceSub\"></RoomConfidence>\n        </template>\n        <template v-else-if=\"step === 3\">\n            <RightAlignButton :button_text=\"gettext('OK')\" :click_callback=\"incrementStep\"></RightAlignButton>\n            <div class=\"justify-content-center text-center\">\n                <p class=\"my-2\">{{ gettext(\"Where was this object located?\") }}</p>\n                <div>\n                    <BasicStimuliImage :background_color=\"question_obj.target_image_background_color\" :image_url=\"question_obj.target_image\" class=\"my-2\"></BasicStimuliImage>\n                </div>\n                <p class=\"my-2\">{{gettext(\"Tap OK, and then tap where the object was located in the room\")}}</p>\n            </div>\n        </template>\n\n        <template v-else-if=\"step === 4 && !display_skip\">\n            <ImagePlacement :after_image_url=\"selected_room.url\"\n                            :place_image_url=\"question_obj.target_image\"\n                            :place_image_width=\"question_obj.target_image_width\"\n                            :target_coords=\"target_coords\"\n                            v-on:getcoords=\"getCoords\"\n                            v-on:submission=\"placementSub\"></ImagePlacement>\n        </template>\n        <template v-if=\"display_skip\">\n            <BasicInstructions v-bind:instruction_text=\"gettext('The question was not answered within the allowed time, please press continue to move to the next question.')\"\n                               :display_bottom_button=\"true\"\n                               bottom_button_text=\"Continue\"\n                               :left_text=\"true\"\n                               @next=\"handleQuestionSkip\"\n            />\n          </template>\n          <template v-if=\"step !== 0 && step !== 3\">\n           <QuestionTimer\n                  :timeSeconds=\"10\"\n                  ref=\"questionTimer\"\n                  :key=\"`timer-${question_obj}-${step}`\"\n                  @timeout=\"handleTimeout\"\n              />\n          </template>\n\n    </div>\n    \n</template>\n\n<script>\n    import ImagePlacement from \"./ImagePlacement\";\n    import ImageSelectionList from \"./ImageSelectionList\";\n    import RoomConfidence from \"./RoomConfidence\";\n    import RoomMetaMemory from \"./RoomMetaMemory\";\n    import BasicStimuliImage from \"./BasicStimuliImage\";\n    import RightAlignButton from \"./RightAlignButton\";\n    import BasicInstructions from \"@/components/BasicInstructions.vue\";\n    import QuestionTimer from \"@/components/utils/QuestionTimer.vue\";\n    export default {\n        name: \"DelayedQuestion\",\n        components: {\n          QuestionTimer, BasicInstructions,\n            RightAlignButton,\n            BasicStimuliImage, RoomMetaMemory, RoomConfidence, ImageSelectionList, ImagePlacement},\n        props: [\"question_obj\"],\n        data: function() {\n            return {\n                step: 0,\n                question_num: 0,\n                max_questions: 0,\n                selected_room: {},\n                user_memory: null,\n                confidence_level: null,\n                placement_x_coord: -1,\n                placement_y_coord: -1,\n                placement_time: 0,\n                placement_submission_time: 0,\n                target_coords: {\n                    target_x: 0,\n                    target_y: 0,\n                    correct_radius: 50,\n                },\n                // Following the format in case there are multiple rounds per question in the future.\n                placed_correct: null,\n                placement_distance: -1,\n                placement_meta_memory: null,\n                placement_skipped: false,\n                display_skip: false,\n            }\n        },\n        mounted: function() {\n            // Currently not used but this.question_obj.stimuli is an array of arrays containing stimuli objects.\n            // The delayed phase only needs an Array of stimuli objects since it has a linear progression and not multiple image selection pieces per question\n            // This has been added in case this changes in the future.\n            this.max_questions = this.question_obj.stimuli.length;\n            this.target_coords.target_x = this.question_obj.target_x_coordinate;\n            this.target_coords.target_y = this.question_obj.target_y_coordinate;\n        },\n\n        methods: {\n            incrementStep: function(event) {\n                this.step++;\n            },\n            decrementStep: function(event) {\n                this.step--;\n            },\n            incrementRound: function(event) {\n                this.question_num++;\n                if(this.question_num >= this.max_questions) {\n                    this.step++;\n                }\n            },\n\n            selectionSub: function(room, select_count, select_time, sub_time) {\n                let currSelection = this.question_obj.stimuli[this.question_num][room];\n                currSelection.num_changed = select_count;\n                currSelection.select_time = select_time;\n                currSelection.sub_time = sub_time;\n                currSelection.total_time = select_time + sub_time;\n                this.selected_room = currSelection;\n\n                // this.incrementRound\n                this.incrementStep();\n            },\n\n            metaMemorySub(mem_select) {\n                this.user_memory = mem_select;\n                this.incrementStep();\n            },\n\n            confidenceSub: function(conf_level) {\n                this.confidence_level = conf_level;\n                this.incrementStep();\n            },\n\n            getCoords: function(x, y, place_time) {\n                this.placement_x_coord = x;\n                this.placement_y_coord = y;\n                this.placement_time = place_time;\n            },\n\n            placementSub: function(sub_time, placed_correct, placement_distance) {\n                this.placement_submission_time = sub_time;\n                // Here we say it is placed correct only if they selected the right room as well as the right location.\n                if(this.selected_room.is_correct) {\n                    this.placed_correct = placed_correct;\n                    this.placement_distance = placement_distance\n                }\n                else {\n                    this.placed_correct = false;\n                }\n                this.checkPlacementMeta();\n                this.$emit('submission', this.createResult())\n            },\n\n            checkPlacementMeta: function() {\n                // User placed the object correctly and believed they knew where it was, or User place the object incorrectly and believed to not know where it was or was unsure\n                this.placement_meta_memory = ((this.placed_correct && (this.user_memory === 'yes')) || (!this.placed_correct && (this.user_memory !== 'yes')));\n            },\n\n            createResult: function(event) {\n                return {\n                    id: this.question_obj.id,\n                    name: this.question_obj.name,\n                    delayed_selection: this.selected_room,\n                    placement: {\n                        x_coord: this.placement_x_coord,\n                        y_coord: this.placement_y_coord,\n                        is_correct: this.placed_correct,\n                        distance: this.placement_distance,\n                        meta_correct: this.placement_meta_memory,\n                        place_time: this.placement_time,\n                        sub_time: this.placement_submission_time,\n                        total_time: this.placement_time + this.placement_submission_time,\n                        placement_skipped: this.placement_skipped,\n                    }\n                }\n            },\n            handleTimeout() {\n              this.display_skip = true\n            },\n\n            handleQuestionSkip() {\n              let original_step = this.step\n              if (original_step === 1) {\n                this.user_memory = \"skipped\"\n              } else if(original_step === 2) {\n                this.confidence_level = \"skipped\"\n              } else if(original_step === 4) {\n                this.placement_meta_memory = false\n                this.placement_skipped = true\n                this.placed_correct = false\n                this.$emit(\"submission\", this.createResult());\n              }\n              else {\n                return\n              }\n              this.step = original_step + 1\n              this.display_skip = false\n            },\n        } // End Methods\n    } // End Export\n</script>\n\n<style scoped>\n\n</style>","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./DelayedQuestion.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./DelayedQuestion.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./DelayedQuestion.vue?vue&type=template&id=1e747cfe&scoped=true\"\nimport script from \"./DelayedQuestion.vue?vue&type=script&lang=js\"\nexport * from \"./DelayedQuestion.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"1e747cfe\",\n  null\n  \n)\n\nexport default component.exports","<template>\n    <div>\n        <template v-if=\"step === 0\">\n            <DelayedQuestion :question_obj=\"json_data[question_num]\"\n                             :key=\"question_num\"\n                             v-on:submission=\"questionSub\"></DelayedQuestion>\n        </template>\n\n    </div>\n</template>\n\n<script>\n    import DelayedQuestion from \"./DelayedQuestion\";\n\n    export default {\n        name: \"DelayedPhase\",\n        mixins: [],\n        components: {DelayedQuestion},\n        props: [\"json_data\", \"start_from_question_num\"],\n        data: function() {\n            return {\n                step: 0,\n                question_num: 0,\n                max_questions: 0,\n                user_responses: [],\n            }\n        },\n\n        mounted: function() {\n            this.max_questions = this.json_data.length;\n            this.preloadImages();\n            if(this.start_from_question_num) {\n              this.question_num = this.start_from_question_num;\n            }\n        },\n\n        methods: {\n            incrementStep: function(event) {\n                this.step++;\n            },\n            decrementStep: function(event) {\n                this.step--;\n            },\n            incrementRound: function(event) {\n                this.question_num++;\n                if(this.question_num >= this.max_questions) {\n                    this.step++;\n                }\n            },\n\n            preloadImages: function(event) {\n                for(let quest_obj of this.json_data) {\n                    const target_image = new Image();\n                    target_image.src = quest_obj.target_image;\n                    for(let stim_list of quest_obj.stimuli) {\n                        for(let stim of stim_list) {\n                            const image = new Image();\n                            image.src = stim.url;\n                        }\n                    }\n                }\n            },\n            questionSub: function(data) {\n                this.user_responses.push(data);\n                this.incrementRound();\n                this.$emit(\"submission\", this.createResults());\n                if(this.step === 1) {\n                    this.$emit(\"complete\");\n                }\n            },\n\n            createResults: function() {\n                return {\n                    user_responses: this.user_responses,\n                    question_num: this.question_num,\n                }\n            }\n        }\n    }\n</script>\n\n<style scoped>\n\n</style>","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./DelayedPhase.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./DelayedPhase.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./DelayedPhase.vue?vue&type=template&id=9493f1a4&scoped=true\"\nimport script from \"./DelayedPhase.vue?vue&type=script&lang=js\"\nexport * from \"./DelayedPhase.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"9493f1a4\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[(_vm.question_num < _vm.max_questions)?[(_vm.step === 0)?[_c('RoomQuestion',{key:_vm.question_num,attrs:{\"json_data\":_vm.json_data[_vm.question_num],\"display_duration\":_vm.display_duration},on:{\"submission\":_vm.nextQuestion}})]:[_c('BasicInstructions',{attrs:{\"instruction_text\":_vm.gettext('Press OK to start the next question.')},on:{\"next\":_vm.decrementStep}})]]:_vm._e()],2)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{},[(_vm.step !== 0 && _vm.step !== 5)?[_c('p',{staticClass:\"max-width-750 mx-auto d-non d-sm-block d-lg-none\"},[_c('strong',[_c('u',[_vm._v(_vm._s(_vm.gettext(\"Make sure you scroll down to see all question options!\")))])])])]:_vm._e(),(_vm.step === 0)?[_c('div',{},[_c('img',{staticClass:\"mw-100\",attrs:{\"src\":_vm.json_data.room_image_before}})])]:(_vm.step === 1 && !_vm.display_skip)?[_c('ImageSelectionList',{key:_vm.question_num,attrs:{\"question_list\":_vm.json_data.stimuli[_vm.question_num],\"question_text\":_vm.gettext('Which object did you see?'),\"button_text\":_vm.gettext('OK'),\"has_background\":true},on:{\"submission\":_vm.selectionSub}})]:(_vm.step === 2 && !_vm.display_skip)?[_c('RoomMetaMemory',{attrs:{\"object_img_url\":_vm.json_data.target_image,\"object_img_background_color\":_vm.json_data.target_image_background_color},on:{\"submission\":_vm.metaMemorySub}})]:(_vm.step === 3 && !_vm.display_skip)?[_c('RoomConfidence',{attrs:{\"num_choices\":5},on:{\"submission\":_vm.confidenceSub}})]:(_vm.step === 4 && !_vm.display_skip)?[_c('RightAlignButton',{attrs:{\"button_text\":_vm.gettext('OK'),\"click_callback\":_vm.incrementStep}}),_c('div',{staticClass:\"justify-content-center text-center\"},[_c('p',{staticClass:\"my-2\"},[_vm._v(_vm._s(_vm.gettext(\"Where was this object located?\")))]),_c('div',[_c('BasicStimuliImage',{staticClass:\"my-2\",attrs:{\"background_color\":_vm.json_data.target_image_background_color,\"image_url\":_vm.json_data.target_image}})],1),_c('p',{staticClass:\"my-2\"},[_vm._v(_vm._s(_vm.gettext(\"Tap OK, and then tap where the object was located in the room\")))])])]:(_vm.step === 5 && !_vm.display_skip)?[_c('ImagePlacement',{attrs:{\"after_image_url\":_vm.json_data.room_image_after,\"place_image_url\":_vm.json_data.target_image,\"place_image_width\":_vm.json_data.target_image_width,\"target_coords\":_vm.target_coords},on:{\"getcoords\":_vm.getCoords,\"submission\":_vm.placementSub}})]:_vm._e(),(_vm.display_skip)?[_c('BasicInstructions',{attrs:{\"instruction_text\":_vm.gettext('The question was not answered within the allowed time, please press continue to move to the next question.'),\"display_bottom_button\":true,\"bottom_button_text\":\"Continue\",\"left_text\":true},on:{\"next\":_vm.handleQuestionSkip}})]:_vm._e(),(_vm.step !== 0 && _vm.step !== 4)?[_c('QuestionTimer',{key:`timer-${_vm.json_data}-${_vm.step}-${_vm.question_num}`,ref:\"questionTimer\",attrs:{\"timeSeconds\":10},on:{\"timeout\":_vm.handleTimeout}})]:_vm._e()],2)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n    <div class=\"\">\n        <template v-if=\"step !== 0 && step !== 5\">\n            <p class=\"max-width-750 mx-auto d-non d-sm-block d-lg-none\"><strong><u>{{ gettext(\"Make sure you scroll down to see all question options!\") }}</u></strong></p>\n        </template>\n        <template v-if=\"step === 0\">\n            <div class=\"\">\n                <img class=\"mw-100\" :src=\"json_data.room_image_before\">\n            </div>\n        </template>\n\n        <template v-else-if=\"step === 1 && !display_skip\">\n            <ImageSelectionList :question_list=\"json_data.stimuli[question_num]\"\n                                :question_text=\"gettext('Which object did you see?')\"\n                                :button_text=\"gettext('OK')\"\n                                :key=\"question_num\"\n                                :has_background=\"true\"\n                                v-on:submission=\"selectionSub\">\n            </ImageSelectionList>\n        </template>\n\n        <template v-else-if=\"step === 2 && !display_skip\">\n            <RoomMetaMemory :object_img_url=\"json_data.target_image\" :object_img_background_color=\"json_data.target_image_background_color\" v-on:submission=\"metaMemorySub\"></RoomMetaMemory>\n        </template>\n\n        <template v-else-if=\"step === 3 && !display_skip\">\n            <RoomConfidence :num_choices=\"5\" v-on:submission=\"confidenceSub\"></RoomConfidence>\n        </template>\n\n        <template v-else-if=\"step === 4 && !display_skip\">\n            <RightAlignButton :button_text=\"gettext('OK')\" :click_callback=\"incrementStep\"></RightAlignButton>\n            <div class=\"justify-content-center text-center\">\n                <p class=\"my-2\">{{ gettext(\"Where was this object located?\") }}</p>\n                <div>\n                    <BasicStimuliImage :background_color=\"json_data.target_image_background_color\" :image_url=\"json_data.target_image\" class=\"my-2\"></BasicStimuliImage>\n                </div>\n                <p class=\"my-2\">{{gettext(\"Tap OK, and then tap where the object was located in the room\")}}</p>\n            </div>\n        </template>\n\n        <template v-else-if=\"step === 5 && !display_skip\">\n            <ImagePlacement :after_image_url=\"json_data.room_image_after\"\n                            :place_image_url=\"json_data.target_image\"\n                            :place_image_width=\"json_data.target_image_width\"\n                            :target_coords=\"target_coords\"\n                            v-on:getcoords=\"getCoords\"\n                            v-on:submission=\"placementSub\">\n            </ImagePlacement>\n        </template>\n\n        <template v-if=\"display_skip\">\n          <BasicInstructions v-bind:instruction_text=\"gettext('The question was not answered within the allowed time, please press continue to move to the next question.')\"\n                             :display_bottom_button=\"true\"\n                             bottom_button_text=\"Continue\"\n                             :left_text=\"true\"\n                             @next=\"handleQuestionSkip\"\n          />\n        </template>\n        <template v-if=\"step !== 0 && step !== 4\">\n         <QuestionTimer\n                :timeSeconds=\"10\"\n                ref=\"questionTimer\"\n                :key=\"`timer-${json_data}-${step}-${question_num}`\"\n                @timeout=\"handleTimeout\"\n            />\n        </template>\n    </div>\n</template>\n\n\n<script>\n    import ImageSelectionList from \"./ImageSelectionList\";\n    import RightAlignButton from \"./RightAlignButton\";\n    import ImagePlacement from \"./ImagePlacement\";\n    import RoomMetaMemory from \"./RoomMetaMemory\";\n    import RoomConfidence from \"./RoomConfidence\";\n    import BasicStimuliImage from \"./BasicStimuliImage\";\n\n    import timing from \"../timing\";\n    import BasicInstructions from \"@/components/BasicInstructions.vue\";\n    import QuestionTimer from \"@/components/utils/QuestionTimer.vue\";\n\n    export default {\n        name: \"RoomQuestion\",\n        mixins: [timing],\n        props: [\"json_data\", \"display_duration\"],\n        components: {\n          QuestionTimer,\n          BasicInstructions,\n            BasicStimuliImage,\n            RoomConfidence,\n            RoomMetaMemory,\n            ImageSelectionList, ImagePlacement, RightAlignButton},\n        data: function() {\n            // This should get json data from the server per room\n            // For now return static data\n            return {\n                max_questions: 0,\n                step: 0,\n                question_num: 0,\n                selection_count: 0,\n                selected_image: null,\n                selected_image_list: [],\n                selection_count_list: [],\n                target_coords: {\n                    target_x: 0,\n                    target_y: 0,\n                    correct_radius: 50,\n                },\n                // User memory is the response to question: Do you remember where this object was located?\n                user_memory: null,\n                confidence_level: null,\n                time_start: 0,\n                time_end: 0,\n                selection_time: 0,\n                placement_timing: null,\n                placement_submission_timing: null,\n                placement_total_time: null,\n                place_x_coord: -1,\n                place_y_coord: -1,\n                placed_correct: null,\n                placement_distance: -1,\n                // placement_meta_memory is determine by correctness of placement compared to user_memory\n                placement_meta_memory: null,\n                placement_skipped: false,\n                display_skip: false,\n            } // End Return\n        }, // End Data\n        // Avoid using arrow functions for vue component methods as it will have 'this' scoped lexically and will not be the Vue Component.\n        mounted: function() {\n            this.max_questions = this.json_data.stimuli.length;\n            this.target_coords.target_x = this.json_data.target_x_coordinate;\n            this.target_coords.target_y = this.json_data.target_y_coordinate;\n            this.preloadImages();\n            setTimeout(() => this.incrementStep(), this.display_duration);\n        },\n        methods: {\n            incrementStep: function(event) {\n                this.step++;\n                this.recordStartTime();\n            },\n\n            decrementStep: function(event) {\n                this.step--;\n            },\n\n            incrementRound: function(event) {\n                this.question_num++;\n                if (this.question_num >= this.max_questions) {\n                    this.incrementStep();\n                }\n            },\n\n            decrementRound: function(event){\n                this.question_num--;\n            },\n\n            preloadImages: function(event) {\n                const imageBefore = new Image();\n                const imageAfter = new Image();\n                const imageTarget = new Image();\n                imageBefore.src = this.json_data.room_image_before;\n                imageAfter.src = this.json_data.room_image_after;\n                imageTarget.src = this.json_data.target_image;\n                for(let stim_list of this.json_data.stimuli) {\n                    for(let stim of stim_list) {\n                        const image = new Image();\n                        image.src = stim.url;\n                    }\n                }\n            },\n\n            selectionChange: function(event) {\n                // Record the end time on a selection change\n                // This will be the time it takes a user to pick a selection\n                this.recordEndTime();\n                this.selection_time = this.getTimeDiff();\n                this.selection_count++;\n            },\n\n            selectionSub: function(selection, selection_cnt, selection_time, submission_time) {\n                // Record the info\n                let chosenAnswer = this.json_data.stimuli[this.question_num][selection];\n                chosenAnswer.num_changed = selection_cnt;\n                chosenAnswer.select_time = selection_time;\n                chosenAnswer.sub_time = submission_time;\n                chosenAnswer.total_time = selection_time+submission_time;\n\n                this.selected_image_list.push(chosenAnswer);\n\n                // Automatically display the next set of questions\n                // This will increment the step automatically once we reach the end of the questions array\n                this.incrementRound();\n                //console.log(`Count: ${selection_cnt}, SelectTime: ${selection_time}, SubTime: ${submission_time}`);\n            },\n\n            metaMemorySub: function(mem_select) {\n                this.user_memory = mem_select;\n                this.incrementStep();\n            },\n\n            confidenceSub: function(conf_level) {\n                this.confidence_level = conf_level;\n                this.incrementStep();\n            },\n\n            getCoords: function(coord_x, coord_y, click_time) {\n                this.place_x_coord = coord_x;\n                this.place_y_coord = coord_y;\n                this.placement_timing = click_time;\n            },\n\n            placementSub: function(submission_time, placed_correct, placement_distance) {\n                this.placement_submission_timing = submission_time;\n                this.placed_correct = placed_correct;\n                this.placement_distance = placement_distance;\n                this.checkPlacementMeta();\n                this.$emit(\"submission\", this.createResult());\n                //console.log(`Placement: ${this.placement_timing}`);\n                //console.log(`Submission: ${this.placement_submission_timing}`);\n                //console.log(`X: ${this.place_x_coord} Y: ${this.place_y_coord}`);\n            },\n\n            checkPlacementMeta: function() {\n                // User placed the object correctly and believed they knew where it was, or User place the object incorrectly and believed to not know where it was\n                this.placement_meta_memory = ((this.placed_correct && (this.user_memory === 'yes')) || (!this.placed_correct && (this.user_memory !== 'yes')))\n            },\n\n            createResult: function(event) {\n                return {\n                    id: this.json_data.id,\n                    name: this.json_data.name,\n                    memory_selections: this.selected_image_list,\n                    meta_memory: this.user_memory,\n                    meta_confidence: this.confidence_level,\n                    placement: {\n                        x_coord: this.place_x_coord,\n                        y_coord: this.place_y_coord,\n                        is_correct: this.placed_correct,\n                        distance: this.placement_distance,\n                        is_meta_correct: this.placement_meta_memory,\n                        place_time: this.placement_timing,\n                        sub_time: this.placement_submission_timing,\n                        total_time: this.placement_timing + this.placement_submission_timing,\n                        placement_skipped: this.placement_skipped,\n                    },\n                }\n            },\n          handleTimeout() {\n            this.display_skip = true\n          },\n\n          handleQuestionSkip() {\n            let original_step = this.step\n            if(original_step === 1) {\n              this.selected_image_list.push(\n                  {\n                    is_correct: false,\n                    skipped: true\n                  }\n              )\n              this.incrementRound()\n              this.display_skip = false\n              return\n            } else if (original_step === 2) {\n              this.user_memory = \"skipped\"\n            } else if(original_step === 3) {\n              this.confidence_level = \"skipped\"\n            } else if(original_step === 5) {\n              this.placement_meta_memory = false\n              this.placement_skipped = true\n              this.placed_correct = false\n              this.$emit(\"submission\", this.createResult());\n            }\n            else {\n              return\n            }\n            this.step = original_step + 1\n            this.display_skip = false\n          },\n\n        } // End Methods\n    } // End Export\n</script>\n\n<style scoped>\n\n</style>","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./RoomQuestion.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./RoomQuestion.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./RoomQuestion.vue?vue&type=template&id=51de55db&scoped=true\"\nimport script from \"./RoomQuestion.vue?vue&type=script&lang=js\"\nexport * from \"./RoomQuestion.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"51de55db\",\n  null\n  \n)\n\nexport default component.exports","<template>\n    <div>\n        <template v-if=\"question_num < max_questions\">\n            <template v-if=\"step === 0\">\n                <RoomQuestion :json_data=\"json_data[question_num]\"\n                              :display_duration=\"display_duration\"\n                              :key=\"question_num\"\n                              v-on:submission=\"nextQuestion\"></RoomQuestion>\n            </template>\n            <template v-else>\n                <BasicInstructions :instruction_text=\"gettext('Press OK to start the next question.')\"\n                                   v-on:next=\"decrementStep\"></BasicInstructions>\n            </template>\n        </template>\n    </div>\n</template>\n\n<script>\n    import RoomQuestion from \"./RoomQuestion\";\n    import BasicInstructions from \"./BasicInstructions\";\n\n    export default {\n        name: \"MemoryPhase\",\n        components: {BasicInstructions, RoomQuestion},\n        props: [\"json_data\", \"display_duration\", \"start_from_question_num\"],\n\n        mounted() {\n            this.max_questions = this.json_data.length;\n            if(this.start_from_question_num) {\n              this.question_num = this.start_from_question_num;\n            }\n\n        },\n        data: function() {\n            return {\n                step: 0,\n                question_num: 0,\n                max_questions: 0,\n                user_responses: [],\n            }\n        },\n\n        methods: {\n            incrementStep: function() {\n                this.step++;\n            },\n            decrementStep: function() {\n                this.step--;\n            },\n\n            nextQuestion: function(question_data) {\n                this.user_responses.push(question_data);\n                this.incrementStep();\n                this.question_num++;\n\n                // Post the results per metaMemory question\n                this.$emit('submission', this.createResults());\n                if(this.question_num >= this.max_questions) {\n                    // Move on to the delayed phase\n                    this.$emit('complete')\n                }\n            },\n\n            createResults: function() {\n                return {\n                    user_responses: this.user_responses,\n                    question_num: this.question_num,\n                }\n            }\n        }\n\n    }\n</script>\n\n<style scoped>\n\n</style>","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./MemoryPhase.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./MemoryPhase.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./MemoryPhase.vue?vue&type=template&id=45de7a02&scoped=true\"\nimport script from \"./MemoryPhase.vue?vue&type=script&lang=js\"\nexport * from \"./MemoryPhase.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"45de7a02\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[_c('div',{staticClass:\"p-sm-0 p-lg-3\"},[(_vm.step === 0)?[_c('BasicInstructions',{attrs:{\"instruction_text\":_vm.gettext('Now, you are going to observe a room with several objects. Please, take a careful look, as you will be asked later about it. Do your best as fast as possible.'),\"mobile_text\":_vm.gettext('Please rotate your phone to landscape mode for the best experience. You may zoom in and out by using two fingers on the screen.'),\"mobile_text_special\":_vm.gettext('Make sure you scroll down to see all question options!'),\"second_text\":_vm.gettext('Please ensure you have a stable internet connection before continuing.'),\"bold_text\":_vm.gettext('Do not use the back button as it will restart the test.')},on:{\"next\":_vm.incrementStep}})]:(_vm.step === 1 )?[_c('MemoryPhase',{attrs:{\"json_data\":_vm.mock_data,\"display_duration\":_vm.displayDuration},on:{\"complete\":_vm.incrementStep}})]:(_vm.step === 2 )?[_c('BasicInstructions',{attrs:{\"instruction_text\":_vm.gettext('Press OK to start the next question.')},on:{\"next\":_vm.incrementStep}})]:(_vm.step === 3 )?[_c('DelayedPhase',{attrs:{\"json_data\":_vm.mock_delayed_data},on:{\"complete\":_vm.incrementStep}})]:(_vm.step === 4)?[_c('div',{staticClass:\"container align-content-center\"},[_c('div',{staticClass:\"my-3\"},[_c('h2',[_vm._v(_vm._s(_vm.gettext('End of the practice test!')))]),_c('p',{staticClass:\"mt-lg-5 mt-sm-3 max-width-750 mx-auto\"},[_vm._v(_vm._s(_vm.gettext('Would you like to retake the practice test?')))]),_c('div',{staticClass:\"d-flex justify-content-center\"},[_c('div',[_c('button',{staticClass:\"btn btn-lg btn-primary mx-2\",on:{\"click\":function($event){return _vm.setStep(0)}}},[_vm._v(_vm._s(_vm.gettext('Yes')))]),_c('button',{staticClass:\"btn btn-lg btn-primary mx-2\",on:{\"click\":_vm.incrementStep}},[_vm._v(_vm._s(_vm.gettext('No')))])])])])])]:_vm._e()],2)])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","// Build the URL for an image that ships with the app (practice test images,\n// fixation cross, placeholder). They are served from the CDN, and every\n// environment shares the one copy. `manage.py upload_static_images` puts them\n// there from assets/img.\n\nconst STATIC_IMG_URL = \"https://d2miewdj9193um.cloudfront.net/static/img/\";\n\nexport default function staticImage(path) {\n    return STATIC_IMG_URL + path;\n}\n","// The practice questions and other fixed images built into the app. Kept in\n// one place so the components that show them and the preloader that fetches\n// them ahead of time (see App.vue) cannot drift apart.\n\nimport staticImage from \"./staticImage\";\n\n// Shown between the stimuli of every series question.\nexport const FIXATION_CROSS = staticImage(\"fixation_cross.webp\");\n\n// Stands in for a face during the FName learning phase.\nexport const FNAME_PLACEHOLDER = staticImage(\"placeholder.webp\");\n\n// These return a fresh copy each time, as a component's data() would.\nexport function roomPractice() {\n    return {\n        questions: [\n            {\n                \"id\": 2,\n                \"name\": \"Kids Room\",\n                \"room_image_before\": staticImage(\"RoomPracticeTest/KidsRoom/kids_room_everything.webp\"),\n                \"room_image_after\": staticImage(\"RoomPracticeTest/KidsRoom/kids_room_empty.webp\"),\n                \"stimuli\": [\n                    [\n                        {\n                            \"url\": staticImage(\"RoomPracticeTest/KidsRoom/Set1/backpack_2.webp\"),\n                            \"is_correct\": false,\n                            \"background_color\": \"#FFFFFF\"\n                        },\n                        {\n                            \"url\": staticImage(\"RoomPracticeTest/KidsRoom/Set1/backpack_3.webp\"),\n                            \"is_correct\": false,\n                            \"background_color\": \"#FFFFFF\"\n                        },\n                        {\n                            \"url\": staticImage(\"RoomPracticeTest/KidsRoom/Set1/backpack_1_correct.webp\"),\n                            \"is_correct\": true,\n                            \"background_color\": \"#FFFFFF\"\n                        }\n                    ],\n                    [\n                        {\n                            \"url\": staticImage(\"RoomPracticeTest/KidsRoom/Set2/soccer_ball2.webp\"),\n                            \"is_correct\": false,\n                            \"background_color\": \"#FFFFFF\"\n                        },\n                        {\n                            \"url\": staticImage(\"RoomPracticeTest/KidsRoom/Set2/Soccer_ball3.webp\"),\n                            \"is_correct\": false,\n                            \"background_color\": \"#FFFFFF\"\n                        },\n                        {\n                            \"url\": staticImage(\"RoomPracticeTest/KidsRoom/Set2/soccer_ball_correct.webp\"),\n                            \"is_correct\": true,\n                            \"background_color\": \"#FFFFFF\"\n                        }\n                    ],\n                    [\n                        {\n                            \"url\": staticImage(\"RoomPracticeTest/KidsRoom/Set3/teddy_bear_1_correct.webp\"),\n                            \"is_correct\": true,\n                            \"background_color\": \"#FFFFFF\"\n                        },\n                        {\n                            \"url\": staticImage(\"RoomPracticeTest/KidsRoom/Set3/teddy_bear3.webp\"),\n                            \"is_correct\": false,\n                            \"background_color\": \"#FFFFFF\"\n                        },\n                        {\n                            \"url\": staticImage(\"RoomPracticeTest/KidsRoom/Set3/teddy_bear2.webp\"),\n                            \"is_correct\": false,\n                            \"background_color\": \"#FFFFFF\"\n                        }\n                    ]\n                ],\n                \"target_image\": staticImage(\"RoomPracticeTest/KidsRoom/backpack_1_correct.webp\"),\n                \"target_image_background_color\": \"#FFFFFF\",\n                \"target_image_width\": 180,\n                \"target_x_coordinate\": 273,\n                \"target_y_coordinate\": 638\n            },\n        ],\n        delayed_questions: [\n            {\n                \"id\": 43,\n                \"name\": \"DQ-2\",\n                \"stimuli\": [\n                    [\n                        {\n                            \"url\": staticImage(\"RoomPracticeTest/Kitchen/kitchen_empty.webp\"),\n                            \"is_correct\": false\n                        },\n                        {\n                            \"url\": staticImage(\"RoomPracticeTest/KidsRoom/kids_room_empty.webp\"),\n                            \"is_correct\": true\n                        },\n                        {\n                            \"url\": staticImage(\"RoomPracticeTest/Library/library.webp\"),\n                            \"is_correct\": false\n                        }\n                    ]\n                ],\n                \"target_image\": staticImage(\"RoomPracticeTest/KidsRoom/backpack_1_correct.webp\"),\n                \"target_image_background_color\": null,\n                \"target_image_width\": 180,\n                \"target_x_coordinate\": 273,\n                \"target_y_coordinate\": 638,\n            },\n        ],\n    };\n}\n\nexport function fnamePractice() {\n    return {\n        questions: [{\n            foil_images: [staticImage(\"Susana_Foil1.webp\"), staticImage(\"Susana_Foil2.webp\")],\n            foil_names: [\"Andrea\", \"Elizabeth\"],\n            name: \"practice-Q1\",\n            ordering_id: -1,\n            question_id: -1,\n            target_image: staticImage(\"Susana.webp\"),\n            target_name: \"Susana\"\n        }],\n    };\n}\n\n// Every built-in image a test type shows, keyed by the test JSON's test_type.\nexport function practiceImages(test_type) {\n    const images = {\n        room: () => roomPractice(),\n        fname: () => [fnamePractice(), FNAME_PLACEHOLDER],\n        series: () => [FIXATION_CROSS],\n    };\n    return images[test_type] ? images[test_type]() : [];\n}\n","import Vue from \"vue\";\n\n// Which chip (\"practice\" or \"test\") App shows beside the test name header.\n// Set by the component that owns the phase; null hides the chip.\nexport default Vue.observable({ label: null });\n","<template>\n  <div>\n    <div class=\"p-sm-0 p-lg-3\">\n\n        <template v-if=\"step === 0\">\n            <BasicInstructions v-bind:instruction_text=\"gettext('Now, you are going to observe a room with several objects. Please, take a careful look, as you will be asked later about it. Do your best as fast as possible.')\"\n                               :mobile_text=\"gettext('Please rotate your phone to landscape mode for the best experience. You may zoom in and out by using two fingers on the screen.')\"\n                               :mobile_text_special=\"gettext('Make sure you scroll down to see all question options!')\"\n                               :second_text=\"gettext('Please ensure you have a stable internet connection before continuing.')\"\n                               :bold_text=\"gettext('Do not use the back button as it will restart the test.')\"\n                               v-on:next=\"incrementStep\"\n            >\n            </BasicInstructions>\n        </template>\n        <template v-else-if=\"step === 1 \">\n          <MemoryPhase :json_data=\"mock_data\"\n                       :display_duration=\"displayDuration\"\n                       v-on:complete=\"incrementStep\">\n          </MemoryPhase>\n        </template>\n\n        <template v-else-if=\"step === 2 \">\n            <BasicInstructions :instruction_text=\"gettext('Press OK to start the next question.')\"\n                               v-on:next=\"incrementStep\">\n            </BasicInstructions>\n        </template>\n\n        <template v-else-if=\"step === 3 \">\n          <DelayedPhase :json_data=\"mock_delayed_data\"\n                        v-on:complete=\"incrementStep\">\n          </DelayedPhase>\n        </template>\n\n        <template v-else-if=\"step === 4\">\n          <div class=\"container align-content-center\">\n            <div class=\"my-3\">\n                <h2>{{gettext('End of the practice test!')}}</h2>\n                <p class=\"mt-lg-5 mt-sm-3 max-width-750 mx-auto\">{{ gettext('Would you like to retake the practice test?') }}</p>\n                <div class=\"d-flex justify-content-center\">\n                  <div>\n                    <button class=\"btn btn-lg btn-primary mx-2\" v-on:click=\"setStep(0)\">{{gettext('Yes')}}</button>\n                    <button class=\"btn btn-lg btn-primary mx-2\" v-on:click=\"incrementStep\">{{gettext('No')}}</button>\n                  </div>\n                </div>\n            </div>\n          </div>\n        </template>\n    </div>\n  </div>\n</template>\n\n<script>\n    import { roomPractice } from \"@/practiceData\";\n    import BasicInstructions from \"@/components/BasicInstructions\";\n    import MemoryPhase from \"@/components/MemoryPhase\";\n    import DelayedPhase from \"@/components/DelayedPhase\";\n    import phaseChip from \"@/phaseChip\";\n    export default {\n        components: {\n          DelayedPhase,\n          MemoryPhase,\n          BasicInstructions},\n        props: [\"displayDuration\", ],\n        created: function() {\n          phaseChip.label = \"practice\";\n        },\n        beforeDestroy: function() {\n          if (phaseChip.label === \"practice\") {\n            phaseChip.label = null;\n          }\n        },\n        data: function() {\n              const practice = roomPractice();\n              return {\n                  step: 0,\n                  complete: false,\n                  mock_data: practice.questions,\n                  mock_delayed_data: practice.delayed_questions,\n              }\n          },\n          methods: {\n            setStep: function(value) {\n              this.step = value\n            },\n            incrementStep: function (event) {\n              this.step++;\n              // There are only 2 steps defined in the template, so step 3 is when the Room Test is complete\n              if (this.step >= 5) {\n                this.complete = true;\n                this.$emit('complete');\n              }\n            },\n            decrementStep: function (event) {\n              this.step--;\n            },\n          }\n    }\n</script>","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./RoomPractice.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./RoomPractice.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./RoomPractice.vue?vue&type=template&id=2f8dca78\"\nimport script from \"./RoomPractice.vue?vue&type=script&lang=js\"\nexport * from \"./RoomPractice.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports","<template>\n    <div class=\"p-3\">\n        <template v-if=\"step === 0\">\n            <RoomPractice :displayDuration=\"display_duration\" v-on:complete=\"incrementStep\"></RoomPractice>\n        </template>\n\n        <template v-else-if=\"step === 1\">\n            <MemoryPhase :json_data=\"memory_json_data\"\n                         :display_duration=\"display_duration\"\n                         :start_from_question_num=\"question_num\"\n                         v-on:submission=\"memorySubmission\"\n                         v-on:complete=\"memoryComplete\"></MemoryPhase>\n        </template>\n\n        <template v-else-if=\"step === 2\">\n            <BasicInstructions :instruction_text=\"gettext('Press OK to start the next question.')\"\n                                   v-on:next=\"incrementStep\"></BasicInstructions>\n        </template>\n\n        <template v-else-if=\"step === 3\">\n            <DelayedPhase :json_data=\"delayed_json_data\"\n                          :start_from_question_num=\"question_num\"\n                          v-on:submission=\"delayedSub\"\n                          v-on:complete=\"incrementStep\"></DelayedPhase>\n        </template>\n    </div>\n</template>\n\n<script>\n    import BasicInstructions from \"./BasicInstructions\";\n    import DelayedPhase from \"./DelayedPhase\";\n    import MemoryPhase from \"./MemoryPhase\";\n\n\n    import \"whatwg-fetch\";\n    import RoomPractice from \"@/components/RoomPractice\";\n\n    export default {\n        name: \"RoomDriver\",\n        components: {RoomPractice, MemoryPhase, DelayedPhase, BasicInstructions},\n        props: [\"json_data\"],\n        mounted: function () {\n            this.test_id = this.json_data.id;\n            this.test_type = this.json_data.test_type;\n            this.display_duration = this.json_data.duration_room_display * 1000;\n            this.memory_json_data = this.json_data.questions;\n            this.delayed_json_data = this.json_data.delayed_questions;\n            const results = this.json_data.results\n            const result_test_num = this.json_data.test_number - 1\n            if(results && results.length >= this.json_data.test_number) {\n              const result_data = this.json_data.results[result_test_num];\n              this.processInitialData(result_data)\n            }\n        },\n        data: function() {\n            return {\n                step: 0,\n                display_duration: 0,\n                // Only used for saving internal state of the phases to repopulate on page-refresh\n                question_num: 0,\n                memory_json_data: {},\n                delayed_json_data: {},\n                test_id: null,\n                test_type: null,\n                complete: false,\n                memory_phase_results: {},\n                delayed_phase_results: {},\n                averages: {},\n            }\n        },\n        methods: {\n            incrementStep: function(event) {\n                // Reset Question Num for the new phase.\n                this.question_num = 0\n                this.step++;\n                // There are only 2 steps defined in the template, so step 3 is when the Room Test is complete\n                if(this.step >= 4) {\n                    this.calculateAvgs();\n                    this.complete = true;\n                    this.$emit('submission', this.createResults(), \"ROOM_DRIVER_COMPLETE_SUBMIT\", this.complete)\n                    // Need to let the data update from the above emit to avoid race conditions, \"complete\" will resubmit with an updated flag.\n                    this.$nextTick(() => {\n                      this.$emit('complete');\n                    })\n\n                }\n            },\n            decrementStep: function(event) {\n                this.step--;\n            },\n            memorySubmission: function(results) {\n                // Merge new results with existing saved results instead of overwriting\n                if (this.memory_phase_results && Object.keys(this.memory_phase_results).length > 0) {\n                    // Preserve the existing user_responses array before merging\n                    const existingUserResponses = [...(this.memory_phase_results.user_responses || [])];\n\n                    // Merge other properties (but NOT user_responses yet)\n                    const { user_responses: newUserResponses, ...otherResults } = results;\n                    this.memory_phase_results = {\n                        ...this.memory_phase_results,\n                        ...otherResults\n                    };\n\n\n                    // Handle user_responses array separately to avoid overwrites\n                    if (newUserResponses && newUserResponses.length > 0) {\n                        // Add new responses to existing array without duplicating\n                        newUserResponses.forEach((newResponse) => {\n                            // Check if this response already exists\n                            const existingIndex = existingUserResponses.findIndex(existing =>\n                                existing.id === newResponse.id\n                            );\n\n                            if (existingIndex >= 0) {\n                                // Update existing response\n                                existingUserResponses[existingIndex] = newResponse;\n                            } else {\n                                // Add new response\n                                existingUserResponses.push(newResponse);\n                            }\n                        });\n                    }\n\n                    // Set the properly merged user_responses array\n                    this.memory_phase_results.user_responses = existingUserResponses;\n                } else {\n                    // No existing results, use the new results directly\n                    this.memory_phase_results = results;\n                }\n\n                this.question_num = results.question_num;\n                // Post the partial results\n                this.$emit(\"submission\", this.createResults(), \"ROOM_MEMORY_PHASE_SUBMIT\")\n            },\n            memoryComplete: function(results) {\n              this.incrementStep()\n              this.$emit(\"submission\", this.createResults(), \"ROOM_MEMORY_COMPLETE\")\n            },\n\n            delayedSub: function(results) {\n                // Merge new results with existing saved results instead of overwriting\n                if (this.delayed_phase_results && Object.keys(this.delayed_phase_results).length > 0) {\n                    // Preserve the existing user_responses array before merging\n                    const existingUserResponses = [...(this.delayed_phase_results.user_responses || [])];\n\n                    // Merge other properties (but NOT user_responses yet)\n                    const { user_responses: newUserResponses, ...otherResults } = results;\n                    this.delayed_phase_results = {\n                        ...this.delayed_phase_results,\n                        ...otherResults\n                    };\n\n                    // Handle user_responses array separately to avoid overwrites\n                    if (newUserResponses && newUserResponses.length > 0) {\n                        // Add new responses to existing array without duplicating\n                        newUserResponses.forEach((newResponse) => {\n                            // Check if this response already exists\n                            const existingIndex = existingUserResponses.findIndex(existing =>\n                                existing.id === newResponse.id\n                            );\n\n                            if (existingIndex >= 0) {\n                                // Update existing response\n                                existingUserResponses[existingIndex] = newResponse;\n                            } else {\n                                // Add new response\n                                existingUserResponses.push(newResponse);\n                            }\n                        });\n                    }\n\n                    // Set the properly merged user_responses array\n                    this.delayed_phase_results.user_responses = existingUserResponses;\n                } else {\n                    // No existing results, use the new results directly\n                    this.delayed_phase_results = results;\n                }\n\n                this.question_num = results.question_num;\n\n                // Make sure we're in the delayed phase (step 3)\n                if (this.step !== 3) {\n                    this.step = 3;\n                }\n\n                // Post the partial results\n                this.$emit(\"submission\", this.createResults(), \"ROOM_DELAYED_PHASE_SUBMIT\");\n            },\n            processInitialData: function(savedResults = null) {\n              // If we have saved results, restore the state from them\n              if (savedResults) {\n                  // Restore current step\n                  this.step = savedResults.current_step || 0;\n\n                  // Restore current question number\n                  this.question_num = savedResults.question_num || 0;\n\n                  // Restore completion status\n                  this.complete = savedResults.is_complete || false;\n\n                  // Restore phase results\n                  if (savedResults.user_results) {\n                      this.memory_phase_results = savedResults.user_results.memory || {};\n                      this.delayed_phase_results = savedResults.user_results.delayed || {};\n                  }\n\n                  // Restore averages\n                  this.averages = savedResults.averages || {};\n              } else {\n                  // No saved results, ensure we start fresh\n                  this.step = 0;\n                  this.question_num = 0;\n                  this.complete = false;\n                  this.memory_phase_results = {};\n                  this.delayed_phase_results = {};\n                  this.averages = {};\n              }\n            },\n            createResults: function() {\n                return {\n                    current_step: this.step,\n                    start_time: this.time_start,\n                    finish_time: this.time_end,\n                    test_id: this.test_id,\n                    test_type: this.test_type,\n                    is_complete: this.complete,\n                    user_results: {\n                        memory: this.memory_phase_results,\n                        delayed: this.delayed_phase_results,\n                    },\n                    question_num: this.question_num,\n                    averages: this.averages,\n                }\n            },\n\n            calculateMemoryAvgs: function() {\n                // Declare Cumulative totals\n                let mem_correct_cnt = 0;\n                let mem_total = 0;\n                let place_correct_cnt = 0;\n                let place_meta_correct_cnt = 0;\n\n                let stim_selection_time = 0;\n                let stim_selection_sub_time = 0;\n                let stim_selection_time_corr = 0;\n                let stim_selection_time_wrong = 0;\n                let stim_selection_sub_time_corr = 0;\n                let stim_selection_sub_time_wrong = 0;\n\n                let place_time = 0;\n                let place_sub_time = 0;\n                let place_time_corr = 0;\n                let place_time_wrong = 0;\n                let place_sub_time_corr = 0;\n                let place_sub_time_wrong = 0;\n\n                // Should be the length of the number of questions. Since each question has 1 placement\n                let place_total = this.memory_phase_results.user_responses.length;\n                for(let question of this.memory_phase_results.user_responses) {\n                    mem_total += question.memory_selections.length;\n                    for(let answer of question.memory_selections) {\n                        stim_selection_time += answer.select_time;\n                        stim_selection_sub_time += answer.sub_time;\n                        if(answer.is_correct) {\n                            mem_correct_cnt++;\n                            stim_selection_time_corr += answer.select_time;\n                            stim_selection_sub_time_corr += answer.sub_time;\n                        }\n                        else {\n                            stim_selection_time_wrong += answer.select_time;\n                            stim_selection_sub_time_wrong += answer.sub_time;\n                        }\n                    }\n                    if(question.placement.is_correct) {\n                        place_correct_cnt++;\n                        place_time_corr += question.placement.place_time;\n                        place_sub_time_corr += question.placement.sub_time;\n                    }\n                    else {\n                        place_time_wrong += question.placement.place_time;\n                        place_sub_time_wrong += question.placement.sub_time;\n                    }\n                    if(question.placement.is_meta_correct) {\n                        place_meta_correct_cnt++;\n                    }\n                    place_time += question.placement.place_time;\n                    place_sub_time += question.placement.sub_time;\n                }\n                // Need to calculate these first since we may change the numerators value to be used as a denominator for response times.\n                let mem_score = mem_correct_cnt / mem_total;\n                let place_score = place_correct_cnt / place_total;\n                let place_meta_score = place_meta_correct_cnt / place_total;\n\n                let avg_select_rt = stim_selection_time / mem_total;\n                let avg_select_sub_rt = stim_selection_sub_time / mem_total;\n                let avg_place_rt = place_time / place_total;\n                let avg_place_sub_rt = place_sub_time / place_total;\n\n                // Ensure our denominators are not 0\n                let mem_wrong_cnt = mem_correct_cnt < mem_total ? mem_total - mem_correct_cnt : 1;\n                mem_correct_cnt = mem_correct_cnt > 0 ? mem_correct_cnt : 1;\n                let place_wrong_cnt = place_correct_cnt < place_total ? place_total - place_correct_cnt : 1;\n                place_correct_cnt = place_correct_cnt > 0 ? place_correct_cnt : 1;\n\n                let avg_select_corr_rt = stim_selection_time_corr / mem_correct_cnt;\n                let avg_select_sub_corr_rt  = stim_selection_sub_time_corr / mem_correct_cnt;\n                let avg_select_wrong_rt = stim_selection_time_wrong / mem_wrong_cnt;\n                let avg_select_sub_wrong_rt = stim_selection_sub_time_wrong / mem_wrong_cnt;\n\n\n                let avg_place_corr_rt = place_time_corr / place_correct_cnt;\n                let avg_place_sub_corr_rt = place_sub_time_corr / place_correct_cnt;\n                let avg_place_wrong_rt = place_time_wrong / place_wrong_cnt;\n                let avg_place_sub_wrong_rt = place_sub_time_wrong / place_wrong_cnt;\n\n\n                // console.log(this.memory_phase_results);\n                // console.log(`mem_score: ${mem_score}\\t place_score: ${place_score}\\t place_meta_score: ${place_meta_score}`);\n                // console.log(`avg_select_rt: ${avg_select_rt}\\t avg_select_sub_rt: ${avg_select_sub_rt}`);\n                // console.log(`avg_place_rt: ${avg_place_rt}\\t avg_place_sub_rt: ${avg_place_sub_rt}`);\n                // console.log(`avg_select_corr_rt ${avg_select_corr_rt}\\t avg_select_sub_corr_rt: ${avg_select_sub_corr_rt}`);\n                // console.log(`avg_select_wrong_rt: ${avg_select_wrong_rt}\\t avg_select_sub_wrong_rt: ${avg_select_sub_wrong_rt}`);\n                // console.log(`avg_place_corr_rt: ${avg_place_corr_rt}\\t avg_place_sub_corr_rt: ${avg_place_sub_corr_rt}`);\n                // console.log(`avg_place_wrong_rt: ${avg_place_wrong_rt}\\t avg_place_sub_wrong_rt: ${avg_place_sub_wrong_rt}`);\n                return {\n                    select_score: mem_score,\n                    place_score: place_score,\n                    place_meta_score: place_meta_score,\n                    avg_select_rt: avg_select_rt,\n                    avg_select_sub_rt: avg_select_sub_rt,\n                    avg_select_corr_rt: avg_select_corr_rt,\n                    avg_select_sub_corr_rt: avg_select_sub_corr_rt,\n                    avg_select_wrong_rt: avg_select_wrong_rt,\n                    avg_select_sub_wrong_rt: avg_select_sub_wrong_rt,\n                    avg_place_rt: avg_place_rt,\n                    avg_place_sub_rt: avg_place_sub_rt,\n                    avg_place_corr_rt: avg_place_corr_rt,\n                    avg_place_sub_corr_rt: avg_place_sub_corr_rt,\n                    avg_place_wrong_rt: avg_place_wrong_rt,\n                    avg_place_sub_wrong_rt: avg_place_sub_wrong_rt,\n                }\n            },\n\n            calculateDelayedAvgs: function() {\n                // Declare Cumulative totals\n                let delay_correct_cnt = 0;\n                let place_correct_cnt = 0;\n                let place_meta_correct_cnt = 0;\n\n                let select_time = 0;\n                let select_sub_time = 0;\n                let select_time_corr = 0;\n                let select_time_wrong = 0;\n                let select_sub_time_corr = 0;\n                let select_sub_time_wrong = 0;\n\n                let place_time = 0;\n                let place_sub_time = 0;\n                let place_time_corr = 0;\n                let place_time_wrong = 0;\n                let place_sub_time_corr = 0;\n                let place_sub_time_wrong = 0;\n\n                let delay_total = this.delayed_phase_results.user_responses.length;\n                for(let answer of this.delayed_phase_results.user_responses) {\n                    select_time += answer.delayed_selection.select_time;\n                    select_sub_time += answer.delayed_selection.sub_time;\n                    place_time += answer.placement.place_time;\n                    place_sub_time += answer.placement.sub_time;\n                    if(answer.delayed_selection.is_correct) {\n                        delay_correct_cnt++;\n                        select_time_corr += answer.delayed_selection.select_time;\n                        select_sub_time_corr += answer.delayed_selection.sub_time;\n                    }\n                    else {\n                        select_time_wrong += answer.delayed_selection.select_time;\n                        select_sub_time_wrong += answer.delayed_selection.sub_time;\n                    }\n                    if(answer.placement.is_correct) {\n                        place_correct_cnt++;\n                        place_time_corr += answer.placement.place_time;\n                        place_sub_time_corr += answer.placement.sub_time;\n                    }\n                    else {\n                        place_time_wrong += answer.placement.place_time;\n                        place_sub_time_wrong += answer.placement.sub_time;\n                    }\n                    if(answer.placement.meta_correct) {\n                        place_meta_correct_cnt++;\n                    }\n                }\n                // Need to calculate these first since we may change the numerators value to be used as a denominator for response times.\n                let delay_score = delay_correct_cnt / delay_total;\n                let place_score = place_correct_cnt / delay_total;\n                let place_meta_score = place_meta_correct_cnt / delay_total;\n\n                let avg_select_rt = select_time / delay_total;\n                let avg_select_sub_rt = select_sub_time / delay_total;\n                let avg_place_rt = place_time / delay_total;\n                let avg_place_sub_rt = place_sub_time / delay_total;\n                // Ensure our denominators are not 0\n                let delay_wrong_cnt = delay_correct_cnt < delay_total ? delay_total - delay_correct_cnt : 1;\n                delay_correct_cnt = delay_correct_cnt > 0 ?  delay_correct_cnt : 1;\n                let place_wrong_cnt = place_correct_cnt < delay_total ? delay_total - place_correct_cnt : 1;\n                place_correct_cnt = place_correct_cnt > 0 ? place_correct_cnt : 1;\n\n                let avg_select_corr_rt = select_time_corr / delay_correct_cnt;\n                let avg_select_sub_corr_rt = select_sub_time_corr / delay_correct_cnt;\n                let avg_select_wrong_rt = select_time_wrong / delay_wrong_cnt;\n                let avg_select_sub_wrong_rt = select_sub_time_wrong / delay_wrong_cnt;\n\n\n                let avg_place_corr_rt = place_time_corr / place_correct_cnt;\n                let avg_place_sub_corr_rt = place_sub_time_corr / place_correct_cnt;\n                let avg_place_wrong_rt = place_time_wrong / place_wrong_cnt;\n                let avg_place_sub_wrong_rt = place_sub_time_wrong / place_wrong_cnt;\n\n                // console.log(`delay_score: ${delay_score}\\t place_score: ${place_score}\\t place_meta_score: ${place_meta_score}`);\n                // console.log(`avg_select_rt: ${avg_select_rt}\\t avg_select_sub_rt: ${avg_select_sub_rt}`);\n                // console.log(`avg_place_rt: ${avg_place_rt}\\t avg_place_sub_rt: ${avg_place_sub_rt}`);\n                // console.log(`avg_select_corr_rt ${avg_select_corr_rt}\\t avg_select_sub_corr_rt: ${avg_select_sub_corr_rt}`);\n                // console.log(`avg_select_wrong_rt: ${avg_select_wrong_rt}\\t avg_select_sub_wrong_rt: ${avg_select_sub_wrong_rt}`);\n                // console.log(`avg_place_corr_rt: ${avg_place_corr_rt}\\t avg_place_sub_corr_rt: ${avg_place_sub_corr_rt}`);\n                // console.log(`avg_place_wrong_rt: ${avg_place_wrong_rt}\\t avg_place_sub_wrong_rt: ${avg_place_sub_wrong_rt}`);\n                // console.log(this.delayed_phase_results);\n                return {\n                    select_score: delay_score,\n                    place_score: place_score,\n                    place_meta_score: place_meta_score,\n                    avg_select_rt: avg_select_rt,\n                    avg_select_sub_rt: avg_select_sub_rt,\n                    avg_select_corr_rt: avg_select_corr_rt,\n                    avg_select_sub_corr_rt: avg_select_sub_corr_rt,\n                    avg_select_wrong_rt: avg_select_wrong_rt,\n                    avg_select_sub_wrong_rt: avg_select_sub_wrong_rt,\n                    avg_place_rt: avg_place_rt,\n                    avg_place_sub_rt: avg_place_sub_rt,\n                    avg_place_corr_rt: avg_place_corr_rt,\n                    avg_place_sub_corr_rt: avg_place_sub_corr_rt,\n                    avg_place_wrong_rt: avg_place_wrong_rt,\n                    avg_place_sub_wrong_rt: avg_place_sub_wrong_rt,\n                }\n            },\n\n            calculateAvgs: function() {\n                this.averages.memory_phase = this.calculateMemoryAvgs();\n                this.averages.delayed_phase = this.calculateDelayedAvgs()\n            }\n\n\n        }\n    }\n</script>\n\n<style scoped>\n</style>","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./RoomDriver.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./RoomDriver.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./RoomDriver.vue?vue&type=template&id=5ee98c74&scoped=true\"\nimport script from \"./RoomDriver.vue?vue&type=script&lang=js\"\nexport * from \"./RoomDriver.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"5ee98c74\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"container p-3\",attrs:{\"id\":\"series-container\"}},[(_vm.step === 0)?[_c('BasicInstructions',{attrs:{\"instruction_text\":_vm.gettext('This app will show you a series of 4 and 6 images of objects. After the cross, the app will ask you whether you have seen an object. After replying, you will see another cross and you can forget everything before starting with the next group of objects. Do your best as fast as possible.'),\"second_text\":_vm.gettext('Please ensure you have a stable internet connection before continuing.'),\"bold_text\":_vm.gettext('Do not use the back button as it will restart the test.'),\"bold_text_class\":\"text-white\"},on:{\"next\":_vm.incrementStep}})]:(_vm.step === 1)?[_c('SeriesQuestion',{key:_vm.question_num,attrs:{\"question_num\":_vm.question_num,\"question_total\":_vm.max_questions,\"time_interval\":_vm.json_data.display_seconds * 1000,\"question_obj\":_vm.json_data.questions[_vm.question_num],\"stimuli_separator\":_vm.stimuli_separator},on:{\"submission\":_vm.nextQuestion}})]:_vm._e()],2)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[_c('div',{staticClass:\"justify-content-end\"},[_c('p',{staticClass:\"text-right mx-2\"},[_vm._v(_vm._s(_vm.question_num+1)+\"/\"+_vm._s(_vm.question_total))])]),_c('div',{staticClass:\"d-flex justify-content-center\"},[(_vm.step === 0)?[_c('div',{staticClass:\"img-container\"},[_c('BasicStimuliImage',{attrs:{\"image_url\":this.stimuli_separator,\"id\":\"image-separator\"}}),_vm._l((_vm.question_obj.stimuli),function(img,index){return _c('BasicStimuliImage',{key:img.image,attrs:{\"image_url\":img.image,\"id\":`image-${index}`}})})],2)]:(_vm.step === 1)?[_c('div',[_c('p',{staticClass:\"max-width-750 mx-auto d-non d-sm-block d-lg-none\"},[_c('strong',[_c('u',[_vm._v(_vm._s(_vm.gettext(\"Make sure you scroll down to see all question options!\")))])])]),_c('div',{staticClass:\"img-container\"},[_c('BasicStimuliImage',{attrs:{\"image_url\":_vm.question_obj.prompt}})],1),_c('div',[_c('p',[_vm._v(_vm._s(_vm.gettext(\"Did you see this object?\")))]),_c('div',{staticClass:\"btn-group d-flex my-3\",attrs:{\"role\":\"group\"}},[_c('button',{staticClass:\"btn btn-lg btn-primary mx-3\",attrs:{\"name\":'user_response',\"value\":'yes'},on:{\"click\":_vm.nextQuestion}},[_vm._v(_vm._s(_vm.gettext(\"Yes\")))]),_c('button',{staticClass:\"btn btn-lg btn-primary mx-3\",attrs:{\"name\":'user_response',\"value\":'no'},on:{\"click\":_vm.nextQuestion}},[_vm._v(_vm._s(_vm.gettext(\"No\")))])])]),_c('QuestionTimer',{key:`timer-${_vm.question_obj}-${_vm.question_num}`,ref:\"questionTimer\",attrs:{\"timeSeconds\":10},on:{\"timeout\":_vm.handleTimeout}})],1)]:(_vm.step === 2)?[_c('BasicInstructions',{attrs:{\"instruction_text\":_vm.gettext('The question was not answered within the allowed time, please press continue to move to the next question.'),\"display_bottom_button\":true,\"bottom_button_text\":\"Continue\",\"left_text\":true},on:{\"next\":_vm.handleQuestionSkip}})]:_vm._e()],2)])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n    <div>\n        <div class=\"justify-content-end\">\n            <p class=\"text-right mx-2\">{{question_num+1}}/{{question_total}}</p>\n        </div>\n        <div class=\"d-flex justify-content-center\">\n            <template v-if=\"step === 0\">\n                <div class=\"img-container\">\n                    <BasicStimuliImage :image_url=\"this.stimuli_separator\" id=\"image-separator\"></BasicStimuliImage>\n                    <BasicStimuliImage v-for=\"(img, index) in question_obj.stimuli\"\n                                       :key=\"img.image\"\n                                       :image_url=\"img.image\"\n                                       :id=\"`image-${index}`\">\n                    </BasicStimuliImage>\n                </div>\n            </template>\n\n            <template v-else-if=\"step === 1\">\n                <div>\n                    <p class=\"max-width-750 mx-auto d-non d-sm-block d-lg-none\"><strong><u>{{ gettext(\"Make sure you scroll down to see all question options!\") }}</u></strong></p>\n                    <div class=\"img-container\">\n\n                        <BasicStimuliImage :image_url=\"question_obj.prompt\"></BasicStimuliImage>\n                    </div>\n                    <div>\n                        <p>{{ gettext(\"Did you see this object?\") }}</p>\n                        <div class=\"btn-group d-flex my-3\" role=\"group\">\n                            <button class=\"btn btn-lg btn-primary mx-3\"\n                                    :name=\"'user_response'\"\n                                    :value=\"'yes'\"\n                                    v-on:click=\"nextQuestion\">{{ gettext(\"Yes\") }}</button>\n                            <button class=\"btn btn-lg btn-primary mx-3\"\n                                    :name=\"'user_response'\"\n                                    :value=\"'no'\"\n                                    v-on:click=\"nextQuestion\">{{ gettext(\"No\") }}</button>\n                        </div>\n                    </div>\n                  <QuestionTimer\n                      :timeSeconds=\"10\"\n                      ref=\"questionTimer\"\n                      :key=\"`timer-${question_obj}-${question_num}`\"\n                      @timeout=\"handleTimeout\"\n                  />\n                </div>\n            </template>\n          <template v-else-if=\"step === 2\">\n          <BasicInstructions v-bind:instruction_text=\"gettext('The question was not answered within the allowed time, please press continue to move to the next question.')\"\n                             :display_bottom_button=\"true\"\n                             bottom_button_text=\"Continue\"\n                             :left_text=\"true\"\n                             @next=\"handleQuestionSkip\"\n          />\n        </template>\n        </div>\n    </div>\n</template>\n\n<script>\n\n    import timing from \"../timing\";\n    import BasicStimuliImage from \"./BasicStimuliImage\";\n    import BasicInstructions from \"@/components/BasicInstructions.vue\";\n    import QuestionTimer from \"@/components/utils/QuestionTimer.vue\";\n\n    export default {\n        name: \"SeriesQuestion\",\n        components: {QuestionTimer, BasicInstructions, BasicStimuliImage},\n        mixins: [timing],\n        props: [\"question_num\", \"question_total\", \"time_interval\", \"question_obj\", \"stimuli_separator\"],\n\n        mounted: function() {\n            // Don't record start time here because we show an interval of objs first. Show start time at end of the interval\n            // this.recordStartTime()\n\n            this.max_stimuli = this.question_obj.stimuli.length;\n            this.hidePreloadedImages();\n            this.interval_obj = setInterval(this.updateStimuli, this.time_interval);\n        },\n\n        data: function() {\n            return {\n                time_start: 0,\n                time_end: 0,\n                step: 0,\n                stimuli_num: 0,\n                max_stimuli: 0,\n                interval_obj: null,\n                user_response: null,\n                is_correct: null,\n                response_time: 0,\n                skipped: false,\n            }\n        },\n\n        methods: {\n            incrementStep: function(event) {\n                this.step++;\n            },\n            decrementStep: function(event) {\n                this.step--;\n            },\n\n            hidePreloadedImages: function(event) {\n                for(let i=0; i < this.max_stimuli; i++) {\n                    let element = document.getElementById(`image-${i}`);\n                    element.className += \" d-none\"\n                }\n            },\n\n            hideImage: function(element_id) {\n                let element = document.getElementById(element_id);\n                element.className += \" d-none\";\n            },\n\n            showImage: function(element_id) {\n                let element = document.getElementById(element_id);\n                element.className = \"img-stimuli\"\n            },\n\n            updateStimuli: function(event) {\n                if(this.stimuli_num < this.max_stimuli) {\n                    this.showImage(`image-${this.stimuli_num}`);\n                    this.hideImage(this.stimuli_num === 0 ? \"image-separator\" : `image-${this.stimuli_num-1}`);\n                }\n                else if(this.stimuli_num === this.max_stimuli) {\n                    this.showImage(\"image-separator\");\n                    this.hideImage(`image-${this.stimuli_num-1}`)\n                }\n                else {\n                    this.hideImage('image-separator');\n                    clearTimeout(this.interval_obj);\n                    this.incrementStep();\n                    this.recordStartTime();\n                }\n                this.stimuli_num++;\n            },\n\n            nextQuestion: function(event) {\n                this.recordEndTime();\n                this.user_response = event.target.value;\n                this.validateAnswer();\n                this.response_time = this.getTimeDiff();\n\n                this.$emit(\"submission\", this.createResults());\n            },\n            validateAnswer: function(event) {\n                let yes_correct = this.user_response === \"yes\" && this.question_obj.is_prompt_correct;\n                let no_correct = this.user_response === 'no' && !this.question_obj.is_prompt_correct;\n                this.is_correct = (yes_correct || no_correct);\n            },\n\n            createResults: function(event) {\n                return {\n                    id: this.question_obj.id,\n                    name: this.question_obj.name,\n                    group: this.question_obj.group,\n                    is_correct: this.is_correct,\n                    user_response: this.user_response,\n                    response_time: this.response_time,\n                    stimuli_length: this.question_obj.stimuli.length,\n                    skipped: this.skipped,\n                }\n            },\n\n          handleTimeout() {\n            this.step += 1\n          },\n          handleQuestionSkip() {\n            this.step = 1\n            this.is_correct = false\n            this.skipped = true\n            this.user_response = \"Skipped\"\n            this.$emit(\"submission\", this.createResults());\n          },\n\n        }\n    }\n</script>\n\n<style scoped>\n    .img-container {\n        border: 8px solid black\n    }\n\n</style>","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./SeriesQuestion.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./SeriesQuestion.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./SeriesQuestion.vue?vue&type=template&id=06929814&scoped=true\"\nimport script from \"./SeriesQuestion.vue?vue&type=script&lang=js\"\nexport * from \"./SeriesQuestion.vue?vue&type=script&lang=js\"\nimport style0 from \"./SeriesQuestion.vue?vue&type=style&index=0&id=06929814&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"06929814\",\n  null\n  \n)\n\nexport default component.exports","<template>\n    <div class=\"container p-3\" id=\"series-container\">\n        <template v-if=\"step === 0\">\n            <BasicInstructions :instruction_text=\"gettext('This app will show you a series of 4 and 6 images of objects. After the cross, the app will ask you whether you have seen an object. After replying, you will see another cross and you can forget everything before starting with the next group of objects. Do your best as fast as possible.')\"\n                               :second_text=\"gettext('Please ensure you have a stable internet connection before continuing.')\"\n                               :bold_text=\"gettext('Do not use the back button as it will restart the test.')\"\n                               bold_text_class=\"text-white\"\n                               v-on:next=\"incrementStep\">\n            </BasicInstructions>\n        </template>\n\n        <template v-else-if=\"step === 1\">\n            <SeriesQuestion :key=\"question_num\"\n                            :question_num=\"question_num\"\n                            :question_total=\"max_questions\"\n                            :time_interval=\"json_data.display_seconds * 1000\"\n                            :question_obj=\"json_data.questions[question_num]\"\n                            :stimuli_separator=\"stimuli_separator\"\n                            v-on:submission=\"nextQuestion\">\n            </SeriesQuestion>\n        </template>\n    </div>\n</template>\n\n<script>\n    import { FIXATION_CROSS } from \"@/practiceData\";\n    import BasicInstructions from \"./BasicInstructions\";\n    import SeriesQuestion from \"./SeriesQuestion\";\n\n    import \"whatwg-fetch\"\n\n    export default {\n        name: \"SeriesDriver\",\n        components: {SeriesQuestion, BasicInstructions},\n        props: [\"json_data\"],\n        mounted: function() {\n            this.max_questions = this.json_data.questions.length;\n            this.test_id = this.json_data.id;\n            this.test_type = this.json_data.test_type;\n            const results = this.json_data.results\n            const result_test_num = this.json_data.test_number - 1\n            if(results && results.length >= this.json_data.test_number) {\n              const result_data = this.json_data.results[result_test_num];\n              this.processInitialData(result_data)\n            }\n        },\n\n        data: function() {\n            return {\n                step: 0,\n                test_id: null,\n                test_type: null,\n                question_num: 0,\n                max_questions: 0,\n                user_responses: [],\n                stimuli_separator: FIXATION_CROSS,\n                complete: false,\n                groups_obj: {},\n                averages: {},\n            }\n        },\n\n        methods: {\n            incrementStep: function(event) {\n                this.step++;\n                if(this.step >= 2) {\n                    // Need to let the data update from the \"submit\" emit to avoid race conditions, \"complete\" will resubmit with an updated flag.\n                    this.$nextTick(() => {\n                      this.$emit(\"complete\");\n                    })\n\n                }\n            },\n            decrementStep: function(event) {\n                this.step--;\n            },\n\n            nextQuestion: function(results) {\n                this.user_responses.push(results);\n                this.question_num++;\n                let submit_emit_type = \"SERIES_NEXT_QUESTION_SUBMIT\"\n                if(this.question_num >= this.max_questions) {\n                    this.getGroups();\n                    this.calculateAvgs();\n                    this.complete = true;\n                    this.incrementStep();\n                    submit_emit_type = \"SERIES_DRIVER_COMPLETE_SUBMIT\"\n                }\n                // Emit the submission on every question for partial data collection\n                this.$emit(\"submission\", this.createResult(), submit_emit_type, this.complete);\n            },\n            processInitialData: function(savedResults = null) {\n                // If we have saved results, restore the state from them\n                if (savedResults) {\n                    // Restore current step\n                    this.step = savedResults.current_step || 0;\n\n                    // Restore current question number\n                    this.question_num = savedResults.question_num || 0;\n\n                    // Restore completion status\n                    this.complete = savedResults.is_complete || false;\n\n                    // Restore user responses array\n                    this.user_responses = savedResults.user_results || [];\n\n                    // Restore groups object\n                    this.groups_obj = savedResults.groups_obj || {};\n\n                    // Restore averages\n                    this.averages = savedResults.averages || {};\n\n                } else {\n                    // No saved results, ensure we start fresh\n                    this.step = 0;\n                    this.question_num = 0;\n                    this.complete = false;\n                    this.user_responses = [];\n                    this.groups_obj = {};\n                    this.averages = {};\n\n                }\n            },\n            createResult: function(event) {\n              let total_skipped = 0\n              for(let group in this.groups_obj) {\n                total_skipped += this.groups_obj[group].total_skipped\n              }\n                return {\n                    current_step: this.step,\n                    question_num: this.question_num,\n                    test_id: this.test_id,\n                    test_type: this.test_type,\n                    is_complete: this.complete,\n                    user_results: this.user_responses,\n                    groups_obj: this.groups_obj,\n                    averages: this.averages,\n                    total_skipped: total_skipped,\n                }\n            },\n\n            getGroups: function() {\n                for(let response of this.user_responses) {\n                    // If this group already exists\n                    let group_name = `${response.group}_${response.stimuli_length}`;\n                    if(group_name in this.groups_obj) {\n                        this.groups_obj[group_name].num_total++;\n                        this.groups_obj[group_name].cum_response_time += response.response_time;\n                        if(response.is_correct) {\n                            this.groups_obj[group_name].num_correct++;\n                            this.groups_obj[group_name].cum_response_time_corr += response.response_time;\n                        }\n                        else {\n                            if(response.skipped) {\n                              this.groups_obj[group_name].total_skipped += 1\n                            } else {\n                              // Don't add response times of skipped questions\n                              this.groups_obj[group_name].cum_response_time_wrong += response.response_time;\n                            }\n                        }\n                    } // Otherwise make the group\n                    else {\n                        this.groups_obj[group_name] = {\n                            num_total: 1,\n                            num_correct: response.is_correct ? 1 : 0,\n                            cum_response_time: response.response_time,\n                            cum_response_time_corr: response.is_correct ? response.response_time : 0,\n                            cum_response_time_wrong: response.is_correct ? 0 : response.response_time,\n                            total_skipped: response.skipped ? 1 : 0\n                        }\n                    }\n                }\n            },\n\n            calculateAvgs: function() {\n                for(let group in this.groups_obj) {\n                    let num_wrong = this.groups_obj[group].num_total - this.groups_obj[group].num_correct - this.groups_obj[group].total_skipped;\n                    this.averages[group] = {\n                        num_correct: this.groups_obj[group].num_correct,\n                        num_total: this.groups_obj[group].num_total,\n                        total_skipped: this.groups_obj[group].total_skipped,\n                        avg_rt: this.groups_obj[group].cum_response_time / this.groups_obj[group].num_total,\n                        avg_corr_rt: this.groups_obj[group].cum_response_time_corr / (this.groups_obj[group].num_correct > 0 ? this.groups_obj[group].num_correct : 1),\n                        avg_wrong_rt: this.groups_obj[group].cum_response_time_wrong / (num_wrong > 0 ? num_wrong : 1),\n                    }\n                }\n            }\n\n        }\n    }\n</script>\n\n<style scoped>\n    #series-container {\n        color: white;\n    }\n</style>","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./SeriesDriver.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./SeriesDriver.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./SeriesDriver.vue?vue&type=template&id=24fc97ca&scoped=true\"\nimport script from \"./SeriesDriver.vue?vue&type=script&lang=js\"\nexport * from \"./SeriesDriver.vue?vue&type=script&lang=js\"\nimport style0 from \"./SeriesDriver.vue?vue&type=style&index=0&id=24fc97ca&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"24fc97ca\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"p-3\"},[_c('form',{class:(_vm.validated ? 'was-validated ': '') +'needs-validation',attrs:{\"novalidate\":\"\"},on:{\"submit\":_vm.formSubmit}},[_c('div',{staticClass:\"form-group\"},[_c('div',{staticClass:\"row\"},[_c('label',{staticClass:\"col-sm-3 col-form-label\",attrs:{\"for\":\"participant-id\"}},[_vm._v(_vm._s(_vm.gettext(\"Participant ID:\")))]),_c('div',{staticClass:\"col-sm-9\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.participant_id),expression:\"participant_id\"}],staticClass:\"form-control\",attrs:{\"type\":\"text\",\"autocomplete\":\"off\",\"name\":\"participant-id\",\"id\":\"participant-id\",\"aria-describedby\":\"participant_help\",\"oninput\":\"let p=this.selectionStart;this.value=this.value.toUpperCase();this.setSelectionRange(p, p);\"},domProps:{\"value\":(_vm.participant_id)},on:{\"input\":function($event){if($event.target.composing)return;_vm.participant_id=$event.target.value}}}),_c('small',{staticClass:\"form-text text-muted text-left px-2\",attrs:{\"id\":\"participant_help\"}},[_vm._v(_vm._s(_vm.gettext(\"If you've been given a Participant ID please enter it, otherwise leave blank\")))])])])]),_c('div',{staticClass:\"form-group row\"},[_c('label',{staticClass:\"col-sm-3 col-form-label\",attrs:{\"for\":\"age\"}},[_vm._v(_vm._s(_vm.gettext(\"Age:\")))]),_c('div',{staticClass:\"col-sm-9\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.age),expression:\"age\"}],staticClass:\"form-control\",attrs:{\"type\":\"number\",\"name\":\"age\",\"id\":\"age\",\"aria-describedby\":\"age_help\"},domProps:{\"value\":(_vm.age)},on:{\"input\":function($event){if($event.target.composing)return;_vm.age=$event.target.value}}}),_c('small',{staticClass:\"form-text text-muted text-left px-2\",attrs:{\"id\":\"age_help\"}},[_vm._v(_vm._s(_vm.gettext(\"Enter your age in terms of years\")))]),_c('div',{staticClass:\"invalid-feedback\"},[_vm._v(\" \"+_vm._s(_vm.gettext(_vm.errors.age))+\" \")])])]),_c('div',{staticClass:\"form-group row\"},[_c('label',{staticClass:\"col-sm-3 col-form-label\",attrs:{\"for\":\"education\"}},[_vm._v(_vm._s(_vm.gettext(\"Education:\")))]),_c('div',{staticClass:\"col-sm-9\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.education),expression:\"education\"}],staticClass:\"form-control\",attrs:{\"type\":\"number\",\"id\":\"education\",\"aria-describedby\":\"education_help\"},domProps:{\"value\":(_vm.education)},on:{\"input\":function($event){if($event.target.composing)return;_vm.education=$event.target.value}}}),_c('small',{staticClass:\"form-text text-muted text-left px-2\",attrs:{\"id\":\"education_help\"}},[_vm._v(_vm._s(_vm.gettext(\"Enter number of years of schooling completed starting with primary school\")))]),_c('div',{staticClass:\"invalid-feedback\"},[_vm._v(\" \"+_vm._s(_vm.gettext(_vm.errors.education))+\" \")])])]),_c('div',{staticClass:\"form-group row\"},[_c('label',{staticClass:\"col-sm-3 col-form-label\",attrs:{\"for\":\"sex\"}},[_vm._v(_vm._s(_vm.gettext(\"Sex:\")))]),_c('div',{staticClass:\"col-sm-9\"},[_c('select',{staticClass:\"custom-select\",attrs:{\"id\":\"sex\"},on:{\"change\":_vm.updateSex}},[_c('option',{attrs:{\"selected\":\"\",\"disabled\":\"\"},domProps:{\"value\":''}},[_vm._v(_vm._s(_vm.gettext('Please Select')))]),_c('option',{domProps:{\"value\":'male'}},[_vm._v(_vm._s(_vm.gettext(\"Male\")))]),_c('option',{domProps:{\"value\":'female'}},[_vm._v(_vm._s(_vm.gettext(\"Female\")))]),_c('option',{domProps:{\"value\":'Unknown'}},[_vm._v(_vm._s(_vm.gettext(\"Prefer not to say\")))])]),_c('div',{staticClass:\"invalid-feedback\"},[_vm._v(\" \"+_vm._s(_vm.gettext(_vm.errors.sex))+\" \")])])]),(_vm.ask_country)?_c('CountrySelect',{attrs:{\"errors\":_vm.errors.country},on:{\"country-selection\":_vm.updateCountry}}):_vm._e(),(_vm.ask_ethnicity)?_c('div',{staticClass:\"form-group row\"},[_c('label',{staticClass:\"col-sm-3 col-form-label\",attrs:{\"for\":\"ethnicity\"}},[_vm._v(_vm._s(_vm.gettext(\"Ethnicity:\")))]),_c('div',{staticClass:\"col-sm-9\"},[_c('select',{staticClass:\"custom-select\",attrs:{\"id\":\"ethnicity\"},on:{\"change\":_vm.updateEthnicity}},[_c('option',{attrs:{\"selected\":\"\",\"disabled\":\"\"},domProps:{\"value\":''}},[_vm._v(_vm._s(_vm.gettext('Please Select')))]),_c('option',{domProps:{\"value\":'American Indian or Alaska Native'}},[_vm._v(_vm._s(_vm.gettext(\"American Indian or Alaska Native\")))]),_c('option',{domProps:{\"value\":'Asian'}},[_vm._v(_vm._s(_vm.gettext(\"Asian\")))]),_c('option',{domProps:{\"value\":'Black or African American'}},[_vm._v(_vm._s(_vm.gettext(\"Black or African American\")))]),_c('option',{domProps:{\"value\":'Hispanic or Latino'}},[_vm._v(_vm._s(_vm.gettext(\"Hispanic or Latino\")))]),_c('option',{domProps:{\"value\":'Native Hawaiian or Other Pacific Islander'}},[_vm._v(_vm._s(_vm.gettext(\"Native Hawaiian or Other Pacific Islander\")))]),_c('option',{domProps:{\"value\":'White'}},[_vm._v(_vm._s(_vm.gettext(\"White\")))]),_c('option',{domProps:{\"value\":'Other'}},[_vm._v(_vm._s(_vm.gettext(\"Other\")))])]),_c('div',{staticClass:\"invalid-feedback\"},[_vm._v(\" \"+_vm._s(_vm.gettext(_vm.errors.ethnicity))+\" \")])])]):_vm._e(),_c('div',{staticClass:\"form-group row\"},[_c('label',{staticClass:\"col-sm-3 col-form-label\",attrs:{\"for\":\"week-number\"}},[_vm._v(_vm._s(_vm.gettext(\"Week Number:\")))]),_c('div',{staticClass:\"col-sm-9\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.week_number),expression:\"week_number\"}],staticClass:\"form-control\",attrs:{\"type\":\"number\",\"name\":\"week-number\",\"id\":\"week-number\"},domProps:{\"value\":(_vm.week_number)},on:{\"input\":function($event){if($event.target.composing)return;_vm.week_number=$event.target.value}}}),_c('div',{staticClass:\"invalid-feedback\"},[_vm._v(\" \"+_vm._s(_vm.gettext(_vm.errors.week_number))+\" \")])])]),_c('div',{staticClass:\"form-group row\"},[_c('label',{staticClass:\"col-sm-3 col-form-label\",attrs:{\"for\":\"part\"}},[_vm._v(_vm._s(_vm.gettext(\"Part:\")))]),_c('div',{staticClass:\"col-sm-9\"},[_c('select',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.part),expression:\"part\"}],staticClass:\"custom-select\",attrs:{\"id\":\"part\"},on:{\"change\":function($event){var $$selectedVal = Array.prototype.filter.call($event.target.options,function(o){return o.selected}).map(function(o){var val = \"_value\" in o ? o._value : o.value;return val}); _vm.part=$event.target.multiple ? $$selectedVal : $$selectedVal[0]}}},[_c('option',{domProps:{\"value\":null}},[_vm._v(_vm._s(_vm.gettext('Please Select')))]),_c('option',{domProps:{\"value\":'1'}},[_vm._v(_vm._s(_vm.gettext(\"Part 1\")))]),_c('option',{domProps:{\"value\":'2'}},[_vm._v(_vm._s(_vm.gettext(\"Part 2\")))])])])]),_c('button',{staticClass:\"btn btn-lg btn-primary my-2\",attrs:{\"type\":\"submit\"}},[_vm._v(_vm._s(_vm.gettext('OK')))])],1),(_vm.getting_id)?[_c('p',[_vm._v(_vm._s(_vm.gettext(\"Generating Participant ID, you will be redirected shortly!\")))])]:_vm._e()],2)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"form-group row\"},[_c('label',{staticClass:\"col-sm-3 col-form-label\",attrs:{\"for\":\"country\"}},[_vm._v(_vm._s(_vm.gettext(\"Country: \")))]),_c('div',{staticClass:\"col-sm-9\"},[_c('select',{staticClass:\"custom-select\",attrs:{\"id\":\"country\",\"name\":\"country\"},on:{\"change\":_vm.selectChange}},[_c('option',{attrs:{\"selected\":\"\",\"disabled\":\"\"},domProps:{\"value\":''}},[_vm._v(_vm._s(_vm.gettext('Please Select')))]),_c('option',{domProps:{\"value\":'Afghanistan'}},[_vm._v(\"Afghanistan\")]),_c('option',{domProps:{\"value\":'Albania'}},[_vm._v(\"Albania\")]),_c('option',{domProps:{\"value\":'Algeria'}},[_vm._v(\"Algeria\")]),_c('option',{domProps:{\"value\":'Andorra'}},[_vm._v(\"Andorra\")]),_c('option',{domProps:{\"value\":'Angola'}},[_vm._v(\"Angola\")]),_c('option',{domProps:{\"value\":'Antigua & Deps'}},[_vm._v(\"Antigua & Deps\")]),_c('option',{domProps:{\"value\":'Argentina'}},[_vm._v(\"Argentina\")]),_c('option',{domProps:{\"value\":'Armenia'}},[_vm._v(\"Armenia\")]),_c('option',{domProps:{\"value\":'Australia'}},[_vm._v(\"Australia\")]),_c('option',{domProps:{\"value\":'Austria'}},[_vm._v(\"Austria\")]),_c('option',{domProps:{\"value\":'Azerbaijan'}},[_vm._v(\"Azerbaijan\")]),_c('option',{domProps:{\"value\":'Bahamas'}},[_vm._v(\"Bahamas\")]),_c('option',{domProps:{\"value\":'Bahrain'}},[_vm._v(\"Bahrain\")]),_c('option',{domProps:{\"value\":'Bangladesh'}},[_vm._v(\"Bangladesh\")]),_c('option',{domProps:{\"value\":'Barbados'}},[_vm._v(\"Barbados\")]),_c('option',{domProps:{\"value\":'Belarus'}},[_vm._v(\"Belarus\")]),_c('option',{domProps:{\"value\":'Belgium'}},[_vm._v(\"Belgium\")]),_c('option',{domProps:{\"value\":'Belize'}},[_vm._v(\"Belize\")]),_c('option',{domProps:{\"value\":'Benin'}},[_vm._v(\"Benin\")]),_c('option',{domProps:{\"value\":'Bhutan'}},[_vm._v(\"Bhutan\")]),_c('option',{domProps:{\"value\":'Bolivia'}},[_vm._v(\"Bolivia\")]),_c('option',{domProps:{\"value\":'Bosnia Herzegovina'}},[_vm._v(\"Bosnia Herzegovina\")]),_c('option',{domProps:{\"value\":'Botswana'}},[_vm._v(\"Botswana\")]),_c('option',{domProps:{\"value\":'Brazil'}},[_vm._v(\"Brazil\")]),_c('option',{domProps:{\"value\":'Brunei'}},[_vm._v(\"Brunei\")]),_c('option',{domProps:{\"value\":'Bulgaria'}},[_vm._v(\"Bulgaria\")]),_c('option',{domProps:{\"value\":'Burkina'}},[_vm._v(\"Burkina\")]),_c('option',{domProps:{\"value\":'Burundi'}},[_vm._v(\"Burundi\")]),_c('option',{domProps:{\"value\":'Cambodia'}},[_vm._v(\"Cambodia\")]),_c('option',{domProps:{\"value\":'Cameroon'}},[_vm._v(\"Cameroon\")]),_c('option',{domProps:{\"value\":'Canada'}},[_vm._v(\"Canada\")]),_c('option',{domProps:{\"value\":'Cape Verde'}},[_vm._v(\"Cape Verde\")]),_c('option',{domProps:{\"value\":'Central African Rep'}},[_vm._v(\"Central African Rep\")]),_c('option',{domProps:{\"value\":'Chad'}},[_vm._v(\"Chad\")]),_c('option',{domProps:{\"value\":'Chile'}},[_vm._v(\"Chile\")]),_c('option',{domProps:{\"value\":'China'}},[_vm._v(\"China\")]),_c('option',{domProps:{\"value\":'Colombia'}},[_vm._v(\"Colombia\")]),_c('option',{domProps:{\"value\":'Comoros'}},[_vm._v(\"Comoros\")]),_c('option',{domProps:{\"value\":'Congo'}},[_vm._v(\"Congo\")]),_c('option',{domProps:{\"value\":'Congo {Democratic Rep}'}},[_vm._v(\"Congo {Democratic Rep}\")]),_c('option',{domProps:{\"value\":'Costa Rica'}},[_vm._v(\"Costa Rica\")]),_c('option',{domProps:{\"value\":'Croatia'}},[_vm._v(\"Croatia\")]),_c('option',{domProps:{\"value\":'Cuba'}},[_vm._v(\"Cuba\")]),_c('option',{domProps:{\"value\":'Cyprus'}},[_vm._v(\"Cyprus\")]),_c('option',{domProps:{\"value\":'Czech Republic'}},[_vm._v(\"Czech Republic\")]),_c('option',{domProps:{\"value\":'Denmark'}},[_vm._v(\"Denmark\")]),_c('option',{domProps:{\"value\":'Djibouti'}},[_vm._v(\"Djibouti\")]),_c('option',{domProps:{\"value\":'Dominica'}},[_vm._v(\"Dominica\")]),_c('option',{domProps:{\"value\":'Dominican Republic'}},[_vm._v(\"Dominican Republic\")]),_c('option',{domProps:{\"value\":'East Timor'}},[_vm._v(\"East Timor\")]),_c('option',{domProps:{\"value\":'Ecuador'}},[_vm._v(\"Ecuador\")]),_c('option',{domProps:{\"value\":'Egypt'}},[_vm._v(\"Egypt\")]),_c('option',{domProps:{\"value\":'El Salvador'}},[_vm._v(\"El Salvador\")]),_c('option',{domProps:{\"value\":'Equatorial Guinea'}},[_vm._v(\"Equatorial Guinea\")]),_c('option',{domProps:{\"value\":'Eritrea'}},[_vm._v(\"Eritrea\")]),_c('option',{domProps:{\"value\":'Estonia'}},[_vm._v(\"Estonia\")]),_c('option',{domProps:{\"value\":'Ethiopia'}},[_vm._v(\"Ethiopia\")]),_c('option',{domProps:{\"value\":'Fiji'}},[_vm._v(\"Fiji\")]),_c('option',{domProps:{\"value\":'Finland'}},[_vm._v(\"Finland\")]),_c('option',{domProps:{\"value\":'France'}},[_vm._v(\"France\")]),_c('option',{domProps:{\"value\":'Gabon'}},[_vm._v(\"Gabon\")]),_c('option',{domProps:{\"value\":'Gambia'}},[_vm._v(\"Gambia\")]),_c('option',{domProps:{\"value\":'Georgia'}},[_vm._v(\"Georgia\")]),_c('option',{domProps:{\"value\":'Germany'}},[_vm._v(\"Germany\")]),_c('option',{domProps:{\"value\":'Ghana'}},[_vm._v(\"Ghana\")]),_c('option',{domProps:{\"value\":'Greece'}},[_vm._v(\"Greece\")]),_c('option',{domProps:{\"value\":'Grenada'}},[_vm._v(\"Grenada\")]),_c('option',{domProps:{\"value\":'Guatemala'}},[_vm._v(\"Guatemala\")]),_c('option',{domProps:{\"value\":'Guinea'}},[_vm._v(\"Guinea\")]),_c('option',{domProps:{\"value\":'Guinea-Bissau'}},[_vm._v(\"Guinea-Bissau\")]),_c('option',{domProps:{\"value\":'Guyana'}},[_vm._v(\"Guyana\")]),_c('option',{domProps:{\"value\":'Haiti'}},[_vm._v(\"Haiti\")]),_c('option',{domProps:{\"value\":'Honduras'}},[_vm._v(\"Honduras\")]),_c('option',{domProps:{\"value\":'Hungary'}},[_vm._v(\"Hungary\")]),_c('option',{domProps:{\"value\":'Iceland'}},[_vm._v(\"Iceland\")]),_c('option',{domProps:{\"value\":'India'}},[_vm._v(\"India\")]),_c('option',{domProps:{\"value\":'Indonesia'}},[_vm._v(\"Indonesia\")]),_c('option',{domProps:{\"value\":'Iran'}},[_vm._v(\"Iran\")]),_c('option',{domProps:{\"value\":'Iraq'}},[_vm._v(\"Iraq\")]),_c('option',{domProps:{\"value\":'Ireland {Republic}'}},[_vm._v(\"Ireland {Republic}\")]),_c('option',{domProps:{\"value\":'Israel'}},[_vm._v(\"Israel\")]),_c('option',{domProps:{\"value\":'Italy'}},[_vm._v(\"Italy\")]),_c('option',{domProps:{\"value\":'Ivory Coast'}},[_vm._v(\"Ivory Coast\")]),_c('option',{domProps:{\"value\":'Jamaica'}},[_vm._v(\"Jamaica\")]),_c('option',{domProps:{\"value\":'Japan'}},[_vm._v(\"Japan\")]),_c('option',{domProps:{\"value\":'Jordan'}},[_vm._v(\"Jordan\")]),_c('option',{domProps:{\"value\":'Kazakhstan'}},[_vm._v(\"Kazakhstan\")]),_c('option',{domProps:{\"value\":'Kenya'}},[_vm._v(\"Kenya\")]),_c('option',{domProps:{\"value\":'Kiribati'}},[_vm._v(\"Kiribati\")]),_c('option',{domProps:{\"value\":'Korea North'}},[_vm._v(\"Korea North\")]),_c('option',{domProps:{\"value\":'Korea South'}},[_vm._v(\"Korea South\")]),_c('option',{domProps:{\"value\":'Kosovo'}},[_vm._v(\"Kosovo\")]),_c('option',{domProps:{\"value\":'Kuwait'}},[_vm._v(\"Kuwait\")]),_c('option',{domProps:{\"value\":'Kyrgyzstan'}},[_vm._v(\"Kyrgyzstan\")]),_c('option',{domProps:{\"value\":'Laos'}},[_vm._v(\"Laos\")]),_c('option',{domProps:{\"value\":'Latvia'}},[_vm._v(\"Latvia\")]),_c('option',{domProps:{\"value\":'Lebanon'}},[_vm._v(\"Lebanon\")]),_c('option',{domProps:{\"value\":'Lesotho'}},[_vm._v(\"Lesotho\")]),_c('option',{domProps:{\"value\":'Liberia'}},[_vm._v(\"Liberia\")]),_c('option',{domProps:{\"value\":'Libya'}},[_vm._v(\"Libya\")]),_c('option',{domProps:{\"value\":'Liechtenstein'}},[_vm._v(\"Liechtenstein\")]),_c('option',{domProps:{\"value\":'Lithuania'}},[_vm._v(\"Lithuania\")]),_c('option',{domProps:{\"value\":'Luxembourg'}},[_vm._v(\"Luxembourg\")]),_c('option',{domProps:{\"value\":'Macedonia'}},[_vm._v(\"Macedonia\")]),_c('option',{domProps:{\"value\":'Madagascar'}},[_vm._v(\"Madagascar\")]),_c('option',{domProps:{\"value\":'Malawi'}},[_vm._v(\"Malawi\")]),_c('option',{domProps:{\"value\":'Malaysia'}},[_vm._v(\"Malaysia\")]),_c('option',{domProps:{\"value\":'Maldives'}},[_vm._v(\"Maldives\")]),_c('option',{domProps:{\"value\":'Mali'}},[_vm._v(\"Mali\")]),_c('option',{domProps:{\"value\":'Malta'}},[_vm._v(\"Malta\")]),_c('option',{domProps:{\"value\":'Marshall Islands'}},[_vm._v(\"Marshall Islands\")]),_c('option',{domProps:{\"value\":'Mauritania'}},[_vm._v(\"Mauritania\")]),_c('option',{domProps:{\"value\":'Mauritius'}},[_vm._v(\"Mauritius\")]),_c('option',{domProps:{\"value\":'Mexico'}},[_vm._v(\"Mexico\")]),_c('option',{domProps:{\"value\":'Micronesia'}},[_vm._v(\"Micronesia\")]),_c('option',{domProps:{\"value\":'Moldova'}},[_vm._v(\"Moldova\")]),_c('option',{domProps:{\"value\":'Monaco'}},[_vm._v(\"Monaco\")]),_c('option',{domProps:{\"value\":'Mongolia'}},[_vm._v(\"Mongolia\")]),_c('option',{domProps:{\"value\":'Montenegro'}},[_vm._v(\"Montenegro\")]),_c('option',{domProps:{\"value\":'Morocco'}},[_vm._v(\"Morocco\")]),_c('option',{domProps:{\"value\":'Mozambique'}},[_vm._v(\"Mozambique\")]),_c('option',{domProps:{\"value\":'Myanmar, {Burma}'}},[_vm._v(\"Myanmar, {Burma}\")]),_c('option',{domProps:{\"value\":'Namibia'}},[_vm._v(\"Namibia\")]),_c('option',{domProps:{\"value\":'Nauru'}},[_vm._v(\"Nauru\")]),_c('option',{domProps:{\"value\":'Nepal'}},[_vm._v(\"Nepal\")]),_c('option',{domProps:{\"value\":'Netherlands'}},[_vm._v(\"Netherlands\")]),_c('option',{domProps:{\"value\":'New Zealand'}},[_vm._v(\"New Zealand\")]),_c('option',{domProps:{\"value\":'Nicaragua'}},[_vm._v(\"Nicaragua\")]),_c('option',{domProps:{\"value\":'Niger'}},[_vm._v(\"Niger\")]),_c('option',{domProps:{\"value\":'Nigeria'}},[_vm._v(\"Nigeria\")]),_c('option',{domProps:{\"value\":'Norway'}},[_vm._v(\"Norway\")]),_c('option',{domProps:{\"value\":'Oman'}},[_vm._v(\"Oman\")]),_c('option',{domProps:{\"value\":'Pakistan'}},[_vm._v(\"Pakistan\")]),_c('option',{domProps:{\"value\":'Palau'}},[_vm._v(\"Palau\")]),_c('option',{domProps:{\"value\":'Panama'}},[_vm._v(\"Panama\")]),_c('option',{domProps:{\"value\":'Papua New Guinea'}},[_vm._v(\"Papua New Guinea\")]),_c('option',{domProps:{\"value\":'Paraguay'}},[_vm._v(\"Paraguay\")]),_c('option',{domProps:{\"value\":'Peru'}},[_vm._v(\"Peru\")]),_c('option',{domProps:{\"value\":'Philippines'}},[_vm._v(\"Philippines\")]),_c('option',{domProps:{\"value\":'Poland'}},[_vm._v(\"Poland\")]),_c('option',{domProps:{\"value\":'Portugal'}},[_vm._v(\"Portugal\")]),_c('option',{domProps:{\"value\":'Qatar'}},[_vm._v(\"Qatar\")]),_c('option',{domProps:{\"value\":'Romania'}},[_vm._v(\"Romania\")]),_c('option',{domProps:{\"value\":'Russian Federation'}},[_vm._v(\"Russian Federation\")]),_c('option',{domProps:{\"value\":'Rwanda'}},[_vm._v(\"Rwanda\")]),_c('option',{domProps:{\"value\":'St Kitts & Nevis'}},[_vm._v(\"St Kitts & Nevis\")]),_c('option',{domProps:{\"value\":'St Lucia'}},[_vm._v(\"St Lucia\")]),_c('option',{domProps:{\"value\":'Saint Vincent & the Grenadines'}},[_vm._v(\"Saint Vincent & the Grenadines\")]),_c('option',{domProps:{\"value\":'Samoa'}},[_vm._v(\"Samoa\")]),_c('option',{domProps:{\"value\":'San Marino'}},[_vm._v(\"San Marino\")]),_c('option',{domProps:{\"value\":'Sao Tome & Principe'}},[_vm._v(\"Sao Tome & Principe\")]),_c('option',{domProps:{\"value\":'Saudi Arabia'}},[_vm._v(\"Saudi Arabia\")]),_c('option',{domProps:{\"value\":'Senegal'}},[_vm._v(\"Senegal\")]),_c('option',{domProps:{\"value\":'Serbia'}},[_vm._v(\"Serbia\")]),_c('option',{domProps:{\"value\":'Seychelles'}},[_vm._v(\"Seychelles\")]),_c('option',{domProps:{\"value\":'Sierra Leone'}},[_vm._v(\"Sierra Leone\")]),_c('option',{domProps:{\"value\":'Singapore'}},[_vm._v(\"Singapore\")]),_c('option',{domProps:{\"value\":'Slovakia'}},[_vm._v(\"Slovakia\")]),_c('option',{domProps:{\"value\":'Slovenia'}},[_vm._v(\"Slovenia\")]),_c('option',{domProps:{\"value\":'Solomon Islands'}},[_vm._v(\"Solomon Islands\")]),_c('option',{domProps:{\"value\":'Somalia'}},[_vm._v(\"Somalia\")]),_c('option',{domProps:{\"value\":'South Africa'}},[_vm._v(\"South Africa\")]),_c('option',{domProps:{\"value\":'South Sudan'}},[_vm._v(\"South Sudan\")]),_c('option',{domProps:{\"value\":'Spain'}},[_vm._v(\"Spain\")]),_c('option',{domProps:{\"value\":'Sri Lanka'}},[_vm._v(\"Sri Lanka\")]),_c('option',{domProps:{\"value\":'Sudan'}},[_vm._v(\"Sudan\")]),_c('option',{domProps:{\"value\":'Suriname'}},[_vm._v(\"Suriname\")]),_c('option',{domProps:{\"value\":'Swaziland'}},[_vm._v(\"Swaziland\")]),_c('option',{domProps:{\"value\":'Sweden'}},[_vm._v(\"Sweden\")]),_c('option',{domProps:{\"value\":'Switzerland'}},[_vm._v(\"Switzerland\")]),_c('option',{domProps:{\"value\":'Syria'}},[_vm._v(\"Syria\")]),_c('option',{domProps:{\"value\":'Taiwan'}},[_vm._v(\"Taiwan\")]),_c('option',{domProps:{\"value\":'Tajikistan'}},[_vm._v(\"Tajikistan\")]),_c('option',{domProps:{\"value\":'Tanzania'}},[_vm._v(\"Tanzania\")]),_c('option',{domProps:{\"value\":'Thailand'}},[_vm._v(\"Thailand\")]),_c('option',{domProps:{\"value\":'Togo'}},[_vm._v(\"Togo\")]),_c('option',{domProps:{\"value\":'Tonga'}},[_vm._v(\"Tonga\")]),_c('option',{domProps:{\"value\":'Trinidad & Tobago'}},[_vm._v(\"Trinidad & Tobago\")]),_c('option',{domProps:{\"value\":'Tunisia'}},[_vm._v(\"Tunisia\")]),_c('option',{domProps:{\"value\":'Turkey'}},[_vm._v(\"Turkey\")]),_c('option',{domProps:{\"value\":'Turkmenistan'}},[_vm._v(\"Turkmenistan\")]),_c('option',{domProps:{\"value\":'Tuvalu'}},[_vm._v(\"Tuvalu\")]),_c('option',{domProps:{\"value\":'Uganda'}},[_vm._v(\"Uganda\")]),_c('option',{domProps:{\"value\":'Ukraine'}},[_vm._v(\"Ukraine\")]),_c('option',{domProps:{\"value\":'United Arab Emirates'}},[_vm._v(\"United Arab Emirates\")]),_c('option',{domProps:{\"value\":'United Kingdom'}},[_vm._v(\"United Kingdom\")]),_c('option',{domProps:{\"value\":'United States'}},[_vm._v(\"United States\")]),_c('option',{domProps:{\"value\":'Uruguay'}},[_vm._v(\"Uruguay\")]),_c('option',{domProps:{\"value\":'Uzbekistan'}},[_vm._v(\"Uzbekistan\")]),_c('option',{domProps:{\"value\":'Vanuatu'}},[_vm._v(\"Vanuatu\")]),_c('option',{domProps:{\"value\":'Vatican City'}},[_vm._v(\"Vatican City\")]),_c('option',{domProps:{\"value\":'Venezuela'}},[_vm._v(\"Venezuela\")]),_c('option',{domProps:{\"value\":'Vietnam'}},[_vm._v(\"Vietnam\")]),_c('option',{domProps:{\"value\":'Yemen'}},[_vm._v(\"Yemen\")]),_c('option',{domProps:{\"value\":'Zambia'}},[_vm._v(\"Zambia\")]),_c('option',{domProps:{\"value\":'Zimbabwe'}},[_vm._v(\"Zimbabwe\")])]),_c('div',{staticClass:\"invalid-feedback\"},[_vm._v(\" \"+_vm._s(_vm.gettext(_vm.errors))+\" \")])])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n    <div class=\"form-group row\">\n        <label for=\"country\" class=\"col-sm-3 col-form-label\">{{ gettext(\"Country: \") }}</label>\n        <div class=\"col-sm-9\">\n            <select class=\"custom-select\" id=\"country\" name=\"country\" v-on:change=\"selectChange\">\n                <option :value=\"''\" selected disabled>{{ gettext('Please Select') }}</option>\n                <option :value=\"'Afghanistan'\">Afghanistan</option>\n                <option :value=\"'Albania'\">Albania</option>\n                <option :value=\"'Algeria'\">Algeria</option>\n                <option :value=\"'Andorra'\">Andorra</option>\n                <option :value=\"'Angola'\">Angola</option>\n                <option :value=\"'Antigua & Deps'\">Antigua & Deps</option>\n                <option :value=\"'Argentina'\">Argentina</option>\n                <option :value=\"'Armenia'\">Armenia</option>\n                <option :value=\"'Australia'\">Australia</option>\n                <option :value=\"'Austria'\">Austria</option>\n                <option :value=\"'Azerbaijan'\">Azerbaijan</option>\n                <option :value=\"'Bahamas'\">Bahamas</option>\n                <option :value=\"'Bahrain'\">Bahrain</option>\n                <option :value=\"'Bangladesh'\">Bangladesh</option>\n                <option :value=\"'Barbados'\">Barbados</option>\n                <option :value=\"'Belarus'\">Belarus</option>\n                <option :value=\"'Belgium'\">Belgium</option>\n                <option :value=\"'Belize'\">Belize</option>\n                <option :value=\"'Benin'\">Benin</option>\n                <option :value=\"'Bhutan'\">Bhutan</option>\n                <option :value=\"'Bolivia'\">Bolivia</option>\n                <option :value=\"'Bosnia Herzegovina'\">Bosnia Herzegovina</option>\n                <option :value=\"'Botswana'\">Botswana</option>\n                <option :value=\"'Brazil'\">Brazil</option>\n                <option :value=\"'Brunei'\">Brunei</option>\n                <option :value=\"'Bulgaria'\">Bulgaria</option>\n                <option :value=\"'Burkina'\">Burkina</option>\n                <option :value=\"'Burundi'\">Burundi</option>\n                <option :value=\"'Cambodia'\">Cambodia</option>\n                <option :value=\"'Cameroon'\">Cameroon</option>\n                <option :value=\"'Canada'\">Canada</option>\n                <option :value=\"'Cape Verde'\">Cape Verde</option>\n                <option :value=\"'Central African Rep'\">Central African Rep</option>\n                <option :value=\"'Chad'\">Chad</option>\n                <option :value=\"'Chile'\">Chile</option>\n                <option :value=\"'China'\">China</option>\n                <option :value=\"'Colombia'\">Colombia</option>\n                <option :value=\"'Comoros'\">Comoros</option>\n                <option :value=\"'Congo'\">Congo</option>\n                <option :value=\"'Congo {Democratic Rep}'\">Congo {Democratic Rep}</option>\n                <option :value=\"'Costa Rica'\">Costa Rica</option>\n                <option :value=\"'Croatia'\">Croatia</option>\n                <option :value=\"'Cuba'\">Cuba</option>\n                <option :value=\"'Cyprus'\">Cyprus</option>\n                <option :value=\"'Czech Republic'\">Czech Republic</option>\n                <option :value=\"'Denmark'\">Denmark</option>\n                <option :value=\"'Djibouti'\">Djibouti</option>\n                <option :value=\"'Dominica'\">Dominica</option>\n                <option :value=\"'Dominican Republic'\">Dominican Republic</option>\n                <option :value=\"'East Timor'\">East Timor</option>\n                <option :value=\"'Ecuador'\">Ecuador</option>\n                <option :value=\"'Egypt'\">Egypt</option>\n                <option :value=\"'El Salvador'\">El Salvador</option>\n                <option :value=\"'Equatorial Guinea'\">Equatorial Guinea</option>\n                <option :value=\"'Eritrea'\">Eritrea</option>\n                <option :value=\"'Estonia'\">Estonia</option>\n                <option :value=\"'Ethiopia'\">Ethiopia</option>\n                <option :value=\"'Fiji'\">Fiji</option>\n                <option :value=\"'Finland'\">Finland</option>\n                <option :value=\"'France'\">France</option>\n                <option :value=\"'Gabon'\">Gabon</option>\n                <option :value=\"'Gambia'\">Gambia</option>\n                <option :value=\"'Georgia'\">Georgia</option>\n                <option :value=\"'Germany'\">Germany</option>\n                <option :value=\"'Ghana'\">Ghana</option>\n                <option :value=\"'Greece'\">Greece</option>\n                <option :value=\"'Grenada'\">Grenada</option>\n                <option :value=\"'Guatemala'\">Guatemala</option>\n                <option :value=\"'Guinea'\">Guinea</option>\n                <option :value=\"'Guinea-Bissau'\">Guinea-Bissau</option>\n                <option :value=\"'Guyana'\">Guyana</option>\n                <option :value=\"'Haiti'\">Haiti</option>\n                <option :value=\"'Honduras'\">Honduras</option>\n                <option :value=\"'Hungary'\">Hungary</option>\n                <option :value=\"'Iceland'\">Iceland</option>\n                <option :value=\"'India'\">India</option>\n                <option :value=\"'Indonesia'\">Indonesia</option>\n                <option :value=\"'Iran'\">Iran</option>\n                <option :value=\"'Iraq'\">Iraq</option>\n                <option :value=\"'Ireland {Republic}'\">Ireland {Republic}</option>\n                <option :value=\"'Israel'\">Israel</option>\n                <option :value=\"'Italy'\">Italy</option>\n                <option :value=\"'Ivory Coast'\">Ivory Coast</option>\n                <option :value=\"'Jamaica'\">Jamaica</option>\n                <option :value=\"'Japan'\">Japan</option>\n                <option :value=\"'Jordan'\">Jordan</option>\n                <option :value=\"'Kazakhstan'\">Kazakhstan</option>\n                <option :value=\"'Kenya'\">Kenya</option>\n                <option :value=\"'Kiribati'\">Kiribati</option>\n                <option :value=\"'Korea North'\">Korea North</option>\n                <option :value=\"'Korea South'\">Korea South</option>\n                <option :value=\"'Kosovo'\">Kosovo</option>\n                <option :value=\"'Kuwait'\">Kuwait</option>\n                <option :value=\"'Kyrgyzstan'\">Kyrgyzstan</option>\n                <option :value=\"'Laos'\">Laos</option>\n                <option :value=\"'Latvia'\">Latvia</option>\n                <option :value=\"'Lebanon'\">Lebanon</option>\n                <option :value=\"'Lesotho'\">Lesotho</option>\n                <option :value=\"'Liberia'\">Liberia</option>\n                <option :value=\"'Libya'\">Libya</option>\n                <option :value=\"'Liechtenstein'\">Liechtenstein</option>\n                <option :value=\"'Lithuania'\">Lithuania</option>\n                <option :value=\"'Luxembourg'\">Luxembourg</option>\n                <option :value=\"'Macedonia'\">Macedonia</option>\n                <option :value=\"'Madagascar'\">Madagascar</option>\n                <option :value=\"'Malawi'\">Malawi</option>\n                <option :value=\"'Malaysia'\">Malaysia</option>\n                <option :value=\"'Maldives'\">Maldives</option>\n                <option :value=\"'Mali'\">Mali</option>\n                <option :value=\"'Malta'\">Malta</option>\n                <option :value=\"'Marshall Islands'\">Marshall Islands</option>\n                <option :value=\"'Mauritania'\">Mauritania</option>\n                <option :value=\"'Mauritius'\">Mauritius</option>\n                <option :value=\"'Mexico'\">Mexico</option>\n                <option :value=\"'Micronesia'\">Micronesia</option>\n                <option :value=\"'Moldova'\">Moldova</option>\n                <option :value=\"'Monaco'\">Monaco</option>\n                <option :value=\"'Mongolia'\">Mongolia</option>\n                <option :value=\"'Montenegro'\">Montenegro</option>\n                <option :value=\"'Morocco'\">Morocco</option>\n                <option :value=\"'Mozambique'\">Mozambique</option>\n                <option :value=\"'Myanmar, {Burma}'\">Myanmar, {Burma}</option>\n                <option :value=\"'Namibia'\">Namibia</option>\n                <option :value=\"'Nauru'\">Nauru</option>\n                <option :value=\"'Nepal'\">Nepal</option>\n                <option :value=\"'Netherlands'\">Netherlands</option>\n                <option :value=\"'New Zealand'\">New Zealand</option>\n                <option :value=\"'Nicaragua'\">Nicaragua</option>\n                <option :value=\"'Niger'\">Niger</option>\n                <option :value=\"'Nigeria'\">Nigeria</option>\n                <option :value=\"'Norway'\">Norway</option>\n                <option :value=\"'Oman'\">Oman</option>\n                <option :value=\"'Pakistan'\">Pakistan</option>\n                <option :value=\"'Palau'\">Palau</option>\n                <option :value=\"'Panama'\">Panama</option>\n                <option :value=\"'Papua New Guinea'\">Papua New Guinea</option>\n                <option :value=\"'Paraguay'\">Paraguay</option>\n                <option :value=\"'Peru'\">Peru</option>\n                <option :value=\"'Philippines'\">Philippines</option>\n                <option :value=\"'Poland'\">Poland</option>\n                <option :value=\"'Portugal'\">Portugal</option>\n                <option :value=\"'Qatar'\">Qatar</option>\n                <option :value=\"'Romania'\">Romania</option>\n                <option :value=\"'Russian Federation'\">Russian Federation</option>\n                <option :value=\"'Rwanda'\">Rwanda</option>\n                <option :value=\"'St Kitts & Nevis'\">St Kitts & Nevis</option>\n                <option :value=\"'St Lucia'\">St Lucia</option>\n                <option :value=\"'Saint Vincent & the Grenadines'\">Saint Vincent & the Grenadines</option>\n                <option :value=\"'Samoa'\">Samoa</option>\n                <option :value=\"'San Marino'\">San Marino</option>\n                <option :value=\"'Sao Tome & Principe'\">Sao Tome & Principe</option>\n                <option :value=\"'Saudi Arabia'\">Saudi Arabia</option>\n                <option :value=\"'Senegal'\">Senegal</option>\n                <option :value=\"'Serbia'\">Serbia</option>\n                <option :value=\"'Seychelles'\">Seychelles</option>\n                <option :value=\"'Sierra Leone'\">Sierra Leone</option>\n                <option :value=\"'Singapore'\">Singapore</option>\n                <option :value=\"'Slovakia'\">Slovakia</option>\n                <option :value=\"'Slovenia'\">Slovenia</option>\n                <option :value=\"'Solomon Islands'\">Solomon Islands</option>\n                <option :value=\"'Somalia'\">Somalia</option>\n                <option :value=\"'South Africa'\">South Africa</option>\n                <option :value=\"'South Sudan'\">South Sudan</option>\n                <option :value=\"'Spain'\">Spain</option>\n                <option :value=\"'Sri Lanka'\">Sri Lanka</option>\n                <option :value=\"'Sudan'\">Sudan</option>\n                <option :value=\"'Suriname'\">Suriname</option>\n                <option :value=\"'Swaziland'\">Swaziland</option>\n                <option :value=\"'Sweden'\">Sweden</option>\n                <option :value=\"'Switzerland'\">Switzerland</option>\n                <option :value=\"'Syria'\">Syria</option>\n                <option :value=\"'Taiwan'\">Taiwan</option>\n                <option :value=\"'Tajikistan'\">Tajikistan</option>\n                <option :value=\"'Tanzania'\">Tanzania</option>\n                <option :value=\"'Thailand'\">Thailand</option>\n                <option :value=\"'Togo'\">Togo</option>\n                <option :value=\"'Tonga'\">Tonga</option>\n                <option :value=\"'Trinidad & Tobago'\">Trinidad & Tobago</option>\n                <option :value=\"'Tunisia'\">Tunisia</option>\n                <option :value=\"'Turkey'\">Turkey</option>\n                <option :value=\"'Turkmenistan'\">Turkmenistan</option>\n                <option :value=\"'Tuvalu'\">Tuvalu</option>\n                <option :value=\"'Uganda'\">Uganda</option>\n                <option :value=\"'Ukraine'\">Ukraine</option>\n                <option :value=\"'United Arab Emirates'\">United Arab Emirates</option>\n                <option :value=\"'United Kingdom'\">United Kingdom</option>\n                <option :value=\"'United States'\">United States</option>\n                <option :value=\"'Uruguay'\">Uruguay</option>\n                <option :value=\"'Uzbekistan'\">Uzbekistan</option>\n                <option :value=\"'Vanuatu'\">Vanuatu</option>\n                <option :value=\"'Vatican City'\">Vatican City</option>\n                <option :value=\"'Venezuela'\">Venezuela</option>\n                <option :value=\"'Vietnam'\">Vietnam</option>\n                <option :value=\"'Yemen'\">Yemen</option>\n                <option :value=\"'Zambia'\">Zambia</option>\n                <option :value=\"'Zimbabwe'\">Zimbabwe</option>\n            </select>\n            <div class=\"invalid-feedback\">\n                {{ gettext(errors) }}\n            </div>\n        </div>\n    </div>\n</template>\n\n<script>\n    export default {\n        name: \"CountrySelect\",\n        props: [\"errors\"],\n        data: function() {\n            return {\n\n            }\n        },\n        mounted: function() {\n        },\n        methods: {\n            selectChange: function(event) {\n                this.$emit('country-selection', event.target.value);\n            }\n        }\n    }\n</script>\n\n<style scoped>\n\n</style>","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./CountrySelect.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./CountrySelect.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./CountrySelect.vue?vue&type=template&id=bb3c44b8&scoped=true\"\nimport script from \"./CountrySelect.vue?vue&type=script&lang=js\"\nexport * from \"./CountrySelect.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"bb3c44b8\",\n  null\n  \n)\n\nexport default component.exports","<template>\n    <div class=\"p-3\">\n        <form v-on:submit=\"formSubmit\" :class=\"(validated ? 'was-validated ': '') +'needs-validation'\" novalidate>\n            <div class=\"form-group\">\n                <div class=\"row\">\n                    <label for=\"participant-id\" class=\"col-sm-3 col-form-label\">{{ gettext(\"Participant ID:\") }}</label>\n                    <div class=\"col-sm-9\">\n                        <input type=\"text\" autocomplete=\"off\" class=\"form-control\" name=\"participant-id\" id=\"participant-id\" v-model=\"participant_id\" aria-describedby=\"participant_help\" oninput=\"let p=this.selectionStart;this.value=this.value.toUpperCase();this.setSelectionRange(p, p);\">\n                        <small class=\"form-text text-muted text-left px-2\" id=\"participant_help\">{{ gettext(\"If you've been given a Participant ID please enter it, otherwise leave blank\") }}</small>\n                    </div>\n                </div>\n            </div>\n\n            <div class=\"form-group row\">\n                <label for=\"age\" class=\"col-sm-3 col-form-label\">{{ gettext(\"Age:\") }}</label>\n                <div class=\"col-sm-9\">\n                    <input type=\"number\"\n                           class=\"form-control\"\n                           name=\"age\"\n                           id=\"age\"\n                           aria-describedby=\"age_help\"\n                           v-model=\"age\">\n                    <small class=\"form-text text-muted text-left px-2\" id=\"age_help\">{{ gettext(\"Enter your age in terms of years\") }}</small>\n                    <div class=\"invalid-feedback\">\n                        {{ gettext(errors.age) }}\n                    </div>\n                </div>\n            </div>\n\n            <div class=\"form-group row\">\n                <label for=\"education\" class=\"col-sm-3 col-form-label\">{{ gettext(\"Education:\") }}</label>\n                <div class=\"col-sm-9\">\n                    <input type=\"number\"\n                           class=\"form-control\"\n                           id=\"education\"\n                           aria-describedby=\"education_help\"\n                           v-model=\"education\">\n                    <small class=\"form-text text-muted text-left px-2\" id=\"education_help\">{{ gettext(\"Enter number of years of schooling completed starting with primary school\") }}</small>\n                    <div class=\"invalid-feedback\">\n                        {{ gettext(errors.education) }}\n                    </div>\n                </div>\n            </div>\n\n            <div class=\"form-group row\">\n                <label for=\"sex\" class=\"col-sm-3 col-form-label\">{{ gettext(\"Sex:\") }}</label>\n                <div class=\"col-sm-9\">\n                    <select class=\"custom-select\" id=\"sex\" v-on:change=\"updateSex\">\n                        <option :value=\"''\" selected disabled>{{ gettext('Please Select') }}</option>\n                        <option :value=\"'male'\">{{ gettext(\"Male\") }}</option>\n                        <option :value=\"'female'\">{{ gettext(\"Female\") }}</option>\n                        <option :value=\"'Unknown'\">{{ gettext(\"Prefer not to say\") }}</option>\n                    </select>\n                    <div class=\"invalid-feedback\">\n                        {{ gettext(errors.sex) }}\n                    </div>\n                </div>\n            </div>\n\n            <CountrySelect v-if=\"ask_country\" :errors=\"errors.country\" v-on:country-selection=\"updateCountry\"></CountrySelect>\n\n            <div v-if=\"ask_ethnicity\" class=\"form-group row\">\n                <label for=\"ethnicity\" class=\"col-sm-3 col-form-label\">{{ gettext(\"Ethnicity:\") }}</label>\n                <div class=\"col-sm-9\">\n                    <select class=\"custom-select\" id=\"ethnicity\" v-on:change=\"updateEthnicity\">\n                        <option :value=\"''\" selected disabled>{{ gettext('Please Select') }}</option>\n                        <option :value=\"'American Indian or Alaska Native'\">{{gettext(\"American Indian or Alaska Native\")}}</option>\n                        <option :value=\"'Asian'\">{{ gettext(\"Asian\") }}</option>\n                        <option :value=\"'Black or African American'\">{{ gettext(\"Black or African American\") }}</option>\n                        <option :value=\"'Hispanic or Latino'\">{{ gettext(\"Hispanic or Latino\") }}</option>\n                        <option :value=\"'Native Hawaiian or Other Pacific Islander'\">{{ gettext(\"Native Hawaiian or Other Pacific Islander\") }}</option>\n                        <option :value=\"'White'\">{{ gettext(\"White\") }}</option>\n                        <option :value=\"'Other'\">{{ gettext(\"Other\") }}</option>\n                    </select>\n                    <div class=\"invalid-feedback\">\n                        {{ gettext(errors.ethnicity) }}\n                    </div>\n                </div>\n            </div>\n            <div class=\"form-group row\">\n              <label for=\"week-number\" class=\"col-sm-3 col-form-label\">{{ gettext(\"Week Number:\") }}</label>\n              <div class=\"col-sm-9\">\n                  <input type=\"number\"\n                         class=\"form-control\"\n                         name=\"week-number\"\n                         id=\"week-number\"\n                         v-model=\"week_number\">\n                  <div class=\"invalid-feedback\">\n                    {{ gettext(errors.week_number) }}\n                  </div>\n              </div>\n          </div>\n\n          <div class=\"form-group row\">\n              <label for=\"part\" class=\"col-sm-3 col-form-label\">{{ gettext(\"Part:\") }}</label>\n              <div class=\"col-sm-9\">\n                  <select class=\"custom-select\" id=\"part\" v-model=\"part\">\n                      <option :value=\"null\">{{ gettext('Please Select') }}</option>\n                      <option :value=\"'1'\">{{ gettext(\"Part 1\") }}</option>\n                      <option :value=\"'2'\">{{ gettext(\"Part 2\") }}</option>\n                  </select>\n              </div>\n          </div>\n\n            <button type=\"submit\" class=\"btn btn-lg btn-primary my-2\">{{ gettext('OK') }}</button>\n        </form>\n        <template v-if=\"getting_id\">\n            <p>{{ gettext(\"Generating Participant ID, you will be redirected shortly!\") }}</p>\n        </template>\n    </div>\n</template>\n\n<script>\n    import \"whatwg-fetch\";\n    import CountrySelect from \"./CountrySelect\";\n\n    export default {\n        name: \"UserInformation\",\n        components: {CountrySelect},\n        props: ['base_url', 'endpoint_version', 'ask_country', 'ask_ethnicity', 'is_clinical_trial', 'available_tests', 'clinical_trial_slug', \"skip_test_number\"],\n\n        mounted() {\n            this.age_input = document.getElementById(\"age\");\n            this.education_input = document.getElementById((\"education\"));\n            if(this.ask_country) {\n                this.country_select = document.getElementById(\"country\");\n                this.country = this.country_select.value;\n            }\n            if(this.ask_ethnicity) {\n                this.ethnicity_select = document.getElementById(\"ethnicity\");\n                this.ethnicity = this.country_select.value;\n            }\n            this.sex_select = document.getElementById(\"sex\")\n            this.sex = this.sex_select.value\n\n            this.week_input = document.getElementById(\"week-number\");\n\n            // Initialize selected test\n            if (this.available_tests && this.available_tests.length > 0) {\n                let skip_to_test_number = this.skip_test_number + 1\n                skip_to_test_number = skip_to_test_number > this.available_tests.length ? this.available_tests.length : skip_to_test_number\n\n                this.selected_start_test = skip_to_test_number\n            }\n        },\n\n        data: function() {\n            return {\n                participant_id: null,\n                age: null,\n                education: null,\n                sex: '',\n                country: \"Not Requested\",\n                ethnicity: \"Not Requested\",\n                errors: {},\n                validated: false,\n                age_input: null,\n                education_input: null,\n                country_select: null,\n                ethnicity_select: null,\n                sex_select: null,\n                selected_start_test: 1,\n                submitting: false,\n                getting_id: false,\n                week_number: null,\n                part: null,\n                week_input: null,\n            }\n        },\n        methods: {\n            formatTestType: function(type) {\n                  const typeMap = {\n                      'series': 'Series',\n                      'room': 'Room',\n                      'fname': 'Face-Name'\n                  };\n                  return typeMap[type] || type;\n            },\n            skipToTest: async function() {\n                  if (this.selected_start_test <= 1) {\n                      return true; // No skipping needed\n                  }\n\n                  try {\n                      const response = await window.fetch(\n                          `${this.base_url}endpoints/${this.endpoint_version}/skip-to-test/`,\n                          {\n                              method: 'POST',\n                              headers: {\n                                  'Content-Type': 'application/json',\n                              },\n                              body: JSON.stringify({\n                                  participant_id: this.participant_id,\n                                  clinical_trial_slug: this.clinical_trial_slug,\n                                  start_from_test: this.selected_start_test,\n                                  language: document.documentElement.lang || 'en'\n                              })\n                          }\n                      );\n\n                      if (!response.ok) {\n                          console.error('Failed to skip tests');\n                          return false;\n                      }\n\n                      return true;\n                  } catch (error) {\n                      console.error('Error skipping tests:', error);\n                      return false;\n                  }\n            },\n            validateAge: function(event) {\n                // Skip Validation if Clinical Trial\n                if(this.is_clinical_trial) {\n                  this.age_input.setCustomValidity(\"\")\n                  return true\n                }\n                if(this.age !== null && this.age !== \"\" && this.age > 0 && this.age <= 120 && this.age%1 === 0) {\n                    this.age_input.setCustomValidity(\"\");\n                    return true;\n                }\n                else {\n                    this.errors.age = this.gettext(\"Age must be a valid number between 1-120 (No decimals)\");\n                    this.age_input.setCustomValidity(this.errors.age);\n                    return false\n                }\n\n            },\n\n            validateWeek: function(event) {\n                if(this.week_number === null || this.week_number === \"\") {\n                  this.week_input.setCustomValidity(\"\");\n                  return true\n                }\n                if(this.week_number > 0 && this.week_number%1 === 0) {\n                    this.week_input.setCustomValidity(\"\");\n                    return true;\n                }\n                else {\n                    this.errors.week_number = this.gettext(\"Week Number must be a valid number > 0 (No decimals)\");\n                    this.week_input.setCustomValidity(this.errors.week_number);\n                    return false\n                }\n\n            },\n            validateEducation: function(event) {\n                if(this.is_clinical_trial) {\n                  this.education_input.setCustomValidity(\"\")\n                  return true\n                }\n\n                if(this.education !== null && this.education !== \"\" && this.education >= 0 && this.education <= 21 && this.education %1 === 0) {\n                    this.education_input.setCustomValidity(\"\");\n                    return true\n                }\n                else {\n                    this.errors.education = this.gettext(\"Education must be a valid number between 0-21 (No decimals)\");\n                    this.education_input.setCustomValidity(this.errors.education);\n                    return false\n                }\n            },\n\n            validateParticipantId: async function(event) {\n                if(this.participant_id === null || this.participant_id === \"\") {\n                    this.getting_id = true;\n                    this.participant_id = await this.retrieveParticipantId()\n                }\n                return true;\n            },\n\n            validateCountry: function() {\n                // Clinical Trial does not require this information\n                if(this.is_clinical_trial && this.ask_country) {\n                  this.country_select.setCustomValidity(\"\")\n                  return true\n                }\n                if(!this.ask_country || (this.ask_country && this.country !== null && this.country !== \"\"))\n                {\n                    if(this.ask_country) {\n                        this.country_select.setCustomValidity(\"\");\n                    }\n                    return true\n                }\n                else {\n                    this.errors.country = this.gettext(\"Please make a selection\");\n                    this.country_select.setCustomValidity(this.errors.country_select);\n                    return false\n                }\n            },\n\n            validateSex: function() {\n                  // Clinical trial does not require this information\n                  if(this.is_clinical_trial) {\n                    this.sex_select.setCustomValidity(\"\")\n                    return true\n                  }\n\n                  if(this.sex !== null && this.sex !== \"\") {\n                      this.sex_select.setCustomValidity(\"\")\n                      return true\n                  }\n                  else {\n                      this.errors.sex = \"Please make a selection\";\n                      this.sex_select.setCustomValidity(this.errors.ethnicity);\n                      return false;\n                  }\n              },\n\n            validateEthnicity: function() {\n                // Clinical trial does not require this information\n                if(this.is_clinical_trial && this.ask_ethnicity) {\n                  this.ethnicity_select.setCustomValidity(\"\")\n                  return true\n                }\n\n                if(!this.ask_ethnicity || (this.ask_ethnicity && this.ethnicity !== null && this.ethnicity !== \"\")) {\n                    if(this.ask_ethnicity) {\n                        this.ethnicity_select.setCustomValidity(\"\");\n                    }\n                    return true;\n                }\n                else {\n                    this.errors.ethnicity = \"Please make a selection\";\n                    this.ethnicity_select.setCustomValidity(this.errors.ethnicity);\n                    return false;\n                }\n            },\n\n\n            retrieveParticipantId: async function(event) {\n                return await window.fetch(`${this.base_url}endpoints/${this.endpoint_version}/generate-participant-id`)\n                .then((data) => {\n                   return data.json();\n                })\n                .then((json) => {\n                    this.getting_id = false;\n                    return json.participant_id\n                })\n                .catch((err) => {\n                    console.log(err);\n                });\n            },\n\n            formValidation: async function(event) {\n                // Single & since we want to run the validation on education even if age is incorrect\n                // This sets the custom invalid error messages.\n                // We do not want to run the participantID validation if either of the validations prior are false (it requests an ID from the endpoint)\n\n                return this.validateAge() & this.validateEducation() & this.validateCountry() & this.validateSex() & this.validateEthnicity() & this.validateWeek() && await this.validateParticipantId();\n            },\n\n            formSubmit: async function(event) {\n                event.preventDefault();\n                let valid = await this.formValidation();\n                this.validated = true;\n                if(valid && !this.getting_id && !this.submitting) {\n                    this.submitting = true;\n\n                    // Handle test skipping for clinical trials\n                    if (this.is_clinical_trial && this.selected_start_test > 1) {\n                        const skipSuccess = await this.skipToTest();\n                        if (!skipSuccess) {\n                            this.submitting = false;\n                            alert(this.gettext('Failed to skip tests. Please try again.'));\n                            return;\n                        }\n                    }\n\n                    this.$emit('submission', this.participant_id, this.age, this.education, this.sex, this.country, this.ethnicity, this.week_number, this.part);\n                }\n\n            },\n\n            updateSex: function(event) {\n                this.sex = event.target.value;\n            },\n\n            updateCountry: function(country_val) {\n                this.country = country_val;\n            },\n\n            updateEthnicity: function(event) {\n                this.ethnicity = event.target.value;\n            }\n\n        }\n    }\n</script>\n\n<style scoped>\n\n</style>","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./UserInformation.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./UserInformation.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./UserInformation.vue?vue&type=template&id=2cebc1b0&scoped=true\"\nimport script from \"./UserInformation.vue?vue&type=script&lang=js\"\nexport * from \"./UserInformation.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"2cebc1b0\",\n  null\n  \n)\n\nexport default component.exports","// Warm the browser cache with a test's images as soon as its JSON arrives, so\n// each question's images are already downloaded by the time it is shown.\n\n// Parts of the test JSON that describe earlier results rather than this test.\n// Their image URLs are not about to be displayed.\nconst SKIPPED_KEYS = [\"results\", \"resume_result\", \"available_tests\"];\n\n// A few at a time, in question order: the first questions' images arrive\n// first, and the images on screen right now are not starved of bandwidth.\nconst CONCURRENCY = 4;\n\nconst requested = new Set();\nconst queue = [];\nlet active = 0;\n\n// Loaded images are held on to for the life of the page. Once an Image object\n// is garbage collected the browser drops it from its in-memory cache, and\n// showing it again means another request: quick from the disk cache, but a\n// full download when that is unavailable or disabled.\nconst loaded = [];\n\n// Every image URL in the test JSON, in the order the questions appear.\n// Storage URLs are always absolute, and nothing else in the JSON is a URL.\nexport function collectImageUrls(json) {\n    const urls = [];\n    const walk = function(value) {\n        if (typeof value === \"string\") {\n            if (/^https?:\\/\\//.test(value)) {\n                urls.push(value);\n            }\n        } else if (Array.isArray(value)) {\n            value.forEach(walk);\n        } else if (value && typeof value === \"object\") {\n            Object.keys(value)\n                .filter(key => !SKIPPED_KEYS.includes(key))\n                .forEach(key => walk(value[key]));\n        }\n    };\n    walk(json);\n    return urls;\n}\n\nfunction next() {\n    while (active < CONCURRENCY && queue.length) {\n        const image = new Image();\n        const done = function() {\n            active--;\n            next();\n        };\n        active++;\n        image.onload = function() {\n            loaded.push(image);\n            done();\n        };\n        // A missing image must not hold up the rest.\n        image.onerror = done;\n        image.fetchPriority = \"low\";\n        image.src = queue.shift();\n    }\n}\n\nexport default function preloadImages(urls) {\n    urls.forEach(url => {\n        if (!requested.has(url)) {\n            requested.add(url);\n            queue.push(url);\n        }\n    });\n    next();\n}\n","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"px-sm-1 px-lg-3 pt-lg-3 pt-sm-1\"},[(_vm.step === 0)?[_c('FNameInstructions',{attrs:{\"display_countdown_bar\":_vm.display_countdown_bar,\"displayDuration\":_vm.display_duration,\"is_mobile\":_vm.is_mobile},on:{\"complete\":_vm.incrementStep}})]:(_vm.step === 1)?[_c('FnameLearningPhase',{attrs:{\"questions\":_vm.learning_json_data,\"displayDuration\":_vm.display_duration,\"display_countdown_bar\":_vm.display_countdown_bar,\"is_mobile\":_vm.is_mobile},on:{\"complete\":_vm.incrementStep,\"submission\":_vm.handleLearningSubmission}})]:(_vm.step === 2)?[_c('FnameRecognitionPhase',{attrs:{\"questions\":_vm.recognition_json_data,\"is_mobile\":_vm.is_mobile},on:{\"complete\":_vm.incrementStep,\"submission\":_vm.handleRecognitionSubmission}})]:(_vm.step === 3)?[_c('FNameInitialPhase',{attrs:{\"questions\":_vm.initial_json_data,\"is_mobile\":_vm.is_mobile},on:{\"complete\":_vm.incrementStep,\"submission\":_vm.handleInitialsSubmission}})]:(_vm.step === 4)?[_c('FnameMatchingPhase',{attrs:{\"questions\":_vm.matching_json_data,\"is_mobile\":_vm.is_mobile},on:{\"complete\":_vm.incrementStep,\"submission\":_vm.handleMatchingSubmission}})]:(_vm.step === 5)?[_c('div',{staticClass:\"my-4\"},[_c('p',{staticClass:\"font-weight-bold\"},[_vm._v(_vm._s(_vm.gettext(\"Please do not close this window.\")))]),_c('p',[_vm._v(_vm._s(_vm.gettext(\"Your results have been recorded! The rest of this test will begin in: \")))]),_c('CountdownTimer',{attrs:{\"timeMinutes\":_vm.json_data.display_wait_interval,\"endTime\":_vm.resume_delay_end_time,\"storage-key\":`timer-fname-driver-${_vm.participant_id}`,\"max-lifetime-hours\":3},on:{\"complete\":_vm.incrementStep}}),(_vm.allow_defer)?_c('button',{staticClass:\"btn btn-primary mt-3\",attrs:{\"type\":\"button\"},on:{\"click\":function($event){_vm.$emit('defer', _vm.createResults())}}},[_vm._v(_vm._s(_vm.gettext(\"Continue to Next Test\")))]):_vm._e()],1)]:(_vm.step===6)?[_c('div',{staticClass:\"my-4\"},[_c('BasicInstructions',{attrs:{\"instruction_text\":_vm.gettext('A few minutes ago you saw several faces and their names. Please select the faces you saw before.'),\"display_bottom_button\":true},on:{\"next\":_vm.incrementStep}})],1)]:(_vm.step === 7)?[_c('FnameRecognitionPhase',{attrs:{\"questions\":_vm.recognition_json_data,\"is_mobile\":_vm.is_mobile},on:{\"complete\":_vm.incrementStep,\"submission\":_vm.handleRecognitionDelayedSubmission}})]:(_vm.step === 8)?[_c('FNameInitialPhase',{attrs:{\"questions\":_vm.initial_json_data_delayed,\"is_mobile\":_vm.is_mobile},on:{\"complete\":_vm.incrementStep,\"submission\":_vm.handleInitialsDelayedSubmission}})]:(_vm.step === 9)?[_c('FnameMatchingPhase',{attrs:{\"questions\":_vm.matching_json_data_delayed,\"is_mobile\":_vm.is_mobile},on:{\"complete\":_vm.incrementStep,\"submission\":_vm.handleMatchingDelayedSubmission}})]:[_c('div',{staticClass:\"my-4\"},[_c('p',[_vm._v(_vm._s(_vm.gettext(this.end_message)))])])]],2)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[_c('div',{staticClass:\"p-sm-0 p-lg-3\"},[(_vm.step === 0)?[_c('BasicInstructions',{attrs:{\"instruction_text\":_vm.gettext('In this test, you will see pictures of faces and their names.'),\"second_text\":_vm.gettext('Let\\'s practice first.'),\"third_text\":_vm.gettext('Please ensure you have a stable internet connection before continuing.'),\"mobile_text\":_vm.gettext('Please rotate your phone to landscape mode for the best experience. You may zoom in and out by using two fingers on the screen.'),\"mobile_text_special\":_vm.gettext('Make sure you scroll down to see all question options!'),\"bold_text\":_vm.gettext('Do not use the back button as it will restart the test.'),\"left_text\":_vm.is_mobile,\"display_bottom_button\":true},on:{\"next\":_vm.incrementStep}})]:(_vm.step === 1 )?[_c('FnameLearningPhase',{attrs:{\"display_countdown_bar\":_vm.display_countdown_bar,\"is_mobile\":_vm.is_mobile,\"displayDuration\":_vm.displayDuration,\"questions\":_vm.mock_data},on:{\"complete\":_vm.incrementStep}})]:(_vm.step === 2 )?[_c('FnameRecognitionPhase',{attrs:{\"is_mobile\":_vm.is_mobile,\"questions\":_vm.mock_data},on:{\"complete\":_vm.incrementStep}})]:(_vm.step === 3 )?[_c('FNameInitialPhase',{attrs:{\"is_mobile\":_vm.is_mobile,\"questions\":_vm.mock_data},on:{\"complete\":_vm.incrementStep}})]:(_vm.step === 4 )?[_c('FnameMatchingPhase',{attrs:{\"is_mobile\":_vm.is_mobile,\"questions\":_vm.mock_data},on:{\"complete\":_vm.incrementStep}})]:(_vm.step === 5)?[_c('div',{staticClass:\"container align-content-center\"},[(_vm.title_text)?_c('h2',[_vm._v(_vm._s(_vm.gettext(_vm.title_text)))]):_vm._e(),_c('div',{staticClass:\"my-3\"},[_c('h2',[_vm._v(_vm._s(_vm.gettext('End of the practice test!')))]),_c('p',{staticClass:\"mt-lg-5 mt-sm-3 max-width-750 mx-auto\"},[_vm._v(_vm._s(_vm.gettext('Would you like to retake the practice test?')))]),_c('div',{staticClass:\"d-flex justify-content-center\"},[_c('div',[_c('button',{staticClass:\"btn btn-lg btn-primary mx-2\",on:{\"click\":function($event){return _vm.setStep(0)}}},[_vm._v(_vm._s(_vm.gettext('Yes')))]),_c('button',{staticClass:\"btn btn-lg btn-primary mx-2\",on:{\"click\":_vm.incrementStep}},[_vm._v(_vm._s(_vm.gettext('No')))])])])])])]:_vm._e()],2)])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"px-lg-3 py-1 p-sm-1\"},[(_vm.step === 0)?[_c('BasicInstructions',{attrs:{\"instruction_text\":_vm.gettext('Try to remember the name associated with each face.'),\"second_text\":_vm.gettext('Please indicate whether the name fits each face or not.'),\"left_text\":_vm.is_mobile,\"display_bottom_button\":true},on:{\"next\":_vm.incrementStep}})]:_vm._e(),(_vm.step === 1)?[_c('div',{},[_c('div',{staticClass:\"justify-content-center text-center my-2\"},[_c('p',[_vm._v(_vm._s(_vm.gettext('Does the name fit this face?')))])]),(_vm.displayImage)?[_c('BasicStimuliImage',{key:`fname-learn-${_vm.questions[_vm.currentQuestion].question_id}-${_vm.questions[_vm.currentQuestion].ordering_id}`,attrs:{\"custom_classname\":_vm.is_mobile ? 'img-stimuli-sm' : '',\"image_url\":_vm.questions[_vm.currentQuestion].target_image,\"id\":`image-${_vm.questions[_vm.currentQuestion].question_id}`}})]:[_c('BasicStimuliImage',{attrs:{\"custom_classname\":_vm.is_mobile ? 'img-stimuli-sm' : '',\"image_url\":_vm.template_image,\"id\":'image-template'}})],_c('h2',{staticClass:\"my-lg-4 my-sm-2\"},[_vm._v(_vm._s(this.questions[_vm.currentQuestion].target_name))])],2),_c('div',{staticClass:\"d-flex align-items-stretch justify-content-center my-4\"},[_c('button',{ref:\"yes-btn\",staticClass:\"btn btn-lg btn-primary mx-2\",on:{\"click\":function($event){return _vm.buttonCallback('yes')}}},[_vm._v(_vm._s(_vm.gettext('Yes')))]),_c('button',{ref:\"no-btn\",staticClass:\"btn btn-lg btn-primary mx-2\",on:{\"click\":function($event){return _vm.buttonCallback('no')}}},[_vm._v(_vm._s(_vm.gettext('No')))]),_c('button',{ref:\"undecided-btn\",staticClass:\"btn btn-lg btn-primary mx-2\",on:{\"click\":function($event){return _vm.buttonCallback('undecided')}}},[_vm._v(_vm._s(_vm.gettext('Undecided')))])]),_c('CustomProgressBar',{key:`progress-bar-key-${_vm.currentQuestion}`,attrs:{\"display_countdown_bar\":_vm.display_countdown_bar,\"timeSeconds\":_vm.displayDuration/1000},on:{\"complete\":_vm.imageTimeout}})]:_vm._e()],2)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"progress\",style:(_vm.display_countdown_bar ?  '' : 'visibility: hidden')},[_c('div',{staticClass:\"progress-bar\",style:(`width: ${_vm.current_percent}%`),attrs:{\"role\":\"progressbar\",\"aria-valuenow\":_vm.current_percent,\"aria-valuemin\":\"0\",\"aria-valuemax\":\"100\"}})])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n    <div class=\"progress\" :style=\"display_countdown_bar ?  '' : 'visibility: hidden'\">\n        <div class=\"progress-bar\" role=\"progressbar\" :aria-valuenow=\"current_percent\" aria-valuemin=\"0\" aria-valuemax=\"100\" :style=\"`width: ${current_percent}%`\"></div>\n    </div>\n</template>\n\n<script>\n    export default {\n        components: {},\n        props: [\"timeSeconds\", \"display_countdown_bar\"],\n        mounted: function () {\n          this.timeRemaining = this.timeSeconds\n          // Since we update the time remaining every 1/10 second. Decrement needs to be 1/10\n          this.step_decrement = 100/(this.timeSeconds * 10)\n        },\n\n        data: function() {\n              return {\n                  // timeRemaining is in seconds\n                  current_percent: 100,\n                  timeRemaining: 0,\n                  step_decrement: 1,\n              }\n          },\n      methods: {\n          // Used to remove ridiculous JS floating point at 10 decimals deep for timer\n          precisionRound: function(value, precision) {\n            let multiplier = Math.pow(10, precision || 0)\n            return Math.round(value*multiplier) / multiplier\n          }\n      },\n        watch: {\n          timeRemaining: {\n            // Every second update the time remaining\n            handler(value) {\n              if(value > 0 && this.current_percent > 0) {\n                setTimeout(() => {\n                  this.timeRemaining -= .1\n                  this.timeRemaining = this.precisionRound(this.timeRemaining, 1)\n                  this.current_percent -= this.step_decrement\n                  if(this.timeRemaining <= 0) {\n                    this.$emit(\"complete\")\n                  }\n                }, 100)\n              }\n            },\n            immediate: true // This ensures the watcher is triggered upon creation\n          }\n        },\n    }\n</script>","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./customProgressBar.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./customProgressBar.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./customProgressBar.vue?vue&type=template&id=8d975e8a\"\nimport script from \"./customProgressBar.vue?vue&type=script&lang=js\"\nexport * from \"./customProgressBar.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports","<template>\n  <div class=\"px-lg-3 py-1 p-sm-1\">\n        <template v-if=\"step === 0\">\n          <BasicInstructions v-bind:instruction_text=\"gettext('Try to remember the name associated with each face.')\"\n                             :second_text=\"gettext('Please indicate whether the name fits each face or not.')\"\n                             v-on:next=\"incrementStep\"\n                             :left_text=\"is_mobile\"\n                             :display_bottom_button=\"true\"\n          ></BasicInstructions>\n        </template>\n        <template v-if=\"step === 1\">\n          <div class=\"\">\n            <div class=\"justify-content-center text-center my-2\">\n              <p>{{ gettext('Does the name fit this face?')}}</p>\n            </div>\n                <template v-if=\"displayImage\">\n                  <BasicStimuliImage :custom_classname=\"is_mobile ? 'img-stimuli-sm' : ''\" :image_url=\"questions[currentQuestion].target_image\" :id=\"`image-${questions[currentQuestion].question_id}`\" :key=\"`fname-learn-${questions[currentQuestion].question_id}-${questions[currentQuestion].ordering_id}`\"></BasicStimuliImage>\n                </template>\n                <template v-else>\n                  <BasicStimuliImage :custom_classname=\"is_mobile ? 'img-stimuli-sm' : ''\" :image_url=\"template_image\" :id=\"'image-template'\"></BasicStimuliImage>\n                </template>\n                <h2 class=\"my-lg-4 my-sm-2\">{{this.questions[currentQuestion].target_name}}</h2>\n          </div>\n          <div class=\"d-flex align-items-stretch justify-content-center my-4\">\n                <button class=\"btn btn-lg btn-primary mx-2\" ref=\"yes-btn\" v-on:click=\"buttonCallback('yes')\">{{ gettext('Yes') }}</button>\n                <button class=\"btn btn-lg btn-primary mx-2\" ref=\"no-btn\" v-on:click=\"buttonCallback('no')\">{{ gettext('No') }}</button>\n                <button class=\"btn btn-lg btn-primary mx-2\" ref=\"undecided-btn\" v-on:click=\"buttonCallback('undecided')\">{{ gettext('Undecided') }}</button>\n          </div>\n          <CustomProgressBar :display_countdown_bar=\"display_countdown_bar\" :key=\"`progress-bar-key-${currentQuestion}`\" v-on:complete=\"imageTimeout\" :timeSeconds=\"displayDuration/1000\"></CustomProgressBar>\n        </template>\n    </div>\n</template>\n\n<script>\nimport { FNAME_PLACEHOLDER } from \"@/practiceData\";\nimport BasicInstructions from \"@/components/BasicInstructions\";\nimport BasicStimuliImage from \"@/components/BasicStimuliImage\";\nimport timing from \"@/timing\";\nimport CustomProgressBar from \"@/components/customProgressBar\";\nexport default {\n  name: \"FnameLearningPhase\",\n  components: {CustomProgressBar, BasicInstructions, BasicStimuliImage},\n  props: [\"questions\", \"displayDuration\", \"is_mobile\", \"display_countdown_bar\"],\n  mixins: [timing],\n\n  mounted: function() {\n    this.$nextTick(function() {\n        this.recordStartTime();\n    })\n  },\n  data: function() {\n    return {\n      time_start: 0,\n      time_end: 0,\n      step:0,\n      selectedResponse: null,\n      currentQuestion: 0,\n      currentImage: null,\n      complete: false,\n      displayImage: true,\n      responded: false,\n      template_image: FNAME_PLACEHOLDER,\n      responses: [],\n      averages: {},\n      cumulative_response_time: 0,\n    }\n  },\n  methods: {\n    incrementStep: function (event) {\n      this.step++;\n      this.recordStartTime()\n    },\n    recordNoResponse: function() {\n      this.responses.push({\n        \"name\": this.questions[this.currentQuestion].name,\n        \"question_id\": this.questions[this.currentQuestion].question_id,\n        \"responded\": false,\n        'response_time': 0,\n      })\n    },\n    // The progress bar controls the timer\n    imageTimeout: function (event) {\n      this.recordNoResponse()\n      this.incrementQuestion()\n    },\n\n    incrementQuestion: function (event) {\n      window.scrollTo(0,0)\n      this.currentQuestion++;\n      this.displayImage = true\n      this.recordStartTime()\n      // If we are out of questions, move to the next phase\n      if (this.currentQuestion >= this.questions.length) {\n        this.complete = true;\n        this.$emit('complete', this.responses);\n        this.calculateAvgs()\n        this.$emit('submission', this.createResult());\n      }\n    },\n\n    calculateAvgs: function () {\n      let response_length = this.responses.length\n      response_length = response_length === 0 ? 1 : response_length\n      let avg_rt = this.cumulative_response_time / response_length\n      this.averages = {'avg_rt': avg_rt}\n    },\n\n    buttonCallback: function(value) {\n      this.recordEndTime()\n      this.selectedResponse = value\n      let response_time = this.getTimeDiff()\n      this.responses.push({\n        \"name\": this.questions[this.currentQuestion].name,\n        'question_id': this.questions[this.currentQuestion].question_id,\n        'response': value,\n        'response_time': response_time,\n        'responded': true,\n      })\n      this.cumulative_response_time +=  response_time\n      this.blurAllButtons()\n      this.incrementQuestion()\n    },\n\n    blurAllButtons: function() {\n      this.$refs[\"yes-btn\"].blur()\n      this.$refs[\"no-btn\"].blur()\n      this.$refs[\"undecided-btn\"].blur()\n    },\n\n    createResult: function() {\n      return {\n        \"user_results\": this.responses,\n        \"averages\": this.averages\n      }\n    }\n\n  }\n}\n</script>\n\n<style scoped>\n\n</style>","import mod from \"-!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./FNameLearningPhase.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./FNameLearningPhase.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./FNameLearningPhase.vue?vue&type=template&id=6ba178e0&scoped=true\"\nimport script from \"./FNameLearningPhase.vue?vue&type=script&lang=js\"\nexport * from \"./FNameLearningPhase.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"6ba178e0\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"px-3 py-1\"},[(_vm.step === 0)?[_c('BasicInstructions',{attrs:{\"instruction_text\":_vm.gettext('Now please select the face you saw.'),\"display_bottom_button\":true,\"left_text\":_vm.is_mobile},on:{\"next\":_vm.incrementStep}})]:_vm._e(),(_vm.step === 1)?[_c('ImageSelectionList',{key:_vm.currentQuestion,attrs:{\"question_list\":_vm.imageOrder,\"question_text\":_vm.gettext('What face did you see?'),\"button_text\":_vm.gettext('OK'),\"item_classname\":_vm.is_mobile ? 'img-stimuli-sm': '',\"display_bottom_button\":true,\"has_background\":false},on:{\"submission\":_vm.handleQuestionSubmission}}),_c('QuestionTimer',{key:`timer-${_vm.currentQuestion}`,ref:\"questionTimer\",attrs:{\"timeSeconds\":10},on:{\"timeout\":_vm.handleTimeout}})]:_vm._e(),(_vm.step === 2)?[_c('BasicInstructions',{attrs:{\"instruction_text\":_vm.gettext('The question was not answered within the allowed time, please press continue to move to the next question.'),\"display_bottom_button\":true,\"bottom_button_text\":\"Continue\",\"left_text\":true},on:{\"next\":_vm.handleQuestionSkip}})]:_vm._e()],2)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div class=\"px-3 py-1\">\n        <template v-if=\"step === 0\">\n          <BasicInstructions v-bind:instruction_text=\"gettext('Now please select the face you saw.')\"\n                             v-on:next=\"incrementStep\"\n                             :display_bottom_button=\"true\"\n                             :left_text=\"is_mobile\"\n          ></BasicInstructions>\n        </template>\n        <template v-if=\"step === 1\">\n          <ImageSelectionList :question_list=\"imageOrder\"\n                              :question_text=\"gettext('What face did you see?')\"\n                              :key=\"currentQuestion\"\n                              :button_text=\"gettext('OK')\"\n                              :item_classname=\"is_mobile ? 'img-stimuli-sm': ''\"\n                              :display_bottom_button=\"true\"\n                              :has_background=\"false\"\n                              v-on:submission=\"handleQuestionSubmission\"\n          ></ImageSelectionList>\n          <QuestionTimer\n              :timeSeconds=\"10\"\n              ref=\"questionTimer\"\n              :key=\"`timer-${currentQuestion}`\"\n              @timeout=\"handleTimeout\"\n          />\n        </template>\n        <template v-if=\"step === 2\">\n          <BasicInstructions v-bind:instruction_text=\"gettext('The question was not answered within the allowed time, please press continue to move to the next question.')\"\n                             :display_bottom_button=\"true\"\n                             bottom_button_text=\"Continue\"\n                             :left_text=\"true\"\n                             @next=\"handleQuestionSkip\"\n          />\n        </template>\n    </div>\n</template>\n\n<script>\nimport BasicInstructions from \"@/components/BasicInstructions\";\nimport timing from \"@/timing\";\nimport ImageSelectionList from \"@/components/ImageSelectionList\";\nimport QuestionTimer from \"@/components/utils/QuestionTimer.vue\";\nexport default {\n  name: \"FnameRecognitionPhase\",\n  components: {QuestionTimer, ImageSelectionList, BasicInstructions},\n  props: [\"questions\", \"is_mobile\"],\n  mixins: [timing],\n  mounted: function() {\n    this.imageOrder = [{\"url\": this.questions[0].target_image}, {\"url\": this.questions[0].foil_images[0]}, {\"url\": this.questions[0].foil_images[1]}]\n    this.durstenfeldShuffle(this.imageOrder)\n    this.$nextTick(function() {\n      this.recordStartTime()\n    })\n  },\n  data: function() {\n    return {\n      time_start: 0,\n      time_end: 0,\n      step:0,\n      selectedImage: null,\n      selectedNumber: null,\n      currentQuestion: 0,\n      currentImage: null,\n      selection_time: 0,\n      submission_time: 0,\n      complete: false,\n      responses: [],\n      imageOrder: [],\n      score: 0,\n      averages: {}\n    }\n  },\n  methods: {\n    incrementStep: function (event) {\n      this.step++;\n      this.recordStartTime()\n    },\n    // Modifies the original array\n    durstenfeldShuffle: function(arr) {\n      for(let i = arr.length -1; i>0; i--) {\n        const j = Math.floor(Math.random() *(i+1));\n        [arr[i], arr[j]] = [arr[j], arr[i]]\n      }\n    },\n\n    incrementQuestion: function (event) {\n      window.scrollTo(0,0)\n      this.currentQuestion++;\n      this.recordStartTime()\n      // If we are out of questions, move to the next phase\n      if (this.currentQuestion >= this.questions.length) {\n        this.complete = true;\n        this.averages = this.calculateAvgs()\n        this.$emit('complete', this.responses);\n        this.$emit('submission', this.createResult())\n        // Don't try to randomize image order and the like\n        return\n      }\n      //set the new image order\n      this.imageOrder = [{\"url\": this.questions[this.currentQuestion].target_image}, {\"url\": this.questions[this.currentQuestion].foil_images[0]}, {\"url\": this.questions[this.currentQuestion].foil_images[1]}]\n      // Randomize the image order\n      this.durstenfeldShuffle(this.imageOrder)\n    },\n    handleQuestionSubmission: function(selection, selection_cnt, selection_time, submission_time) {\n      this.selectedNumber = selection\n      this.selectedImage = this.imageOrder[selection].url\n      this.selection_time = selection_time\n      this.submission_time = submission_time\n      this.responses.push({\n        \"name\": this.questions[this.currentQuestion].name,\n        'question_id': this.questions[this.currentQuestion].question_id,\n        'response_image': this.selectedImage,\n        'correct': this.selectedImage === this.questions[this.currentQuestion].target_image,\n        'selection_time': this.selection_time,\n        'submission_time': this.submission_time,\n        'skipped': false,\n        'response_time': this.selection_time + this.submission_time\n      })\n      this.incrementQuestion()\n    },\n\n    buttonCallback: function(imageUrl, number) {\n      this.recordEndTime()\n      this.selectedImage = imageUrl\n      this.selectedNumber = number\n      this.responses.push({\n        \"name\": this.questions[this.currentQuestion].name,\n        'question_id': this.questions[this.currentQuestion].question_id,\n        'response_number': this.selectedNumber,\n        'response_image': this.selectedImage,\n        'correct': this.selectedImage === this.questions[this.currentQuestion].target_image,\n        'response_time': this.getTimeDiff()\n      })\n      this.incrementQuestion()\n    },\n    calculateAvgs: function() {\n      let cumulative_corr_rt = 0\n      let cumulative_incorr_rt = 0\n      let total_corr_count = 0\n      let total_incorrect_count = 0\n      let total_skipped = 0\n      this.responses.forEach((response) => {\n        if(response.correct) {\n          cumulative_corr_rt += response.response_time\n          total_corr_count += 1\n        }\n        else {\n          if(!response.skipped) {\n            cumulative_incorr_rt += response.response_time\n            total_incorrect_count += 1\n          } else {\n            total_skipped += 1\n          }\n        }\n      })\n\n      let corr_denom = total_corr_count > 0\n      let incorr_denom = total_incorrect_count > 0\n      this.score = total_corr_count\n      return {\n        \"avg_corr_rt\": corr_denom ? cumulative_corr_rt / total_corr_count : 0,\n        \"avg_incorr_rt\": incorr_denom ? cumulative_incorr_rt / total_incorrect_count : 0,\n        \"total_skipped\": total_skipped,\n      }\n    },\n\n    createResult: function() {\n      return {\n        \"user_results\": this.responses,\n        \"averages\": this.averages,\n        \"score\": this.score\n      }\n    },\n\n    handleTimeout() {\n      this.step += 1\n    },\n\n    handleQuestionSkip() {\n      this.step = 1\n      this.responses.push({\n        \"name\": this.questions[this.currentQuestion].name,\n        'question_id': this.questions[this.currentQuestion].question_id,\n        'response_image': null,\n        'correct': false,\n        'skipped': true,\n      })\n      this.incrementQuestion()\n    },\n\n  }\n}\n</script>\n\n<style scoped>\n\n</style>","import mod from \"-!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./FNameRecognitionPhase.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./FNameRecognitionPhase.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./FNameRecognitionPhase.vue?vue&type=template&id=0eec29cf&scoped=true\"\nimport script from \"./FNameRecognitionPhase.vue?vue&type=script&lang=js\"\nexport * from \"./FNameRecognitionPhase.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"0eec29cf\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"px-3 py-1\"},[(_vm.step === 0)?[_c('BasicInstructions',{attrs:{\"instruction_text\":_vm.gettext('Now please select the name of each person shown.'),\"display_bottom_button\":true,\"left_text\":_vm.is_mobile},on:{\"next\":_vm.incrementStep}})]:_vm._e(),(_vm.step === 1)?[_c('div',{},[_c('div',{staticClass:\"justify-content-center text-center my-2\"},[_c('p',[_vm._v(_vm._s(_vm.gettext('What is the name of this person?')))])]),_c('BasicStimuliImage',{key:`fname-match-${_vm.questions[_vm.currentQuestion].question_id}-${_vm.questions[_vm.currentQuestion].ordering_id}`,attrs:{\"custom_classname\":_vm.is_mobile ? 'img-stimuli-sm' : '',\"image_url\":_vm.questions[_vm.currentQuestion].target_image,\"id\":`image-${_vm.questions[_vm.currentQuestion].question_id}`}})],1),_c('div',{staticClass:\"d-flex align-items-stretch justify-content-center my-4\"},[_c('button',{ref:\"name-btn-1\",staticClass:\"btn btn-lg btn-primary mx-3\",on:{\"click\":function($event){return _vm.buttonCallback(_vm.nameOrder[0])}}},[_vm._v(_vm._s(_vm.nameOrder[0]))]),_c('button',{ref:\"name-btn-2\",staticClass:\"btn btn-lg btn-primary mx-3\",on:{\"click\":function($event){return _vm.buttonCallback(_vm.nameOrder[1])}}},[_vm._v(_vm._s(_vm.nameOrder[1]))]),_c('button',{ref:\"name-btn-3\",staticClass:\"btn btn-lg btn-primary mx-3\",on:{\"click\":function($event){return _vm.buttonCallback(_vm.nameOrder[2])}}},[_vm._v(_vm._s(_vm.nameOrder[2]))])]),_c('QuestionTimer',{key:`timer-${_vm.currentQuestion}`,ref:\"questionTimer\",attrs:{\"timeSeconds\":10},on:{\"timeout\":_vm.handleTimeout}})]:(_vm.step === 2)?[_c('BasicInstructions',{attrs:{\"instruction_text\":_vm.gettext('The question was not answered within the allowed time, please press continue to move to the next question.'),\"display_bottom_button\":true,\"bottom_button_text\":\"Continue\",\"left_text\":true},on:{\"next\":_vm.handleQuestionSkip}})]:_vm._e()],2)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div class=\"px-3 py-1\">\n        <template v-if=\"step === 0\">\n          <BasicInstructions v-bind:instruction_text=\"gettext('Now please select the name of each person shown.')\"\n                             v-on:next=\"incrementStep\"\n                             :display_bottom_button=\"true\"\n                             :left_text=\"is_mobile\"\n          ></BasicInstructions>\n        </template>\n        <template v-if=\"step === 1\">\n          <div class=\"\">\n              <div class=\"justify-content-center text-center my-2\">\n                <p>{{ gettext('What is the name of this person?')}}</p>\n              </div>\n              <BasicStimuliImage :custom_classname=\"is_mobile ? 'img-stimuli-sm' : ''\" :image_url=\"questions[currentQuestion].target_image\" :id=\"`image-${questions[currentQuestion].question_id}`\" :key=\"`fname-match-${questions[currentQuestion].question_id}-${questions[currentQuestion].ordering_id}`\"></BasicStimuliImage>\n          </div>\n          <div class=\"d-flex align-items-stretch justify-content-center my-4\">\n                <button class=\"btn btn-lg btn-primary mx-3\" ref=\"name-btn-1\" v-on:click=\"buttonCallback(nameOrder[0])\">{{nameOrder[0]}}</button>\n                <button class=\"btn btn-lg btn-primary mx-3\" ref=\"name-btn-2\" v-on:click=\"buttonCallback(nameOrder[1])\">{{ nameOrder[1] }}</button>\n                <button class=\"btn btn-lg btn-primary mx-3\" ref=\"name-btn-3\" v-on:click=\"buttonCallback(nameOrder[2])\">{{ nameOrder[2] }}</button>\n          </div>\n          <QuestionTimer\n              :timeSeconds=\"10\"\n              ref=\"questionTimer\"\n              :key=\"`timer-${currentQuestion}`\"\n              @timeout=\"handleTimeout\"\n          />\n        </template>\n      <template v-else-if=\"step === 2\">\n          <BasicInstructions v-bind:instruction_text=\"gettext('The question was not answered within the allowed time, please press continue to move to the next question.')\"\n                             :display_bottom_button=\"true\"\n                             bottom_button_text=\"Continue\"\n                             :left_text=\"true\"\n                             @next=\"handleQuestionSkip\"\n          />\n        </template>\n    </div>\n</template>\n\n<script>\nimport BasicInstructions from \"@/components/BasicInstructions\";\nimport BasicStimuliImage from \"@/components/BasicStimuliImage\";\nimport timing from \"@/timing\";\nimport QuestionTimer from \"@/components/utils/QuestionTimer.vue\";\nexport default {\n  name: \"FnameMatchingPhase\",\n  components: {QuestionTimer, BasicInstructions, BasicStimuliImage},\n  props: [\"questions\", \"is_mobile\"],\n  mixins: [timing],\n  mounted: function() {\n    // set the name order for the first question, shuffle it\n    this.nameOrder = [this.questions[0].target_name, this.questions[0].foil_names[0], this.questions[0].foil_names[1]]\n    this.durstenfeldShuffle(this.nameOrder)\n    this.$nextTick(function() {\n      this.recordStartTime();\n    })\n  },\n  data: function() {\n    return {\n      time_start: 0,\n      time_end: 0,\n      step:0,\n      selectedResponse: null,\n      currentQuestion: 0,\n      currentImage: null,\n      complete: false,\n      responses: [],\n      nameOrder: [],\n      averages: {},\n      score: 0,\n    }\n  },\n  methods: {\n    incrementStep: function (event) {\n      this.step++;\n      this.recordStartTime()\n    },\n\n    incrementQuestion: function (event) {\n      window.scrollTo(0,0)\n      this.currentQuestion++;\n      this.recordStartTime()\n      // If we are out of questions, move to the next phase\n      if (this.currentQuestion >= this.questions.length) {\n        this.complete = true;\n        this.averages = this.calculateAvgs()\n        this.$emit('complete', this.responses);\n        this.$emit('submission', this.createResult())\n        return\n      }\n      // Set the name array to the next question, shuffle it\n      this.nameOrder = [this.questions[this.currentQuestion].target_name, this.questions[this.currentQuestion].foil_names[0], this.questions[this.currentQuestion].foil_names[1]]\n      this.durstenfeldShuffle(this.nameOrder)\n    },\n    // Modifies the original array\n    durstenfeldShuffle: function(arr) {\n      for(let i = arr.length -1; i>0; i--) {\n        const j = Math.floor(Math.random() *(i+1));\n        [arr[i], arr[j]] = [arr[j], arr[i]]\n      }\n    },\n\n    buttonCallback: function(value) {\n      this.recordEndTime()\n      this.selectedResponse = value\n      this.responses.push({\n        \"name\": this.questions[this.currentQuestion].name,\n        'question_id': this.questions[this.currentQuestion].question_id,\n        'response': this.selectedResponse,\n        'correct': this.selectedResponse === this.questions[this.currentQuestion].target_name,\n        'response_time': this.getTimeDiff()\n      })\n      this.blurAllButtons()\n      this.incrementQuestion()\n    },\n    calculateAvgs: function() {\n      let cumulative_corr_rt = 0\n      let cumulative_incorr_rt = 0\n      let total_corr_count = 0\n      let total_incorrect_count = 0\n      let total_skipped = 0\n      this.responses.forEach((response) => {\n        if(response.correct) {\n          cumulative_corr_rt += response.response_time\n          total_corr_count += 1\n        }\n        else {\n          if(response.skipped) {\n            total_skipped += 1\n          } else {\n            cumulative_incorr_rt += response.response_time\n            total_incorrect_count += 1\n          }\n\n        }\n      })\n      let avg_corr_rt = total_corr_count > 0 ? cumulative_corr_rt / total_corr_count : 0\n      let avg_incorr_rt = total_incorrect_count > 0 ?  cumulative_incorr_rt / total_incorrect_count: 0\n      this.score = total_corr_count\n      return {\n        \"avg_corr_rt\": avg_corr_rt,\n        \"avg_incorr_rt\": avg_incorr_rt,\n        \"total_skipped\": total_skipped\n      }\n    },\n\n    blurAllButtons: function() {\n      this.$refs[\"name-btn-1\"].blur()\n      this.$refs[\"name-btn-2\"].blur()\n      this.$refs[\"name-btn-3\"].blur()\n    },\n\n    createResult: function() {\n      return {\n        \"user_results\": this.responses,\n        \"averages\": this.averages,\n        \"score\": this.score\n      }\n    },\n    handleTimeout() {\n      this.step += 1\n    },\n    handleQuestionSkip() {\n      this.step = 1\n      this.responses.push({\n        \"name\": this.questions[this.currentQuestion].name,\n        'question_id': this.questions[this.currentQuestion].question_id,\n        'correct': false,\n        'skipped': true,\n      })\n      this.incrementQuestion()\n    },\n\n  }\n}\n</script>\n\n<style scoped>\n\n</style>","import mod from \"-!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./FNameMatchingPhase.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./FNameMatchingPhase.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./FNameMatchingPhase.vue?vue&type=template&id=29485098&scoped=true\"\nimport script from \"./FNameMatchingPhase.vue?vue&type=script&lang=js\"\nexport * from \"./FNameMatchingPhase.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"29485098\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"px-lg-3 py-1 p-sm-1 px-sm-4 mx-sm-2\"},[(_vm.step === 0)?[_c('BasicInstructions',{attrs:{\"instruction_text\":_vm.gettext('Now please select the first letter of the person\\'s name.'),\"display_bottom_button\":true,\"left_text\":_vm.is_mobile},on:{\"next\":_vm.incrementStep}})]:_vm._e(),(_vm.step === 1)?[_c('BasicError',{attrs:{\"error\":_vm.error,\"error_msg\":_vm.error_msg}}),_c('div',{staticClass:\"px-sm-4\"},[_c('div',{staticClass:\"justify-content-center text-center my-2 px-sm-4\"},[_c('p',{staticClass:\"text-md-center\"},[_vm._v(_vm._s(_vm.gettext('What is the first letter of this person\\'s name?')))])]),_c('BasicStimuliImage',{key:`fname-initial-${_vm.questions[_vm.currentQuestion].question_id}-${_vm.questions[_vm.currentQuestion].ordering_id}`,attrs:{\"custom_classname\":_vm.is_mobile ? 'img-stimuli-sm' : '',\"image_url\":_vm.questions[_vm.currentQuestion].target_image,\"id\":`image-${_vm.questions[_vm.currentQuestion].question_id}`}})],1),_c('div',{staticClass:\"mt-3 row justify-content-center align-items-center\"},_vm._l((['q','w','e','r','t','y','u','i','o','p']),function(letter){return _c('div',{key:`letter-${letter}`,staticClass:\"mx-1\"},[_c('label',{attrs:{\"for\":'keyboard-selection-' + letter}},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.selectedLetter),expression:\"selectedLetter\"}],staticClass:\"d-none\",attrs:{\"type\":\"radio\",\"id\":'keyboard-selection-' + letter,\"name\":\"selected_letter\"},domProps:{\"value\":letter,\"checked\":_vm._q(_vm.selectedLetter,letter)},on:{\"input\":_vm.letterSelection,\"change\":function($event){_vm.selectedLetter=letter}}}),_c('h3',{staticClass:\"letters p-lg-3 p-sm-2\"},[_vm._v(_vm._s(letter.toUpperCase()))])])])}),0),_c('div',{staticClass:\"row justify-content-center align-items-center\"},_vm._l((['a','s','d','f','g','h','j','k','l']),function(letter){return _c('div',{key:`letter-${letter}`,staticClass:\"mx-1\"},[_c('label',{attrs:{\"for\":'keyboard-selection-' + letter}},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.selectedLetter),expression:\"selectedLetter\"}],staticClass:\"d-none\",attrs:{\"type\":\"radio\",\"id\":'keyboard-selection-' + letter,\"name\":\"selected_letter\"},domProps:{\"value\":letter,\"checked\":_vm._q(_vm.selectedLetter,letter)},on:{\"input\":_vm.letterSelection,\"change\":function($event){_vm.selectedLetter=letter}}}),_c('h3',{staticClass:\"letters p-lg-3 p-sm-2\"},[_vm._v(_vm._s(letter.toUpperCase()))])])])}),0),_c('div',{staticClass:\"row justify-content-center align-items-center\"},_vm._l((['z','x','c','v','b','n','m']),function(letter){return _c('div',{key:`letter-${letter}`,staticClass:\"mx-1\"},[_c('label',{attrs:{\"for\":'keyboard-selection-' + letter}},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.selectedLetter),expression:\"selectedLetter\"}],staticClass:\"d-none\",attrs:{\"type\":\"radio\",\"id\":'keyboard-selection-' + letter,\"name\":\"selected_letter\"},domProps:{\"value\":letter,\"checked\":_vm._q(_vm.selectedLetter,letter)},on:{\"input\":_vm.letterSelection,\"change\":function($event){_vm.selectedLetter=letter}}}),_c('h3',{staticClass:\"letters p-lg-3 p-sm-2\"},[_vm._v(_vm._s(letter.toUpperCase()))])])])}),0),_c('RightAlignButton',{attrs:{\"button_text\":'OK',\"click_callback\":_vm.buttonCallback}}),_c('QuestionTimer',{key:`timer-${_vm.currentQuestion}`,ref:\"questionTimer\",attrs:{\"timeSeconds\":10},on:{\"timeout\":_vm.handleTimeout}})]:(_vm.step === 2)?[_c('BasicInstructions',{attrs:{\"instruction_text\":_vm.gettext('The question was not answered within the allowed time, please press continue to move to the next question.'),\"display_bottom_button\":true,\"bottom_button_text\":\"Continue\",\"left_text\":true},on:{\"next\":_vm.handleQuestionSkip}})]:_vm._e()],2)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div class=\"px-lg-3 py-1 p-sm-1 px-sm-4 mx-sm-2\">\n        <template v-if=\"step === 0\">\n          <BasicInstructions v-bind:instruction_text=\"gettext('Now please select the first letter of the person\\'s name.')\"\n                             v-on:next=\"incrementStep\"\n                             :display_bottom_button=\"true\"\n                             :left_text=\"is_mobile\"\n          ></BasicInstructions>\n        </template>\n        <template v-if=\"step === 1\">\n          <BasicError :error=\"error\" :error_msg=\"error_msg\"></BasicError>\n          <div class=\"px-sm-4\">\n              <div class=\"justify-content-center text-center my-2 px-sm-4\">\n                <p class=\"text-md-center\">{{ gettext('What is the first letter of this person\\'s name?')}}</p>\n              </div>\n              <BasicStimuliImage :custom_classname=\"is_mobile ? 'img-stimuli-sm' : ''\" :image_url=\"questions[currentQuestion].target_image\" :id=\"`image-${questions[currentQuestion].question_id}`\" :key=\"`fname-initial-${questions[currentQuestion].question_id}-${questions[currentQuestion].ordering_id}`\"></BasicStimuliImage>\n          </div>\n          <div class=\" mt-3 row justify-content-center align-items-center\">\n            <div class=\"mx-1\" v-for=\"letter in ['q','w','e','r','t','y','u','i','o','p']\"\n                 :key=\"`letter-${letter}`\"\n            >\n              <label v-bind:for=\"'keyboard-selection-' + letter\">\n                  <input class=\"d-none\" type=\"radio\" :id=\"'keyboard-selection-' + letter\" name=\"selected_letter\" :value=\"letter\" v-model=\"selectedLetter\" v-on:input=\"letterSelection\">\n                  <h3 class=\"letters p-lg-3 p-sm-2\">{{letter.toUpperCase()}}</h3>\n              </label>\n\n            </div>\n          </div>\n          <div class=\"row justify-content-center align-items-center\">\n            <div class=\"mx-1\" v-for=\"letter in ['a','s','d','f','g','h','j','k','l']\"\n                 :key=\"`letter-${letter}`\"\n            >\n              <label v-bind:for=\"'keyboard-selection-' + letter\">\n                  <input class=\"d-none\" type=\"radio\" :id=\"'keyboard-selection-' + letter\" name=\"selected_letter\" :value=\"letter\" v-model=\"selectedLetter\" v-on:input=\"letterSelection\">\n                  <h3 class=\"letters p-lg-3 p-sm-2\">{{letter.toUpperCase()}}</h3>\n              </label>\n\n            </div>\n          </div>\n          <div class=\"row justify-content-center align-items-center\">\n            <div class=\"mx-1\" v-for=\"letter in ['z','x','c','v','b','n','m']\"\n                 :key=\"`letter-${letter}`\"\n            >\n              <label v-bind:for=\"'keyboard-selection-' + letter\">\n                  <input class=\"d-none\" type=\"radio\" :id=\"'keyboard-selection-' + letter\" name=\"selected_letter\" :value=\"letter\" v-model=\"selectedLetter\" v-on:input=\"letterSelection\">\n                  <h3 class=\"letters p-lg-3 p-sm-2\">{{letter.toUpperCase()}}</h3>\n              </label>\n\n            </div>\n          </div>\n          <RightAlignButton :button_text=\"'OK'\" :click_callback=\"buttonCallback\"></RightAlignButton>\n          <QuestionTimer\n              :timeSeconds=\"10\"\n              ref=\"questionTimer\"\n              :key=\"`timer-${currentQuestion}`\"\n              @timeout=\"handleTimeout\"\n          />\n        </template>\n        <template v-else-if=\"step === 2\">\n          <BasicInstructions v-bind:instruction_text=\"gettext('The question was not answered within the allowed time, please press continue to move to the next question.')\"\n                             :display_bottom_button=\"true\"\n                             bottom_button_text=\"Continue\"\n                             :left_text=\"true\"\n                             @next=\"handleQuestionSkip\"\n          />\n        </template>\n    </div>\n</template>\n\n<script>\nimport BasicInstructions from \"@/components/BasicInstructions\";\nimport BasicStimuliImage from \"@/components/BasicStimuliImage\";\nimport BasicError from \"@/components/BasicError\";\nimport timing from \"@/timing\";\nimport RightAlignButton from \"@/components/RightAlignButton\";\nimport QuestionTimer from \"@/components/utils/QuestionTimer.vue\";\nexport default {\n  name: \"FNameInitialPhase\",\n  components: {QuestionTimer, RightAlignButton, BasicInstructions, BasicStimuliImage, BasicError},\n  props: [\"questions\", \"is_mobile\"],\n  mixins: [timing],\n  mounted: function() {\n    // set the name order for the first question, shuffle it\n    this.nameOrder = [this.questions[0].target_name, this.questions[0].foil_names[0], this.questions[0].foil_names[1]]\n    this.durstenfeldShuffle(this.nameOrder)\n    this.$nextTick(function() {\n      this.recordStartTime();\n    })\n  },\n  data: function() {\n    return {\n      time_start: 0,\n      time_end: 0,\n      step:0,\n      selectedResponse: null,\n      currentQuestion: 0,\n      currentImage: null,\n      selectedLetter: null,\n      selectionTime: 0,\n      numberOfSelections: 0,\n      complete: false,\n      responses: [],\n      nameOrder: [],\n      submitInput: null,\n      error: false,\n      error_msg: \"\",\n      averages: {},\n      score: 0,\n    }\n  },\n  methods: {\n    incrementStep: function (event) {\n      this.step++;\n      this.recordStartTime()\n    },\n\n    incrementQuestion: function (event) {\n      window.scrollTo(0,0)\n      // reset the selected letter and the number of selections\n      this.selectedLetter = null\n      this.numberOfSelections = 0\n      this.error = false\n      this.error_msg = \"\"\n      this.currentQuestion++;\n      this.recordStartTime()\n      // If we are out of questions, move to the next phase\n      if (this.currentQuestion >= this.questions.length) {\n        this.complete = true;\n        this.averages = this.calculateAvgs()\n        this.$emit('complete', this.responses);\n        this.$emit('submission', this.createResult())\n        return\n      }\n      // Set the name array to the next question, shuffle it\n      this.nameOrder = [this.questions[this.currentQuestion].target_name, this.questions[this.currentQuestion].foil_names[0], this.questions[this.currentQuestion].foil_names[1]]\n      this.durstenfeldShuffle(this.nameOrder)\n    },\n    // Modifies the original array\n    durstenfeldShuffle: function(arr) {\n      for(let i = arr.length -1; i>0; i--) {\n        const j = Math.floor(Math.random() *(i+1));\n        [arr[i], arr[j]] = [arr[j], arr[i]]\n      }\n    },\n\n    letterSelection: function() {\n      this.recordEndTime()\n      this.selectionTime = this.getTimeDiff()\n      this.numberOfSelections++\n    },\n\n    buttonCallback: function() {\n      if(this.selectedLetter === null) {\n        this.error = true\n        this.error_msg = \"Please select a letter\"\n        return\n      }\n      this.recordEndTime()\n      this.responses.push({\n        \"name\": this.questions[this.currentQuestion].name,\n        'question_id': this.questions[this.currentQuestion].question_id,\n        'response': this.selectedLetter.toLowerCase(),\n        'correct': this.selectedLetter === this.questions[this.currentQuestion].target_name.toLowerCase()[0],\n        'response_time': this.getTimeDiff(),\n        'selection_time': this.selectionTime,\n        'number_of_selections': this.numberOfSelections\n      })\n      this.incrementQuestion()\n    },\n\n    calculateAvgs: function() {\n      let cumulative_corr_rt = 0\n      let cumulative_corr_selection_time = 0\n      let cumulative_incorr_selection_time = 0\n      let cumulative_incorr_rt = 0\n      let total_corr_count = 0\n      let total_incorr_count = 0\n      let cumulative_corr_selection_count = 0\n      let cumulative_incorr_selection_count = 0\n      let total_skipped = 0\n      this.responses.forEach((response) => {\n        if(response.correct) {\n          cumulative_corr_rt += response.response_time\n          cumulative_corr_selection_time += response.selection_time\n          cumulative_corr_selection_count += response.number_of_selections\n          total_corr_count += 1\n\n        }\n        else {\n          if(response.skipped) {\n            total_skipped += 1\n          } else {\n            cumulative_incorr_rt += response.response_time\n            cumulative_incorr_selection_time += response.selection_time\n            cumulative_incorr_selection_count += response.number_of_selections\n            total_incorr_count += 1\n          }\n\n        }\n      })\n      let corr_denom = total_corr_count > 0\n      let incorr_denom = total_incorr_count > 0\n      this.score = total_corr_count\n      return {\n        \"avg_corr_rt\": corr_denom ? cumulative_corr_rt / total_corr_count : 0,\n        \"avg_incorr_rt\": incorr_denom ? cumulative_incorr_rt / total_incorr_count : 0,\n        \"avg_corr_selection_time\": corr_denom ? cumulative_corr_selection_time / total_corr_count : 0,\n        \"avg_incorr_selection_time\": incorr_denom ? cumulative_incorr_selection_time / total_incorr_count : 0,\n        \"avg_corr_selection_count\": corr_denom ? cumulative_corr_selection_count / total_corr_count : 0,\n        \"avg_incorr_selection_count\": incorr_denom ? cumulative_incorr_selection_count / total_incorr_count : 0,\n        \"total_skipped\": total_skipped\n      }\n    },\n\n    createResult: function() {\n      return {\n        \"user_results\": this.responses,\n        \"averages\": this.averages,\n        \"score\": this.score\n      }\n    },\n    handleTimeout() {\n      this.step += 1\n    },\n    handleQuestionSkip() {\n      this.step = 1\n      this.responses.push({\n        \"name\": this.questions[this.currentQuestion].name,\n        'question_id': this.questions[this.currentQuestion].question_id,\n        'correct': false,\n        'skipped': true,\n      })\n      this.incrementQuestion()\n    },\n\n  }\n}\n</script>\n\n<style scoped>\n  h3 {\n    border-radius: 10%;\n  }\n  h3.letters {\n    background-color: lightgray;\n  }\n  label {\n          cursor: pointer;\n      }\n  input[type=\"radio\"] {\n      visibility: hidden;\n  }\n  input[type=\"radio\"]:checked+h3.letters {\n      outline: 5px solid red;\n  }\n\n</style>","import mod from \"-!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./FNameInitialPhase.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./FNameInitialPhase.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./FNameInitialPhase.vue?vue&type=template&id=93224120&scoped=true\"\nimport script from \"./FNameInitialPhase.vue?vue&type=script&lang=js\"\nexport * from \"./FNameInitialPhase.vue?vue&type=script&lang=js\"\nimport style0 from \"./FNameInitialPhase.vue?vue&type=style&index=0&id=93224120&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"93224120\",\n  null\n  \n)\n\nexport default component.exports","<template>\n  <div>\n    <div class=\"p-sm-0 p-lg-3\">\n\n        <template v-if=\"step === 0\">\n            <BasicInstructions v-bind:instruction_text=\"gettext('In this test, you will see pictures of faces and their names.')\"\n                               :second_text=\"gettext('Let\\'s practice first.')\"\n                               :third_text=\"gettext('Please ensure you have a stable internet connection before continuing.')\"\n                               :mobile_text=\"gettext('Please rotate your phone to landscape mode for the best experience. You may zoom in and out by using two fingers on the screen.')\"\n                               :mobile_text_special=\"gettext('Make sure you scroll down to see all question options!')\"\n                               :bold_text=\"gettext('Do not use the back button as it will restart the test.')\"\n                               v-on:next=\"incrementStep\"\n                               :left_text=\"is_mobile\"\n                               :display_bottom_button=\"true\">\n            </BasicInstructions>\n        </template>\n        <template v-else-if=\"step === 1 \">\n          <FnameLearningPhase :display_countdown_bar=\"display_countdown_bar\" :is_mobile=\"is_mobile\" :displayDuration=\"displayDuration\" :questions=\"mock_data\" v-on:complete=\"incrementStep\"></FnameLearningPhase>\n        </template>\n        <template v-else-if=\"step === 2 \">\n            <FnameRecognitionPhase :is_mobile=\"is_mobile\" :questions=\"mock_data\" v-on:complete=\"incrementStep\"></FnameRecognitionPhase>\n        </template>\n        <template v-else-if=\"step === 3 \">\n            <FNameInitialPhase :is_mobile=\"is_mobile\" :questions=\"mock_data\" v-on:complete=\"incrementStep\"></FNameInitialPhase>\n        </template>\n        <template v-else-if=\"step === 4 \">\n            <FnameMatchingPhase :is_mobile=\"is_mobile\" :questions=\"mock_data\" v-on:complete=\"incrementStep\"></FnameMatchingPhase>\n        </template>\n        <template v-else-if=\"step === 5\">\n          <div class=\"container align-content-center\">\n            <h2 v-if=\"title_text\">{{gettext(title_text)}}</h2>\n            <div class=\"my-3\">\n                <h2>{{gettext('End of the practice test!')}}</h2>\n                <p class=\"mt-lg-5 mt-sm-3 max-width-750 mx-auto\">{{ gettext('Would you like to retake the practice test?') }}</p>\n                <div class=\"d-flex justify-content-center\">\n                  <div>\n                    <button class=\"btn btn-lg btn-primary mx-2\" v-on:click=\"setStep(0)\">{{gettext('Yes')}}</button>\n                    <button class=\"btn btn-lg btn-primary mx-2\" v-on:click=\"incrementStep\">{{gettext('No')}}</button>\n                  </div>\n                </div>\n            </div>\n          </div>\n        </template>\n    </div>\n  </div>\n</template>\n\n<script>\n    import { fnamePractice } from \"@/practiceData\";\n    import BasicInstructions from \"@/components/BasicInstructions\";\n    import FnameLearningPhase from \"@/components/fname/learning/FNameLearningPhase\";\n    import FnameRecognitionPhase from \"@/components/fname/recognition/FNameRecognitionPhase\";\n    import FnameMatchingPhase from \"@/components/fname/matching/FNameMatchingPhase\";\n    import FNameInitialPhase from \"@/components/fname/initials/FNameInitialPhase\";\n    import phaseChip from \"@/phaseChip\";\n    export default {\n        components: {FNameInitialPhase, FnameMatchingPhase, FnameRecognitionPhase, FnameLearningPhase, BasicInstructions},\n        props: [\"displayDuration\", \"is_mobile\", \"display_countdown_bar\"],\n        created: function() {\n          phaseChip.label = \"practice\";\n        },\n        beforeDestroy: function() {\n          if (phaseChip.label === \"practice\") {\n            phaseChip.label = null;\n          }\n        },\n        data: function() {\n              return {\n                  step: 0,\n                  complete: false,\n                  mock_data: fnamePractice().questions\n              }\n          },\n          methods: {\n            setStep: function(value) {\n              this.step = value\n            },\n            incrementStep: function (event) {\n              this.step++;\n              if (this.step >= 6) {\n                this.complete = true;\n                this.$emit('complete');\n              }\n            },\n            decrementStep: function (event) {\n              this.step--;\n            },\n          }\n    }\n</script>","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./FNameInstructions.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./FNameInstructions.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./FNameInstructions.vue?vue&type=template&id=122a1261\"\nimport script from \"./FNameInstructions.vue?vue&type=script&lang=js\"\nexport * from \"./FNameInstructions.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"p-3\"},[_c('h4',[_vm._v(_vm._s(_vm.timeRemainingMinutes)+\":\"+_vm._s((10 > _vm.timeRemainingSeconds) ? \"0\" : \"\")+_vm._s(_vm.timeRemainingSeconds))])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n    <div class=\"p-3\">\n        <h4>{{ timeRemainingMinutes }}:{{ (10 > timeRemainingSeconds) ? \"0\" : \"\" }}{{ timeRemainingSeconds }}</h4>\n    </div>\n</template>\n\n<script>\nexport default {\n    props: {\n        timeMinutes: {\n            type: Number,\n            default: 0\n        },\n        // Absolute epoch-ms end time. When provided it is authoritative and\n        // overrides timeMinutes / stored-data restart logic, so the timer resumes\n        // to the correct remaining time on reload even if localStorage was cleared.\n        endTime: {\n            type: Number,\n            default: null\n        },\n        storageKey: {\n            type: String,\n            default: 'countdown_timer_end'\n        },\n        forceRestart: {\n            type: Boolean,\n            default: false\n        },\n        maxLifetimeHours: {\n            type: Number,\n            default: 24\n        }\n    },\n\n    data() {\n        return {\n            timeRemaining: 0,\n            timeRemainingMinutes: 0,\n            timeRemainingSeconds: 0,\n            endTimestamp: null,\n            intervalId: null\n        }\n    },\n\n    mounted() {\n        this.initializeTimer()\n    },\n\n    beforeUnmount() {\n        if (this.intervalId) {\n            clearInterval(this.intervalId)\n        }\n    },\n\n    methods: {\n        initializeTimer() {\n            const now = Date.now()\n\n            // An explicit absolute end time wins over everything else: no fresh\n            // full interval, no maxLifetime restart, no divergence from a sibling\n            // timer that removed the storage key on its own expiry.\n            if (this.endTime) {\n                this.endTimestamp = this.endTime\n                this.storeTimerData()\n                if (now >= this.endTimestamp) {\n                    this.handleTimerComplete()\n                    return\n                }\n                this.updateTimeRemaining()\n                this.startTimer()\n                return\n            }\n\n            const storedData = this.getStoredTimerData()\n\n            if (storedData && !this.forceRestart && this.isStoredDataValid(storedData)) {\n                this.endTimestamp = storedData.endTime\n\n                if (now >= this.endTimestamp) {\n                    this.handleTimerComplete()\n                    return\n                }\n            } else {\n                this.endTimestamp = now + (this.timeMinutes * 60 * 1000)\n                this.storeTimerData()\n            }\n\n            this.updateTimeRemaining()\n            this.startTimer()\n        },\n\n        getStoredTimerData() {\n            try {\n                const stored = localStorage.getItem(this.storageKey)\n                return stored ? JSON.parse(stored) : null\n            } catch (e) {\n                console.warn('Corrupted timer data found, clearing:', e)\n                localStorage.removeItem(this.storageKey)\n                return null\n            }\n        },\n\n        storeTimerData() {\n            const data = {\n                endTime: this.endTimestamp,\n                createdAt: Date.now(),\n                maxLifetime: this.maxLifetimeHours * 60 * 60 * 1000\n            }\n            localStorage.setItem(this.storageKey, JSON.stringify(data))\n        },\n\n        isStoredDataValid(storedData) {\n            const now = Date.now()\n\n            if (!storedData.endTime || !storedData.createdAt) {\n                return false\n            }\n\n            const dataAge = now - storedData.createdAt\n            const maxLifetime = storedData.maxLifetime || (this.maxLifetimeHours * 60 * 60 * 1000)\n\n            if (dataAge > maxLifetime) {\n                console.info(`Timer data expired after ${Math.round(dataAge / (60 * 60 * 1000))} hours`)\n                return false\n            }\n\n            return true\n        },\n\n        updateTimeRemaining() {\n            const now = Date.now()\n            const remaining = Math.max(0, this.endTimestamp - now)\n\n            this.timeRemaining = Math.ceil(remaining / 1000)\n            this.timeRemainingMinutes = Math.floor(this.timeRemaining / 60)\n            this.timeRemainingSeconds = this.timeRemaining % 60\n\n            if (this.timeRemaining <= 0) {\n                this.handleTimerComplete()\n            }\n        },\n\n        startTimer() {\n            if (this.intervalId) {\n                clearInterval(this.intervalId)\n            }\n\n            this.intervalId = setInterval(() => {\n                this.updateTimeRemaining()\n            }, 1000)\n        },\n\n        handleTimerComplete() {\n            if (this.intervalId) {\n                clearInterval(this.intervalId)\n                this.intervalId = null\n            }\n\n            localStorage.removeItem(this.storageKey)\n\n            this.timeRemaining = 0\n            this.timeRemainingMinutes = 0\n            this.timeRemainingSeconds = 0\n\n            this.$emit(\"complete\")\n        },\n\n        restart() {\n            localStorage.removeItem(this.storageKey)\n            this.initializeTimer()\n        },\n\n        clear() {\n            // Stop the timer\n            if (this.intervalId) {\n                clearInterval(this.intervalId)\n                this.intervalId = null\n            }\n\n            // Clear localStorage\n            localStorage.removeItem(this.storageKey)\n\n            // Reset all timer values\n            this.timeRemaining = 0\n            this.timeRemainingMinutes = 0\n            this.timeRemainingSeconds = 0\n            this.endTimestamp = null\n        },\n\n        getEndTimestamp() {\n            return this.endTimestamp\n        },\n\n        getStoredDataInfo() {\n            const storedData = this.getStoredTimerData()\n            if (!storedData) return null\n\n            const now = Date.now()\n            const dataAge = now - storedData.createdAt\n            const maxLifetime = storedData.maxLifetime || (this.maxLifetimeHours * 60 * 60 * 1000)\n            const remainingLifetime = Math.max(0, maxLifetime - dataAge)\n\n            return {\n                isValid: this.isStoredDataValid(storedData),\n                ageHours: Math.round(dataAge / (60 * 60 * 1000) * 10) / 10,\n                remainingLifetimeHours: Math.round(remainingLifetime / (60 * 60 * 1000) * 10) / 10,\n                maxLifetimeHours: this.maxLifetimeHours\n            }\n        }\n    }\n}\n</script>","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./CountdownTimer.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./CountdownTimer.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./CountdownTimer.vue?vue&type=template&id=62d515a0\"\nimport script from \"./CountdownTimer.vue?vue&type=script&lang=js\"\nexport * from \"./CountdownTimer.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports","<template>\n    <div class=\"px-sm-1 px-lg-3 pt-lg-3 pt-sm-1\">\n        <template v-if=\"step === 0\">\n          <FNameInstructions :display_countdown_bar=\"display_countdown_bar\" :displayDuration=\"display_duration\" v-on:complete=\"incrementStep\" :is_mobile=\"is_mobile\"></FNameInstructions>\n        </template>\n\n        <template v-else-if=\"step === 1\">\n            <FnameLearningPhase :questions=\"learning_json_data\"\n                                :displayDuration=\"display_duration\"\n                                :display_countdown_bar=\"display_countdown_bar\"\n                                v-on:complete=\"incrementStep\"\n                                v-on:submission=\"handleLearningSubmission\"\n                                :is_mobile=\"is_mobile\"\n            ></FnameLearningPhase>\n        </template>\n\n        <template v-else-if=\"step === 2\">\n            <FnameRecognitionPhase :questions=\"recognition_json_data\"\n                                   v-on:complete=\"incrementStep\"\n                                   v-on:submission=\"handleRecognitionSubmission\"\n                                   :is_mobile=\"is_mobile\"\n            ></FnameRecognitionPhase>\n        </template>\n        <template v-else-if=\"step === 3\">\n          <FNameInitialPhase :questions=\"initial_json_data\"\n                              v-on:complete=\"incrementStep\"\n                              v-on:submission=\"handleInitialsSubmission\"\n                             :is_mobile=\"is_mobile\"\n          ></FNameInitialPhase>\n        </template>\n        <template v-else-if=\"step === 4\">\n          <FnameMatchingPhase :questions=\"matching_json_data\"\n                              v-on:complete=\"incrementStep\"\n                              v-on:submission=\"handleMatchingSubmission\"\n                              :is_mobile=\"is_mobile\"\n          ></FnameMatchingPhase>\n        </template>\n\n        <template v-else-if=\"step === 5\">\n          <div class=\"my-4\">\n            <p class=\"font-weight-bold\">{{ gettext(\"Please do not close this window.\") }}</p>\n            <p>{{ gettext(\"Your results have been recorded! The rest of this test will begin in: \") }}</p>\n            <CountdownTimer\n                v-on:complete=incrementStep\n                :timeMinutes=\"json_data.display_wait_interval\"\n                :endTime=\"resume_delay_end_time\"\n                :storage-key=\"`timer-fname-driver-${participant_id}`\"\n                :max-lifetime-hours=\"3\"\n            />\n            <button\n                v-if=\"allow_defer\"\n                type=\"button\"\n                class=\"btn btn-primary mt-3\"\n                @click=\"$emit('defer', createResults())\"\n            >{{ gettext(\"Continue to Next Test\") }}</button>\n          </div>\n        </template>\n        <template v-else-if=\"step===6\">\n          <div class=\"my-4\">\n            <BasicInstructions :instruction_text=\"gettext('A few minutes ago you saw several faces and their names. Please select the faces you saw before.')\"\n                               v-on:next=\"incrementStep\"\n                               :display_bottom_button=\"true\"\n            ></BasicInstructions>\n          </div>\n        </template>\n        <template v-else-if=\"step === 7\">\n          <FnameRecognitionPhase :questions=\"recognition_json_data\"\n                                  v-on:complete=\"incrementStep\"\n                                  v-on:submission=\"handleRecognitionDelayedSubmission\"\n                                  :is_mobile=\"is_mobile\"\n          ></FnameRecognitionPhase>\n        </template>\n        <template v-else-if=\"step === 8\">\n          <FNameInitialPhase :questions=\"initial_json_data_delayed\"\n                              v-on:complete=\"incrementStep\"\n                              v-on:submission=\"handleInitialsDelayedSubmission\"\n                             :is_mobile=\"is_mobile\"\n          ></FNameInitialPhase>\n\n        </template>\n        <template v-else-if=\"step === 9\">\n          <FnameMatchingPhase :questions=\"matching_json_data_delayed\"\n                              v-on:complete=\"incrementStep\"\n                              v-on:submission=\"handleMatchingDelayedSubmission\"\n                              :is_mobile=\"is_mobile\"\n          ></FnameMatchingPhase>\n        </template>\n        <template v-else>\n          <div class=\"my-4\">\n            <p>{{ gettext(this.end_message)}}</p>\n          </div>\n        </template>\n    </div>\n</template>\n\n<script>\n    import \"whatwg-fetch\";\n    import FNameInstructions from \"@/components/fname/FNameInstructions\";\n    import FnameLearningPhase from \"@/components/fname/learning/FNameLearningPhase\";\n    import FnameRecognitionPhase from \"@/components/fname/recognition/FNameRecognitionPhase\";\n    import FnameMatchingPhase from \"@/components/fname/matching/FNameMatchingPhase\";\n    import FNameInitialPhase from \"@/components/fname/initials/FNameInitialPhase\";\n    import CountdownTimer from \"@/components/CountdownTimer\";\n    import BasicInstructions from \"@/components/BasicInstructions\";\n    import phaseChip from \"@/phaseChip\";\n\n    export default {\n        name: \"FNameDriver\",\n        components: {\n          BasicInstructions,\n          CountdownTimer,\n          FNameInitialPhase, FnameMatchingPhase, FnameRecognitionPhase, FnameLearningPhase, FNameInstructions, },\n        props: [\"json_data\", \"is_mobile\", \"participant_id\", \"allow_defer\"],\n        mounted: function () {\n            this.test_id = this.json_data.id;\n            this.test_type = this.json_data.test_type;\n            this.display_duration = this.json_data.display_seconds * 1000;\n            this.learning_json_data = this.json_data.questions_learning;\n            this.recognition_json_data = this.json_data.questions_recognition;\n            this.matching_json_data = this.json_data.questions_matching;\n            this.initial_json_data = this.json_data.questions_initial;\n            this.recognition_json_data_delayed = this.json_data.questions_recognition_delayed;\n            this.matching_json_data_delayed = this.json_data.questions_matching_delayed;\n            this.initial_json_data_delayed = this.json_data.questions_initial_delayed;\n            this.display_countdown_bar = this.json_data.display_countdown_bar\n            // Prefer the explicit resume payload (correct even when FName completes\n            // out of order after being deferred); fall back to the legacy index.\n            const results = this.json_data.results\n            const result_test_num = this.json_data.test_number - 1\n            let result_data = this.json_data.resume_result || null\n            if (!result_data && results && results.length >= this.json_data.test_number) {\n              result_data = this.json_data.results[result_test_num];\n            }\n            if (result_data) {\n              this.processInitialData(result_data)\n              // Deferred FName: decide whether to resume on the wait screen or jump\n              // straight to the delayed portion, driven by the absolute delay end\n              // time. Once the delayed portion is actually in progress we keep the\n              // restored step so we don't lose progress on reload.\n              if (result_data.delayed_pending && !result_data.delayed_in_progress) {\n                const now = Date.now()\n                const end = result_data.delay_end_time\n                if (end && now >= end) {\n                  this.step = 6\n                } else {\n                  this.step = 5\n                  this.resume_delay_end_time = end\n                }\n              }\n            }\n        },\n        data: function() {\n            return {\n                step: 0,\n                display_duration: 0,\n                display_countdown_bar: false,\n                learning_json_data: {},\n                recognition_json_data: {},\n                matching_json_data: {},\n                initial_json_data: {},\n                recognition_json_data_delayed: {},\n                matching_json_data_delayed: {},\n                initial_json_data_delayed: {},\n                learning_results: [],\n                recognition_results: [],\n                matching_results: [],\n                initials_results: [],\n                recognition_delayed_results: [],\n                matching_delayed_results: [],\n                initials_delayed_results: [],\n                task_scores: {\n                  \"recognition_score\": 0,\n                  \"matching_score\": 0,\n                  \"initials_score\": 0,\n                  \"recognition_delayed_score\": 0,\n                  \"matching_delayed_score\": 0,\n                  \"initials_delayed_score\": 0\n                },\n                test_id: null,\n                test_type: null,\n                complete: false,\n                initial_score: 0,\n                delayed_score: 0,\n                averages: {},\n                end_message: \"Thank you for taking the Face-Name test.\",\n                total_skipped: 0,\n                // Absolute delay end time when resuming a deferred FName wait screen.\n                resume_delay_end_time: null,\n            }\n        },\n        watch: {\n            // Step 0 is the practice (FNameInstructions sets its own chip); steps 1-9 are the test\n            step: {\n                immediate: true,\n                handler: function(step) {\n                    if (step > 0 && step < 10) {\n                        phaseChip.label = \"test\";\n                    } else if (phaseChip.label === \"test\") {\n                        phaseChip.label = null;\n                    }\n                }\n            }\n        },\n        beforeDestroy: function() {\n            if (phaseChip.label === \"test\") {\n                phaseChip.label = null;\n            }\n        },\n        methods: {\n            incrementStep: function(event) {\n                this.step++;\n                if(this.step === 6) {\n                  // Emit a submission to signal the timer has been completed.\n                  this.$emit(\"submission\", this.createResults(), \"FNAME_TIMER_COMPLETE\")\n                }\n                // There are only 9 steps defined in the template, so step 10 is when the Fname Test is complete\n                if(this.step >= 10) {\n                    this.complete = true;\n                    this.$emit(\"submission\", this.createResults(), \"FNAME_DRIVER_COMPLETE_SUBMIT\", this.complete)\n                    // Need to let the data update from the above emit to avoid race conditions, \"complete\" will resubmit with an updated flag.\n                    this.$nextTick(() => {\n\n                      this.$emit('complete');\n                    })\n                }\n            },\n            decrementStep: function(event) {\n                this.step--;\n            },\n            handleLearningSubmission: function(results) {\n              this.learning_results = results.user_results\n              this.averages[\"learning_averages\"] = results.averages\n              this.$emit(\"submission\", this.createResults(), \"FNAME_LEARNING_SUBMIT\")\n            },\n            handleRecognitionSubmission: function(results) {\n              this.recognition_results = results.user_results\n              this.averages[\"recognition_averages\"] = results.averages\n              let skipped_this_phase = results.averages.total_skipped\n              if(skipped_this_phase >= 0) {\n                this.total_skipped += skipped_this_phase\n              }\n              this.initial_score += results.score\n              this.task_scores.recognition_score = results.score\n              this.$emit(\"submission\", this.createResults(), \"FNAME_RECOGNITION_SUBMIT\")\n\n            },\n            handleMatchingSubmission: function(results) {\n              this.matching_results = results.user_results\n              this.averages[\"matching_averages\"] = results.averages\n              let skipped_this_phase = results.averages.total_skipped\n              if(skipped_this_phase >= 0) {\n                this.total_skipped += skipped_this_phase\n              }\n              this.initial_score += results.score\n              this.task_scores.matching_score = results.score\n              this.$emit(\"submission\", this.createResults(), \"FNAME_MATCHING_SUBMIT\")\n            },\n            handleInitialsSubmission: function(results) {\n              this.initials_results = results.user_results\n              this.averages[\"initials_averages\"] = results.averages\n              let skipped_this_phase = results.averages.total_skipped\n              if(skipped_this_phase >= 0) {\n                this.total_skipped += skipped_this_phase\n              }\n              this.initial_score += results.score\n              this.task_scores.initials_score = results.score\n              this.$emit(\"submission\", this.createResults(), \"FNAME_INITIALS_SUBMIT\")\n            },\n          handleRecognitionDelayedSubmission: function(results) {\n              this.recognition_delayed_results = results.user_results\n              this.averages[\"recognition_delayed_averages\"] = results.averages\n              let skipped_this_phase = results.averages.total_skipped\n              if(skipped_this_phase >= 0) {\n                this.total_skipped += skipped_this_phase\n              }\n              this.delayed_score += results.score\n              this.task_scores.recognition_delayed_score = results.score\n              this.$emit(\"submission\", this.createResults(), \"FNAME_RECOGNITION_DELAYED_SUBMIT\")\n            },\n            handleMatchingDelayedSubmission: function(results) {\n              this.matching_delayed_results = results.user_results\n              this.averages[\"matching_delayed_averages\"] = results.averages\n              let skipped_this_phase = results.averages.total_skipped\n              if(skipped_this_phase >= 0) {\n                this.total_skipped += skipped_this_phase\n              }\n              this.delayed_score += results.score\n              this.task_scores.matching_delayed_score = results.score\n              this.$emit(\"submission\", this.createResults(), \"FNAME_MATCHING_DELAYED_SUBMIT\")\n            },\n            handleInitialsDelayedSubmission: function(results) {\n              this.initials_delayed_results = results.user_results\n              this.averages[\"initials_delayed_averages\"] = results.averages\n              let skipped_this_phase = results.averages.total_skipped\n              if(skipped_this_phase >= 0) {\n                this.total_skipped += skipped_this_phase\n              }\n              this.delayed_score += results.score\n              this.task_scores.initials_delayed_score = results.score\n              this.$emit(\"submission\", this.createResults(), \"FNAME_INITIALS_DELAYED_SUBMIT\")\n            },\n\n            processInitialData: function(savedResults = null) {\n              // If we have saved results, restore the state from them\n              if (savedResults) {\n                  // Restore current step\n                  this.step = savedResults.current_step || 0;\n\n                  // Restore completion status\n                  this.complete = savedResults.is_complete || false;\n\n                  // Restore user results for each phase\n                  if (savedResults.user_results) {\n                      this.learning_results = savedResults.user_results.learning || [];\n                      this.recognition_results = savedResults.user_results.recognition || [];\n                      this.matching_results = savedResults.user_results.matching || [];\n                      this.initials_results = savedResults.user_results.initials || [];\n                      this.recognition_delayed_results = savedResults.user_results.recognition_delayed || [];\n                      this.matching_delayed_results = savedResults.user_results.matching_delayed || [];\n                      this.initials_delayed_results = savedResults.user_results.initials_delayed || [];\n                  }\n\n                  // Restore scores\n                  if (savedResults.scores) {\n                      this.initial_score = savedResults.scores.initial_score || 0;\n                      this.delayed_score = savedResults.scores.delayed_score || 0;\n                  }\n\n                  // Restore task scores\n                  if (savedResults.task_scores) {\n                      this.task_scores = {\n                          recognition_score: savedResults.task_scores.recognition_score || 0,\n                          matching_score: savedResults.task_scores.matching_score || 0,\n                          initials_score: savedResults.task_scores.initials_score || 0,\n                          recognition_delayed_score: savedResults.task_scores.recognition_delayed_score || 0,\n                          matching_delayed_score: savedResults.task_scores.matching_delayed_score || 0,\n                          initials_delayed_score: savedResults.task_scores.initials_delayed_score || 0\n                      };\n                  }\n\n                  // Restore averages\n                  this.averages = savedResults.averages || {};\n              }\n              else {\n                  // No saved results, ensure we start fresh\n                  this.step = 0;\n                  this.complete = false;\n                  this.learning_results = [];\n                  this.recognition_results = [];\n                  this.matching_results = [];\n                  this.initials_results = [];\n                  this.recognition_delayed_results = [];\n                  this.matching_delayed_results = [];\n                  this.initials_delayed_results = [];\n                  this.initial_score = 0;\n                  this.delayed_score = 0;\n                  this.task_scores = {\n                      recognition_score: 0,\n                      matching_score: 0,\n                      initials_score: 0,\n                      recognition_delayed_score: 0,\n                      matching_delayed_score: 0,\n                      initials_delayed_score: 0\n                  };\n                  this.averages = {};\n              }\n            },\n            createResults: function() {\n              let total_initial_questions_answered = this.recognition_results.length + this.matching_results.length + this.initials_results.length\n              let total_delayed_questions_answered = this.recognition_delayed_results.length + this.matching_delayed_results.length + this.initials_delayed_results.length\n              let total_questions_answered = total_initial_questions_answered + total_delayed_questions_answered\n              return {\n                current_step: this.step,\n                start_time: this.time_start,\n                finish_time: this.time_end,\n                test_id: this.test_id,\n                test_type: this.test_type,\n                is_complete: this.complete,\n                user_results: {\n                    learning: this.learning_results,\n                    recognition: this.recognition_results,\n                    matching: this.matching_results,\n                    initials: this.initials_results,\n                    recognition_delayed: this.recognition_delayed_results,\n                    matching_delayed: this.matching_delayed_results,\n                    initials_delayed: this.initials_delayed_results,\n                },\n                averages: this.averages,\n                scores: {\n                  total_score: this.initial_score + this.delayed_score,\n                  initial_score: this.initial_score,\n                  delayed_score: this.delayed_score,\n                  initial_questions_answered: total_initial_questions_answered,\n                  total_delayed_questions_answered: total_delayed_questions_answered,\n                  total_questions_answered: total_questions_answered\n                },\n                task_scores: this.task_scores,\n                total_skipped: this.total_skipped,\n              }\n            }\n\n\n        }\n    }\n</script>\n\n<style scoped>\n</style>","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./FNameDriver.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./FNameDriver.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./FNameDriver.vue?vue&type=template&id=2eb2a81d&scoped=true\"\nimport script from \"./FNameDriver.vue?vue&type=script&lang=js\"\nexport * from \"./FNameDriver.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"2eb2a81d\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"fname-delay-badge\",class:{ 'fname-delay-badge--ready': _vm.expired },attrs:{\"role\":\"button\",\"tabindex\":\"0\",\"title\":_vm.hintMessage},on:{\"click\":_vm.handleClick,\"keyup\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\"))return null;return _vm.handleClick.apply(null, arguments)}}},[_c('font-awesome-icon',{staticClass:\"fname-delay-badge__icon\",attrs:{\"icon\":_vm.expired ? 'fa-solid fa-circle-check' : 'fa-solid fa-hourglass-half'}}),_c('div',{staticClass:\"fname-delay-badge__text\"},[_c('div',{staticClass:\"fname-delay-badge__label\"},[_vm._v(_vm._s(_vm.gettext(\"Face-Name test\")))]),_c('div',{staticClass:\"fname-delay-badge__time\"},[(_vm.expired)?[_vm._v(_vm._s(_vm.gettext(\"Ready\")))]:[_vm._v(_vm._s(_vm.display))]],2)])],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n    <div class=\"fname-delay-badge\"\n         :class=\"{ 'fname-delay-badge--ready': expired }\"\n         role=\"button\"\n         tabindex=\"0\"\n         :title=\"hintMessage\"\n         @click=\"handleClick\"\n         @keyup.enter=\"handleClick\">\n        <font-awesome-icon\n            :icon=\"expired ? 'fa-solid fa-circle-check' : 'fa-solid fa-hourglass-half'\"\n            class=\"fname-delay-badge__icon\" />\n        <div class=\"fname-delay-badge__text\">\n            <div class=\"fname-delay-badge__label\">{{ gettext(\"Face-Name test\") }}</div>\n            <div class=\"fname-delay-badge__time\">\n                <template v-if=\"expired\">{{ gettext(\"Ready\") }}</template>\n                <template v-else>{{ display }}</template>\n            </div>\n        </div>\n    </div>\n</template>\n\n<script>\n// Floating, top-left countdown for a deferred FName delayed portion. It is\n// display + intent only: clicking never navigates, so it can never pull the\n// participant out of an in-progress test mid-question. The participant is routed\n// back to the FName delayed portion at a test boundary (handled in App.vue).\n// The absolute `endTime` (from the backend) is authoritative and survives reloads.\nexport default {\n    name: \"FnameDelayBadge\",\n    props: {\n        endTime: {\n            type: Number,\n            required: true,\n        },\n    },\n    data() {\n        return {\n            remaining: 0,\n            expired: false,\n            intervalId: null,\n        };\n    },\n    mounted() {\n        this.tick();\n        this.intervalId = setInterval(this.tick, 1000);\n    },\n    beforeDestroy() {\n        if (this.intervalId) {\n            clearInterval(this.intervalId);\n            this.intervalId = null;\n        }\n    },\n    computed: {\n        display() {\n            const total = Math.max(0, Math.ceil(this.remaining / 1000));\n            const minutes = Math.floor(total / 60);\n            const seconds = total % 60;\n            return `${minutes}:${seconds < 10 ? \"0\" : \"\"}${seconds}`;\n        },\n        hintMessage() {\n            return this.expired\n                ? this.gettext(\"You'll continue the Face-Name test after you finish this one.\")\n                : this.gettext(\"The final part of the Face-Name test is still counting down.\");\n        },\n    },\n    methods: {\n        tick() {\n            this.remaining = Math.max(0, this.endTime - Date.now());\n            if (this.remaining <= 0 && !this.expired) {\n                this.expired = true;\n                if (this.intervalId) {\n                    clearInterval(this.intervalId);\n                    this.intervalId = null;\n                }\n                this.$emit(\"expired\");\n            }\n        },\n        handleClick() {\n            // Intentionally non-navigational — surface a hint only.\n            this.$emit(\"info\");\n            window.alert(this.hintMessage);\n        },\n    },\n};\n</script>\n\n<style scoped>\n.fname-delay-badge {\n    position: fixed;\n    top: 5px;\n    left: 20px;\n    z-index: 1000;\n    display: flex;\n    align-items: center;\n    gap: 8px;\n    padding: 6px 12px;\n    border-radius: 20px;\n    background: #6c757d;\n    color: #fff;\n    cursor: pointer;\n    box-shadow: 0 2px 6px rgba(0, 0, 0, 0.2);\n    user-select: none;\n}\n\n.fname-delay-badge--ready {\n    background: #28a745;\n}\n\n.fname-delay-badge__icon {\n    font-size: 1.1rem;\n}\n\n.fname-delay-badge__text {\n    text-align: left;\n    line-height: 1.1;\n}\n\n.fname-delay-badge__label {\n    font-size: 0.7rem;\n    text-transform: uppercase;\n    letter-spacing: 0.03em;\n    opacity: 0.9;\n}\n\n.fname-delay-badge__time {\n    font-size: 0.95rem;\n    font-weight: 700;\n    font-variant-numeric: tabular-nums;\n}\n\n/* Below 1150px the app content spans full width (no left margin), so the\n   top-left badge would overlap the \"Practice\"/\"Test\" chip. Pin a compact,\n   icon+time pill to the bottom-left instead — still fixed and always visible,\n   but clear of the header and content chips. */\n@media (max-width: 1150px) {\n    .fname-delay-badge {\n        top: auto;\n        bottom: 12px;\n        left: 12px;\n        padding: 5px 10px;\n    }\n\n    .fname-delay-badge__label {\n        display: none;\n    }\n}\n</style>\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./FnameDelayBadge.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./FnameDelayBadge.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./FnameDelayBadge.vue?vue&type=template&id=ba7b7eea&scoped=true\"\nimport script from \"./FnameDelayBadge.vue?vue&type=script&lang=js\"\nexport * from \"./FnameDelayBadge.vue?vue&type=script&lang=js\"\nimport style0 from \"./FnameDelayBadge.vue?vue&type=style&index=0&id=ba7b7eea&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"ba7b7eea\",\n  null\n  \n)\n\nexport default component.exports","<template>\n    <div id=\"app\">\n        <div class=\"d-flex justify-content-center align-items-center\" v-if=\"test_json && step === 1\">\n            <h5 class=\"mb-0\">{{test_name_header}}</h5>\n            <div v-if=\"phase_chip.label === 'practice'\" class=\"chip chip-orange d-flex ml-2\">\n                <p class=\"m-0\">{{gettext(\"Practice\")}}</p>\n            </div>\n            <div v-else-if=\"phase_chip.label === 'test'\" class=\"chip chip-green d-flex ml-2\">\n                <p class=\"m-0\">{{gettext(\"Test\")}}</p>\n            </div>\n        </div>\n        <!-- Floating countdown for a deferred FName delayed portion (shown while\n             the participant works through the other trial tests). -->\n        <FnameDelayBadge\n            v-if=\"is_clinical_trial && step === 1 && fname_delayed_pending && fname_delay_end_time && test_json.test_type !== 'fname'\"\n            :endTime=\"fname_delay_end_time\" />\n        <!-- Admin Controls Dropdown -->\n        <div v-if=\"is_clinical_trial && step === 1\" class=\"admin-controls-container\">\n            <div class=\"dropdown\">\n                <button class=\"btn btn-link admin-controls-btn text-muted\"\n                        type=\"button\"\n                        id=\"adminControlsDropdown\"\n                        data-toggle=\"dropdown\"\n                        aria-haspopup=\"true\"\n                        aria-expanded=\"false\">\n                    <font-awesome-icon icon=\"fa-solid fa-circle-info\" />\n                </button>\n                <div class=\"dropdown-menu dropdown-menu-right\" aria-labelledby=\"adminControlsDropdown\">\n                    <h6 class=\"dropdown-header\">{{ gettext(\"Admin Controls\") }}</h6>\n                    <button class=\"dropdown-item text-danger\" @click=\"confirmSkipTest\">\n                        <font-awesome-icon icon=\"fa-solid fa-forward\" class=\"mr-2\" />\n                        {{ gettext(\"Skip this test\") }}\n                    </button>\n                </div>\n            </div>\n        </div>\n        <div class=\"app-container px-0 pb-lg-3 pb-sm-0 mx-sm-0 mx-lg-auto my-lg-3 my-sm-0\">\n            <template v-if=\"test_loading\">\n                <h1 class=\"mb-3\">{{ gettext(\"Loading...\") }}</h1>\n                <LoadingSpinner size=\"2x\"/>\n            </template>\n            <template v-else>\n                <div v-if=\"show_header\" :class=\"end_text_class !== '' && step !== 0 ? `${end_text_class} app-header` : 'app-header'\">\n                    <h4>{{ gettext(\"Multicultural Alzheimer's Prevention Program\") }}</h4>\n                </div>\n                <template v-if=\"endpoint === null\">\n                    <div class=\"p-3\">\n                      <h5 class=\"text-left\">{{gettext(\"The MAPP Remote tests were authored by Yakeel T. Quiroz PhD, Clara Vila - Castelar PhD, Ana Baena MA, Joshua Fox - Fuller PhD, Paula Aduen PhD, and Averi Giudicessi MA © Multicultural Alzheimer’s Prevention Program, Massachusetts General Hospital, 2020\") }}</h5>\n\n                      <div class=\"my-2\">\n                        <div v-if=\"production_env\">\n                          <div>\n                            <a class=\"btn btn-primary my-1\" href=\"https://www.mappremote.com/clinical/mapp/\">Start From Beginning</a>\n                          </div>\n                          <div>\n                            <a class=\"btn btn-primary my-1\" href=\"https://www.mappremote.com/clinical/mapp/?skip=1\">Start From Test 2</a>\n                          </div>\n                          <div>\n                            <a class=\"btn btn-primary my-1\" href=\"https://www.mappremote.com/clinical/mapp/?skip=2\">Start From Test 3</a>\n                          </div>\n                        </div>\n                        <div v-else>\n                          <div>\n                            <a class=\"btn btn-primary my-1\" href=\"https://dev.mappremote.com/clinical/mapp/\">Start From Beginning</a>\n                          </div>\n                          <div>\n                            <a class=\"btn btn-primary my-1\" href=\"https://dev.mappremote.com/clinical/mapp/?skip=1\">Start From Test 2</a>\n                          </div>\n                          <div>\n                            <a class=\"btn btn-primary my-1\" href=\"https://dev.mappremote.com/clinical/mapp/?skip=2\">Start From Test 3</a>\n                          </div>\n\n<!--                          <div>-->\n<!--                            <a class=\"btn btn-primary my-1\" href=\"https://localhost:8000/clinical/mapp/\">Start From Beginning</a>-->\n<!--                          </div>-->\n<!--                          <div><a class=\"btn btn-primary my-1\" href=\"https://localhost:8000/clinical/mapp/?skip=1\">Start From Test 2</a></div>-->\n<!--                          <div><a class=\"btn btn-primary my-1\" href=\"https://localhost:8000/clinical/mapp/?skip=2\">Start From Test 3</a></div>-->\n                        </div>\n\n\n                      </div>\n                    </div>\n                </template>\n                <template v-else>\n                    <template v-if=\"step === 0\">\n                        <UserInformation :base_url=\"base_url\"\n                                         :endpoint_version=\"endpoint_version\"\n                                         :ask_country=\"test_json.ask_country\"\n                                         :ask_ethnicity=\"test_json.ask_ethnicity\"\n                                         :is_clinical_trial=\"is_clinical_trial\"\n                                         :available_tests=\"test_json.available_tests\"\n                                         :clinical_trial_slug=\"test_name\"\n                                         :skip_test_number=\"skip_test_number\"\n                                         v-on:submission=\"userInfo\"></UserInformation>\n                    </template>\n\n                    <template v-else-if=\"step === 1\">\n                        <template v-if=\"test_type === 'r'\">\n                            <RoomDriver :json_data=\"test_json\"\n                                        v-on:submission=\"handleSubmission\"\n                                        v-on:complete=\"driverComplete\"></RoomDriver>\n                        </template>\n                        <template v-else-if=\"test_type === 's'\">\n                            <SeriesDriver :json_data=\"test_json\"\n                                          v-on:submission=\"handleSubmission\"\n                                          v-on:complete=\"driverComplete\"></SeriesDriver>\n                        </template>\n                        <template v-else-if=\"test_type === 'f'\">\n                            <FNameDriver :json_data=\"test_json\"\n                                         v-on:submission=\"handleSubmission\"\n                                         v-on:complete=\"driverComplete\"\n                                         :is_mobile=\"is_mobile\"\n                                         :participant_id=\"participant_id\"\n                            />\n                        </template>\n                        <template v-else-if=\"test_type === 'clinical'\">\n                          <template v-if=\"display_interim_screen\">\n                            <template v-if=\"interim_screen_step === 0\">\n                              <BasicInstructions :instruction_text=\"gettext('Please pass the tablet back to the administrator.')\" v-on:next=\"incrementInterimScreenStep\"/>\n                            </template>\n                            <template v-else-if=\"interim_screen_step === 1\">\n                              <div class=\"p-2\">\n                                <h1>{{ gettext(\"Result Breakdown\") }}</h1>\n                                <div>\n                                  <template v-if=\"interim_screen_data\">\n                                    <div v-for=\"data in interim_screen_data\" :key=\"data.label\">\n                                      <h2>{{data.label}}</h2>\n                                      <p>{{gettext(\"Correct\")}}: {{data.correct}}/{{data.total}}</p>\n                                      <p>{{ gettext(\"Skipped\") }}: {{data.skipped}}</p>\n                                    </div>\n                                  </template>\n                                  <div class=\"form-group text-left mt-3\">\n                                      <label for=\"comments\">{{ gettext(\"Comments\") }}</label>\n                                      <textarea id=\"comments\" v-model=\"comments\" rows=\"3\" class=\"form-control w-100\"/>\n                                  </div>\n                                  <RightAlignButton button_text=\"Continue\" :click_callback=\"incrementInterimScreenStep\"></RightAlignButton>\n\n                                </div>\n                              </div>\n                            </template>\n                            <template v-else-if=\"interim_screen_step === 2\">\n                              <BasicInstructions :instruction_text=\"gettext('Press OK to start the next test.')\" v-on:next=\"hideInterimScreen\"/>\n                            </template>\n                          </template>\n                          <template v-else-if=\"test_json.test_type === 'room'\">\n                              <RoomDriver :json_data=\"test_json\"\n                                          v-on:submission=\"handleSubmission\"\n                                          v-on:complete=\"clinicalTestComplete\"></RoomDriver>\n                          </template>\n                          <template v-else-if=\"test_json.test_type === 'series'\">\n                              <SeriesDriver :json_data=\"test_json\"\n                                            v-on:submission=\"handleSubmission\"\n                                            v-on:complete=\"clinicalTestComplete\"></SeriesDriver>\n                          </template>\n                          <template v-else-if=\"test_json.test_type === 'fname'\">\n                              <FNameDriver :json_data=\"test_json\"\n                                           v-on:submission=\"handleSubmission\"\n                                           v-on:complete=\"clinicalTestComplete\"\n                                           v-on:defer=\"deferFnameDelayed\"\n                                           :allow_defer=\"!last_test\"\n                                           :is_mobile=\"is_mobile\"\n                                           :participant_id=\"participant_id\"\n                              />\n                          </template>\n                        </template>\n                        <template v-else>\n                            <h1 class=\"text-align-center\">{{ gettext(\"Could not find this type of test, please contact a MAPP administrator\") }}</h1>\n                        </template>\n                    </template>\n\n                    <template v-else-if=\"step === 2\">\n                      <div class=\"my-4\">\n                        <template v-if=\"!can_close\">\n                              <LoadingSpinner/>\n                        </template>\n                        <template v-else>\n                              <p :class=\"end_text_class\">{{ gettext(this.end_message)}}</p>\n                              <p :class=\"end_text_class\">{{ gettext(\"Your results have been recorded! You may now close this window.\") }}</p>\n                              <p :class=\"end_text_class\">{{ gettext(\"Please hand the tablet back over to the tester.\" )}}</p>\n                              <a class=\"btn btn-primary\"  :href=\"home_redirect\">{{gettext(\"Home\")}}</a>\n                        </template>\n                      </div>\n                    </template>\n                </template>\n            </template>\n        </div>\n    </div>\n</template>\n\n<script>\nimport RoomDriver from \"./components/RoomDriver\";\nimport SeriesDriver from \"./components/SeriesDriver\";\nimport UserInformation from \"./components/UserInformation\";\n\nimport \"whatwg-fetch\"\nimport timing from \"./timing\";\nimport preloadImages, { collectImageUrls } from \"./preload\";\nimport { practiceImages } from \"./practiceData\";\nimport FNameDriver from \"@/components/fname/FNameDriver\";\nimport LoadingSpinner from \"@/components/LoadingSpinner.vue\";\nimport BasicInstructions from \"@/components/BasicInstructions.vue\";\nimport RightAlignButton from \"@/components/RightAlignButton.vue\";\nimport FnameDelayBadge from \"@/components/FnameDelayBadge.vue\";\nimport phaseChip from \"@/phaseChip\";\n\nexport default {\n    name: 'App',\n    mixins: [timing],\n    components: {\n      FnameDelayBadge,\n      RightAlignButton,\n      BasicInstructions,\n      LoadingSpinner,\n      FNameDriver,\n        UserInformation,\n        SeriesDriver,\n        RoomDriver,\n    },\n    mounted: function() {\n        const protocol = window.location.protocol;\n        const host = window.location.host;\n        const urlParams = new URLSearchParams(window.location.search);\n        let skip_param = urlParams.get('skip')\n        this.skip_test_number = skip_param ? parseInt(skip_param, 10) : 0\n\n        this.base_url = `${protocol}//${host}/`;\n        this.is_clinical_trial = this.checkForTrialURL()\n        let uri = window.location.pathname;\n        let split_uri = uri.split(\"/\");\n        if(split_uri.length < 4) {\n            // Incorrect url such as https://www.dev.mappremote.com\n            this.endpoint = null;\n            this.test_loading = false;\n            this.production_env = (host === \"www.mappremote.com\")\n            // Don't execute the rest of this function\n            return;\n        }\n        else if (split_uri.length === 4) {\n            this.test_type = split_uri[1];\n            this.test_name = split_uri[2];\n        }\n        else if(split_uri.length > 4) {\n            this.language = split_uri[1];\n            this.test_type = split_uri[2];\n            this.test_name = split_uri[3];\n        }\n        this.endpoint = `${this.base_url}endpoints/${this.endpoint_version}/tests/${this.test_type}/${this.test_name}`;\n        this.fetchTest()\n\n        if(this.test_type === 'r') {\n            this.end_message = this.gettext(\"Thank you for taking the room test.\");\n        }\n        else if (this.test_type === 's') {\n            this.end_text_class = \"series-app\"\n            this.end_message = this.gettext(\"Thank you for taking the series test.\");\n        }\n        else if(this.test_type === 'f') {\n          this.end_message = this.gettext(\"Thank you for taking the Face-Name test.\");\n        } else if(this.test_type === 'clinical') {\n          this.end_message = this.gettext(\"Thank you for completing all the MAPP tests in this clinical trial.\");\n        }\n        let smaller_dimension = screen.width < screen.height ? screen.width : screen.height\n        this.is_mobile = smaller_dimension < 760\n    },\n\n    data: function () {\n        return {\n            phase_chip: phaseChip,\n            skip_test_number: 0,\n            is_clinical_trial: false,\n            clinical_trial_slug: \"\",\n            time_start: 0,\n            tme_end: 0,\n            is_mobile: false,\n            endpoint_version: \"v1\",\n            base_url: null,\n            step: 0,\n            language: \"en\",\n            participant_id: null,\n            age: 0,\n            education: 0,\n            sex: null,\n            country: null,\n            ethnicity: null,\n            week_number: null,\n            part: null,\n            query_parameters: null,\n            test_type: \"r\",\n            test_name: null,\n            endpoint: null,\n            is_complete: false,\n            show_header: true,\n            test_json: {},\n            test_loading: true,\n            results: {},\n            end_message: \"\",\n            end_text_class: \"\",\n            pending_requests: 0, // This will be used sync logic for 'can_close' across async operations (such as postData and handleSubmission)\n            completion_posted: false,  // guards against premature can_close\n            production_env: false,\n            last_test: false,\n            current_test_number: 1,\n            total_tests: 1,\n            display_interim_screen: false,\n            interim_screen_step: 0,\n            previous_test_results: {},\n            previous_test_json: {},\n            comments: \"\",\n            // Deferred FName delayed-recall state (clinical trials). Sourced from\n            // the backend on every fetchTest; the badge/routing read these.\n            fname_delayed_pending: false,\n            fname_delay_end_time: null,\n            fname_delayed_in_progress: false,\n        }\n    },\n    methods: {\n        checkForTrialURL() {\n          let uri = window.location.pathname;\n          let split_uri = uri.split(\"/\");\n          if(split_uri.length  < 3) {\n            return false;\n          }\n          return split_uri[2].toLowerCase() === 'clinical'\n        },\n        incrementStep: function() {\n            this.step++;\n            if(this.step === 1) {\n                this.show_header = false;\n                this.recordStartTime();\n                this.updateBodyClass()\n            }\n            else {\n                this.show_header = true;\n                this.recordEndTime();\n            }\n        },\n        decrementStep: function() {\n            this.step--;\n        },\n        setStep: function(step_num) {\n            this.step = step_num;\n        },\n\n        incrementInterimScreenStep: function() {\n          this.interim_screen_step += 1\n          // Only save comments after the admin has had a chance to enter them (step 1→2)\n          // and only if previous_test_results has valid data to avoid posting an empty payload\n          if (this.interim_screen_step === 2 && this.previous_test_results.test_type) {\n            this.previous_test_results['comments'] = this.comments\n            this.postData(`${this.base_url}${this.language}/endpoints/${this.endpoint_version}/submit/`, this.previous_test_results);\n          }\n\n          if(this.interim_screen_step === 2 && this.last_test && this.previous_test_json.last_test) {\n            this.incrementStep()\n          }\n        },\n\n        hideInterimScreen: function() {\n          // Reset comments\n          this.comments = \"\"\n          this.display_interim_screen = false\n          this.interim_screen_step = 0\n        },\n\n        userInfo: function(participant_id, age, education, sex, country, ethnicity, week_number, part) {\n            this.participant_id = participant_id\n            this.age = parseInt(age, 10)\n            this.education = parseInt(education, 10)\n            this.sex = sex\n            this.country = country\n            this.ethnicity = ethnicity\n            this.week_number = parseInt(week_number, 10),\n            this.part = parseInt(part, 10)\n            this.incrementStep()\n        },\n\n        driverComplete: function() {\n            this.is_complete = true\n            // Update the value in the object we POST\n            this.results.is_complete = true\n            this.incrementStep()\n            // Post one final time to ensure the \"is_complete\" flag is set\n            this.$nextTick(() => {\n               this.postData(`${this.base_url}${this.language}/endpoints/${this.endpoint_version}/submit/`, this.results, true)\n            })\n        },\n\n      updateBodyClass: function() {\n          if(this.test_json.test_type === 'series') {\n            document.body.className += \" series-app\";\n            this.show_header = false;\n          }\n          else {\n              document.body.className = \"\";\n          }\n      },\n\n        clinicalTestComplete: function() {\n          this.results.is_complete = true\n          this.$nextTick(() => {\n              // This async function will update this.can_close. The watcher for can_close will reset our result state and refetch the next test\n              // Or move us to the completed screen if appropriate\n              this.postData(`${this.base_url}${this.language}/endpoints/${this.endpoint_version}/submit/`, this.results, true)\n          })\n        },\n\n        // The participant chose \"Continue to Next Test\" on the FName wait screen:\n        // mark the FName delayed portion deferred and advance to the next trial\n        // test. The backend will keep serving later tests until the delayed portion\n        // is completed. Not a completion post, so no interim screen is shown here.\n        deferFnameDelayed: async function(driverResults) {\n          const submitUrl = `${this.base_url}${this.language}/endpoints/${this.endpoint_version}/submit/`\n          // The delay clock started when the wait screen first appeared; reuse the\n          // stored timer end time so the countdown doesn't jump forward on defer.\n          let delay_end_time = null\n          try {\n            const stored = JSON.parse(localStorage.getItem(`timer-fname-driver-${this.participant_id}`))\n            if (stored && stored.endTime) {\n              delay_end_time = stored.endTime\n            }\n          } catch (e) {\n            delay_end_time = null\n          }\n          if (!delay_end_time) {\n            const interval = (this.test_json.display_wait_interval || 0) * 60 * 1000\n            delay_end_time = Date.now() + interval\n          }\n\n          this.fname_delayed_pending = true\n          this.fname_delayed_in_progress = false\n          this.fname_delay_end_time = delay_end_time\n\n          const payload = this.createResults(driverResults, \"FNAME_DEFER\")\n          payload.current_step = 6\n          payload.is_complete = false\n          payload.delayed_pending = true\n          payload.delayed_in_progress = false\n          payload.delay_end_time = delay_end_time\n\n          // Must land before the next fetch, or the backend re-serves FName.\n          await this.postData(submitUrl, payload)\n          this.resetData()\n          await this.fetchTest(this.participant_id)\n        },\n\n        // The delay timer expired and the participant just finished another test:\n        // route back into the FName delayed portion before any remaining test.\n        routeToFnameDelayed: async function() {\n          const submitUrl = `${this.base_url}${this.language}/endpoints/${this.endpoint_version}/submit/`\n          this.resetData()\n          this.fname_delayed_in_progress = true\n          await this.fetchTest(this.participant_id, { serve: \"fname_delayed\" })\n          // Persist that the delayed portion is now in progress, so a reload before\n          // the first delayed answer resumes into FName rather than the next test.\n          if (this.results && this.results.test_id) {\n            const marker = Object.assign({}, this.results, {\n              delayed_pending: true,\n              delayed_in_progress: true,\n              delay_end_time: this.fname_delay_end_time,\n              current_step: (this.results.current_step && this.results.current_step >= 6) ? this.results.current_step : 6,\n              frontend_driver_event: \"FNAME_DELAYED_RESUME\",\n            })\n            this.results = marker\n            await this.postData(submitUrl, marker)\n          }\n        },\n\n        handleSubmission: function(driverResults, driverEvent=\"UNKNOWN\", is_complete=false) {\n          // Only update is_complete if it isn't true already.\n            this.is_complete = this.is_complete ? this.is_complete : is_complete\n            // The wait timer finished naturally (participant waited in place after\n            // deferring): the delayed portion is now in progress.\n            if (driverEvent === \"FNAME_TIMER_COMPLETE\") {\n              this.fname_delayed_in_progress = true\n            }\n            this.results = this.createResults(driverResults, driverEvent);\n            this.postData(`${this.base_url}${this.language}/endpoints/${this.endpoint_version}/submit/`, this.results);\n        },\n        // TODO Add submit timestamp to the data\n        postData: async function(url, data, is_completion=false) {\n            this.pending_requests++\n            try {\n              if(is_completion) {\n                this.completion_posted = true\n              }\n              const response = await window.fetch(url, {\n                method: 'POST',\n                headers: { 'Content-Type': 'application/json' },\n                body: JSON.stringify(data)\n              });\n              return response;\n            } finally {\n                // Guaranteed to decrement even on network error\n                this.pending_requests--;\n            }\n        },\n        resetData: function() {\n          this.recordStartTime();\n          this.time_end = 0\n          this.results = {}\n          this.is_complete = false\n          this.completion_posted = false\n          // Each test begins outside the FName delayed portion. (pending/end_time\n          // persist across tests and are re-synced from the backend on fetchTest.)\n          this.fname_delayed_in_progress = false\n        },\n        processInitialData: function(savedResults = null) {\n          // If we have saved results, restore the state from them\n          if (savedResults) {\n              // Restore timing information\n              this.time_start = new Date(savedResults.dt_started).getTime();\n              if (savedResults.dt_finished) {\n                  this.time_end = new Date(savedResults.dt_finished).getTime();\n              }\n\n              // Restore completion status\n              this.is_complete = savedResults.is_complete || false;\n\n              // Restore user information (in case it wasn't set yet)\n              this.participant_id = savedResults.participant_id || this.participant_id;\n              this.age = savedResults.age || this.age;\n              this.education = savedResults.education || this.education;\n              this.sex = savedResults.sex || this.sex;\n              this.country = savedResults.country || this.country;\n              this.ethnicity = savedResults.ethnicity || this.ethnicity;\n              this.language = savedResults.language || this.language;\n\n              // Set the complete results object to preserve all saved data\n              this.results = {\n                  current_step: savedResults.current_step,\n                  question_num: savedResults.question_num,\n                  test_id: savedResults.test_id,\n                  test_type: savedResults.test_type,\n                  dt_started: this.time_start,\n                  dt_finished: this.time_end,\n                  is_complete: this.is_complete,\n                  participant_id: this.participant_id,\n                  user_agent: savedResults.user_agent || navigator.userAgent,\n                  age: this.age,\n                  sex: this.sex,\n                  education: this.education,\n                  language: this.language,\n                  country: this.country,\n                  ethnicity: this.ethnicity,\n                  user_results: savedResults.user_results || [],\n                  groups_obj: savedResults.groups_obj || {},\n                  averages: savedResults.averages || {},\n                  scores: savedResults.scores || {},\n                  task_scores: savedResults.task_scores || {},\n                  frontend_driver_event: savedResults.frontend_driver_event || \"RESTORE\",\n                  is_mobile: this.is_mobile,\n                  is_clinical_trial: this.is_clinical_trial,\n                  clinical_trial_slug: this.is_clinical_trial ? this.test_name.toLowerCase() : null,\n              };\n\n              // If the test was complete, we might need to advance to the appropriate step\n              if (this.is_complete && this.step === 0) {\n                  this.step = 2; // Go directly to completion screen\n                  this.show_header = true;\n              }\n          } else {\n              // No saved results, start fresh\n              this.recordStartTime();\n              this.results = {};\n              this.is_complete = false;\n          }\n      },\n        createResults: function(driverResults, driverEvent) {\n            const results = {\n                current_step: driverResults.current_step,\n                question_num: driverResults.question_num !== undefined ? driverResults.question_num : null,\n                test_id: driverResults.test_id,\n                test_type: driverResults.test_type,\n                total_skipped: driverResults.total_skipped ? driverResults.total_skipped : null,\n                dt_started: this.time_start,\n                dt_finished: this.time_end,\n                dt_submitted: Date.now(),\n                is_complete: this.is_complete,\n                participant_id: this.participant_id,\n                user_agent: navigator.userAgent,\n                age: this.age,\n                sex: this.sex,\n                education: this.education,\n                language: this.language,\n                country: this.country,\n                ethnicity: this.ethnicity,\n                week_number: this.week_number,\n                part: this.part,\n                user_results: driverResults.user_results,\n                groups_obj: driverResults.groups_obj,\n                averages: driverResults.averages,\n                scores: driverResults.scores,\n                task_scores: driverResults.task_scores,\n                // used to determine which event was used to POST\n                frontend_driver_event: driverEvent,\n                is_mobile: this.is_mobile,\n                is_clinical_trial: this.is_clinical_trial,\n                clinical_trial_slug: this.is_clinical_trial ? this.test_name.toLowerCase() : null,\n                comments: this.comments,\n            }\n            // Deferred FName delay markers ride along on the FName result only, so\n            // they never mislabel a Room/Series row as deferred.\n            if (driverResults.test_type === 'fname' && this.fname_delayed_pending) {\n                results.delayed_pending = true\n                results.delayed_in_progress = this.fname_delayed_in_progress\n                results.delay_end_time = this.fname_delay_end_time\n            }\n            return results\n        },\n        fetchTest: function(participant_id=null, opts={}) {\n          let endpoint = this.endpoint;\n          const params = []\n          if (participant_id) {\n            params.push(`participant_id=${participant_id}`)\n          }\n          if (opts.serve) {\n            // Ask the backend to serve a specific test (e.g. the deferred FName\n            // delayed portion) rather than the default next-in-sequence.\n            params.push(`serve=${opts.serve}`)\n          }\n          if (params.length) {\n            endpoint = `${this.endpoint}/?${params.join(\"&\")}`;\n          }\n          this.test_loading = true\n          return window.fetch(endpoint)\n            .then((data) =>{\n                return data.json();\n            })\n            .then((json) => {\n                if(json.redirect_home) {\n                  // Redirect the user to the homepage.\n                  window.location.href = \"/\"\n                  return\n                }\n                if(json.all_tests_complete) {\n                  this.end_message = this.gettext(\"Thank you for completing all the MAPP tests in this clinical trial.\");\n                  this.completion_posted = true  // pending_requests is 0 here, update this so can_close becomes true\n                  this.incrementStep();\n                }\n                this.test_json = json;\n                // Practice images first: they are shown first, and the demographic\n                // screen gives them time to arrive.\n                preloadImages(collectImageUrls(practiceImages(json.test_type)));\n                preloadImages(collectImageUrls(json));\n                this.last_test = json.last_test !== undefined ? json.last_test : true\n                this.current_test_number = json.test_number ? json.test_number : 1\n                this.total_tests = json.total_tests ? json.total_tests : 1\n                // Sync deferred-FName delay state from the backend (source of truth).\n                this.fname_delayed_pending = json.fname_delayed_pending || false\n                this.fname_delay_end_time = json.fname_delay_end_time || null\n                this.test_loading = false;\n                if(participant_id) {\n                  // We have grabbed a new test for the clinical trial and need to update the body class appropriately.\n                  this.updateBodyClass()\n                }\n                // The submit endpoint determines same-results based on dt_started.\n                // Setting the dt_started to a previous result for the same participant_id will continue a test.\n                // Prefer resume_result (correct even when tests complete out of order).\n                const result_test_num = this.current_test_number - 1\n                let current_result_data = json.resume_result || null\n                if (!current_result_data && json.results && json.results.length >= this.current_test_number) {\n                  current_result_data = json.results[result_test_num];\n                }\n                if (current_result_data) {\n                  this.processInitialData(current_result_data);\n                }\n            })\n            .catch((error) => {\n                console.log(error);\n            });\n          },\n        confirmSkipTest: function() {\n            if (confirm(this.gettext(\"Are you sure you want to skip this test? This action cannot be undone.\"))) {\n                this.skipTest();\n            }\n        },\n        skipTest: function() {\n            this.is_complete = false;\n            let skipResults = this.results?.test_id ? this.results : {\n                test_id: this.test_json.id,\n                test_type: this.test_json.test_type,\n                dt_started: this.time_start,\n                dt_finished: Date.now(),\n                dt_submitted: Date.now(),\n                is_complete: false,\n                is_skipped: true,\n                participant_id: this.participant_id,\n                user_agent: navigator.userAgent,\n                age: this.age,\n                sex: this.sex,\n                education: this.education,\n                language: this.language,\n                country: this.country,\n                ethnicity: this.ethnicity,\n                user_results: [],\n                groups_obj: {},\n                averages: {},\n                scores: {},\n                task_scores: {},\n                frontend_driver_event: \"SKIP\",\n                is_mobile: this.is_mobile,\n                is_clinical_trial: this.is_clinical_trial,\n                clinical_trial_slug: this.test_name.toLowerCase(),\n            };\n\n            // If the user got partially through the test before skipping, maintain their data.\n            skipResults.is_skipped = true\n            skipResults.frontend_driver_event = \"SKIP\"\n            this.$nextTick(() => {\n              this.postData(`${this.base_url}${this.language}/endpoints/${this.endpoint_version}/submit/`, skipResults, true)\n            })\n\n        },\n    },\n    computed: {\n      home_redirect() {\n        return this.is_clinical_trial ? window.location.pathname : \"/\"\n      },\n      can_close() {\n        return this.completion_posted && this.pending_requests === 0;\n      },\n      interim_screen_data() {\n        if(this.previous_test_json.test_type === 'room') {\n          let total_memory = 0\n          let correct_memory = 0\n          let skipped_memory = 0\n          let total_delayed = 0\n          let correct_delayed = 0\n          let skipped_delayed = 0\n          for(let resp of this.previous_test_results?.user_results?.memory?.user_responses || []){\n            for(let item of resp.memory_selections) {\n              total_memory += 1\n              if(item.is_correct) {\n                correct_memory += 1\n              } else if(item.skipped) {\n                skipped_memory += 1\n              }\n            }\n\n            if(resp.placement) {\n              total_memory += 1\n              if(resp.placement.is_correct) {\n                correct_memory += 1\n              } else if (resp.placement.placement_skipped) {\n                skipped_memory += 1\n              }\n            }\n          }\n          for(let resp of this.previous_test_results?.user_results?.delayed?.user_responses || []) {\n            if(resp.delayed_selection) {\n              total_delayed += 1\n              if (resp?.delayed_selection.is_correct) {\n                correct_delayed += 1\n              }\n            }\n\n            if(resp.placement){\n              total_delayed += 1\n              if(resp.placement.is_correct) {\n                correct_delayed += 1\n              } else if(resp.placement.placement_skipped) {\n                skipped_delayed += 1\n              }\n            }\n\n          }\n\n          let res = [\n            {\n              label: this.gettext(\"Memory Phase\"),\n              correct: correct_memory,\n              total: total_memory,\n              skipped: skipped_memory,\n            },\n            {\n              label: this.gettext(\"Delayed Phase\"),\n              correct: correct_delayed,\n              total: total_delayed,\n              skipped: skipped_delayed,\n            }\n          ]\n\n          return res\n\n        } else if(this.previous_test_json.test_type === 'fname') {\n          let skipped_questions = this.previous_test_results?.total_skipped || 0\n          let res = [{\n              label: this.gettext(\"FName Results\"),\n              correct: this.previous_test_results.scores?.total_score,\n              total: this.previous_test_results.scores?.total_questions_answered - skipped_questions,\n              skipped: this.previous_test_results.total_skipped,\n            },\n          ]\n          return res\n        } else if (this.previous_test_json.test_type === 'series') {\n          let result_data = this.previous_test_results?.user_results || []\n          let correct_count = 0\n          let total_questions = 0\n          let total_skipped = 0\n          for(let result of result_data) {\n            if(!result.skipped) {\n              total_questions += 1\n            } else {\n              total_skipped += 1\n            }\n            if(result.is_correct) {\n              correct_count += 1\n            }\n          }\n          let res = [{\n            label: this.gettext(\"Series Results\"),\n            correct: correct_count,\n            total: total_questions,\n            skipped: total_skipped,\n          }]\n          return res\n        }\n        return this.previous_test_results\n      },\n\n      test_name_header() {\n        const test_type_map = {\n          room: \"Room\",\n          fname: \"FName\",\n          series: \"Mesero\",\n        }\n        // If we are on an interim screen, use the previous test json header.\n        return this.display_interim_screen ? test_type_map[this.previous_test_json.test_type.toLowerCase()] : test_type_map[this.test_json.test_type.toLowerCase()]\n      }\n    },\n    watch: {\n      step: function(newVal, oldVal) {\n        if (newVal === 1) {\n          // Refetch the test with the participant_id to get the most recent test\n          this.fetchTest(this.participant_id)\n        }\n      },\n      can_close: function(newVal, oldVal) {\n        if(newVal && !oldVal) {\n          //   Check for clinical trial and/or step has been incremented\n          if (this.step === 1 && this.is_clinical_trial) {\n            this.previous_test_results = this.results\n            this.previous_test_json = this.test_json\n            this.display_interim_screen = true\n\n            // If the FName delay elapsed and we just finished a non-FName test,\n            // route back to finish the FName delayed portion before any remaining\n            // test. The just-finished test's interim screen still shows normally.\n            const timer_expired = this.fname_delayed_pending\n              && this.fname_delay_end_time\n              && Date.now() >= this.fname_delay_end_time\n            if (timer_expired && this.previous_test_json.test_type !== 'fname') {\n              this.routeToFnameDelayed()\n              return\n            }\n\n            // Last test in the trial. Step will be incremented at the final hideInterimScreen call\n            if(this.last_test) {\n              this.end_message = this.gettext(\"You have completed all tests in this session.\");\n              return\n            }\n            this.resetData() // Reset the completion_posted field, which will update can_close to false.\n            this.fetchTest(this.participant_id);\n          }\n        }\n\n      }\n  }\n\n}\n</script>\n\n<style>\n@import \"../node_modules/bootstrap/dist/css/bootstrap.min.css\";\n\n\n#app {\n    -webkit-font-smoothing: antialiased;\n    -moz-osx-font-smoothing: grayscale;\n    text-align: center;\n    color: #2c3e50;\n}\n\n.admin-controls-container {\n    position: fixed;\n    top: 5px;\n    right: 20px;\n    z-index: 1000;\n}\n\n\n\n</style>\n","import mod from \"-!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./App.vue?vue&type=template&id=984b3684\"\nimport script from \"./App.vue?vue&type=script&lang=js\"\nexport * from \"./App.vue?vue&type=script&lang=js\"\nimport style0 from \"./App.vue?vue&type=style&index=0&id=984b3684&prod&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports","import Vue from 'vue'\nimport App from './App.vue'\nimport 'bootstrap'\nimport VueBrowserupdate from \"@sum.cumo/vue-browserupdate/index\";\nimport { library } from '@fortawesome/fontawesome-svg-core'\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome'\nimport { faSpinner, faCircleInfo, faForward } from '@fortawesome/free-solid-svg-icons'\n\nlibrary.add(faSpinner, faCircleInfo, faForward)\nVue.component('font-awesome-icon', FontAwesomeIcon)\n\nVue.prototype.gettext = window.gettext\nVue.config.productionTip = false\nnew Vue({\n  render: h => h(App),\n  created() {\n    window.onbeforeunload = function(e) {\n      // Older browsers\n      if(e) {\n        e.returnValue = this.gettext('Changes you made may not be saved');\n      }\n      return this.gettext('Changes you made may not be saved');\n    }\n  }\n}).$mount('#app')\n\nVue.use(VueBrowserupdate, {\n  options: {\n    required: { e: -4, f: -3, o: -3, s: -1, c:-3 },\n      insecure: true,\n      unsupported: true,\n      reminder: 0,\n      noclose: false,\n      no_permanent_hide: true,\n      text: {\n        msgmore: 'Use the latest version of Google Chrome, Mozilla Firefox, Microsoft Edge, or Safari.',\n        bupdate: 'Update'\n       },\n     api:2023.09\n  }\n})\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","var deferred = [];\n__webpack_require__.O = function(result, chunkIds, fn) {\n\tif(chunkIds) {\n\t\tdeferred.push([chunkIds, fn]);\n\t\treturn;\n\t}\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif (__webpack_require__.O.j(chunkIds[j])) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// wrap a concatenated module body as a lazy, memoized accessor; mod is\n// set before the body runs so re-entrant calls (require cycles) observe\n// the partial exports like Node.js\n__webpack_require__.cw = function(body) {\n\tvar mod;\n\treturn function() {\n\t\tif (body) {\n\t\t\tvar fn = body;\n\t\t\tbody = 0;\n\t\t\tmod = { exports: {} };\n\t\t\tfn.call(mod.exports, mod, mod.exports);\n\t\t}\n\t\treturn mod.exports;\n\t};\n};","// define getter/value functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tif(Array.isArray(definition)) {\n\t\tvar i = 0;\n\t\twhile(i < definition.length) {\n\t\t\tvar key = definition[i++];\n\t\t\tvar binding = definition[i++];\n\t\t\tvar descriptor = binding === 0 ? { enumerable: true, value: definition[i++] } : { enumerable: true, get: binding };\n\t\t\tif(!__webpack_require__.o(exports, key)) Object.defineProperty(exports, key, descriptor);\n\t\t}\n\t} else {\n\t\tfor(var key in definition) {\n\t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t\t}\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); };","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t524: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkmapp\"] = self[\"webpackChunkmapp\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [504], function() { return __webpack_require__(7976); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["render","_vm","this","_c","_self","attrs","id","test_json","step","staticClass","_v","_s","test_name_header","phase_chip","label","gettext","_e","is_clinical_trial","fname_delayed_pending","fname_delay_end_time","test_type","endTime","type","icon","on","click","confirmSkipTest","test_loading","size","show_header","class","end_text_class","endpoint","production_env","_m","base_url","endpoint_version","ask_country","ask_ethnicity","available_tests","clinical_trial_slug","test_name","skip_test_number","submission","userInfo","json_data","handleSubmission","complete","driverComplete","is_mobile","participant_id","display_interim_screen","interim_screen_step","instruction_text","next","incrementInterimScreenStep","interim_screen_data","_l","data","key","correct","total","skipped","for","directives","name","rawName","value","comments","expression","rows","domProps","input","$event","target","composing","button_text","click_callback","hideInterimScreen","clinicalTestComplete","allow_defer","last_test","defer","deferFnameDelayed","can_close","end_message","href","home_redirect","staticRenderFns","displayDuration","display_duration","incrementStep","memory_json_data","start_from_question_num","question_num","memorySubmission","memoryComplete","delayed_json_data","delayedSub","display_bottom_button","button_click","title_text","second_text","mobile_text","mobile_text_special","bold_text","left_text","third_text","bold_text_class","bottom_button_text","RightAlignButtonvue_type_script_lang_js","props","components_RightAlignButtonvue_type_script_lang_js","component","componentNormalizer","A","RightAlignButtonvue_type_template_id_db73b92a_scoped_true_render","RightAlignButtonvue_type_template_id_db73b92a_scoped_true_staticRenderFns","RightAlignButton","BasicInstructionsvue_type_script_lang_js","components","String","Boolean","default","methods","$emit","components_BasicInstructionsvue_type_script_lang_js","BasicInstructions_component","BasicInstructionsvue_type_template_id_59834cd4_scoped_true_render","BasicInstructionsvue_type_template_id_59834cd4_scoped_true_staticRenderFns","BasicInstructions","question_obj","questionSub","question_list","stimuli","question_text","question_img","target_image","question_background_color","target_image_background_color","item_classname","has_background","selectionSub","display_skip","background_color","image_url","after_image_url","selected_room","url","place_image_url","place_image_width","target_image_width","target_coords","getcoords","getCoords","placementSub","num_choices","confidenceSub","object_img_url","object_img_background_color","metaMemorySub","handleQuestionSkip","ref","timeSeconds","timeout","handleTimeout","error","error_msg","mousedown","canvasMouseDown","mouseup","canvasMouseUp","mousemove","canvasMouseMove","timing","time_start","time_end","mounted","recordStartTime","event","Date","now","recordEndTime","getTimeDiff","style","BasicErrorvue_type_script_lang_js","components_BasicErrorvue_type_script_lang_js","BasicError_component","BasicErrorvue_type_template_id_b9bb69c4_scoped_true_render","BasicErrorvue_type_template_id_b9bb69c4_scoped_true_staticRenderFns","BasicError","ImagePlacementvue_type_script_lang_js","mixins","required","Number","display_correct","Object","place_x_coord","place_y_coord","placement_timing","submission_timing","placed_correct","placement_distance","max_ratio","image_ratio","scale_up","scale_down","mouse_hold","$nextTick","drawCanvas","checkPlacement","x","y","canv","document","getElementById","ctx","getContext","sources","back_img","target_img","loadImages","images","height","width","docWidth","clientWidth","docHeight","clientHeight","drawImage","place_ratio","target_width","target_height","Math","floor","drawCircle","target_x","target_y","correct_radius","updateCanvas","rect","getBoundingClientRect","clientX","left","clientY","top","radius","beginPath","arc","PI","lineWidth","strokeStyle","stroke","distanceX","pow","distanceY","distanceSquared","radiusSquared","round","sqrt","EPSILON","callback","loaded_images","loaded_image_cnt","numImages","keys","length","src","Image","onload","components_ImagePlacementvue_type_script_lang_js","ImagePlacement_component","ImagePlacementvue_type_template_id_a909777c_scoped_true_render","ImagePlacementvue_type_template_id_a909777c_scoped_true_staticRenderFns","ImagePlacement","loading_images","item","index","image_index","selected_image","selectionChange","model","$$v","checked","custom_classname","style_string","BasicStimuliImagevue_type_script_lang_js","undefined","components_BasicStimuliImagevue_type_script_lang_js","BasicStimuliImage_component","BasicStimuliImagevue_type_template_id_5baa793d_scoped_true_render","BasicStimuliImagevue_type_template_id_5baa793d_scoped_true_staticRenderFns","BasicStimuliImage","ImageSelectionItemvue_type_script_lang_js","components_ImageSelectionItemvue_type_script_lang_js","ImageSelectionItem_component","ImageSelectionItemvue_type_template_id_02d42156_scoped_true_render","ImageSelectionItemvue_type_template_id_02d42156_scoped_true_staticRenderFns","ImageSelectionItem","spin","LoadingSpinnervue_type_script_lang_js","components_LoadingSpinnervue_type_script_lang_js","LoadingSpinner_component","LoadingSpinnervue_type_template_id_05db4d7f_render","LoadingSpinnervue_type_template_id_05db4d7f_staticRenderFns","LoadingSpinner","ImageSelectionListvue_type_script_lang_js","created","preloadImages","selection_time","submission_time","selection_count","images_loaded_count","loading_timeout","setTimeout","question","img","imageSettled","onerror","beforeDestroy","clearTimeout","watch","newVal","oldVal","components_ImageSelectionListvue_type_script_lang_js","ImageSelectionList_component","ImageSelectionListvue_type_template_id_6251f12c_scoped_true_render","ImageSelectionListvue_type_template_id_6251f12c_scoped_true_staticRenderFns","ImageSelectionList","innerHTML","display_msg_do","display_text","actual_val","model_val","confidence_level","top_text","updateError","_n","BasicCardInputvue_type_script_lang_js","components_BasicCardInputvue_type_script_lang_js","BasicCardInput_component","BasicCardInputvue_type_template_id_0995687a_scoped_true_render","BasicCardInputvue_type_template_id_0995687a_scoped_true_staticRenderFns","BasicCardInput","RoomConfidencevue_type_script_lang_js","components_RoomConfidencevue_type_script_lang_js","RoomConfidence_component","RoomConfidencevue_type_template_id_6f3826f5_scoped_true_render","RoomConfidencevue_type_template_id_6f3826f5_scoped_true_staticRenderFns","RoomConfidence","user_memory","RoomMetaMemoryvue_type_script_lang_js","components_RoomMetaMemoryvue_type_script_lang_js","RoomMetaMemory_component","RoomMetaMemoryvue_type_template_id_4beeb608_scoped_true_render","RoomMetaMemoryvue_type_template_id_4beeb608_scoped_true_staticRenderFns","RoomMetaMemory","display_timer","timeRemaining","percentRemaining","role","QuestionTimervue_type_script_lang_js","autoStart","intervalId","isRunning","computed","start","stop","setInterval","clearInterval","reset","utils_QuestionTimervue_type_script_lang_js","QuestionTimer_component","QuestionTimervue_type_template_id_dc20880c_scoped_true_render","QuestionTimervue_type_template_id_dc20880c_scoped_true_staticRenderFns","QuestionTimer","DelayedQuestionvue_type_script_lang_js","max_questions","placement_x_coord","placement_y_coord","placement_time","placement_submission_time","placement_meta_memory","placement_skipped","target_x_coordinate","target_y_coordinate","decrementStep","incrementRound","room","select_count","select_time","sub_time","currSelection","num_changed","total_time","mem_select","conf_level","place_time","is_correct","checkPlacementMeta","createResult","delayed_selection","placement","x_coord","y_coord","distance","meta_correct","original_step","components_DelayedQuestionvue_type_script_lang_js","DelayedQuestion_component","DelayedQuestionvue_type_template_id_1e747cfe_scoped_true_render","DelayedQuestionvue_type_template_id_1e747cfe_scoped_true_staticRenderFns","DelayedQuestion","DelayedPhasevue_type_script_lang_js","user_responses","quest_obj","stim_list","stim","image","push","createResults","components_DelayedPhasevue_type_script_lang_js","DelayedPhase_component","DelayedPhasevue_type_template_id_9493f1a4_scoped_true_render","DelayedPhasevue_type_template_id_9493f1a4_scoped_true_staticRenderFns","DelayedPhase","nextQuestion","room_image_before","room_image_after","RoomQuestionvue_type_script_lang_js","selected_image_list","selection_count_list","placement_submission_timing","placement_total_time","decrementRound","imageBefore","imageAfter","imageTarget","selection","selection_cnt","chosenAnswer","coord_x","coord_y","click_time","memory_selections","meta_memory","meta_confidence","is_meta_correct","components_RoomQuestionvue_type_script_lang_js","RoomQuestion_component","RoomQuestionvue_type_template_id_51de55db_scoped_true_render","RoomQuestionvue_type_template_id_51de55db_scoped_true_staticRenderFns","RoomQuestion","MemoryPhasevue_type_script_lang_js","question_data","components_MemoryPhasevue_type_script_lang_js","MemoryPhase_component","MemoryPhasevue_type_template_id_45de7a02_scoped_true_render","MemoryPhasevue_type_template_id_45de7a02_scoped_true_staticRenderFns","MemoryPhase","mock_data","mock_delayed_data","setStep","STATIC_IMG_URL","staticImage","path","FIXATION_CROSS","FNAME_PLACEHOLDER","roomPractice","questions","delayed_questions","fnamePractice","foil_images","foil_names","ordering_id","question_id","target_name","practiceImages","fname","series","phaseChip","Vue","observable","RoomPracticevue_type_script_lang_js","practice","components_RoomPracticevue_type_script_lang_js","RoomPractice_component","RoomPracticevue_type_template_id_2f8dca78_render","RoomPracticevue_type_template_id_2f8dca78_staticRenderFns","RoomPractice","RoomDrivervue_type_script_lang_js","test_id","duration_room_display","results","result_test_num","test_number","result_data","processInitialData","memory_phase_results","delayed_phase_results","averages","calculateAvgs","existingUserResponses","newUserResponses","otherResults","forEach","newResponse","existingIndex","findIndex","existing","savedResults","current_step","is_complete","user_results","memory","delayed","start_time","finish_time","calculateMemoryAvgs","mem_correct_cnt","mem_total","place_correct_cnt","place_meta_correct_cnt","stim_selection_time","stim_selection_sub_time","stim_selection_time_corr","stim_selection_time_wrong","stim_selection_sub_time_corr","stim_selection_sub_time_wrong","place_sub_time","place_time_corr","place_time_wrong","place_sub_time_corr","place_sub_time_wrong","place_total","answer","mem_score","place_score","place_meta_score","avg_select_rt","avg_select_sub_rt","avg_place_rt","avg_place_sub_rt","mem_wrong_cnt","place_wrong_cnt","avg_select_corr_rt","avg_select_sub_corr_rt","avg_select_wrong_rt","avg_select_sub_wrong_rt","avg_place_corr_rt","avg_place_sub_corr_rt","avg_place_wrong_rt","avg_place_sub_wrong_rt","select_score","calculateDelayedAvgs","delay_correct_cnt","select_sub_time","select_time_corr","select_time_wrong","select_sub_time_corr","select_sub_time_wrong","delay_total","delay_score","delay_wrong_cnt","memory_phase","delayed_phase","components_RoomDrivervue_type_script_lang_js","RoomDriver_component","RoomDrivervue_type_template_id_5ee98c74_scoped_true_render","RoomDrivervue_type_template_id_5ee98c74_scoped_true_staticRenderFns","RoomDriver","question_total","time_interval","display_seconds","stimuli_separator","prompt","SeriesQuestionvue_type_script_lang_js","max_stimuli","hidePreloadedImages","interval_obj","updateStimuli","stimuli_num","user_response","response_time","i","element","className","hideImage","element_id","showImage","validateAnswer","yes_correct","is_prompt_correct","no_correct","group","stimuli_length","components_SeriesQuestionvue_type_script_lang_js","SeriesQuestion_component","SeriesQuestionvue_type_template_id_06929814_scoped_true_render","SeriesQuestionvue_type_template_id_06929814_scoped_true_staticRenderFns","SeriesQuestion","SeriesDrivervue_type_script_lang_js","groups_obj","submit_emit_type","getGroups","total_skipped","response","group_name","num_total","cum_response_time","num_correct","cum_response_time_corr","cum_response_time_wrong","num_wrong","avg_rt","avg_corr_rt","avg_wrong_rt","components_SeriesDrivervue_type_script_lang_js","SeriesDriver_component","SeriesDrivervue_type_template_id_24fc97ca_scoped_true_render","SeriesDrivervue_type_template_id_24fc97ca_scoped_true_staticRenderFns","SeriesDriver","validated","novalidate","submit","formSubmit","autocomplete","oninput","age","errors","education","change","updateSex","selected","disabled","sex","country","updateCountry","updateEthnicity","ethnicity","week_number","part","$$selectedVal","Array","prototype","filter","call","options","o","map","val","_value","multiple","getting_id","selectChange","CountrySelectvue_type_script_lang_js","components_CountrySelectvue_type_script_lang_js","CountrySelect_component","CountrySelectvue_type_template_id_bb3c44b8_scoped_true_render","CountrySelectvue_type_template_id_bb3c44b8_scoped_true_staticRenderFns","CountrySelect","UserInformationvue_type_script_lang_js","age_input","education_input","country_select","ethnicity_select","sex_select","week_input","skip_to_test_number","selected_start_test","submitting","formatTestType","typeMap","skipToTest","async","window","fetch","method","headers","body","JSON","stringify","start_from_test","language","documentElement","lang","ok","console","validateAge","setCustomValidity","validateWeek","validateEducation","validateParticipantId","retrieveParticipantId","validateCountry","validateSex","validateEthnicity","then","json","catch","err","log","formValidation","preventDefault","valid","skipSuccess","alert","country_val","components_UserInformationvue_type_script_lang_js","UserInformation_component","UserInformationvue_type_template_id_2cebc1b0_scoped_true_render","UserInformationvue_type_template_id_2cebc1b0_scoped_true_staticRenderFns","UserInformation","SKIPPED_KEYS","CONCURRENCY","requested","Set","queue","active","loaded","collectImageUrls","urls","walk","test","isArray","includes","done","fetchPriority","shift","has","add","display_countdown_bar","learning_json_data","handleLearningSubmission","recognition_json_data","handleRecognitionSubmission","initial_json_data","handleInitialsSubmission","matching_json_data","handleMatchingSubmission","timeMinutes","display_wait_interval","resume_delay_end_time","handleRecognitionDelayedSubmission","initial_json_data_delayed","handleInitialsDelayedSubmission","matching_json_data_delayed","handleMatchingDelayedSubmission","displayImage","currentQuestion","template_image","buttonCallback","imageTimeout","current_percent","customProgressBarvue_type_script_lang_js","step_decrement","precisionRound","precision","multiplier","handler","immediate","components_customProgressBarvue_type_script_lang_js","customProgressBar_component","customProgressBarvue_type_template_id_8d975e8a_render","customProgressBarvue_type_template_id_8d975e8a_staticRenderFns","customProgressBar","FNameLearningPhasevue_type_script_lang_js","CustomProgressBar","selectedResponse","currentImage","responded","responses","cumulative_response_time","recordNoResponse","incrementQuestion","scrollTo","response_length","blurAllButtons","$refs","blur","learning_FNameLearningPhasevue_type_script_lang_js","FNameLearningPhase_component","FNameLearningPhasevue_type_template_id_6ba178e0_scoped_true_render","FNameLearningPhasevue_type_template_id_6ba178e0_scoped_true_staticRenderFns","FNameLearningPhase","imageOrder","handleQuestionSubmission","FNameRecognitionPhasevue_type_script_lang_js","durstenfeldShuffle","selectedImage","selectedNumber","score","arr","j","random","response_image","imageUrl","number","response_number","cumulative_corr_rt","cumulative_incorr_rt","total_corr_count","total_incorrect_count","corr_denom","incorr_denom","avg_incorr_rt","recognition_FNameRecognitionPhasevue_type_script_lang_js","FNameRecognitionPhase_component","FNameRecognitionPhasevue_type_template_id_0eec29cf_scoped_true_render","FNameRecognitionPhasevue_type_template_id_0eec29cf_scoped_true_staticRenderFns","FNameRecognitionPhase","nameOrder","FNameMatchingPhasevue_type_script_lang_js","matching_FNameMatchingPhasevue_type_script_lang_js","FNameMatchingPhase_component","FNameMatchingPhasevue_type_template_id_29485098_scoped_true_render","FNameMatchingPhasevue_type_template_id_29485098_scoped_true_staticRenderFns","FNameMatchingPhase","letter","selectedLetter","_q","letterSelection","toUpperCase","FNameInitialPhasevue_type_script_lang_js","selectionTime","numberOfSelections","submitInput","toLowerCase","number_of_selections","cumulative_corr_selection_time","cumulative_incorr_selection_time","total_incorr_count","cumulative_corr_selection_count","cumulative_incorr_selection_count","avg_corr_selection_time","avg_incorr_selection_time","avg_corr_selection_count","avg_incorr_selection_count","initials_FNameInitialPhasevue_type_script_lang_js","FNameInitialPhase_component","FNameInitialPhasevue_type_template_id_93224120_scoped_true_render","FNameInitialPhasevue_type_template_id_93224120_scoped_true_staticRenderFns","FNameInitialPhase","FNameInstructionsvue_type_script_lang_js","FnameMatchingPhase","FnameRecognitionPhase","FnameLearningPhase","fname_FNameInstructionsvue_type_script_lang_js","FNameInstructions_component","FNameInstructionsvue_type_template_id_122a1261_render","FNameInstructionsvue_type_template_id_122a1261_staticRenderFns","FNameInstructions","timeRemainingMinutes","timeRemainingSeconds","CountdownTimervue_type_script_lang_js","storageKey","forceRestart","maxLifetimeHours","endTimestamp","initializeTimer","beforeUnmount","storeTimerData","handleTimerComplete","updateTimeRemaining","startTimer","storedData","getStoredTimerData","isStoredDataValid","stored","localStorage","getItem","parse","e","warn","removeItem","createdAt","maxLifetime","setItem","dataAge","info","remaining","max","ceil","restart","clear","getEndTimestamp","getStoredDataInfo","remainingLifetime","isValid","ageHours","remainingLifetimeHours","components_CountdownTimervue_type_script_lang_js","CountdownTimer_component","CountdownTimervue_type_template_id_62d515a0_render","CountdownTimervue_type_template_id_62d515a0_staticRenderFns","CountdownTimer","FNameDrivervue_type_script_lang_js","questions_learning","questions_recognition","questions_matching","questions_initial","recognition_json_data_delayed","questions_recognition_delayed","questions_matching_delayed","questions_initial_delayed","resume_result","delayed_pending","delayed_in_progress","end","delay_end_time","learning_results","recognition_results","matching_results","initials_results","recognition_delayed_results","matching_delayed_results","initials_delayed_results","task_scores","recognition_score","matching_score","initials_score","recognition_delayed_score","matching_delayed_score","initials_delayed_score","initial_score","delayed_score","skipped_this_phase","learning","recognition","matching","initials","recognition_delayed","matching_delayed","initials_delayed","scores","total_initial_questions_answered","total_delayed_questions_answered","total_questions_answered","total_score","initial_questions_answered","fname_FNameDrivervue_type_script_lang_js","FNameDriver_component","FNameDrivervue_type_template_id_2eb2a81d_scoped_true_render","FNameDrivervue_type_template_id_2eb2a81d_scoped_true_staticRenderFns","FNameDriver","expired","tabindex","title","hintMessage","handleClick","keyup","indexOf","_k","keyCode","apply","arguments","display","FnameDelayBadgevue_type_script_lang_js","tick","minutes","seconds","components_FnameDelayBadgevue_type_script_lang_js","FnameDelayBadge_component","FnameDelayBadgevue_type_template_id_ba7b7eea_scoped_true_render","FnameDelayBadgevue_type_template_id_ba7b7eea_scoped_true_staticRenderFns","FnameDelayBadge","Appvue_type_script_lang_js","protocol","location","host","urlParams","URLSearchParams","search","skip_param","get","parseInt","checkForTrialURL","uri","pathname","split_uri","split","fetchTest","smaller_dimension","screen","tme_end","query_parameters","pending_requests","completion_posted","current_test_number","total_tests","previous_test_results","previous_test_json","fname_delayed_in_progress","updateBodyClass","step_num","postData","driverResults","submitUrl","interval","payload","resetData","routeToFnameDelayed","serve","marker","assign","frontend_driver_event","driverEvent","is_completion","dt_started","getTime","dt_finished","user_agent","navigator","userAgent","dt_submitted","opts","params","join","redirect_home","all_tests_complete","current_result_data","confirm","skipTest","skipResults","is_skipped","total_memory","correct_memory","skipped_memory","total_delayed","correct_delayed","skipped_delayed","resp","res","skipped_questions","correct_count","total_questions","result","test_type_map","timer_expired","src_Appvue_type_script_lang_js","App_component","App","library","faSpinner","faCircleInfo","faForward","FontAwesomeIcon","config","productionTip","h","onbeforeunload","returnValue","$mount","use","VueBrowserupdate","f","s","c","insecure","unsupported","reminder","noclose","no_permanent_hide","text","msgmore","bupdate","api","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","m","deferred","O","chunkIds","fn","fulfilled","splice","r","n","getter","__esModule","d","a","cw","mod","definition","binding","descriptor","enumerable","defineProperty","g","globalThis","Function","obj","prop","hasOwnProperty","Symbol","toStringTag","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","self","bind","__webpack_exports__"],"sourceRoot":""}