1"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[33027],{857:e=>{var t=function(e){var t;return!!e&&"object"==typeof e&&"[object RegExp]"!==(t=Object.prototype.toString.call(e))&&"[object Date]"!==t&&e.$$typeof!==i},i="function"==typeof Symbol&&Symbol.for?Symbol.for("react.element"):60103;function s(e,t){return!1!==t.clone&&t.isMergeableObject(e)?a(Array.isArray(e)?[]:{},e,t):e}function r(e,t,i){return e.concat(t).map(function(e){return s(e,i)})}function n(e){return Object.keys(e).concat(Object.getOwnPropertySymbols?Object.getOwnPropertySymbols(e).filter(function(t){return Object.propertyIsEnumerable.call(e,t)}):[])}function o(e,t){try{return t in e}catch(e){return!1}}function a(e,i,l){(l=l||{}).arrayMerge=l.arrayMerge||r,l.isMergeableObject=l.isMergeableObject||t,l.cloneUnlessOtherwiseSpecified=s;var h,c,d=Array.isArray(i);return d!==Array.isArray(e)?s(i,l):d?l.arrayMerge(e,i,l):(c={},(h=l).isMergeableObject(e)&&n(e).forEach(function(t){c[t]=s(e[t],h)}),n(i).forEach(function(t){(!o(e,t)||Object.hasOwnProperty.call(e,t)&&Object.propertyIsEnumerable.call(e,t))&&(o(e,t)&&h.isMergeableObject(i[t])?c[t]=(function(e,t){if(!t.customMerge)return a;var i=t.customMerge(e);return"function"==typeof i?i:a})(t,h)(e[t],i[t],h):c[t]=s(i[t],h))}),c)}a.all=function(e,t){if(!Array.isArray(e))throw Error("first argument should be an array");return e.reduce(function(e,i){return a(e,i,t)},{})},e.exports=a},49:(e,t,i)=>{i.d(t,{Z:()=>r});var s=i(140);class r{static isNode(e){return"object"==typeof e&&null!==e&&(e===document||e===window||e instanceof Node)}static hasAttribute(e,t){if(!r.isNode(e))throw Error("The element must be a valid HTML Node!");return"function"==typeof e.hasAttribute&&e.hasAttribute(t)}static getAttribute(e,t){let i=!(arguments.length>2)||void 0===arguments[2]||arguments[2];if(i&&!1===r.hasAttribute(e,t))throw Error('The required property "'.concat(t,'" does not exist!'));if("function"!=typeof e.getAttribute){if(i)throw Error("This node doesn't support the getAttribute function!");return}return e.getAttribute(t)}static getDataAttribute(e,t){let i=!(arguments.length>2)||void 0===arguments[2]||arguments[2],n=t.replace(/^data(|-)/,""),o=s.Z.toLowerCamelCase(n,"-");if(!r.isNode(e)){if(i)throw Error("The passed node is not a valid HTML Node!");return}if(void 0===e.dataset){if(i)throw Error("This node doesn't support the dataset attribute!");return}let a=e.dataset[o];if(void 0===a){if(i)throw Error('The required data attribute "'.concat(t,'" does not exist on ').concat(e,"!"));return a}return s.Z.parsePrimitive(a)}static querySelector(e,t){let i=!(arguments.length>2)||void 0===arguments[2]||arguments[2];if(i&&!r.isNode(e))throw Error("The parent node is not a valid HTML Node!");let s=e.querySelector(t)||!1;if(i&&!1===s)throw Error('The required element "'.concat(t,'" does not exist in parent node!'));return s}static querySelectorAll(e,t){let i=!(arguments.length>2)||void 0===arguments[2]||arguments[2];if(i&&!r.isNode(e))throw Error("The parent node is not a valid HTML Node!");let s=e.querySelectorAll(t);if(0===s.length&&(s=!1),i&&!1===s)throw Error('At least one item of "'.concat(t,'" must exist in parent node!'));return s}static getFocusableElements(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:document.body;return e.querySelectorAll('\n input:not([tabindex^="-"]):not([disabled]):not([type="hidden"]),\n select:not([tabindex^="-"]):not([disabled]),\n textarea:not([tabindex^="-"]):not([disabled]),\n button:not([tabindex^="-"]):not([disabled]),\n a[href]:not([tabindex^="-"]):not([disabled]),\n [tabindex]:not([tabindex^="-"]):not([disabled])\n ')}static getFirstFocusableElement(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:document.body;return this.getFocusableElements(e)[0]}static getLastFocusableElement(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:document,t=this.getFocusableElements(e);return t[t.length-1]}}},140:(e,t,i)=>{i.d(t,{Z:()=>s});class s{static ucFirst(e){return e.charAt(0).toUpperCase()+e.slice(1)}static lcFirst(e){return e.charAt(0).toLowerCase()+e.slice(1)}static toDashCase(e){return e.replace(/([A-Z])/g,"-$1").replace(/^-/,"").toLowerCase()}static toLowerCamelCase(e,t){let i=s.toUpperCamelCase(e,t);return s.lcFirst(i)}static toUpperCamelCase(e,t){return t?e.split(t).map(e=>s.ucFirst(e.toLowerCase())).join(""):s.ucFirst(e.toLowerCase())}static parsePrimitive(e){try{return/^\d+(.|,)\d+$/.test(e)&&(e=e.replace(",",".")),JSON.parse(e)}catch(t){return e.toString()}}}},293:(e,t,i)=>{i.d(t,{Z:()=>l});var s=i(857),r=i.n(s),n=i(49),o=i(140);class a{publish(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],s=new CustomEvent(e,{detail:t,cancelable:i});return this.el.dispatchEvent(s),s}subscribe(e,t){let i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},s=this,r=e.split("."),n=i.scope?t.bind(i.scope):t;if(i.once&&!0===i.once){let t=n;n=function(i){s.unsubscribe(e),t(i)}}return this.el.addEventListener(r[0],n),this.listeners.push({splitEventName:r,opts:i,cb:n}),!0}unsubscribe(e){let t=e.split(".");return this.listeners=this.listeners.reduce((e,i)=>([...i.splitEventName].sort().toString()===t.sort().toString()?this.el.removeEventListener(i.splitEventName[0],i.cb):e.push(i),e),[]),!0}
1reset(){return this.listeners.forEach(e=>{this.el.removeEventListener(e.splitEventName[0],e.cb)}),this.listeners=[],!0}get el(){return this._el}set el(e){this._el=e}get listeners(){return this._listeners}set listeners(e){this._listeners=e}constructor(e=document){this._el=e,e.$emitter=this,this._listeners=[]}}class l{init(){throw Error('The "init" method for the plugin "'.concat(this._pluginName,'" is not defined.'))}update(){}_init(){this._initialized||(this.init(),this._initialized=!0)}_update(){this._initialized&&this.update()}_mergeOptions(e){let t=o.Z.toDashCase(this._pluginName),i=n.Z.getDataAttribute(this.el,"data-".concat(t,"-config"),!1),s=n.Z.getAttribute(this.el,"data-".concat(t,"-options"),!1),a=[this.constructor.options,this.options,e];i&&a.push(window.PluginConfigManager.get(this._pluginName,i));try{s&&a.push(JSON.parse(s))}catch(e){throw console.error(this.el),Error('The data attribute "data-'.concat(t,'-options" could not be parsed to json: ').concat(e.message))}return r().all(a.filter(e=>e instanceof Object&&!(e instanceof Array)).map(e=>e||{}))}_registerInstance(){window.PluginManager.getPluginInstancesFromElement(this.el).set(this._pluginName,this),window.PluginManager.getPlugin(this._pluginName,!1).get("instances").push(this)}_getPluginName(e){return e||(e=this.constructor.name),e}constructor(e,t={},i=!1){if(!n.Z.isNode(e))throw Error("There is no valid element given.");this.el=e,this.$emitter=new a(this.el),this._pluginName=this._getPluginName(i),this.options=this._mergeOptions(t),this._initialized=!1,this._registerInstance(),this._init()}}},107:(e,t,i)=>{i.d(t,{Z:()=>s});class s{get(e,t){let i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"application/json",s=this._createPreparedRequest("GET",e,i);return this._sendRequest(s,null,t)}post(e,t,i){let s=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"application/json";s=this._getContentType(t,s);let r=this._createPreparedRequest("POST",e,s);return this._sendRequest(r,t,i)}delete(e,t,i){let s=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"application/json";s=this._getContentType(t,s);let r=this._createPreparedRequest("DELETE",e,s);return this._sendRequest(r,t,i)}patch(e,t,i){let s=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"application/json";s=this._getContentType(t,s);let r=this._createPreparedRequest("PATCH",e,s);return this._sendRequest(r,t,i)}abort(){if(this._request)return this._request.abort()}setErrorHandlingInternal(e){this._errorHandlingInternal=e}_registerOnLoaded(e,t){t&&(!0===this._errorHandlingInternal?(e.addEventListener("load",()=>{t(e.responseText,e)}),e.addEventListener("abort",()=>{console.warn("the request to ".concat(e.responseURL," was aborted"))}),e.addEventListener("error",()=>{console.warn("the request to ".concat(e.responseURL," failed with status ").concat(e.status))}),e.addEventListener("timeout",()=>{console.warn("the request to ".concat(e.responseURL," timed out"))})):e.addEventListener("loadend",()=>{t(e.responseText,e)}))}_sendRequest(e,t,i){return this._registerOnLoaded(e,i),e.send(t),e}_getContentType(e,t){return e instanceof FormData&&(t=!1),t}_createPreparedRequest(e,t,i){return this._request=new XMLHttpRequest,this._request.open(e,t),this._request.setRequestHeader("X-Requested-With","XMLHttpRequest"),i&&this._request.setRequestHeader("Content-type",i),this._request}constructor(){this._request=null,this._errorHandlingInternal=!1}}},27:(e,t,i)=>{i.r(t),i.d(t,{default:()=>a});var s=i(293),r=i(49),n=i(107);let o=["image/jpeg","image/png"];class a extends s.Z{init(){this.inputField=r.Z.querySelector(this.el,this.options.fieldSelector.inputField),this.thumbnailCanvas=r.Z.querySelector(this.el,this.options.fieldSelector.thumbnailCanvas),this.submitButton=r.Z.querySelector(this.el,this.options.fieldSelector.searchButton),this.emptyFileContainer=r.Z.querySelector(this.el,this.options.fieldSelector.emptyFileContainer),this.hasFileContainer=r.Z.querySelector(this.el,this.options.fieldSelector.hasFileContainer),this.fileNameText=r.Z.querySelector(this.el,this.options.fieldSelector.fileNameText),this.removeImageButton=r.Z.querySelector(this.el,this.options.fieldSelector.removeImageButton),this.searchResults=r.Z.querySelector(this.el,this.options.fieldSelector.searchResults),this.titlePrimary=r.Z.querySelector(this.el,this.options.fieldSelector.primaryTitle),this.loadingSpinner=r.Z.querySelector(this.el,this.options.fieldSelector.loadingSpinner),this.serviceError=r.Z.querySelector(this.el,this.options.fieldSelector.serviceError),this.fileTypeSizeError=r.Z.querySelector(this.el,this.options.fieldSelector.fileTypeSizeError),this.imageUploadSearchWra
1pper=r.Z.querySelector(this.el,this.options.fieldSelector.imageUploadSearchWrapper),this.selectFileButton=r.Z.querySelector(this.el,this.options.fieldSelector.selectFileButton),this.dropzone=r.Z.querySelector(this.el,this.options.fieldSelector.dropzone),this.store=function(){let e="searchByImage";return new Proxy(window.localStorage,{get(t,i){let s="".concat(e,".").concat(i),r=window.localStorage.getItem(s);return r?JSON.parse(r):null},set:(t,i,s)=>(window.localStorage.setItem("".concat(e,".").concat(i),JSON.stringify(s)),!0)})}(),this.client=new n.Z,this.registerEvents()}registerEvents(){this.submitButton.addEventListener("click",this.onSearchButtonClick.bind(this)),this.inputField.addEventListener("change",this.onFileInputChanged.bind(this)),this.removeImageButton.addEventListener("click",this.onRemoveImageButtonClick.bind(this)),this.selectFileButton.addEventListener("click",this.onSelectFileButtonClick.bind(this)),this.dropzone.addEventListener("drop",this.onDropFile.bind(this)),document.addEventListener("dragenter",this.onDragEnter.bind(this)),document.addEventListener("dragleave",this.onDragLeave.bind(this)),document.addEventListener("dragover",this.onDragOver.bind(this)),document.addEventListener("drop",this.onDropOnDocument.bind(this)),document.onreadystatechange=()=>{"complete"===document.readyState&&this.onDocumentReady.bind(this)()}}onFileInputChanged(e){this.onFileAdded(e.target.files[0])}successFileUpload(e){this.fileUpload=e,this.emptyFileContainer.classList.add("d-none"),this.hasFileContainer.classList.remove("d-none"),this.fileNameText.innerText=e.name,this.submitButton.classList.remove("d-none");let t=new FileReader;t.addEventListener("load",this.handleFileReaderLoad.bind(this),!1),t.readAsDataURL(e)}handleFileReaderLoad(e){let t=new Image;t.src=e.target.result,t.addEventListener("load",this.handleImageLoad.bind(this),!1)}handleImageLoad(e){let t=this.thumbnailCanvas.getContext("2d"),i=Math.min(this.thumbnailCanvas.width/e.srcElement.width,this.thumbnailCanvas.height/e.srcElement.height),s=e.srcElement.width*i,r=e.srcElement.height*i;this.thumbnailCanvas.width=s,this.thumbnailCanvas.height=r,t.drawImage(e.srcElement,0,0,s,r)}showErrorMessage(){this.fileTypeSizeError.classList.remove("d-none")}onRemoveImageButtonClick(){this.emptyFileContainer.classList.remove("d-none"),this.hasFileContainer.classList.add("d-none"),this.submitButton.classList.add("d-none"),this.fileNameText.innerText="",this.inputField.value="",this.fileUpload=null,this.thumbnailCanvas.getContext("2d").clearRect(0,0,this.thumbnailCanvas.width,this.thumbnailCanvas.height)}onSearchButtonClick(e){e.preventDefault(),e.stopPropagation(),this.searchImage()}async searchImage(){if(!this.fileUpload)return;this.showState("loading");let e=new FormData;e.append("file",this.fileUpload,this.fileUpload.name);try{let t=await this.fetchSearchTerms(e);if(0===t.length){this.showState("empty");return}let i=this.generateResultsUrl(t);this.store[i.search]=t,window.history.pushState({},"",i),this.searchBySearchTerms(t)}catch(e){this.showState("error");return}}searchBySearchTerms(e){Promise.all(e.map(e=>this.searchProducts(e))).then(e=>{if(this.searchResults.innerHTML=e.join(""),""===this.searchResults.innerHTML){this.showState("empty");return}window.PluginManager.initializePlugins(),this.showState("finish")}).catch(()=>{this.showState("error")})}fetchSearchTerms(e){return new Promise((t,i)=>{this.client.abort(),this.client.post(this.options.searchImageUrl,e,(e,s)=>{200!==s.status&&i("Request status of ".concat(s.status)),t(JSON.parse(e))})})}searchProducts(e){return new Promise((t,i)=>{var s;this.client.post(this.options.searchProductsUrl,JSON.stringify({term:(s=null==e?void 0:e.term)!==null&&void 0!==s?s:e}),(e,s)=>{if(200!==s.status){i();return}t(e.trim())})})}showState(e){let t=r.Z.querySelector(this.el,this.options.fieldSelector.secondaryTitle,!1);switch(t instanceof HTMLElement&&t.remove(),e){case"loading":this.searchResults.innerHTML="",this.serviceError.classList.add("d-none"),this.loadingSpinner.classList.remove("d-none"),this.imageUploadSearchWrapper.classList.add("d-none"),this.titlePrimary.innerText=this.options.snippets.loadingTitle;break;case"error":this.loadingSpinner.classList.add("d-none"),this.serviceError.classList.remove("d-none"),this.imageUploadSearchWra
1pper.classList.remove("d-none");break;case"empty":this.loadingSpinner.classList.add("d-none"),this.imageUploadSearchWrapper.classList.remove("d-none"),this.titlePrimary.innerText=this.options.snippets.noResultsTitle,this.titlePrimary.insertAdjacentHTML("afterend",'<h2 class="ai-search-title-secondary align-self-stretch text-primary m-0">'.concat(this.options.snippets.noResultsSubTitle,"</h2>"));break;case"finish":this.loadingSpinner.classList.add("d-none"),this.titlePrimary.innerText=this.options.snippets.resultTitle}}onSelectFileButtonClick(){this.inputField.click()}onDropFile(e){this.fileUpload||(this.dropzone.classList.remove("dragover"),this.onFileAdded(e.dataTransfer.files[0]))}onFileAdded(e){if(!e||!o.includes(e.type)||e.size>this.options.maxUploadSize){this.showErrorMessage();return}this.fileTypeSizeError.classList.add("d-none"),this.successFileUpload(e)}onDragEnter(e){!this.fileUpload&&(e.preventDefault(),e.target.closest(this.options.fieldSelector.dropzone)&&(this.dropzone.classList.add("dragover"),this.selectFileButton.setAttribute("disabled","disabled")))}onDragLeave(e){e.target.closest(this.options.fieldSelector.dropzone)||(this.dropzone.classList.remove("dragover"),this.selectFileButton.removeAttribute("disabled"))}generateResultsUrl(e){let t=new URLSearchParams;e.forEach(e=>t.append("searchTerms",e.term));let i=new URL("",window.location.toString());return i.search=t.toString(),i}onDragOver(e){e.preventDefault()}onDropOnDocument(e){e.preventDefault(),this.dropzone.classList.remove("dragover"),this.selectFileButton.removeAttribute("disabled")}onDocumentReady(){let e=new URLSearchParams(window.location.search).getAll("searchTerms");e.length&&null!==this.store[window.location.search]&&(this.showState("loading"),this.searchBySearchTerms(e))}}a.options={fieldSelector:{inputField:".image-upload__input",thumbnailCanvas:"#thumbnailCanvas",searchButton:".btn-image-search",emptyFileContainer:".image-upload__empty-file",hasFileContainer:".image-upload__has-file",fileNameText:".image-upload__file-name",removeImageButton:".image-upload__btn-remove",submitButton:"btn-image-search",primaryTitle:".ai-search-title-primary",secondaryTitle:".ai-search-title-secondary",searchResults:".ai-search-results",loadingSpinner:".ai-search-loading-spinner",serviceError:".image-search-error",fileTypeSizeError:".image-upload-error",imageUploadSearchWrapper:".image-upload-search-wrapper",selectFileButton:".btn-select-file",dropzone:".image-upload__dropzone"}}}}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.