diff --git a/Gemfile.lock b/Gemfile.lock index 3902b88488e..7ace4ca235d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -478,7 +478,7 @@ GEM pg (1.5.9) pg_query (5.1.0) google-protobuf (>= 3.22.3) - phonelib (0.10.4) + phonelib (0.10.5) pkcs11 (0.3.4) premailer (1.27.0) addressable diff --git a/app/components/password_strength_component.html.erb b/app/components/password_strength_component.html.erb index d7263054c6f..0cc2e56ea71 100644 --- a/app/components/password_strength_component.html.erb +++ b/app/components/password_strength_component.html.erb @@ -12,7 +12,9 @@
- <%= t('instructions.password.strength.intro') %> - -
+
+ <%= t('instructions.password.strength.intro') %> + +
+
<% end %> diff --git a/app/controllers/concerns/idv/doc_auth_vendor_concern.rb b/app/controllers/concerns/idv/doc_auth_vendor_concern.rb index aed9a3cf8e3..450e254b28b 100644 --- a/app/controllers/concerns/idv/doc_auth_vendor_concern.rb +++ b/app/controllers/concerns/idv/doc_auth_vendor_concern.rb @@ -6,18 +6,23 @@ module DocAuthVendorConcern # @returns[String] String identifying the vendor to use for doc auth. def doc_auth_vendor - if resolved_authn_context_result.facial_match? || socure_user_set.maxed_users? - bucket = choose_non_socure_bucket - else - bucket = ab_test_bucket(:DOC_AUTH_VENDOR) - end + document_capture_session.doc_auth_vendor || begin + if resolved_authn_context_result.facial_match? || socure_user_set.maxed_users? + bucket = choose_non_socure_bucket + else + bucket = ab_test_bucket(:DOC_AUTH_VENDOR) + end - if bucket == :socure - if !add_user_to_socure_set - bucket = choose_non_socure_bucket # force to lexis_nexis if max user reached + if bucket == :socure + if !add_user_to_socure_set + bucket = choose_non_socure_bucket # force to lexis_nexis if max user reached + end end + + doc_auth_vendor_for_bucket = DocAuthRouter.doc_auth_vendor_for_bucket(bucket) + document_capture_session.update!(doc_auth_vendor: doc_auth_vendor_for_bucket) + doc_auth_vendor_for_bucket end - DocAuthRouter.doc_auth_vendor_for_bucket(bucket) end def doc_auth_vendor_enabled?(vendor) diff --git a/app/controllers/concerns/idv_step_concern.rb b/app/controllers/concerns/idv_step_concern.rb index 36aef0fbe0b..bafd906baed 100644 --- a/app/controllers/concerns/idv_step_concern.rb +++ b/app/controllers/concerns/idv_step_concern.rb @@ -9,6 +9,7 @@ module IdvStepConcern include FraudReviewConcern include Idv::AbTestAnalyticsConcern include Idv::VerifyByMailConcern + include Idv::DocAuthVendorConcern included do before_action :confirm_two_factor_authenticated @@ -71,7 +72,15 @@ def confirm_hybrid_handoff_needed # available when the user tries to redo document capture. if idv_session.skip_hybrid_handoff? || !FeatureManagement.idv_allow_hybrid_flow? idv_session.flow_path = 'standard' - redirect_to idv_document_capture_url + redirect_to vendor_document_capture_url + end + end + + def vendor_document_capture_url + if doc_auth_vendor == Idp::Constants::Vendors::SOCURE + idv_socure_document_capture_url + else + idv_document_capture_url end end diff --git a/app/controllers/idv/document_capture_controller.rb b/app/controllers/idv/document_capture_controller.rb index 2abb39d3002..53c8b79c099 100644 --- a/app/controllers/idv/document_capture_controller.rb +++ b/app/controllers/idv/document_capture_controller.rb @@ -40,7 +40,7 @@ def update if result.success? redirect_to idv_ssn_url else - redirect_to idv_document_capture_url + redirect_to vendor_document_capture_url end end diff --git a/app/controllers/idv/how_to_verify_controller.rb b/app/controllers/idv/how_to_verify_controller.rb index 0da694a0942..35dd97d5b25 100644 --- a/app/controllers/idv/how_to_verify_controller.rb +++ b/app/controllers/idv/how_to_verify_controller.rb @@ -98,5 +98,12 @@ def set_how_to_verify_presenter def mobile_required? idv_session.selfie_check_required || doc_auth_vendor == Idp::Constants::Vendors::SOCURE end + + def document_capture_session + return @document_capture_session if defined?(@document_capture_session) + @document_capture_session = DocumentCaptureSession.find_by( + uuid: idv_session.document_capture_session_uuid, + ) + end end end diff --git a/app/controllers/idv/hybrid_handoff_controller.rb b/app/controllers/idv/hybrid_handoff_controller.rb index ea69b145fe9..d78224d68ea 100644 --- a/app/controllers/idv/hybrid_handoff_controller.rb +++ b/app/controllers/idv/hybrid_handoff_controller.rb @@ -149,7 +149,7 @@ def update_document_capture_session_requested_at(session_uuid) def bypass_send_link_steps idv_session.flow_path = 'standard' - redirect_to idv_document_capture_url + redirect_to vendor_document_capture_url analytics.idv_doc_auth_hybrid_handoff_submitted( **analytics_arguments.merge( diff --git a/app/controllers/idv/hybrid_mobile/entry_controller.rb b/app/controllers/idv/hybrid_mobile/entry_controller.rb index 5cc4f9a94b0..e347cd4795e 100644 --- a/app/controllers/idv/hybrid_mobile/entry_controller.rb +++ b/app/controllers/idv/hybrid_mobile/entry_controller.rb @@ -45,12 +45,6 @@ def update_sp_session end def validate_document_capture_session_id - if document_capture_session_uuid.blank? - # If we've already gotten a document capture user id previously, just continue - # processing and (eventually) redirect the user where they're supposed to be. - return true if document_capture_user_id - end - result = Idv::DocumentCaptureSessionForm.new(document_capture_session_uuid).submit if result.success? diff --git a/app/controllers/idv/hybrid_mobile/socure/document_capture_controller.rb b/app/controllers/idv/hybrid_mobile/socure/document_capture_controller.rb index 6ff0e519f17..956d555c70f 100644 --- a/app/controllers/idv/hybrid_mobile/socure/document_capture_controller.rb +++ b/app/controllers/idv/hybrid_mobile/socure/document_capture_controller.rb @@ -23,6 +23,7 @@ def show redirect_to idv_hybrid_mobile_capture_complete_url end + analytics.idv_doc_auth_document_capture_visited(**analytics_arguments) session[:socure_docv_wait_polling_started_at] = nil Funnel::DocAuth::RegisterStep.new(document_capture_user.id, sp_session[:issuer]) diff --git a/app/controllers/idv/image_uploads_controller.rb b/app/controllers/idv/image_uploads_controller.rb index 01a2accfaaa..6db18a4f4b0 100644 --- a/app/controllers/idv/image_uploads_controller.rb +++ b/app/controllers/idv/image_uploads_controller.rb @@ -2,8 +2,6 @@ module Idv class ImageUploadsController < ApplicationController - include DocAuthVendorConcern - respond_to :json def create @@ -22,7 +20,6 @@ def create def image_upload_form @image_upload_form ||= Idv::ApiImageUploadForm.new( params, - doc_auth_vendor:, acuant_sdk_upgrade_ab_test_bucket: ab_test_bucket(:ACUANT_SDK), service_provider: current_sp, analytics: analytics, diff --git a/app/controllers/idv/socure/document_capture_controller.rb b/app/controllers/idv/socure/document_capture_controller.rb index 08afa045b53..fd165e63899 100644 --- a/app/controllers/idv/socure/document_capture_controller.rb +++ b/app/controllers/idv/socure/document_capture_controller.rb @@ -22,6 +22,7 @@ class DocumentCaptureController < ApplicationController before_action :fetch_test_verification_data, only: [:update] def show + analytics.idv_doc_auth_document_capture_visited(**analytics_arguments) idv_session.socure_docv_wait_polling_started_at = nil Funnel::DocAuth::RegisterStep.new(current_user.id, sp_session[:issuer]) diff --git a/app/forms/idv/api_image_upload_form.rb b/app/forms/idv/api_image_upload_form.rb index a0765d4e07f..9027bc968bf 100644 --- a/app/forms/idv/api_image_upload_form.rb +++ b/app/forms/idv/api_image_upload_form.rb @@ -17,7 +17,6 @@ class ApiImageUploadForm def initialize( params, service_provider:, - doc_auth_vendor:, acuant_sdk_upgrade_ab_test_bucket:, analytics: nil, uuid_prefix: nil, @@ -25,7 +24,6 @@ def initialize( ) @params = params @service_provider = service_provider - @doc_auth_vendor = doc_auth_vendor @acuant_sdk_upgrade_ab_test_bucket = acuant_sdk_upgrade_ab_test_bucket @analytics = analytics @readable = {} @@ -328,7 +326,7 @@ def document_capture_session_uuid def doc_auth_client @doc_auth_client ||= DocAuthRouter.client( - vendor: @doc_auth_vendor, + vendor: document_capture_session.doc_auth_vendor, warn_notifier: proc do |attrs| analytics&.doc_auth_warning( **attrs, diff --git a/app/javascript/packages/password-strength/password-strength-element.spec.ts b/app/javascript/packages/password-strength/password-strength-element.spec.ts index 3183b3be64b..4dc4f0ca761 100644 --- a/app/javascript/packages/password-strength/password-strength-element.spec.ts +++ b/app/javascript/packages/password-strength/password-strength-element.spec.ts @@ -82,6 +82,18 @@ describe('PasswordStrengthElement', () => { expect(input.validity.valid).to.be.false(); }); + it('updates the password aria-describedby attribute', async () => { + createElement(); + + const input: HTMLInputElement = screen.getByRole('textbox'); + + await userEvent.type(input, 'password'); + expect(input.getAttribute('aria-describedby')).to.equal('password-strength '); + + await userEvent.clear(input); + expect(input.getAttribute('aria-describedby')).to.equal(''); + }); + it('shows concatenated suggestions from zxcvbn if there is no specific warning', async () => { createElement(); diff --git a/app/javascript/packages/password-strength/password-strength-element.ts b/app/javascript/packages/password-strength/password-strength-element.ts index c8a0735e71e..34539485563 100644 --- a/app/javascript/packages/password-strength/password-strength-element.ts +++ b/app/javascript/packages/password-strength/password-strength-element.ts @@ -154,17 +154,29 @@ class PasswordStrengthElement extends HTMLElement { */ #handleValueChange() { const hasValue = !!this.input.value; + const inputDescribedBy = this.input.getAttribute('aria-describedby'); this.classList.toggle('display-none', !hasValue); this.removeAttribute('score'); if (hasValue) { const result = zxcvbn(this.input.value, this.forbiddenPasswords); const score = this.#getNormalizedScore(result); this.setAttribute('score', String(score)); + if (!inputDescribedBy?.includes('password-strength')) { + this.input.setAttribute( + 'aria-describedby', + ['password-strength', inputDescribedBy].join(' '), + ); + } this.input.setCustomValidity( this.#isValid(result) ? '' : t('errors.messages.stronger_password'), ); this.strength.textContent = this.#getStrengthLabel(score); this.feedback.textContent = this.#getNormalizedFeedback(result); + } else if (inputDescribedBy) { + this.input.setAttribute( + 'aria-describedby', + inputDescribedBy.replace(/\s*password-strength\s*/, ''), + ); } } } diff --git a/app/jobs/reports/ab_tests_report.rb b/app/jobs/reports/ab_tests_report.rb index 21adb6d6109..d2c63fddc3b 100644 --- a/app/jobs/reports/ab_tests_report.rb +++ b/app/jobs/reports/ab_tests_report.rb @@ -8,7 +8,7 @@ class AbTestsReport < BaseReport def initialize(report_date = nil, *args, **kwargs) @report_date = report_date - super(*args, **kwargs) + super(report_date, *args, **kwargs) end # @param [DateTime] diff --git a/app/presenters/update_password_presenter.rb b/app/presenters/update_password_presenter.rb index e2f135aebd7..6825fef7033 100644 --- a/app/presenters/update_password_presenter.rb +++ b/app/presenters/update_password_presenter.rb @@ -15,15 +15,6 @@ def forbidden_passwords end.uniq end - def aria_described_by_if_eligible - return {} if required_password_change? - { - input_html: { - aria: { describedby: 'password-description' }, - }, - } - end - def submit_text if required_password_change? I18n.t('forms.passwords.edit.buttons.submit') diff --git a/app/views/accounts/_connected_app.html.erb b/app/views/accounts/_connected_app.html.erb index 615fbae0409..31fbbf1a090 100644 --- a/app/views/accounts/_connected_app.html.erb +++ b/app/views/accounts/_connected_app.html.erb @@ -17,6 +17,7 @@ 'account.connected_apps.associated_attributes_html', timestamp_html: render(TimeComponent.new(time: identity.created_at)), ) %> +
<%= identity.email_address&.email || t('account.connected_apps.email_not_selected') %> diff --git a/app/views/users/passwords/edit.html.erb b/app/views/users/passwords/edit.html.erb index 67733f3c156..1ef9ee66013 100644 --- a/app/views/users/passwords/edit.html.erb +++ b/app/views/users/passwords/edit.html.erb @@ -22,7 +22,9 @@ form: f, password_label: t('forms.passwords.edit.labels.password'), forbidden_passwords: @update_password_presenter.forbidden_passwords, - field_options: @update_password_presenter.aria_described_by_if_eligible, + field_options: { + input_html: { aria: { describedby: 'password-description' } }, + }, ) %> <%= f.submit @update_password_presenter.submit_text, class: 'display-block margin-top-5 margin-bottom-4' %> <% end %> diff --git a/config/application.yml.default b/config/application.yml.default index e0ac736500c..f59df002193 100644 --- a/config/application.yml.default +++ b/config/application.yml.default @@ -163,8 +163,8 @@ identity_pki_local_dev: false idv_account_verified_email_campaign_id: '20241028' idv_acuant_sdk_upgrade_a_b_testing_enabled: false idv_acuant_sdk_upgrade_a_b_testing_percent: 50 -idv_acuant_sdk_version_alternate: '11.9.2' -idv_acuant_sdk_version_default: '11.9.3' +idv_acuant_sdk_version_alternate: '11.9.3' +idv_acuant_sdk_version_default: '11.9.3.508' idv_attempt_window_in_hours: 6 idv_available: true idv_contact_phone_number: (844) 555-5555 diff --git a/db/primary_migrate/20250219164618_add_doc_auth_vendor_to_document_capture_sessions_w_comment.rb b/db/primary_migrate/20250219164618_add_doc_auth_vendor_to_document_capture_sessions_w_comment.rb new file mode 100644 index 00000000000..2ba1f93b849 --- /dev/null +++ b/db/primary_migrate/20250219164618_add_doc_auth_vendor_to_document_capture_sessions_w_comment.rb @@ -0,0 +1,9 @@ +class AddDocAuthVendorToDocumentCaptureSessionsWComment < ActiveRecord::Migration[7.2] + def up + add_column :document_capture_sessions, :doc_auth_vendor, :string, comment: 'sensitive=false' + end + + def down + remove_column :document_capture_sessions, :doc_auth_vendor + end +end diff --git a/db/schema.rb b/db/schema.rb index f9da1bb4248..76e7aa3fa85 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[8.0].define(version: 2025_02_07_144037) do +ActiveRecord::Schema[8.0].define(version: 2025_02_19_164618) do # These are extensions that must be enabled in order to support this database enable_extension "citext" enable_extension "pg_catalog.plpgsql" @@ -200,6 +200,7 @@ t.string "last_doc_auth_result", comment: "sensitive=false" t.string "socure_docv_transaction_token", comment: "sensitive=false" t.string "socure_docv_capture_app_url", comment: "sensitive=false" + t.string "doc_auth_vendor", comment: "sensitive=false" t.index ["result_id"], name: "index_document_capture_sessions_on_result_id" t.index ["socure_docv_transaction_token"], name: "index_socure_docv_transaction_token", unique: true t.index ["user_id"], name: "index_document_capture_sessions_on_user_id" diff --git a/public/acuant/11.9.2/AcuantCamera.min.js b/public/acuant/11.9.2/AcuantCamera.min.js deleted file mode 100644 index ab037366c8e..00000000000 --- a/public/acuant/11.9.2/AcuantCamera.min.js +++ /dev/null @@ -1 +0,0 @@ -var AcuantCameraUI=function(){"use strict";let e=null,t=null,i=null,a=null,n={start:function(e,i){s=e.onError,i&&(g=i,g.text.hasOwnProperty("BIG_DOCUMENT")||(g.text.BIG_DOCUMENT="TOO CLOSE"));AcuantCamera.isCameraSupported?r||(r=!0,v(),function(e){let i=0,n=(new Date).getTime();a=document.getElementById("acuant-camera"),a&&a.addEventListener("acuantcameracreated",E);AcuantCamera.start((a=>{!function(e,t){if(t>=3)return!0;{let t=(new Date).getTime()-e;return t{y(),e.onCaptured(i),AcuantCamera.evaluateImage(i.data,i.width,i.height,i.isPortraitOrientation,t,(t=>{e.onCropped(t)}))}))}function A(e,t){y(),s&&s(e,t),s=null}function x(){!function a(){e&&!e.paused&&!e.ended&&r&&(!function(){if(i.clearRect(0,0,t.width,t.height),o)if(o.state===h)I("#00ff00"),D("rgba(0, 255, 0, 0.2)"),O(g.text.CAPTURING,.05,"#00ff00",!1);else if(o.state===m)I("#000000"),O(g.text.TAP_TO_CAPTURE);else if(o.state===AcuantCamera.DOCUMENT_STATE.GOOD_DOCUMENT)if(I("#ffff00"),D("rgba(255, 255, 0, 0.2)"),g.text.GOOD_DOCUMENT)O(g.text.GOOD_DOCUMENT,.09,"#ff0000",!1);else{let e=Math.ceil((f-((new Date).getTime()-c))/1e3);e<=0&&(e=1),O(e+"...",.09,"#ff0000",!1)}else o.state===AcuantCamera.DOCUMENT_STATE.SMALL_DOCUMENT?(I("#ff0000"),O(g.text.SMALL_DOCUMENT)):o.state===AcuantCamera.DOCUMENT_STATE.BIG_DOCUMENT?(I("#ff0000"),O(g.text.BIG_DOCUMENT)):(I("#000000"),O(g.text.NONE));else I("#000000"),O(g.text.NONE)}(),u=setTimeout(a,100))}()}function O(e,t=.04,a="#ffffff",n=!0){let r=k(),o=window.orientation,c=i.measureText(e),d=.01*Math.max(r.width,r.height),s=.02*Math.max(r.width,r.height),l=(r.height-s-c.width)/2,u=-(r.width/2-d),h=90;0!==o&&(h=0,l=(r.width-d-c.width)/2,u=r.height/2-s+.04*Math.max(r.width,r.height)),i.rotate(h*Math.PI/180),n&&(i.fillStyle="rgba(0, 0, 0, 0.5)",i.fillRect(Math.round(l-d),Math.round(u+d),Math.round(c.width+s),-Math.round(.05*Math.max(r.width,r.height)))),i.font=(Math.ceil(Math.max(r.width,r.height)*t)||0)+"px Sans-serif",i.fillStyle=a,i.fillText(e,l,u),S(e),i.rotate(-h*Math.PI/180)}const S=e=>{d||(d=document.createElement("p"),d.id="doc-state-text",d.style.height="1px",d.style.width="1px",d.style.margin="-1px",d.style.overflow="hidden",d.style.position="absolute",d.style.whiteSpace="nowrap",d.setAttribute("role","alert"),d.setAttribute("aria-live","assertive"),t.parentNode.insertBefore(d,t)),d.innerHTML!=e&&(d.innerHTML=e)};function k(){return{height:t.height,width:t.width}}function M(e,t){let a=window.orientation,n=k(),r=.08*n.width,o=.07*n.height;switch(0!==a&&(r=.07*n.width,o=.08*n.height),t.toString()){case"1":r=-r;break;case"2":r=-r,o=-o;break;case"3":o=-o}!function(e,t,a){i.beginPath();const n=Math.round(e.x),r=Math.round(e.y);i.moveTo(n,r),i.lineTo(Math.round(n+t),r),i.moveTo(n,r),i.lineTo(n,Math.round(r+a)),i.stroke()}(e,r,o)}function D(e){if(o&&o.points&&4===o.points.length){i.beginPath(),i.moveTo(Math.round(o.points[0].x),Math.round(o.points[0].y));for(let e=1;et.height?(a=.85*t.width,n=.85*t.width/1.5887,n>.85*t.height&&(a=a/n*.85*t.height,n=.85*t.height)):(a=.85*t.height/1.5887,n=.85*t.height,a>.85*t.width&&(n=n/a*.85*t.width,a=.85*t.width)),e=a/2,i=n/2,[{x:r.x-e,y:r.y-i},{x:r.x+e,y:r.y-i},{x:r.x+e,y:r.y+i},{x:r.x-e,y:r.y+i}].forEach(((e,t)=>{M(e,t)}))}}return n}(),AcuantCamera=(()=>{"use strict";let e=null,t=null,i=null,a=null,n=null,r=null;const o={NO_DOCUMENT:0,SMALL_DOCUMENT:1,BIG_DOCUMENT:2,GOOD_DOCUMENT:3},c={NONE:0,ID:1,PASSPORT:2},d=700,s=1920;let l,u,h=null,m=null,g=null,f=!1,p=!1,w=null,v={start:S,startManualCapture:k,triggerCapture:function(t){let i,a;try{if(0==e.videoWidth)throw"width 0";n.width=e.videoWidth,n.height=e.videoHeight,r.drawImage(e,0,0,n.width,n.height),i=r.getImageData(0,0,n.width,n.height),r.clearRect(0,0,n.width,n.height),a=window.matchMedia("(orientation: portrait)").matches}catch(e){return void ie()}t({data:i,width:n.width,height:n.height,isPortraitOrientation:a})},end:W,DOCUMENT_STATE:o,ACUANT_DOCUMENT_TYPE:c,isCameraSupported:"mediaDevices"in navigator&&function(){let e=!1;return function(t){(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|playbook|silk/i.test(t)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(t.substr(0,4)))&&(e=!0)}(navigator.userAgent||navigator.vendor||window.opera),(e||C())&&!y()}(),isIOSWebview:function(){const e=window.navigator.standalone,t=window.navigator.userAgent.toLowerCase(),i=/safari/.test(t);return/iphone|ipod|ipad/.test(t)&&!i&&!e}(),isIOS:C,setRepeatFrameProcessor:Z,evaluateImage:G};function y(){return navigator.userAgent.toLowerCase().indexOf("firefox")>-1}function C(){return/iPad|iPhone|iPod/.test(navigator.platform)&&_()[0]>=13||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1}function b(){let e;e=u||navigator.userAgent;const t=e.match(/SM-[N|G|S]\d{3}/);if(!t)return!1;const i=parseInt(t[0].match(/\d{3}/)[0],10),a=e.match(/SM-S\d{3}/)?900:970;return!isNaN(i)&&i>=a}const E=function(){let e={frameScale:1,primaryConstraints:{video:{facingMode:{exact:"environment"},aspectRatio:4/3,resizeMode:"none"}},fixedHeight:null,fixedWidth:null};C()?L()?(e.primaryConstraints.video.aspectRatio=1*Math.max(window.innerWidth,window.innerHeight)/Math.min(window.innerWidth,window.innerHeight),e.primaryConstraints.video.height={min:1440,ideal:2880}):N()?e.primaryConstraints.video.width={min:s,ideal:s}:e.primaryConstraints.video.height={min:1440,ideal:1440}:e.primaryConstraints.video.height={min:1440,ideal:1440};return e}();function T(t){j().then((()=>{f=!0,e.srcObject=t,function(){b()&&document.addEventListener("visibilitychange",z);window.addEventListener("resize",R),e&&(e.addEventListener("play",J),e.addEventListener("loadedmetadata",F))}(),e.play()}))}function A(e,t){document.cookie="AcuantCameraHasFailed="+t,W(),m&&"function"==typeof m?m(e,t):(console.error("No error callback set. Review implementation."),console.error(e,t))}function x(){return new Promise((e=>{navigator.mediaDevices.enumerateDevices().then((t=>{const i={suffix:void 0,device:void 0},a=t.find((e=>"Back Dual Wide Camera"===e.label));(function(){let e=_();return e&&-1!=e&&e.length>=1&&e[0]>=16&&e[1]>=4})()&&a?i.device=a:t.filter((e=>"videoinput"===e.kind)).forEach((e=>{if(t=e.label,["rear","back","rück","arrière","trasera","trás","traseira","posteriore","后面","後面","背面","задней","الخلفية","후","arka","achterzijde","หลัง","baksidan","bagside","sau","bak","tylny","takakamera","belakang","אחורית","πίσω","spate","hátsó","zadní","darrere","zadná","задня","stražnja","belakang","बैक"].some((e=>t.includes(e)))){let t=e.label.split(","),a=parseInt(t[0][t[0].length-1]);(a||0===a)&&(void 0===i.suffix||i.suffix>a)&&(i.suffix=a,i.device=e)}var t})),e(i.device)})).catch((()=>{e()}))}))}function O(e,t=0){0===t&&l.dispatchEvent(new Event("acuantcameracreated"));const i=Boolean(e.video.deviceId);navigator.mediaDevices.getUserMedia(e).then((e=>{!i&&t<2?x().then((i=>{i&&i.deviceId!==e.getVideoTracks()[0].getSettings().deviceId?(E.primaryConstraints.video.deviceId=i.deviceId,U(e),O(E.primaryConstraints,t++)):T(e)})):T(e)})).catch((e=>{A(e,AcuantJavascriptWebSdk.START_FAIL_CODE)}))}function S(a,o,c){if(c&&(m=c),function(){let e="AcuantCameraHasFailed=";return decodeURIComponent(document.cookie).includes(e)}())return c("Live capture has previously failed and was called again. User was sent to manual capture.",AcuantJavascriptWebSdk.REPEAT_FAIL_CODE),void k(o);l=document.getElementById("acuant-camera"),l?(l.style.position="relative",l.innerHTML='',e=document.getElementById("acuant-player"),n=document.createElement("canvas"),r=n.getContext("2d",{willReadFrequently:!C()}),t=document.getElementById("acuant-ui-canvas"),f?A("already started.",AcuantJavascriptWebSdk.START_FAIL_CODE):e&&t?(i=t.getContext("2d"),a&&(h=a),navigator.userAgentData&&navigator.userAgentData.getHighEntropyValues?navigator.userAgentData.getHighEntropyValues(["model"]).then((e=>{"string"==typeof e?u=e:"string"==typeof e.model&&(u=e.model)})).finally((()=>{b()?E.primaryConstraints.video.zoom=2:P()&&(E.primaryConstraints.video.zoom=1.6),O(E.primaryConstraints)})):(b()?E.primaryConstraints.video.zoom=2:P()&&(E.primaryConstraints.video.zoom=1.6),O(E.primaryConstraints))):A("Missing HTML elements.",AcuantJavascriptWebSdk.START_FAIL_CODE)):A("Expected div with 'acuant-camera' id",AcuantJavascriptWebSdk.START_FAIL_CODE)}function k(e){g=e,a||(a=document.createElement("input"),a.type="file",a.capture="environment",a.accept="image/*",a.onclick=function(e){e&&e.target&&(e.target.value="")}),a.onchange=D,a.click()}let M=-1;function D(e){n=document.createElement("canvas"),r=n.getContext("2d"),r.mozImageSmoothingEnabled=!1,r.webkitImageSmoothingEnabled=!1,r.msImageSmoothingEnabled=!1,r.imageSmoothingEnabled=!1;let t=e.target,i=new FileReader;const a=e.target.files[0]&&e.target.files[0].name&&e.target.files[0].name.toLowerCase().endsWith(".heic");i.onload=a?e=>{var t;(t=e.target.result,new Promise(((e,i)=>{const a=window["magick-wasm"];a?a.initializeImageMagick().then((()=>{a.ImageMagick.read(new Uint8Array(t),(t=>{const{width:i,height:a}=I(t.width,t.height);n.width=i,n.height=a,t.resize(i,a),t.writeToCanvas(n);const o=r.getImageData(0,0,i,a);e({data:o,width:i,height:a})}))})):i({error:"HEIC image processing failed. Please make sure Image Magick scripts were integrated as expected.",code:AcuantJavascriptWebSdk.HEIC_NOT_SUPPORTED_CODE})}))).then((e=>{M=6,g.onCaptured(e),G(e.data,e.width,e.height,!1,"MANUAL",g.onCropped)})).catch((e=>g.onError(e.error,e.code)))}:e=>{M=function(e){const t=new DataView(e.target.result);if(65496!=t.getUint16(0,!1))return-2;const i=t.byteLength;let a=2;for(;a{const{width:e,height:i}=I(t.width,t.height);n.width=e,n.height=i,r.drawImage(t,0,0,e,i);const a=r.getImageData(0,0,e,i);r.clearRect(0,0,e,i),t.remove(),g.onCaptured({data:a,width:e,height:i}),G(a,e,i,!1,"MANUAL",g.onCropped)},t.src="data:image/jpeg;base64,"+ae(e.target.result)},t&&t.files[0]&&i.readAsArrayBuffer(t.files[0])}function I(e,t){let i=2560,a=1920;N()&&(i=s,a=Math.floor(1440));if((e>t?e:t)>i)if(e{e.stop()}))}function W(){f=!1,p=!1,M=-1,w&&(clearTimeout(w),w=null),function(){b()&&document.removeEventListener("visibilitychange",z);window.removeEventListener("resize",R),e&&(e.removeEventListener("play",J),e.removeEventListener("loadedmetadata",F))}(),e&&(e.pause(),e.srcObject&&U(e.srcObject),e=null),l&&(l.innerHTML=""),a&&(a.remove(),a=null)}function _(){if(/iP(hone|od|ad)/.test(navigator.platform))try{const e=navigator.appVersion.match(/OS (\d+)_(\d+)_?(\d+)?/);return[parseInt(e[1],10),parseInt(e[2],10),parseInt(e[3]||0,10)]}catch(e){return-1}return-1}function N(){let e=_();return e&&-1!=e&&e.length>=1&&15==e[0]}function P(){if(function(){let e=_();return e&&-1!=e&&e.length>=1&&e[0]>=17}()){let e=[screen.width,screen.height],t=Math.max(...e),i=Math.min(...e);if(852==t&&393==i)return!0;if(844==t&&390==i)return!0}return!1}function L(){let e=decodeURIComponent(document.cookie);if(e.includes("AcuantForceRegularCapture=true"))return!1;if(e.includes("AcuantForceDistantCapture=true"))return!0;if(function(){let e=_();return e&&-1!=e&&e.length>=1&&16==e[0]&&e[1]<4}()){let e=[screen.width,screen.height],t=Math.max(...e),i=Math.min(...e);if(852==t&&393==i)return!0;if(932==t&&430==i)return!0;if(844==t&&390==i)return!0;if(926==t&&428==i)return!0}return!1}function R(){i.clearRect(0,0,t.width,t.height),e&&(C()&&(function(){const e=window.navigator.userAgent,t=e.indexOf("WebKit")>-1,i=e.indexOf("CriOS")>-1;return t&&i&&C()}()||function(){let e=_();return e&&-1!=e&&e.length>=2&&14==e[0]&&e[1]>=4}())?(W(),S()):H())}function H(){let i,a;if(e.videoWidthE.fixedHeight&&(E.fixedHeight=l.clientWidth,E.fixedWidth=l.clientHeight),window.matchMedia("(orientation: portrait)").matches){if(E.fixedWidth)E.fixedWidth{AcuantJavascriptWebSdk.startMetricsWorker(e)}));const c=await Q(e,t,i),d=await K(r.image);r={...r,...c,...d},AcuantJavascriptWebSdk.endMetricsWorker();const{imageBase64:s,imageBytes:l}=$(r,a);r.image.bytes=l;const u=await Y(s);r.image.barcodeText=u;const h=await ee(r,a,s);await j();const m=await X(h);return r.image.data=m,V(),r}(e,t,i,n,a).then(r):async function(e,t,i,a,n){let r={isPortraitOrientation:n};const[o,c]=await Promise.all([q(e,t,i),Q(e,t,i)]);if(!o)return null;r={...r,...o};const d=await K(r.image);r={...r,...c,...d};const{imageBase64:s,imageBytes:l}=$(r,a);r.image.bytes=l;const u=await Y(s);r.image.barcodeText=u;const h=await ee(r,a,s),m=await X(h);return r.image.data=m,r}(e,t,i,n,a).then(r)}function j(){return new Promise((e=>{AcuantJavascriptWebSdk.startImageWorker(e)}))}function V(){AcuantJavascriptWebSdk.endImageWorker()}function q(e,t,i){return new Promise((a=>{AcuantJavascriptWebSdk.crop(e,t,i,{onSuccess:({image:e,dpi:t,cardType:i})=>a({image:e,dpi:t,cardType:i}),onFail:a})}))}function Q(e,t,i){return new Promise((a=>{AcuantJavascriptWebSdk.moire(e,t,i,{onSuccess:(e,t)=>a({moire:e,moireraw:t}),onFail:()=>a({moire:-1,moireraw:-1})})}))}function K(e){return new Promise((t=>{AcuantJavascriptWebSdk.metrics(e,e.width,e.height,{onSuccess:(e,i)=>t({sharpness:e,glare:i}),onFail:()=>t({sharpness:-1,glare:-1})})}))}function X(e){return new Promise((t=>{const i=function(e){const t=window.atob(e.split("base64,")[1]),i=t.length,a=new Uint8Array(new ArrayBuffer(i));for(let e=0;et("data:image/jpeg;base64,"+ae(e)),onFail:t})}))}async function Y(e){if(!document.getElementById(AcuantJavascriptWebSdk.BARCODE_READER_ID))return null;try{return await function(e){let t=e.split(","),i=t[0].match(/:(.*?);/)[1],a=atob(t[1]),n=a.length,r=new Uint8Array(n);for(;n--;)r[n]=a.charCodeAt(n);const o=new File([r],"imageFile",{type:i});return new Html5Qrcode(AcuantJavascriptWebSdk.BARCODE_READER_ID,{formatsToSupport:[Html5QrcodeSupportedFormats.PDF_417]}).scanFile(o,!1)}(e)}catch{return null}}function Z(){if(!f||p)return;if(0==e.videoWidth)return void ie();p=!0;let t=Math.max(e.videoWidth,e.videoHeight),i=Math.min(e.videoWidth,e.videoHeight),a=0,s=0;if(t>d&&i>500?e.videoWidth>=e.videoHeight?(E.frameScale=d/e.videoWidth,s=d,a=e.videoHeight*E.frameScale):(E.frameScale=d/e.videoHeight,s=e.videoWidth*E.frameScale,a=d):(E.frameScale=1,s=e.videoWidth,a=e.videoHeight),s==n.width&&a==n.height||(n.width=s,n.height=a),f){let t;try{r.drawImage(e,0,0,e.videoWidth,e.videoHeight,0,0,n.width,n.height),t=r.getImageData(0,0,n.width,n.height),r.clearRect(0,0,n.width,n.height)}catch(e){return void ie()}!function(t,i,a){AcuantJavascriptWebSdk.detect(t,i,a,{onSuccess:function(t){if(!n||!e||e.paused||e.ended)return;t.points.forEach((t=>{void 0!==t.x&&void 0!==t.y&&(t.x=t.x/E.frameScale*e.width/e.videoWidth,t.y=t.y/E.frameScale*e.height/e.videoHeight)}));const i=Math.min(t.dimensions.width,t.dimensions.height)/Math.min(n.width,n.height),a=Math.max(t.dimensions.width,t.dimensions.height)/Math.max(n.width,n.height),r=2==t.type;let d=.8,s=.85,l=.6,u=.65;r&&(d=.9,s=.95),C()&&(l=.65,u=.7,L()?r?(d=.72,s=.77,l=.22,u=.28):(d=.41,s=.45,l=.22,u=.28):r&&(d=.95,s=1,l=.7,u=.75));const m=!t.isCorrectAspectRatio||i=d||a>=s;t.type===c.NONE?t.state=o.NO_DOCUMENT:t.state=g?o.BIG_DOCUMENT:m?o.SMALL_DOCUMENT:o.GOOD_DOCUMENT,h(t),p=!1},onFail:function(){if(!n||!e||e.paused||e.ended)return;let t={};t.state=o.NO_DOCUMENT,h(t),p=!1}})}(t,n.width,n.height)}}function $({image:e,cardType:t,isPortraitOrientation:i},a){n&&r||(n=document.createElement("canvas"),r=n.getContext("2d")),n.width=e.width,n.height=e.height;let o=r.createImageData(e.width,e.height);!function(e,t){for(let i=0;i{AcuantJavascriptWebSdk.getCvmlVersion({onSuccess:t=>{e(t)},onFail:()=>{e("unknown")}})})),s=JSON.stringify({cvml:{cropping:{iscropped:!0,dpi:e,idsize:2===t?"ID3":"ID1",elapsed:-1},sharpness:{normalized:i,elapsed:-1},moire:{normalized:n,raw:r,elapsed:-1},glare:{normalized:a,elapsed:-1},version:d},device:{version:te(),capturetype:o}});return AcuantJavascriptWebSdk.addMetadata(c,{imageDescription:s,dateTimeOriginal:(new Date).toUTCString()})}function te(){const e=navigator.userAgent;let t,i=e.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i)||[];return/trident/i.test(i[1])?(t=/\brv[ :]+(\d+)/g.exec(e)||[],"IE "+(t[1]||"")):"Chrome"===i[1]&&(t=e.match(/\b(OPR|Edge)\/(\d+)/),null!=t)?t.slice(1).join(" ").replace("OPR","Opera"):(i=i[2]?[i[1],i[2]]:[navigator.appName,navigator.appVersion,"-?"],null!=(t=e.match(/version\/(\d+)/i))&&i.splice(1,1,t[1]),i.join(" "))}function ie(){N()||navigator.maxTouchPoints&&navigator.maxTouchPoints>=2&&/MacIntel/.test(navigator.platform)?A("Camera capture failed due to unexpected sequence break. This usually indicates the camera closed or froze unexpectedly. In iOS 15+ this is intermittently occurs due to a GPU Highwater failure. Swap to manual capture until the user fully reloads the browser. Attempting to continue to use live capture can lead to further Highwater errors and can cause to OS to cut off the webpage.",AcuantJavascriptWebSdk.SEQUENCE_BREAK_CODE):A("Camera capture failed due to unexpected sequence break. This usually indicates the camera closed or froze unexpectedly. Swap to manual capture until the user fully reloads the browser.",AcuantJavascriptWebSdk.SEQUENCE_BREAK_CODE)}function ae(e){let t="";const i=new Uint8Array(e),a=i.byteLength;for(let e=0;ee(),raf:e=>requestAnimationFrame(e),ael:(e,t,n,r)=>e.addEventListener(t,n,r),rel:(e,t,n,r)=>e.removeEventListener(t,n,r),ce:(e,t)=>new CustomEvent(e,t)},l=e=>Promise.resolve(e),c=(()=>{try{return new CSSStyleSheet,"function"==typeof(new CSSStyleSheet).replace}catch(e){}return!1})(),h=(e,t,n,r)=>{n&&n.map(([n,r,a])=>{const s=e,i=p(t,a),o=d(n);u.ael(s,r,i,o),(t.$rmListeners$=t.$rmListeners$||[]).push(()=>u.rel(s,r,i,o))})},p=(e,t)=>n=>{try{256&e.$flags$?e.$lazyInstance$[t](n):(e.$queuedListeners$=e.$queuedListeners$||[]).push([t,n])}catch(e){ae(e)}},d=e=>0!=(2&e),f=new WeakMap,m=e=>{const t=e.$cmpMeta$,n=e.$hostElement$,r=t.$flags$,a=(t.$tagName$,()=>{}),s=((e,t,n,r)=>{let a=g(t),s=oe.get(a);if(e=11===e.nodeType?e:o,s)if("string"==typeof s){e=e.head||e;let t,n=f.get(e);n||f.set(e,n=new Set),n.has(a)||(t=o.createElement("style"),t.innerHTML=s,e.insertBefore(t,e.querySelector("link")),n&&n.add(a))}else e.adoptedStyleSheets.includes(s)||(e.adoptedStyleSheets=[...e.adoptedStyleSheets,s]);return a})(n.shadowRoot?n.shadowRoot:n.getRootNode(),t);10&r&&(n["s-sc"]=s,n.classList.add(s+"-h")),a()},g=(e,t)=>"sc-"+e.$tagName$,y={},b=e=>"object"===(e=typeof e)||"function"===e,v=(e,t,...n)=>{let r=null,a=!1,s=!1,i=[];const o=t=>{for(let n=0;ne[t]).join(" "))}if("function"==typeof e)return e(null===t?{}:t,i,k);const u=x(e,null);return u.$attrs$=t,i.length>0&&(u.$children$=i),u},x=(e,t)=>{const n={$flags$:0,$tag$:e,$text$:t,$elm$:null,$children$:null,$attrs$:null};return n},w={},k={forEach:(e,t)=>e.map(S).forEach(t),map:(e,t)=>e.map(S).map(t).map(I)},S=e=>({vattrs:e.$attrs$,vchildren:e.$children$,vkey:e.$key$,vname:e.$name$,vtag:e.$tag$,vtext:e.$text$}),I=e=>{if("function"==typeof e.vtag){const t=Object.assign({},e.vattrs);return e.vkey&&(t.key=e.vkey),e.vname&&(t.name=e.vname),v(e.vtag,t,...e.vchildren||[])}const t=x(e.vtag,e.vtext);return t.$attrs$=e.vattrs,t.$children$=e.vchildren,t.$key$=e.vkey,t.$name$=e.vname,t},A=(e,t,n,r,a,s)=>{if(n!==r){let o=re(e,t),l=t.toLowerCase();if("class"===t){const t=e.classList,a=N(n),s=N(r);t.remove(...a.filter(e=>e&&!s.includes(e))),t.add(...s.filter(e=>e&&!a.includes(e)))}else if("style"===t){for(const t in n)r&&null!=r[t]||(t.includes("-")?e.style.removeProperty(t):e.style[t]="");for(const t in r)n&&r[t]===n[t]||(t.includes("-")?e.style.setProperty(t,r[t]):e.style[t]=r[t])}else if("ref"===t)r&&r(e);else if(o||"o"!==t[0]||"n"!==t[1]){const i=b(r);if((o||i&&null!==r)&&!a)try{if(e.tagName.includes("-"))e[t]=r;else{let a=null==r?"":r;"list"===t?o=!1:null!=n&&e[t]==a||(e[t]=a)}}catch(e){}null==r||!1===r?!1===r&&""!==e.getAttribute(t)||e.removeAttribute(t):(!o||4&s||a)&&!i&&(r=!0===r?"":r,e.setAttribute(t,r))}else t="-"===t[2]?t.slice(3):re(i,l)?l.slice(2):l[2]+t.slice(3),n&&u.rel(e,t,n,!1),r&&u.ael(e,t,r,!1)}},E=/\s/,N=e=>e?e.split(E):[],C=(e,t,n,r)=>{const a=11===t.$elm$.nodeType&&t.$elm$.host?t.$elm$.host:t.$elm$,s=e&&e.$attrs$||y,i=t.$attrs$||y;for(r in s)r in i||A(a,r,s[r],void 0,n,t.$flags$);for(r in i)A(a,r,s[r],i[r],n,t.$flags$)},T=(e,t,n,a)=>{let s,i,u=t.$children$[n],l=0;if(null!==u.$text$)s=u.$elm$=o.createTextNode(u.$text$);else if(s=u.$elm$=o.createElement(u.$tag$),C(null,u,!1),null!=r&&s["s-si"]!==r&&s.classList.add(s["s-si"]=r),u.$children$)for(l=0;l{let o,u=e;for(u.shadowRoot&&u.tagName===a&&(u=u.shadowRoot);s<=i;++s)r[s]&&(o=T(null,n,s),o&&(r[s].$elm$=o,u.insertBefore(o,t)))},_=(e,t,n,r,a)=>{for(;t<=n;++t)(r=e[t])&&(a=r.$elm$,D(r),a.remove())},F=(e,t)=>e.$tag$===t.$tag$,M=(e,t)=>{const n=t.$elm$=e.$elm$,r=e.$children$,a=t.$children$,s=t.$text$;null===s?(C(e,t,!1),null!==r&&null!==a?((e,t,n,r)=>{let a,s=0,i=0,o=t.length-1,u=t[0],l=t[o],c=r.length-1,h=r[0],p=r[c];for(;s<=o&&i<=c;)null==u?u=t[++s]:null==l?l=t[--o]:null==h?h=r[++i]:null==p?p=r[--c]:F(u,h)?(M(u,h),u=t[++s],h=r[++i]):F(l,p)?(M(l,p),l=t[--o],p=r[--c]):F(u,p)?(M(u,p),e.insertBefore(u.$elm$,l.$elm$.nextSibling),u=t[++s],p=r[--c]):F(l,h)?(M(l,h),e.insertBefore(l.$elm$,u.$elm$),l=t[--o],h=r[++i]):(a=T(t&&t[i],n,i),h=r[++i],a&&u.$elm$.parentNode.insertBefore(a,u.$elm$));s>o?R(e,null==r[c+1]?null:r[c+1].$elm$,n,r,i,c):i>c&&_(t,s,o)})(n,r,t,a):null!==a?(null!==e.$text$&&(n.textContent=""),R(n,null,t,a,0,a.length-1)):null!==r&&_(r,0,r.length-1)):e.$text$!==s&&(n.data=s)},D=e=>{e.$attrs$&&e.$attrs$.ref&&e.$attrs$.ref(null),e.$children$&&e.$children$.map(D)},O=(e,t)=>{const n=e.$hostElement$,s=e.$vnode$||x(null,null),i=(o=t)&&o.$tag$===w?t:v(null,null,t);var o;a=n.tagName,i.$tag$=null,i.$flags$|=4,e.$vnode$=i,i.$elm$=s.$elm$=n.shadowRoot||n,r=n["s-sc"],M(s,i)},L=e=>ee(e).$hostElement$,P=(e,t,n)=>{const r=L(e);return{emit:e=>$(r,t,{bubbles:!!(4&n),composed:!!(2&n),cancelable:!!(1&n),detail:e})}},$=(e,t,n)=>{const r=u.ce(t,n);return e.dispatchEvent(r),r},B=(e,t)=>{t&&!e.$onRenderResolve$&&t["s-p"]&&t["s-p"].push(new Promise(t=>e.$onRenderResolve$=t))},z=(e,t)=>{if(e.$flags$|=16,4&e.$flags$)return void(e.$flags$|=512);B(e,e.$ancestorComponent$);return fe(()=>U(e,t))},U=(e,t)=>{const n=(e.$cmpMeta$.$tagName$,()=>{}),r=e.$lazyInstance$;let a;return t&&(e.$flags$|=256,e.$queuedListeners$&&(e.$queuedListeners$.map(([e,t])=>H(r,e,t)),e.$queuedListeners$=null),a=H(r,"componentWillLoad")),n(),q(a,()=>W(e,r,t))},W=async(e,t,n)=>{const r=e.$hostElement$,a=(e.$cmpMeta$.$tagName$,()=>{}),s=r["s-rc"];n&&m(e);const i=(e.$cmpMeta$.$tagName$,()=>{});V(e,t),s&&(s.map(e=>e()),r["s-rc"]=void 0),i(),a();{const t=r["s-p"],n=()=>j(e);0===t.length?n():(Promise.all(t).then(n),e.$flags$|=4,t.length=0)}},V=(e,t,n)=>{try{t=t.render(),e.$flags$&=-17,e.$flags$|=2,O(e,t)}catch(t){ae(t,e.$hostElement$)}return null},j=e=>{e.$cmpMeta$.$tagName$;const t=e.$hostElement$,n=()=>{},r=e.$lazyInstance$,a=e.$ancestorComponent$;64&e.$flags$?(H(r,"componentDidUpdate"),n()):(e.$flags$|=64,K(t),H(r,"componentDidLoad"),n(),e.$onReadyResolve$(t),a||G()),e.$onRenderResolve$&&(e.$onRenderResolve$(),e.$onRenderResolve$=void 0),512&e.$flags$&&de(()=>z(e,!1)),e.$flags$&=-517},G=e=>{K(o.documentElement),de(()=>$(i,"appload",{detail:{namespace:"fas-web-ui-component-camera"}}))},H=(e,t,n)=>{if(e&&e[t])try{return e[t](n)}catch(e){ae(e)}},q=(e,t)=>e&&e.then?e.then(t):t(),K=e=>e.classList.add("hydrated"),Y=(e,t,n,r)=>{const a=ee(e),s=a.$instanceValues$.get(t),i=a.$flags$,o=a.$lazyInstance$;var u,l;u=n,l=r.$members$[t][0],n=null==u||b(u)?u:4&l?"false"!==u&&(""===u||!!u):2&l?parseFloat(u):1&l?String(u):u,8&i&&void 0!==s||n===s||(a.$instanceValues$.set(t,n),o&&2==(18&i)&&z(a,!1))},X=(e,t,n)=>{if(t.$members$){const r=Object.entries(t.$members$),a=e.prototype;if(r.map(([e,[r]])=>{(31&r||2&n&&32&r)&&Object.defineProperty(a,e,{get(){return t=e,ee(this).$instanceValues$.get(t);var t},set(n){Y(this,e,n,t)},configurable:!0,enumerable:!0})}),1&n){const t=new Map;a.attributeChangedCallback=function(e,n,r){u.jmp(()=>{const n=t.get(e);if(this.hasOwnProperty(n))r=this[n],delete this[n];else if(a.hasOwnProperty(n)&&"number"==typeof this[n]&&this[n]==r)return;this[n]=(null!==r||"boolean"!=typeof this[n])&&r})},e.observedAttributes=r.filter(([e,t])=>15&t[0]).map(([e,n])=>{const r=n[1]||e;return t.set(r,e),r})}}return e},Q=async(e,t,n,r,a)=>{if(0==(32&t.$flags$)){{if(t.$flags$|=32,(a=ie(n)).then){const e=()=>{};a=await a,e()}a.isProxied||(X(a,n,2),a.isProxied=!0);const e=(n.$tagName$,()=>{});t.$flags$|=8;try{new a(t)}catch(e){ae(e)}t.$flags$&=-9,e()}if(a.style){let e=a.style;const t=g(n);if(!oe.has(t)){const r=(n.$tagName$,()=>{});((e,t,n)=>{let r=oe.get(e);c&&n?(r=r||new CSSStyleSheet,r.replace(t)):r=t,oe.set(e,r)})(t,e,!!(1&n.$flags$)),r()}}}const s=t.$ancestorComponent$,i=()=>z(t,!0);s&&s["s-rc"]?s["s-rc"].push(i):i()},Z=(e,t={})=>{const n=()=>{},r=[],a=t.exclude||[],s=i.customElements,l=o.head,c=l.querySelector("meta[charset]"),p=o.createElement("style"),d=[];let f,m=!0;Object.assign(u,t),u.$resourcesUrl$=new URL(t.resourcesUrl||"./",o.baseURI).href,e.map(e=>{e[1].map(t=>{const n={$flags$:t[0],$tagName$:t[1],$members$:t[2],$listeners$:t[3]};n.$members$=t[2],n.$listeners$=t[3];const i=n.$tagName$,o=class extends HTMLElement{constructor(e){super(e),ne(e=this,n),1&n.$flags$&&e.attachShadow({mode:"open"})}connectedCallback(){f&&(clearTimeout(f),f=null),m?d.push(this):u.jmp(()=>(e=>{if(0==(1&u.$flags$)){const t=ee(e),n=t.$cmpMeta$,r=(n.$tagName$,()=>{});if(1&t.$flags$)h(e,t,n.$listeners$);else{t.$flags$|=1;{let n=e;for(;n=n.parentNode||n.host;)if(n["s-p"]){B(t,t.$ancestorComponent$=n);break}}n.$members$&&Object.entries(n.$members$).map(([t,[n]])=>{if(31&n&&e.hasOwnProperty(t)){const n=e[t];delete e[t],e[t]=n}}),Q(0,t,n)}r()}})(this))}disconnectedCallback(){u.jmp(()=>(e=>{if(0==(1&u.$flags$)){const t=ee(e);t.$rmListeners$&&(t.$rmListeners$.map(e=>e()),t.$rmListeners$=void 0)}})(this))}componentOnReady(){return ee(this).$onReadyPromise$}};n.$lazyBundleId$=e[0],a.includes(i)||s.get(i)||(r.push(i),s.define(i,X(o,n,1)))})}),p.innerHTML=r+"{visibility:hidden}.hydrated{visibility:inherit}",p.setAttribute("data-styles",""),l.insertBefore(p,c?c.nextSibling:l.firstChild),m=!1,d.length?d.map(e=>e.connectedCallback()):u.jmp(()=>f=setTimeout(G,30)),n()},J=new WeakMap,ee=e=>J.get(e),te=(e,t)=>J.set(t.$lazyInstance$=e,t),ne=(e,t)=>{const n={$flags$:0,$hostElement$:e,$cmpMeta$:t,$instanceValues$:new Map};return n.$onReadyPromise$=new Promise(e=>n.$onReadyResolve$=e),e["s-p"]=[],e["s-rc"]=[],h(e,n,t.$listeners$),J.set(e,n)},re=(e,t)=>t in e,ae=(e,t)=>(0,console.error)(e,t),se=new Map,ie=(e,t,r)=>{const a=e.$tagName$.replace(/-/g,"_"),s=e.$lazyBundleId$,i=se.get(s);return i?i[a]:n(236)(`./${s}.entry.js`).then(e=>(se.set(s,e),e[a]),ae)},oe=new Map,ue=[],le=[],ce=(e,t)=>n=>{e.push(n),s||(s=!0,t&&4&u.$flags$?de(pe):u.raf(pe))},he=e=>{for(let t=0;t{he(ue),he(le),(s=ue.length>0)&&u.raf(pe)},de=e=>l().then(e),fe=ce(le,!0)},function(e,t,n){(function(t){var n=function(e){return e&&e.Math==Math&&e};e.exports=n("object"==typeof globalThis&&globalThis)||n("object"==typeof window&&window)||n("object"==typeof self&&self)||n("object"==typeof t&&t)||function(){return this}()||Function("return this")()}).call(this,n(33))},function(e,t){e.exports=function(e){try{return!!e()}catch(e){return!0}}},function(e,t,n){var r=n(52),a=Function.prototype,s=a.call,i=r&&a.bind.bind(s,s);e.exports=r?i:function(e){return function(){return s.apply(e,arguments)}}},function(e,t,n){var r=n(1),a=n(42).f,s=n(23),i=n(17),o=n(69),u=n(93),l=n(95);e.exports=function(e,t){var n,c,h,p,d,f=e.target,m=e.global,g=e.stat;if(n=m?r:g?r[f]||o(f,{}):(r[f]||{}).prototype)for(c in t){if(p=t[c],h=e.dontCallGetSet?(d=a(n,c))&&d.value:n[c],!l(m?c:f+(g?".":"#")+c,e.forced)&&void 0!==h){if(typeof p==typeof h)continue;u(p,h)}(e.sham||h&&h.sham)&&s(p,"sham",!0),i(n,c,p,e)}}},function(e,t,n){"use strict";var r,a,s,i=n(112),o=n(9),u=n(1),l=n(6),c=n(12),h=n(10),p=n(24),d=n(28),f=n(23),m=n(17),g=n(11).f,y=n(27),b=n(51),v=n(31),x=n(7),w=n(54),k=n(21),S=k.enforce,I=k.get,A=u.Int8Array,E=A&&A.prototype,N=u.Uint8ClampedArray,C=N&&N.prototype,T=A&&b(A),R=E&&b(E),_=Object.prototype,F=u.TypeError,M=x("toStringTag"),D=w("TYPED_ARRAY_TAG"),O=i&&!!v&&"Opera"!==p(u.opera),L=!1,P={Int8Array:1,Uint8Array:1,Uint8ClampedArray:1,Int16Array:2,Uint16Array:2,Int32Array:4,Uint32Array:4,Float32Array:4,Float64Array:8},$={BigInt64Array:8,BigUint64Array:8},B=function(e){var t=b(e);if(c(t)){var n=I(t);return n&&h(n,"TypedArrayConstructor")?n.TypedArrayConstructor:B(t)}},z=function(e){if(!c(e))return!1;var t=p(e);return h(P,t)||h($,t)};for(r in P)(s=(a=u[r])&&a.prototype)?S(s).TypedArrayConstructor=a:O=!1;for(r in $)(s=(a=u[r])&&a.prototype)&&(S(s).TypedArrayConstructor=a);if((!O||!l(T)||T===Function.prototype)&&(T=function(){throw F("Incorrect invocation")},O))for(r in P)u[r]&&v(u[r],T);if((!O||!R||R===_)&&(R=T.prototype,O))for(r in P)u[r]&&v(u[r].prototype,R);if(O&&b(C)!==R&&v(C,R),o&&!h(R,M))for(r in L=!0,g(R,M,{get:function(){return c(this)?this[D]:void 0}}),P)u[r]&&f(u[r],D,r);e.exports={NATIVE_ARRAY_BUFFER_VIEWS:O,TYPED_ARRAY_TAG:L&&D,aTypedArray:function(e){if(z(e))return e;throw F("Target is not a typed array")},aTypedArrayConstructor:function(e){if(l(e)&&(!v||y(T,e)))return e;throw F(d(e)+" is not a typed array constructor")},exportTypedArrayMethod:function(e,t,n,r){if(o){if(n)for(var a in P){var s=u[a];if(s&&h(s.prototype,e))try{delete s.prototype[e]}catch(n){try{s.prototype[e]=t}catch(e){}}}R[e]&&!n||m(R,e,n?t:O&&E[e]||t,r)}},exportTypedArrayStaticMethod:function(e,t,n){var r,a;if(o){if(v){if(n)for(r in P)if((a=u[r])&&h(a,e))try{delete a[e]}catch(e){}if(T[e]&&!n)return;try{return m(T,e,n?t:O&&T[e]||t)}catch(e){}}for(r in P)!(a=u[r])||a[e]&&!n||m(a,e,t)}},getTypedArrayConstructor:B,isView:function(e){if(!c(e))return!1;var t=p(e);return"DataView"===t||h(P,t)||h($,t)},isTypedArray:z,TypedArray:T,TypedArrayPrototype:R}},function(e,t,n){var r=n(87),a=r.all;e.exports=r.IS_HTMLDDA?function(e){return"function"==typeof e||e===a}:function(e){return"function"==typeof e}},function(e,t,n){var r=n(1),a=n(34),s=n(10),i=n(54),o=n(35),u=n(88),l=a("wks"),c=r.Symbol,h=c&&c.for,p=u?c:c&&c.withoutSetter||i;e.exports=function(e){if(!s(l,e)||!o&&"string"!=typeof l[e]){var t="Symbol."+e;o&&s(c,e)?l[e]=c[e]:l[e]=u&&h?h(t):p(t)}return l[e]}},function(e,t,n){var r=n(52),a=Function.prototype.call;e.exports=r?a.bind(a):function(){return a.apply(a,arguments)}},function(e,t,n){var r=n(2);e.exports=!r((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]}))},function(e,t,n){var r=n(3),a=n(16),s=r({}.hasOwnProperty);e.exports=Object.hasOwn||function(e,t){return s(a(e),t)}},function(e,t,n){var r=n(9),a=n(89),s=n(90),i=n(13),o=n(40),u=TypeError,l=Object.defineProperty,c=Object.getOwnPropertyDescriptor;t.f=r?s?function(e,t,n){if(i(e),t=o(t),i(n),"function"==typeof e&&"prototype"===t&&"value"in n&&"writable"in n&&!n.writable){var r=c(e,t);r&&r.writable&&(e[t]=n.value,n={configurable:"configurable"in n?n.configurable:r.configurable,enumerable:"enumerable"in n?n.enumerable:r.enumerable,writable:!1})}return l(e,t,n)}:l:function(e,t,n){if(i(e),t=o(t),i(n),a)try{return l(e,t,n)}catch(e){}if("get"in n||"set"in n)throw u("Accessors not supported");return"value"in n&&(e[t]=n.value),e}},function(e,t,n){var r=n(6),a=n(87),s=a.all;e.exports=a.IS_HTMLDDA?function(e){return"object"==typeof e?null!==e:r(e)||e===s}:function(e){return"object"==typeof e?null!==e:r(e)}},function(e,t,n){var r=n(12),a=String,s=TypeError;e.exports=function(e){if(r(e))return e;throw s(a(e)+" is not an object")}},function(e,t,n){var r=n(1),a=n(6),s=function(e){return a(e)?e:void 0};e.exports=function(e,t){return arguments.length<2?s(r[e]):r[e]&&r[e][t]}},function(e,t,n){var r=n(38);e.exports=function(e){return r(e.length)}},function(e,t,n){var r=n(70),a=Object;e.exports=function(e){return a(r(e))}},function(e,t,n){var r=n(6),a=n(11),s=n(129),i=n(69);e.exports=function(e,t,n,o){o||(o={});var u=o.enumerable,l=void 0!==o.name?o.name:t;if(r(n)&&s(n,l,o),o.global)u?e[t]=n:i(t,n);else{try{o.unsafe?e[t]&&(u=!0):delete e[t]}catch(e){}u?e[t]=n:a.f(e,t,{value:n,enumerable:!1,configurable:!o.nonConfigurable,writable:!o.nonWritable})}return e}},function(e,t,n){var r=n(45),a=n(3),s=n(73),i=n(16),o=n(15),u=n(159),l=a([].push),c=function(e){var t=1==e,n=2==e,a=3==e,c=4==e,h=6==e,p=7==e,d=5==e||h;return function(f,m,g,y){for(var b,v,x=i(f),w=s(x),k=r(m,g),S=o(w),I=0,A=y||u,E=t?A(f,S):n||p?A(f,0):void 0;S>I;I++)if((d||I in w)&&(v=k(b=w[I],I,x),e))if(t)E[I]=v;else if(v)switch(e){case 3:return!0;case 5:return b;case 6:return I;case 2:l(E,b)}else switch(e){case 4:return!1;case 7:l(E,b)}return h?-1:a||c?c:E}};e.exports={forEach:c(0),map:c(1),filter:c(2),some:c(3),every:c(4),find:c(5),findIndex:c(6),filterReject:c(7)}},function(e,t){e.exports=!1},function(e,t,n){var r=n(6),a=n(28),s=TypeError;e.exports=function(e){if(r(e))return e;throw s(a(e)+" is not a function")}},function(e,t,n){var r,a,s,i=n(130),o=n(1),u=n(12),l=n(23),c=n(10),h=n(68),p=n(58),d=n(59),f=o.TypeError,m=o.WeakMap;if(i||h.state){var g=h.state||(h.state=new m);g.get=g.get,g.has=g.has,g.set=g.set,r=function(e,t){if(g.has(e))throw f("Object already initialized");return t.facade=e,g.set(e,t),t},a=function(e){return g.get(e)||{}},s=function(e){return g.has(e)}}else{var y=p("state");d[y]=!0,r=function(e,t){if(c(e,y))throw f("Object already initialized");return t.facade=e,l(e,y,t),t},a=function(e){return c(e,y)?e[y]:{}},s=function(e){return c(e,y)}}e.exports={set:r,get:a,has:s,enforce:function(e){return s(e)?a(e):r(e,{})},getterFor:function(e){return function(t){var n;if(!u(t)||(n=a(t)).type!==e)throw f("Incompatible receiver, "+e+" required");return n}}}},function(e,t,n){var r=n(73),a=n(70);e.exports=function(e){return r(a(e))}},function(e,t,n){var r=n(9),a=n(11),s=n(36);e.exports=r?function(e,t,n){return a.f(e,t,s(1,n))}:function(e,t,n){return e[t]=n,e}},function(e,t,n){var r=n(67),a=n(6),s=n(37),i=n(7)("toStringTag"),o=Object,u="Arguments"==s(function(){return arguments}());e.exports=r?s:function(e){var t,n,r;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=function(e,t){try{return e[t]}catch(e){}}(t=o(e),i))?n:u?s(t):"Object"==(r=s(t))&&a(t.callee)?"Arguments":r}},function(e,t,n){var r=n(11).f,a=n(10),s=n(7)("toStringTag");e.exports=function(e,t,n){e&&!n&&(e=e.prototype),e&&!a(e,s)&&r(e,s,{configurable:!0,value:t})}},function(e,t,n){var r=n(14);e.exports=r("navigator","userAgent")||""},function(e,t,n){var r=n(3);e.exports=r({}.isPrototypeOf)},function(e,t){var n=String;e.exports=function(e){try{return n(e)}catch(e){return"Object"}}},function(e,t,n){var r=n(30),a=Math.max,s=Math.min;e.exports=function(e,t){var n=r(e);return n<0?a(n+t,0):s(n,t)}},function(e,t,n){var r=n(135);e.exports=function(e){var t=+e;return t!=t||0===t?0:r(t)}},function(e,t,n){var r=n(3),a=n(13),s=n(136);e.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var e,t=!1,n={};try{(e=r(Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set))(n,[]),t=n instanceof Array}catch(e){}return function(n,r){return a(n),s(r),t?e(n,r):n.__proto__=r,n}}():void 0)},function(e,t,n){var r,a=n(13),s=n(106),i=n(74),o=n(59),u=n(98),l=n(56),c=n(58),h=c("IE_PROTO"),p=function(){},d=function(e){return"